egreg 的测试

egreg 的测试

如果我想pin在 TiKZ 中向节点添加一个,我可以这样做:

\documentclass[tikz,border=5pt]{standalone}

\begin{document}

  \begin{tikzpicture}
    \node [draw, thick, circle, minimum width=10pt, pin=-90:A Circle] {};
  \end{tikzpicture}

\end{document}

别针

现在假设我想画一些圆圈。我可能会定义一个自定义样式,但假设“圆圈”实际上是一些更复杂代码的占位符。在这种情况下,我可能会定义一个pic

\documentclass[tikz,border=5pt]{standalone}

\begin{document}

  \tikzset{
    my circle/.pic={
      \node [draw, thick, circle, minimum width=10pt] {};
    },
  }

  \begin{tikzpicture}
    \pic {my circle};
  \end{tikzpicture}

\end{document}

如果我想添加文字里面我的圈子,我可以使用该pic text功能来执行以下操作:

\documentclass[tikz,border=5pt]{standalone}

\begin{document}

  \tikzset{
    my circle/.pic={
      \node [draw, thick, circle, minimum width=10pt] {\tikzpictext};
    },
  }

  \begin{tikzpicture}
    \pic [pic text=A Circle] {my circle};
    \pic [pic text=Another] at (20mm,0) {my circle};
  \end{tikzpicture}

\end{document}

图片文字

或者,我可以使用来pic text创建图钉:

\documentclass[tikz,border=5pt]{standalone}

\begin{document}

  \tikzset{
    my circle/.pic={
      \node [draw, thick, circle, minimum width=10pt, pin=-90:\tikzpictext] {};
    },
  }

  \begin{tikzpicture}
    \pic [pic text=A Circle] {my circle};
    \pic [pic text=Another] at (20mm,0) {my circle};
  \end{tikzpicture}

\end{document}

图片文字图钉

现在假设我的一些圈子需要图钉,而其他圈子不需要:

\documentclass[tikz,border=5pt]{standalone}

\begin{document}

  \tikzset{
    my circle/.pic={
      \node [draw, thick, circle, minimum width=10pt, pin=-90:\tikzpictext] {};
    },
  }

  \begin{tikzpicture}
    \pic [pic text=A Circle] {my circle};
    \pic  at (20mm,0) {my circle};
  \end{tikzpicture}

\end{document}

图片文字图钉和图片文字空图钉

我如何测试图片中的 pin 文本是否为空,以便我可以有条件地执行代码的 pin 部分?我假设有一个相当简单的方法可以做到这一点,但我就是找不到它。虽然我通过蛮力解决了眼前的问题,但我想要一个更优雅的解决方案。

我尝试过的方法:技巧;使用各种其他类型的(, )\def\tempa{} \def\tempb ... \ifx\tempa\tempb ...的相同技巧;或多或少随机的各种方法;尝试找出一种使用独立标签系统的解决方法;搜索 TiKZ 手册;搜索此网站;等等。由于没有任何方法可以接近工作,因此我不会给出详细的说明。我的大多数尝试都无法编译。我确实让一些方法可以编译,但它们对是否已指定不敏感,因此代码虽然看起来大多无害,但显然也是无用的。def\edef\xdefetoolbox.trypic text

egreg 的测试

这是最接近我想要的线程,尽管不是非常接近。所以我尝试了那里建议的测试。例如,这是我尝试应用无打印输出测试(我认为这是最有希望的):

 \tikzset{
    my circle/.pic={
      \setbox0=\hbox{\tikzpictext\unskip}\ifdim\wd0=0pt
        \node [draw, thick, circle, minimum width=10pt] {};%
      \else
        \node [draw, thick, circle, minimum width=10pt, pin=-90:\tikzpictext] {};%
      \fi
    },
  }

这可以编译,这很好,但是它将所有情况都视为空,这不太好。

\unskip\hfuzz测试\detokenize也能通过编译,但是它们将所有情况都视为非空(这也许并不奇怪,因为它pic text有一个默认值,尽管是空的):

  \tikzset{
    my circle/.pic={
      \if\relax\detokenize{\tikzpictext}\relax
        \node [draw, thick, circle, minimum width=10pt] {};%
      \else
        \node [draw, thick, circle, minimum width=10pt, pin=-90:\tikzpictext] {};%
      \fi
    },
  }

实施这个测试的正确方法是什么?

答案1

我搜索了 pgf 源中的 \tikzpictext 并找到了以下解决方案(或多或少):

\documentclass[tikz,border=5pt]{standalone}
\begin{document}

\tikzset{my circle/.pic={
  \ifx\tikzpictext\relax
      \node [draw, thick, circle, minimum width=10pt] {};%
    \else
      \node [draw, thick, circle, minimum width=10pt, pin=-90:\tikzpictext] {};%
    \fi
  };
}

\begin{tikzpicture}
    \pic [pic text=A Circle] {my circle};
    \pic  at (20mm,0) {my circle};
\end{tikzpicture}

\end{document}

tikzpictest

相关内容