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}