我想将空格分隔的字符串拆分成几部分,并为每个部分生成代码。显然 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
答案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}