\pgfdeclareshape 的“取消旋转”部分

\pgfdeclareshape 的“取消旋转”部分

我当时正试图非常好的问题关于为 circuitikz 构建芯片,我遇到了一个问题。我将其简化为这个 MWE:

\documentclass[tikz, border=2mm]{standalone}

\pgfdeclareshape{chip}{
\savedanchor\center{\pgfpoint{0pt}{0pt}}
\anchor{center}{\center}
  \backgroundpath{%
    \pgfpathrectanglecorners{\pgfpoint{-.5cm}{-1cm}}%
    {\pgfpoint{.5cm}{1cm}}%
    \pgftext[right, at=\pgfpoint{.5cm}{0.5cm}]{\tiny 1\ }
    \pgftext[right, at=\pgfpoint{.5cm}{-0.5cm}]{\tiny 12\ }
    \pgftext[left, at=\pgfpoint{-.5cm}{0.5cm}]{\tiny\ 3}
    \pgftext[left, at=\pgfpoint{-.5cm}{-0.5cm}]{\tiny\ 14}
  }%
}

\begin{document}

\begin{tikzpicture}
\node [chip, draw] (A) {A};
\node [chip, draw, rotate=-90](B) at (2,2){B};
\node [chip, draw, rotate=-180](C) at (2,0){C};
\end{tikzpicture}

\end{document}

其结果如下:

在此处输入图片描述

哪一个几乎好的。标签的位置(尤其是小数字)没问题,但是 --- 是否可以更改形状定义以便不旋转他们?即使只是 90 度的倍数也可以。

如果有办法从形状内部“读取”旋转,我可以使用例如ifs4 种情况,或类似的东西。

答案1

这是一项建议。问题是键rightleft和是离散的,这意味着结果对于所有可能的旋转角度来说都不会很好topbottom

  1. \pgfgettransformentries\a\b\temp\temp\temp\temp读出旋转矩阵的条目。请注意,此版本的答案假设您不进行任何拉伸。计算旋转角度。
  2. 然后确定象限模 2 ,以便在文本right和对齐文本left之间切换。topbottom
  3. 这些条目“未旋转”。

\documentclass[tikz, border=2mm]{standalone}

\pgfdeclareshape{chip}{
\savedanchor\center{\pgfpoint{0pt}{0pt}}
\anchor{center}{\center}
  \backgroundpath{%
    \pgfpathrectanglecorners{\pgfpoint{-.5cm}{-1cm}}%
    {\pgfpoint{.5cm}{1cm}}%
    \pgfgettransformentries\a\b\temp\temp\temp\temp
    \pgfmathsetmacro{\rot}{-atan2(\b,\a)}
    \pgfmathtruncatemacro{\quadrant}{mod(4+int(360+(\rot+45)/90),4)}
    \ifcase\quadrant
      \pgftext[rotate=\rot,right, at=\pgfpoint{.5cm}{0.5cm}]{\tiny 1\ }
      \pgftext[rotate=\rot,right, at=\pgfpoint{.5cm}{-0.5cm}]{\tiny 12\ }
      \pgftext[rotate=\rot,left, at=\pgfpoint{-.5cm}{0.5cm}]{\tiny\ 3}
      \pgftext[rotate=\rot,left, at=\pgfpoint{-.5cm}{-0.5cm}]{\tiny\ 14}
    \or
      \pgftext[rotate=\rot,top, at=\pgfpoint{.5cm}{0.45cm}]{\tiny 3\ }
      \pgftext[rotate=\rot,bottom, at=\pgfpoint{.5cm}{-0.45cm}]{\tiny 1\ }
      \pgftext[rotate=\rot,top, at=\pgfpoint{-.5cm}{0.45cm}]{\tiny\ 14}
      \pgftext[rotate=\rot,bottom, at=\pgfpoint{-.5cm}{-0.45cm}]{\tiny\ 12}
    \or
      \pgftext[rotate=\rot,right, at=\pgfpoint{.5cm}{0.5cm}]{\tiny 14\ }
      \pgftext[rotate=\rot,right, at=\pgfpoint{.5cm}{-0.5cm}]{\tiny 3\ }
      \pgftext[rotate=\rot,left, at=\pgfpoint{-.5cm}{0.5cm}]{\tiny\ 12}
      \pgftext[rotate=\rot,left, at=\pgfpoint{-.5cm}{-0.5cm}]{\tiny\ 1}
    \or
      \pgftext[rotate=\rot,top, at=\pgfpoint{.5cm}{0.45cm}]{\tiny 12\ }
      \pgftext[rotate=\rot,bottom, at=\pgfpoint{.5cm}{-0.45cm}]{\tiny 14\ }
      \pgftext[rotate=\rot,top, at=\pgfpoint{-.5cm}{0.45cm}]{\tiny\ 1}
      \pgftext[rotate=\rot,bottom, at=\pgfpoint{-.5cm}{-0.45cm}]{\tiny\ 3}
    \fi  
  }%
}

\begin{document}

\begin{tikzpicture}
\node [chip, draw] (A) {A};
\node [chip, draw, rotate=-90](B) at (2,2){B};
\node [chip, draw, rotate=-180](C) at (2,0){C};
\node [chip, draw, rotate=90](B) at (0,2){D};
\end{tikzpicture}

\end{document}

在此处输入图片描述

在阅读问题时,我不确定您是否也想“取消旋转”主标签。如果这样做,则可能需要使用不同的方法(我还没有尝试这样做)。

相关内容