Можно ли загрузить biblatex с классом, который уже загрузил natbib?

Можно ли загрузить biblatex с классом, который уже загрузил natbib?

Некоторое время назад я спросилмета-вопросо том, насколько большим может быть вопрос. Я, в частности, размышлял о том, как вскрыть REVTeXи реорганизовать слизь внутри, чтобы заменить natbibбиты битами, которые лучше взаимодействуют с biblatex. Это, безусловно, было бы большой задачей. Джозеф Райт указал, что

  • Это, вероятно, плохая идея.( REVTeXсоздает довольно странный bblфайл, и трудно сказать, насколько важны его внутренние данные для издателя).
  • Лучше было бы спросить о том, как добраться biblatexдо работы, когда natbibэто будет возможно.

Поскольку второй пункт предлагает вопрос более широкого значения, чем тот, который я изначально намеревался задать, и есть возможность решения, которое потребует гораздо меньше усилий, чем переписывание класса, я задаю его здесь. По сути, я бы использовал решение только для своих собственных заметок, которые часто переделываются в статьи в классе REVTeX, поэтому для публикации мне пришлось бы использовать стандартный способ по умолчанию. Но это только начало! Итак:

Можно ли выполнить загрузку biblatexс классом, который уже загружен natbib?

Первая ошибка может быть получена с помощью этого MWE:

\documentclass[reprint,aps,pra]{revtex4-1}
\usepackage{biblatex}

\begin{document}
\title{MWE}
\author{Mark S.\ Everitt}
\pacs{}
\maketitle

\section{Introduction}
stuff

\end{document}

и ошибка:

/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.

решение1

Работая с предположением, что мы просто пытаемся полностью игнорировать , все , natbibчто нужно сделать, это то, что нужно разобраться с различными конфликтами имен. Настраивая демо, где natbibнамеренно загружено до biblatex, кажется, что макросы \bibhang, \citenameи должны быть неопределенными. В то же время, необходимо разобраться с , который является внутренним макросом, который LaTeX использует для отслеживания факта загрузки. Именно этот макрос использует in для выдачи предупреждения о . Таким образом, следующее строится для меня нормально:\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}

Чтобы все заработало с REVTeX, я обнаружил, что мне также нужно undefined \textcite. Затем возникает вторая проблема, поскольку REVTeX изменяет определение \MakeUppercaseи \MakeLowercase. Поэтому я скопировал оригиналы из latex.ltxи восстановил их:

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

(На самом деле изменения коснулись внутренних макросов, используемых надежными командами, поэтому простое копирование using \letперед строкой класса документа здесь не сработает без дополнительных усилий.)

Для REVTeX 4.1, похоже, вам нужно

\renewcommand{\bibliography}[1]{}

после \begin{document}того, как REVTeX попытается использовать его в конце документа, что выдаст ошибку с biblatex.

Связанный контент