Frage

Ich bin auf der Suche nach einer Möglichkeit, ein Teil ersetzen auf einer Zeichenfolge in LaTeX zu tun. Was ich möchte, ist zu tun, einen Befehl erstellen, die ich so nennen kann:

\replace{File,New}

und das wäre so etwas wie

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

Dies ist ein einfaches Beispiel, aber ich möchte Formatierung / Struktur in einem einzigen Befehl können, eher in dem Dokument als überall setzen. Ich weiß, dass ich mehrere Befehle bauen könnte, die Zahl der Parameter nehmen zu, aber ich hoffe, dass es einen einfacheren Weg.

Bearbeiten Klärungs

Ich suche nach einem Äquivalent von

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

etwas, das eine beliebige Zeichenfolge nehmen, und einen Teil mit einer anderen Teilkette ersetzen.

So konnte ich den Befehl rufen Sie mit \ ersetzen {Datei}, \ ersetzen {Datei, Neu}, \ ersetzen {Datei, Optionen, Benutzer} usw., wickeln Sie die Wörter mit Fettformatierung, und ersetzen Sie alle Kommas mit der Pfeil nach rechts Befehl. Auch wenn die „Verpackung mit fett“ etwas zu schwierig ist (wie ich denke, es könnte sein), nur das ersetzen Teil hilfreich sein würde.

War es hilfreich?

Lösung

Der allgemeine Fall ist eher komplizierter (wenn Sie keine Kommas als Trennzeichen verwenden), aber das Beispiel, das Sie gab ohne zu viel Mühe mit einigen Kenntnissen der LaTeX-Interna codiert werden.

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

Andere Tipps

  

es sieht aus wie Ihr „Räume“ Problem von einem Fehler in diesem Paket ist. Wenn Sie den „\ GetTokens“ Makro mit, sagen wir, Kommas umgeben, dann werden Sie sehen, dass der zusätzliche Raum, der von diesem Makro eingefügt wird.

Ja, es gibt Fehler in tokenizer Paket. Als ich auf dem Blog sagte der Bugfix ist die folgende Korrekturcode statt nur "\ usepackage [tRIM] {tokenizer}" zu verwenden:

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

werde ich diesen Bugfix in den Entwickler berichten Sascha Herpers

Es gibt ein LaTeX-Paket namens tokenizer , die Sie kann helfen, zu tun, was Sie wollen.

Hier ist ein Hack (aber rein LaTeX, keine Einbauten), die nahe kommt, was ich glaube, Sie wollen, aber mit einigen fremden Räumen Ich habe nicht ganz in der Lage gewesen zu beheben. Vielleicht Will Robertson weiter beraten? Im Gegensatz zu seiner etwas mehr poliert Antwort, ich habe die Stücke nicht parametrisiert, hier geht:

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

Versuchen Sie, das xstring Paket :

\usepackage{xstring}

[…]

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

OK, ich diese Antwort zurückziehen. Vielen Dank für die Klärung der Frage.


Ich vermute, dass dies nicht sein kann, was Sie wollen, aber hier geht sowieso:

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

Wenn dies nicht das, was Sie suchen, könnten Sie die Frage klären, bitte?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top