\def\Command#1{\def\command{#1}} - 为什么?

\def\Command#1{\def\command{#1}} - 为什么?

我正在处理一个专有的 .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扩展为标题。这样会稍微好一些,因为包含该@字符的命令名称受到保护:如果您使用它们时没有“转义”,则会收到错误。]

相关内容