在 TikZ 中,有draw=none
和fill=none
选项可以关闭描边和填充操作。但是,似乎没有相应的text=none
选项。如果我尝试\tikz \node[text=none] {X};
,我会收到错误消息“Package xcolor 错误:未定义颜色‘无’”。 (该text=red
选项确实按预期工作。)
- 难道真的没有
text=none
选择了? - 有什么替代方案?使用是否合理
text opacity=0
,或者有更好的选择吗?
我之所以问这个问题,是因为我想创建一个与给定图像或文本大小相同的“空”节点。通过引用这个“空”节点的锚点,我可以为图像或文本移动以占据相同空间制作动画。以下是我想要实现的一个示例。它text opacity=0
基于@percusse 的建议使用。
\documentclass{minimal}
\usepackage{animate}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{animateinline}[autoplay,loop]{10}
\multiframe{11}{iframe=0+1}{
\begin{tikzpicture}[every node/.style={draw}]
\node[text opacity=0] (source) {Text};
\node[text opacity=0] (target) at (2,2) {Text};
\node at ($(source)!\iframe/10!(target)$) {Text};
\end{tikzpicture}
}
\end{animateinline}
\end{document}
- 鉴于这个最终目标,最好使用类似的东西吗
\node {\phantom{Text}};
?
答案1
如果您不需要文本,那么它就不应该在那里。要么使用等来放大节点minimum width,height,inner sep
,要么您可以text opacity
舒适地使用键。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[text opacity=0,draw=red,fill=yellow!25] (a) {Text};
\end{tikzpicture}
\end{document}
如果您还需要一些文本的占位符,您可以稍微深奥一些,预先获取宽度深度高度信息,例如仅获取宽度;
\begin{tikzpicture}
\pgfmathparse{width{"Text"}}
\edef\mywidth{\pgfmathresult}
\node[minimum width=\mywidth pt,draw=red,fill=yellow!25] (a) {};
\end{tikzpicture}
答案2
您可以使用\phantom{Text}
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[draw=red,fill=yellow!25] (a) {\phantom{Text}};
\end{tikzpicture}
\begin{tikzpicture}
\node[draw=red,fill=yellow!25] (a) {{Text}};
\end{tikzpicture}
\end{document}
答案3
如果想要一个真正的“幻影”文本节点(即,生成的 PDF 中没有可选择的文本)并且不想手动提供宏\phantom
,则可以使用以下解决方案之一:
使用未记录的密钥
execute at begin node
,execute at end node
可以使用lrbox
环境(或手动使用\setbox
)一个框,然后在里面使用\phantom
:execute at begin node = \begin{lrbox}{\pgfutil@tempboxa}, execute at end node = \end{lrbox}\phantom{\usebox\pgfutil@tempboxa}
这对于单行节点和(我假设)多部分节点非常有效。
text width
使用密钥时会出现问题,因为所需的minipage
环境是在提供给的内容之外设置的。(显然,我们可以自己用TikZ 原始设置中的execute at begin/end node
a 和内容来模拟这一点)。minipage
TikZ 将文本放在框中
{
和之间后}
,它会检查键的值text width
,text depth
并text height
相应地更正框的度量值。转换后,通过宏创建节点\pgfnode
。我们可以使用以下设置(以及 的一点帮助etoolbox
)在此处拦截它:\usepackage{etoolbox} \patchcmd\tikz@fig@continue{\tikz@node@transformations}{% \iftikz@node@phantom \setbox\pgfnodeparttextbox\hbox{% \vrule height\ht\pgfnodeparttextbox depth\dp\pgfnodeparttextbox width0pt% \vrule height0ptdepth0ptwidth\wd\pgfnodeparttextbox}% \fi\tikz@node@transformations}{}{}
这将简单地用
\pgfnodeparttextbox
与原始宽度、高度和深度完全相同的规则覆盖\pgfnodeparttextbox
(就像这样\phantom
做一样)。就我个人而言,我更喜欢这个解决方案,结合以下键/条件,它还提供了(除了语法之外
text=none
)一个键phantom
。\newif\iftikz@node@phantom \tikzset{ phantom/.is if=tikz@node@phantom, text/.code=% \edef\tikz@temp{#1}% \ifx\tikz@temp\tikz@nonetext \tikz@node@phantomtrue \else \tikz@node@phantomfalse \let\tikz@textcolor\tikz@temp \fi}
另一个选项可用于即将推出的 TikZ 版本,它提供了一个
node contents
键。我们可以创建一个键,该键接受其参数并将其传递给node contents
包含在 中\phantom
。这仅适用于单行代码。Phantom/.style={node contents=\phantom{#1}}
代码
\documentclass[tikz]{standalone}
\makeatletter
\newif\iftikz@node@phantom
\tikzset{
phantom/.is if=tikz@node@phantom,
text/.code=%
\edef\tikz@temp{#1}%
\ifx\tikz@temp\tikz@nonetext
\tikz@node@phantomtrue
\else
\tikz@node@phantomfalse
\let\tikz@textcolor\tikz@temp
\fi,
Phantom/.style={node contents=\phantom{#1}},% only CVS, only single line
PHantom/.style={
execute at begin node=\setbox\pgfutil@tempboxa\hbox\bgroup,
execute at end node=\egroup\phantom{\usebox\pgfutil@tempboxa}}
}
\usepackage{etoolbox}
\patchcmd\tikz@fig@continue{\tikz@node@transformations}{%
\iftikz@node@phantom
\setbox\pgfnodeparttextbox\hbox{%
\vrule height\ht\pgfnodeparttextbox depth\dp\pgfnodeparttextbox width0pt%
\vrule height0ptdepth0ptwidth\wd\pgfnodeparttextbox}%
\fi\tikz@node@transformations}{}{}
\makeatother
\begin{document}
\tikz[nodes={draw, text width=2cm}]\path
node[green] {Text text text text text text text}
node[PHantom, red] {Text text text text text text text};
\foreach \iframe[evaluate={\iframe=\iframe/10}] in {0,...,10}{
\begin{tikzpicture}[nodes=draw]
\node[text=none] (source) {Text};
\node[phantom] (target) at (2,2) {Text};
\node[gray] at (1,1) [Phantom=Text];
\path (source.center) -- node[pos=\iframe] {Text} (target.center);
\end{tikzpicture}}
\end{document}
答案4
我在使用这个精彩的暗示用于轻松组合 beamer 叠加层和传递给 tikz 命令的选项,并避免重复叠加层规范。为此,将文本不透明度设置为 0 即可。使用提示中描述的命令,我们可以将此与文本不透明度进行比较。
\node [temporal=<2>{Bres}{text opacity=0}{resdone}] {\( \phi^A_{i,s}(x) \) };
与以“正确的方式”执行操作并仅更改节点文本所需的操作相反。
\node [temporal=<3-6>{Bres}{text opacity=0}{resdone}] { \only<1-2,7->{\( \phi^A_{i,s}(x) \)} };