创建语法前缀命令

创建语法前缀命令

我如何创建一个新的命令,其语法类似于\sffamily\ttfamily命令。例如:

{\mycommand xxxxx}

背景信息:TikZ Node 的选项font=不允许像这样的命令\mycommand{}。这可以正常工作:

\tikzstyle{JSToken} = [shape=rounded rectangle,font={\ttfamily}]

但这并不管用

\tikzstyle{JSToken} = [shape=rounded rectangle,font={\texttt}]

并且我需要一个命令\myfancyformat来定制一类节点的文本格式,以便我可以以这种形式使用它:

{\myfancyformat Stupid Text needs Fancy Format}

它的语法与以下内容相同\sffamily

{\sffamily Some Sans Serif formated Text}

我希望我能表达我的想法。

答案1

如果控制序列\foo有用途{\foo something},那么它几乎肯定是一个没有参数的宏,通常扩展为一组 TeX 寄存器和/或字体选择的内部设置。TeX 有内部寄存器,它们的值会影响 TeX 内部算法:段落宽度、基线跳过大小等。在这种情况下{是组开始,}是组结束,寄存器或字体选择的设置是该组中的本地设置。这意味着当组结束时,即在时,先前的参数值将恢复}

如果控制序列\foo有用途\foo{something},那么它几乎肯定是一个具有单个参数的宏(由 定义\def\foo#1{body}),并且它扩展到body其参数正式标记为的位置,#1并且可以body以任何方式被 中的命令使用。请注意,在这种情况下,上下文中的{和不是开始/结束组,但它们只是参数分隔符。它们在这里扮演另一个角色。TeX 是上下文相关的解释器。}\foo{something}

如果您有一个不带参数的宏,\foo并且其用法为{\foo something},那么您可以使用如下\newfoo语法定义一个新的宏:\newfoo{something}

\def\newfoo#1{{\foo #1}}

注意,这里第一个打开了宏的主体(这是TeX 原始{语法规则的一部分),第二个在展开时打开了一个组。然后设置一些 TeX 参数,然后打印一个参数,然后由于第一个而关闭该组。第二个是原始语法规则的一部分。\def{\newfoo\foo#1}}\def

相反的方式:从\foo{something}语法到语法有时也是可行的,但它更加棘手,并且与使用{\newfoo something}pure 相比,您有更多的开始/结束组:\foo{something}

\def\newfooA#1{\foo{#1}\egroup}
\def\newfoo{\expandafter\newfooA\expandafter{\iffalse}\fi}

答案2

您似乎错误地认为 的语法\ttfamily包含括号。其实不然,它只是在该点处更改字体,就像\color{red}在该点处更改颜色或\large更改字体大小一样。

因此,你不需要对语法做任何特殊处理:如果你定义

\newcommand\mycommand{\color{red}\large\ttfamily}

它将制作具有所需语法的大红色等宽字体。

相关内容