帮助理解自定义类中的定义

帮助理解自定义类中的定义

有人能帮忙解码底部的代码吗?请注意,该代码是我找到的论文自定义类的一部分。

具体来说: \def\@degreeyear{#1}\if@cyrset\else\def\@copyrightyear{#1}\fi

  1. 有人可以一步一步解释一下这一行的作用吗?
  2. \if@cyrset当它始终为假时, 其目的是什么?为什么不只是这样\def\@degreeyear{#1}\def\@copyrightyear{#1}\fi,尽管我仍然不知道它应该做什么?
  3. 为什么是\def\@degreeyear{\number\month}同月?
  4. 为什么\@degreeyear定义了两次?(作者在评论中说,当\degreeyear不使用时,使用当前年份。但即使\def\@degreeyear{\number\year}使用了,我仍然看不到条件逻辑)。
  5. 一般来说,\def结束定义在哪里(可能是空间?)?

代码:

\def\@degreeyear{\number\month}
\def\@degreemonth{\ifcase\month\or
  January\or February\or March\or April\or May\or June\or
  July\or August\or September\or October\or November\or December\fi}
\def\@copyrightyear{\number\year}
\newif\if@cyrset
\@cyrsetfalse
\newcommand{\degreeyear}[1]
   {\def\@degreeyear{#1}\if@cyrset\else\def\@copyrightyear{#1}\fi}
\newcommand{\degreemonth}[1]{\def\@degreemonth{#1}}
\newcommand{\copyrightyear}[1]{\def\@copyrightyear{#1}\@cyrsettrue}

答案1

该类为\@degreeyear\@degreemonth和定义了默认值\@copyrightyear。我不确定为什么\@degreeyear\number\month不是预期的\number\year,这可能是疏忽。

然后,它定义一个条件来区分版权年份是否由用户设置,并继续定义用于设置日期的用户级命令。

如果用户有

\degreeyear{2020}

则宏\@degreeyear定义为展开为2020。 的值\@copyrightyear不会改变,除非\if@cyrset为假。

如果用户有

\copyrightyear{2019}

然后\@copyrightyear设置为 2019 并\if@cyrset设置为 true。

\def替换文本中的命令在\newcommand{\degreeyear}定义被吸收时不执行,只有\degreeyear执行时才执行。

结果是,无论按何种顺序发出命令,都会得到正确的结果。不发出命令\copyrightyear将设置\@copyrightyear为与 相同的值\@degreeyear

让我们看看为什么。在类加载结束时,\if@cyrset返回 false 分支。我假设至少\degreeyear{2020}出现在文档序言中。有三种情况:

  1. 只是\degreeyear{2020}
  2. \degreeyear{2020}\copyrightyear{2019}
  3. \copyrightyear{2020}\degreeyear{2020}

在第一种情况下\@degreeyear,和\@copyrightyear都设置为 2020 年。

在第二种情况下,\degreeyear{2020}的操作与第一种情况相同,但后面的\copyrightyear{2019}命令会覆盖先前分配给 的值\@copyrightyear\@cyrsettrue位不执行任何操作。

在第三种情况下,\@copyrightyear设置为 2019 并且\if@cyrset设置为返回 true 分支。因此\degreeyear{2020}只会设置\@degreeyear并跳过设置为\@copyrightyear

这样做是为了避免要求用户按特定顺序指定\degreeyear\copyrightyear。后一个命令是可选的,因为如果没有给出,的设置\@copyrightyear将与的设置相同\@degreeyear

该类@大概会使用 -macros 来排版标题页。

相关内容