在电路符号形状的背景路径中使用 \pgfpointanchor

在电路符号形状的背景路径中使用 \pgfpointanchor

我曾尝试创建一个用于高中物理教科书的通用电路符号:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{circuits.ee.IEC,shapes.gates.ee}
\makeatletter
\pgfdeclareshape{mybox}{%
  \inheritsavedanchors[from=rectangle ee]
  \inheritanchor[from=rectangle ee]{center}
  \inheritanchor[from=rectangle ee]{north}
  \inheritanchor[from=rectangle ee]{south}
  \inheritanchor[from=rectangle ee]{east}
  \inheritanchor[from=rectangle ee]{west}
  \inheritanchor[from=rectangle ee]{north east}
  \inheritanchor[from=rectangle ee]{north west}
  \inheritanchor[from=rectangle ee]{south east}
  \inheritanchor[from=rectangle ee]{south west}
  \inheritanchor[from=rectangle ee]{input}
  \inheritanchor[from=rectangle ee]{output}
  \inheritanchorborder[from=rectangle ee]
  \inheritbackgroundpath[from=rectangle ee]
\anchor{west circ center}{
\pgfpointlineattime{0.5}{\southwest}{\northeast}
\advance\pgf@x by-0.5\tikzcircuitssizeunit%
}
\anchor{east circ center}{
\pgfpointlineattime{0.5}{\southwest}{\northeast}
\advance\pgf@x by0.5\tikzcircuitssizeunit%
}
\backgroundpath{%
\pgfpathmoveto{\pgfpointanchor{\tikz@fig@name}{west}}
\pgfpathlineto{\pgfpointanchor{\tikz@fig@name}{west circ center}}
\pgfpathmoveto{\pgfpointanchor{\tikz@fig@name}{east}}
\pgfpathlineto{\pgfpointanchor{\tikz@fig@name}{east circ center}}
\pgfusepath{stroke}
\pgfpathcircle{\pgfpointanchor{\tikz@fig@name}{east circ center}}{0.25\tikzcircuitssizeunit}
\pgfpathcircle{\pgfpointanchor{\tikz@fig@name}{west circ center}}{0.25\tikzcircuitssizeunit}
\pgfusepath{stroke,fill}
}
}
\makeatother
\tikzset{
  circuit declare symbol=general source,
  set general source graphic={
     draw,fill=white,shape=mybox, circuit symbol size=width 3 height 1,
    transform shape,
    }
}
\begin{document}
\begin{tikzpicture}[circuit ee IEC]
\draw(0,0)to[general source={info={foo}}](2,0)to[resistor={info=bar}](4,0);
\draw(0,0)to[resistor](0,-3)to[make contact](4,-3)to[bulb](4,0);
\end{tikzpicture}

\end{document}

是使用像和 这样的\backgroundpath命令绘制的,它们在我的计算机上可以工作。它本身使用背景路径定义自己的派生形状,并且仅基于 和 进行硬计算,一旦建立其他锚点,这对我来说看起来很麻烦。\pgfpathlineto\pgfpointanchortikz\southwest\northeas

我的方式是否存在危害或风险?我是否应该切换到tikz的方式,或者我可以保持原样吗?

答案1

总之,你没有错,值不值得,取决于你自己。


PGF 手册明确指出,\anchor\savedanchor按需创建对象。也就是说,只有用户明确写入时,才会计算锚点的坐标(A.east)

这节省了大量时间,因为 90% 的锚点根本没有使用,我们不应该浪费任何时间来计算它们。


当 TiZ 正在绘制背景路径,这些\anchor的坐标尚未计算。如果 TiZ 只是为了绘图而计算这些坐标,所以\anchor一开始就没有必要使用...简单地做一切\savedanchor

所以这与 TeX 兼容性无关。TiZ 更喜欢纯 TeX 代码,因为它们更快。作者决定多花两个小时来为数百万人节省两秒钟。在我看来,我们应该说 TiZ 是为 TeX 设计的,并且与 LaTeX 兼容。


就你的情况而言,一切都取决于你。你想写简单的代码并等待几毫秒吗?还是你宁愿玩玩\pgf@x?我个人更喜欢前者。

相关内容