caption 包与 threeparttablex 包不兼容?

caption 包与 threeparttablex 包不兼容?

我正在尝试完成这样的事情: 表格中的脚注带有超链接

除了使用 caption 包之外,我还需要它来做其他事情。这两种方法似乎不能很好地结合在一起,我似乎无法弄清楚如何解决这个问题。我收到的警告如下:

包标题警告:输入第 32 行时\label没有适当的内容\caption。请参阅标题包文档以获取解释。

并且引用没有解析(我得到了可怕的 ?? 代替它们)。如果我尝试在条目之前添加一个,\caption它基本上只是尝试在我的标题字体中向同一张表添加多个标题。\label\tnotex

\documentclass[letterpaper]{article}

% This package allows for footnoting within tables
\usepackage{enumitem,booktabs,cfr-lm}
\usepackage{tabularx}
\usepackage[referable]{threeparttablex}
\renewlist{tablenotes}{enumerate}{1}
\makeatletter
\setlist[tablenotes]{label=\tnote{\alph*}, ref=\alph*, itemsep=\z@, topsep=\z@skip, partopsep=\z@skip,parsep=\z@,itemindent=\z@,labelindent=\tabcolsep,labelsep=.2em,leftmargin=*,align=left,before={\footnotesize}}
\makeatother

\usepackage{caption}

\begin{document}

\begin{table}[ht]       
    \centering            
    \begin{threeparttable}  
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3\tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}      
    \end{threeparttable}
    \caption{A table caption.}
\end{table}% 

\end{document}

无需 caption 包即可正常工作,但我使用它来设置文档中的标题字体和颜色。有人知道解决方法吗?

答案1

包裹三部分表负载三部分表并且当然可以使用,从其他答案(包括从问题链接的答案)可以清楚地看出,定制tablenotes用于tabular等的标准环境,并且不限于longtable如另一个答案中所建议的那样使用。

事实上,你提供的代码对我来说运行良好,只需要进行一些小改动。你正在重新定义tablenotes以启用自动的枚举,然后用硬编码标签覆盖它。这没有意义。如果您想要使用不推荐的、不是最佳实践的阿拉伯数字作为标记,只需适当更改自定义即可tablenotes

\setlist[tablenotes]{label=\tnote{\arabic*}, ref=\arabic*, itemsep=0pt, topsep=0pt, partopsep=0pt ,parsep=0pt, itemindent=0pt, labelindent=\tabcolsep, labelsep=.2em, leftmargin=*, align=left, before={\footnotesize}}

然后写

    \begin{tablenotes}
      \item This is the first note.
      \item \label{tn:2} This is the hyperlinked note.
    \end{tablenotes}

如果您喜欢写作等,那么首先\item[1]不要重新定义环境。tablenotes

通过这些更改和添加\usepackage{hyperref},超链接注释对我来说可以正常工作:

超链接表注

完整代码:

\documentclass[letterpaper]{article}
\usepackage{enumitem,cfr-lm}% you aren't using booktabs
\usepackage{tabularx}
\usepackage[referable]{threeparttablex}
\renewlist{tablenotes}{enumerate}{1}
\setlist[tablenotes]{label=\tnote{\arabic*}, ref=\arabic*, itemsep=0pt, topsep=0pt, partopsep=0pt ,parsep=0pt, itemindent=0pt, labelindent=\tabcolsep, labelsep=.2em, leftmargin=*, align=left, before={\footnotesize}}

\usepackage{hyperref}
\usepackage{caption}

\begin{document}
\begin{table}[ht]
  \centering
  \begin{threeparttable}
    \begin{tabular}{|l|c|c|}
      \hline
      A & 1 & 2 \tnote{1} \\
      \hline
      B & 2 & 1 \\
      \hline
      C & 3\tnotex{tn:2} & 3 \\
      \hline
      Line & producing & space. \\
      \hline
    \end{tabular}
    \begin{tablenotes}
      \item This is the first note.
      \item \label{tn:2} This is the hyperlinked note.
    \end{tablenotes}
  \end{threeparttable}
  \caption{A table caption.}
\end{table}
\end{document}

答案2

首先,这是不是captionthreeparttablex软件包之间不兼容。caption软件包只提示这里出了问题,并且它对此是正确的。

\item但是让我们首先从 LaTeX2e 本身提供的默认实现开始:

\def\@item[#1]{%
  ...
  \if@noitemarg
    \@noitemargfalse
    \if@nmbrlist
      \refstepcounter\@listctr
    \fi
  \fi
  ...}

正如这里所见,如果列表已编号且未使用可选参数,则\item只会生成引用(稍后可以使用)。因此,\ļabel\item\item[2]不是生成一个可供\label和使用的引用\ref。(这似乎是 Leslie Lamport 做出的设计决定。)

示例文档:

\documentclass{article}

\begin{document}

\ref{item1} \ref{item2}

\begin{enumerate}
\item \label{item1} Text
\item[2] \label{item2} Text
\end{enumerate}

\end{document}

两者\ref都会在这里输出1(而不是12),因为只有\item没有可选参数的才会生成引用,所以两者实际上都使用了由没有可选参数\label创建的相同引用。\item

threeparttablex包重新定义\itemtablenotes仅在内部),因此\item[2]将产生引用(通过定义\@currentlabel):[1]

\renewcommand\tablenotes{%
  \let\TPTL@item=\item
  \renewcommand\item[1][]{\TPTL@item[##1]%
    \phantomsection\protected@edef\@currentlabel{##1}}
  ...}

示例文档:

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\begin{document}

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

结果很好,\tnotex{tn:2}并将产生2预期的结果。(注意:可以在此处添加包的使用caption而不会出现问题。)

\renewlist{tablenotes}现在我们将添加该包提供的用法enumitem

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\usepackage{enumitem}
\renewlist{tablenotes}{enumerate}{1}

\begin{document}

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

哎呀,2现在已经消失了。发生了什么事?

好吧,\renewlist{tablenotes}{enumerate}{1}重新定义tablenotes环境以使用普通enumerate环境。正如我们从上面所知,\item[2]普通enumerate环境中根本不会生成引用以供使用,因此这消除了实际生成引用\label所提供的功能。因此现在将选择由生成引用的最后一个命令生成的引用。但是没有,所以输出只是空的。添加一个演示了这一点:threeparttablex\item[xxx]\label{tn:2}\section

\documentclass[letterpaper]{article}
\usepackage[referable]{threeparttablex}

\usepackage{enumitem}
\renewlist{tablenotes}{enumerate}{1}

\begin{document}

\section{Test}  % <= This line added

\begin{table}[ht]
    \centering
    \begin{threeparttable}
        \begin{tabular}{|l|c|c|}
            \hline
            A & 1 & 2 \tnote{1} \\
            \hline
            B & 2 & 1 \\
            \hline
            C & 3 \tnotex{tn:2} & 3 \\
            \hline
            Line & producing & space. \\
            \hline
        \end{tabular}
        \begin{tablenotes}
            \item[1] This is the first note.
            \item[2] \label{tn:2} This is the hyperlinked note.
        \end{tablenotes}
    \end{threeparttable}
    \caption{A table caption.}
\end{table}

\end{document}

现在\tnotex{tn:2}将产生一个1(而不是预期的2),因为\label{tn:2}(仍然)不是指向\item[2]而是指向(第一个)部分。

但是为什么 cfr 提供的示例文档会给出正确的输出?因为它\item不使用可选参数,而正如我们从上面所知,这将始终产生正确的引用。

现在是故事的最后一部分:这个caption包裹与这一切有什么关系?

好吧,该caption包有一个功能,可以检测在、等\label内没有适当的引用。由于这正是这里的问题,因此此功能将会出现。figuretablethreeparttable

但是:我承认,软件包提供的警告信息的内容caption在这里具有误导性。我选择文本“\label 没有正确的 \caption”,因为\label没有前导\caption通常是这里的问题。在下一个版本中,我将将其更改为技术上更正确的文本“\label 没有正确的引用”。

[1] 这是软件包中已记录的功能threeparttablex:“通过使用软件包选项 »referable«,我们将更改一些 threeparttable 内部结构,以便 (a) 由 \item[...] 发出的手动指定的注释标记是可引用的,并且...”(摘自文档threeparttablex,截至 2014 年 5 月 22 日)

答案3

我的解决方法可能不是您想要的,但对于带有脚注的表格,我认为使用环境tabularx并将脚注放在p指定表格宽度的最终列中是一个很好的解决方案。我还建议使用内联枚举作为脚注以使用整个表格宽度。宏\tabref用于自定义引用的外观。把它们放在一起:

\documentclass[letterpaper]{article}

\usepackage[inline]{enumitem}
\usepackage{booktabs,cfr-lm,tabularx,ragged2e}
\usepackage{caption,hyperref}
\captionsetup[table]{position=top,aboveskip=6pt}

\newcommand*{\tabref}[1]{\textsuperscript{\ref{#1}}}

\begin{document}

\begin{table}[ht]
  \centering
  \captionbox{A table caption made somewhat longer to see the
    effect\label{tab:example}}{%
    \begin{tabularx}{0.5\textwidth}{@{}c>{\hfil}X<{\hfil}c@{}}
      \toprule
      Line & producing & space \\
      \midrule
      A & 1 & 2\tabref{tn:1} \\
      B & 2 & 1 \\
      C & 3\tabref{tn:2} & 3 \\
      \bottomrule
      \multicolumn{3}{@{}p{0.5\textwidth}@{}}{\RaggedRight
        \begin{enumerate*}
        \item  This is the first note.\label{tn:1}
        \item  This is the hyperlinked note\label{tn:2}.
        \end{enumerate*}%
      }%
    \end{tabularx}%
  }%
\end{table}

\end{document}

在此处输入图片描述

相关内容