'\maketitle' 如何工作?

'\maketitle' 如何工作?

我想知道\maketitle命令是如何工作的,因为我正在创建自己的类,我想使用自己的命令。例如,我已经创建了某些命令,如\a\b\c,我希望使用某个命令\printabc创建一个新页面来打印这些命令。

提前致谢

编辑 1:我尝试定义

\def\@mycover{%
    \newpage\null
}

但出现错误

! \@ 的使用与其定义不符。

编辑2:我取得了进展。

\documentclass{myclass}

\makeatletter
\newcommand*{\mytitle}[1]{\gdef\@mytitle{\MakeUppercase{#1}}}
\newcommand*{\myauthors}[5]{\gdef\@myauthors{
    \begin{tabular}{c}
        \MakeUppercase{#1} \\ 
        \MakeUppercase{#2} \\  
        \MakeUppercase{#3} \\
        \MakeUppercase{#4} \\
        \MakeUppercase{#5}
    \end{tabular}
}}
\newcommand*{\myafil}[5]{\gdef\@myafil{
    \begin{tabular}{c}
        \MakeUppercase{#1} \\ 
        \MakeUppercase{#2} \\  
        \MakeUppercase{#3} \\
        \MakeUppercase{#4} \\
        \MakeUppercase{#5}
    \end{tabular}
}}
\newcommand\makecover{\begin{titlepage}%
    \thispagestyle{empty}\centering\bfseries
    \@mytitle
    \vfill
    \@myauthors
    \vfill
    \@myafil
\end{titlepage}
\global\let\makecover\relax
\global\let\@mytitle\@empty
\global\let\@myauthors\@empty
\global\let\@myafil\@empty
\global\let\mytitle\relax
\global\let\myauthors\relax
\global\let\myafil\relax
}
\makeatother

\mytitle{The Title}
\myauthors{Author 1}{}{}{}{}
\myafil{University}{Faculty of exact and natural sciences}{Department of Mathematics}{City}{Year}

\begin{document}
\makecover
\end{document}

这没问题,但是当我评论例如

%\myauthors{作者 1}{}{}{}{}

出现以下错误

! 未定义的控制序列。

课本上没有发生的事情。为什么会发生这种情况?

答案1

假设您的文档类基于article文档类。以下定义\maketitle适用如果文档titlepage类别选项是不是放:

\newcommand\maketitle{\par
  \begingroup
    \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
    \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
    \long\def\@makefntext##1{\parindent 1em\noindent
            \hb@[email protected]{%
                \hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
    \if@twocolumn
      \ifnum \col@number=\@ne
        \@maketitle
      \else
        \twocolumn[\@maketitle]%
      \fi
    \else
      \newpage
      \global\@topnum\z@   % Prevents figures from going at top of page.
      \@maketitle
    \fi
    \thispagestyle{plain}\@thanks
  \endgroup
  \setcounter{footnote}{0}%
  \global\let\thanks\relax
  \global\let\maketitle\relax
  \global\let\@maketitle\relax
  \global\let\@thanks\@empty
  \global\let\@author\@empty
  \global\let\@date\@empty
  \global\let\@title\@empty
  \global\let\title\relax
  \global\let\author\relax
  \global\let\date\relax
  \global\let\and\relax
}

这是怎么回事呢?宏主要由两部分组成。

  • \begingroup在第一部分,即夹在和之间的内容中\endgroup,我们首先重置脚注的排版方式;大多数情况下,符号标记(星号、匕首等)用作脚注标记,而不是数字。接下来,LaTeX 检查是否twocolumn设置了文档类;如果答案为“否”,则\newpage执行指令,然后执行。(下面将更详细地检查\@maketitle的内容。)\@maketitle

  • 在第二部分中,footnote计数器被(重新)设置为 0,然后宏\thanks\maketitle\@maketitle\@thanks、、、、、和(它们都是在 LaTeX 内核中定义的)全部被取消设置。限定符\@author是必需的,否则指令将不会在当前组之外应用,当前组由上述指令启动。\@date\@title\title\author\date\and\global\let\xyz\relax\begingroup

结果是:宏\title\author、一旦运行\date就不能再次使用。您可能会问,取消设置这些宏的目的是什么?如果没有其他目的,此步骤可确保不能在文档中意外或故意地运行多次。\maketitle\maketitle

最后,这个宏是如何\@maketitle定义的?在 中article.cls,可以找到以下代码:

\def\@maketitle{%
  \newpage
  \null
  \vskip 2em%
  \begin{center}%
  \let \footnote \thanks
    {\LARGE \@title \par}%
    \vskip 1.5em%
    {\large
      \lineskip .5em%
      \begin{tabular}[t]{c}%
        \@author
      \end{tabular}\par}%
    \vskip 1em%
    {\large \@date}%
  \end{center}%
  \par
  \vskip 1.5em}

代码的大部分位于 和 之间\begin{center}\end{center}的参数\title通过 排版\@title,设置为\LARGE字体大小(比 大 72.7% \normalsize); 的参数\author在 的 1 列tabular环境中排版\large(比 大 20% \normalsize); 的参数\date(如果有)也在 中排版\largecenter环境结束并插入 1.5em 的垂直跳跃。重要的是,没有插入分页符。因此,如果下一个文档元素是环境abstract,LaTeX 将尝试将摘要放入已经包含标题、作者和日期元素的页面上。

相关内容