É possível carregar o biblatex com uma classe que já carregou o natbib?

É possível carregar o biblatex com uma classe que já carregou o natbib?

Há algum tempo eu pergunteiuma meta-perguntasobre quão grande pode ser uma questão. Eu estava pensando em particular sobre como abrir REVTeXe reorganizar a gosma interna para substituir os natbibbits por bits que funcionem melhor com biblatex. Este seria certamente um grande empreendimento. Joseph Wright destacou que

  • Esta é provavelmente uma má ideia( REVTeXproduz um bblarquivo bastante descolado e é difícil dizer o quão importante é a parte interna dele para o editor).
  • Uma pergunta melhor seria sobre como começar biblatexa trabalhar quando natbibestiver por perto também.

Como o segundo ponto propõe uma questão de relevância mais ampla do que aquela que originalmente pretendia perguntar, e existe a possibilidade de uma solução que exigiria muito menos esforço do que reescrever uma classe, estou perguntando aqui. Essencialmente, eu usaria uma solução apenas para minhas próprias anotações, que muitas vezes são remixadas em artigos em uma aula REVTeX, portanto, para publicação, eu teria que usar o modo padrão como padrão. É um começo! Então:

É possível carregar biblatexcom uma classe que já foi carregada natbib?

O primeiro erro pode ser produzido com 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}

e o erro é:

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

Responder1

Trabalhando aqui com a suposição de que estamos simplesmente tentando ignorar natbibcompletamente, tudo o que precisa acontecer é que os vários conflitos de nomes precisam ser resolvidos. Configurando uma demonstração onde natbibé deliberadamente carregado antes biblatex, parece que as macros \bibhang, \citenamee \bibfontprecisam \Citeauthorser indefinidas. Ao mesmo tempo, é necessário lidar com , que é a macro interna que o LaTeX usa para rastrear o fato de que foi carregado. É essa macro que usa in para emitir um aviso sobre o . Assim, o seguinte é bom para mim:\[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}

Para fazer as coisas funcionarem com o REVTeX, acho que também preciso undefined \textcite. Há então uma segunda questão, pois o REVTeX altera a definição de \MakeUppercasee \MakeLowercase. Assim, copiei os originais latex.ltxe os restaurei:

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

(Na verdade, as alterações são para macros internas usadas por comandos robustos; portanto, simplesmente lidar com o uso \letantes da linha de classe do documento não funcionará aqui sem algum esforço extra.)

Para REVTeX 4.1, parece que você precisa

\renewcommand{\bibliography}[1]{}

after \begin{document}enquanto o REVTeX tenta utilizá-lo no final do documento, o que dá um erro com biblatex.

informação relacionada