我想将 changebars 添加到 toc-entries。它实际上工作正常,但我必须在命令中禁用该命令\mark
(以便 changebar 稳定下来并停止日志文件中的“重新运行”消息)。下面的方法有效,但我想知道为什么我必须修补两个命令。为什么修补还不够\markboth
?
\documentclass{article}
\usepackage{etoolbox}
%must be before babel, as babel redefines markboth:
\patchcmd{\markboth}{\begingroup}{\begingroup\let\cbline\relax}{}{}
\pretocmd{\leftmark}{\let\cbline\relax}{}{}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{changebar}
\newcommand\cbline{}
\DeclareRobustCommand\cbline{\cbstart\cbend}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{\leftmark}
\begin{document}
\tableofcontents
\section[toc\cbline]{Document}
abc\cbline
\end{document}
编辑
修补有效时使用\def
而不是:\let
\markboth
\patchcmd{\markboth}{\begingroup}{\begingroup\def\cbline{}}{}{}
但我还是不明白为什么它需要\markboth
用作\let
标签和索引命令。
答案1
如果执行\let\cbline\relax
,则在写入操作中或在 中\edef
,\cbline
将被写为其本身。
因此使用\let
,TeX\cbline
在排版时会再次找到 标记并使用当前定义,即 ,\protect\cbline
从而变成\cbstart\cbend
。
随着\def\cbline{}
,\edef
将使\cbline
消失。
日志的相关部分如下\tracingmacros=1
:
和\def\cbline{}
\@arabic #1->\number #1
#1<-\c@section
\cbline ->
\@themark ->{\protect \foreignlanguage {ngerman}{\protect \bbl@restore@actives
\protect \MakeUppercase {1\hskip 1em\relax toc}}}{}
和\let\cbline\relax
\@arabic #1->\number #1
#1<-\c@section
\@themark ->{\protect \foreignlanguage {ngerman}{\protect \bbl@restore@actives
\protect \MakeUppercase {1\hskip 1em\relax toc\cbline }}}{}
可以看到,后者还是有的\cbline
。