\chapter
我正在尝试通过重新定义例如来更改 memoir命令\afterchaptertitle
。我想开始一个新章节来更改 Latex 变量的值,以便下一章定义可以依赖于此变量。希望 MWE 能更好地澄清这一点:
\documentclass{memoir}
\newif\ifchanged
\changedfalse
\renewcommand{\afterchaptertitle}{
% The next line initially should print "false", from then on should print "true"
\small At this point, changed is \ifchanged true\else false\fi
% Set "changed" to true, so future calls will print "true"
\changedtrue
\\ % (looks weird without a newline)
}
\begin{document}
\chapter{Test} % Prints "At this point, changed is false" as expected
Text for the first chapter.
\chapter{Next} % Prints "At this point, changed is false" again, not as expected
Text for the second chapter
\end{document}
我原本希望第一个章节标题后面跟着“此时,更改是错误的”,第二个章节标题后面跟着“此时,更改是真实的”。但结果两者都显示为“错误”。
我觉得这与稳健性/缺失有关,\protect
但这超出了我对 Latex 的理解......
答案1
而‘罪魁祸首’就是\@makechapterhead
调用的命令\@chapter
,它基本上是该命令的背景\chapter
。
memoir
的版本\@makechapterhead
是
\def\@makechapterhead#1{%
\chapterheadstart% \vspace*{50\p@}%
{%\parindent \z@ \raggedright \normalfont
\parskip \z@
\parindent \z@ \memRTLraggedright \normalfont
\ifm@m@And
\printchaptername \chapternamenum \printchapternum
\afterchapternum % \par\nobreak \vskip 20\p@
\else
\printchapternonum
\fi
\interlinepenalty\@M
\printchaptertitle{#1} % \Huge \bfseries #1
\afterchaptertitle % \par\nobreak \vskip 40\p@
}}
其中显式组在 之后开始\vspace*{50\p@}%
并在 之后结束\afterchaptertitle
,因此“变量”状态的任何变化\ifchanged
都将是局部的,除非前面加上\global
。
我做了一个小版本来展示同样的问题,其中book
class where\foo
具有 的含义\chapter
并且\foostuff
是\@makechapterhead
。
\documentclass{book}
\newif\ifchanged
\changedfalse
\newcommand{\afterchaptertitle}{%
Chapter \small At this point, changed is \ifchanged true\else false\fi
\global\changedtrue%
}
\def\foostuff{%
{%
\afterchaptertitle%
}%
}
\def\foo#1{%
\foostuff%
#1%
}
\begin{document}
\foo{First chapter}
\foo{Second chapter}
\end{document}