我正在处理一个专有的 .cls 文件,它有很多结构,其工作原理如下:大写宏(虚构的,不存在于加载的包中)被定义为该宏的小写版本(也是虚构的)。然后,该宏随后用于定义或(重新)新建其他内容,与包有关或仅用于布局。 - 我的问题有三点:
- 这个语法为什么
\def\MyCoverText#1
有效? - 我读过这的描述\def
,它似乎不允许非括号封装的第一个参数,所以我认为它需要\def\MyCoverText[#1]
- 这个构造的优点是什么
\def\C#1{\def\c{#1}}
?我尝试用命令的直接 def 替换它,它似乎像以前一样工作。 - C->c 有没有一个名称,或者说 C#1 而不是 C[#1] 的做法?
.cls 文件:
\ProvidesClass{myclass}[My class]
\LoadClass[10pt]{article}
\def\MyCoverText#1{\def\mycovertext{#1}}
\MyCoverText{Hello World}
% i replaced the two above lines by:
% \def\mycovertext{Hello World}
% to no obvious ill effect
\newcommand{\mycover}{
\thispagestyle{empty}
\newpage\null\vskip 3em%
\begin{center}
\mycovertext
\end{center}%
}
.tex 文件:
\documentclass{../myclass}
\begin{document}
\mycover
\end{document}
编辑:关于我对 \def 的困惑,受 David Carlisles 的评论启发,我发现这,它提供了许多不同的 \def 语法版本及其功能。非常有用的东西
答案1
这种模式最常见的用法如下:
\def\Title#1{\def\title{#1}}
现在\Title{This is a title}
定义\title
为“这是一个标题”。也就是说,您有一个扩展到文档标题的命令,我相信您会同意这是一件有用的事情。重要的是要注意,LaTeX 区分大小写,因此\Title
和\title
是完全不同的命令,即使它们的名称可能暗示不同。
OP 中的\MyCoverText
和三元\mycovertext
组类似。初始定义为“Hello World”,因此现在扩展为:\mycover
\MyCoverText{Hello World}
\mycovertext
\mycover
\thispagestyle{empty}
\newpage\null\vskip 3em%
\begin{center}
Hello World
\end{center}%
如果您愿意,\MyCoverText
是一个“setter”命令,\mycovertext
“是一个“getter”命令 - 并且\mycover
是一个具有一些附加格式的getter。
[在 LaTeX 内部,通常发生的情况更像是\def\title#1{\def\@title{#1}
将其\@title
扩展为标题。这样会稍微好一些,因为包含该@
字符的命令名称受到保护:如果您使用它们时没有“转义”,则会收到错误。]