\@for lässt sich nicht mit \StrSubstitute kombinieren

\@for lässt sich nicht mit \StrSubstitute kombinieren

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

Bildbeschreibung hier eingeben

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 \@forwird der String jedoch nicht geteilt.

Warum nicht und wie behebe ich das?

Antwort1

\StrSubstitutehat mehrere optionale Argumente und kann nicht erweiterbar sein, daher ist es nicht möglich, die Ausgabe zu verwenden \StrSubstituteund sie erneut in den Eingabestrom von TeX einzuspeisen.

Es ist möglich, das Ergebnis in einem temporären Makro zu speichern \StrSubstituteund 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}

Bildbeschreibung hier eingeben

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.

Bildbeschreibung hier eingeben

\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 listofitemsPaket kann auf der Grundlage einer angegebenen Anzahl von Zeichen, die hier als Leerzeichen und Komma angegeben sind, analysieren ,. Somit \setsepcharlö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}

Bildbeschreibung hier eingeben

verwandte Informationen