在大型项目中,我重复使用\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.tex
a & b & c \\\bottomrule
foo.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
我将提供替代解决方案tabularray
2022B 版本(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
。