pacote de legenda não é compatível com pacote threeparttablex?

pacote de legenda não é compatível com pacote threeparttablex?

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: \labelsem o devido \captionna 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 \captionanterior às \labelentradas \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 tablenotesambiente padrão para uso com tabularetc. e não está limitado ao uso com longtableconforme 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 tablenotespara 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 tablenotesforma 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 tablenotesambiente em primeiro lugar.

Com essas alterações e a adição de \usepackage{hyperref}, a nota com hiperlink funciona bem para mim:

nota de tabela com hiperlink

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 captionum threeparttablexpacote. O captionpacote 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, \itemsó produzirá uma referência (que poderá ser usada \ļabelposteriormente) se a lista for numerada e \itemtiver sido usada sem argumento opcional. Então \item[2]especialmentenãogerar uma referência que pode ser usada por \labele \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 \refserão gerados 1aqui (e não 1and 2) porque apenas o \itemargumento sem opcional está gerando uma referência, então ambos \labelestão realmente usando a mesma referência criada pelo \itemargumento sem opcional.

O threeparttablexpacote redefine \item( tablenotesapenas 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 2resultado esperado. (Nota: Pode-se adicionar o uso do captionpacote aqui sem problemas.)

Agora adicionaremos o uso \renewlist{tablenotes}oferecido pelo enumitempacote:

\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 2se foi agora. O que aconteceu?

Bem, ele \renewlist{tablenotes}{enumerate}{1}redefine o tablenotesambiente para usar um enumerateambiente comum. E como sabemos acima, \item[2]dentro de um ambiente comum não irá gerar nenhuma enumeratereferê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:\labelthreeparttablex\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 \itemsem argumento opcional, e como sabemos acima, isso sempre produzirá referências adequadas.

Agora a última parte da história: o que o captionpacote tem a ver com tudo isso?

Bem, o captionpacote possui um recurso que detecta \labelsem a devida referência dentro de figure, table, threeparttableetc. E como esse é exatamente o problema aqui, esse recurso irá ocorrer.

MAS: Confesso que o conteúdo da mensagem de aviso oferecida pelo captionpacote é enganoso aqui. Eu escolho o texto "\label sem \caption adequado", já que \labelsem o início \captiongeralmente é 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 threeparttablexpacote: "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 threeparttablexdocumentaçã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 tabularxambiente e colocar a nota de rodapé em uma pcoluna 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}

insira a descrição da imagem aqui

informação relacionada