
Pergunta
Como posso citar uma figura, seção ou equação de um documento externo, mas referenciá-la usando a mesma formatação que uso em meu documento por meio do cleveref
pacote, independentemente de como cleveref
o estilo de referência foi configurado?
Exemplo
Suponha que eu queira me referir a uma equação (digamos, a nona equação) em algum outro documento. Suponha cleveref
que foi configurado de forma que \Cref{eqn:myEqn}
no texto abaixo seja resolvido algo parecido com Equation~(1)
. Neste caso, eupoderiasimplesmente use Equation~(9)
para se referir à equação externa, conforme feito abaixo.
\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}
O problema é que, se cleveref
mais tarde fosse configurado de forma diferente para \Cref{eqn:myEqn}
ser resolvido como Eqn.~1
, ou (1)
, ou Equation~1
(etc.), qualquer lugar que eu codifiquei Equation~(9)
precisaria ser alterado para corresponder ao novo estilo de referência.
Existe uma macro cleveref
que pode fazer isso por mim? Imagino que precisaria dizer que tipo de referência era (equação, figura, seção, etc.) e que número ou letra deveria usar para se referir a ela. Se houvesse, talvez pudesse ser usado da seguinte forma:
\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}
Responder1
Minha solução possível armazena o valor atual do contador (equação) e, em seguida, define o contador (equação) para o valor do segundo argumento diminuído em um, usa \refstepcounter
e um rótulo gerado automaticamente. Isso é referenciado verificando se r@X
está definido ou não. X
é o nome do rótulo gerado automaticamente. É claro que um ponto fraco dessa abordagem é que toda vez que a macro \CrefFormatExternal
macro for chamada pelo mesmo valor, ela gerará tal rótulo.
A versão com estrela suprime hiperlinks, mas \crefFormatExternal
também está disponível.
\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}
Responder2
É possível usar comandos internos do intelligentef para formatar uma referência sem nenhum contador envolvido. Os comandos da forma cref@<type>@format
, onde <type>
está o nome do contador (como equation
, section
, ou figure
), parecem fazer o que queremos.
Por exemplo, cref@figure@format{foo}{}{}
produz "fig. foo", ou o que quer que seja produzido pelas \crefformat
figuras definidas pelo usuário. Observação:
- Os dois argumentos vazios são normalmente usados para marcar o início e o fim da parte com hiperlink da referência (consulte a documentação de
\crefformat
), mas presumo que nenhum hiperlink seja desejado neste caso. - Como esta macro interna tem
@
no nome, não podemos usá-la em um documento, excetodepois\makeatletter
.
O exemplo a seguir define uma macro auxiliar, \crefcustom
, que invoca o comando interno. \Crefcustom
é a versão em maiú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}