我尝试创建一个带有下划线的新命令,如下所示,但没有作用。
\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条线测试
\h
其本身的行为现在定义为\loneh
\h_<incorrect keyword>
其中incorrect keyword
是除字符串 之外的任何内容world
。它生成的结果\loneh_<incorrect keyword>
中下划线具有传统含义。\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)。xetex
luatex
LaTeX
我不是 TeX 专家,但是我认为,上面并没有定义一个名为 的宏\nr_b
,而是定义了一个\nr
只能在后跟 时使用的名为 的宏\_b
。
此外,使用下划线可能会产生不良的副作用,如本例所示
\def\int_{ARGH}
\[\int_\alpha\]
所以我建议不要在宏中使用下划线。