Объяснить то, что я пытаюсь сделать, сложнее, чем просто продемонстрировать, поэтому вот упрощенная версия:
\documentclass{article}
\usepackage{tikz}
\tikzset{
application node/.style={rectangle, draw=red},%
node/.style n args={1}{#1, append after command={\pgfextra{\let\mainnode=\tikzlastnode}
node [above] at (\mainnode.north) {#1}
}}}
\begin{document}
\tikz \node [node={application node}] {host.domain.com};
\end{document}
Должно произойти следующее:
node={application node}
относится к ключу PGFnode
, который принимает 1 аргумент, который определяется какузел приложения- TikZ/PGF расширяет аргументузел приложенияв
node/.style
качествеnode/.style n args={1}{application node, ... \node [above] ... {application node}
application node
анализируется как ключ PGF, добавляемыйrectangle, draw=red
в его пребывании
Я ссылаюсь на ключ PGF, application node
как #1
на node
ключ.
Проблема в том, как #1
токенизировано. Анализатор ключей PGF видит a
и ищет ключ, называемый a
вместо application node
.
решение1
По-видимому, TikZ требует шаблон аргумента, когда анализатор PGF должен прочитать все токены, хранящиеся в #1
(до закрывающей скобки).
\documentclass{article}
\usepackage{tikz}
\tikzset{
application node/.style={rectangle, draw=red},%
node/.style args={#1}{
#1,
append after command={\pgfextra{\let\mainnode=\tikzlastnode}
node [above] at (\mainnode.north) {#1}
},%
},%
}
\begin{document}
\tikz \node [node={application node}] {host.domain.com};
\end{document}
Анри Менке указал, что я мог бы также заключить аргумент в двойные скобки {{application node}}
и сохранить .style n args
синтаксис.
Соответствующая выдержка из справочника TikZ/PGF
Из-за особого способаценитьанализируется, если вы установите ценитьнапример, |first| (без каких-либо фигурных скобок), то |#1| будет установлен на |f|, а |#2| будет установлен на |irst|.