![xpretocmd:为什么我的论点不起作用?](https://linux22.com/image/374996/xpretocmd%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%E8%AE%BA%E7%82%B9%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我只是试图跟踪我当前的章节名称,因为我在文档中使用首字母来命名某些名称,所以我编写了此代码来保存它:
\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}