- 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 \endgroup
não ajuda. excluir a "ofensa" }
não ajudaria, pois fecha a chave em duas linhas anteriores.
Se eu substituir o \tabular
ambiente por um \itemize
ambiente (e fizer as alterações necessárias para ajustar a \item
sintaxe, 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:
- O comentário de David Carlisle ajudou a entender o que causou o erro.
- tanto Qrrbrbirlbel quanto pascal974 apontam para uma solução em LaTeX3 (a referência ao tutorial será especialmente útil)
- 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.
- 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:
- Uma nova série de artigos: Tokens TeX e conceitos relacionados – mas por que (e como)?
- O que é um “token TeX”?
- O que é uma lista de tokens TeX
Algumas referências adicionais que achei úteis ao ler a série acima:
- 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
usrguide
e 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}
Responder2
Use o \foreach
loop 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}
Responder3
Quando usamos o OpTeX, não temos problemas \foreach
internos \table
:
\def\colourNames{red, green, blue}
\table{cc}{
\ea\foreach \colourNames, \do#1, {%
\ea\foreach \colourNames, \do##1, {#1 & ##1 \cr}
}
}
\bye