Пакет caption не совместим с пакетом threeparttablex?

Пакет caption не совместим с пакетом threeparttablex?

Я пытаюсь добиться чего-то вроде этого: сноска в таблице с гиперссылками

За исключением использования пакета caption вместе с ним, который мне нужен для других вещей. Эти два подхода, похоже, не очень хорошо сочетаются друг с другом, и я не могу понять, как это обойти. Предупреждение, которое я получаю, следующее:

Предупреждение: \labelбез надлежащего заголовка \captionна входной строке 32. См. документацию по пакету заголовка для получения объяснений.

И ссылки не разрешаются (я получаю ужасные ?? вместо них). Если я пытаюсь добавить \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, но я использую его для настройки шрифтов и цветов caption в моем документе. Кто-нибудь знает обходной путь?

решение1

Пакетthreeparttablexнагрузкитрехчастныйстоли, безусловно, может использоваться, как ясно из других ответов, включая тот, ссылка на который содержится в вопросе, для настройки стандартной 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. (Похоже, это дизайнерское решение, принятое Лесли Лэмпортом.)

Пример документа:

\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 without proper \caption", поскольку a \labelбез лидирующего \captionобычно является проблемой. Я изменю его на более технически правильный текст "\label without a proper reference" в следующей версии.

[1] Это задокументированная функция пакета threeparttablex: «Используя опцию пакета »referable«, мы изменим несколько трехкомпонентных внутренних элементов таблицы таким образом, что (a) вручную указанные маркеры примечаний, выпущенные \item[...], являются реферабельными, и ...» (Взято из документации threeparttablexпо состоянию на 22 мая 2014 г.)

решение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}

введите описание изображения здесь

Связанный контент