我想要一个包含不同部分的文档,每个部分都有许多对其他部分的引用,例如
\section{a}
\label{a}
See \nameref{b}
\section{b}
\label{b}
See \nameref{a}
\section{c}
\label{c}
See \nameref{a}
是否可以创建一个函数,或者可能已经有一个我没有找到的模块,来制作类似的东西
\section{b}
\label{b}
See \nameref{a}
\printrefs
结果是这样的:
A
参见 b
已在中引用A(第 n 页)和C(第 m 页)
b
b 已被引用于A(某某页面)
看到
C
看到
...或者类似的东西。
答案1
你可以使用这个mmxref
包来实现这一点(是的,它是为这个答案而写的)。感谢 egreg请提供代码的一个良好起点。
下载mmxref.sty
自这里1并将其放在与文档相同的目录中,或放在您的某个位置TEXINPUTS
(在后一种情况下,您可能必须刷新 TeX 可用文件的数据库:这是手动安装的软件包的通常例程)。mmxref 封装页面包含进一步的使用说明。
然后,您的文档看起来会像这样(我们称之为docu.tex
)。请注意,通常需要进行两次编译才能使所有内容井然有序(与文件中的引用一样.aux
;mmxref
如果需要更多编译,软件包会发出警告)。
\documentclass{report}
\usepackage{mmxref}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
% The default prefix for labels created by mmxref is “mmxref-”. You can easily
% change this prefix:
%\mmxSetLabelPrefix{prefix of your choice (possibly empty)}
\begin{document}
\setlength{\parindent}{0pt}
\setlength{\parskip}{2pt plus 0.5pt minus 0.2pt}
\part{A Great Part}
\mmxlabel{a great part}
Foo bar in the part. All that.
\mmxInsertBackReferences[\emph{This fascinating part was referenced}]{a great
part}
\chapter{The First Chapter}
\mmxlabel{first chapter}
See~\mmxautoref{another section}, \mmxautoref{section in 2nd chapter},
and~\mmxautoref{a subsection}.
\mmxInsertBackReferences{first chapter}
\section{A Section}
\mmxlabel{a section}
% If the preceding \mmxlabel were to be omitted, the backreference generated
% by the following \mmxautoref command would point to the last \mmxlabel
% issued, which corresponds to the first chapter.
Some text. See~\mmxautoref{a great part}.
\section{Another Section}
\mmxlabel{another section}
See~\mmxautoref{first chapter}.
\mmxInsertBackReferences{another section}
\subsection{A Subsection}
\mmxlabel{a subsection}
See~\mmxautoref{another section}, \mmxautoref{a subsection},
and~\mmxautoref{first chapter}.
%\mmxInsertBackReferences[This marvelous place]{a subsection}
\mmxInsertBackReferences{a subsection}
\chapter{The Second Chapter}
\mmxlabel{second chapter}
\mmxInsertBackReferences{second chapter}
\section{A Section In The Second Chapter}
\mmxlabel{section in 2nd chapter} See~\mmxautoref{a subsection},
\mmxautoref{another section} and also \mmxautoref{third chapter}, which starts
on page~\mmxpageref{third chapter}.
\mmxInsertBackReferences{section in 2nd chapter}
\chapter{The Third Chapter}
\mmxlabel{third chapter}
Text in the third chapter.
\section{And Now For Something Completely Different}
\mmxlabel{Something Completely Different}
Let's point to \mmxautoref[third chapter]{second chapter}, but in way that
makes the back-reference be \mmxautoref{third chapter} instead of
\mmxautoref{Something Completely Different}. That's what the optional argument
of \verb|\mmxref| and \verb|\mmxautoref| is for.
\end{document}
您可以重新定义以下命令来更改插入短语的措辞(可能是语言)。例如,您可以在和\mmxref
之间添加以下命令来讲法语:\usepackage{mmxref}
\begin{document}
\usepackage{xparse} % only necessary if you use it for customization
\ExplSyntaxOn
\RenewDocumentCommand \mmxSeparatorBetweenTwo { }
{ ~et~ }
\RenewDocumentCommand \mmxSeparatorBetweenMoreThanTwo { }
{ ,~ }
\RenewDocumentCommand \mmxSeparatorBetweenFinalTwo { }
{ ~et~ }
\RenewDocumentCommand \mmxFormatSimpleRef { m }
{
\str_case:nnF {#1}
{
{ part } { partie }
{ chapter } { chapitre }
{ section } { section }
{ subsection } { section } % intentional: “subsection” is too ugly here
{ subsubsection } { section } % ditto
{ paragraph } { paragraphe }
{ subparagraph } { paragraphe } % ditto
}
{
\msg_error:nnn { mmxref } { main/undefined-ref-format-for-counter } {#1}
}
}
\RenewDocumentCommand \mmxFormatStartOfInsertionPhrase { m }
{
\str_case:nnF {#1}
{
{ part } { Cette~partie~a~été~référencée }
{ chapter } { Ce~chapitre~a~été~référencé }
{ section } { Cette~section~a~été~référencée }
% Intentional: “subsection” is too ugly here
{ subsection } { Cette~section~a~été~référencée }
{ subsubsection } { Cette~section~a~été~référencée } % ditto
{ paragraph } { Ce~paragraphe~a~été~référencé }
{ subparagraph } { Ce~paragraphe~a~été~référencé } % ditto
}
{
\msg_error:nnn { mmxref } { main/undefined-ref-format-for-counter } {#1}
}
}
\tl_new:N \l__myprefix_mmxFormatBackRef_ref_tl
\RenewDocumentCommand \mmxFormatBackRef { m m m m }
{
\tl_set:Nn \l__myprefix_mmxFormatBackRef_ref_tl
{ \mmxref_insert_ref:nn {#4} {#2} }
\str_case:nnF {#1}
{
{ part }
{ à~la~partie \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
{ chapter }
{ au~chapitre \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
{ section }
{ à~la~section \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
% Intentional: “subsection” is too ugly here
{ subsection }
{ à~la~section \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
% Ditto
{ subsubsection }
{ à~la~section \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
{ paragraph }
{ au~paragraphe \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
% Ditto
{ subparagraph }
{ au~paragraphe \nobreakspace \l__myprefix_mmxFormatBackRef_ref_tl
\c_space_tl page \nobreakspace #3 }
}
{
\msg_error:nnn { mmxref } { main/undefined-ref-format-for-counter } {#1}
}
}
\ExplSyntaxOff
这是对上一个docu.tex
文件第 3 页所做的操作(保留英文的部分已输入照原样在 中docu.tex
,这只是一个例子!):
脚注
- 如果你不知道如何下载,请
mmxref.sty
点击mmxref.sty
mmxref 封装页面,然后在生的按钮并使用一些菜单项,例如文件 → 保存在您的 Web 浏览器中。(另一种方法是克隆 Git 存储库,但您需要Git为了那个原因。)