如何将 TikZ 节点的主体传递给字体更改宏?

如何将 TikZ 节点的主体传递给字体更改宏?

在浏览了此网站上的其他一些答案后,我尝试使用 tikz-qtree 包排版树。它工作得很好,但根据设计,它不允许您在树节点中使用宏,除非您使用两个特定的宏\node\edge直接定义 TikZ 节点和边。

我想要的是

\tikzset{every tree node/.style={
   execute at begin node=\code\bgroup,
   execute at end node=\egroup}}

目前,\code本地设置一些符号,然后将文本设置为 TT 字体:

\newcommand{\code}[1]{{\def\_{\wild}%
                       \def\"{\quot}% dummy " for hightlighting...
                       \def\~{\symbol{126}}%
                       \def\^{\symbol{94}}%
                       \texttt{#1}}}

这可以编译,但不会以 TT 字体排版节点文本。奇怪的是,如果我直接将 \impl 更改为 \texttt,它以 TT 字体排版。我知道 TikZ 会使用空字体等来确保只在需要时才进行排版,因此我并不惊讶于这种节点字体更改的棘手性。

我在另一个问题中看到建议使用\begingroup/\endgroup而不是\bgroup/ \egroup。我试过了,但 LaTeX 抱怨“缺少 } 插入;额外的 } 或忘记了 \endgroup”

以下是一个最小(非)工作示例:

\usepackage{tikz-qtree}
\usepackage{tikz}
\usetikzlibrary[trees]
\newcommand{\code}[1]{{\def\_{\wild}%
                       \def\"{\quot}% dummy " for hightlighting...
                       \def\~{\symbol{126}}%
                       \def\^{\symbol{94}}%
                       \texttt{#1}}}
\begin{tikzpicture}[grow=down]
  \tikzset{every tree node/.style={
      execute at begin node=\strut\code\bgroup,
      execute at end node=\egroup}};
  \Tree [.html head body ]
\end{tikzpicture}

我不确定我对\bgroup/的使用是否\egroup错误,或者我对 的定义是否\code有误......

答案1

我无法直接回答您的问题,但我可以为您提供另一种更直接的解决方案:

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees}

\begin{document} 
\newcommand{\code}{\def\_{\wild}%
                   \def\"{\quot}% dummy " for hightlighting...
                   \def\~{\symbol{126}}%
                   \def\^{\symbol{94}}%
                   \ttfamily}

\begin{tikzpicture}[grow=down]
    \tikzset{every tree node/.style={font=\code}}
\Tree [.html head body ]
\end{tikzpicture}

\end{document}

此外,无论出于什么原因,当我删除 定义中的一个组时\code,您的示例仍按预期工作。也许那个额外的组会让 TikZ 感到困惑?

相关内容