我想知道\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
(如果有)也在 中排版\large
。center
环境结束并插入 1.5em 的垂直跳跃。重要的是,没有插入分页符。因此,如果下一个文档元素是环境abstract
,LaTeX 将尝试将摘要放入已经包含标题、作者和日期元素的页面上。