![定义包含数字的命令/缩写](https://linux22.com/image/234253/%E5%AE%9A%E4%B9%89%E5%8C%85%E5%90%AB%E6%95%B0%E5%AD%97%E7%9A%84%E5%91%BD%E4%BB%A4%2F%E7%BC%A9%E5%86%99.png)
我倾向于使用\newcommand
来定义我经常使用的符号的宏,例如\newcommand{\hankel}{H^{(1)}_0}
。这种方法的一个不便之处在于命令名称不能包含数字。我理想情况下想要的是将类似 的内容映射到\H0
。H^{(1)}_0
我想这可以通过一些宏扩展/代码片段包来完成,或者可以使用\newcommand
来定义一个接受参数的命令,等等。不过,在我开始实验之前——有没有一种规范的方法来处理这个问题?
答案1
我处理这个问题的方法是定义带有参数的命令。
\newcommand{\H}[1]{H^{(1)}_{#1}}
定义一个带有一个参数的命令。然后您可以执行\H0
, \H1
, ..., \H9
。对于多于一位的数字,您必须将其用作\H{10}
。
答案2
此常见问题解答讨论了这个问题,批评了使用这种宏的四种可能方式,并最终得出结论不要这样做。
新的 LaTeX 用户经常会对包含非字母的宏定义感到惊讶,例如
\newcommand{\cul8r}{Goodbye!}
编译失败。原因是 TeX 宏语言与大多数编程语言不同,它只允许宏名称中包含字母。
定义带有类似名称的宏有很多技巧
\cul8r
。不幸的是,没有一种技巧特别好:
使用
\csname
...\endcsname
定义并调用宏:\expandafter\newcommand\csname cul8r\endcsname{Goodbye!} I said, ``\csname cul8r\endcsname''.
- 优点:没有意外的副作用
- 缺点:过于冗长以至于无法使用
定义一个“特殊命令生成器”,并使用生成的命令:
\newcommand{\DefineRemark}[2]{% \expandafter\newcommand\csname rmk-#1\endcsname{#2}% } \newcommand{\Remark}[1]{\csname rmk-#1\endcsname} ... \DefineRemark{cul8r}{Goodbye!} ... \Remark{cul8r}
- 优点:使用简单,不会太凌乱
- 缺点:它几乎没有达到我们预期的效果(专家会看到你正在定义一个宏,但其他人可能不会)
让 TeX 确信这
8
是一封字母:\catcode`8 = 11 \newcommand{\cul8r}{Goodbye!} I said, ``\cul8r''.
- 优点:
\cul8r
可直接使用- 缺点:可能会破坏其他用途
8
(例如数字或尺寸;因此\setlength{
\paperwidth}{8in}
告诉我们:! Missing number, treated as zero. <to be read again> 8
作为一般规则,更改类别代码是有用的 危急时刻,在详细检查了各种选项之后。可以想象,这种激烈的行动可能对你有用,但大多数普通用户最好不要尝试这种技术。
定义一个宏
\cul
,其后面必须始终跟着8r
:\def\cul8r{Goodbye!} I said, ``\cul8r''.
- 优点:
\cul8r
可直接使用- 缺点 1:如果
\cul
后面跟着除 之外的任何东西8r
,则会中断,并产生令人困惑的诊断——\cul99
产生:! Use of \cul doesn't match its definition. <*> \cul9 9
(这会让那些还没有意识到的人感到困惑 曾是
\cul
文档中的定义)。
- 缺点2:
\cul
如果有的话,会默默地重新定义现有的;因此,该技术不能用于 在同一个文档中同时定义\cul8r
和宏。\cul123
实际上,技术 3 在大多数 LaTeX 包和 LaTeX 本身中以有限的形式广泛使用。惯例是
@
在内部宏的名称中使用,以向用户隐藏它们,从而防止命名冲突。为此,LaTeX@
在处理类和包时自动将其视为字母,在处理用户文档时将其视为非字母。此技术的关键是分离:在内部,非字母用于宏名称,用户看不到任何内容,而在类或包中创建的所有定义中,状态保持“冻结”。有关更多信息,请参阅 宏名称中的\@
和@
。请注意,在此示例中类似地使用技术 3 将给我们
\begingroup \catcode`8 = 11 \gdef\cul8r{Goodbye!} \gdef\later{\cul8r} \endgroup I said, ``\later''.
它可以起作用,但却违背了练习的目的。(
\later
“8”的 catcode 被“冻结”,即使在使用时该值已恢复正常;还请注意原始命令的使用\gdef
,因为\newcommand
无法创建在组外可用的宏。)推荐:要么选择另一种机制(如上
\DefineRemark
文所述),要么为宏选择另一个名称,该名称仅包含普通字母。一种常见的方法是使用罗马数字代替阿拉伯数字:\newcommand{\culVIIIr}{Goodbye!}
这反而破坏了例子中隐含的笑话的目的
\cul8r
!
答案3
在某些情况下,使用罗马数字而不是阿拉伯数字可能会有所帮助:\HI、\HII、\HIII、\HIV。Lev Bishop 的链接中也提到了这一点,并且对我的情况很有帮助。
答案4
您可以使用\usepackage{numdef}
:
您可以将\num\def\x1{x one}
其定义并用作\x1
。
希望这有帮助!VIKI