标题 (pkg):错误还是功能?(标题页中的 \maketitle 仅在页面中第一个文本时才有效)

标题 (pkg):错误还是功能?(标题页中的 \maketitle 仅在页面中第一个文本时才有效)

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}

<code>titlingpage</code> 环境

在尝试回答这个问题,我尝试使用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抑制\newpages:

\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,因此我猜包的作者将其保留为一个特性,尽管您的示例使用可能表明这些\newpages 命令最好保留为可选的而不是硬编码的。

相关内容