LaTeX 中的反向引用

LaTeX 中的反向引用

可能重复:
标题中显示的表格/图形的使用

除了 bibtex 之外,还有什么方法可以进行反向引用,以便使用类似\backrefLaTeX 的东西来显示对某个项目的引用在哪里?例如:

...
\begin{enumerate}
\item \label{1} Something. Referenced by [\backref].
\item \label{2} Something else. Referencing [\ref{1}].
\end{enumerate}
...

输出如下内容:

  1. 某事。参考[2]。
  2. 其他内容。参考[1]。

嗯,这对于家谱文本很有用,其中每一项代表一个家庭,每个子项代表一个人。当一个人结婚时,我可以参考他/她来自哪个家庭,但看看他/她属于哪个家庭也会很有用。也许举个例子会有所帮助 ; ) :

\begin{enumerate}

\item \label{f:1} John and Mary had:
    \begin{enumerate}
        \item \label{p:1} James
    \end{enumerate}

\item \label{f:2} Bruce and Alina had:
    \begin{enumerate}
        \item \label{p:2} Elisabeth
    \end{enumerate}

\item \label{f:3} James [\ref{p:1}] and Elisabeth [\ref{p:2}] married.

\end{enumerate}

\backref将使我能够展示詹姆斯和伊丽莎白是否结婚了。

答案1

您可以通过修补现有\ref命令来记住调用它的上下文。即使\ref在同一标签上多次调用此新版本,它也能正常工作,生成一个以逗号分隔的数字列表(无空格)。它有一些限制;例如,无论它们属于哪种标签(枚举、部分等),列表都会生成看起来相同的数字。我认为可以添加某种钩子来\backref处理列表并改善这种情况,但除非您说需要,否则我不会这样做。

这不适用于hyperref,对此我深表歉意。如果您需要,我会解开它的谜团。

这是一份完整的文档;您应该将其中的所有内容复制\documentclass{article}\begin{document}您的序言中。

\documentclass{article}
\usepackage{etoolbox}

\makeatletter

\def\@newbackl@bel#1#2#3{%
 \@ifundefined{#1@#2}%
  {\global\@namedef{#1@#2}{#3}}
  {\cs@g@appendpair{#1@#2}{#3}}%
}
% #1 and #2 are each of the form {a}{b}, and the a and b groups are to be concatenated independently.
\def\cs@g@appendpair#1#2{{%
 \edef\first{\csname #1\endcsname}%
 \csxdef{#1}%
  {{\expandafter\@firstoftwo\first,\@firstoftwo#2}%
   {\expandafter\@secondoftwo\first,\@secondoftwo#2}}%
}}

% Patching into the existing commands
\def\newbacklabel{\@newbackl@bel B}
\let\backlabel=\label
\patchcmd\backlabel{\newlabel}{\newbacklabel}{}{}
\let\backref=\ref
\patchcmd\backref{r@#1}{B@#1}{}{}
\let\pagebackref=\pageref
\patchcmd\pagebackref{r@#1}{B@#1}{}{}
\pretocmd\ref{\backlabel{#1}}{}{}

\makeatother

\begin{document}
\begin{enumerate}
 \item \label{e:1} Part 1, referenced by part(s) \backref{e:1} on page(s) \pagebackref{e:1}.
 \item \label{e:2} Part 2, referencing part \ref{e:1}
 \item \label{e:3} Part 3, referencing part \ref{e:1}.
\end{enumerate}
\newpage
\section{A section}
\label{s:1}
Here is another reference to part \ref{e:1}.

\end{document}

相关内容