我的目标是编写一个 pstricks 宏,用其相应的色带绘制电阻器,cf维基百科。我的想法是定义一个命令 psResistor,其工作方式如下:\psResistor(0,0){3,4,5,6}
将电阻器放置在原点,颜色为 3(橙色)、4(黄色)和 5(绿色),距离稍宽一些为 6(蓝色)。
因此,我首先用 定义颜色\definecolor
。我对这一点的疑问是最好将这些定义放在哪里。我不一定希望它们在其他地方可用。
然后我定义一个 PSTricks 对象psResistor
来处理可选参数,然后将颜色传递给\psResistor@iii
。现在我有一个实际的问题:参数的数量可能不同。如果是三个,我会添加一个黑色的带子。可能是四个,可能是五个,也可能是六个。我需要的是某种巧妙的机制,可以分配颜色因此。
我以前遇到过类似的问题,与\vector
cf的定义有关排版列向量
我使用了一种可以附加的解决方案,
,但也许这里有更好的方法,它可以处理最后一个颜色带的额外空间。
关于 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),但这不是有效电阻的颜色编码。