问题
装载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/13492到
memoir + biblatex + 2 TOCs 错误。
答案1
更新
biblatex
v3.17 使用一种新方法来处理辅助文件中所需的“初始化”,这意味着biblatex
不再将其自己的行写入这些文件。
看https://github.com/plk/biblatex/issues/1116和https://github.com/plk/biblatex/pull/1166也https://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
钩住以保存原始定义,然后再在完成后恢复定义。\AtEndPreamble
biblatex
\addtocontents
biblatex
简洁地写成
\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,那么补丁就变得很重要。 refsection
s 彼此完全分开,每个 s 都包含自己的引文和参考书目。 然后,当您在 chapter/section/... 标题中引用条目并且该标题转到 ToC 时,引文不再在原始内容中refsection
(ToC 不需要以refsection
与原始引文相同的方式打印:事实上,在每章 s 中这种情况很少发生refsection
),并且biblatex
不知道引文属于哪里。 在这个例子中,这意味着biblatex
简单地放弃。
\autocite{geer,nussbaum,sigfridsson}
如果在末尾取消注释,则会看到另一个不良影响。目录中的引用编号为“[3]”,但在章节标题中的编号为“[1]”和“[2]”。
在其他设置中,效果可能不太明显,但只要您的文档包含多个refsection
s 并且您在章节/部分/...标题中引用某些内容,就需要修补以确保引用在目录中正确显示。
biblatex
并不是唯一一个将上下文信息插入到.toc
文件中的包。
\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}%
与.toc
hyperref
\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