
Vor einiger Zeit fragte icheine Metafragedarüber, wie groß eine Frage sein kann. Ich habe mich insbesondere gefragt, wie man REVTeX
den Schleim darin aufbrechen und neu organisieren kann, um die natbib
Teile durch Teile zu ersetzen, die besser mit harmonieren biblatex
. Das wäre sicherlich ein großes Unterfangen. Joseph Wright wies darauf hin, dass
- Das ist wahrscheinlich eine schlechte Idee(
REVTeX
erzeugt eine ziemlich abgefahrenebbl
Datei und es ist schwer zu sagen, wie wichtig die internen Komponenten für den Herausgeber sind). - Eine bessere Frage wäre, wann man
biblatex
zur Arbeit kommt, wennnatbib
man Zeit hat.
Da der zweite Punkt eine Frage von größerer Relevanz aufwirft als die, die ich ursprünglich stellen wollte, und es die Möglichkeit einer Lösung gibt, die viel weniger Aufwand erfordert als das Umschreiben einer Klasse, stelle ich sie hier. Im Wesentlichen würde ich eine Lösung nur für meine eigenen Notizen verwenden, die oft in Papiere in einer REVTeX-Klasse eingearbeitet werden, sodass ich für die Veröffentlichung auf die Standardmethode zurückgreifen müsste. Es ist jedoch ein Anfang! Also:
Ist es möglich, biblatex
mit einer Klasse zu laden, die bereits geladen wurde natbib
?
Mit diesem MWE kann der erste Fehler erzeugt werden:
\documentclass[reprint,aps,pra]{revtex4-1}
\usepackage{biblatex}
\begin{document}
\title{MWE}
\author{Mark S.\ Everitt}
\pacs{}
\maketitle
\section{Introduction}
stuff
\end{document}
und der Fehler ist:
/usr/local/texlive/2011/texmf-dist/tex/latex/biblatex/biblatex.sty:382: LaTeX Error: Command \bibhang already defined.
Or name \end... illegal, see p.192 of the manual.
Antwort1
Wenn wir hier von der Annahme ausgehen, dass wir einfach versuchen, sie vollständig zu ignorieren , natbib
müssen lediglich die verschiedenen Namenskonflikte behandelt werden. Beim Einrichten einer Demo, bei der natbib
absichtlich vor geladen wird biblatex
, scheint es, dass die Makros \bibhang
, \citename
und undefiniert sein müssen. Gleichzeitig ist es notwendig, sich mit zu befassen , dem internen Makro, das LaTeX verwendet, um die Tatsache zu verfolgen, dass geladen wurde. Es ist dieses Makro, das in verwendet, um eine Warnung über auszugeben . Daher funktioniert das Folgende bei mir problemlos:\bibfont
\Citeauthor
\[email protected]
natibib
biblatex
\@ifpackageloaded
natbib
\begin{filecontents}{\jobname.bib}
@article{Test,
journal = "J. Irrep. Res.",
author = "Other, A. N.",
year = "2011",
title = "Some things I did"
}
\end{filecontents}
\documentclass{article}
\usepackage{natbib}
% Start of 'ignore natbib' hack
\let\bibhang\relax
\let\citename\relax
\let\bibfont\relax
\let\Citeauthor\relax
\expandafter\let\csname [email protected]\endcsname\relax
% End of 'ignore natbib' hack
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{Test}
\printbibliography
\end{document}
Damit es mit REVTeX funktioniert, muss ich auch undefined verwenden \textcite
. Dann gibt es noch ein zweites Problem, da REVTeX die Definition von \MakeUppercase
und ändert \MakeLowercase
. Daher habe ich die Originale von kopiert latex.ltx
und wiederhergestellt:
\begin{filecontents}{\jobname.bib}
@article{Test,
journal = "J. Irrep. Res.",
author = "Other, A. N.",
year = "2011",
title = "Some things I did"
}
\end{filecontents}
\documentclass{revtex4}
\let\bibhang\relax
\let\citename\relax
\let\bibfont\relax
\let\Citeauthor\relax
\let\textcite\relax
\makeatletter
\DeclareRobustCommand{\MakeUppercase}[1]{{%
\def\i{I}\def\j{J}%
\def\reserved@a##1##2{\let##1##2\reserved@a}%
\expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
\protected@edef\reserved@a{\uppercase{#1}}%
\reserved@a
}}
\DeclareRobustCommand{\MakeLowercase}[1]{{%
\def\reserved@a##1##2{\let##2##1\reserved@a}%
\expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
\protected@edef\reserved@a{\lowercase{#1}}%
\reserved@a
}}
\makeatother
\expandafter\let\csname [email protected]\endcsname\relax
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{Test}
\printbibliography
\end{document}
(Die Änderungen betreffen eigentlich interne Makros, die von robusten Befehlen verwendet werden. Das einfache Kopieren mit „using“ \let
vor der Dokumentklassenzeile funktioniert hier also nicht ohne zusätzlichen Aufwand.)
Für REVTeX 4.1 benötigen Sie anscheinend
\renewcommand{\bibliography}[1]{}
danach \begin{document}
, da REVTeX versucht, es am Ende des Dokuments zu verwenden, was zu einem Fehler mit führt biblatex
.