我想定义一个通用的\subtitle
宏,它只是添加到\@title
用户级设置的宏中\title
。这是我得到的:
\documentclass{article}
\RequirePackage{xparse,expl3}
\makeatletter\ExplSyntaxOn
\NewDocumentCommand \subtitle { m }
{
\cs_set:Npx \@title
{\@title\\[.5ex]\large#1}
}
\ExplSyntaxOff\makeatother
\title{A New Chapter}
\subtitle{In This Short Book}
\begin{document}
\maketitle
Blah
\end{document}
这应该定义一个接受一个强制参数的文档命令。然后,它会完全扩展和\subtitle
的当前值,并将扩展值设置为,从而有效地将字幕附加到其中。不幸的是,这会引发错误\@title
\\[.5ex]\large#1
\@title
ERROR: Undefined control sequence.
--- TeX said ---
\\ ->\let \reserved@e
\relax \let \reserved@f \relax \@ifstar {\let \reserv...
l.12 \subtitle{In This Short Book}
--- HELP ---
TeX encountered an unknown command name. You probably misspelled ...
为什么我会收到这个错误?更重要的是,我该如何修复它?
答案1
代表x
“穷举扩展”(请参阅手动的,第 2 页或第 13 页)。 对于\\
和来说,这似乎是个坏主意\large
。
我只需扩展\@title
一次并附加其余部分:
\expandafter \cs_set:Npn \expandafter \@title \expandafter
{ \@title \\[.5ex] \large #1 }
\tl_put_right:**
(或\appto
from etoolbox
) 宏无需 s 即可完成此操作\expandafter
。
我在这里使用:cn { @title }
,但显然您只需使用:Nn \@title
正确的 catcodes(即在包中)。
代码
\documentclass{article}
\RequirePackage{xparse,expl3}
\ExplSyntaxOn
\NewDocumentCommand \subtitle { m }{
\tl_put_right:cn { @title } % or \tl_put_right:Nn \@title with \makeatletter
{ \\[.5ex] \large #1 }
}
\ExplSyntaxOff
\title{A New Chapter}
\subtitle{In This Short Book}
\subtitle{And another line?}
\begin{document}
\maketitle
Blah
\end{document}