
Estoy tratando de incluir tabu
dentro de una nueva definición de un entorno, pero falla si el postámbulo ( enddef
) del nuevo entorno incluye el contenido del tabú, es decir, las celdas. Con tabular
o tabular*
funciona. El error es:
! Missing number, treated as zero. \[email protected]
El 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}
¿Cómo solucionar esto?
Respuesta1
Pruebe el paquete environ
. Este paquete utiliza \BODY
para marcar la posición del parámetro, lo que evita problemas, como la falta de coincidencia de llaves y lo que ocurrió en esta pregunta.
ver sudocumento.
\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}
Respuesta2
El tabu
paquete internamente
\tabu@collectbody#1#2\end
para recoger todo el contenido de la tabla antes de componerla. Eso no funcionará correctamente si "oculta" alguna parte de la tabla. Funciona si solo ocultas el \end{tabu}
como por ejemplo
\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}
todavía agarra toda la mesa correctamente.
Puedes ver que algo anda mal si usas \showthe\currentgrouplevel
dentro de las celdas: todos los casos "funcionales" tienen el nivel de grupo 14, mientras que el "incorrecto" es el nivel de grupo 8.
Como dice egreg, podría decirse que esto es un error tabu
, o al menos una "característica" que debería documentarse. Para aconsejarle sobre una solución alternativa, supongo que necesitamos saber qué efecto busca y luego podemos sugerir un enfoque alternativo: creo que sería mejor como una nueva pregunta.
Respuesta3
Puedes probar con el collect
paquete. Nota bene: nunca lo he usado collect
ni tabu
seguramente soy incapaz de evaluar de manera experta si esta es una forma viable y sólida.
\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}