我如何创建一个新的命令,其语法类似于\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}
它将制作具有所需语法的大红色等宽字体。