Estoy tratando de lograr algo como esto: nota al pie en la tabla con hipervínculos
Excepto usar el paquete de subtítulos junto con él, que necesito para otras cosas. Los dos enfoques no parecen encajar bien y parece que no puedo encontrar la manera de evitarlo. La advertencia que recibo es la siguiente:
Título del paquete Advertencia:
\label
sin el título adecuado\caption
en la línea de entrada 32. Consulte la documentación del paquete de títulos para obtener una explicación.
Y las referencias no se resuelven (me sale el temido ?? en su lugar). Si intento agregar un \caption
anterior a las \label
entradas \tnotex
, básicamente simplemente intenta agregar varios títulos a la misma tabla en la fuente de mis títulos.
\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 bien sin el paquete de subtítulos, pero lo uso para configurar fuentes y colores de subtítulos en mi documento. ¿Alguien conoce una solución alternativa?
Respuesta1
El paquetemesa de tres partesxcargasmesa de tres partesy ciertamente se puede usar, como se desprende de otras respuestas, incluida la vinculada a la pregunta, para personalizar el tablenotes
entorno estándar para su uso, tabular
etc. y no se limita a su uso longtable
como se sugiere en otra respuesta.
De hecho, el código que tienes me funciona bien con sólo un par de cambios menores. Estás redefiniendo tablenotes
para habilitarautomáticoenumeración pero luego anulándola con etiquetas codificadas. Esto no tiene sentido. Si desea utilizar como marcadores los números arábigos no recomendados ni las mejores prácticas, simplemente cambie la personalización de tablenotes
forma adecuada.
\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}}
y luego escribir
\begin{tablenotes}
\item This is the first note.
\item \label{tn:2} This is the hyperlinked note.
\end{tablenotes}
Si prefiere escribir, \item[1]
etc., no redefina el tablenotes
entorno en primer lugar.
Con estos cambios y la adición de \usepackage{hyperref}
, la nota con hipervínculo funciona bien para mí:
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}
Respuesta2
En primer lugar, esto esnouna incompatibilidad entre caption
un threeparttablex
paquete. El caption
paquete sólo da una pista de que algo anda mal aquí, y es correcto en esto.
Pero comencemos primero con la implementación predeterminada de \item
, que ofrece el propio LaTeX2e:
\def\@item[#1]{%
...
\if@noitemarg
\@noitemargfalse
\if@nmbrlist
\refstepcounter\@listctr
\fi
\fi
...}
Como se puede ver aquí, \item
solo producirá una referencia (que podrá usarse \ļabel
más adelante) si la lista está numerada y \item
se usó sin argumento opcional. Entonces especialmente \item[2]
lo haránogenerar una referencia que pueda ser utilizada por \label
y \ref
. (Esta parece ser una decisión de diseño tomada por Leslie Lamport).
Documento de ejemplo:
\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
saldrán 1
aquí (y no 1
y 2
) porque solo el \item
argumento without opcional genera una referencia, por lo que ambos \label
en realidad están usando la misma referencia creada por el \item
argumento without opcional.
El threeparttablex
paquete se redefine \item
( tablenotes
solo dentro), por lo que \item[2]
producirá una referencia (al definir \@currentlabel
): [1]
\renewcommand\tablenotes{%
\let\TPTL@item=\item
\renewcommand\item[1][]{\TPTL@item[##1]%
\phantomsection\protected@edef\@currentlabel{##1}}
...}
Documento de ejemplo:
\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}
El resultado es bueno y \tnotex{tn:2}
producirá el 2
resultado esperado. (Nota: se puede agregar el uso del caption
paquete aquí sin problemas).
Ahora agregaremos el uso de \renewlist{tablenotes}
ofrecido por el enumitem
paquete:
\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}
Upps, ya 2
no está. ¿Lo que ha sucedido?
Bueno, \renewlist{tablenotes}{enumerate}{1}
redefine el tablenotes
entorno para utilizar enumerate
en su lugar un entorno normal. Y como sabemos desde arriba, \item[2]
dentro de un entorno normal enumerate
no se generará ninguna referencia para su uso \label
, por lo que esto elimina la característica ofrecida por threeparttablex
que \item[xxx]
en realidad generará una referencia. Así que \label{tn:2}
ahora elegiremos la referencia generada por el último comando que generó una. Pero no hay ninguno, por lo que la salida simplemente está vacía. Agregar un \section
demuestra esto:
\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}
Ahora \tnotex{tn:2}
producirá un 1
(en lugar del esperado 2
) porque \label{tn:2}
(todavía) no apunta a la \item[2]
sino a la (primera) sección.
Pero, ¿por qué el documento de ejemplo ofrecido por cfr da el resultado correcto? Porque se utiliza \item
sin argumentos opcionales y, como sabemos desde arriba, esto siempre producirá referencias adecuadas.
Ahora la última parte de la historia: ¿Qué tiene caption
que ver el paquete con todo esto?
Bueno, el caption
paquete tiene una función que detecta \label
sin la referencia adecuada dentro de figure
, table
, threeparttable
etc. Y dado que este es exactamente el problema aquí, esta función aparecerá.
PERO: Confieso que el contenido del mensaje de advertencia que ofrece el caption
paquete es engañoso aquí. Elijo el texto "\label sin \caption adecuado" ya que el problema aquí suele ser un texto \label
sin interlineado . \caption
Lo cambiaré por el texto técnicamente más correcto "\label sin una referencia adecuada" en la próxima versión.
[1] Esta es una característica documentada del threeparttablex
paquete: "Al usar la opción del paquete »referable«, cambiaremos algunas partes internas de tres partes de modo que (a) los marcadores de notas especificados manualmente emitidos por \item[...] sean referenciables, y…” (Tomado de la threeparttablex
documentación, al 22 de mayo de 2014)
Respuesta3
Mi solución probablemente no sea exactamente lo que estaba buscando, pero para tablas con notas al pie, creo que es una buena solución usar un tabularx
entorno y colocar la nota al pie en una p
columna final con el ancho de la tabla especificado. También recomiendo enumeraciones en línea como nota al pie para utilizar todo el ancho de la tabla. La macro \tabref
se utiliza para personalizar la apariencia de las referencias. Poniendo todo junto:
\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}