babel 在自定义环境中与 booktabs 和 tabularx 发生冲突

babel 在自定义环境中与 booktabs 和 tabularx 发生冲突

我有一个这样的文档,可以正常编译:

\documentclass{article}

\usepackage{booktabs}
\usepackage{tabularx}

\newenvironment{myenv}
               {\tabularx{\columnwidth}{X}\toprule}
               {\bottomrule\endtabularx}

\begin{document}

\begin{myenv}
    Foo\\
\end{myenv}

\end{document}

我也需要\usepackage[italian]{babel},但如果我这样做然后编译,我会收到以下错误:

! Misplaced \noalign.
\bottomrule ->\noalign 
                       {\ifnum 0=`}\fi \@aboverulesep =\aboverulesep \global...
l.16 \end{myenv}

并且在 PDF 输出中,表格有两个\bottomorules,第一个与表格对齐,第二个向左移动:

在此处输入图片描述

我该如何解决这个问题?

更新:仅当 babel 使用意大利语时才会出现错误,我尝试过的所有其他语言都运行良好。

答案1

问题etoolbox在于 italian 加载了 which。它在最终环境代码中插入了一个钩子,而 tabularx 不喜欢这样。

使用latex的开发版本,你可以通过调用pdflatex-dev它来使用,它的钩子代码更加健壮。

或者你可以尝试 xparser 的 b 参数:

\documentclass{article}
\usepackage[italian]{babel}
\usepackage{xparse}
\usepackage{booktabs}
\usepackage{tabularx}

\NewDocumentEnvironment{myenv}{b}
               {\begin{tabularx}{\columnwidth}{X}\toprule #1  \bottomrule\end{tabularx}}
               {}

\begin{document}

\begin{myenv}
    Foo\\
\end{myenv}

\end{document}

相关内容