fonction

Le
St=c3=a9phane Dutailly
Bonjour à tous,

J'ai une fonction maj-fin-theoreme que j'utilise beaucoup et que
plusieurs ici m'avaient aidé à créer. Elle me permet de co=
mpter le
nombre d'occurences d'un environnement «thm» dans un fichier te=
x et
d'afficher après chacun le numéro correspondant. Concrètem=
ent, si j'ai:

begin{thm}
bla bla
end{thm}

begin{thm}
blo blo
end{thm}

begin{thm}
bli bli
end{thm}

et que je lance ma fonction maj-fin-theoreme, j'obtiens ceci:

begin{thm}
bla bla
end{thm}
% 1

begin{thm}
blo blo
end{thm}
% 2

begin{thm}
bli bli
end{thm}
% 3

(et si je rajoute ou supprime un environnement thm, que je relance ma
fonction, tous les numéros sont remis à jour).
La fonction est la suivante:

(defun maj-fin-theoreme ()
"écris le numéro du theoreme"
(interactive)
(save-excursion
(goto-char (point-min))
(let ((compteur 1))
(while (re-search-forward "\\end{thm" nil t)
(beginning-of-line 2)
(if
(looking-at "%\s-+[0-9]+$")
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %d" compteur)))
(setq compteur (1+ compteur)))
)))

Il y a deux choses en plus que j'aimerais rajouter à cette fonction:=


- plutôt que d'afficher % 1, j'aimerais que cela affiche % thm 1 (ou=
% 1
thm); j'ai essayé des choses du type (insert (format "%% %d thm" =

compteur)) ou (insert (format "%% %d" "thm" compteur)) ou (insert
(format "%% %d" compteur) "thm") mais ça ne marche pas.

- j'aimerais que le compteur ne tienne pas seulement compte de
l'environnement «thm» dans sa recherche, mais aussi d'un enviro=
nnement
«prop» par exemple de façon à avoir ceci après l=
'exécution de la fonction:

begin{thm}
bla bla
end{thm}
% 1

begin{prop}
blo blo
end{prop}
% 2

begin{thm}
bli bli
end{thm}
% 3

J'ai essayé des choses du type (re-search-forward "\\end{thm"
"\\end{thm" nil t) mais ça ne donne rien.


Voila, si certains parmi vous ont des idées de comment modifier la
fonction, je leur en serai très reconnaissant.

Merci de m'avoir lu jusqu'au bout et bonnes fêtes à tous!

Stéphane
Vos réponses
Trier par : date / pertinence
jj.retorre
Le #26534489
dim. 29 déc. 2019, Stéphane Dutailly
Bonjour à tous,
J'ai une fonction maj-fin-theoreme que j'utilise beaucoup et que
plusieurs ici m'avaient aidé à créer. Elle me permet de co mpter le
nombre d'occurences d'un environnement «thm» dans un fichier te x et
d'afficher après chacun le numéro correspondant. Concrètem ent, si
j'ai:
begin{thm}
bla bla
end{thm}
begin{thm}
blo blo
end{thm}
begin{thm}
bli bli
end{thm}
et que je lance ma fonction maj-fin-theoreme, j'obtiens ceci:
begin{thm}
bla bla
end{thm}
% 1
begin{thm}
blo blo
end{thm}
% 2
begin{thm}
bli bli
end{thm}
% 3
(et si je rajoute ou supprime un environnement thm, que je relance ma
fonction, tous les numéros sont remis à jour).
La fonction est la suivante:
(defun maj-fin-theoreme ()
"écris le numéro du theoreme"
(interactive)
(save-excursion
(goto-char (point-min))
(let ((compteur 1))
(while (re-search-forward "\\end{thm" nil t)
(beginning-of-line 2)
(if
(looking-at "%\s-+[0-9]+$")
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %dn" compteur)))
(setq compteur (1+ compteur)))
)))
Il y a deux choses en plus que j'aimerais rajouter à cette fonction:
- plutôt que d'afficher % 1, j'aimerais que cela affiche % thm 1 (ou %
1 thm); j'ai essayé des choses du type (insert (format "%% %dn thm"
compteur)) ou (insert (format "%% %dn" "thm" compteur)) ou (insert
(format "%% %dn" compteur) "thm") mais ça ne marche pas.
- j'aimerais que le compteur ne tienne pas seulement compte de
l'environnement «thm» dans sa recherche, mais aussi d'un enviro nnement
«prop» par exemple de façon à avoir ceci après l 'exécution de la
fonction:
begin{thm}
bla bla
end{thm}
% 1
begin{prop}
blo blo
end{prop}
% 2
begin{thm}
bli bli
end{thm}
% 3
J'ai essayé des choses du type (re-search-forward "\\end{thm"
"\\end{thm" nil t) mais ça ne donne rien.
Voila, si certains parmi vous ont des idées de comment modifier la
fonction, je leur en serai très reconnaissant.
Merci de m'avoir lu jusqu'au bout et bonnes fêtes à tous!
Stéphane

La fonction que je propose post-commente un seul environnement. Pour en
traiter plusieurs, il suffit de l'appliquer plusieurs fois pour chacun
des environnements que l'on se propose de post-commenter.
J'ai un peu modifié ton code pour utliser des fonctions déjà présentes
dans AUCTeX et faciliter la maintenance. J'ai aussi changé le nom pour
qu'il n'y ait pas de confusion si tu veux tester les deux.
(defun LaTeX-post-comment-environment (env)
"Post commente la fin des environnements par le nom de l'environnement
et numérote"
(interactive "SEnvironnement ? ")
(save-excursion
(goto-char (point-min))
(let ((compteur 0))
(while (< (forward-sentence) (point-max))
(when (string=(LaTeX-current-environment) env)
(LaTeX-find-matching-end)
(setq compteur (1+ compteur))
(insert (format "n%s %s %d" TeX-comment-start-regexp env
compteur)))))) )
Voici comment on peut programmer plusieurs applications successives,
j'ai la flemme de construire une fonction pour ça pour l'instant.
(mapcar
(lambda(e)(funcall #'LaTeX-post-comment-environment e))
(list "thm" "prop"))
J'ai testé sur ton exemple, je ne garantis pas qu'il ne puisse pas y
avoir des ajustements à faire pour des cas particuliers. C'est seuleme nt
une proposition de départ.
Cordialement
--
JJR
jj.retorre
Le #26534884
dim. 05 janv. 2020, Stéphane Dutailly
Le 30/12/2019 à 20:12, Jean-Jacques Rétorré a écrit  :
lun. 30 déc. 2019, (Jean-Jacques Rétorr é) disait :
dim. 29 déc. 2019, Stéphane Dutailly


Bonjour,
Merci Jean-Jacques pour cette proposition. J'ai testé; ça comme nte
bien mais le problème, c'est que contrairement à la fonction que
j'avais, ça n'efface pas le commentaire précédent pour rem ettre le
bon. Je m'explique:
si j'ai:
begin{thm}
mon premier thm
end{thm}

% thm 1
% 1
begin{thm}
mon deuxième thm
end{thm}

% thm 2
% 2
begin{thm}
mon troisième thm
end{thm}

% thm 3
% 3
que je supprime «mon deuxième théorème» et que j e lance
LaTeX-post-comment-environnement, cela me donne:
begin{thm}
mon premier thm
end{thm}

% thm 4
% 1
% 1
begin{thm}
mon troisième thm
end{thm}

% thm 5
% 2
% 3
alors qu'avec ma fonction maj-fin-theoreme j'obtiens
begin{thm}
mon premier thm
end{thm}

% thm 6
% 1
begin{thm}
mon troisième thm
end{thm}

% thm 7
% 2
ce qui correspond plus à ce que je souhaite. Je ne sais pas si on pe ut
modifier facilement dans ta proposition pour que cela fasse la même
chose, je ne veux pas t'embêter trop ;-)
Par rapport à ma question initiale, je crois que ce que j'aimerais
surtout modifier c'est comment afficher « % thm 1 » plutôt que « % 1
».
Je suppose que tout est dans le (pour ma fonction maj-fin-theoreme)
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %dn" compteur)))
ou bien dans (pour la fonction LaTeX-post-comment-environnement):
(insert (format "n%s %s %d" TeX-comment-start-regexp env compteur)
mais je n'arrive pas à modifier efficacement ces lignes.
Si quelqu'un peut juste m’éclaircir cela, ce sera super (le fait que
la fonction reconnaisse «thm» et «prop» n'est pas le plus important,
je peux contourner le problème).
Jean-Jacques, dans ta proposition, je n'ai pas bien compris comment
évaluer le bout de code:
(mapcar
(lambda(e)(funcall #'LaTeX-post-comment-environment e))
(list "thm" "prop"))
J'ai essayé de commenter et de lancer des commandes du type M-x
eval-buffer mais ça n'a rien donné. J'ai essayé cela dans mon .emacs:
(defun repete-LaTeX-post-comment-environment ()
(mapcar
(lambda(e)(funcall #'LaTeX-post-comment-environment e))
(list "thm" "prop")))
mais cette fonction ne semble pas reconnue.
Vois-tu ce que je fais de travers?
Encore un gros merci en tous cas!!
Stéphane

Toutes mes excuses, j'avais oublié de considérer ce cas. Il suffit
de supprimer toutes les lignes de commentaires précédemment ins érées par
la fonction (et elles le seront toutes, y comprises celles qui
pourraient avoir été insérées autrement que par la fonc tion)
La fonction /delete-matching-lines/ le fait
,----
| (defun LaTeX-post-comment-environment (env)
| "Post commente la fin des environnements par le nom de l'environnement
| et numérote"
| (interactive "SEnvironnement ? ")
| (save-excursion
| ;; Supprime les post-commentaires précédents
| (delete-matching-lines
| (format "%s\ +%s\ +[1-9][0-9]*.*" TeX-comment-start-regexp env) )
| ;; post-commmentaires numérotés
| (goto-char (if (region-active-p) (region-beginning) (point-min)))
| (let ((compteur 0)
| (fin (if (region-active-p) (region-end) (point-max))))
| (while (forward-word)
| (when (string=(LaTeX-current-environment) env)
| (LaTeX-find-matching-end)
| (setq compteur (1+ compteur))
| (insert (format "n%s %s %d" TeX-comment-start-regexp env
| compteur))))))) )
`----
La commande que j'ai proposée est à insérer dans le source L aTeX en
commentaire et à évaluer par C-x C-e
J'ai écrit une commande qui fait la même chose que l'on peut acti ver de
manière interactive par /M-x LaTeX-post-comment-multiple-environment/ ou
comme précédemment en évaluant le code elisp en commentaires dans le
source LaTeX
% (LaTeX-post-comment-multiple-environment (list "thm" "prop")) <-- C-x C-e
,----
| (defun LaTeX-post-comment-multiple-environment (environnements)
| (interactive
| (let ((env (read-string"Environnement (<RET> pour terminer): ")) (l'()))
| (while (not(string-empty-p env))
| (push env l)
| (setq env (read-string"Environnement : "))
| )
| (list l)))
| (mapcar
| (lambda(e)(funcall #'LaTeX-post-comment-environment e))
| environnements))
`----
On peut bien entendu affecter n'importe quelle séquence de touche
disponible à ces commandes. Par exemple en utilisant l'extension
bind-keys installée par Elpa
(bind-keys :map LaTeX-mode-map
("<f10> c" . LaTeX-comment-environment)
("<f10> C" . LaTeX-comment-multiple-environment))
Ou tout autre choix de touches selon les goûts.
--
JJR.
jj.retorre
Le #26534885
lun. 06 janv. 2020, (Jean-Jacques Rétorré) disait :
dim. 05 janv. 2020, Stéphane Dutailly
On peut bien entendu affecter n'importe quelle séquence de touche
disponible à ces commandes. Par exemple en utilisant l'extension
bind-keys installée par Elpa
(bind-keys :map LaTeX-mode-map
("<f10> c" . LaTeX-comment-environment)
("<f10> C" . LaTeX-comment-multiple-environment))


*Errata*
(bind-keys :map LaTeX-mode-map
("<f10> c" . LaTeX-post-comment-environment)
("<f10> C" . LaTeX-post-comment-multiple-environment))
--
JJR.
jj.retorre
Le #26535025
dim. 05 janv. 2020, Stéphane Dutailly
Bonjour,
Merci Jean-Jacques pour cette proposition. J'ai testé; ça comme nte
bien mais le problème, c'est que contrairement à la fonction que
j'avais, ça n'efface pas le commentaire précédent pour rem ettre le
bon.

J'avais omis cette contrainte, j'ai rectifié
,----
| (defun LaTeX-post-comment-environment (env)
| "Post-commente la fin des environnements par le nom de l'environnement
| et numérote"
| (interactive "SEnvironnement ? ")
| (save-excursion
| (goto-char (point-min))
| (delete-matching-lines(format "%s\ +%s\ +[1-9][0-9]*.*" TeX-comment -start-regexp env))
| (let ((compteur 0))
| (while (forward-word)
| (when (string=(LaTeX-current-environment) env)
| (LaTeX-find-matching-end)
| (setq compteur (1+ compteur))
| (insert (format "n%s %s %d" TeX-comment-start-regexp env
| compteur))))))) )
`----
si j'ai:
begin{thm}
mon premier thm
end{thm}
% 1
begin{thm}
mon deuxième thm
end{thm}
% 2
begin{thm}
mon troisième thm
end{thm}
% 3
que je supprime «mon deuxième théorème» et que j e lance
LaTeX-post-comment-environnement, cela me donne:
begin{thm}
mon premier thm
end{thm}
% 1
% 1
begin{thm}
mon troisième thm
end{thm}
% 2
% 3
alors qu'avec ma fonction maj-fin-theoreme j'obtiens
begin{thm}
mon premier thm
end{thm}
% 1
begin{thm}
mon troisième thm
end{thm}
% 2
ce qui correspond plus à ce que je souhaite. Je ne sais pas si on pe ut
modifier facilement dans ta proposition pour que cela fasse la même
chose, je ne veux pas t'embêter trop ;-)
Par rapport à ma question initiale, je crois que ce que j'aimerais
surtout modifier c'est comment afficher « % thm 1 » plutôt que « % 1
».
Je suppose que tout est dans le (pour ma fonction maj-fin-theoreme)
(replace-match (format "%% %d" compteur) t)
(insert (format "%% %dn" compteur)))
ou bien dans (pour la fonction LaTeX-post-comment-environnement):
(insert (format "n%s %s %d" TeX-comment-start-regexp env compteur)
mais je n'arrive pas à modifier efficacement ces lignes.
Si quelqu'un peut juste m’éclaircir cela, ce sera super (le fait que
la fonction reconnaisse «thm» et «prop» n'est pas le plus important,
je peux contourner le problème).
Jean-Jacques, dans ta proposition, je n'ai pas bien compris comment
évaluer le bout de code:
(mapcar
(lambda(e)(funcall #'LaTeX-post-comment-environment e))
(list "thm" "prop"))
J'ai essayé de commenter et de lancer des commandes du type M-x
eval-buffer mais ça n'a rien donné. J'ai essayé cela dans mon .emacs:
(defun repete-LaTeX-post-comment-environment ()
(mapcar
(lambda(e)(funcall #'LaTeX-post-comment-environment e))
(list "thm" "prop")))
mais cette fonction ne semble pas reconnue.
Vois-tu ce que je fais de travers?


La commande que j'ai proposée est à insérer dans le source L aTeX en
commentaire et à évaluer par C-x C-e
J'ai écrit une commande qui fait la même chose que l'on peut acti ver de
manière interactive par /M-x LaTeX-post-comment-multiple-environment/ ou
comme précédemment en évaluant le code elisp en commentaires dans le
source LaTeX. Placer le point à derrière la parenthèse limit ant la forme
et évaluer par C-x C-e
% (LaTeX-post-comment-multiple-environment (list "thm" "prop")) <-- C-x C-e
Je recommande cette façon de faire si les environnements à marque r sont
constants. ça évite d'avoir à les saisir à chaque appel de la fonction.
,----
| (defun LaTeX-post-comment-multiple-environment (environnements)
| (interactive
| (let ((env (read-string"Environnement (<RET> pour terminer): ")) (l'()))
| (while (not(string-empty-p env))
| (push env l)
| (setq env (read-string"Environnement : "))
| )
| (list l)))
| (mapcar
| (lambda(e)(funcall #'LaTeX-post-comment-environment e))
| environnements))
`----
On peut bien entendu affecter n'importe quelle séquence de touche
disponible à ces commandes. Par exemple en utilisant l'extension
bind-keys installée par Elpa
(bind-keys :map LaTeX-mode-map
("<f5> c" . LaTeX-post-comment-environment)
("<f5> C" . LaTeX-post-comment-multiple-environment))
Ou tout autre choix de touches selon les goûts.
--
JJR.
jj.retorre
Le #26535142
mar. 07 janv. 2020, Stéphane Dutailly
Juste un petit bémol, si ce n'est pas trop abuser. Je me suis aper çu
que si j'ai deux environnements imbriqués l'un à la suite de l' autre,
cela cause une erreur. Je m'explique: si j'ai
begin{thm}
coucou
begin{enumerate}
item blabla
end{enumerate}
end{thm}
begin{thm}
begin{enumerate}
item truc
end{enumerate}
end{thm}
begin{thm}
bidule
begin{enumerate}
item bla
end{enumerate}
end{thm}
puis je lance LaTeX-post-comment-multiple-environment, j'obtiens:
begin{thm}
coucou
begin{enumerate}
item blabla
end{enumerate}
% thm 1
end{thm}
begin{thm}
begin{enumerate}
item truc
end{enumerate}
% thm 2
end{thm}
% thm 3
begin{thm}
bidule
begin{enumerate}
item bla
end{enumerate}
end{thm}
% thm 4
Y a-t-il une solution simple? (sinon je peux contourner le problème en
mettant:
begin{thm} % a
begin{enumerate}
...
et alors la numérotation est correcte.

Voilà, c'est corrigé je pense, au moins pour ce bug là.
,----
| (defun LaTeX-post-comment-environment (env)
| "Post commente la fin des environnements par le nom de l'environnement
| et numérote"
| (interactive "SEnvironnement ? ")
| (save-excursion
| (goto-char (point-min))
| (delete-matching-lines(format "%s\ +%s\ +[1-9][0-9]*.*"
| TeX-comment-start-regexp env))
| (let ((compteur 0))
| (while (< (point) (point-max))
| (forward-list)
| (when (string=(LaTeX-current-environment) env)
| (LaTeX-find-matching-end)
| (setq compteur (1+ compteur))
| (insert (format "n%s %s %d" TeX-comment-start-regexp env
| compteur)))))))
`----
--
JJR
St=c3=a9phane Dutailly
Le #26535229
Voilà, c'est corrigé je pense, au moins pour ce bug là.
,----
| (defun LaTeX-post-comment-environment (env)
| "Post commente la fin des environnements par le nom de l'environnem ent
| et numérote"
| (interactive "SEnvironnement ? ")
| (save-excursion
| (goto-char (point-min))
| (delete-matching-lines(format "%s\ +%s\ +[1-9][0-9]*.*"
| TeX-comment-start-regexp env))
| (let ((compteur 0))
| (while (< (point) (point-max))
| (forward-list)
| (when (string=(LaTeX-current-environment) env)
| (LaTeX-find-matching-end)
| (setq compteur (1+ compteur))
| (insert (format "n%s %s %d" TeX-comment-start-regexp env
| compteur)))))))
`----
--
JJR


Super! Ça marche parfaitement! J'ai une dernière question: y a- t-il
moyen d'en faire aussi une version qui s'applique à des environnemen ts
prédéfinis? (exercise et thm par exemple) J'ai pensé à quelque chose comme:
(defun LaTeX-post-comment-predefini ()
(interactive)
(LaTeX-post-comment-environment (exercise))
(LaTeX-post-comment-environment (thm)))
mais ça me paraissait trop simple et effectivement ça ne foncti onne pas
(j'obtiens: Symbol's function definition is void: exercise)
En tous cas merci pour cette fonction qui correspond parfaitement à mes
besoins (je l'utilise avec «fold» ça me permet de réd uire mes
environnements tout en ayant une numérotation dynamique de chacun d' eux,
très pratique pour moi dans un gros fichier).
Stéphane
Publicité
Poster une réponse
Anonyme