我想制作一个节点样式,通过命令“过滤”节点的标签(文本),即用宏替换节点文本,并将原始节点文本作为参数传递给该宏。具体来说,在这种情况下,我想添加一个节点\node {C}
并对其进行排版/绘制\node {$\mathbb{C}$}
。
我读了以下答案:如何将 TikZ 节点的主体传递给字体更改宏?并想到像那里那样做,将 插入$\mathbb\bgroup
并execute at begin node
插入\egroup$
。execute at end node
这可行(请参阅下面的 MWE),但我认为最好使用\ensuremath
;此外,我可能还想使用\bm{\mathbb{C}}
或\pmb{\mathbb{C}}
作为“超粗黑板粗体”符号。
但是,一旦我添加\ensuremath\bgroup
或额外的\bm\bgroup
,我就会收到错误。此外,如果我定义一个单独的宏\mymacro
并在 tikzstyle 定义中使用它,我也会收到错误(请参阅下面的 MWE)。此外,当以不同的方式定义此宏时(灵感来自使用节点文本作为宏的参数)我是否收到错误?
有什么方法可以实现这个吗?
\documentclass{article}
\usepackage{tikz}
\usepackage{amsfonts} %for the mathbb command
\usepackage{amsmath}
\tikzset{
bb/.style={
execute at begin node=$\mathbb\bgroup,
execute at end node=\egroup$
}
}
\tikzset{
bb2/.style={
execute at begin node=\ensuremath\bgroup\mathbb\bgroup,
execute at end node=\egroup\egroup
}
}
\def\mymacro#1{\ensuremath{\mathbb{#1}}}
\tikzset{
my macro/.style={
execute at begin node=\mymacro\bgroup,
execute at end node=\egroup
}
}
\def\mysecondmacro{\ensuremath\bgroup\mathbb\bgroup}
\def\endmysecondmacro{\egroup\egroup}
\tikzset{
my secondmacro/.style={
execute at begin node={\mysecondmacro},
execute at end node={\endmysecondmacro}
}
}
\begin{document}
In text: \ensuremath{\mathbb{C}} %simply as text
bb style: \tikz \node[bb] {C}; %produces the blackboard-bold C
% Gives errors "Missing } inserted.", "\mathbb allowed only in math mode"
% and "Extra }, or forgotten \endgroup."
bb2 style: \tikz \node[bb2] {C}; %produces the blackboard-bold C
% Gives errors "Missing } inserted" and "Extra }, or forotten \endgroup"
my macro style: \tikz \node[my macro] {C};
% Gives same error as bb2 style
my second macro style: \tikz\node[my secondmacro] {C};
\end{document}
答案1
最新版本的 PGF 有一个node contents=<node text>
密钥,可用于代替{<node text>}
节点中的。可以像这样使用:
\documentclass[tikz, border=5]{standalone}
\tikzset{node text/.style={node contents=\transformtext{#1}}}
\def\transformtext#1{\ttfamily(#1)}
\begin{document}
\begin{tikzpicture}
\foreach \l [count=\y] in {a,...,e}
\node [draw] at (\y,\y) [node text=\l:\y];
\end{tikzpicture}
\end{document}