\posttitle 的参数有一个额外的 }

\posttitle 的参数有一个额外的 }

根据 texdoc回忆录课,第 63 和 64 页,通常的\maketitle命令是:

\newcommand{\maketitle}{%
  \vspace*{\droptitle}
  \maketitlehooka
  {\pretitle \title \posttitle}
  \maketitlehookb
  {\preauthor \author \postauthor}
  \maketitlehookc
  {\predate \date \postdate}
  \maketitlehookd
  \thispagestyle{title}
}

所以我认为输入那个来代替\maketitle应该可以。但是当我这样做时,我收到错误“\posttitle 的参数有一个额外的 }”。

以下是代码:

\documentclass{memoir}

\begin{document}

\title{Hello}

%\maketitle

\vspace*{\droptitle}
\maketitlehooka
{\pretitle \title \posttitle}
\maketitlehookb
{\preauthor \author \postauthor}
\maketitlehookc
{\predate \date \postdate}
\maketitlehookd
\thispagestyle{title}

\end{document}

答案1

(回忆录手册memman)第 63/64 页写道

The class provides a configurable \maketitle command. The \maketitle command
as defined by the class is essentially
\newcommand{\maketitle}{%
\vspace*{\droptitle}
\maketitlehooka
{\pretitle \title \posttitle}
\maketitlehookb
{\preauthor \author \postauthor}
\maketitlehookc
{\predate \date \postdate}
\maketitlehookd
\thispagestyle{title}
}

然而,真正的代码memoir.cls

\newcommand{\@maketitle}{%
  \let\footnote\@mem@titlefootkill
  \ifdim\pagetotal>\z@
    \newpage
  \fi
  \null
  \vskip 2em%
        \vspace*{\droptitle}
  \maketitlehooka
  {\@bspretitle \@title \@bsposttitle}
  \maketitlehookb
  {\@bspreauthor \@author \@bspostauthor}
  \maketitlehookc
  {\@bspredate \@date \@bspostdate}
  \maketitlehookd
  \par
  \vskip 1.5em}

其中\@maketitle实际上是在 内部 调用的\maketitle

事实上,\@bspretitle使用的是 etc.,而不是\pretitleetc,它们有类似的定义:

\newcommand{\pretitle}[1]{\def\@bspretitle{#1}}
\newcommand{\posttitle}[1]{\def\@bsposttitle{#1}}
\newcommand{\preauthor}[1]{\def\@bspreauthor{#1}}
\newcommand{\postauthor}[1]{\def\@bspostauthor{#1}}
\newcommand{\predate}[1]{\def\@bspredate{#1}}
\newcommand{\postdate}[1]{\def\@bspostdate{#1}}

现在,\pretitle等等是使用一个参数的宏,它们在内部定义类似的内容\@bspretitle,因此\pretitle等等不能在没有参数的情况下直接使用。

基本上,使用就足够了\pretitle{something}\posttitle{other thing},但我们必须小心处理,例如(也在手册的第 64 页)中的默认定义memoir

\pretitle{\begin{center}\LARGE}
\posttitle{\par\end{center}\vskip 0.5em}
\preauthor{\begin{center}
\large \lineskip 0.5em%
\begin{tabular}[t]{c}}
\postauthor{\end{tabular}\par\end{center}}
\predate{\begin{center}\large}
\postdate{\par\end{center}}

如果\posttitle{foo}不进行调整,\pretitle将会出错,因为\pretitle定义为\begin{center}基本上,所以会出现不封闭的center环境,从而导致编译错误。

此代码定义了一个以 开始的组\pretitle,其中 为,\bfseries以及一个以 结束的组,其中引入了\posttitle一些文本。\LARGE

\documentclass{memoir}

\begin{document}

\pretitle{\begingroup\bfseries}
\posttitle{ \LARGE This is from \textbackslash\texttt{posttitle} \endgroup}
\title{Hello}


%\maketitlehookb{\preauthor \author \postauthor{foobar}}
%\maketitlehookc{\predate \date \postdate{foodate}}
%\maketitlehookd{\thispagestyle{title}}


\maketitle

\vspace*{\droptitle}




\end{document}

在此处输入图片描述

答案2

\begin{center}在 的参数中,\pretitle使用\centering。同时\end{center}从 中删除\postitle。同样\centering\preauthor和 中添加\predate

相关内容