我不知道这是否是预料之中的;这可能是一个非常愚蠢的操作员错误,但请考虑以下 MWE:
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\pgfdeclareshape{sline}{
\anchor{center}{\pgfpointorigin}%
\behindbackgroundpath{
% \pgfsetcolor{.}% <- line B
% \pgfsetfillcolor{red}% <- line A
\pgfpathmoveto{\pgfpoint{-0.3cm}{0pt}}%
\pgfpathlineto{\pgfpoint{0.3cm}{0pt}}%
\pgfnode{circle}{center}{}{}{\pgfusepath{stroke,fill}}%
\pgftext[top,y=0.4cm]{zzz}%
\pgfusepath{draw}%
}
}
\begin{document}
Text
\begin{tikzpicture}[]
\draw[] (0,1) node [sline]{} (1,1) node{aaa};
\draw[blue, fill=green] (0,0) node [sline]{} (1,0) node{aaa};
\end{tikzpicture}
\end{document}
其结果是:
令人费解的是,“zzz”紧随其后充满形状的颜色,而不是中风颜色。我尝试在手册中查找一些内容,但无济于事。
我希望形状可以遵循外部“填充”参数(无论是在绘制中,还是在形状本身中)但文本应该遵循绘制颜色,就像“aaa”所做的那样(或者至少遵循外部当前颜色)。
取消注释line B
会给出“填充和描边作为当前颜色”,正如预期的那样(\pgfsetcolor
设置描边和填充):
...取消注释 A 行和 B 行会得到固定的红色填充和红色文字。
仅注释 B 行可得出:
综上所述,似乎创建的文本\pgftext
是用填充颜色着色的,并且只有当填充颜色未定义时才用当前颜色着色。这是预期的行为吗?
答案1
原则上,文本是用填充颜色而不是描边颜色来着色的。毕竟,现代字体都是轮廓字体。命令(如和)可
\color
同时\textcolor
设置填充颜色和描边颜色,从而使“文本已填充”这一事实不那么难以察觉。因此在 pgf 中,、和 中的每一个都
\pgftext
用\pgfnode
当前\pgfmultipartnode
填充颜色为(节点)文本着色。但是 tikz 引入了一个新概念“文本颜色”,它由每个节点设置
text=<color>
并初始化为空。如果设置,对于节点文本,当前填充和描边颜色都会本地设置为文本颜色。相关代码位于\tikz@do@fig
:\ifx\tikz@textcolor\pgfutil@empty% \else% \pgfutil@colorlet{.}{\tikz@textcolor}% \pgfutil@color{\tikz@textcolor}% \fi%
\tikz@nodepart@continue
在和中可以发现略有不同的逻辑,\tikz@fig@continue
其中使用\pgfsetcolor{.}
after\fi
而不是\pgfutil@color{\tikz@textcolor}
。目前我所知道的不同之处在于\pgfsetcolor
还将设置命名颜色pgfstrokecolor
和pgffillcolor
。因此,通过 tikz 选项,可以为一个节点使用最多三种不同的颜色:
\node[draw=blue, fill=yellow!20, text=cyan] {text};
回到 pgf 层,需要一些手动工作,因为选项
text=<color>
仅在 tikz 层可用,并且上述代码逻辑仅适用于 tikz(而非 pgf)节点文本。
下面的示例提供了一个\pgf@cir@usetextcolor
将当前填充和描边颜色设置为文本颜色(如果设置了文本颜色)。
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\makeatletter
\pgfdeclareshape{sline}{
\anchor{center}{\pgfpointorigin}%
\behindbackgroundpath{
% \pgfsetcolor{.}% <- line B
% \pgfsetfillcolor{red}% <- line A
\pgfpathmoveto{\pgfpoint{-0.3cm}{0pt}}%
\pgfpathlineto{\pgfpoint{0.3cm}{0pt}}%
\pgfnode{circle}{center}{}{}{\pgfusepath{stroke,fill}}%
\pgfusepath{draw}
% \pgfscope
\pgf@circ@usetextcolor % if used at last, no need to wrap in pgfscope
\pgftext[top,y=0.4cm]{zzz}%
% \endpgfscope
}
}
\def\pgf@circ@usetextcolor{%
\ifx\tikz@textcolor\pgfutil@empty
\else
\pgfutil@colorlet{.}{\tikz@textcolor}%
\pgfutil@color{\tikz@textcolor}%
\fi
}
\makeatother
\begin{document}
Text
\begin{tikzpicture}[]
\draw[] (0,1) node [sline]{} (1,1) node{aaa};
\draw[blue, fill=green] (0,0) node [sline]{} (1,0) node{aaa};
\draw[blue, fill=green] (0,-1) node [sline,text=red]{} (1,-1) node[text=red]{aaa};
\end{tikzpicture}
\end{document}