
Há algum tempo eu pergunteiuma meta-perguntasobre quão grande pode ser uma questão. Eu estava pensando em particular sobre como abrir REVTeX
e reorganizar a gosma interna para substituir os natbib
bits por bits que funcionem melhor com biblatex
. Este seria certamente um grande empreendimento. Joseph Wright destacou que
- Esta é provavelmente uma má ideia(
REVTeX
produz umbbl
arquivo 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
biblatex
a trabalhar quandonatbib
estiver 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 biblatex
com 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 natbib
completamente, 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
, \citename
e \bibfont
precisam \Citeauthor
ser 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]
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 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 \MakeUppercase
e \MakeLowercase
. Assim, copiei os originais latex.ltx
e 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 \let
antes 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
.