自从更新到 2020 Fall 版本(Windows 上的 MikTeX 但也使用 TeXLive 进行测试)以来,我无法再编译使用\input
和后跟\hline
(或\bottomrule
)从外部文件导入表的文件。
旧版本一切运行完美。
请注意,如果最后一个\\
位于要导入的文件之外,那么它可以工作,但如果表是从其他软件自动创建的,那么这不是一个可行的选择。
以下是 MWE:
\begin{document}
\begin{table}
\caption{Table in text}
\begin{tabular}{lcc}
a & 1 & 2\\
b & 1 & 2\\
\hline
\end{tabular}
\end{table}
\begin{table}
\caption{Table in other file 1}
\begin{tabular}{lcc}
\input{table1}
\hline
\end{tabular}
\end{table}
\begin{table}
\caption{Table in other file 2}
\begin{tabular}{lcc}
\input{table2}\\
\hline
\end{tabular}
\end{table}
\end{document}
使用外部文件:
表1.tex:
a & 1 & 2\\
b & 1 & 2\\
表格2.tex:
a & 1 & 2\\
b & 1 & 2
失败时的日志如下:
This is pdfTeX, Version 3.14159265-2.6-1.40.21 (MiKTeX 20.10)
entering extended mode
(MWE.tex
LaTeX2e <2020-10-01> patch level 1
L3 programming layer <2020-10-05> xparse <2020-03-03>
("C:\Program Files\MiKTeX\tex/latex/base\article.cls"
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
("C:\Program Files\MiKTeX\tex/latex/base\size10.clo"))
("C:\Program Files\MiKTeX\tex/latex/l3backend\l3backend-pdftex.def") (MWE.aux)
(table1.tex)
! Misplaced \noalign.
\hline ->\noalign
{\ifnum 0=`}\fi \hrule \@height \arrayrulewidth \futurelet...
l.18 \hline
! You can't use `\hrule' here except with leaders.
\hline ->\noalign {\ifnum 0=`}\fi \hrule
\@height \arrayrulewidth \futurelet...
l.18 \hline
! Missing number, treated as zero.
<to be read again>
\futurelet
l.18 \hline
! Illegal unit of measure (pt inserted).
<to be read again>
\futurelet
l.18 \hline
(table2.tex) [1{C:/Users/Gouel/AppData/Local/MiKTeX/pdftex/config/pdftex.map}]
(MWE.aux) )
(see the transcript file for additional information)<C:/Program Files/MiKTeX/fo
nts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on MWE.pdf (1 page, 14750 bytes).
Transcript written on MWE.log.
在 Linux 下使用旧版本时,它运行完美:
This is pdfTeX, Version 3.14159265-2.6-1.40.20 (TeX Live 2019/Debian) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./MWE.tex
LaTeX2e <2020-02-02> patch level 2
L3 programming layer <2020-02-14>
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2019/12/20 v1.4l Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def)
(./MWE.aux) (./table1.tex) (./table2.tex) [1{/var/lib/texmf/fonts/map/pdftex/up
dmap/pdftex.map}] (./MWE.aux) )</usr/share/texlive/texmf-dist/fonts/type1/publi
c/amsfonts/cm/cmr10.pfb>
Output written on MWE.pdf (1 page, 13788 bytes).
Transcript written on MWE.log.
答案1
是的,LaTeX 在这里发生了变化,但它还添加了新的环境挂钩,您可以使用它们来更改所有表格中的原始输入,这将带来额外的好处,如果文件以 . 开头,它也会起作用\multicolumn
。
(引擎接受支撑输入也是相当新颖的)。
\documentclass{article}
\begin{filecontents}{table1.tex}
a & 1 & 2\\
b & 1 & 2\\
\end{filecontents}
\makeatletter
%primitive input in tabular
\AddToHook{env/tabular/begin}{\let\input\@@input}
\makeatother
\begin{document}
\begin{tabular}{lcc}
\input{table1}
\hline
\end{tabular}
\end{document}
答案2
使用 TeX 作品的原始行为\input
。如果您省略文件名周围的括号,则可以在 LaTeX 中使用它,在这种情况下,LaTeX 将恢复为原始行为。
您将失去 LaTeX 文件处理的一些优点(没有钩子、pdfTeX 中的文件名不支持 utf8、文件名中不允许有空格等),但仅仅输入表格主体,我想这应该没问题。
由于 LaTeX 测试左括号的方式不可扩展,因此您仍然无法在表格中使用任意内容。第一行不能以需要的内容开头\noalign
(例如,这里没有规则),第一个单元格也不能以需要的内容开头\omit
(例如,这里没有\multicolumn
)。如果需要,\input
您不必使用,而是必须直接调用\@@input
LaTeX 中命名的原语(您要么\makeatletter...\makeatother
在表格周围使用需要,要么必须使用 来调用它\csname @@input\endcsname mytable1
)。
\documentclass[]{article}
\begin{filecontents}{mytable1.tex}
a & 1 & 2\\
b & 1 & 2\\
\end{filecontents}
\begin{document}
\begin{tabular}{lcc}
\hline
\input mytable1
\hline
\end{tabular}
\end{document}