TikZ 多部分节点:如何为部分/全部部分设置文本属性(不透明度)

TikZ 多部分节点:如何为部分/全部部分设置文本属性(不透明度)

我正在使用 TikZ 和rectangle split多部分节点(详见第 450ff 页)PGF 2.1 文档)。我需要影响所有部分的文本不透明度,但无论我尝试什么,似乎都只对text多部分节点的(=第一部分)起作用:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\begin{document}
  \begin{tikzpicture}
    \node[rectangle split, rectangle split parts=2, draw, text opacity=0.5]{%
      transparent :-)
      \nodepart{two}
      not transparent :-(
    };
  \end{tikzpicture}
\end{document}

结果是:

在此处输入图片描述

我也尝试过\nodepart[text opacity=0.5]{two},甚至尝试过 Heiko Oberdiek 的transparent软件包来手动设置文本透明度,但这似乎无法与 PGF 配合使用。节点every ...的其他部分似乎也没有样式rectangle split

我肯定忽略了一些东西。

答案1

我提交了一个错误报告在 Sourceforge 页面。

一个临时的解决方法是将以下内容放入你的序言中:

\makeatletter
\def\tikz@nodepart@continue{%
  \global\let\tikz@fig@continue=\tikz@fig@continue@orig%
  % Now start new box:
   \expandafter\setbox\csname pgfnodepart\tikz@nodepart@name box\endcsname=\hbox%
      \bgroup%
        \tikzset{every \tikz@nodepart@name\space node part/.try}%
        \expandafter\tikzset\expandafter{\tikz@nodepart@options}%
        % ---- begin added lines
        \ifx\tikz@textopacity\pgfutil@empty%
        \else%
          \pgfsetfillopacity{\tikz@textopacity}%
          \pgfsetstrokeopacity{\tikz@textopacity}%
        \fi%
        % ---- end added lines
        \pgfinterruptpicture%
          \tikz@textfont%  
          \ifx\tikz@text@width\pgfutil@empty%
          \else%
            \begingroup%
                \pgfmathsetlength{\pgf@x}{\tikz@text@width}%
              \pgfutil@minipage[t]{\pgf@x}\leavevmode\hbox{}%
                \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%
            \tikz@uninstallcommands%
            \tikz@atbegin@node%
            \aftergroup\tikz@fig@collectresetcolor%
            \tikz@halign@check%
            \ignorespaces%
}
\makeatother

除标记的代码之外的所有内容都是从中复制的tikz.code.tex(标记的代码也来自该文件,但取自的定义\tikz@do@fig)。

这样你的代码就会产生
正确结果

答案2

请参阅编辑历史以了解我的困惑。

这可用于独立改变零件的颜色等(最近有一个问题,但我没能发现)。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\begin{document}
  \begin{tikzpicture}
    \node[rectangle split, rectangle split parts=2, draw,thick,text opacity=0.2]{%
      transparent :-)
    \nodepart{two}
        \begin{pgfinterruptpicture}\pgfsetfillopacity{0.2}
        now transparent :-)
        \end{pgfinterruptpicture}
    };
  \end{tikzpicture}
\end{document}

在此处输入图片描述

一个更自动化的解决方案是制作一个宏,从第一个节点部分读取不透明度

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\makeatletter
\newcommand{\tnpa}[1]{
        \begin{pgfinterruptpicture}\pgfsetfillopacity{\tikz@textopacity}
        #1
        \end{pgfinterruptpicture}
}
\makeatother

\begin{document}
  \begin{tikzpicture}
    \node[rectangle split, rectangle split parts=2, draw,thick,text opacity=0.1]{
      Transparent \nodepart{two}\tnpa{Together}
    };
  \end{tikzpicture}
\end{document}

因此,它需要将第二个节点内容包含在宏参数中。

答案3

一个相当老套的解决方法是将文本渲染在嵌套的 中tikzpicture。在事实是嵌套会tikzpictures导致(通常是意外的)设置的继承甚至达到了实际目的:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\begin{document}
  \begin{tikzpicture}[every two node part/.style={text opacity=0.5}]
    \node[rectangle split, rectangle split parts=2, draw, text opacity=0.5]{%
      transparent :-)
      \nodepart{two}
      not transparent :-(
    };
  \end{tikzpicture}
  \begin{tikzpicture}[every two node part/.style={text opacity=0.5}]
    \node[rectangle split, rectangle split parts=2, draw, text opacity=0.5]{%
      transparent :-)
      \nodepart{two}
      \tikz[]\node[inner sep=0pt, outer sep=0pt, text depth=0pt]{not not transparent :-(};%
    };
  \end{tikzpicture}
\end{document}

在此处输入图片描述

需要进行更多修改才能正确获取节点的大小。好吧,无论如何我当然更喜欢更干净的解决方案。

相关内容