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

在此处输入图片描述

第一行输出的逗号分隔字符串是正确的。第二行输出显示空格分隔字符串被转换为相应的逗号分隔字符串是正确的。

然而,在第三行,即第二行中\@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包可以根据指定的字符数进行解析,这里给出的是空格和逗号,。因此,一个定义\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}

在此处输入图片描述

相关内容