专栏名称: LaTeX工作室
欢迎光临分享与学习LaTeX的王国
目录
相关文章推荐
51好读  ›  专栏  ›  LaTeX工作室

LaTeX教程(017)- cleverref 宏包使用全攻略

LaTeX工作室  · 公众号  ·  · 2025-01-10 22:20

正文

LaTeX教程(017)- 文档结构(17)

2.4.2 cleveref 包-索引文本的智能格式化

在前面的内容中我们已经看到,基于索引中使用的计数器, 为索引文本格式化提供了一些轻便的支持。 cleveref 包(作者Toby Cubitt)则为这一功能提供了重量级的支持。并且可以对数字引用和页码引用进行排序,适当地缩小范围。 varioref 包的命令 \vref , \Vref , 以及 \vpageref 均被增强,以支持多个 key 和引用的格式化。所有格式化的内容都在导言区,这使得 cleveref 成为一个全面而强大的方案。

\cref{key-list}
\cref*{key-list}

\Cref{key-list}
\Cref*{key-list}

cleveref 包提供的主要命令是 \cref 。它可以接收一个 key ,就像 \ref 那样。也可以接收多个 key ,这些 key 之间用逗号隔开。它将这些 key 对应的索引文本,根据它们自身的类型进行格式化,例如,在这些索引文本的前面添加前缀,"section","fig"等。也可能会添加一些其他的装饰,例如在公式编号的两边添加一对圆括号。

如果给定一个由多个 key 组成的列表,它会根据需要显示复数形式(例如一个公式显示eq.,多个公式显示eqs.),对于更长的列表,它知道适当地连接。例如,它可以区分哪些是成对的引用,哪些是多个单独的引用,哪些是一个连续的范围,并且可以处理这些组合。

根据以往的经验,读者可能已经想到 \Cref 的作用了。它和 \cref 的不同之处是, \Cref 会判断生成的索引文本是否出现在句首,如果出现在句首,则首字母大写(如果索引文本是以单词开头的话)。但其实这里还有一个新的差异,那就是 \cref 生成的索引文本的前缀,有些会使用缩写,如"fig. xx","eq. (xx)"等等,而 \Cref 总是会生成完整的单词,如"figure","equation"等等。

和前面一样,它们的星号形式均有抑制 hyperref 链接的特性。

我们用一个例子演示一下:

\documentclass{article}
\usepackage[a5paper,margin=1.5in]{geometry}
\usepackage{amsmath}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\usepackage{cleveref}
\begin{document}
\section{A section}\label{sec:this}

A reference to an equation in this section looks like : ``see \cref{eq:a} in \cref{sec:this}''.

\begin{align}
   a &= b \label{eq:a}\\
   b &< c \label{eq:b}\\
   c &< d \label{eq:c}
\end{align}

\Cref{eq:c,eq:a,eq:b} above are \ldots
\end{document}

编译:

可以看到, \cref 生成的公式的索引文本和标题的不同,公式的索引文本的前缀是缩写"eq.",并且用一对圆括号公式的编号围起来,而标题的索引要本的前缀是"section"。 \Cref 生成的公式的索引文本,前掇是"Equations",是一个完整的单词,并且由于它出现在句首,首字母大写。

留意索引代码 \Cref{eq:c,eq:a,eq:b} ,可以看到我们是将这些 key 乱序输入的,但是在生成的文档中,它们仍然被正确地排序了,结果呈现了一个正确的范围,并且由于我们输入了多个 key ,前缀也都变成的复数形式(equations, 或eqs.)。索引的自动排序是一个很实用的特性,编写文档时,你很可能会需要重新排列某些内容,这可能会导致这些 key 也跟着变动。而此时如果没有自动排序的话,索引就会生成像"see figures(1),(3),and(2)"这样的文本。

我们在前面的例子中多添加两行公式,并且使用一个不同的间隔符号,就可能会出现不同的情形:

\documentclass{article}
\usepackage[a5paper,margin=1.4in]{geometry}
\usepackage{amsmath}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\usepackage{cleveref}
\begin{document}
\section{A section}

\begin{align}
   a &= b \label{eq:a}\\
   b &< c \label{eq:b}\\
   c &< d \label{eq:c}\\
   a &< c \label{eq:d}\\
   b &< d \label{eq:e}
\end{align}

\Cref{eq:c,eq:b,eq:a,eq:d,eq:e} are sorted and \cref{eq:c,eq:b,eq:a,eq:e} are sorted with a gap. But compare these results with referencing \cref{eq:c,,eq:b,eq:a,eq:d,eq:e}! Surprised?
\end{document}

编译:

我们知道这里公式(1)到(5)是一个连续的范围,但是最后一个 \cref 命令生成的内容却是"eqs.(1) to (3), (4) and (5)",这是为什么呢? 注意观察最后一个 \cref 命令的参数,我们在 eq:c 的后面放了 两个 逗号,正是这两个逗号,使得在排序之后的 key 时,逗号前面的 key 是前面一组的最后一个索引。也就是说, eq:c 是前面那一组的最后一个引用,而 eq:c 后面的 key 在下一组。注意先排序,再分组,尽管我们将 eq:a eq:b 都写在了这两个逗号的后面,但是由于它们排序后在 eq:c 的前面,所以它们也被分到了前面的那组,即公式(1)到(3)。

你可以在 \cref 以及 \Cref 的参数中放一些不同类型的 key cleveref 会选将索引分类,再在同类中排序。当然,前提是这些不同类型的索引是相容的,否则你可能会得到一些奇怪的范围结构。我们将前一个例子稍作改动:

\documentclass{article}
\usepackage[a5paper,margin=1.4in]{geometry}
\usepackage{amsmath}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\usepackage{cleveref}
\begin{document}
\section{A section}\label{sec:one}

\begin{align}
   a &= b \label{eq:a}\\
   b &< c \label{eq:b} \\
   c &< d \label{eq:c}\\
   a &< c \label{eq:d}\\
   b &< d \label{eq:e}
\end{align}

\Cref{eq:c,,eq:b,eq:a,eq:d,eq:e,sec:one,sec:two}

\section{A section too}\label{sec:two}
\end{document}

编译:

cleveref 默认带有排序和范围精简的功能,排序是指将乱序的 key 生成顺序的索引,而范围精简功能是指将多个连续的索引缩写为一个范围,例如在前面的例子中,它将公式(1),公式(2)...公式(5)缩写成了eqs.(1) to (5)。通常默认的这些功能正是我们需要的,但如果你有特殊的需求,也可以通过指定包选项来修改它。在调用 cleveref 时,如果指定 sort 选项,将只有排序功能,而没有范围精简功能,如果指定 compress 选项,则只有范围精简功能,而不排序,如果指定 nosort 选项,则两个功能都没有,指定 sort&compress 选项,则两个功能都有(也即是默认情形)。我们知道使用 \Cref 会使出现在句首的索引前缀单词首字大写,而如果我们指定了 capitalise 选项,那么每一个索引前缀单词的首字母都将大写,且不论使用的是 \Cref 还是 \cref 。我们将前面的例子稍作更改(加两个包选项):

\documentclass{article}
\usepackage[a5paper,margin=1.4in]{geometry}
\usepackage{amsmath}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\usepackage[sort,capitalize]{cleveref}%加两个包选项
\begin{document}
\section{A section}\label{sec:one}

\begin{align}
   a &= b \label{eq:a}\\
   b &< c \label{eq:b}\\
   c &< d \label{eq:c}\\
   a &< c \label{eq:d}\\
   b &< d \label{eq:e}
\end{align}

\cref{eq:c,,eq:b,eq:a,eq:d,eq:e,sec:one,sec:two}

\section{A section too}\label{sec:two}
\end{document}

编译:

可以看到,索引被排序了,但是没有缩写成范围,并且所有的索引文本的前缀都是首字母大写的。

cleveref







请到「今天看啥」查看全文