如果我想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
\xdef
etoolbox
.try
pic 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}