为什么我可以重新定义 \maketitlehooka 但不能将其作为参数传递给 titleling 包中的 \pretitle ?

为什么我可以重新定义 \maketitlehooka 但不能将其作为参数传递给 titleling 包中的 \pretitle ?

我正在尝试通过标题包来更改标题的字体和大小。

在文档中,描述现在\maketitle看起来像这样:

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

并且\pre&\post宏可用于更改标题的排版。 也\maketitlehookX可用于添加内容或更改格式。 我注意到,\pre\post宏似乎仅在我明确创建一个组或一个我在其中进行工作的环境时才起作用(无论是更改格式还是向标题添加一些额外文本)。 但是,如果我将文本或格式作为参数添加到宏中,\pretitle我会收到错误:

LaTeX Error: \begin{titlepage} on input line 9 ended by \end{center}.

但是,如果我\renewcommand\maketitlehooka使用相同的文本/格式,它就可以正常工作。我想问题是重新定义所述宏和将相同代码作为参数传递之间有什么不同?或者为什么我需要明确地在{...}已经包围pre/post title-group 的范围内启动一个组?

一个最小的工作示例:

\documentclass[12pt,twoside]{report}
\usepackage{titling}    % taking control over the title format
%\renewcommand\maketitlehooka{\sffamily\bfseries} % Works
%\pretitle{\sffamily\bfseries} % Does not work
\pretitle{\begingroup\sffamily\bfseries} % This also works, kind of
\posttitle{\endgroup} % but needs this and will mess up some other formating
\title{The title}
\begin{document}
\maketitle
\end{document}

值得注意的是,重新定义\maketitlehooka只需要进行一些小的更改就可以让它看起来像我想要的那样,而使用\begingroup\endgroup则会刷新所有内容并重置字体大小。所以\begingroup\endgroup可能不是我想要在这里使用的。

答案1

这是因为默认定义\pretitle\posttitle。它们在包加载时的定义(来自titling.dtx

\pretitle{\begin{center}\LARGE}
\posttitle{\par\end{center}\vskip 2em}

因此,更新\pretitle

\pretitle{\sffamily\bfseries}

留下一个未配对的\end{center},这\posttitle会导致问题。因此,你要么需要重新定义两个都,或添加格式作为其中的一部分。以下是一些选项:

  • 将内容附加到\@bspretitle- 保存传递给以下内容的宏\pretitle

    \makeatletter
    \g@addto@macro\@bspretitle{\sffamily\bfseries}
    \makeatother
    
  • 完全重新定义\pretitle但包含原始

    \pretitle{\begin{center}\LARGE\sffamily\bfseries}
    
  • 更新两个都 \pretitle如果\posttitle您想删除center环境和\LARGE格式:

    \pretitle{\sffamily\bfseries}
    \posttitle{}
    

    这里不需要群,因为群在 的定义中已经建立\maketitle.

  • 更新\maketitlehooka以将内容插入到适当的位置:

    \makeatletter
    \renewcommand{\maketitlehooka}[1]{{%
      \@bspretitle
      \sffamily\bfseries
      \@title
      \@bsposttitle
    }}
    \makeatother
    

    注意附加组限制了格式化的范围。这是因为我们重新定义了\maketitlehooka接受参数。此参数删除了原始定义范围。

相关内容