
Wie kann ich einen neuen Befehl erstellen, dessen Syntax wahrscheinlich dem Befehl \sffamily
oder entspricht \ttfamily
? Zum Beispiel:
{\mycommand xxxxx}
Hintergrundinformation: Die Option font=
von TikZ Node erlaubt keine Befehle wie \mycommand{}
. Dies funktioniert einwandfrei:
\tikzstyle{JSToken} = [shape=rounded rectangle,font={\ttfamily}]
Aber das funktioniert nicht
\tikzstyle{JSToken} = [shape=rounded rectangle,font={\texttt}]
Und ich brauche einen Befehl \myfancyformat
zum Anpassen des Textformats einer Knotenklasse, sodass ich es in dieser Form verwenden kann:
{\myfancyformat Stupid Text needs Fancy Format}
Es hat die gleiche Syntax wie \sffamily
:
{\sffamily Some Sans Serif formated Text}
Ich hoffe, ich kann meine Idee ausdrücken.
Antwort1
Wenn eine Steuersequenz \foo
verwendet wird {\foo something}
, handelt es sich mit ziemlicher Sicherheit um ein Makro ohne Parameter, das normalerweise zu einer Reihe interner Einstellungen von TeX-Registern und/oder der Schriftartauswahl erweitert wird. TeX verfügt über interne Register, deren Werte interne TeX-Algorithmen beeinflussen: Absatzbreite, Grundliniensprunggröße usw. In diesem Fall {
ist dies Gruppenanfang und }
Gruppenende und die Einstellungen der Register oder der Schriftartauswahl sind lokal in dieser Gruppe. Dies bedeutet, dass die vorherigen Parameterwerte wiederhergestellt werden, wenn die Gruppe endet, also bei }
.
Wenn eine Steuersequenz \foo
verwendet wird \foo{something}
, handelt es sich mit ziemlicher Sicherheit um ein Makro mit einem einzigen Parameter (definiert durch \def\foo#1{body}
), das sich bis zu dem Punkt erweitert, body
an dem sein Parameter formal als gekennzeichnet ist und von Befehlen in beliebiger Weise #1
verwendet werden kann . Beachten Sie, dass die und im Kontext in diesem Fall keine Anfangs-/Endgruppen sind, sondern nur Parametertrennzeichen. Sie spielen hier eine andere Rolle. TeX ist ein kontextabhängiger Interpreter.body
{
}
\foo{something}
Wenn Sie ein Makro \foo
ohne Parameter mit der Verwendung haben {\foo something}
, können Sie ein neues Makro \newfoo
mit der Syntax \newfoo{something}
wie folgt definieren:
\def\newfoo#1{{\foo #1}}
Beachten Sie, dass das erste {
hier den Hauptteil des Makros öffnet (es ist Teil der Syntaxregel, wenn \def
das TeX-Grundelement verwendet wird) und das zweite {
eine Gruppe öffnet, wenn \newfoo
erweitert wird. Dann \foo
werden einige TeX-Parameter festgelegt, dann wird ein Parameter #1
gedruckt und dann wird die Gruppe aufgrund des ersten geschlossen }
. Das zweite }
ist Teil einer Syntaxregel des \def
Grundelements.
Der umgekehrte Weg: von \foo{something}
Syntax zu {\newfoo something}
Syntax ist manchmal möglich, aber es ist schwieriger und Sie haben eine Gruppe mehr, begin/end, als wenn pure \foo{something}
verwendet wird:
\def\newfooA#1{\foo{#1}\egroup}
\def\newfoo{\expandafter\newfooA\expandafter{\iffalse}\fi}
Antwort2
Sie scheinen die falsche Vorstellung zu haben, dass die Syntax \ttfamily
Klammern enthält. Das ist nicht der Fall, sie ändert einfach die Schriftart an dieser Stelle, genauso wie \color{red}
sie die Farbe an dieser Stelle ändert oder \large
die Schriftgröße an dieser Stelle ändert.
Sie müssen also nichts Besonderes an der Syntax ändern: Wenn Sie
\newcommand\mycommand{\color{red}\large\ttfamily}
Es wird eine große rote Monospace-Schrift mit der erforderlichen Syntax erstellt.