不能在带有后记单元格的 \newenvironment 内包含“tabu”

不能在带有后记单元格的 \newenvironment 内包含“tabu”

我试图tabu在环境的新定义中包含一个,但如果enddef新环境的后置 () 包含 tabu 的内容,则它会失败,因此单元格。使用tabulartabular*有效。错误是:

! 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

在排版之前收集表格的所有内容。如果您“隐藏”任何表格,这将无法正常工作。如果您只隐藏表格,则它可以正常工作,\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包。注意:我从未使用过,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}

拯救禁忌

相关内容