2008-09-18 9 views
9

Je cherche un moyen de faire un remplacement de sous-chaîne sur une chaîne dans LaTeX. Ce que je voudrais faire est de construire une commande que je peux appeler comme ceci:Remplacer un caractère avec une chaîne dans LaTeX

\replace{File,New} 

et qui générerait quelque chose comme

\textbf{File}$\rightarrow$\textbf{New} 

Ceci est un exemple simple, mais je voudrais être capable de mettre en forme/structure dans une seule commande plutôt que partout dans le document. Je sais que je pourrais construire plusieurs commandes qui prennent un nombre croissant de paramètres, mais j'espère qu'il y a un moyen plus facile.

Modifier des éclaircissements

Je suis à la recherche d'un équivalent de

string.replace(",", "$\rightarrow$) 

quelque chose qui peut prendre une chaîne arbitraire, et remplacer une chaîne par une autre. Donc, je pourrais appeler la commande avec \ replace {Fichier}, \ remplacer {Fichier, Nouveau}, \ remplacer {Fichier, Options, Utilisateur}, etc., envelopper les mots avec le format gras, et remplacer les virgules par la commande de flèche droite. Même si le bit "d'emballage avec gras" est trop difficile (comme je pense qu'il pourrait être), juste la partie de remplacement serait utile.

Répondre

6

Le cas général est un peu plus difficile (quand vous ne l'utilisez la virgule comme séparateur), mais l'exemple que vous donné peut être codé sans trop de problèmes avec une certaine connaissance des internes de LaTeX.

\documentclass[12pt]{article} 
\makeatletter 
\newcommand\formatnice[1]{% 
    \let\@formatsep\@formatsepinit 
    \@for\@ii:=#1\do{% 
    \@formatsep 
    \formatentry{\@ii}% 
    }% 
} 
\def\@formatsepinit{\let\@formatsep\formatsep} 
\makeatother 
\newcommand\formatsep{,} 
\newcommand\formatentry[1]{#1} 
\begin{document} 
\formatnice{abc,def} 

\renewcommand\formatsep{\,$\rightarrow$\,} 
\renewcommand\formatentry[1]{\textbf{#1}} 
\formatnice{abc,def} 
\end{document} 
+0

J'ai voté ceci - c'est mieux que le mien, dont le seul vrai mérite est qu'il est pur LaTeX –

+0

Cela a fonctionné très bien, merci! –

-1

OK, je retire cette réponse. Merci d'avoir clarifié la question.


Je soupçonne que cela peut ne pas être ce que vous voulez, mais ici va de toute façon:

\newcommand{\replace}[2]{\textbf{#1}$\rightarrow$\textbf{#2}} 
\replace{File}{New} 

Si c'est pas ce que vous cherchez, pourriez-vous préciser la question, s'il vous plaît?

2

Il existe un paquet LaTeX appelé tokenizer qui peut vous aider à faire ce que vous voulez.

Voici un bidouillage (mais du LaTeX pur, sans internals) qui se rapproche de ce que je pense que vous voulez, mais avec des espaces superflus que je n'ai pas encore été capable de réparer. Peut-être Will Robertson peut conseiller davantage? Contrairement à sa réponse un peu plus poli, je ne l'ai pas paramétrées les morceaux, va ici:

\usepackage{forloop} 
\usepackage[trim]{tokenizer} 
... 
\newcounter{rrCount} 
\newcommand{\replace}[1]{% 
    \GetTokens{rrFirst}{rrRest}{#1,}% 
    \textbf{\rrFirst}% 
    \forloop{rrCount}{0}{\value{rrCount} < 100}{% 
     \ifthenelse{\equal{\rrRest}{}}{% 
      \setcounter{rrCount}{101}% 
     }{% 
      \GetTokens{rrFirst}{rrRest}{\rrRest}% 
      $\rightarrow$\textbf{\rrFirst}% 
     }% 
    }% 
}% 
% ----------------------------------------------------------------- 
\replace{a1}\\ 
\replace{a2,b2}\\ 
\replace{a3,b3,c3}\\ 
+0

Hmmm . Je n'ai pas utilisé le package tokenizer auparavant; il semble que votre problème d '"espaces" provient d'un bogue dans ce paquet. Si vous entourez la macro "\ GetTokens" avec, disons, des virgules, alors vous verrez que l'espace supplémentaire est inséré par cette macro. Par conséquent, pas votre faute :) –

+0

Oui, je pensais que c'était. J'ai essayé d'ajouter quelques '%' s au hasard à eol dans la macro, mais en vain. –

2

Essayez le xstring package:

\usepackage{xstring} 

[…] 

\StrSubstitute{File,New}{,}{\(\rightarrow\)} 
+0

Le lien est cassé, essayez http://www.ctan.org/pkg/xstring –

4

il ressemble à votre problème "espaces" est d'un bogue dans ce paquet. Si vous entourez la macro "\ GetTokens" avec, disons, des virgules, alors vous verrez que l'espace supplémentaire est inséré par cette macro.

Oui, il existe des bogues dans le package tokenizer.Comme je l'ai dit sur mon blog, le bugfix est d'utiliser le code suivant la correction au lieu de "\ usepackage [TRIM] {tokenizer}":

\usepackage[trim]{tokenizer} 

\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]token{#1}% 
    \ifx\[email protected]\[email protected]% strip spaces if requested 
     \TrimSpaces\[email protected]% 
    \fi% 
    \[email protected]{\[email protected]}{\[email protected]}% 
    \[email protected]{\[email protected]}{#2}% 
    } 
\def\[email protected]#1,#2\@empty{% 
    \def\[email protected]{#2}% 
    \ifx\[email protected]\@empty% 
     \edef\[email protected]{\[email protected]}% 
    \else% 
     \edef\[email protected]{\[email protected]}% 
    \fi% 
    } 

Je ferai rapport bugfix au développeur Sascha Herpers

Questions connexes