
Некоторое время назад я спросилмета-вопросо том, насколько большим может быть вопрос. Я, в частности, размышлял о том, как вскрыть 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]
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}
Чтобы все заработало с 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
.