我希望能够将列表转换A,B,C
为A \\ B \\ C
,其中 A、B、C 是 LaTeX 表达式。使用像 这样的包来做这件事会很简单xstring
,但 A、B 或 C 可能包含逗号。所以我想到使用xparse
,编写一些像 这样的代码{>{\SplitList{,}}m}
。
不幸的是,它不仅没有起作用,甚至尝试这样简单的事情:
\DeclareDocumentCommand\foo%
{>{\SplitList{,}}m}%
{\ProcessList{#1}{#1 X}
.......................
\foo{a,b,c}
仅产生:
我预料到了aXbXcX
。我真的不明白发生了什么,也不明白ProcessList
发生了什么。
另一个问题是,到目前为止,我还不知道如何用换行符命令来指示替换分隔逗号。
答案1
\ProcessList
不允许像您编写的那样的内联函数;该接口需要一个宏来处理列表的每个后续项目:
\documentclass[a4paper]{article}
\usepackage{xparse}
\begin{document}
\DeclareDocumentCommand \foo { >{\SplitList{,}} m }
{
\ProcessList{#1}{\processfoo}
}
\newcommand\processfoo[1]{#1X}
\foo{a,b,c}
\end{document}
按照你的编写方式\ProcessList{#1}{#1 X}
,将导致收到如下参数:
\ProcessList{a,b,c}{a,b,c X}
并且(无论出于何种原因)这就是您最终在问题中得到意外输出的原因。
答案2
该stringstrings
包被设置为方便地操作字符串。它对诸如 之类的宏字符串的操作能力有限\\
。在这个 MWE 中,我首先展示(ABC)涉及 的转换\\
。对于第二个示例(DEF),如果涉及的字符不是宏,它会显示一行等效项。第三个输出(cde)仅显示\\
已被 正确恢复\decodetoken
。
\documentclass{article}
\usepackage{stringstrings}
\begin{document}
\encodetoken{\\}
\convertchar[e]{A,B,C}{,}{\\}
\retokenize{\thestring}
\thestring
\decodetoken{\\}
\convertchar{D,E,F}{,}{X}
c\\d\\e
\end{document}
为了回应 OP 关于需要在环境内堆叠的评论matrix
,我发布了此附录,以查看是否tabstackengine
有替代方案足以堆叠类似矩阵的物质?这里,它使用逗号作为行尾分隔符。
\documentclass{article}
\usepackage{tabstackengine}
\stackMath
\begin{document}
\setstackEOL{,}
\setstacktabulargap{0pt}
\setstackgap{L}{1.3\baselineskip}
\tabularLongstack{rl}{
x =&u^2, y=&v^2, z=&w^2
}
\end{document}