了解 \maketitle 的自定义定义

了解 \maketitle 的自定义定义

我一直在使用一些样式文件来撰写我的论文,它包含一些我似乎不明白的奇怪的宏定义,具体来说,它包含以下代码来制作自定义标题页:

\let\origin@lmaketitle\maketitle
\def\makethesistitle{
  \def\@titlehead{\centering\st@logo\\\smallskip\large\st@university}
  \def\@title{\st@title}
  \def\@subject{\@fordegree\\\st@subject}
  \def\@author{{\normalsize\@by}\\{\st@author} \\[1.5\bigskipamount]%
    {\normalsize\@undersup}\\{\itshape\st@supervisor}%
    \\[1.5\bigskipamount]}
\def\@date{\ifdefined\st@date\st@date\else\if@Latin\latintoday\else\today\fi\fi}
  \origin@lmaketitle
  \newcommand\date[1]{\def\st@date{##1}}
  \newcommand\title[1]{\def\st@title{##1}}
  \newcommand\author[1]{\def\st@author{##1}}
  \newcommand\subject[1]{\def\st@subject{##1}}}

\renewcommand\date[1]{\def\st@date{#1}}
\renewcommand\title[1]{\def\st@title{#1}}
\renewcommand\author[1]{\def\st@author{#1}}
\renewcommand\subject[1]{\def\st@subject{#1}}
\newcommand\logo[1]{\def\st@logo{#1}}
\newcommand\university[1]{\def\st@university{#1}}
\newcommand\supervisor[1]{\def\st@supervisor{#1}}
\def\@undersup{\if@Latin Supervisor\else استاد راهنما\fi}
\def\@by{\if@Latin By\else نگارش\fi}
\def\@fordegree{\if@Latin B.Sc Thesis\else پایان‌نامه کارشناسی\fi}

然后照常使用这些命令来定义该页面的内容:

\begin{document}
\logo{\includegraphics{logo}}
\date{
today
}
\title{
some title
}
\author{
me
}
\university{%
there
}
\subject{%
that
}
\supervisor{
you
}
\frontmatter \makethesistitle

由于样式定义似乎只是定义定义新宏的宏,我不太明白这里发生了什么。这段代码似乎没有问题,因为它输出的正是它应该输出的内容。如果有人能给我一点启发,我将不胜感激。

答案1

使用模式定义的各种命令:

\renewcommand\field[1]{\def\st@field{#1}}

只需介绍一种将字段值存储在\st@field稍后可以使用的相应宏中的方法。 写入的效果\field{value}是定义\st@fieldvalue。 稍后您可以随时使用\st@field来排版value

这些值的实际排版是在\makethesistitle宏中进行的。

具体来说,开头的\makethesistitle调用which 被设为 which,大概就是最终标题页中各个元素的排版位置。\origin@lmaketitle\maketitle\st@field

例如:

\renewcommand\title[1]{\def\st@title{#1}}
\renewcommand\subtitle[1]{\def\st@subtitle{#1}}

\def\maketitle{
   Thesis\vfill
   \begin{center}
      \bfseries
      \complete@title
   \end{center}
   \vfill
}
\def\makethesistitle{
   \def\complete@title{\LARGE\st@title\\\large\st@subtitle}
   \maketitle
}

当你在文档中写下

\title{Bla}
\subtitle{blabla}
\makethesistitle

你大致得到

\def\st@title{Bla}
\def\st@subtitle{#1}
\def\complete@title{\LARGE\st@title\\\large\st@subtitle}
   Thesis\vfill
   \begin{center}
      \bfseries
      \complete@title
   \end{center}
   \vfill

如您所见,中间宏的定义只是为实际排版做准备。如果您重复使用相同的信息(例如作者姓名)来设置文档的其他部分(如标题等),这将特别有用。

这里还有一个方面。在您提供的代码中,类编写者正在重用 的一些默认实现\maketitle。由于您使用的类引入了默认情况下未知的非标准字段\maketitle(在标准类中仅使用\@title\@author\@date),因此宏将根据类定义的自定义前缀宏\makethesistitle来设置默认使用的宏。(例如,您会看到)。\maketitle\st@\def\@title{\st@title}

相关内容