natbib をすでにロードしたクラスで biblatex をロードすることは可能ですか?

natbib をすでにロードしたクラスで biblatex をロードすることは可能ですか?

少し前に私は尋ねましたメタ質問質問がどれほど大きなものになるかということについて。特に、REVTeX内部の粘液を分解して再編成し、natbibよりうまく機能する部分に置き換えることについて考えていましたbiblatex。これは確かに大規模な作業になるでしょう。ジョセフ・ライトは次のように指摘しました。

  • これはおそらく悪い考えだ(REVTeXかなり奇妙なbblファイルが生成され、その内部が発行者にとってどれほど重要であるかを判断するのは困難です)。
  • biblatexもっと良い質問は、彼が近くにいるときに仕事に行くかどうかですnatbib

2 番目のポイントは、私が当初尋ねようとしていた質問よりも関連が広い質問であり、クラスを書き直すよりもはるかに少ない労力で解決できる可能性があるので、ここで質問します。基本的に、私は自分のメモにのみソリューションを使用しますが、これは 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の定義を変更するため、2 番目の問題が発生します。そのため、 から元の定義をコピーして復元しました。\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ドキュメント クラス行の前に using を単純にコピーするだけでは、追加の作業なしではここでは機能しません。)

REVTeX 4.1の場合は、

\renewcommand{\bibliography}[1]{}

\begin{document}REVTeX はこれを文書の最後で使用しようとするため、 でエラーが発生しますbiblatex

関連情報