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 : \index{mot1!mot2} (correct) mais aussi \index{mot1 !mot2}, \index{mot1! mot2} et \index{mot1 ! mot2}.

J'aimerais corriger toutes ces erreurs de manière automatique mais je ne vois pas trop comment faire : Perl + expressions régulières ? Python ?

Posée 12 Aoû '19, 09:19

pluton's gravatar image

pluton
1.2k22836
Taux d'acceptation : 34%

Modifiée 08 Sep '20, 14:45

Pathe's gravatar image

Pathe ♦♦
7.4k29196245

2

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.

(12 Aoû '19, 10:44) Jean-jacques Rétorré Jean-jacques%20R%C3%A9torr%C3%A9's gravatar image
2

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.

(12 Aoû '19, 20:32) Jean-jacques Rétorré Jean-jacques%20R%C3%A9torr%C3%A9's gravatar image

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.

Lien permanent

Publiée 12 Aoû '19, 20:35

Jean-jacques%20R%C3%A9torr%C3%A9's gravatar image

Jean-jacques Rétorré
55615
Taux d'acceptation : 44%

En effet, avec notepad++, l'instruction index\{([^ ]+?)[ ]?![ ]?([^ ]+?)\} (j'ai ajouté des ? pour éliminer les problèmes lorsque deux \index{...} se suivent. Cependant, pour les entrées un peu plus compliquées comme \index{mot1 mot2!mot3 mot4}, ça ne fonctionne pas. L'instruction \index\{([A-Z].*?[a-z]?)[ ]?![ ]?([A-Z].*?[a-z]?)\}semble pas mal: elle autorise les espaces entre les mots avant ! et après. Par contre, elle sélectionne tout quand elle voit quelque chose qui ressemble à \index{mot}\index{mot1 mot2!mot3 mot4} parce qu'elle cherche systématiquement un !.

(13 Aoû '19, 01:20) pluton pluton's gravatar image

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é Jean-jacques%20R%C3%A9torr%C3%A9's gravatar image
1

@joseph-tux voudriez vous convertir vos commentaires en réponse ?

(15 Aoû '19, 18:36) touhami touhami's gravatar image

@touhami volontiers, c'est fait

(16 Aoû '19, 20:54) joseph-tux joseph-tux's gravatar image

@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's gravatar image

@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é Jean-jacques%20R%C3%A9torr%C3%A9's gravatar image
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)

Lien permanent

Publiée 15 Aoû '19, 02:06

joseph-tux's gravatar image

joseph-tux
42722452
Taux d'acceptation : 4%

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 pluton's gravatar image

@pluton sed est très bien expliqué dans la page de manuel d’OpenBSD.

(23 Aoû '19, 00:23) sztruks sztruks's gravatar image

Avec vim

sed -i 's/s+!s+/!/g'

devient

:%s/s+!s+/!/g

(% si on veut remplacer dans tout le fichier)

Lien permanent

Publiée 15 Aoû '19, 02:26

joseph-tux's gravatar image

joseph-tux
42722452
Taux d'acceptation : 4%

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 joseph-tux's gravatar image

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.)

  1. Commentaire collé au mot qui appelle la note pour annuler l’espace parasite qu’ajouterait le retour à la ligne,

  2. appel de note en début de ligne suivante avec commentaire après l’accolade ouvrante ({%),

  3. commentaire à la fin du texte de la note (c’est du luxe !),

  4. fermeture du bloc note sur une ligne séparée, suivi de la ponctuation si on veut laisser babel gérer les espaces au mieux, (poursuite du texte principal à la ligne suivante).

    blabla, du texte% footnote{% Le texte de la note qui peut être très très long...% }, et la suite du texte.

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

Ouvrir dans l'éditeur Overleaf
  ^}

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
Lien permanent

Publiée 16 Aoû '20, 14:36

joseph-tux's gravatar image

joseph-tux
42722452
Taux d'acceptation : 4%

Modifiée 07 Sep '20, 22:05

Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.