该titling
包允许用户自定义文档标题的外观,包括多个标题等。除了允许自定义之外\maketitle
,它还定义了一个新环境,titlingpage
类似于但允许在环境中titlepage
使用来排版标题、作者、日期等。\maketitle
以下是基于手册第 5 页代码的示例:
\documentclass{article}
\usepackage{titling}
\title{Title}
\author{Author}
\begin{document}
\begin{titlingpage}
\setlength{\droptitle}{30pt}% lower the title
\maketitle
A few words\dots
\begin{abstract}A few more words\dots\end{abstract}
\end{titlingpage}
\end{document}
在尝试回答这个问题,我尝试使用titlingpage
排版标题以下首先要排版的图像。当这失败时,我对上述示例进行了以下修改:
\documentclass{article}
\usepackage{titling}
\title{Title}
\author{Author}
\begin{document}
\begin{titlingpage}
A few words\dots
\setlength{\droptitle}{30pt} % lower the title
\maketitle
\begin{abstract}A few more words\dots\end{abstract}
\end{titlingpage}
\end{document}
这不是我根据文档所预期的......
显然,可以使用titlingpage
,例如titlepage
,将标题排版到此处的其他内容下方。但我不知道该怎么做使用\maketitle
。
这是错误还是功能?无论如何,有解决方法吗?(如果是功能,这是文档中的错误吗?!)
请注意,在第 4 页,手册对\maketitle
“本质上”的定义如下:
\renewcommand{\maketitle}{%
\vspace*{\droptitle}
\maketitlehooka
{\pretitle \title \posttitle}
\maketitlehookb
{\preauthor \author \postauthor}
\maketitlehookc
{\predate \date \postdate}
\maketitlehookd
}
所以,再说一次,没有任何迹象表明这\maketitle
本身将开启新的一页——特别是在titlingpage
环境方面。
我认为这不是它真正的定义方式。(事实上,当该titlepage
选项未激活且文档处于单列模式时,实际代码包含一个可疑的newpage
...)
我觉得titlingpage
应该做类似的事情
\let\oldnewpage\newpage
\let\newpage\relax
和
\let\newpage\oldnewpage
在环境的开始和结束时,如果titlingpage
要像宣传的那样工作。(但我确信这个特定的建议要么根本不起作用,要么有可怕的副作用,或两者兼而有之。)
答案1
正如您所怀疑的,问题出在\newpage
,不只是其中一个,而是有两个\newpage
对上述行为负责。
\maketitle
这是包含在中的定义titling.sty
:
\providecommand{\maketitle}{}
\if@titlepage
\renewcommand{\maketitle}{\begin{titlepage}%
\let\footnotesize\small
\let\footnoterule\relax
\let \footnote \thanks
\@bsmarkseries
\def\@makefnmark{\rlap{\@textsuperscript{%
\normalfont\@bsthanksheadpre \tamark \@bsthanksheadpost}}}%
\long\def\@makefntext##1{\makethanksmark ##1}
\null\vfil
\vskip 60\p@
\vspace*{\droptitle}
\maketitlehooka
{\@bspretitle \@title \@bsposttitle}
\maketitlehookb
{\@bspreauthor \@author \@bspostauthor}
\maketitlehookc
{\@bspredate \@date \@bspostdate}
\maketitlehookd
\par
\@thanks
\vfil\null
\end{titlepage}%
\@bscontmark % \setcounter{footnote}{0}%
%%% \@bsmtitlempty
} % end titlepage defs
\else
\renewcommand{\maketitle}{\par
\begingroup
\@bsmarkseries
\def\@makefnmark{\rlap{\@textsuperscript{%
\normalfont\@bsthanksheadpre \tamark \@bsthanksheadpost}}}%
\long\def\@makefntext##1{\makethanksmark ##1}
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@
\@maketitle
\fi
\thispagestyle{plain}\@thanks
\endgroup
\@bscontmark % \setcounter{footnote}{0}%
%%% \@bsmtitlempty
} % end non-titlepage
\def\@maketitle{%
\newpage
\null
\vskip 2em%
\vspace*{\droptitle}
\maketitlehooka
{\@bspretitle \@title \@bsposttitle}
\maketitlehookb
{\@bspreauthor \@author \@bspostauthor}
\maketitlehookc
{\@bspredate \@date \@bspostdate}
\maketitlehookd
\par
\vskip 1.5em}
\fi
基本上,我们有一个条件测试@titlepage
;因为在您的情况下这是错误的(默认article.cls
设置\@titlepagefalse
),我们可以转到\else
重新定义的部分\maketitle
,如果双列模式未处于活动状态(默认情况下),则具有\newpage
:
\else
\newpage
\global\@topnum\z@
\@maketitle
\fi
在调用之前,\@maketitle
它又定义为
\def\@maketitle{%
\newpage
\null
\vskip 2em%
\vspace*{\droptitle}
\maketitlehooka
{\@bspretitle \@title \@bsposttitle}
\maketitlehookb
{\@bspreauthor \@author \@bspostauthor}
\maketitlehookc
{\@bspredate \@date \@bspostdate}
\maketitlehookd
\par
\vskip 1.5em}
其中有另一个\newpage
命令。这些命令负责您注意到的行为。
为了避免这种情况,一种可能性是修补\maketitle
和 \@maketitle
抑制\newpage
s:
\documentclass{article}
\usepackage{titling}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@maketitle}
{\newpage}
{}
{}
{}
\patchcmd{\maketitle}
{\newpage}
{}
{}
{}
\makeatother
\title{Title}
\author{Author}
\begin{document}
\begin{titlingpage}
A few words\dots
\setlength{\droptitle}{30pt} % lower the title
\maketitle
\begin{abstract}A few more words\dots\end{abstract}
\end{titlingpage}
\end{document}
\newpage
标准类在 的定义中有\@maketitle
,因此我猜包的作者将其保留为一个特性,尽管您的示例使用可能表明这些\newpage
s 命令最好保留为可选的而不是硬编码的。