在类文件中定义命令的顺序如何改变输出?

在类文件中定义命令的顺序如何改变输出?

我正在处理一个类文件,试图根据我的需求进行调整,在它的中间某处定义了一个函数,用于写入论文的标题。我得到的是:

\title{
\vspace{-30pt}
\begin{flushleft}
\HorRule
\\
\fontsize{35}{40}
\usefont{T1}{phv}{b}{n}
\color{titlecolor}
\@TheTitle
\\
\end{flushleft}
}

\renewcommand{\title}[2]{\def\@TheTitle{#1}\def\@ShortTitle{#2}}

让我们从最后一行代码开始。它定义了一个\title带有两个参数的命令。当您\title.tex文件中调用时,它的作用是在文件中定义两个文本替换.cls\@ShortTitle将在页脚和\@TheTitle标题中使用。现在,回到第一个代码块,它调用一个\title使用存储在中的值的函数\@TheTitle。我的疑问是:如何\title在定义之前(在代码的最后一行)调用它?它如何使用尚未定义的东西(\@TheTitle)?

我试图越过界线

\renewcommand{\title}[2]{\def\@TheTitle{#1}\def\@ShortTitle{#2}}

到代码的开头,但它就是不工作。发生了什么事?

答案1

典型的文档类仅将 的内容存储\title在宏中,比如\@title。此过程的常见步骤类似于

\def\title#1{\def\@title{#1}}

这样,用户就可以\title在前言中指定(比如说),然后只在稍后发出\maketitle(在document环境中)来设置标题。每当调用时\title,它都可以包含任何可能存在或不存在的“垃圾”——只有当您实际通过设置标题时,问题(未定义的控制序列)才会显现出来\maketitle

因此,就您而言,\title可能仅像通常的类一样将其内容存储在其中\@title,即使\@TheTitle在调用时未定义\title。当您的文档类的用户调用时\title,它会使用重新定义的版本,该版本设置和\title的值。\@TheTitle\@ShortTitle

这种排序的原因可能是为了确保默认\title过程(通过 设置\maketitle)在传统意义上仍然可用。一个问题可能是\title通常只接受一个参数,而重新定义显然需要两个强制参数。

答案2

您(再次)仅发布了片段,而不是可重现的测试用例,因此无法给出完整的答案,但是

我的疑问是:\title在定义它之前(在代码的最后一行)怎么能被调用呢?

线索就在最后一行

\renewcommand{\title}..

这不是一个定义\title关于定义。这必然意味着必须已经定义(可能具有不同的定义),并且正是在片段开头的\title调用中使用的(未显示的)定义。\title

先前未显示的定义大概是\title用一个参数而不是两个参数来定义的,看看这里的用法。

与您的问题无关,但使用\title 包含负间距、低级字体调用和不需要的空格标记只是可怕如果您正在学习乳胶,那么您真的不应该从这样的代码中学习!

相关内容