我想设计一个 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}