我想编写一个加载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=biber
authoryear
我尝试让该类仅加载带有\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}