問題

問題

問題

如何從外部文件中引用圖形、部分或方程,但使用與我透過包裝在文件中使用的格式相同的格式來引用它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>是計數器名稱(例如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}

相關內容