何时/如何加载 biblatex 类

何时/如何加载 biblatex 类

我想编写一个加载biblatex包的自定义类,但我遇到了选项冲突的问题。例如,以下 MWE 给出了一个错误

% arara: pdflatex
% arara: biber
% arara: pdflatex
% arara: pdflatex

\RequirePackage{filecontents}

\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2015/12/29 My MWE class]
\LoadClassWithOptions{article}
\PassOptionsToPackage{backend=biber}{biblatex}
\RequirePackage{biblatex}
\endinput
\end{filecontents*}

\documentclass{myclass}
\usepackage[style=authoryear]{biblatex}
\addbibresource{biblatex-examples.bib}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

LaTeX 错误:包 biblatex 的选项冲突。

错误非常明显。该类使用 选项加载 biblatex ,然后使用和选项backend=biber再次加载文档。backend=biberauthoryear

我尝试让该类仅加载带有\AtBeginDocument钩子的 biblatex 包(以及\AtEndPreamble来自 etoolbox 包的钩子)(如果它没有在序言中加载的话)。

\AtBeginDocument{\@ifpackageloaded{biblatex}{}{\RequirePackage{biblatex}}}

显然,加载 biblatex 包已经太晚了。我唯一能让它工作的方法就是修补\document

\preto{\document}{\endgroup\@ifpackageloaded{biblatex}{}{\RequirePackage{biblatex}\begingroup}}{}{}

类应如何加载 biblatex 包?

答案1

不幸的是,style=...只能在可选参数中给出\usepackage[...]{biblatex},所以如果您想让作者自由选择他们喜欢的样式,则无法biblatex在课堂上加载。

你可以做的是指定你的选项想:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2015/12/29 My MWE class]
\LoadClassWithOptions{article}
\PassOptionsToPackage{backend=biber}{biblatex}
\endinput

我试过了,backend=bibtex在文档中指定是无效的。您还可以添加致命错误:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2015/12/29 My MWE class]
\LoadClassWithOptions{article}
\PassOptionsToPackage{backend=biber}{biblatex}
\AtBeginDocument{%
  \@ifpackageloaded{biblatex}{}
    {\ClassError{myclass}{Fatal: biblatex not loaded}
       {You must load biblatex, I'll end here}\@@end}%
}
\endinput

答案2

一个选项是向类添加一个选项,以禁止在类中加载 biblatex 包。这默认使用默认值加载 biblatex,但如果用户想要手动加载 biblatex,则需要提供类选项。

% arara: pdflatex
% arara: biber
% arara: pdflatex
% arara: pdflatex

\RequirePackage{filecontents}

\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2015/12/29 My MWE class]
\newif\ifnobiblatex
\DeclareOption{nobiblatex}{\nobiblatextrue}
\ProcessOptions\relax
\LoadClassWithOptions{article}
\PassOptionsToPackage{backend=biber}{biblatex}
\ifnobiblatex%
\AtBeginDocument{%
  \@ifpackageloaded{biblatex}{}
    {\ClassError{myclass}{Fatal: biblatex not loaded}
       {You must load biblatex, I'll end here}\@@end}%
}
\else\RequirePackage{biblatex}\fi
\endinput
\end{filecontents*}

\documentclass[nobiblatex]{myclass}
\usepackage[style=authoryear]{biblatex}
\addbibresource{biblatex-examples.bib}

\begin{document}
\nocite{*}
\printbibliography
\end{document}

答案3

以下是一个试用解决方案\DeclareOption{authoryear}{...}(例如)

一定要先使用\LoadClassWithOptions{...}\DeclareOption否则myclass会抱怨authoryear

当然,更复杂的方法需要更好的选项处理,尤其是选项值。

\RequirePackage{filecontents}

\begin{filecontents*}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2015/12/29 My MWE class]
\LoadClassWithOptions{article}
\DeclareOption{authoryear}{\PassOptionsToPackage{style=authoryear}{biblatex}}
\ProcessOptions
\endinput
\end{filecontents*}

\documentclass[authoryear]{myclass}
\usepackage{biblatex}
\addbibresource{biblio.bib}

\begin{document}
\cite{Lam94}
\printbibliography
\end{document}

相关内容