带下划线的新命令

带下划线的新命令

我尝试创建一个带有下划线的新命令,如下所示,但没有作用。

\newcommand{\h\_world}[1]{Hello World #1}

在输出中我甚至不需要启动命令就可以看到: worldHello World 1

答案1

不要这样做,除非有特殊原因。

下划线具有特殊含义(类别代码 8),用于表示数学模式下的下标。只有类别代码 11(字母)字符才能在宏名称中调用为\macroname

可以使用其他方法在宏名中放置下划线,如下所示,但需要旋转才能调用宏名。

\documentclass{article} 
\begin{document}
\expandafter\newcommand\csname h_world\endcsname[1]{Hello World #1}

\csname h_world\endcsname{!!!}
\end{document}

在此处输入图片描述

请注意,感叹号前面有空格,因为!!!是的参数\csname h_world\endcsname,并且在后面显示为空格,如#1该宏的输出所示。

https://en.wikibooks.org/wiki/TeX/catcode了解有关可用 catcode 的更多解释。

附录

如果你疯了,必须实现,而不使用\csname语法\h_world,那么就有这种可能性:

\documentclass{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\makeatletter
\newcommand\h{\@ifnextchar_{\haux}{\loneh}}
\makeatother
\def\tmpcompare{world}
\def\haux_#1 {\def\tmp{#1}\ifx\tmp\tmpcompare Hello World \else\loneh_#1 \fi}
\begin{document}
\newcommand\loneh{[\string\h{} undefined]}

\h blah

$\h_something blah$

\h_world blah

\bigskip\renewcommand\loneh{H}

\h blah

$\h_something blah$

\h_world blah
\end{document}

在此处输入图片描述

第一组3条线测试

  1. \h其本身的行为现在定义为\loneh

  2. \h_<incorrect keyword>其中incorrect keyword是除字符串 之外的任何内容world。它生成的结果\loneh_<incorrect keyword>中下划线具有传统含义。

  3. \h_world,获得所需输出。

在第一组 3 行中\loneh定义为[\string\h{} undefined],在第二组 3 行中,它被简单地定义为H

答案2

使用\def它似乎可以在宏中使用下划线:

\def\nr_b{3}
\def\h_w#1{Hello #1 world!}
the number \nr_b is 3,
\h_w{wonderful}

将完全按照 OP 的要求工作,并产生

the number 3 is 3, Hello wonderful world!

(我用pdftex、、以及相应的引擎对其进行了测试;全部来自 TeX Live 2016)。xetexluatexLaTeX

我不是 TeX 专家,但是我认为,上面并没有定义一个名为 的宏\nr_b,而是定义了一个\nr只能在后跟 时使用的名为 的宏\_b

此外,使用下划线可能会产生不良的副作用,如本例所示

\def\int_{ARGH}
\[\int_\alpha\]

所以我建议不要在宏中使用下划线。

相关内容