Вопрос

Вопрос

Вопрос

Как можно сослаться на рисунок, раздел или уравнение из внешнего документа, используя при этом то же форматирование, которое я использую в своем документе через пакет 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

Мое возможное решение сохраняет текущее значение счетчика (уравнение), затем устанавливает счетчик (уравнение) на значение 2-го аргумента, уменьшенное на единицу, использует \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для figures. Примечание:

  • Два пустых аргумента обычно используются для обозначения начала и конца гиперссылочной части ссылки (см. документацию \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}

Связанный контент