用于色带电阻器的 PSTricks 宏

用于色带电阻器的 PSTricks 宏

我的目标是编写一个 pstricks 宏,用其相应的色带绘制电阻器,cf维基百科。我的想法是定义一个命令 psResistor,其工作方式如下:\psResistor(0,0){3,4,5,6}将电阻器放置在原点,颜色为 3(橙色)、4(黄色)和 5(绿色),距离稍宽一些为 6(蓝色)。

在此处输入图片描述

因此,我首先用 定义颜色\definecolor。我对这一点的疑问是最好将这些定义放在哪里。我不一定希望它们在其他地方可用。

然后我定义一个 PSTricks 对象psResistor来处理可选参数,然后将颜色传递给\psResistor@iii。现在我有一个实际的问题:参数的数量可能不同。如果是三个,我会添加一个黑色的带子。可能是四个,可能是五个,也可能是六个。我需要的是某种巧妙的机制,可以分配颜色因此。


我以前遇到过类似的问题,与\vectorcf的定义有关排版列向量 我使用了一种可以附加的解决方案,,但也许这里有更好的方法,它可以处理最后一个颜色带的额外空间。

关于 Tikz 的色带电阻器也有类似的问题,但这里没有关于自动颜色的问题:用色带代码绘制电阻


以下是我目前所掌握的信息:

\documentclass{standalone}
\usepackage{pstricks}

\begin{document}

 \definecolor{0}{RGB}{50 50 50}
 \definecolor{1}{named}{brown}
 \definecolor{2}{named}{red}
 \definecolor{3}{named}{orange}
 \definecolor{4}{named}{yellow}
 \definecolor{5}{named}{green}
 \definecolor{6}{named}{blue}
 \definecolor{7}{named}{violet}
 \definecolor{8}{RGB}{115 115 115}
 \definecolor{9}{named}{white}
 \definecolor{-1}{RGB}{200 200 200}
 \definecolor{-2}{RGB}{212 175 55}

\makeatletter
\def\psResistor{\pst@object{psResistor}}
\def\psResistor@i{\@ifnextchar({\psResistor@ii}{\psResistor@ii(0,0)}}
\def\psResistor@ii(#1)#2{%
  \begin@ClosedObj%
  \rput(#1){
    \psline(-2,0)(-1,0)
    \psframe[% draw frame of the resistor:
    fillstyle=solid,fillcolor=cyan!15,dimen=inner](-1,-.5)(1,.5)
    \psline(1,0)(2,0)
    \psResistor@iii(#2)% add the colored lines
  }% end rput.
  \end@ClosedObj%
}% end psResistor@ii.
\def\psResistor@iii(#1,#2,#3){
 \psline[linewidth=5pt,linecolor=#1](-.7,-.5)(-.7,.5)
 \psline[linewidth=5pt,linecolor=#2](-.3,-.5)(-.3,.5)
 \psline[linewidth=5pt,linecolor=#3]( .1,-.5)( .1,.5)
 \psline[linewidth=5pt,linecolor=black]( .7,-.5)( .7,.5)
}% end \psResistor@iii.
\makeatother

\psset{unit=1cm}
\begin{pspicture}(-1.5,-1)(3,1)
\psResistor(0,0){3,4,5}
\end{pspicture}

\end{document}

答案1

使用可选参数,可以轻松扩展到灵活的颜色数量。

\documentclass{standalone}
\usepackage{pstricks}

\begin{document}

 \definecolor{0}{RGB}{50 50 50}
 \definecolor{1}{named}{brown}
 \definecolor{2}{named}{red}
 \definecolor{3}{named}{orange}
 \definecolor{4}{named}{yellow}
 \definecolor{5}{named}{green}
 \definecolor{6}{named}{blue}
 \definecolor{7}{named}{violet}
 \definecolor{8}{RGB}{115 115 115}
 \definecolor{9}{named}{white}
 \definecolor{-1}{RGB}{200 200 200}
 \definecolor{-2}{RGB}{212 175 55}

\makeatletter
\define@key[psset]{pstricks}{ResistorCol}{\pst@setRcolor#1,,,!!}
\def\pst@setRcolor#1,#2,#3,#4!!{%
  \def\psResistorColA{#1}\def\psResistorColB{#2}\def\psResistorColC{#3}}
\psset{ResistorCol={}}%   no color lines

\def\psResistor{\pst@object{psResistor}}
\def\psResistor@i{\@ifnextchar({\psResistor@ii}{\psResistor@ii(0,0)}}
\def\psResistor@ii(#1){%
  \begingroup
  \use@par
  \rput(#1){%
    \psline(-2,0)(-1,0)
    \psframe[% draw frame of the resistor:
          fillstyle=solid,fillcolor=cyan!15,dimen=inner](-1,-.5)(1,.5)
    \psline(1,0)(2,0)
    \ifx\psResistorColA\@empty\else
      \psline[linewidth=5pt,linecolor=\psResistorColA](-.7,-.5)(-.7,.5)
      \psline[linewidth=5pt,linecolor=\psResistorColB](-.3,-.5)(-.3,.5)
      \psline[linewidth=5pt,linecolor=\psResistorColC]( .1,-.5)( .1,.5)
      \psline[linewidth=5pt,linecolor=black]( .7,-.5)( .7,.5)
    \fi
  }% end rput.
  \endgroup
}% end psResistor@ii.
\makeatother

\begin{pspicture}(-1.5,-1)(3,2)
\psResistor(0,1.1)
\psResistor[ResistorCol={3,4,5}](0,0)
\end{pspicture}

\end{document}

在此处输入图片描述

答案2

在这个答案中,我将使用该包详细说明 Herbert 的解决方案pst-circ。进一步,我实现了一个解决方案,该解决方案接受不同数量的颜色带(3-6),并且它还会均匀分布颜色:颜色带位于不同的位置,具体取决于带的总数,并且间距会发生变化。

\documentclass{standalone}
\usepackage{pst-circ}

% Definition of the colors
\definecolor{0}{RGB}{45 45 45}%
\definecolor{1}{named}{brown}%
\definecolor{2}{named}{red}%
\definecolor{3}{named}{orange}%
\definecolor{4}{named}{yellow}%
\definecolor{5}{named}{green}%
\definecolor{6}{named}{blue}%
\definecolor{7}{named}{violet}%
\definecolor{8}{RGB}{125 125 125}%
\definecolor{9}{named}{white}%
\definecolor{-2}{RGB}{200 200 200}%
\definecolor{-1}{RGB}{212 175 55}%

\makeatletter
\define@key[psset]{pstricks}{ResistorCol}{\pst@setRcolor#1,,,,,,!!}
\def\pst@setRcolor#1,#2,#3,#4,#5,#6,#7!!{% #7 will gobble all ',' !
  \def\psResistorColA{#1}% Band A
  \def\psResistorColB{#2}% Band B
  \def\psResistorColC{#3}% Band C
  \def\psResistorColD{#4}% Band D
  \def\psResistorColE{#5}% Band E
  \def\psResistorColF{#6}}%Band F and end \def setRcolor.

\newCircDipole{psResistor}%
\def\pst@draw@psResistor{%
\begingroup%
\use@par%
  % draw the resistor:
  \psclip{\pspolygon[%
  linearc=.1,linestyle=none,fillstyle=solid,fillcolor=cyan!15]% 
  (.5,.3)(.35,.3)(.31,.27)(.27,.24)% upper right corner.
  (-.27,.24)(-.31,.27)(-.35,.3)(-.5,.3)% upper left.
  (-.5,-.3)(-.35,-.3)(-.31,-.27)(-.27,-.24)% lower left.
  (.27,-.24)(.31,-.27)(.35,-.3)(.5,-.3)% lower right.
  }%
  \psset{dotstyle=B|,dotsize=.6\psyunit}%
  \ifx\psResistorColF\@empty
  \ifx\psResistorColE\@empty
  \ifx\psResistorColD\@empty
    % just three present:
    \psset{xunit=1.4\psxunit}
    \rput(-.1,0){
    \psdot[linecolor=\psResistorColA](-.08,0)
    \psdot[linecolor=\psResistorColB]( .07,0)
    \psdot[linecolor=\psResistorColC]( .27,0)}% end rput.
  \else% four present
    \psset{xunit=1.25\psxunit}
   % \rput(.1,0){
    \psdot[linecolor=\psResistorColA](-.23,0)
    \psdot[linecolor=\psResistorColB](-.08,0)
    \psdot[linecolor=\psResistorColC]( .07,0)
    \psdot[linecolor=\psResistorColD]( .27,0)%}% end rput.
    \fi
  \else% five present:
    \psset{xunit=1.1\psxunit}
    \rput(-.1,0){
    \psdot[linecolor=\psResistorColA](-.23,0)
    \psdot[linecolor=\psResistorColB](-.08,0)
    \psdot[linecolor=\psResistorColC]( .07,0)
    \psdot[linecolor=\psResistorColD]( .27,0)
    \psdot[linecolor=\psResistorColE]( .42,0)}% end rput.
    \fi
  \else% six present:
    \psdot[linecolor=\psResistorColA](-.38,0)
    \psdot[linecolor=\psResistorColB](-.23,0)
    \psdot[linecolor=\psResistorColC](-.08,0)
    \psdot[linecolor=\psResistorColD]( .07,0)
    \psdot[linecolor=\psResistorColE]( .27,0)
    \psdot[linecolor=\psResistorColF]( .42,0)
  \fi
  \endpsclip%
\endgroup%
  % Re-draw the line around the shape (copy paste):
  \pspolygon[linearc=.1,linewidth=0.7\pslinewidth]% 
  (.5,.3)(.35,.3)(.31,.27)(.27,.24)% upper right corner.
  (-.27,.24)(-.31,.27)(-.35,.3)(-.5,.3)% upper left.
  (-.5,-.3)(-.35,-.3)(-.31,-.27)(-.27,-.24)% lower left.
  (.27,-.24)(.31,-.27)(.35,-.3)(.5,-.3)% lower right.
  % node connections (c.f. pst-circ):
  \pnode(-.51,0){dipole@1}%
  \pnode(.51,0){dipole@2}%
}% end definition of \pst@draw@psResistor.
\makeatother

\begin{document}
\begin{pspicture}(-1,-1)(2,1)
    \psResistor[ResistorCol={4,5,6}](-1,0)(2,0){}
\end{pspicture}
\end{document}

我意识到此代码很容易改进,请随意改进。以下是使用该代码的一些示例:

\psResistor[ResistorCol={4,5,6}](-1,0)(2,0){}
\psResistor[ResistorCol={4,5,6,3}](-1,0)(2,0){}
\psResistor[ResistorCol={4,5,6,7,2}](-1,0)(2,0){}
\psResistor[ResistorCol={8,9,7,-1,2,0}](-1,0)(2,0){}

电阻一和电阻二

电阻三和电阻四

请注意,没有实施技术限制。例如,第一个波段可以设置为银色 (-2),但这不是有效电阻的颜色编码。

相关内容