禁用标题栏中的 changebar 命令

禁用标题栏中的 changebar 命令

我想将 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

相关内容