是否可以使用已經載入 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之前特意載入了一個demo biblatex,看來宏、、\bibhang需要未定義。同時,還需要處理,這是 LaTeX 用於追蹤已載入事實的內部巨集。正是這個宏使用 in來發出有關 的警告。因此,以下內容對我來說很好:\citename\bibfont\Citeauthor\[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 \textcite。然後還有第二個問題,因為 REVTeX 改變了\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]{}

after \begin{document}as REVTeX 嘗試在文件末尾使用它,這會產生biblatex.

相關內容