为什么不能将“在开始节点执行”和“对齐”一起使用?

为什么不能将“在开始节点执行”和“对齐”一起使用?

我想设计一个 tikz 样式,它将根据我的一些功能修改节点内容。正如对原始问题,我可以使用“在开始节点处执行”键来实现这一点。但它与“对齐”和换行符配合得不好。知道为什么吗?(​​我怀疑与工作方式有关\\,但我不确定;替换为\newline没有显示任何改进。)

\documentclass{minimal}
\usepackage{tikz}
\begin{document}
% First picture: the align instruction works.
% The prefix word appears, as expected, on top of MyTest.
\begin{tikzpicture}
  \path node[align=left] {prefix \\ MyTest};
\end{tikzpicture}

\newcommand{\myfunction}[1]{prefix \\ #1}
% Second picture: now align has no apparent effect any more.
% The prefix word and MyTest appear together on the same line.
\begin{tikzpicture}
  \path node[align=left, execute at begin node=\myfunction] {MyTest};
\end{tikzpicture}
\end{document}

答案1

转到tikz.code.tex第 3713 行,有 的定义\tikz@do@fig。这是排版节点的基本部分。在定义中,您可以\tikz@atbegin@node在第 3736 行和\tikz@halign@check第 3755 行看到。

正如人们可能猜到的那样,\tikz@atbegin@node商店的宏观execute at begin node代码,并\tikz@halign@check检查您是否说align=something并构建了一个\halign。因此,默认情况下,您的前缀不参与\halign-构造,因此将节点内容放在一边。尝试

\node[align=left,execute at begin node=\myfunction]{MyTest\\aa\\bb\\cc};

看得更清楚。

为了解决这个问题,一个愚蠢的方法是重新安排代码,让\tikz@halign@check发生在 之前\tikz@atbegin@node。一个愚蠢的例子是

\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\newcommand{\myfunction}[1]{prefix \\ #1}

\makeatletter
\def\tikz@do@fig{%  
    % Ok, reset all node part boxes
    \pgfutil@for\tikz@temp:=\tikz@nodepart@list\do{%
      \expandafter\setbox\csname pgfnodepart\tikz@temp box\endcsname=\box\pgfutil@voidb@x%
    }%
    \setbox\pgfnodeparttextbox=\hbox%
      \bgroup%
        \tikzset{every text node part/.try}%
        \ifx\tikz@textopacity\pgfutil@empty%
        \else%
          \pgfsetfillopacity{\tikz@textopacity}%
          \pgfsetstrokeopacity{\tikz@textopacity}%
        \fi%
        \pgfinterruptpicture%
          \ifx\tikz@text@width\pgfutil@empty%
            \tikz@textfont%  
          \else%
            \begingroup%
                \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
              \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
                \tikz@textfont%  
                \tikz@text@action%
          \fi%
          \bgroup%
            \aftergroup\unskip%
            \ifx\tikz@textcolor\pgfutil@empty%
            \else%
              \pgfutil@colorlet{.}{\tikz@textcolor}%
            \fi%
            \pgfsetcolor{.}%
            \setbox\tikz@figbox=\box\pgfutil@voidb@x%
            \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x%
            \tikz@uninstallcommands%
            \iftikz@handle@active@code%  
              \tikz@orig@shorthands%
              \let\tikz@orig@shorthands\pgfutil@empty%
            \fi%
            \ifnum\the\catcode`\;=\active\relax\expandafter\let\tikz@activesemicolon=\tikz@origsemi\fi%
            \ifnum\the\catcode`\:=\active\relax\expandafter\let\tikz@activecolon=\tikz@origcolon\fi%
            \ifnum\the\catcode`\|=\active\relax\expandafter\let\tikz@activebar=\tikz@origbar\fi%
            \aftergroup\tikz@fig@collectresetcolor%
            \tikz@halign@check%
            \tikz@atbegin@node%
            \ignorespaces%
}

\tikz\node[align=left,execute at begin node=\myfunction]{MyTest\\aa\\bb\\cc};

\end{document}

相关内容