为什么 biblatex 不处理全局选项

为什么 biblatex 不处理全局选项

由于某种原因,biblatex似乎没有读取全局选项。以下 tex 文件生成单个引用,但样式不正确authoryear。如果我取消注释该PassOptionsToPackage行,它会正常工作,但我想直接在类定义中传递选项。为什么选项style没有被读取biblatexbiblatex似乎正在处理该backend=biber选项,因为它不会产生指示未指定后端的警告,当删除该选项时它会这样做。

\RequirePackage{filecontents}

\begin{filecontents}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}[2016/10/18 1.0 current]
\LoadClass{article}
\RequirePackage{biblatex}
\end{filecontents}

\begin{filecontents}{references.bib}
@article{hello,
    title={Hello World},
    author={Bar, Foo},
    journal={Baz},
    year=2016,
}                
\end{filecontents}

%\PassOptionsToPackage{style=authoryear}{biblatex}
\documentclass[backend=biber,style=authoryear]{myclass}
\bibliography{references}
\begin{document}
\textcite{hello}
\printbibliography
\end{document}

答案1

全局选项存储在 中\@classoptionslist\ProcessOptions包中的命令检查此列表并将每个条目与 列表进行比较已声明包的选项。如果选项已知,则执行该选项。

style=authoryear不是一个已声明, 的已知选项biblatex。该包不包含一长串的\DeclareOption{style=authoryear}{...}\DeclareOption{style=authortitle}{...}设置。这既不实用,也不够灵活:毕竟外部包可以定义自己的样式。

因此 biblatex 使用了一个巧妙的技巧:它会随着\DeclareOption*处理未知选项。默认情况下,LaTeX 会\@unknownoptionerror针对未知选项发出问题,但 biblatex 会将所有选项传递给 keyval 处理程序。

这意味着默认情况下全局选项会被忽略。你可以将它们传递给 biblatex,但如果选项列表包含 biblatex 不知道的选项,则会出现错误。因此,你要么“声明”biblatex 的所有潜在选项,要么更改 biblatex 的密钥处理程序。例如像这样

\documentclass[style=authoryear,german]{book}

\usepackage{kvoptions}
\makeatletter

\let\setkeys\kvsetkeys
\kv@set@family@handler {blx@opt@pre} {\PackageWarning{biblatex}{Unused option #1}}

\PassOptionsToPackage{\@classoptionslist}{biblatex}
\usepackage{biblatex}

\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{doody}

\end{document}

相关内容