Question

Je cherche un moyen de remplacer une chaîne par une chaîne dans LaTeX. Ce que je voudrais faire est de construire une commande que je peux appeler comme ceci:

\replace{File,New}

et cela générerait quelque chose comme

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

Ceci est un exemple simple, mais j'aimerais pouvoir mettre en forme / structure dans une seule commande plutôt que partout dans le document. Je sais que je pourrais construire plusieurs commandes prenant un nombre croissant de paramètres, mais j'espère qu'il existe un moyen plus simple.

Modifier pour clarification

Je recherche un équivalent de

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

quelque chose qui peut prendre une chaîne arbitraire et remplacer une sous-chaîne par une autre.

Je pourrais donc appeler la commande avec \ replace {Fichier}, \ replace {Fichier, Nouveau}, \ replace {Fichier, Options, Utilisateur}, etc. commande flèche droite. Même si le " emballage avec gras " le bit est trop difficile (comme je pense que cela pourrait être le cas), seule la partie de remplacement serait utile.

Était-ce utile?

La solution

Le cas général est un peu plus compliqué (lorsque vous n'utilisez pas de virgules comme séparateurs), mais l'exemple que vous avez donné peut être codé sans trop de problèmes avec une certaine connaissance des éléments 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}

Autres conseils

  

cela ressemble à vos "espaces". le problème provient d'un bogue dans ce paquet. Si vous entourez le " \ GetTokens " macro avec, par exemple, des virgules, alors vous verrez que l’espace supplémentaire est inséré par cette macro.

Oui, il y a des bugs dans le paquetage tokenizer. Comme je l'ai dit sur mon blog , le correctif consiste à utiliser le code de correction suivant au lieu de simplement "\ usepackage [trim] {tokenizer}":

\usepackage[trim]{tokenizer}  

\def\SH@GetTokens#1,#2\@empty{%
    \def\SH@token{#1}%
    \ifx\SH@trimtokens\SH@true% strip spaces if requested
        \TrimSpaces\SH@token%
    \fi%
    \SH@DefineCommand{\SH@FirstArgName}{\SH@token}%
    \SH@DefineCommand{\SH@SecondArgName}{#2}%
    }
\def\SH@CheckTokenSep#1,#2\@empty{%
    \def\SH@CTSArgTwo{#2}%
    \ifx\SH@CTSArgTwo\@empty%
        \edef\SH@TokenValid{\SH@false}%
    \else%
        \edef\SH@TokenValid{\SH@true}%
    \fi%
    }

Je vais signaler ce correctif au développeur Sascha Herpers

Un paquet LaTeX appelé tokenizer qui peut vous aider à faire ce que vous voulez.

Voici un hack (mais du LaTeX pur, pas d'internaux) qui se rapproche de ce que je pense que vous voulez, mais avec quelques espaces superflus que je n'ai pas encore pu réparer. Peut-être que Will Robertson pourra-t-il conseiller davantage? Contrairement à sa réponse légèrement plus raffinée, je n’ai pas paramétré les éléments, voici ce qui se passe:

\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}\\  

Essayez le paquet xstring :

\usepackage{xstring}

[…]

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

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

Je suppose que ce n'est peut-être pas ce que vous voulez, mais voici quand même:

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

Si ce n'est pas ce que vous cherchez, pourriez-vous clarifier la question, s'il vous plaît?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top