在 \behindbackground{} 形状中使用 \pgftext:颜色问题

在 \behindbackground{} 形状中使用 \pgftext:颜色问题

我不知道这是否是预料之中的;这可能是一个非常愚蠢的操作员错误,但请考虑以下 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还将设置命名颜色pgfstrokecolorpgffillcolor

  • 因此,通过 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}

在此处输入图片描述

相关内容