Ist es möglich, Biblatex mit einer Klasse zu laden, die bereits Natbib geladen hat?

Ist es möglich, Biblatex mit einer Klasse zu laden, die bereits Natbib geladen hat?

Vor einiger Zeit fragte icheine Metafragedarüber, wie groß eine Frage sein kann. Ich habe mich insbesondere gefragt, wie man REVTeXden Schleim darin aufbrechen und neu organisieren kann, um die natbibTeile 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( REVTeXerzeugt eine ziemlich abgefahrene bblDatei und es ist schwer zu sagen, wie wichtig die internen Komponenten für den Herausgeber sind).
  • Eine bessere Frage wäre, wann man biblatexzur Arbeit kommt, wenn natbibman 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, biblatexmit 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 , natbibmüssen lediglich die verschiedenen Namenskonflikte behandelt werden. Beim Einrichten einer Demo, bei der natbibabsichtlich vor geladen wird biblatex, scheint es, dass die Makros \bibhang, \citenameund 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]natibibbiblatex\@ifpackageloadednatbib

\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 \MakeUppercaseund ändert \MakeLowercase. Daher habe ich die Originale von kopiert latex.ltxund 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“ \letvor 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.

verwandte Informationen