
前段時間我問過一個元問題問題有多大。我特別想知道如何打開並重新組織內部的黏性物質,以用更適合的部分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
之前特意載入了一個demo biblatex
,看來宏、、\bibhang
需要未定義。同時,還需要處理,這是 LaTeX 用於追蹤已載入事實的內部巨集。正是這個宏使用 in來發出有關 的警告。因此,以下內容對我來說很好:\citename
\bibfont
\Citeauthor
\[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 \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
.