我正在尝试通过标题包来更改标题的字体和大小。
在文档中,描述现在\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
接受参数。此参数删除了原始定义范围。