问题

问题

问题

如何引用外部文档中的图表、章节或公式,但使用与通过包在我的文档中使用的相同格式来引用它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>是计数器名称(例如equationsectionfigure),似乎可以实现我们想要的功能。

例如,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}

相关内容