
Estou tentando incluir tabu
dentro de uma nova definição de ambiente, mas falhará se o postâmbulo ( enddef
) do novo ambiente incluir o conteúdo do tabu, ou seja, células. Com tabular
ou tabular*
funciona. O erro é:
! Missing number, treated as zero. \[email protected]
O MWE:
\documentclass{article}
\usepackage{tabu}
\newenvironment{testt}
{\begin{tabu} to \textwidth{cccc}
11 & 12 & 13 & 14 \\
21 & 22 & 23 & 24 \\}
{
41 & 42 & 43 & 44
\end{tabu}
}
\begin{document}
\begin{testt}
31 & 32 & 33 & 34 \\
\end{testt}
\end{document}
Como resolver isso?
Responder1
Experimente o pacote environ
. Este pacote utiliza \BODY
para marcar a posição do parâmetro, o que evita problemas, como incompatibilidade de colchetes e o que ocorreu nesta questão.
Veja seudocumento.
\documentclass{article}
\usepackage{tabu}
\usepackage{environ}
\NewEnviron{testt}
{\begin{tabu} to \textwidth{cccc}
11 & 12 & 13 & 14 \\
21 & 22 & 23 & 24 \\
\BODY
41 & 42 & 43 & 44
\end{tabu}
}
\begin{document}
\begin{testt}
31 & 32 & 33 & 34 \\
\end{testt}
\end{document}
Responder2
O tabu
pacote internamente faz
\tabu@collectbody#1#2\end
para coletar todo o conteúdo da tabela antes da composição. Isso não funcionará corretamente se você 'ocultar' alguma tabela. Funciona se você apenas ocultar \end{tabu}
como por exemplo
\documentclass{article}
\usepackage{tabu}
\newenvironment{testt}
{\begin{tabu} to \textwidth{cccc}
11 & 12 & 13 & 14 \\
21 & 22 & 23 & 24 \\}
{
\end{tabu}
}
\begin{document}
\begin{testt}
31 & 32 & 33 & 34 \\
41 & 42 & 43 & 44
\end{testt}
\end{document}
ainda agarra toda a mesa corretamente.
Você pode ver que algo está errado se usar \showthe\currentgrouplevel
dentro das células: todos os casos 'funcionais' têm nível de grupo 14, enquanto o 'errado' tem nível de grupo 8.
Como diz egreg, este é sem dúvida um bug no tabu
, ou pelo menos um 'recurso' que deve ser documentado. Para aconselhar sobre uma solução alternativa, acho que precisamos saber qual o efeito que você busca e podemos então sugerir uma abordagem alternativa: acho que seria melhor como uma nova pergunta.
Responder3
Você pode tentar com o collect
pacote. Nota bene: nunca usei nenhum deles collect
e tabu
certamente não sou capaz de avaliar habilmente se esta é uma forma viável e robusta.
\documentclass{article}
\usepackage{tabu}
\usepackage{collect}
\definecollection{rescuetabu}
\makeatletter
\newenvironment{testt}
{\@nameuse{collect*}{rescuetabu}
{\begin{tabu} to \textwidth{cccc}
11 & 12 & 13 & 14 \\
21 & 22 & 23 & 24 \\ }
{41 & 42 & 43 & 44 \\ \end{tabu}}{}{}}
{\@nameuse{endcollect*}}
\makeatother
\begin{document}
\texttt{normal tabu}
\begin{tabu} to \textwidth{cccc}
11 & 12 & 13 & 14 \\
21 & 22 & 23 & 24 \\
31 & 32 & 33 & 34 \\
\end{tabu}
\hrule\medskip
\texttt{rescued tabus}
\begin{testt}
31 & 32 & 33 & 34 \\
\end{testt}
\bigskip
\begin{testt}
51 & 52 & 53 & 54 \\
61 & 62 & 63 & 64 \\
\end{testt}
\hrule
\end{document}