是否可以使用已经加载 natbib 的类来加载 biblatex?

是否可以使用已经加载 natbib 的类来加载 biblatex?

不久前我问过元问题一个问题可以有多大。我特别想知道如何打开并重新组织其中的粘性物质,用更适合的物质REVTeX替换这些物质。这肯定是一项大工程。约瑟夫·赖特指出natbibbiblatex

  • 这可能是一个坏主意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]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}

为了使 REVTeX 正常工作,我发现我还需要 undefined 。然后还有第二个问题,因为 REVTeX 改变了和\textcite的定义。因此,我从 复制了原始内容并恢复了它们:\MakeUppercase\MakeLowercaselatex.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

相关内容