我尝试重新定义\maketitle
命令,如下所示。
如果我在重新定义中使用可选参数,就会出现错误TeX capacity exceeded
。
有什么建议吗?
MNWE:
\documentclass{scrreprt}
\title{My Title}
\author{My Name}
\let\oldmaketitle\maketitle
\renewcommand{\maketitle}[1][]{%
\oldmaketitle
\rule{\textwidth}{1pt}
}
\begin{document}
\maketitle
\end{document}
答案1
\let
使用带有可选参数的命令(在 KOMA 类中用\maketitle
一个可选参数定义)可能会产生不良影响:你可以\LetLtxMacro
使用letltxmacro
改为包:
\documentclass{scrreprt}
\usepackage{letltxmacro}
\title{My Title}
\author{My Name}
\LetLtxMacro\oldmaketitle\maketitle
\renewcommand{\maketitle}[1][]{%
\oldmaketitle
\rule{\textwidth}{1pt}
}
\begin{document}
\maketitle
\end{document}
您的示例代码没有显示可选参数的用法。
答案2
这\maketitle
中的命令scrreprt
一个可选参数,因此用\let\oldmaketitle\maketitle
和重新定义它\renewcommand\maketitle
会使您面临一个非常大的问题,这在的文档中有很好的描述letltxmacro
。
如果你需要做的只是在末尾添加一些内容\maketitle
,那么安全的方法是使用xpatch
(或regexpatch
):
\usepackage{xpatch} % or \usepackage{regexpatch}
\xapptocmd{\maketitle}{\noindent\rule{\textwidth}{1pt}}{}{}
然而这惯于在日期下方添加规则。原因是使用默认选项\maketitle
会自行打印一页,规则将转到下一页;如果titlepage=false
在选项中指定,则\@maketitle
使用内部命令。
因此,为了获得日期以下的规则,更好的技巧是修补命令并在打印日期之后准确添加规则,方法是\@date
:
\documentclass{scrreprt}
\usepackage{xpatch} % or \usepackage{regexpatch}
\makeatletter
%% the following patch is for the `titlepage=true` option
\xpatchcmd{\maketitle}{\@date}{\@date\par\rule{\textwidth}{1pt}}{}{}
%% the following patch is for the `titlepage=false` option
\xpatchcmd{\@maketitle}{\@date}{\@date\par\rule{\textwidth}{1pt}}{}{}
\makeatother
\begin{document}
\title{My Title}
\author{My Name}
\maketitle
\end{document}