![如何给 \pic 命名(第二部分)](https://linux22.com/image/374898/%E5%A6%82%E4%BD%95%E7%BB%99%20%5Cpic%20%E5%91%BD%E5%90%8D%EF%BC%88%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86%EF%BC%89.png)
当我在寻找解决方案时如何给 \pic 命名,我发现问题似乎只出在路径\tikztostart
中的代码上to
,而不出在\tikztotarget
。
这里有一个显示此情况的 MWE(通过用明确的坐标替换起始节点来“纠正”注释的命令)。
\documentclass[tikz,border=3mm]{standalone}
\tikzset{
seagull/.pic={
% Code for a "seagull". Do you see it?...
\coordinate (-left wing) at (-3mm,0);
\coordinate (-head) at (0,0);
\coordinate (-right wing) at (3mm,0);
% \draw (-left wing) to [bend left] (0,0);
\draw (-3mm,0) to [bend left] (-head);
% \draw (-head) to [bend left] (-right wing);
\draw (0,0) to [bend left] (-right wing);
}
}
\begin{document}
\begin{tikzpicture}%\small\sffamily
\pic (Emma) {seagull};
\pic (Alexandra) at (0,1) {seagull};
\draw (Emma-left wing) -- (Alexandra-right wing);
\end{tikzpicture}
\end{document}
我的问题是:通过观察\tikztostart
和之间的差异,\tikztotarget
我们能想象出解决办法吗?
笔记 :我并不是在寻找解决方法,因为在原始问题中我们已经可以找到:使用name prefix ..
,或者使用 替换 用明确的坐标命名let ...
。
答案1
这不是一个完整的答案,而是告诉你,我认为这与……无关\tikztostart
。\tikztotarget
相反,我同意@cfr,@符号 1和@percusse。更详细地说,我认为您的代码能够工作只是巧合,它之所以能工作只是因为解析从 开始\tikztostart
。
唯一非常温和的改进是@cfr 的出色解决方法就是你不再需要输入seagull=
。
\documentclass[a4paper]{ltxdoc}
\usepackage{tikz}
\begin{document}
\tikzset{
seagull/.pic={
\coordinate (-left wing) at (-3mm,0);
\coordinate (-head) at (0,0);
\coordinate (-right wing) at (3mm,0);
\xdef\myname{\pgfkeysvalueof{/tikz/name prefix}}
\draw[name prefix=] (\myname-left wing) to [bend left] (\myname-head) to [bend left] (\myname-right wing);
}
}
\tikz {
\pic (Emma) {seagull};
\pic (Alexandra) at (0,1) {seagull};
\draw (Emma-left wing) -- (Alexandra-right wing);
}
\end{document}
我也认为这没有必要。特别是,我从 pgfmanual 复制了序言,即加载了所有库,然后仅使用第 254 页底部的示例创建了一个文档。但失败了。但是 pgfmanual 确实可以编译,不是吗?
同样可疑的是(0,0)
,
\draw (-left wing) to [bend left] (0,0) (-head) to [bend left] (-right wing);
在手册中。为什么要添加它?