TikZ 中没有 text=none 吗?

TikZ 中没有 text=none 吗?

在 TikZ 中,有draw=nonefill=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,则可以使用以下解决方案之一:

  1. 使用未记录的密钥execute at begin nodeexecute 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 nodea 和内容来模拟这一点)。minipage

  2. TikZ 将文本放在框中{和之间后},它会检查键的值text widthtext depthtext 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}
    
  3. 另一个选项可用于即将推出的 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) \)} };

相关内容