我正在尝试完成这样的事情: 表格中的脚注带有超链接
除了使用 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
首先,这是不是caption
和threeparttablex
软件包之间不兼容。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
(而不是1
和2
),因为只有\item
没有可选参数的才会生成引用,所以两者实际上都使用了由没有可选参数\label
创建的相同引用。\item
该threeparttablex
包重新定义\item
(tablenotes
仅在内部),因此\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
内没有适当的引用。由于这正是这里的问题,因此此功能将会出现。figure
table
threeparttable
但是:我承认,软件包提供的警告信息的内容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}