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