通过宏过滤 tikz 节点文本

通过宏过滤 tikz 节点文本

我想制作一个节点样式,通过命令“过滤”节点的标签(文本),即用宏替换节点文本,并将原始节点文本作为参数传递给该宏。具体来说,在这种情况下,我想添加一个节点\node {C}并对其进行排版/绘制\node {$\mathbb{C}$}

我读了以下答案:如何将 TikZ 节点的主体传递给字体更改宏?并想到像那里那样做,将 插入$\mathbb\bgroupexecute 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}

在此处输入图片描述

相关内容