
Hace un tiempo preguntéuna meta preguntasobre cuán grande puede ser una pregunta. Me preguntaba en particular sobre cómo abrir REVTeX
y reorganizar la sustancia viscosa interna para reemplazar los natbib
bits con bits que funcionen mejor biblatex
. Seguramente sería una tarea de gran envergadura. José Wright señaló que
- Probablemente sea una mala idea.(
REVTeX
produce unbbl
archivo bastante original y es difícil decir qué tan importantes son sus partes internas para el editor). - Una mejor pregunta sería acerca de cómo ponerse
biblatex
a trabajar cuandonatbib
esté disponible también.
Como el segundo punto propone una pregunta de relevancia más amplia que la que originalmente pretendía plantear, y existe la posibilidad de una solución que requeriría mucho menos esfuerzo que reescribir una clase, la planteo aquí. Básicamente, estaría usando una solución solo para mis propias notas, que a menudo se mezclan en artículos en una clase de REVTeX, por lo que para la publicación tendría que utilizar de forma predeterminada la forma estándar. ¡Aunque es un comienzo! Entonces:
¿Es posible cargar biblatex
con una clase que ya se ha cargado natbib
?
El primer error se puede producir con este MWE:
\documentclass[reprint,aps,pra]{revtex4-1}
\usepackage{biblatex}
\begin{document}
\title{MWE}
\author{Mark S.\ Everitt}
\pacs{}
\maketitle
\section{Introduction}
stuff
\end{document}
y el error es:
/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.
Respuesta1
Trabajando con el supuesto aquí que simplemente estamos tratando de ignorar natbib
por completo, todo lo que necesita suceder es que se deben abordar los diversos conflictos de nombres. Al configurar una demostración donde natbib
se carga deliberadamente antes biblatex
, parece que las macros \bibhang
, \citename
y \bibfont
no \Citeauthor
deben estar definidas. Al mismo tiempo, es necesario ocuparse de , que es la macro interna que LaTeX utiliza para rastrear el hecho de que se ha cargado. Es esta macro la que se utiliza para emitir una advertencia sobre . Por lo tanto, lo siguiente funciona bien para mí:\[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}
Para que todo funcione con REVTeX, encuentro que también necesito undefined \textcite
. Luego hay un segundo problema, ya que REVTeX altera la definición de \MakeUppercase
y \MakeLowercase
. Así que copié los originales latex.ltx
y los restauré:
\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}
(Los cambios en realidad se aplican a las macros internas utilizadas por comandos robustos, por lo que simplemente hacer frente al uso \let
antes de la línea de clase del documento no funcionará aquí sin un esfuerzo adicional).
Para REVTeX 4.1, parece que necesitas
\renewcommand{\bibliography}[1]{}
después \begin{document}
, ya que REVTeX intenta usarlo al final del documento, lo que da un error con biblatex
.