cerhu > comp.divers.* > comp.applications.emacs

Stéphane Dutailly (29/12/2019, 20h05)
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 compter le
nombre d'occurences d'un environnement «thm» dans un fichier tex et
d'afficher après chacun le numéro correspondant. Concrètement, 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\n" 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\n thm"
compteur)) ou (insert (format "%% %d\n" "thm" compteur)) ou (insert
(format "%% %d\n" 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 environnement
«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
Jean-Jacques Rétorré (30/12/2019, 20h55)
dim. 29 déc. 2019, Stéphane Dutailly <dutaillys> disait:

[..]
> 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 seulement
une proposition de départ.

Cordialement
Jean-Jacques Rétorré (30/12/2019, 21h12)
lun. 30 déc. 2019, jj.retorre (Jean-Jacques Rétorré) disait :

[..]
> (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"))


Pour appliquer ce code, il suffit de l'inclure comme commentaire dans le
document LaTeX et de l'évaluer. En faire une commande est trivial.
[..]
Stéphane Dutailly (06/01/2020, 00h20)
Le 30/12/2019 à 20:12, Jean-Jacques Rétorré a écrit :
> lun. 30 déc. 2019, jj.retorre (Jean-Jacques Rétorré) disait :
> Pour appliquer ce code, il suffit de l'inclure comme commentaire dans le
> document LaTeX et de l'évaluer. En faire une commande est trivial.


Bonjour,

Merci Jean-Jacques pour cette proposition. J'ai testé; ça commente bien
mais le problème, c'est que contrairement à la fonction que j'avais, ça
n'efface pas le commentaire précédent pour remettre le bon. Je m'explique:
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 je 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 peut
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ôtque « % 1 ».
Je suppose que tout est dans le (pour ma fonction maj-fin-theoreme)

(replace-match (format "%% %d" compteur) t)
(insert (format "%% %d\n" 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
Jean-Jacques Rétorré (06/01/2020, 10h43)
dim. 05 janv. 2020, Stéphane Dutailly <dutaillys> disait :

[..]
> \begin{thm}
> mon troisième thm
> \end{thm}

% thm 7
[..]
> (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 fonction)

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 LaTeX en
commentaire et à évaluer par C-x C-e

J'ai écrit une commande qui fait la même chose que l'on peut activer de
manière interactive par /M-x LaTeX-post-comment-multiple-environment/ ou
comme précédemment en évaluant le code elisp en commentairesdans 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.
Jean-Jacques Rétorré (06/01/2020, 10h55)
lun. 06 janv. 2020, jj.retorre (Jean-Jacques Rétorré) disait :

> dim. 05 janv. 2020, Stéphane Dutailly <dutaillys> disait :
> 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))
Jean-Jacques Rétorré (07/01/2020, 09h22)
dim. 05 janv. 2020, Stéphane Dutailly <dutaillys> disait :

> Bonjour,
> Merci Jean-Jacques pour cette proposition. J'ai testé; ça commente
> bien mais le problème, c'est que contrairement à la fonction que
> j'avais, ça n'efface pas le commentaire précédent pour remettre 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))))))) )
`----

[..]
> 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 LaTeX en
commentaire et à évaluer par C-x C-e

J'ai écrit une commande qui fait la même chose que l'on peut activer de
manière interactive par /M-x LaTeX-post-comment-multiple-environment/ ou
comme précédemment en évaluant le code elisp en commentairesdans le
source LaTeX. Placer le point à derrière la parenthèse limitant 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 à marquer sont
constants. ça évite d'avoir à les saisir à chaque appelde 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.
Stéphane Dutailly (07/01/2020, 22h52)
[..]
> | (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))))))) )
> `----


[..]
> (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.

Super!! C'est exactement ce que je voulais! En plus, je ne connaissais
pas C-x C-e pour évaluer la fonction. Un gros gros merci!

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.

Merci encore!
Stéphane
Jean-Jacques Rétorré (08/01/2020, 09h43)
mar. 07 janv. 2020, Stéphane Dutailly <dutaillys> disait :

[..]
> \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)))))))
`----
Stéphane Dutailly (08/01/2020, 23h15)
[..]
> | (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 environnements
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 fonctionne 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éduire mes
environnements tout en ayant une numérotation dynamique de chacun d'eux,
très pratique pour moi dans un gros fichier).

Stéphane
Jean-Jacques Rétorré (09/01/2020, 07h55)
mer. 08 janv. 2020, Stéphane Dutailly <dutaillys> disait :

> 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 environnements
> 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 fonctionne
> pas (j'obtiens: Symbol's function definition is void: exercise)


La syntaxe de l'appel d'une fonction en Emacs lisp c'est
(<fonction> <arguments>)

de plus, aussi bien <fonction> que <arguments> sont évalués avant
l'évaluation de la forme. Si ces symboles ne sont pas définis,
l'évaluation retourne une erreur.

(defun LaTeX-post-comment-predefini ()
(interactive)
(LaTeX-post-comment-environment "exercise")
(LaTeX-post-comment-environment "thm"))

La valeur de "exercise", c'est "exercise"

> En tous cas merci pour cette fonction qui correspond parfaitement à
> mes besoins (je l'utilise avec «fold» ça me permet de réduire mes
> environnements tout en ayant une numérotation dynamique de chacun
> d'eux, très pratique pour moi dans un gros fichier).


Je suis très loin d'être un expert en elisp, je trouve amusant d'écrire
dans ce langage. Petit à petit j'apprends à coder en codant.
Discussions similaires
creer une macro latex pour gener une table de verite fonction desentrees et de la fonction logique

[VBA] Fonction personnelle... savoir l'emplacement de la cellule où se trouve un appel de cette fonction

La fonction rado croit plus vite que n'importe quelle fonction calculable

Envoyer globalement les arguments d'une fonction vers une autre fonction


Fuseau horaire GMT +2. Il est actuellement 11h43. | Privacy Policy