也许这是一个愚蠢的问题...但我经常在代码中看到它的用法\csname
——尤其是在包中。有人能解释一下它的用途吗?
据我所知,它会根据一个参数生成一个新命令。
答案1
引用 TeXbook 第 213 页 [第 20 章“定义 (也称为宏)”的一部分]:
\csname ... \endcsname
。TeX 扩展时\csname
会读取匹配的\endcsname
,并在进行时扩展标记;扩展完成后,只应保留字符标记。然后,整个\csname ... \endcsname
文本的“扩展”将是一个控制序列标记,其定义为类似于\relax
其含义当前未定义。
从这个定义中我们可以得出以下几点:
而“普通”的 TeX 宏名必须由以下任一内容组成:恰好一个非字母字符——例如,,,
\,
和\!
——\/
或一个或多个字母(更准确地说,类别代码为“字母”(11)的字符,通常是A-Z
和a-z
)——例如,\relax
和\kern
——该\csname ... \endcsname
方法允许您创建可以包含字符的宏名称——包括空格和(孤立的)反斜杠字符——这些字符不受 TeX 语法规则的允许。该方法使用的主要限制是,和
\csname ... \endcsname
之间的内容必须可扩展才能产生“字符标记”。因此,不可扩展的标记(例如 TeX“原始”控制序列标记,例如和)是\csname
\endcsname
\kern
\vcenter
不允许。
此方法有很多用途。
答案2
第 11.6 条TeX 按主题分类包含以下内容:
使用
\csname
它可以构造通常无法写入的控制序列,因为组成字符标记可能属于除 11 个字母之外的其他类别。
一个简单的例子(同样来自 TeX by Topic)是
\csname a b\endcsname
还有许多其他应用;经常\csname
和\endcsname
用于宏的自动构建。
答案3
\cs
仅仅是一个用于在包手册中记录命令的命令。它用于:
- 更改拼写错误
- 索引命令
- 自动添加反斜杠
如果您想动态创建命令,您应该使用:
- 或
\csname
endcsname
一对 :\expandfter\def\csname toto\endcsname{content}
。这将创建一个\toto
命令。 - 或者更简单,使用包
\csdef
的命令etoolbox
:\csdef{toto}{content}