이미 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가 로드된 사실을 추적하는 데 사용하는 내부 매크로인 를 처리해야 합니다. 에 대한 경고를 발행하기 위해 in을 사용하는 것은 이 매크로입니다 . 따라서 다음은 나에게 적합합니다.\[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로 작업하려면 undefound도 필요하다는 것을 알았습니다 \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]{}

\begin{document}REVTeX가 문서 끝에서 이를 사용하려고 하면 biblatex.

관련 정보