Ma question n'est pas directement liée à latex mais presque. Dans un très gros document, les entrées d'index n'ont pas été correctement créées et les instances suivantes existent : J'aimerais corriger toutes ces erreurs de manière automatique mais je ne vois pas trop comment faire : Perl + expressions régulières ? Python ? |
Pas besoin de sortir la grosse artillerie, la plupart des éditeurs orientés LaTeX doivent être capables d'effectuer une recherche et remplacement par expression régulière. Je l'ai montré sur deux exemples en commentaires. Sinon, changer d'éditeur. Publiée 12 Aoû '19, 20:35 Jean-jacques Rétorré En effet, avec notepad++, l'instruction
(13 Aoû '19, 01:20)
pluton
Avec Emacs, il existe des outils pour construire les regexp et les tester de manière interactive. J'ai testé avec les données que tu as fournies, je ne suis pas devin. notepad++ je ne sais pas, je n'ai jamais utilisé. Il n'y a pas ça dans les dépôts Debian. La mise au point d'une regexp demande parfois un peu de temps et de patience, et aussi un peu de savoir-faire.
(13 Aoû '19, 03:17)
Jean-jacques Rétorré
@touhami volontiers, c'est fait
(16 Aoû '19, 20:54)
joseph-tux
@Jean-Jacques Rétorré à mes yeux, sed n’est pas vraiment de l’artillerie lourde, c’est normalement plus rapide que d’ouvrir un éditeur, et la question d’en changer ne se pose pas…
(23 Aoû '19, 00:23)
sztruks
@sztruks Je n'utilise pas sed car à chaque fois que j'en ai besoin, je dois me taper une lecture du man, au minimum. Il y a peut-être des outils pour aider à la mise au point des regexp, mais je n'en ai pas été informé, je préfère utiliser ce que je connais. J'ai l'impression que la solution proposée consiste en une recherche et remplacement avec regexp ce que n'importe quel éditeur conséquent peut faire. Me trompe-je ?
(23 Aoû '19, 02:09)
Jean-jacques Rétorré
Affichage de 5 parmi 6
Afficher 1 commentaire(s) en plus
|
1 S'il ne doit y avoir aucun espace ailleurs sur la ligne: avec sed (ou avec Perl) sed -i 's/\s\+//g' *.idx Simple, éprouvé, efficace, immédiat y compris sur plusieurs fichiers 2 Pour n'enlever, comme ici, que les espaces avant ou après le «!» point d'exclamation: sed -i 's/\s\+!\s\+/!/g' fichiers*.idx Avec Perl, pas besoin d'échapper le quantificateur «+» perl -i .bkp -pe 's/\s+!\s+/!/g' fichiers*.idx autre avantage avec -i .bkp, si on se trompe le fichier initial est sauvegardé. Si on est à l'aise avec son éditeur, autant l'utiliser. (c'est vim qui m'a appris ça de sed) Publiée 15 Aoû '19, 02:06 joseph-tux Sed, oulala, j'ai regardé ça il y a très très très longtemps et me souviens de rien !
(20 Aoû '19, 04:24)
pluton
|
Avec vim sed -i 's/s+!s+/!/g' devient :%s/s+!s+/!/g (% si on veut remplacer dans tout le fichier) Publiée 15 Aoû '19, 02:26 joseph-tux Le problème de cette regex sur un document volumineux est qu'elle s'applique à tous les « ! » du document, et pas seulement aux marques d'index. Il faudrait faire une regex plus spécifique. C'est possible (mais pas si simple) avec les regex de Perl, mais je ne sais pas avec SED ou Vim. Aussi, je propose la solution suivante, une règle d'écriture pour les index.
(16 Aoû '20, 16:10)
joseph-tux
|
Suggestion pour un code plus efficace, et une regex plus sûre. Et si on présentait « \index{ » sur une ligne séparée ? Avec vim, pour faciliter à la fois la lecture et les modifications en masse, j’utilise la forme d’écriture suivante pour les « \footnote » (sauf si elles sont très brèves et tiennent sur une seule ligne, séparée et courte.)
J’indique ici par ^ le début de ligne: On a ainsi un bloc isolé --- un bloc-note ;) ---, entre Ouvrir dans l'éditeur Overleaf
^\footnote{% et facile à repérer et à identifier avec ses 3 « % » en fin de ligne . La seule contrainte: il faut faire attention à ne pas laisser d’espace avant la balise footnote, qui doit toujours commencer à la première colonne de la page. Si l’appel de note est suivi d’une ponctuation, je la mets immédiatement après l’accolade fermante du bloc-note, et de toute façon, le texte se poursuit la ligne suivante. Cette discussion m’incite a envisager d’appliquer une règle analogue pour les index, qui gagneraient à être simplement placés après une balise de commentaire % , au début de la ligne suivante. Dans ce cas, la regex sous vim pourrait gagner en précision et ne s’appliquer spécifiquement qu’à la commande index. Pour cela, la regex, au lieu de s’appliquer à tout le fichier avec « :% » , s’appliquerait spécifiquement à toutes les lignes comprenant « index{ » , en utilisant l’opérateur de sélection « :g/ » La regex devient alors : Ouvrir dans l'éditeur Overleaf
:g/\\index\{/s/\s+!\s+/!/g ou à peine moins précis (bien plus lisible pour comprendre l’exemple) : Ouvrir dans l'éditeur Overleaf
:g/index/s/\s+!\s+/!/g Publiée 16 Aoû '20, 14:36 joseph-tux |
Avec Emacs, (query-replace-regexp "index{\([^ ]+\)[ ]?![ ]?\([^ ]+\)}" "index{\1!\2}" nil nil nil nil nil) devrait le faire. Il vaut mieux le faire en mode interactif, car la commande est très puissante et celà permet un contrôle visuel de chaque remplacement. Mais ce n'est pas obligatoire. La plupart des éditeurs proposent une recherche et remplacement utilisant les regexps mais la syntaxe peut différer.
Avec TeXStudio, rechercher index\{([^ ]+)[ ]?![ ]?([^ ]+)\} et remplacer par index{\1!\2}, J'ai essayé aussi avec TeXworks, les mêmes expressions régulières marchent aussi.