- Используемый пакет: pgffor
- Функция, используемая из пакета: foreach
- Составил с: латекс
минимизированный документ:
\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
не помогает. удаление «оскорбительного» }
не поможет, так как оно закрывает фигурную скобку на две строки раньше.
Если я заменю \tabular
среду на \itemize
среду (и внесу необходимые изменения, чтобы соответствовать\item
, то код будет в порядке.
[...]
\begin{itemize}
\foreach \n in \colourNames {
\foreach [expand list=true] \m in {\colourNames} { \item \n, \m }
}
\end{itemize}
[...]
Вероятнее всего, специальные табличные символы&
и/или //
вызывают проблему. Но если так, как их экранировать, чтобы компиляция работала? Есть ли хорошая документация, показывающая наиболее элегантный способ решения проблемы, с подробным объяснением опций и их плюсов и минусов?
Примечание:Раздел "обновление" ниже содержит сводку и дополнительную информацию по комментариям и ответам, которые я получил. Я все еще активно обрабатываю информацию и лиды, которые я получил. Когда закончу, я очистлю, дополню и перенесу раздел "обновление" в ответ, как рекомендовал Дэвид Карлайл.
обновление 0: Что я нашел полезным на данный момент:
- Комментарий Дэвида Карлайла помог понять причину ошибки.
- и Qrrbrbirlbel, и pascal974 указывают на решение в LaTeX3 (ссылка на учебник будет особенно полезна)
- Ответ Стивена Б. Сеглетеса, похоже, предлагает более простое решение (использование токенов TeX), но даже для его понимания мне нужно некоторое время и исследования.
- в целом: оба предложенных решения кажутся хорошими и требуют дальнейшего изучения с моей стороны, поэтому я пока не знаю, какое из них я выберу для решения исходной проблемы.
обновление 1: Хорошая серия, которая поможет вам познакомиться с токенами TeX:
- Новая серия статей: токены TeX и связанные с ними концепции — но почему (и как)?
- Что такое «токен TeX»?
- Что такое список токенов TeX?
Еще несколько ссылок, которые я нашел полезными при чтении вышеуказанной серии:
- для расширения токена:Загадочная вещь о \newtoks и списке токенов
обновление 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
Когда мы используем OpTeX, то у нас нет проблем с \foreach
внутренней частью \table
:
\def\colourNames{red, green, blue}
\table{cc}{
\ea\foreach \colourNames, \do#1, {%
\ea\foreach \colourNames, \do##1, {#1 & ##1 \cr}
}
}
\bye