我正在一点一点地研究类文件,以了解如何修改它以满足我的需求,但我对某些定义理解有困难。在文件中我有这个命令,它允许我写引用:
\def\@SchCita{}
\newcommand{\scholarlycitation}[2]{%
\def\@SchCita{%
\begin{flushright}
\vspace{20pt}
\begin{minipage}{0.475\textwidth}
\fontsize{9}{12}%
\usefont{T1}{bch}{m}{it}%
\color{black}%
\selectfont%
#1\\%
\fontsize{9}{12}%
\usefont{T1}{bch}{b}{n}%
\color{DarkRed}%
\selectfont{\color{DarkGoldenrod}\hrulefill}~#2%
\end{minipage}\vspace{-10pt}%
\end{flushright}%
}%
}
第一行有这个定义
\def\@SchCita{}
然后,在 \scholarlycommand 定义中,这个 \def\@SchCita{} 再次出现,但其 {} 内包含大量代码。当您使用 \def 定义某些内容而括号内没有替换文本时会发生什么?看起来 SchCita 被定义了两次。这是为什么?还有...为什么是 @ 符号?你能帮我吗?
非常感谢。
答案1
我同意约翰内斯·B这段代码很奇怪,最好完全避免。\def
在 LaTeX 中也应该尽可能避免。而且,在这里很容易避免,所以最好避免。
@
通常用于将宏标记为“内部”。也就是说,它不是应直接在文档中使用的宏,也不是人们应该指望将来以相同方式运行的宏。它是类作为其用户界面的一部分提供的宏的实现的一部分。
在文档中,@
如果不将其类别代码更改为字母,则不能将其用于宏名称中。但是,在读取类和包文件时,LaTeX 默认将其视为字母,从而允许将其用于内部宏的名称中。
当你在文档的序言中看到代码时
\makeatletter
...
\makeatother
这是为了临时切换类别代码@
,允许将其用于宏名称中,就好像代码在类或包文件中而不是文档中一样。这通常用于重新定义宏,例如,使其行为不同或解决问题。
在问题中显示的代码中
\def\@SchCita{}
确保\@SchCita
默认情况下已定义。如果没有此定义,则宏可能未定义,因为只有在\scholarlycitation{}{}
使用时才会构造实质性定义。据推测,\scholarlycitation{}{}
是用户将在文档中发出的内容。\scholarlycitation{}{}
使用传递给它的两个参数来重新定义\@SchCita
,然后可能由其他代码使用,如类文件中所指定。
\@SchCita
提供默认定义可确保在用户使用之前调用时不会发生错误\scholarlycitation{}{}
。