定义包含数字的命令/缩写

定义包含数字的命令/缩写

我倾向于使用\newcommand来定义我经常使用的符号的宏,例如\newcommand{\hankel}{H^{(1)}_0}。这种方法的一个不便之处在于命令名称不能包含数字。我理想情况下想要的是将类似 的内容映射到\H0H^{(1)}_0我想这可以通过一些宏扩展/代码片段包来完成,或者可以使用\newcommand来定义一个接受参数的命令,等等。不过,在我开始实验之前——有没有一种规范的方法来处理这个问题?

答案1

我处理这个问题的方法是定义带有参数的命令。

\newcommand{\H}[1]{H^{(1)}_{#1}}

定义一个带有一个参数的命令。然后您可以执行\H0, \H1, ..., \H9。对于多于一位的数字,您必须将其用作\H{10}

答案2

此常见问题解答讨论了这个问题,批评了使用这种宏的四种可能方式,并最终得出结论不要这样做

新的 LaTeX 用户经常会对包含非字母的宏定义感到惊讶,例如

\newcommand{\cul8r}{Goodbye!}

编译失败。原因是 TeX 宏语言与大多数编程语言不同,它只允许宏名称中包含字母。

定义带有类似名称的宏有很多技巧 \cul8r。不幸的是,没有一种技巧特别好:

  1. 使用\csname...\endcsname定义并调用宏:

    \expandafter\newcommand\csname cul8r\endcsname{Goodbye!}
    I said, ``\csname cul8r\endcsname''.
    
    • 优点:没有意外的副作用
    • 缺点:过于冗长以至于无法使用
  2. 定义一个“特殊命令生成器”,并使用生成的命令:

    \newcommand{\DefineRemark}[2]{%
      \expandafter\newcommand\csname rmk-#1\endcsname{#2}%
    }
    \newcommand{\Remark}[1]{\csname rmk-#1\endcsname}
    ...
    \DefineRemark{cul8r}{Goodbye!}
    ...
    \Remark{cul8r}
    
    • 优点:使用简单,不会太凌乱
    • 缺点:它几乎没有达到我们预期的效果(专家会看到你正在定义一个宏,但其他人可能不会)
  3. 让 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
    

    作为一般规则,更改类别代码是有用的 危急时刻,在详细检查了各种选项之后。可以想象,这种激烈的行动可能对你有用,但大多数普通用户最好不要尝试这种技术。

  4. 定义一个宏\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}

http://web.archive.org/web/20130727172127/http://www.elec.ryukoku.ac.jp/~fujii/pub/ftp/incoming/styles/kth.se/numdef.sty

您可以将\num\def\x1{x one}其定义并用作\x1

希望这有帮助!VIKI

相关内容