\ForEach
以及相关命令数组包不够健壮。它们无法处理分隔符处于活动状态的列表(例如,活动逗号)。此外,列表项后的任何尾随空格在整个处理过程中都会保留。例如,使用
\begingroup
\catcode`\,=13
\gdef\x{ {a} , \if , {b} , \fi }
\endgroup
\ForEachX{,}{\typeout{X\unexpanded\expandafter{\thislevelitem}X}}\x
我明白了
\fe@item@check@next ->\fe@getitem@i {a}
\fe@getitem@i #1,->\fe@setitem@i {#1}
#1<-{a} , \if , {b} , \fi
...
{changing \thislevelitem=\relax}
{into \thislevelitem=\long macro:->{a} , \if , {b} , \fi }
这意味着第一次抓取列表项时,\thislevelitem
是整个列表:->{a} , \if , {b} , \fi
。
请问我该如何解决这些问题?
另外,如果数组句法
\begin{enumerate}
\ForEach{;}{
\item This is item No.\ \the\thislevelcount.
\begin{enumerate}
\ForEachSublevel{,}{\item \thislevelitem.}
\end{enumerate}
}{%
This is a nested item, Another nested item ;
{This item is, well, nested}, A final item
}
\end{enumerate}
就是这样做的
\begin{enumerate}
\ForEach{;}{
\item This is item No.\ \the\thislevelcount.
\begin{enumerate}
\ForEach{,}{\item \thislevelitem.}{<level 2 list>}
\end{enumerate}
}
{<level 1 list>}
\end{enumerate}
答案1
\ForEach
不对其输入进行任何清理,这使得它不适合在通用包中使用,该包可能用于分隔符具有不同类别代码的情况(正如您所知,这是处理选项列表的包的常见问题)。
该\ForEachX
版本对其第三个参数进行了一级扩展。有更强大的方法来处理带有任意分隔符的列表。