
Pregunta
¿Cómo puedo citar una figura, sección o ecuación de un documento externo, pero hacer referencia a ella usando el mismo formato que uso en mi documento a través del cleveref
paquete, independientemente de cómo cleveref
se configuró el estilo de referencia?
Ejemplo
Supongamos que deseo hacer referencia a una ecuación (digamos, su novena ecuación) en algún otro documento. Supongamos cleveref
que se configuró de modo que \Cref{eqn:myEqn}
en el texto siguiente se resolviera algo parecido a Equation~(1)
. En este caso, yopodríasimplemente utilícelo Equation~(9)
para referirse a la ecuación externa, como se hace a continuación.
\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}
El problema es que si cleveref
luego se configuró de manera diferente para que \Cref{eqn:myEqn}
se resolviera en Eqn.~1
, o (1)
, o (etc.), entonces sería necesario cambiar Equation~1
cualquier lugar que haya codificado para que coincida con el nuevo estilo de referencia.Equation~(9)
¿Hay alguna macro cleveref
que pueda hacer esto por mí? Imagino que necesitaría decirle qué tipo de referencia era (ecuación, figura, sección, etc.) y qué número o letra debería usar para referirse a ella. Si lo hubiera, quizás podría usarse de la siguiente manera:
\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}
Respuesta1
Mi posible solución almacena el valor actual del contador (ecuación), luego establece el contador (ecuación) en el valor del segundo argumento disminuido en uno, usa \refstepcounter
una etiqueta generada automáticamente. Se hace referencia a esto comprobando si r@X
está definido o no. X
es el nombre de la etiqueta generada automáticamente. Por supuesto, una debilidad de este enfoque es que cada vez que \CrefFormatExternal
se llama a la macro macro para el mismo valor, generará dicha etiqueta.
La versión destacada suprime los hipervínculos y \crefFormatExternal
también está disponible.
\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}
Respuesta2
Es posible utilizar los comandos internos de Cleveref para formatear una referencia sin ningún contador involucrado. Los comandos del formulario cref@<type>@format
, donde <type>
está el nombre del contador (como equation
, section
o figure
), parecen hacer lo que queremos.
Por ejemplo, cref@figure@format{foo}{}{}
produce "fig. foo", o lo que sea que produzca el usuario definido \crefformat
para las figuras. Nota:
- Los dos argumentos vacíos normalmente se usan para marcar el principio y el final de la parte hipervinculada de la referencia (consulte la documentación de
\crefformat
), pero supongo que en este caso no se desea ningún hipervínculo. - Debido a que esta macro interna está
@
en el nombre, no podemos usarla en un documento exceptodespués\makeatletter
.
El siguiente ejemplo define una macro auxiliar, \crefcustom
que invoca el comando interno. \Crefcustom
es la versión en mayúscula.
\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}