我一直在使用一些样式文件来撰写我的论文,它包含一些我似乎不明白的奇怪的宏定义,具体来说,它包含以下代码来制作自定义标题页:
\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@field
为value
。 稍后您可以随时使用\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}