如何正确地将 tabularx 包装在 threeparttable 中?

如何正确地将 tabularx 包装在 threeparttable 中?

我的问题基本上在标题中。我试过了,但无法让它工作,尽管threeparttable文档明确声明兼容tabularx。以下是我迄今为止尝试过的:

main.tex

\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage[english]{babel}
\usepackage{testpack}

\usepackage{lipsum}

\begin{document}

\begin{tabxn}{label}{Caption}{Xr}{\textwidth}
  Head A      & Head B \\
  \midrule
  \lipsum[1]  & Something\tnote{a}
\tabxnotes
  \item[a] Some remark;
\end{tabxn}

\end{document}

testpack.sty

\ProvidesPackage{testpack}

\RequirePackage{float}
\RequirePackage{booktabs}
\RequirePackage{tabularx}
\RequirePackage[para,flushleft]{threeparttable}

\makeatletter%
\newcommand{\tabxnotes}{\bottomrule\end{tabularx}\begin{tablenotes}}%
\newenvironment{tabxn}[5][\fps@table]{%
  \expanded{\noexpand\begin{table}[#1]}%
    \label{tab:#2}%
    \caption{#3}%
    \begin{threeparttable}%
      \centering%
      \begin{tabularx}{#5}{#4}%
        \toprule%
}{%
      \end{tablenotes}%
    \end{threeparttable}
  \end{table}%
}%
\newcommand{\tabxnfile}[5][\fps@table]{%
  \begin{scitabxn}[#1]{#2}{#3}{#4}{#5}%
    \input{tab/#2}%
  \end{scitabxn}%
}%
\makeatother%

main.log(摘抄)

Runaway argument?
 \par 
! File ended while scanning use of \TX@get@body.
<inserted text> 
                \par 
<*> main.tex

我知道这应该告诉我我可能忘记了右括号、a\end{env}或类似的东西,但我通过三重检查没有发现任何东西。我该如何让它工作,如果不行,我处理这个问题的方式有什么缺陷?

编辑:进一步追踪错误,它似乎在命令中\tabxnotes。当我用命令替换其内容时,MWE 会编译。然而,为了保持干燥,我想把这些东西放在一个命令里,而不是三个。

答案1

编辑:进一步追踪这个错误,它似乎出现在\tabxnotes命令中。

你基本上不能这样做

\newcommand{\tabxnotes}{\bottomrule\end{tabularx}\begin{tablenotes}}%

您可以定义tabularx为另一个的一部分环境但你不能用一个命令开始它,用另一个命令结束它,使用环境形式。

环境是 latex 中的基本语法构造,隐藏该语法通常不是一个好主意。但诸如tabularx或 AMS 对齐之类的环境align是特殊的环境形式,需要环境语法才能获取环境主体。

相关内容