Pregunta

Pregunta

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 cleverefpaquete, independientemente de cómo cleverefse 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 cleverefque 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 cleverefluego 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~1cualquier lugar que haya codificado para que coincida con el nuevo estilo de referencia.Equation~(9)

¿Hay alguna macro cleverefque 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 \refstepcounteruna etiqueta generada automáticamente. Se hace referencia a esto comprobando si r@Xestá definido o no. Xes el nombre de la etiqueta generada automáticamente. Por supuesto, una debilidad de este enfoque es que cada vez que \CrefFormatExternalse llama a la macro macro para el mismo valor, generará dicha etiqueta.

La versión destacada suprime los hipervínculos y \crefFormatExternaltambié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}

ingrese la descripción de la imagen aquí

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, sectiono figure), parecen hacer lo que queremos.

Por ejemplo, cref@figure@format{foo}{}{}produce "fig. foo", o lo que sea que produzca el usuario definido \crefformatpara 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, \crefcustomque invoca el comando interno. \Crefcustomes 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}

información relacionada