Não é possível incluir um 'tabu' dentro de \newenvironment com células no postâmbulo

Não é possível incluir um 'tabu' dentro de \newenvironment com células no postâmbulo

Estou tentando incluir tabudentro 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 tabularou 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 \BODYpara 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 tabupacote 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\currentgroupleveldentro 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 collectpacote. Nota bene: nunca usei nenhum deles collecte tabucertamente 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}

tabu resgatado

informação relacionada