我正在使用 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}
需要进行更多修改才能正确获取节点的大小。好吧,无论如何我当然更喜欢更干净的解决方案。