- 使用的软件包: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: 到目前为止我发现有用的:
- 大卫卡莱尔的评论有助于理解错误的原因。
- Qrrbrbirlbel 和 pascal974 都指出了 LaTeX3 中的解决方案(参考教程会特别有用)
- Steven B. Segletes 的答案似乎提供了一个更简单的解决方案(使用 TeX 标记),但即便如此,我也需要一些时间和研究才能理解。
- 总而言之:到目前为止提出的两种解决方案看起来都很好,并且需要我进一步研究,所以我还不知道在解决原始问题时会选择哪一种。
更新1: 帮助您熟悉 TeX 标记的一系列文章:
阅读上述系列文章时,我发现一些有用的进一步参考资料:
更新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