OVH Cloud OVH Cloud

Extraire des commandes LaTeX de fichiers

16 réponses
Avatar
Denis Bitouzé
Bonjour,

un peu à la bourre et ne connaissant que mal le domaine des
expressions régulières, je me tourne vers ce groupe pour poser
la question suivante : comment procéder pour extraire d'un (grand
nombre de) fichier(s) toutes les commandes LaTeX, à savoir tous les
« mots » qui :

1) commencent par une contre-oblique \
2) sont suivies :
a) soit d'un nom constitué exclusivement de lettres
b) soit de l'un des caractères { } % # $ ^ ~ & _ \
3) se terminent par un espace, un chiffre ou un caractère autre
qu'une lettre.

Merci d'avance à toute bonne âme me donnant la réponse ou
m'orientant vers un groupe plus approprié pour ce genre de
questions.
--
Denis

6 réponses

1 2
Avatar
Denis Bitouzé
Le 27 aoû 2006 à 12h11
Ralf Angeli a écrit :

Ça construit un buffer <nom-du-fichier-tex>.macros avec tous les
macros.



Mais c'est que ça a l'air de marcher ! Merci beaucoup !

Tu peux le sauvegarder et traiter le fichier avec `sort' et
`uniq'.



Y a-t-il moyen de lancer ce code lisp directement en ligne de
commandes ? Je dois en effet traiter ainsi plus de 300 fichiers ! Je
souhaiterais en outre que tous les résultats soient stockés dans
un unique fichier que, effectivement, traiterai ensuite avec `sort' et
`uniq'.
--
Denis
Avatar
Ralf Angeli
* Denis Bitouzé (2006-08-27) writes:

Y a-t-il moyen de lancer ce code lisp directement en ligne de
commandes ? Je dois en effet traiter ainsi plus de 300 fichiers ! Je
souhaiterais en outre que tous les résultats soient stockés dans
un unique fichier que, effectivement, traiterai ensuite avec `sort' et
`uniq'.



Sauvegardes la fonction suivante dans un fichier (macro-extract.el par
example) :

(defun my-extract-tex-macros-batch ()
"Extract all TeX macros from current buffer."
(let (infile
(outbuf (get-buffer-create "*macros*")))
(while (setq infile (pop command-line-args-left))
(find-file infile)
(while (re-search-forward "((^|[^n])(\\)*)
(\([A-Za-z]+|[{}%#$^~&_]))" nil t)
(let ((macro (match-string 4)))
(with-current-buffer outbuf
(insert macro "n"))))
(kill-buffer (current-buffer)))
(with-current-buffer outbuf
(write-file "macros.txt"))))

Avec ça tu peux lancer Emacs en mode batch avec

$ emacs -batch -l macro-extract.el -f my-extract-tex-macros-batch toto.tex

Ça va produire un fichier macros.txt avec les macros.

--
Ralf
Avatar
Denis Bitouzé
Le 27 aoû 2006 à 13h16
Ralf Angeli a écrit :

Ça va produire un fichier macros.txt avec les macros.



C'est exactement ce dont j'avais besoin ! Merci mille... euh non,
*deux* mille fois !
--
Denis
Avatar
Denis Bitouzé
Le 27 aoû 2006 à 12h11
Ralf Angeli a écrit :

Peut-être la fonction suivante marche pour toi :

(defun my-extract-tex-macros ()
"Extract all TeX macros from current buffer."
(interactive)
(let ((outbuf (get-buffer-create (concat (buffer-name)
".macros"))))
(save-excursion
(goto-char (point-min))
(while (re-search-forward
"((^|[^n])(\\)*)
(\([A-Za-z]+|[{}%#$^~&_]))" nil t)
(let ((macro (match-string 4)))
(with-current-buffer outbuf
(insert macro "n")))))))



Ceci est en fait /presque/ exactement ce dont j'ai besoin : le seul
petit souci étant que si une commande suit immédiatement une
autre qui n'a pas d'argument, elle n'est pas détectée. Ainsi, si
j'ai une ligne contenant :

tititoto

toto n'est pas détectée.

Donc argh et os court...

Merci d'avance,
--
Denis
Avatar
Ralf Angeli
* Denis Bitouzé (2006-08-28) writes:

Le 27 aoû 2006 à 12h11
Ralf Angeli a écrit :

Peut-être la fonction suivante marche pour toi :

(defun my-extract-tex-macros ()




[...]
Ceci est en fait /presque/ exactement ce dont j'ai besoin : le seul
petit souci étant que si une commande suit immédiatement une
autre qui n'a pas d'argument, elle n'est pas détectée. Ainsi, si
j'ai une ligne contenant :

tititoto

toto n'est pas détectée.



Okay, c'est en peu « hackish », mais ça devrait regler :

(defun my-extract-tex-macros ()
"Extract all TeX macros from current buffer."
(interactive)
(let ((outbuf (get-buffer-create (concat (buffer-name) ".macros"))))
(save-excursion
(goto-char (point-min))
(while (re-search-forward "((^|[^n])(\\)*)
(\([A-Za-z]+|[{}%#$^~&_]))" nil t)
(backward-char)
(let ((macro (match-string 4)))
(with-current-buffer outbuf
(insert macro "n")))))))

C'est le même chose comme auparavant, mais avec un "(backward-char)".
Tu peux rajouter ça dans `my-extract-tex-macros-batch' aussi.

--
Ralf
Avatar
Denis Bitouzé
Le 28 aoû 2006 à 19h30
Ralf Angeli a écrit :

Okay, c'est en peu « hackish », mais ça devrait regler :



Le hackish, ça devrait être obligatoire ;)

Merci !
--
Denis
1 2