加载“todonotes”时,“svjour3.cls”中的“\tableofcontents”之后引用失败

加载“todonotes”时,“svjour3.cls”中的“\tableofcontents”之后引用失败

使用 Springer 类时svjour3(可以获取这里),我偶然发现了一个问题\cite。请看以下最小示例:

\documentclass{svjour3}

\usepackage{todonotes}

\usepackage{biblatex}
\addbibresource{references.bib}

\begin{document}
\cite{test1}
% \cite{test2}
\tableofcontents
\cite{test1}
\cite{test2}
\end{document}

您可以为此使用两个带有键test1test2in 的任意 bib 条目。references.bib

编译此代码时,引用的两个部分均有效test1,但引用test2无效。以下任何操作均可修复此问题:

  • 注释掉这个todonotes包,
  • 注释掉\tableofcontents,或者
  • 使用article类而不是svjour3

\tableofcontents我检查了in的定义svjour3,即

\newcommand\tableofcontents{%
    \section*{\contentsname}%
    \@starttoc{toc}%
    \addtocontents{toc}{\begingroup\protect\small}%
    \AtEndDocument{\addtocontents{toc}{\endgroup}}%
    }

确实,使用article的这个定义\tableofcontents也会失败。对这里发生的事情有什么见解吗?这是预期的行为还是 中的错误svjour3

答案1

biblatex似乎是在往目录中注入东西。人们可能想知道为什么 Springer 选择这个定义

\newcommand\tableofcontents{%
    \section*{\contentsname}%
    \@starttoc{toc}%
    \addtocontents{toc}{\begingroup\protect\small}%
    \AtEndDocument{\addtocontents{toc}{\endgroup}}%
    }

尤其是将\begingroup\small和添加\endgroup到 toc 文件中。

biblatex使用时,我们可以看到文件\endgroup中缺少.toc。因此,基本上所有运行\cite后的命令都像\tableofcontents

\begingroup
\cite{test1} etc

没有\endgroup,我不知道为什么这会导致biblatex\cite的信息不写入.aux

Springer 为什么不直接使用

\makeatletter
\renewcommand\tableofcontents{%
  \section*{\contentsname}%
  \begingroup
    \small
    \@starttoc{toc}%
  \endgroup
}
\makeatother

而不是将这些信息注入到 中.toc,而它(在我看来)不属于那里。上面的重新定义适用于biblatex

不过,你可能需要向 Springer 咨询他们是否支持biblatex他们的制作。并非所有出版商都这样做。

相关内容