Usando \pgfpointanchor en la ruta de fondo de una forma de símbolo de circuito

Usando \pgfpointanchor en la ruta de fondo de una forma de símbolo de circuito

Intenté crear un símbolo de circuito para fuentes generales como se usa en los libros de texto de física para las escuelas secundarias:

\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}

Se \backgroundpathdibuja usando comandos como \pgfpathlinetoy \pgfpointanchor, que funcionan en mi máquina. tikzél mismo define sus propias formas derivadas utilizando rutas de fondo con cálculos difíciles basados ​​únicamente en \southwesty \northeasque me parecen engorrosos, una vez que se establecen los otros anclajes.

¿Hay algún daño o riesgo en mi camino? ¿Debo cambiar al tikzcamino de 's o puedo dejarlo así?

Respuesta1

En resumen, no te equivocas. Depende de usted si vale la pena.


El manual de PGF deja claro que \anchor, a diferencia de \savedanchor, es uncrear bajo demandaobjeto. Es decir, la coordenada de un ancla se calcula solo si el usuario escribe explícitamente (A.east).

Esto ahorra mucho tiempo porque el 90% de los anclajes no se utilizan en absoluto y no debemos perder tiempo calculándolos.


cuando tikZ está dibujando la ruta de fondo, estas \anchorcoordenadas aún no se han calculado. Si tikZ calcula estas coordenadas solo para el dibujo, entonces no tiene sentido usarlas \anchoren primer lugar... simplemente haz todo \savedanchor.

Entonces no se trata de compatibilidad TeX. TikLos Z prefieren el código TeX puro porque son más rápidos. El autor decide dedicar dos horas más para ahorrarle dos segundos a millones de personas. En mi opinión, deberíamos decir que TikZ está diseñado para TeX y es compatible con LaTeX.


En tu caso, todo depende de ti. ¿Quieres escribir códigos simples y esperar un par de milisegundos más? ¿O prefieres jugar con \pgf@x? Personalmente prefiero lo primero.

información relacionada