Estou tentando realizar algo assim: nota de rodapé na tabela com hiperlinks
Exceto usar o pacote caption junto com ele, que preciso para outras coisas. As duas abordagens não parecem combinar bem e não consigo descobrir como contornar isso. O aviso que recebo é o seguinte:
Aviso de legenda do pacote:
\label
sem o devido\caption
na linha de entrada 32. Consulte a documentação do pacote de legenda para explicação.
E as referências não resolvem (pego o temido ?? no lugar delas). Se eu tentar adicionar um \caption
anterior às \label
entradas \tnotex
, ele basicamente tentará adicionar várias legendas à mesma tabela na minha fonte de legenda.
\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}
Funciona bem sem o pacote de legendas, mas eu o uso para definir fontes e cores de legendas em meu documento. Alguém conhece uma solução alternativa?
Responder1
O pacotetabela de três partesxcargasmesa de três partese certamente pode ser usado, como fica claro em outras respostas, incluindo aquela vinculada à pergunta, para personalizar o tablenotes
ambiente padrão para uso com tabular
etc. e não está limitado ao uso com longtable
conforme sugerido em outra resposta.
Na verdade, o código que você possui funciona bem para mim, com apenas algumas pequenas alterações. Você está redefinindo tablenotes
para ativarautomáticoenumeração, mas substituindo-a por rótulos codificados. Isso não faz sentido. Se você quiser os algarismos arábicos não recomendados e não recomendados como marcadores, basta alterar a personalização de tablenotes
forma adequada.
\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}}
e depois escreva
\begin{tablenotes}
\item This is the first note.
\item \label{tn:2} This is the hyperlinked note.
\end{tablenotes}
Se você preferir escrever \item[1]
etc., não redefina o tablenotes
ambiente em primeiro lugar.
Com essas alterações e a adição de \usepackage{hyperref}
, a nota com hiperlink funciona bem para mim:
Código completo:
\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}
Responder2
Em primeiro lugar, isto énãouma incompatibilidade entre caption
um threeparttablex
pacote. O caption
pacote apenas dá uma dica de que algo está errado aqui, e está correto quanto a isso.
Mas vamos primeiro começar com a implementação padrão do \item
, oferecida pelo próprio LaTeX2e:
\def\@item[#1]{%
...
\if@noitemarg
\@noitemargfalse
\if@nmbrlist
\refstepcounter\@listctr
\fi
\fi
...}
Como se pode ver aqui, \item
só produzirá uma referência (que poderá ser usada \ļabel
posteriormente) se a lista for numerada e \item
tiver sido usada sem argumento opcional. Então \item[2]
especialmentenãogerar uma referência que pode ser usada por \label
e \ref
. (Esta parece ser uma decisão de design tomada por Leslie Lamport.)
Exemplo de documento:
\documentclass{article}
\begin{document}
\ref{item1} \ref{item2}
\begin{enumerate}
\item \label{item1} Text
\item[2] \label{item2} Text
\end{enumerate}
\end{document}
Ambos \ref
serão gerados 1
aqui (e não 1
and 2
) porque apenas o \item
argumento sem opcional está gerando uma referência, então ambos \label
estão realmente usando a mesma referência criada pelo \item
argumento sem opcional.
O threeparttablex
pacote redefine \item
( tablenotes
apenas dentro), então \item[2]
produzirá uma referência (definindo \@currentlabel
): [1]
\renewcommand\tablenotes{%
\let\TPTL@item=\item
\renewcommand\item[1][]{\TPTL@item[##1]%
\phantomsection\protected@edef\@currentlabel{##1}}
...}
Exemplo de documento:
\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}
O resultado é bom e \tnotex{tn:2}
produzirá o 2
resultado esperado. (Nota: Pode-se adicionar o uso do caption
pacote aqui sem problemas.)
Agora adicionaremos o uso \renewlist{tablenotes}
oferecido pelo enumitem
pacote:
\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}
Ups, isso 2
se foi agora. O que aconteceu?
Bem, ele \renewlist{tablenotes}{enumerate}{1}
redefine o tablenotes
ambiente para usar um enumerate
ambiente comum. E como sabemos acima, \item[2]
dentro de um ambiente comum não irá gerar nenhuma enumerate
referência para uso , então isso elimina o recurso oferecido por que na verdade irá gerar uma referência. Portanto, agora escolheremos a referência gerada pelo último comando que gerou uma. Mas não há nenhum, então a saída está simplesmente vazia. Adicionar um demonstra isso:\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}
Agora \tnotex{tn:2}
produzirá um 1
(em vez do esperado 2
) porque \label{tn:2}
(ainda) não aponta para o, \item[2]
mas para a (primeira) seção.
Mas por que o documento de exemplo oferecido pelo cfr fornece a saída correta? Porque usa \item
sem argumento opcional, e como sabemos acima, isso sempre produzirá referências adequadas.
Agora a última parte da história: o que o caption
pacote tem a ver com tudo isso?
Bem, o caption
pacote possui um recurso que detecta \label
sem a devida referência dentro de figure
, table
, threeparttable
etc. E como esse é exatamente o problema aqui, esse recurso irá ocorrer.
MAS: Confesso que o conteúdo da mensagem de aviso oferecida pelo caption
pacote é enganoso aqui. Eu escolho o texto "\label sem \caption adequado", já que \label
sem o início \caption
geralmente é o problema aqui. Vou alterá-lo para o texto mais tecnicamente correto "\label sem uma referência adequada" na próxima versão.
[1] Este é um recurso documentado do threeparttablex
pacote: "Ao usar a opção de pacote »referable«, alteraremos alguns componentes internos de três partes, de modo que (a) Os marcadores de notas especificados manualmente emitidos por \item[...] sejam referenciáveis, e ..." (Retirado da threeparttablex
documentação, em 22 de maio de 2014)
Responder3
Minha solução alternativa provavelmente não é exatamente o que você estava procurando, mas para tabelas com notas de rodapé, acho uma boa solução usar um tabularx
ambiente e colocar a nota de rodapé em uma p
coluna final com a largura da tabela especificada. Também recomendo enumerações embutidas como nota de rodapé para usar toda a largura da tabela. Macro \tabref
é usada para personalizar a aparência das referências. Juntar as peças:
\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}