不久前我问过元问题一个问题可以有多大。我特别想知道如何打开并重新组织其中的粘性物质,用更适合的物质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
和\bibfont
需要\Citeauthor
未定义。同时,有必要处理,这是 LaTeX 用来跟踪已加载事实的内部宏。这个宏使用来发出有关的警告。因此,以下构建对我来说很好:\[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 。然后还有第二个问题,因为 REVTeX 改变了和\textcite
的定义。因此,我从 复制了原始内容并恢复了它们:\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}
(这些变化实际上是对强命令使用的内部宏的改变,因此,\let
如果不付出额外的努力,简单地在文档类行之前使用复制将无法在这里起作用。)
对于 REVTeX 4.1,似乎你需要
\renewcommand{\bibliography}[1]{}
因为\begin{document}
REVTeX 尝试在文档末尾使用它,所以出现错误biblatex
。