Создать синтаксическую префиксную команду

Создать синтаксическую префиксную команду

Как создать новую команду, синтаксис которой, скорее всего, будет командой \sffamilyor \ttfamily. Например:

{\mycommand xxxxx}

Справочная информация: опция font=TikZ Node не допускает такие команды, как \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: ширину абзаца, размер базовой линии и т. д. В этом случае {начало группы is и }конец группы is, а настройки регистров или выбора шрифта являются локальными в этой группе. Это означает, что предыдущие значения параметров восстанавливаются, когда группа заканчивается, т. е. в }.

Если последовательность управления \fooимеет использование \foo{something}, то это почти наверняка макрос с одним параметром (определяется с помощью \def\foo#1{body}), и он расширяется до bodyтого места, где его параметр формально обозначен как , #1и он может использоваться командами в bodyлюбом случае. Обратите внимание, что {и }в контексте \foo{something}не являются начальной/конечной группой в этом случае, а являются лишь разделителями параметров. Здесь они играют другую роль. TeX — контекстно-зависимый интерпретатор.

Если у вас есть макрос \fooбез параметров с использованием {\foo something}, то вы можете определить новый макрос с таким \newfooсинтаксисом :\newfoo{something}

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

Обратите внимание, что первый {здесь открывает тело макроса (это часть синтаксического правила при \defиспользовании примитива TeX), а второй {открывает группу при \newfooрасширении. Затем \fooустанавливает некоторые параметры TeX, затем параметр #1печатается, а затем группа закрывается из-за первого }. Второй }является частью синтаксического правила \defпримитива.

Обратный путь: от \foo{something}синтаксиса к {\newfoo something}синтаксису иногда возможен, но это сложнее, и у вас будет на одну группу begin/end больше, чем при \foo{something}использовании pure:

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

решение2

У вас, похоже, ложное представление, что синтаксис \ttfamilyвключает фигурные скобки. Это не так, он просто меняет шрифт в этой точке, так же как \color{red}меняет цвет в этой точке или \largeменяет размер шрифта в этой точке.

Поэтому вам не нужно ничего особенного делать с синтаксисом: если вы определяете

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

он создаст большой красный моноширинный шрифт с требуемым синтаксисом.

Связанный контент