LaTeX выдает ошибку при цикле в табличной среде

LaTeX выдает ошибку при цикле в табличной среде
  • Используемый пакет: 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: Что я нашел полезным на данный момент:

  1. Комментарий Дэвида Карлайла помог понять причину ошибки.
  2. и Qrrbrbirlbel, и pascal974 указывают на решение в LaTeX3 (ссылка на учебник будет особенно полезна)
  3. Ответ Стивена Б. Сеглетеса, похоже, предлагает более простое решение (использование токенов TeX), но даже для его понимания мне нужно некоторое время и исследования.
  4. в целом: оба предложенных решения кажутся хорошими и требуют дальнейшего изучения с моей стороны, поэтому я пока не знаю, какое из них я выберу для решения исходной проблемы.

обновление 1: Хорошая серия, которая поможет вам познакомиться с токенами TeX:

  1. Новая серия статей: токены TeX и связанные с ними концепции — но почему (и как)?
  2. Что такое «токен TeX»?
  3. Что такое список токенов TeX?

Еще несколько ссылок, которые я нашел полезными при чтении вышеуказанной серии:

  1. для расширения токена:Загадочная вещь о \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

Связанный контент