由于 \input 在 booktabs 规则之前,导致 \noalign 位置错误

由于 \input 在 booktabs 规则之前,导致 \noalign 位置错误

在大型项目中,我重复使用\input存储为子文件的表格行。这在过去非常有效,但在我的 texlive 2021 中,当规则booktabs遵循输入时,这会失败。MWE:

\documentclass{article}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{ccc}
\toprule
    1 & 2 & 3\\
\midrule    
\input{foo}
\bottomrule % This causes the error
\end{tabular}
\end{document}

foo.tex根本就在哪里a & b & c \\

\tabularnewline以或结尾的表格行也会失败\cr。有趣的是,在( )\bottomrule内部可以正常工作,但这不是一个好的解决方案,因为在另一个表中可能需要,而不一定作为最后一行。据我所知,与 不同,严格添加文件的内容,因此 是在子文件内部还是外部应该无关紧要,但事实并非如此。我想知道是否有比 更好的解决方案。foo.texa & b & c \\\bottomrulefoo.tex\include\input\bootomrule\input{foot}\\[-12pt]\bottomrule

答案1

您的问题与这里和类似于这个。较新的版本在(来自)\input的路径中添加了不可扩展的标记,因此当看到时已经太晚了,您会收到错误。在不对文档主体进行任何更改的情况下,您可以将以下内容添加到您的序言中:\noalign\bottomrule\noalign

\ExplSyntaxOn
\cs_new:Npn \expandableinput #1
  { \use:c { @@input } { \file_full_name:n {#1} } }
\AddToHook{env/tabular/begin}
  { \cs_set_eq:NN \input \expandableinput }
\ExplSyntaxOff

上述代码将重新定义\input\expandableinput所有tabular环境。要将其添加到更多环境,只需复制这两行并更改环境名称:

\AddToHook{env/tabularx/begin} % also for tabularx
  { \cs_set_eq:NN \input \expandableinput }
\AddToHook{env/tabulary/begin} % and for tabulary
  { \cs_set_eq:NN \input \expandableinput }

答案2

我将提供替代解决方案tabularray2022B 版本(2022-06-01)的软件包,使用库evaluate中的选项:functional

\begin{filecontents*}[overwrite]{foo.tex}
  a & b & c \\
\end{filecontents*}

\documentclass{article}
\usepackage{tabularray}
\UseTblrLibrary{booktabs,functional}
\begin{document}
\begin{booktabs}[evaluate=\fileInput]{ccc}
\toprule
  1 & 2 & 3\\
\midrule
  \fileInput{foo}
\bottomrule
\end{booktabs}
\end{document}

其中\fileInput函数由库提供functional

在此处输入图片描述

相关内容