¿El paquete de subtítulos no es compatible con el paquete threeparttablex?

¿El paquete de subtítulos no es compatible con el paquete threeparttablex?

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: \labelsin el título adecuado \captionen 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 \captionanterior a las \labelentradas \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 tablenotesentorno estándar para su uso, tabularetc. y no se limita a su uso longtablecomo 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 tablenotespara 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 tablenotesforma 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 tablenotesentorno en primer lugar.

Con estos cambios y la adición de \usepackage{hyperref}, la nota con hipervínculo funciona bien para mí:

nota de tabla con hipervínculo

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 captionun threeparttablexpaquete. El captionpaquete 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í, \itemsolo producirá una referencia (que podrá usarse \ļabelmás adelante) si la lista está numerada y \itemse usó sin argumento opcional. Entonces especialmente \item[2]lo haránogenerar una referencia que pueda ser utilizada por \labely \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 \refsaldrán 1aquí (y no 1y 2) porque solo el \itemargumento without opcional genera una referencia, por lo que ambos \labelen realidad están usando la misma referencia creada por el \itemargumento without opcional.

El threeparttablexpaquete se redefine \item( tablenotessolo 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 2resultado esperado. (Nota: se puede agregar el uso del captionpaquete aquí sin problemas).

Ahora agregaremos el uso de \renewlist{tablenotes}ofrecido por el enumitempaquete:

\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 2no está. ¿Lo que ha sucedido?

Bueno, \renewlist{tablenotes}{enumerate}{1}redefine el tablenotesentorno para utilizar enumerateen su lugar un entorno normal. Y como sabemos desde arriba, \item[2]dentro de un entorno normal enumerateno se generará ninguna referencia para su uso \label, por lo que esto elimina la característica ofrecida por threeparttablexque \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 \sectiondemuestra 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 \itemsin argumentos opcionales y, como sabemos desde arriba, esto siempre producirá referencias adecuadas.

Ahora la última parte de la historia: ¿Qué tiene captionque ver el paquete con todo esto?

Bueno, el captionpaquete tiene una función que detecta \labelsin la referencia adecuada dentro de figure, table, threeparttableetc. 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 captionpaquete es engañoso aquí. Elijo el texto "\label sin \caption adecuado" ya que el problema aquí suele ser un texto \labelsin interlineado . \captionLo 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 threeparttablexpaquete: "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 threeparttablexdocumentació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 tabularxentorno y colocar la nota al pie en una pcolumna 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 \tabrefse 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}

ingrese la descripción de la imagen aquí

información relacionada