我曾尝试创建一个用于高中物理教科书的通用电路符号:
\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
\pgfpointanchor
tikz
\southwest
\northeas
我的方式是否存在危害或风险?我是否应该切换到tikz
的方式,或者我可以保持原样吗?
答案1
总之,你没有错,值不值得,取决于你自己。
PGF 手册明确指出,\anchor
与\savedanchor
按需创建对象。也就是说,只有用户明确写入时,才会计算锚点的坐标(A.east)
。
这节省了大量时间,因为 90% 的锚点根本没有使用,我们不应该浪费任何时间来计算它们。
当 Ti钾Z 正在绘制背景路径,这些\anchor
的坐标尚未计算。如果 Ti钾Z 只是为了绘图而计算这些坐标,所以\anchor
一开始就没有必要使用...简单地做一切\savedanchor
。
所以这与 TeX 兼容性无关。Ti钾Z 更喜欢纯 TeX 代码,因为它们更快。作者决定多花两个小时来为数百万人节省两秒钟。在我看来,我们应该说 Ti钾Z 是为 TeX 设计的,并且与 LaTeX 兼容。
就你的情况而言,一切都取决于你。你想写简单的代码并等待几毫秒吗?还是你宁愿玩玩\pgf@x
?我个人更喜欢前者。