
如何建立一個新指令,其語法可能是\sffamily
or\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
並且使用 use {\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}
它將使用所需的語法製作大型紅色等寬字體。