Я пытаюсь добиться чего-то вроде этого: сноска в таблице с гиперссылками
За исключением использования пакета 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}