我正在处理一个类文件,试图根据我的需求进行调整,在它的中间某处定义了一个函数,用于写入论文的标题。我得到的是:
\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
包含负间距、低级字体调用和不需要的空格标记只是可怕如果您正在学习乳胶,那么您真的不应该从这样的代码中学习!