2020 年秋季 LaTeX 发布后 \input{table.tex}\hline 出现问题

2020 年秋季 LaTeX 发布后 \input{table.tex}\hline 出现问题

自从更新到 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您不必使用,而是必须直接调用\@@inputLaTeX 中命名的原语(您要么\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}

在此处输入图片描述

相关内容