Pourquoi les deux codes ne donnent pas le même résultat ?

\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\test{2**3}
\StrSubstitute{\test}{**}{\dots^}[\tempa]
\test{} se transforme en $\tempa$

\StrSubstitute{2**3}{**}{\dots^}[\tempab]
2**3 se transforme en $\tempab$

\end{document}

et en inversant... on obtient :

\documentclass{article}
\usepackage{xstring}
\begin{document}
\StrSubstitute{2**3}{**}{\dots^}[\tempa]
2**3 se transforme en $\tempa$

\def\test{2**3}
\StrSubstitute{\test}{**}{\dots^}[\tempa]
\test{} se transforme en $\tempa$

\end{document}

Posée 15 Mar '21, 18:20

christophe-poulain's gravatar image

christophe-poulain
8661727
Taux d'acceptation : 37%

Modifiée 16 Mar '21, 14:05

Pathe's gravatar image

Pathe ♦♦
7.5k43204251


La documentation de xstring précise que, par défaut, les arguments de \StrSubstitute doivent être purement développables (fully expandable en anglais). Ce n'est pas le cas de \dots et donc votre utilisation de \StrSubstitute n'est pas correcte.

Vous pouvez changer de mode de fonctionnement de xstring avec la commande \noexpandarg mais, dans ce cas-là, \test ne sera pas développé avant application de \StrSubstitute et donc il n'y aura pas de remplacement de ** par \dots^ (puisque \StrSubstitute ne verra que \test et pas le ** qui est dedans).

Suivant ce que vous voulez vraiment faire, vous aurez peut-être intérêt à écrire une macro à un argument #1 qui sera placé en premier argument de \StrSubstitute (et à ce moment-là, vous aurez le contenu de #1, si je puis dire, présent en premier argument de \StrSubstitute prêt à faire les substitutions sans développer au préalable ses arguments --- du fait du \noexpandarg).

Par ailleurs, je vous suggère de jeter un coup d'œil à regex de expl3 (maintenant incorporé dans le noyau LaTeX) qui propose sans doute les outils les plus puissants pour les substitutions dans les listes de tokens.

Lien permanent

Publiée 17 Mar '21, 22:51

fpantigny's gravatar image

fpantigny
1.3k44
Taux d'acceptation : 36%

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.