定义 `\subtitle` 宏 - `\reserved@e` 未定义

定义 `\subtitle` 宏 - `\reserved@e` 未定义

我想定义一个通用的\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:**(或\apptofrom 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}

相关内容