我想导出文档中所有内部参考文献的页码。如何实现?同样,我们如何导出所有内部参考文献的章节号?
对于参考书目的外部引用(我使用 bibtex),使用该\backref
命令创建一个.brf
包含此信息的文件。
编辑:\label
所谓内部引用,是指对 定义并引用的 标签的引用\ref
。例如,考虑以下最小示例:
\documentclass{article}
\begin{document}
\section{One}
Here\label{here}
\newpage
\section{Two}
\newpage
\section{Three}
Here is \ref{here}.
\end{document}
我想检索从第 3 页(第 3 节)到第 1 页(第 1 节)的内部引用。
答案1
这不是一个完整的解决方案,因为我不清楚您想如何实际使用收集到的信息,但它应该为您提供一些如何获取它的起点。
\documentclass{article}
\makeatletter
\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}%
% addition
\protected@write\@auxout{}%
{\string\usedlabel{#1}{\thepage}}}
\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname
\@secondoftwo{#1}%
% addition
\protected@write\@auxout{}%
{\string\usedpagelabel{#1}{\thepage}}}
\def\usedlabel#1#2{\typeout{ref #1 on page #2}}
\def\usedpagelabel#1#2{\typeout{pageref #1 on page #2}}
\makeatother
\begin{document}
\section{A}\label{A}
text\label{B} see section~\ref{A}
\newpage
text referencing page~\pageref{B} in section~\ref{A}
\end{document}
本质上,这发生了变化\ref
,并在文件中做了如下\pageref
记录:.aux
\usedlabel{A}{1}
\usedpagelabel{B}{2}
我定义了这些命令来执行输出,但一切皆有可能。请注意,aux 文件被读入两次,一次在开头,一次在结尾,因此需要进一步的工作。另外,这种简单的方法不适用于以\ref
某种方式修改的任何包。
从上述结果可以看出:
ref A on page 1
pageref B on page 2
ref A on page 2
在屏幕上和日志中。
更新
我忘了说,修补\ref
当然只有在不使用修改此命令的软件包的情况下才有效。因此,一个破坏此规则的例子是软件包hyperref
,出于充分的理由,它提供了自己的(完全不同的)实现\ref
,因此上述修改根本就不会被使用。
快速查看hyperref
代码,最有可能被挂钩的候选者似乎是\T@ref
但我没有进行详尽的检查,这可能不是最好的方法(并且它可能不适用于 hyperref 提供的所有选项)。无论如何,对我来说它是有效的:
\usepackage{hyperref}
\makeatletter
\AtBeginDocument{%
\def\T@ref#1{%
\protected@write\@auxout{}{\string\usedlabel{#1}{\thepage}}%
\Hy@safe@activestrue
\expandafter\@setref\csname r@#1\endcsname\@firstoffive{#1}%
\Hy@safe@activesfalse
}%
\def\T@pageref#1{%
\protected@write\@auxout{}{\string\usedpagelabel{#1}{\thepage}}
\Hy@safe@activestrue
\expandafter\@setref\csname r@#1\endcsname\@secondoffive{#1}%
\Hy@safe@activesfalse
}%
}