为什么 biblatex 在 .toc 中产生“defcounter”行?

为什么 biblatex 在 .toc 中产生“defcounter”行?

问题

装载biblatex了,为什么有.toc这条线

\defcounter {refsection}{0}\relax 

紧接在每一条普通\contentsline线之前?

以及如何预防它而不产生不良的副作用?

平均能量损失

\documentclass{memoir}

\usepackage{biblatex}

\usepackage{kantlipsum}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\chapter{Chap}
\kant[1]
\section{Test}
\kant[1]
\subsection{Test}
\kant[1]

\end{document}

产生.toc的是:

\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse{pagetracker}\boolfalse {backtracker}\relax 
\defcounter {refsection}{0}\relax 
\contentsline {chapter}{Contents}{i}{section*.1}% 
\defcounter {refsection}{0}\relax 
\contentsline {chapter}{\chapternumberline {1}Chap}{1}{chapter.1}% 
\defcounter {refsection}{0}\relax 
\contentsline {section}{\numberline {1.1}Test}{1}{section.1.1}% 
\defcounter {refsection}{0}\relax 
\contentsline {subsection}{Test}{1}{section*.2}%

当然是.aux

\relax 
\abx@aux@refcontext{nty/global//global/global}
\@writefile{toc}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lof}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{lot}{\boolfalse {citerequest}\boolfalse {citetracker}\boolfalse {pagetracker}\boolfalse {backtracker}\relax }
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {chapter}{\numberline {1}Chap}{1}\protected@file@percent }
\@writefile{lof}{\defcounter {refsection}{0}\relax }\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\defcounter {refsection}{0}\relax }\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {section}{\numberline {1.1}Test}{1}\protected@file@percent }
\@writefile{toc}{\defcounter {refsection}{0}\relax }\@writefile{toc}{\contentsline {subsection}{\numberline {1.1.1}Test}{1}\protected@file@percent }

biblatex加载,同一来源产生了直接的结果.toc

\contentsline {chapter}{Contents}{i}% 
\contentsline {chapter}{\chapternumberline {1}Chap}{1}% 
\contentsline {section}{\numberline {1.1}Test}{1}% 
\contentsline {subsection}{Test}{1}%   

笔记:book对于文档类 ,也会发生同样的事情memoir。如果[backend=bibtex]使用选项biblatex而不是默认的 ,也会发生同样的事情biber

问题出处:

\defcounter...当同时生成简短和详细的目录时,中间的几行会很麻烦,就像在答案中一样https://tex.stackexchange.com/a/513455/13492memoir + biblatex + 2 TOCs 错误

可能相关: https://tex.stackexchange.com/a/53972/13492

答案1

更新

biblatexv3.17 使用一种新方法来处理辅助文件中所需的“初始化”,这意味着biblatex不再将其自己的行写入这些文件。

https://github.com/plk/biblatex/issues/1116https://github.com/plk/biblatex/pull/1166https://github.com/josephwright/siunitx/issues/408了解一些背景信息。

biblatex当涉及辅助文件时,这将使它更加可预测。

使用 v3.17 及更高版本,.toc文件将按所需方式显示

\contentsline {chapter}{Contents}{i}{}%
\contentsline {chapter}{\chapternumberline {1}Chap}{1}{}%
\contentsline {section}{\numberline {1.1}Test}{1}{}%
\contentsline {subsection}{Test}{1}{}%

旧答案

总结

biblatex生成了\defcounter{refsection}中的行,.toc以便能够正确地获取refsection目录中 chapter/section/... 标题中的引用的成员资格。如果您 (i) 不使用s 或 (ii) 不在 chapter/section/... 标题中引用,则\addtocontents可以删除相关补丁而不会产生负面影响。refsection


我将首先解释一种撤消添加此命令biblatex的补丁的方法,然后我们可以看一个例子来说明为什么这个补丁是必要的。\addtocontents\defcounter

biblatex补丁\addtocontents位于钩子中,因此如果我们想撤消补丁,一种可能性是先\AtEndPreamble钩住以保存原始定义,然后再在完成后恢复定义。\AtEndPreamblebiblatex\addtocontentsbiblatex

简洁地写成

\makeatletter
\usepackage{etoolbox}
\AtEndPreamble{\let\murray@saved@addtocontents\addtocontents}

\usepackage[backend=biber, style=numeric, sorting=none]{biblatex}

\AtEndPreamble{\let\addtocontents\murray@saved@addtocontents}
\makeatother

然后按照 MWE 演示补丁的必要性

\documentclass{memoir}

\makeatletter
\usepackage{etoolbox}
\AtEndPreamble{\let\murray@saved@addtocontents\addtocontents}

\usepackage[backend=biber, style=numeric, sorting=none]{biblatex}

\AtEndPreamble{\let\addtocontents\murray@saved@addtocontents}
\makeatother

\addbibresource{biblatex-examples.bib}

\usepackage{kantlipsum}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\begin{refsection}
\chapter{Chap}
\kant[1] \autocite{sigfridsson,worman}
\section{Test \autocite{sigfridsson}}
\kant[1] 
\subsection{Test}
\kant[1]
\printbibliography
\end{refsection}

\begin{refsection}
\chapter{Chap}
\kant[1] \autocite{geer,sigfridsson}
\section{Test \autocite{sigfridsson}}
\kant[1] 
\subsection{Test}
\kant[1]
\printbibliography
\end{refsection}

%\autocite{geer,nussbaum,sigfridsson}
\end{document}

生产

目录中未定义的引用

refsection如果您的文档包含不同的s,那么补丁就变得很重要。 refsections 彼此完全分开,每个 s 都包含自己的引文和参考书目。 然后,当您在 chapter/section/... 标题中引用条目并且该标题转到 ToC 时,引文不再在原始内容中refsection(ToC 不需要以refsection与原始引文相同的方式打印:事实上,在每章 s 中这种情况很少发生refsection),并且biblatex不知道引文属于哪里。 在这个例子中,这意味着biblatex简单地放弃。

\autocite{geer,nussbaum,sigfridsson}如果在末尾取消注释,则会看到另一个不良影响。目录中的引用编号为“[3]”,但在章节标题中的编号为“[1]”和“[2]”。

目录中的引用为[3]。

在其他设置中,效果可能不太明显,但只要您的文档包含多个refsections 并且您在章节/部分/...标题中引用某些内容,就需要修补以确保引用在目录中正确显示。


biblatex并不是唯一一个将上下文信息插入到.toc文件中的包。

以下面的babel例子为例(也提到了成本加运费 在评论中

\documentclass{article}

\usepackage{xcolor}
\usepackage[british,dutch,naustrian,ngerman]{babel}

\def\month{1}% we need january where German German and Austrian German differ
\begin{document}
\tableofcontents

\begin{otherlanguage}{british}
\section{\protect\today}
\end{otherlanguage}

\section{\protect\today}

\begin{otherlanguage}{naustrian}
\section{\protect\textcolor{red}{\protect\today}}
\end{otherlanguage}

\begin{otherlanguage}{dutch}
\section{\protect\today}
\end{otherlanguage}
\end{document}

包含不同语言日期标题的目录。

为了能够正确识别语言以及每个标题中的预期日期格式,babel将语言信息添加到.toc

\babel@toc {ngerman}{}
\babel@toc {british}{}
\contentsline {section}{\numberline {1}\today }{1}% 
\babel@toc {ngerman}{}
\contentsline {section}{\numberline {2}\today }{1}% 
\babel@toc {naustrian}{}
\contentsline {section}{\numberline {3}\textcolor {red}{\today }}{1}% 
\babel@toc {ngerman}{}
\babel@toc {dutch}{}
\contentsline {section}{\numberline {4}\today }{1}% 
\babel@toc {ngerman}{}

polyglossia功能相同,但.toc看起来更复杂(使用即将推出的polyglossia版本 v1.45 进行测试,因为早期版本在这里做得不够,请参阅https://github.com/reutenauer/polyglossia/issues/205)。

\selectlanguage *{german}
\bgroup 
\selectlanguage *{english}
\contentsline {section}{\numberline {1}\today }{1}% 
\egroup 
\selectlanguage *{german}
\contentsline {section}{\numberline {2}\today }{1}% 
\bgroup 
\selectlanguage *[variant=austrian]{german}
\contentsline {section}{\numberline {3}\textcolor {red}{\today }}{1}% 
\egroup 
\selectlanguage *{german}
\bgroup 
\selectlanguage *{dutch}
\contentsline {section}{\numberline {4}\today }{1}% 
\egroup 
\selectlanguage *{german}

因此,您实际上不能依赖.toc文件仅包含\contentsline行而没有任何中间内容。


对于你的凶手来说,情况会变得更糟memoir + biblatex + 2 TOCs 错误.toc.比较

\documentclass{memoir}

\usepackage{kantlipsum}
%\usepackage{hyperref}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\chapter{Chap}
\kant[1]
\section{Test}
\kant[1] 
\subsection{Test}
\kant[1]

\chapter{Chap}
\kant[1]
\section{Test}
\kant[1] 
\subsection{Test}
\kant[1]
\end{document}

没有hyperref

\contentsline {chapter}{Contents}{i}% 
\contentsline {chapter}{\chapternumberline {1}Chap}{1}% 
\contentsline {section}{\numberline {1.1}Test}{1}% 
\contentsline {subsection}{Test}{1}% 
\contentsline {chapter}{\chapternumberline {2}Chap}{3}% 
\contentsline {section}{\numberline {2.1}Test}{3}% 
\contentsline {subsection}{Test}{3}% 

.tochyperref

\contentsline {chapter}{Contents}{i}{section*.1}% 
\contentsline {chapter}{\chapternumberline {1}Chap}{1}{chapter.1}% 
\contentsline {section}{\numberline {1.1}Test}{1}{section.1.1}% 
\contentsline {subsection}{Test}{1}{section*.2}% 
\contentsline {chapter}{\chapternumberline {2}Chap}{3}{chapter.2}% 
\contentsline {section}{\numberline {2.1}Test}{3}{section.2.1}% 
\contentsline {subsection}{Test}{3}{section*.3}% 

要改变的参数数量!这意味着如果您不知道是否已加载,\contentsline您甚至无法确定要吞噬多少个参数。hyperref

相关内容