LaTeX 在表格环境中循环时出错

LaTeX 在表格环境中循环时出错
  • 使用的软件包:pgffor
  • 包中使用的函数:foreach
  • 编译:latex

最小化的文档:

\documentclass[a4paper]{article}

\usepackage{pgffor}

\begin{document}
\def\colourNames{red, green, blue}

\begin{tabular}{cc}
  \foreach \n in \colourNames {
    \foreach [expand list=true] \m in {\colourNames} { \n & \m \\ }
  }
\end{tabular}

\end{document}

我收到的错误:

! Extra }, or forgotten \endgroup.
<template> \unskip \hfil }
                          \hskip \tabcolsep \endtemplate 
l.11   }
        
? 
! Emergency stop.
<template> \unskip \hfil }
                          \hskip \tabcolsep \endtemplate 
l.11   }

添加\endgroup并没有帮助。删除“offending”}也没有帮助,因为它确实在前两行关闭了括号。

如果我用\tabular环境替换环境\itemize(并进行必要的更改以适应\item语法,则代码就可以了。

[...]
\begin{itemize}
  \foreach \n in \colourNames {
    \foreach [expand list=true] \m in {\colourNames} { \item \n, \m }
  }
\end{itemize}
[...]

最有可能的是,特殊表格字符&和/或//导致了问题。但如果是这样,如何才能将它们转义以便编译工作?有没有好的文档可以展示解决问题的最优雅的方法,并深入解释选项及其优缺点?


笔记:下面的“更新”部分总结了我收到的评论和答案,并提供了补充信息。我仍在积极处理收到的信息和线索。完成后,我会按照 David Carlisle 的建议,清理、完善并把“更新”部分移到答案中。

更新0: 到目前为止我发现有用的:

  1. 大卫卡莱尔的评论有助于理解错误的原因。
  2. Qrrbrbirlbel 和 pascal974 都指出了 LaTeX3 中的解决方案(参考教程会特别有用)
  3. Steven B. Segletes 的答案似乎提供了一个更简单的解决方案(使用 TeX 标记),但即便如此,我也需要一些时间和研究才能理解。
  4. 总而言之:到目前为止提出的两种解决方案看起来都很好,并且需要我进一步研究,所以我还不知道在解决原始问题时会选择哪一种。

更新1: 帮助您熟悉 TeX 标记的一系列文章:

  1. 新系列文章:TeX 标记和相关概念 - 但为什么(以及如何)?
  2. 什么是“TeX 标记”?
  3. 什么是 TeX 标记列表

阅读上述系列文章时,我发现一些有用的进一步参考资料:

  1. 对于令牌扩展:关于 \newtoks 和 token 列表的令人费解的事情

更新2: 第三个答案(使用 OpTeX)是最简单的,但它会引出一个平行宇宙(从 LaTeX 的角度来看)。对于刚开始使用并且不打算使用 LaTeX 功能的人来说,它非常有用。OpTeX 软件包文档非常棒。

更新 3: 事实证明,LaTeX3 解决方案最容易且最快地扩展以解决原始问题,从中提取了最小示例。它更容易接受额外的用户定义函数进入表格。所以,这就是为什么绿色勾号出现在那里。

更新 4: 不幸的是,添加新答案的机会已被阻止。链接的etoolbox解决方案受到与TeX 令牌解决方案。在里面添加用户定义的命令可以杀死它。因此,它仍然是 LaTeX3 选项,似乎是最万无一失的解决方案。(无论如何,供参考:etoolbox 软件包文档

答案1

使用 expl3,文档:interface3 usrguide和教程https://www.alanshawn.com/latex3-tutorial/

\documentclass[a4paper]{article}
%https://tex.stackexchange.com/questions/706767/latex-gives-error-when-looping-in-tabular-environment

\ExplSyntaxOn
%\<scope>_<module>_<description>_<type>
\seq_new:N \l_Tibor_listcolor_seq
\tl_new:N \l_Tibor_rowtab_tl
\NewDocumentCommand{\mytab}{ m }
  {
    \tl_clear:N \l_Tibor_rowtab_tl
    \seq_set_from_clist:NN \l_Tibor_listcolor_seq #1
    \seq_map_inline:Nn \l_Tibor_listcolor_seq  
      {
        \seq_map_inline:Nn \l_Tibor_listcolor_seq 
          {
            \tl_put_right:Nn \l_Tibor_rowtab_tl {##1 & ####1\\}
          }
      }
      \l_Tibor_rowtab_tl 
  }

\ExplSyntaxOff
\begin{document}
\def\colourNames{red, green, blue}

\begin{tabular}{| c | c |}
  \mytab{\colourNames}
\end{tabular}
\end{document}

在此处输入图片描述

答案2

使用\foreach循环收集令牌;然后,将它们一次性全部重新放进里面tabular

\documentclass[a4paper]{article}

\usepackage{pgffor}
\newtoks\mytoks
\newcommand\addtomytoks[1]{\global\mytoks\expandafter{\the\mytoks#1}}
\newcommand\xaddtomytoks[1]{\expandafter\addtomytoks\expandafter{#1}}
\begin{document}
\def\colourNames{red, green, blue}

\mytoks{}%
\foreach \n in \colourNames {%
  \foreach [expand list=true] \m in {\colourNames} { %
  \xaddtomytoks{\n &}\xaddtomytoks{\m \\} }%
}%
\begin{tabular}{cc}
  \the\mytoks
\end{tabular}

\end{document}

在此处输入图片描述

答案3

\foreach当我们使用 OpTeX 时,内部没有任何问题\table

\def\colourNames{red, green, blue}
\table{cc}{
   \ea\foreach \colourNames, \do#1, {%
      \ea\foreach \colourNames, \do##1, {#1 & ##1 \cr}
   }
}
\bye

相关内容