问题
如何引用外部文档中的图表、章节或公式,但使用与通过包在我的文档中使用的相同格式来引用它cleveref
,而不管cleveref
引用样式是如何设置的?
例子
假设我想引用其他文档中的一个方程(比如说,他们的第九个方程)。假设cleveref
设置为,\Cref{eqn:myEqn}
在下面的文本中解析为类似Equation~(1)
。在这种情况下,我可以只需用来Equation~(9)
引用外部方程,如下所示。
\documentclass{report}
\usepackage{cleveref}
\begin{document}
My equation is:
\begin{equation} \label{eqn:myEqn}
f(x) = a x^2 + bx + c \text{.}
\end{equation}
My \Cref{eqn:myEqn} is equivalent to Equation~(9) of Smith et al. (2018).
\end{document}
问题是,如果cleveref
后来设置得不同,以至于\Cref{eqn:myEqn}
解析为Eqn.~1
,或(1)
,或Equation~1
(等等),那么我硬编码的任何地方Equation~(9)
都需要更改以匹配新的参考样式。
有没有宏cleveref
可以帮我做这个?我想我需要告诉它它是什么类型的引用(方程式、图形、部分等)以及它应该使用什么数字或字母来引用它。如果有,也许可以像下面这样使用:
\documentclass{report}
\usepackage{cleveref}
\begin{document}
My equation is:
\begin{equation} \label{eqn:myEqn}
f(x) = a x^2 + bx + c \text{.}
\end{equation}
My \Cref{eqn:myEqn} is equivalent to \CrefFormatExternal[eqn]{9} of Smith et al. (2018).
\end{document}
答案1
我可能的解决方案是存储计数器(方程式)的当前值,然后将计数器(方程式)设置为第二个参数值减一,使用\refstepcounter
并自动生成标签。通过检查是否r@X
定义来引用它。X
是自动生成的标签名称。当然,这种方法的一个缺点是,每次\CrefFormatExternal
为相同的值调用宏时,它都会生成这样的标签。
带星号的版本抑制了超链接,\crefFormatExternal
同样可用。
\documentclass{report}
\usepackage{mathtools}
\usepackage{xparse}
\usepackage{hyperref}
\usepackage{cleveref}
\makeatletter
\newif\if@hyperrefpackageloaded
\AtBeginDocument{%
\@ifpackageloaded{hyperref}{%
\@hyperrefpackageloadedtrue
}{}
}
\newcounter{tmpcntr}
\newcounter{helpcntr}
\NewDocumentCommand{\CrefFormatExternal}{sO{equation}m}{%
\setcounter{tmpcntr}{\value{#2}}%
\stepcounter{helpcntr}%
\setcounter{#2}{\numexpr#3-1}%
\refstepcounter{#2}\label{cleverrefexternalref:\number\value{helpcntr}}%
\@ifundefined{r@cleverrefexternalref:\number\value{helpcntr}}{%
}{%
\IfBooleanTF{#1}{%
\Cref*{cleverrefexternalref:\number\value{helpcntr}}%
}{%
\Cref{cleverrefexternalref:\number\value{helpcntr}}%
}%
}%
\setcounter{#2}{\value{tmpcntr}}%
}
\NewDocumentCommand{\crefFormatExternal}{sO{equation}m}{%
\setcounter{tmpcntr}{\value{#2}}%
\stepcounter{helpcntr}%
\setcounter{#2}{\numexpr#3-1}%
\refstepcounter{#2}\label{cleverrefexternalref:\number\value{helpcntr}}%
\@ifundefined{r@cleverrefexternalref:\number\value{helpcntr}}{%
}{%
\IfBooleanTF{#1}{%
\cref*{cleverrefexternalref:\number\value{helpcntr}}%
}{%
\cref{cleverrefexternalref:\number\value{helpcntr}}%
}%
}%
\setcounter{#2}{\value{tmpcntr}}%
}
\makeatother
\begin{document}
My equation is:
\begin{equation} \label{eqn:myEqn}
f(x) = a x^{2} + bx + c \text{.}
\end{equation}
My \Cref{eqn:myEqn} is equivalent to \CrefFormatExternal*{9} of Smith et al. (2018).
\begin{equation} \label{eqn:otherEqn}
x_{1/2} = \dfrac{ - b\pm \sqrt{ b^{2} - 4 ac}}{2a}
\end{equation}
\end{document}
答案2
可以使用 cleveref 的内部命令来格式化引用,而无需涉及任何计数器。形式为 的命令cref@<type>@format
,其中<type>
是计数器名称(例如equation
、section
或figure
),似乎可以实现我们想要的功能。
例如,cref@figure@format{foo}{}{}
生成“fig. foo”,或者用户为\crefformat
图形定义的任何内容。注意:
- 两个空参数通常用于标记引用的超链接部分的开始和结束(参见的文档
\crefformat
),但我认为在这种情况下不需要超链接。 - 因为这个内部宏有
@
名称中包含,因此我们不能在文档中使用它,除非后\makeatletter
。
下面的示例定义了一个辅助宏,,\crefcustom
它调用内部命令。\Crefcustom
是大写版本。
\documentclass{report}
\usepackage{cleveref}
\makeatletter
\newcommand {\crefcustom}[2]{\csname cref@#1@format\endcsname{#2}{}{}}
\newcommand {\Crefcustom}[2]{\csname Cref@#1@format\endcsname{#2}{}{}}
\makeatother
\begin{document}
My equation is:
\begin{equation} \label{eqn:myEqn}
f(x) = a x^2 + bx + c.
\end{equation}
My \cref{eqn:myEqn} is equivalent to \crefcustom{equation}{9} of Smith et al. (2018).
\end{document}