使用表的名称(而非编号)将表链接回参考

使用表的名称(而非编号)将表链接回参考

我正在尝试在表格/图片和我手动创建的所有表格/图片列表之间创建双向链接。即,表格列表中的每个项目都应链接到一个表格,单击表格标题应链接回参考资料。

当链接表格/图形时,我想使用表格/图形名称,而不是其编号,因为这样是可能的\namref

我发现了一个使用时有效的解决方案\ref,但当我尝试\nameref在超链接内插入时,它不再起作用。我尝试\phantomsection在表格标签前插入并使用 删除链接\nameref*以避免链接之间发生冲突,但这没有帮助。我还尝试了其他各种链接设置,例如使用cleverref,但尚未成功。

因此,以下代码不起作用,但如果我将其替换\nameref\ref,它就会起作用。但我希望引用中的表名称(无需手动输入,因为我有数百个表),而不是表号。

\documentclass{article}
\usepackage{hyperref}

\newcommand{\mylabel}[2]{%
  \hyperlink{back:#1}{\hypertarget{#1}{#2}}
}
\newcommand{\myref}[2]{%
  \hyperlink{#1}{\hypertarget{back:#1}{#2}}
}

\begin{document}

\begin{enumerate}
    \item \myref{link}{\nameref{testtab}}
\end{enumerate}

\newpage

\begin{table}
\caption{\mylabel{link}{My Table}}\label{testtab}
\centering
\begin{tabular}[t]{rr}
\toprule
\textbf{Col A} & \textbf{Col B} \\
\midrule
1 & A \\
2 & B \\
\end{tabular}
\end{table}
  
\end{document}

奇怪的是\nameref,输出显示两个链接,其中一个在顶部,似乎链接到自身,另一个只能在最右边点击并正确链接到表格(见截图)。

输出链接

我该如何正确设置它?

提前感谢您的任何提示,我是 StackExchange 的新手,对 LaTeX 也比较陌生,因此非常感谢任何支持。

编辑:我想要创建的表格/图形列表需要高度可定制(包含链接和非链接条目、多个深度、分成多个部分、包含表格和图形),这\listoftables似乎不是解决问题的替代方法

答案1

我建议使用\listoftables\listoffigures。在这种情况下,您可以修补\contentsline以添加额外的超级目标并修补\caption以使用此额外的超级目标:

\documentclass{article}
\usepackage{caption}% To support \caption above tabular.
\usepackage{booktabs}
\usepackage{lipsum}% Dummy text for the example.
\usepackage{hyperref}

\makeatletter
\AtBeginDocument{%
% 1. Patch \contentsline to automatically add a hyper target to the LoT entry
%    and the LoF entry.
  \addtocontents{lot}{%
    \string\let\string\normalcontentsline\string\contentsline
    \string\let\string\contentsline\string\backrefcontentsline
  }%
  \addtocontents{lof}{%
    \string\let\string\normalcontentsline\string\contentsline
    \string\let\string\contentsline\string\backrefcontentsline
  }%
  \newcommand{\backrefcontentsline}[4]{%
    \hypertarget{back.#4}{\normalcontentsline{#1}{#2}{#3}{#4}}%
  }%
% 2. Patch \caption to automatically link to the hyper target of the LoT/LoF entry.
  \NewCommandCopy\Caption\caption
  \RenewDocumentCommand\caption{O{#2}m}{%
    \Caption[{#1}]{\hyperlink{back.\@currentHref}{#2}}
  }%
}
\makeatother

\begin{document}

\listoftables
\listoffigures

\newpage

\begin{table}
  \show\caption
\caption{My Table}\label{testtab}
\centering
\begin{tabular}{rr}
\toprule
\textbf{Col A} & \textbf{Col B} \\
\midrule
1 & A \\
2 & B \\
\end{tabular}
\end{table}

\begin{figure}
  \centering
  \rule{1cm}{1cm}
  \caption{My figure}
\end{figure}

\lipsum

\begin{table}
  \centering
  \caption{One more Table}
  \begin{tabular}{lr}
    left & right
  \end{tabular}
\end{table}

\end{document}

注意:无论是否带有软件包,此补丁都可以工作caption

但为了真正没有从标题到内容的链接,\listoffigures\listoftables只有一个专门的参考,我会定义新的命令:

\documentclass{article}
\usepackage{hyperref}

\NewDocumentCommand\captionbacktonameref{O{#2}mm}{%
  \caption[{#1}]{\hyperlink{nameback:#3}{#2}}\label{#3}%
}
\newcommand*\namerefwithbackref[1]{%
  \hypertarget{nameback:#1}{\nameref{#1}}%
}

\begin{document}
See \namerefwithbackref{tab:test} (the link
anchor from the table would is here).

See also (without back-ref) \nameref{fig:test}.

\newpage

\begin{table}
  \centering
  \begin{tabular}{lr}
    left & right
  \end{tabular}
  \captionbacktonameref{Test Table}{tab:test}
\end{table}

\begin{figure}
  \centering
  \rule{1cm}{1cm}
  \captionbacktonameref{Test Figure}{fig:test}
\end{figure}

\clearpage

See \namerefwithbackref{fig:test} (the link
anchor from the figure is here).

See also \nameref{tab:test}.

\end{document}

因此,现在您可以决定使用\caption不链接回任何参考文献或\captiontobackref(链接回一个)\namerefwithbackref。您还可以决定在标题中使用 或 来将链接的锚点放在哪里,\namerefwithbackref或者仍然使用\nameref

这也可以扩展为支持来自/到号码而不是名称的反向链接:

\documentclass{article}
\usepackage{hyperref}

\NewDocumentCommand\captionbacktonameref{O{#2}mm}{%
  \caption[{#1}]{\hyperlink{nameback:#3}{#2}}\label{#3}%
}
\makeatletter
\NewDocumentCommand\captionbacktorefs{O{#2}mm}{%
  \expandafter\let\expandafter\orig@fnum\csname fnum@\@captype\endcsname
  \@namedef{fnum@\@captype}{%
    \hyperlink{numback:#3}{\orig@fnum}%
  }%
  \caption[{#1}]{\hyperlink{nameback:#3}{#2}}\label{#3}%
}
\makeatother
\newcommand*\namerefwithbackref[1]{%
  \hypertarget{nameback:#1}{\nameref{#1}}%
}
\newcommand*\refwithbackref[1]{%
  \hypertarget{numback:#1}{\ref{#1}}%
}

\begin{document}
See \namerefwithbackref{tab:test} (the link
anchor from the table would is here).

See also Figure \refwithbackref{fig:test} (the link anchor from the figure number is
here) \nameref{fig:test} (the name isn't an anchor).

\newpage

\begin{table}
  \centering
  \begin{tabular}{lr}
    left & right
  \end{tabular}
  \captionbacktonameref{Test Table}{tab:test}
\end{table}

\begin{figure}
  \centering
  \rule{1cm}{1cm}
  \captionbacktorefs{Test Figure}{fig:test}
\end{figure}

\clearpage

See Figure \ref{fig:test} (the number isn't an anchor)
  \namerefwithbackref{fig:test} (the link anchor from the figure is here).

See also \nameref{tab:test}.

\end{document}

注意:您需要将\namerefwithbackref和设为不同的目标\refwithbackref。这就是为什么\captionwithbackrefs使用数字的附加链接并\refwithbackref使用numback:前缀而不是的原因nameback:

相关内容