PythonTeX + \InputIfFileExists 用于在 longtable 中输入行,在结尾之前创建了虚假空间

PythonTeX + \InputIfFileExists 用于在 longtable 中输入行,在结尾之前创建了虚假空间

Xubuntu 14.04 LTS 上的 TeX Live 2014。

最小工作示例:

\documentclass[11pt, twoside]{book}
\usepackage{pythontex}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{longtable}

\begin{document}
\chapter{longtable with \\InputIfFileExists vs. longtable without}
\begin{longtable}{ll}
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endfirsthead
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endhead
    \hline
    \endfoot
    \bottomrule
    \endlastfoot
    \InputIfFileExists{tablerows.tex}{}{}
\end{longtable}

\begin{longtable}{ll}
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endfirsthead
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endhead
    \hline
    \endfoot
    \bottomrule
    \endlastfoot
    {John Doe} & {110} \\

\end{longtable}
\end{document}

文件内容tablerows.tex(包含最后的换行符):

{John Doe} & {110} \\

在两种情况下,删除\usepackage{pythontex}都会产生相同的输出。这似乎是一个错误,但我想找到解决方法。我在搜索引擎上没有找到有关此问题的任何信息。有什么想法吗?我遗漏了什么吗?

PS:也可能会影响其他表格,我还没有检查。

答案1

pythontex需要其他包,filehook在本例中,这是坏人。 的定义\InputIfFileExists变为

\renewcommand{\InputIfFileExists}[2]{%
  \IfFileExists{#1}
    {\expandafter\filehook@swap\expandafter{\@filef@und}{%
       #2\@addtofilelist{#1}%
       \filehook@every@atbegin{#1}%
       \filehook@atbegin{#1}\@@input
     }%
     \filehook@atend{#1}\filehook@every@atend{#1}%
    }%
}

而原始定义是

% latex.ltx, line 1757:
\newcommand\InputIfFileExists[2]{%
  \IfFileExists{#1}%
    {#2\@addtofilelist{#1}\@@input \@filef@und}}

这意味着在输入文件的尾部之后\\,会执行一些操作,这些操作会阻止 TeX 搜索\omit\noalign,因此由于表尚未结束,因此会开始新的行。

解决方法:使用原始定义表安全命令\InputIfFileExists

\documentclass[11pt, twoside]{book}
\usepackage{pythontex}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{longtable}

\makeatletter
\@ifundefined{filehook@csuse}
  {\let\TablesafeInputIfFileExists\InputIfFileExists}% filehook is not loaded
  {\let\TablesafeInputIfFileExists\latex@InputIfFileExists}
\makeatletter

\begin{document}

\chapter{longtable with \\InputIfFileExists vs. longtable without}
\begin{longtable}{ll}
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endfirsthead
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endhead
    \hline
    \endfoot
    \bottomrule
    \endlastfoot
    \TablesafeInputIfFileExists{kreuvrows.tex}{}{}
\end{longtable}

\begin{longtable}{ll}
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endfirsthead
    \toprule
    {Col 1} & {Col 2} \\
    \hline \endhead
    \hline
    \endfoot
    \bottomrule
    \endlastfoot
    {John Doe} & {110} \\

\end{longtable}
\end{document}

在此处输入图片描述

相关内容