我怎样才能让 cleveref 自动用括号括住引用?

我怎样才能让 cleveref 自动用括号括住引用?

我用cleveref它来做文档内引用,觉得它很聪明。但是,我通常想在括号内引用图片(例如)。我现在做的是

\usepackage{cleveref}
...
X exhibits Y (\cref{fig:foo}).

但我想做的是

X exhibits Y \cref{fig:foo}. % Parentheses omitted in code but not in output

理想情况下,我会在需要时以某种方式省略输出中的括号。

答案1

我不会\cref直接修改和朋友的工作方式。相反,我会创建一个名为的新宏\pcref——我想是“括号 \cref”的缩写——如下所示:

\newcommand\pcref[1]{(\cref{#1})}

您可能已经猜到了,\pcref在 的输出周围放置圆括号\cref。无需大量单独的\crefformat指令。此方法保留了对 的标准定义的访问\cref,如果需要这样做的话。

对于下面的截图,我加载了hyperref包并指定了cleveref选项nameinlink,以便可以看到生成的内容和未生成的内容\cref

在此处输入图片描述

\documentclass{article}
\usepackage[colorlinks,allcolors=blue]{hyperref} % optional
\usepackage[noabbrev,nameinlink]{cleveref}
\newcommand\pcref[1]{(\cref{#1})}
\begin{document}
\begin{figure}[t!] \caption{foo}\label{fig:foo}\end{figure}
\begin{figure}[h!] \caption{bar}\label{fig:bar}\end{figure}
\begin{table}[h!] \caption{foo}\label{tab:foo}\end{table}

\dots\ \pcref{fig:foo}, \pcref{fig:foo,fig:bar}, \pcref{tab:foo,fig:bar}, \dots

\bigskip vs.

\bigskip
\dots\ \cref{fig:foo}, \cref{fig:foo,fig:bar}, \cref{tab:foo,fig:bar}, \dots

\end{document} 

答案2

参考文档第 8.2.1 节cleveref

单个交叉引用的交叉引用格式使用\crefformat和命令定义或重新定义,它们分别由和命令\Crefformat使用。它们采用两个参数:交叉引用类型和格式代码: \cref\Cref\crefformat{type}{format}

为了您的目的,我们可以使用例如:

\crefformat{figure}{(Figure~#2#1#3)}
\Crefformat{figure}{Figure~#2#1#3}

请注意,我已经使用了crefformat与命令一起使用\cref(不是句子的开头),并且Crefformat使用了与Cref命令一起使用(句子的开头)。

这给出

在此处输入图片描述

完整的 MWE 如下

% arara: pdflatex
% arara: pdflatex
\documentclass{article}
\usepackage{cleveref}
\crefformat{figure}{(Figure~#2#1#3)}
\Crefformat{figure}{Figure~#2#1#3}
\begin{document}

\begin{figure}[!h]
    \rule{3mm}{2mm}
    \caption{August}
    \label{fig:foo}
\end{figure}

X exhibits Y \cref{fig:foo}.

\Cref{fig:foo} is a cross reference at the beginning of a sentence
\end{document}

答案3

作为对 Mico 想法的补充,可以对 \crefrange 做同样的事情:

\newcommand\pcrefrange[2]{(\crefrange{#1}{#2})}

然而,如果我们想要 (1)--(2) 符号而不是 (1--2),那就有问题了,因为前者更为广泛。

查看这些帖子:

当默认 \crefrangelabelformat 没有括号时,引用示例范围时获得 (1)-(3) 样式

使用 Linguex/Philex 和 Cleveref 进行本地交叉引用:跳过第一级和第二级子标签

相关内容