Невозможно включить «табу» внутрь \newenvironment с ячейками в постамбуле

Невозможно включить «табу» внутрь \newenvironment с ячейками в постамбуле

Я пытаюсь включить tabuвнутрь нового определения среды, но это не удается, если постамбула ( enddef) новой среды включает содержимое табу, поэтому ячейки. С tabularили tabular*работает. Ошибка:

! Missing number, treated as zero. \[email protected]

МВЭ:

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

Как это решить?

решение1

Попробуйте пакет environ. Этот пакет использует \BODYдля разметки позицию параметра, что позволяет избежать проблем, таких как несовпадение фигурных скобок и того, что произошло в этом вопросе.

Смотрите егодокумент.

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

решение2

Пакет tabuвнутренне не

\tabu@collectbody#1#2\end

чтобы собрать все содержимое таблицы перед набором. Это не будет работать правильно, если вы 'спрячете' любую часть таблицы. Это работает, если вы скроете только as, \end{tabu}например

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

по-прежнему правильно захватывает всю таблицу.

Вы можете увидеть, что что-то не так, если воспользуетесь \showthe\currentgrouplevelячейками: все «рабочие» случаи имеют уровень группы 14, тогда как «неправильный» случай — уровень группы 8.

Как говорит egreg, это, возможно, ошибка в tabuили, по крайней мере, «фича», которая должна быть задокументирована. Чтобы дать совет по обходному пути, я полагаю, нам нужно знать, какой эффект вы ищете, а затем предложить альтернативный подход: Я думаю, это будет лучше всего в качестве нового вопроса.

решение3

Вы можете попробовать с collectпакетом. Nota bene: не имея опыта использования ни того, collectни другого, tabuя, безусловно, не могу экспертно оценить, является ли это жизнеспособным и надежным способом.

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

спасенный табу

Связанный контент