使用 xparse 转换列表

使用 xparse 转换列表

我希望能够将列表转换A,B,CA \\ 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}

在此处输入图片描述

相关内容