LaTeX dá erro ao fazer loop em ambiente tabular

LaTeX dá erro ao fazer loop em ambiente tabular
  • Pacote usado: pgffor
  • Função usada no pacote: foreach
  • Compilado com: látex

o documento minimizado:

\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}

o erro que recebo:

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

adicionar \endgroupnão ajuda. excluir a "ofensa" }não ajudaria, pois fecha a chave em duas linhas anteriores.

Se eu substituir o \tabularambiente por um \itemizeambiente (e fizer as alterações necessárias para ajustar a \itemsintaxe, o código estará OK.

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

Muito provavelmente, os caracteres tabulares especiais &e/ou //causam o problema. Mas se sim, como eles podem ser escapados para que a compilação funcione? Existe alguma documentação boa que mostre a maneira mais elegante de resolver o problema, com explicação detalhada das opções e seus prós e contras?


Observação:A seção "atualização" abaixo contém um resumo e informações adicionais aos comentários e respostas que recebi. Ainda estou processando ativamente as informações e leads que recebi. Quando terminar, esclarecerei, concluirei e moverei a seção "atualização" para uma resposta conforme recomendado por David Carlisle.

atualização 0: o que achei útil até agora:

  1. O comentário de David Carlisle ajudou a entender o que causou o erro.
  2. tanto Qrrbrbirlbel quanto pascal974 apontam para uma solução em LaTeX3 (a referência ao tutorial será especialmente útil)
  3. A resposta de Steven B. Segletes parece oferecer uma solução mais simples (usando tokens TeX), mas mesmo para isso preciso de algum tempo e pesquisa para entender.
  4. Resumindo: ambas as soluções sugeridas até agora parecem boas e precisam de mais estudos da minha parte, por isso ainda não sei qual selecionarei para resolver o problema original.

atualização 1: Uma boa série para ajudar a se familiarizar com os tokens TeX:

  1. Uma nova série de artigos: Tokens TeX e conceitos relacionados – mas por que (e como)?
  2. O que é um “token TeX”?
  3. O que é uma lista de tokens TeX

Algumas referências adicionais que achei úteis ao ler a série acima:

  1. para expansão de token:O que é intrigante sobre \newtoks e a lista de tokens

atualização 2: A terceira resposta (usando OpTeX) é a mais simples, mas leva a um universo paralelo (do ponto de vista do LaTeX). É extremamente útil para quem está apenas começando e não planeja usar os recursos do LaTeX.Documentação do pacote OpTeXé excelente.

atualização 3: Acontece que a solução LaTeX3 foi a mais fácil e rápida de expandir para resolver o problema original, do qual o exemplo mínimo foi extraído. Ele aceita uma função adicional definida pelo usuário mais facilmente na tabela. Então é por isso que a marca verde vai para lá.

atualização 4: A oportunidade de adicionar uma nova resposta foi bloqueada infelizmente. A solução vinculada etoolboxé afetada pelo mesmo problema que oToken TeXsolução. Adicionar um comando definido pelo usuário pode eliminá-lo. Portanto, ainda é a opção LaTeX3 que parece ser a solução mais à prova de balas. (Independentemente disso, para referência:Documentação do pacote etoolbox)

Responder1

Com expl3, a documentação: interface3 usrguidee um tutorialhttps://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}

insira a descrição da imagem aqui

Responder2

Use o \foreachloop para coletar os tokens; em seguida, regurgite-os todos de uma vez dentro do arquivo 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}

insira a descrição da imagem aqui

Responder3

Quando usamos o OpTeX, não temos problemas \foreachinternos \table:

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

informação relacionada