\@for は \StrSubstitute と合成されません

\@for は \StrSubstitute と合成されません

スペースで区切られた文字列を複数の部分に分割し、各部分のコードを生成したい。どうやらTeXはカンマ区切りの文字列をネイティブに処理するらしいので、適応版を書いてみた。

\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

ここに画像の説明を入力してください

カンマ区切りの文字列の出力の最初の行は正しいです。スペース区切りの文字列が対応するカンマ区切りの文字列に変換されることを示す出力の 2 行目は正しいです。

ただし、3 行目の 2 番目の\@for文字列は分割されていません。

なぜそうならないのでしょうか、またどうすればこれを修正できるのでしょうか?

答え1

\StrSubstituteには複数のオプション引数があり、拡張できないため、 からの出力を使用して\StrSubstituteTeX の入力ストリームに再度入力することはできません。

\StrSubstituteの結果を一時マクロに保存し、このマクロを\@for\next...への入力として使用することも可能です。

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

ここに画像の説明を入力してください

答え2

スペースで区切られたリストをループする必要がある場合、スペースをカンマに置き換えて、カンマで区切られたリストをループする必要はありません。その置き換えを実装するには、おそらくスペースを反復処理する機能が必要です。

たとえば、これはスペースで区切られた単語を反復処理し、それぞれを fbox に格納します。

ここに画像の説明を入力してください

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

答え3

パッケージlistofitemsは、指定された文字の多重度 (ここではスペースとカンマとして指定) に基づいて解析できます,。したがって、 の 1 つの定義は、\setsepcharを使用せずにすべてのケースを解決しますxstring。マクロ でソリューションを具体化するように編集されました\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}

ここに画像の説明を入力してください

関連情報