前后交叉引用

前后交叉引用

我将尝试尽可能清楚地描述我的问题。首先是一个可行的示例。

\documentclass[french,11pt]{article}

\usepackage[french]{babel}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
 \usepackage{kpfonts}
 \usepackage{geometry}
 \geometry{ a4paper, total={170mm,257mm}, left=20mm, top=20mm}
 \usepackage{blindtext}

\setlength{\parskip}{1.2ex} \setlength{\parindent}{0em} \clubpenalty = 10000 \widowpenalty = 10000

 \usepackage{graphicx,bm,url, amsfonts, latexsym, verbatim, xspace, setspace,mathrsfs,marvosym,wasysym,amsmath, amssymb}
 \usepackage{caption}
 \usepackage[caption=false]{subfig}
 \usepackage{epstopdf}

\usepackage[colorlinks=true, linkcolor=red, urlcolor=blue, pdftitle={article}, pdfauthor={DSA}]{hyperref} 

\usepackage{authblk}

\begin{document}

\title{BlaBlaBla} \author[,1]{Dimitrios\thanks{\texttt{\url{[email protected]}}}} %

\date{}

\clearpage\maketitle \thispagestyle{empty}

\begin{itemize}
\item \blindtext 

See reference \ref{foo3}.
\item \blindtext

See reference \ref{foo1}.

\item \blindtext 

See reference \ref{foo2}. 
\end{itemize}

\newpage

\blindtext

\begin{enumerate}
\item\label{foo1} \textbf{The foo1 reference}
\item\label{foo2} \blindtext 

\textbf{The foo2 reference}

\item\label{foo3} \textbf{The foo3 reference}.
\end{enumerate}


\end{document} 

当我点击链接时,我会转到相关的参考资料。我想要实现的是,通过点击参考资料旁边的小三角形或垂直向上的箭头,向后移动到链接所在的文本。也就是说,就像维基百科文章的来回效果(见下图)。

在此处输入图片描述

答案1

这是一个etoolbox基于 backref-able 的实现\ref

用于\backrefref{<label>}创建可以链接回的 的\ref链接。用于设置标签并输出反向引用标记。请注意,应在锚点附加处直接调用。否则,您可能会得到错误的链接目标。<label>\backreflabel{<label>}\backreflabel<label>

该解决方案通过将信息写入.aux文件来工作,因此可能需要至少两次 LaTeX 运行。

\documentclass[french,11pt]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{blindtext}

\usepackage{etoolbox}

\usepackage[colorlinks]{hyperref}

\newcommand*{\backrefmarker}{$\uparrow$}
\newcommand*{\backrefmultformat}{\textsuperscript}

\makeatletter
\newcommand*{\br@currlabels}{}
\newcommand*{\br@linklabels}{}

\newcommand*{\backrefref}[1]{%
  \listgadd{\br@currlabels}{#1}%
  \ifltxcounter{br@curr@#1}
    {}
    {\newcounter{br@curr@#1}
     \csgdef{thebr@curr@#1}{\alph{br@curr@#1}}}%
  {\refstepcounter{br@curr@#1}%
   \label{br@#1@\the\value{br@curr@#1}}}%
  \ref{#1}}


\newcommand*{\backreflabel}[1]{%
  \label{#1}%
  \backreflabel@display{#1}}

\newcommand*{\backreflabel@display}[1]{%
  \ifltxcounter{br@link@#1}
    {\ifnumequal{\value{br@link@#1}}{1}
       {\hyperref[br@#1@1]{\backrefmarker}}
       {\ifnumgreater{\value{br@link@#1}}{1}
          {\backrefmarker
           \backrefmultformat{\backreflabel@display@loop{#1}}}
          {\textbf{??}}}}
    {\textbf{??}}}

\newcounter{br@label@loop}

\newcommand*{\backreflabel@display@loop}[1]{%
  \setcounter{br@label@loop}{0}%
  \whileboolexpr{test {\ifnumless{\value{br@label@loop}}{\value{br@link@#1}}}}
    {\stepcounter{br@label@loop}%
     \ref{br@#1@\the\value{br@label@loop}}}}


\newcommand*{\br@aux@readlabel}[2]{%
  \ifinlist{#1}{\br@linklabels}
    {}
    {\listgadd{\br@linklabels}{#1}}%
  \ifltxcounter{br@link@#1}
    {}
    {\newcounter{br@link@#1}}%
  \setcounter{br@link@#1}{#2}}

\newcommand*{\br@writelabel}[1]{%
  \ifltxcounter{br@link@#1}
    {\ifnumequal{\value{br@curr@#1}}{\value{br@link@#1}}
       {}
       {\@latex@warning@no@line{%
          Label(s) may have changed.
          Rerun to get cross-references right}}}
    {\@latex@warning@no@line{%
       Label(s) may have changed.
       Rerun to get cross-references right}}%
  \immediate\write\@mainaux{\string\br@aux@readlabel{#1}{\the\value{br@curr@#1}}}}

\AtEndDocument{%
  \forlistloop{\br@writelabel}{\br@currlabels}}
\makeatother

\begin{document}

\begin{itemize}
\item \blindtext

See reference \backrefref{foo3}.
\item \blindtext

See reference \backrefref{foo1}.

\item \blindtext

See reference \backrefref{foo2}.
\end{itemize}

\clearpage

\blindtext

\begin{enumerate}
\item\backreflabel{foo1} \textbf{The foo1 reference}
\item\backreflabel{foo2} \blindtext

\textbf{The foo2 reference}

\item\backreflabel{foo3} \textbf{The foo3 reference}.
\end{enumerate}

\clearpage

See reference \backrefref{foo1}.
See reference \backrefref{foo2}.

\clearpage

See reference \backrefref{foo2}.
\end{document}

类似维基百科的 <code>\ref</code>--<code>\label</code> 反向引用

答案2

这更像是一个扩展的评论,而不是真正的答案。

我同意之前的评论,使用 backref 包或更准确地说,在加载时 backref传递给的选项可以轻松实现这一点。但将其扩展到而不仅仅是扩展到可能会很有趣。hyperref\label\cite。在我回答这个问题时所有标题与相应的目录条目反向链接 我提供了一个可以作为起点的解决方案。

但这引发了一个歧义问题:对标签的引用是唯一的,但反方向却不是,因为您可以多次引用单个标签。

此外,在创建标签时并不知道未来的引用,即使您决定通过选择反向链接到最后一个(或第一个)引用来解决歧义问题,您也必须将其写入.aux文件并在下次编译时读回,这会变得更加复杂。

如果您确实需要,并且给我留几天时间,我可以将上面引用的解决方案扩展到标签。

顺便说一下,所请求的功能在几个流行的 pdf 查看器中是开箱即用的,因为它们可以保留浏览历史记录,从而消除歧义问题。

相关内容