
スペースで区切られた文字列を複数の部分に分割し、各部分のコードを生成したい。どうやら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
には複数のオプション引数があり、拡張できないため、 からの出力を使用して\StrSubstitute
TeX の入力ストリームに再度入力することはできません。
\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}