
Frage
Wie kann ich eine Abbildung, einen Abschnitt oder eine Gleichung aus einem externen Dokument zitieren, aber mit derselben Formatierung darauf verweisen, die ich in meinem Dokument über das cleveref
Paket verwende, unabhängig davon, wie cleveref
der Referenzstil eingerichtet wurde?
Beispiel
Angenommen, ich möchte in einem anderen Dokument auf eine Gleichung verweisen (sagen wir, ihre neunte Gleichung). Angenommen, es cleveref
wurde so eingerichtet, dass \Cref{eqn:myEqn}
im folgenden Text etwas wie folgt aufgelöst wird Equation~(1)
. In diesem Fall würde ichkönnteVerwenden Sie es einfach, Equation~(9)
um auf die externe Gleichung zu verweisen, wie unten beschrieben.
\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}
Das Problem besteht darin, dass, wenn cleveref
es später anders eingerichtet würde, sodass es \Cref{eqn:myEqn}
in Eqn.~1
, oder (1)
, oder Equation~1
(usw.) aufgelöst würde, alle von mir fest codierten Stellen Equation~(9)
geändert werden müssten, um dem neuen Referenzstil zu entsprechen.
Gibt es ein Makro, cleveref
das das für mich erledigen kann? Ich nehme an, ich müsste ihm sagen, um welche Art von Referenz es sich handelt (Gleichung, Abbildung, Abschnitt usw.) und welche Nummer oder welchen Buchstaben es verwenden soll, um darauf zu verweisen. Wenn ja, könnte es vielleicht wie folgt verwendet werden:
\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}
Antwort1
Meine mögliche Lösung speichert den aktuellen Wert des Zählers (der Gleichung), setzt dann den Zähler (die Gleichung) auf den um eins verminderten Wert des 2. Arguments, verwendet \refstepcounter
und ein automatisch generiertes Label. Dies wird referenziert, indem geprüft wird, ob r@X
definiert ist oder nicht. X
ist der automatisch generierte Labelname. Eine Schwäche dieses Ansatzes ist natürlich, dass jedes Mal, wenn das Makro \CrefFormatExternal
für denselben Wert aufgerufen wird, ein solches Label generiert wird.
Die mit Sternchen versehene Variante unterdrückt Hyperlinks, diese \crefFormatExternal
ist ebenfalls verfügbar.
\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}
Antwort2
Es ist möglich, die internen Befehle von cleveref zu verwenden, um eine Referenz ohne Zähler zu formatieren. Die Befehle der Form cref@<type>@format
, wobei <type>
der Zählername ist (wie equation
, section
, oder figure
), scheinen das zu tun, was wir wollen.
Beispielsweise cref@figure@format{foo}{}{}
erzeugt es „fig. foo“ oder was auch immer vom benutzerdefinierten Wert \crefformat
für Abbildungen erzeugt wird. Hinweis:
- Die beiden leeren Argumente werden normalerweise verwendet, um den Anfang und das Ende des per Hyperlink verknüpften Teils der Referenz zu markieren (siehe die Dokumentation von
\crefformat
), aber ich gehe davon aus, dass in diesem Fall kein Hyperlink gewünscht ist. - Da dieses interne Makro
@
im Namen hat, können wir es in einem Dokument nur verwenden,nach\makeatletter
.
Das folgende Beispiel definiert ein Hilfsmakro, \crefcustom
, das den internen Befehl aufruft. \Crefcustom
ist die Version in Großbuchstaben.
\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}