xpretocmd:为什么我的论点不起作用?

xpretocmd:为什么我的论点不起作用?

我只是试图跟踪我当前的章节名称,因为我在文档中使用首字母来命名某些名称,所以我编写了此代码来保存它:

\documentclass[12pt,a4paper]{scrreprt}
\usepackage{etoolbox}
\usepackage{xpatch}

\newcommand{\currentchapter}{Not set yet}

\xpretocmd{\chapter}
{%
    \renewcommand{\currentchapter}{#1}%
}{}{}

\begin{document}
\currentchapter
\chapter{Hello}
\currentchapter
\chapter{Goodbye}
\currentchapter

\end{document}

不幸的是,这只是打印:

Not set yet.
#1
#1

对于章节之间出现的 3 次命令。但我预期的输出将是:

Not set yet.
Hello
Goodbye

在其他人的代码中,这种参数的使用似乎有效,所以我不明白为什么它在这里不起作用。

答案1

\chapter命令不会获取参数,但首先要检查*或可选参数。

在标准类中,修补命令应该是\@chapter,但在 KoMa 类中则是\scr@@startchapter。如果你想修补它以保存标题,\currentchapter你可以这样做

\makeatletter
\xpretocmd{\scr@@startchapter}{\def\currentchapter{#3}}{}{}
\makeatother

完整示例:

\documentclass[12pt,a4paper]{scrreprt}
\usepackage{xpatch}

\newcommand{\currentchapter}{Not set yet}

\makeatletter
\xpretocmd{\scr@@startchapter}
  {\renewcommand{\currentchapter}{#3}}
  {}{}
\makeatother

\begin{document}
\currentchapter
\chapter{Hello}
\currentchapter
\chapter{Goodbye}
\currentchapter

\end{document}

是的,修补命令是一门暗黑艺术。

答案2

您可以修补\chapterlinesformat

\documentclass[12pt,a4paper]{scrreprt}
\usepackage{xpatch}
\xpretocmd\chapterlinesformat{\gdef\currentchapter{#3}}{}{\fail}
\newcommand{\currentchapter}{Not set yet}

\begin{document}
\currentchapter
\chapter{Hello}
\currentchapter
\chapter{Goodbye}
\currentchapter

\end{document}

在此处输入图片描述

相关内容