我正在写一本有多个章节的书(如果相关的话,分为不同的部分)。章节是编号的。我想要一种方法将章节名称转换为章节编号,在我的文本中的其他地方。也就是说,我想说“参见第 4 章,其中深入介绍了魔法”。负责深入介绍魔法的章节可能会在编辑过程中发生变化:我希望章节编号随之自动更改。我不想只引用名称。我正在使用 LaTeX 的章节自动编号功能。这可能吗?
\documentclass[12pt,a4paper]{book}
\usepackage[latin1]{inputenc}
\begin{document}
\chapter{Sample 1}
This is covered in more detail in Chapter X.
\chapter{Sample 2}
\end{document}
答案1
LaTeX 提供了这种现成的交叉引用方案。将其放在\label{<label>}
可以引用的计数器(如章节、节、小节、定理等)后面,并在其他地方使用它\ref{<label>}
。这将仅返回计数器编号,而不会返回任何其他内容:
\documentclass[openany]{book}
\usepackage[paper=a6paper]{geometry}% Just for this example
\usepackage{xparse,nameref}
\NewDocumentCommand{\chapref}{s m}{Chapter~\ref{#2}\IfBooleanF{#1}{ \nameref{#2}}}
\begin{document}
\chapter{Sample 1}\label{ch:first}
This is covered in more detail in \chapref*{ch:second}. Also see~\ref{ch:second}.
\chapter{Sample 2}\label{ch:second}
This is covered in more detail in \chapref{ch:first}. Also see~\ref{ch:first}.
\end{document}
上面的例子\label
在每个 之后设置了 s \chapter
。它们是使用 引用的\ref{<label>}
,这显然只是返回章节编号。然而,加上nameref
我们也可以抓住章节标题,将其引用为。和 的\nameref{<label>}
组合包含在我定义为 的内容中,这转化为。 后者取决于您是否使用/不使用星号。\ref
\nameref
\chapref
Chapter~\ref{<label>} \nameref{<label>}
\nameref
\chapref
*
上述示例可以通过以下方式实现完整功能:hyperref
,提供文档间超链接。
该选项[openany]
只是为了使这两个章节适合放在后续页面,而不需要在您的文档中。
答案2
作为 Werner 代码的替代方案,您还可以使用其中一个软件包来自动设置此功能。fancyref
和cleveref
是我想到的两个。例如:
\documentclass[openany]{book}
\usepackage[paper=a6paper]{geometry}% Just for this example
\usepackage{fancyref}
\begin{document}
\chapter{Sample 1}\label{chap:first}
This is covered in more detail in \fref{chap:second}. Also see~\ref{chap:second}. \Fref{chap:second} covers this in excruciating detail.
\chapter{Sample 2}\label{chap:second}
This is covered in more detail in \fref{chap:first}. Also see~\ref{chap:first}. \Fref{chap:first} covers this in more detail.
\end{document}
请注意,如果标签中使用了前缀,chapter
则会自动添加,并且会产生大写和非大写的输出。(我相信这可以进一步自动化,但我自己没有用过它。)chap
\Fref
\fref
cleveref