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û, 09:19

pluton's gravatar image

pluton
868520
Taux d'acceptation : 30%

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û, 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û, 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û, 20:35

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

Jean-jacques Rétorré
3154
Taux d'acceptation : 60%

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û, 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û, 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û, 18:36) touhami touhami's gravatar image

@touhami volontiers, c'est fait

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

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û, 02:06

joseph-tux's gravatar image

joseph-tux
47939
Taux d'acceptation : 6%

Sed, oulala, j'ai regardé ça il y a très très très longtemps et me souviens de rien !

(hier) pluton pluton'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û, 02:26

joseph-tux's gravatar image

joseph-tux
47939
Taux d'acceptation : 6%

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.

Mots-clés de la question :

×2

Question posée : 12 Aoû, 09:19

Question vue : 145 fois

Dernière mise à jour : hier