
問題
如何從外部文件中引用圖形、部分或方程,但使用與我透過包裝在文件中使用的格式相同的格式來引用它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
、 or (1)
、 or 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
可以使用 smartef 的內部命令來格式化引用,而不涉及任何計數器。形式的命令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}