Pergunta

Pergunta

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 cleverefpacote, independentemente de como cleverefo 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 cleverefque 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 cleverefmais 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 cleverefque 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 \refstepcountere um rótulo gerado automaticamente. Isso é referenciado verificando se r@Xestá 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 \CrefFormatExternalmacro for chamada pelo mesmo valor, ela gerará tal rótulo.

A versão com estrela suprime hiperlinks, mas \crefFormatExternaltambé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}

insira a descrição da imagem aqui

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 \crefformatfiguras 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}

informação relacionada