forarray 的 \ForEach 不够强大

forarray 的 \ForEach 不够强大

\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版本对其第三个参数进行了一级扩展。有更强大的方法来处理带有任意分隔符的列表。

相关内容