
Ich möchte eine durch Leerzeichen getrennte Zeichenfolge in Teile aufteilen und für jeden Teil Code generieren. Anscheinend funktioniert TeX nativ mit durch Kommas getrennten Zeichenfolgen, also habe ich versucht, eine Anpassung zu schreiben
\usepackage{xstring}
\makeatletter
\@for\next:=foo,bar,baz\do{X \next Y} \\
\StrSubstitute{foo bar baz}{ }{,} \\
\@for\next:=\StrSubstitute{foo bar baz}{ }{,}\do{X \next Y}
\makeatother
Die erste Ausgabezeile für eine durch Kommas getrennte Zeichenfolge ist korrekt. Die zweite Ausgabezeile, die zeigt, wie eine durch Leerzeichen getrennte Zeichenfolge in die entsprechende durch Kommas getrennte Zeichenfolge umgewandelt wird, ist korrekt.
In der dritten, zweiten Zeile \@for
wird der String jedoch nicht geteilt.
Warum nicht und wie behebe ich das?
Antwort1
\StrSubstitute
hat mehrere optionale Argumente und kann nicht erweiterbar sein, daher ist es nicht möglich, die Ausgabe zu verwenden \StrSubstitute
und sie erneut in den Eingabestrom von TeX einzuspeisen.
Es ist möglich, das Ergebnis in einem temporären Makro zu speichern \StrSubstitute
und dieses Makro als Eingabe für \@for\next
… zu verwenden.
\documentclass{article}
\usepackage{xstring}
\begin{document}
\makeatletter
\@for\next:=foo,bar,baz\do{X \next Y} \\
\StrSubstitute{foo bar baz}{ }{,} \\
\StrSubstitute{foo bar baz}{ }{,}[\@stuff]
\@for\next:=\@stuff\do{X \next Y}
\makeatother
\end{document}
Antwort2
Wenn die Anforderung darin besteht, eine durch Leerzeichen getrennte Liste zu durchlaufen, müssen Leerzeichen nicht durch Kommas ersetzt und eine durch Kommas getrennte Liste durchlaufen werden. Die Implementierung dieses Ersetzens erfordert wahrscheinlich bereits die Möglichkeit, über die Leerzeichen zu iterieren.
Dies iteriert beispielsweise über die durch Leerzeichen getrennten Wörter und fügt jedes in eine Fbox ein.
\documentclass{article}
\def\zz#1{\zzz#1 \! }
\def\zzz#1 {\ifx\!#1\else\fbox{#1} \expandafter\zzz\fi}
\begin{document}
\zz{foo bar baz}
\end{document}
Antwort3
Das listofitems
Paket kann auf der Grundlage einer angegebenen Anzahl von Zeichen, die hier als Leerzeichen und Komma angegeben sind, analysieren
,
. Somit \setsepchar
löst eine Definition von alle Fälle, ohne dass verwendet werden muss xstring
. BEARBEITET, um die Lösung im Makro zu verkörpern \processlist
.
\documentclass{scrartcl}
\usepackage{listofitems}
\setsepchar{ ||,}%
\newcommand\processlist[1]{%
\readlist\mylist{#1}%
\foreachitem\next\in\mylist{X \next Y}%
}
\begin{document}
\processlist{foo,bar,baz}
\processlist{foo bar baz}
\end{document}