diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/pstricks/contrib/pst-magneticfield/tex |
Initial commit
Diffstat (limited to 'graphics/pstricks/contrib/pst-magneticfield/tex')
-rw-r--r-- | graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex b/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex new file mode 100644 index 0000000000..690afeca27 --- /dev/null +++ b/graphics/pstricks/contrib/pst-magneticfield/tex/pst-magneticfield.tex @@ -0,0 +1,237 @@ +%% Package `pst-magneticfield.tex' +%% +%% Manuel Luque +%% Jürgen Gilg +%% Herbert Voß +%% +%% This program can be redistributed and/or modified under +%% the terms of the LaTeX Project Public License Distributed +%% from CTAN archives in directory macros/latex/base/lppl.txt. +%% +%% A PSTricks related package to draw magnetic field lines +%% It uses the method from Heun +%% +\csname PSTMagneticFieldLoaded\endcsname +\let\PSTMagneticFieldLoaded\endinput +% +% Requires some packages +\ifx\PSTricksLoaded\endinput\else \input pstricks \fi +\ifx\PSTthreeDLoaded\endinput\else\input pst-3d \fi +\ifx\PSTnodesLoaded\endinput\else \input pst-node \fi +\ifx\PSTarrowLoaded\endinput\else \input pst-arrow \fi +\ifx\MultidoLoaded\endinput\else \input multido.tex\fi +\ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi +% +\def\fileversion{1.16} +\def\filedate{2019/01/21} +\message{`pst-magneticfield' v\fileversion, \filedate\space (ml,jg,hv)} +% +\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax +% +\SpecialCoor +\pst@addfams{pst-magneticfield} + +%% prologue for postcript +\pstheader{pst-magneticfield.pro}% + +% the first three parameter cannot be read with \pst@getint, because \pstFP.. do not like +% the values ... used in \psmagenticfieldThreeD +\define@key[psset]{pst-magneticfield}{R}[1]{\def\psk@magneticfieldR{#1}}% rayon d'une spire +\define@key[psset]{pst-magneticfield}{N}[6]{\def\psk@magneticfieldN{#1}}% nombre de spires +\define@key[psset]{pst-magneticfield}{L}[4]{\def\psk@magneticfieldL{#1}}% Longueur de la bobine +\define@key[psset]{pst-magneticfield}{nL}[8]{\pst@getint{#1}\psk@magneticfieldNL}% nombre de lignes de champ +\define@key[psset]{pst-magneticfield}{numSpires}[]{\def\psk@magneticfieldChoixSpires{#1}}% choix individuel des spires +\psset[pst-magneticfield]{numSpires=}% toutes les spires par défaut +\define@key[psset]{pst-magneticfield}{pointsB}[500]{\pst@getint{#1}\psk@magneticfieldB} +\define@key[psset]{pst-magneticfield}{pointsS}[1000]{\pst@getint{#1}\psk@magneticfieldS}% nombre de points autour de chaque spire +\define@key[psset]{pst-magneticfield}{PasB}[0.02]{\pst@checknum{#1}\psk@magneticfieldPasB}% incrément du tracé autour de la bobine +\define@key[psset]{pst-magneticfield}{PasS}[0.00275]{\pst@checknum{#1}\psk@magneticfieldPasS}% incrément du tracé autour de chaque spire +\define@key[psset]{pst-magneticfield}{nS}[1]{\pst@getint{#1}\psk@magneticfieldNS}% nombre de lignes autour de chaque spire +\define@key[psset]{pst-magneticfield}{styleSpire}[styleSpire]{\def\psk@styleSpire{#1}} +\define@key[psset]{pst-magneticfield}{styleCourant}[sensCourant]{\def\psk@styleCourant{#1}} +% +\newpsstyle{styleSpire}{linecap=1,linecolor=red,linewidth=2\pslinewidth} +\newpsstyle{sensCourant}{linecolor=red,linewidth=2\pslinewidth,arrowinset=0.1} +% +\define@boolkey[psset]{pst-magneticfield}[Pst@]{drawSelf}[true]{} +\define@boolkey[psset]{pst-magneticfield}[Pst@]{AntiHelmholtz}[true]{} +\define@boolkey[psset]{pst-magneticfield}[Pst@]{StreamDensityPlot}[true]{} +\define@boolkey[psset]{pst-magneticfield}[Pst@]{setgray}[true]{} +\define@boolkey[psset]{pst-magneticfield}[Pst@]{changeNS}[true]{} +% +\psset[pst-magneticfield]{R=1,L=4,N=6,pointsB=500,pointsS=1000, + PasB=0.02,PasS=0.00275,nS=1,nL=8,drawSelf,styleSpire=styleSpire, + styleCourant=sensCourant,AntiHelmholtz=false,StreamDensityPlot=false,setgray=false, + changeNS=false} +% +\def\tx@MFieldDict{ tx@MFieldDict begin } +% +\def\psmagneticfield{\pst@object{psmagneticfield}} +\def\psmagneticfield@i{\@ifnextchar({\psmagneticfield@ii}{\psmagneticfield@iii(-6,-5)(6,5)}} +\def\psmagneticfield@ii(#1,#2){\@ifnextchar({\psmagneticfield@iii(#1,#2)}{\psmagneticfield@iii(#1,#2)(6,5)}} +\def\psmagneticfield@iii(#1,#2)(#3,#4){% + \pst@killglue% + \ifPst@AntiHelmholtz\addbefore@par{N=2}\fi% + \begin@SpecialObj% + \pst@Verb{% make it global + /NombreSpires \psk@magneticfieldN\space def + /Radius \psk@magneticfieldR\space def + /nombreLignes \psk@magneticfieldNL\space def + /TableauSpires [\psk@magneticfieldChoixSpires] def + /StepLines Radius nombreLignes 1 add div def + NombreSpires 1 eq + { /Longueur 0 def + /inter 0 def } + { /Longueur \psk@magneticfieldL\space def + /inter Longueur NombreSpires 1 sub div def } ifelse % intervalle entre 2 spires + \ifPst@AntiHelmholtz + /AntiHelmholtz true def + TableauSpires length 0 eq {/TS [1 2] def} + {/TS TableauSpires def } ifelse + /inter Radius def + /yA Radius 2 div def + \else + /AntiHelmholtz false def + TableauSpires length 0 eq {/TS [1 1 NombreSpires {} for] def} + {/TS TableauSpires def } ifelse + /yA Longueur 2 div def + \fi + /NbrePointsB \psk@magneticfieldB\space def + /NbrePointsS \psk@magneticfieldS\space def + /PasB \psk@magneticfieldPasB\space def + /PasS \psk@magneticfieldPasS\space def + /nS \psk@magneticfieldNS\space def +% pour la carte de densite + /xMin #1 def + /xMax #3 def + % NombreSpires 1 eq {/yMax 2 Radius mul def}{/yMax Longueur 2 mul def} ifelse + /yMax #4 def + /yMin #2 def + /Unit \pst@number\psunit def + /xUnit \pst@number\psxunit def + /yUnit \pst@number\psyunit def + /StreamDensityPlot \ifPst@StreamDensityPlot true \else false \fi def + /Setgray \ifPst@setgray true \else false \fi def + }% + \addto@pscode{ \tx@MFieldDict %\pst@magnetrotate rotate + MagneticField end }% + \ifPst@drawSelf + \ifPst@AntiHelmholtz + \psline[style=\psk@styleSpire](!Radius neg Radius 2 div)(!Radius Radius 2 div) + \psline[style=\psk@styleSpire](!Radius neg Radius 2 div neg)(!Radius Radius 2 div neg) + \ifPst@changeNS + \psline[style=\psk@styleCourant]{->}(!-0.2 Radius 2 div)(!0.2 Radius 2 div) + \psline[style=\psk@styleCourant]{<-}(!-0.2 Radius 2 div neg)(!0.2 Radius 2 div neg) + \else + \psline[style=\psk@styleCourant]{<-}(!-0.2 Radius 2 div)(!0.2 Radius 2 div) + \psline[style=\psk@styleCourant]{->}(!-0.2 Radius 2 div neg)(!0.2 Radius 2 div neg) + \fi + \else + \ifPst@changeNS + \multido{\i=1+1}{\psk@magneticfieldN}{% numero de la spire + \pst@Verb{ /Yspire yA \i\space 1 sub inter mul sub def } % position de la spire + \psline[style=\psk@styleSpire](! Radius neg Yspire)(! Radius Yspire) + \psline[style=\psk@styleCourant]{<-}(! -0.2 Yspire)(! 0.2 Yspire)}% + \else + \multido{\i=1+1}{\psk@magneticfieldN}{% numero de la spire + \pst@Verb{ /Yspire yA \i\space 1 sub inter mul sub def } % position de la spire + \psline[style=\psk@styleSpire](! Radius neg Yspire)(! Radius Yspire) + \psline[style=\psk@styleCourant]{->}(! -0.2 Yspire)(! 0.2 Yspire)}% + \fi + \fi + \fi + \end@SpecialObj + \ignorespaces} +% +\newpsstyle{grille}{subgriddiv=0,gridcolor=lightgray,griddots=10} +\newpsstyle{cadre}{linecolor=green!20} +% +\def\psmagneticfieldThreeD{\pst@object{psmagneticfieldThreeD}} +\def\psmagneticfieldThreeD@i(#1,#2)(#3,#4){% + \ifPst@AntiHelmholtz\addto@par{N=2}\fi + \begingroup + \use@par + \ifPst@AntiHelmholtz + \pstFPdiv\yA{\psk@magneticfieldR}{2} + \ThreeDput{% + \begin{psclip}{\psframe(#1,#2)(#3,#4)} + \psframe*[style=cadre](#1,#2)(#3,#4) + \psgrid[style=grille](#1,#2)(#3,#4) + \psmagneticfield[drawSelf=false](#1,#2)(#3,#4)% + \end{psclip}} + \ThreeDput[normal=0 1 0](0,\yA,0){% + \psarc[linecolor=red,linewidth=3\pslinewidth](0,0){\psk@magneticfieldR}{0}{180} + \psarc[linecolor=red,linewidth=3\pslinewidth]{<-}(0,0){\psk@magneticfieldR}{80}{90} + \psarc[linecolor=red,linewidth=1\pslinewidth,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}} + \ThreeDput[normal=0 1 0](0,-\yA,0){% + \psarc[linecolor=red,linewidth=3\pslinewidth](0,0){\psk@magneticfieldR}{0}{180} + \psarc[linecolor=red,linewidth=3\pslinewidth]{->}(0,0){\psk@magneticfieldR}{80}{90} + \psarc[linecolor=red,linewidth=1\pslinewidth,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}} + \else + \ifnum\psk@magneticfieldN=1 + \def\MF@inter{0} + \def\yA{0} + \else + \pstFPsub\CalcIntermediaire{\psk@magneticfieldN}{1} + \pstFPdiv\MF@inter{\psk@magneticfieldL}{\CalcIntermediaire} + \pstFPdiv\yA{\psk@magneticfieldL}{2} + \fi + \ThreeDput{% + \begin{psclip}{\psframe(#1,#2)(#3,#4)} + \psframe*[style=cadre](#1,#2)(#3,#4) + \psgrid[style=grille](#1,#2)(#3,#4) + \psmagneticfield[drawSelf=false](#1,#2)(#3,#4)% + \end{psclip}} + \multido{\iN=1+1,\iS=0+1}{\psk@magneticfieldN}{% + \pstFPmul\MF@calcA{\iS}{\MF@inter} + \pstFPsub\posSpire{\yA}{\MF@calcA} + \ThreeDput[normal=0 1 0](0,\posSpire,0){% + \psarc[style=\psk@styleSpire](0,0){\psk@magneticfieldR}{0}{180} + \psarc[style=\psk@styleCourant]{->}(0,0){\psk@magneticfieldR}{80}{90} + \psarc[style=\psk@styleSpire,linestyle=dashed](0,0){\psk@magneticfieldR}{180}{360}}% + }% + \fi + \endgroup} +% +\define@boolkey[psset]{pst-magneticfield}[Pst@]{showField}[true]{} +\define@boolkey[psset]{pst-magneticfield}[Pst@]{showPoleLabels}[true]{} +\define@key[psset]{pst-magneticfield}{fontstyle}[\large\bfseries\sffamily]{\def\psk@label@fontstyle{#1}} +\define@key[psset]{pst-magneticfield}{magnetScale}[1 1]{\def\pst@magnetscale{#1}} +\psset[pst-magneticfield]{showPoleLabels,fontstyle=\large\bfseries\sffamily,showField=false, + magnetScale=1 1} + +\def\ps@Bar@Magnet{% + \psscalebox{\pst@magnetscale}{% + \psframe*[linecolor=Green](-0.75,-1.75)(0.75,0)% + \psframe*[linecolor=BrickRed](-0.75,0)(0.75,1.75)% + \ifPst@showPoleLabels + \rput{0}(0,1){\textcolor{white}{\psk@label@fontstyle N}}% + \rput{0}(0,-1){\textcolor{white}{\psk@label@fontstyle S}}% + \fi} +}% + +\def\psBarMagnet{\pst@object{psBarMagnet}} +\def\psBarMagnet@i{\@ifnextchar(\psBarMagnet@ii{\psBarMagnet@ii(0,0)}}% +\def\psBarMagnet@ii(#1){% + \pst@killglue + \begingroup + \addbefore@par{linewidth=2pt,R=0.8,L=3,N=4,pointsS=200,nL=9,nS=0,PasB=0.1,numSpires=0,arrowscale=1.5,arrowinset=0.1}% + \use@par + \ifPst@showField + \rput(#1){% + \psscalebox{0.4 0.5}{\psmagneticfield[drawSelf=false](-8,-10)(8,10)% + \multido{\rA=0.6+0.3,\rB=0.8+0.4,\iA=-60+20,\iB=60+-20}{4}{% + \pccurve[ncurv=\rB,angleA=\iA,angleB=\iB,ArrowInside=->,ArrowInsideNo=2](0.7,\rA)(0.7,-\rA)% + \psscalebox{-1 1}{\pccurve[ncurv=\rB,angleA=\iA,angleB=\iB,ArrowInside=->,ArrowInsideNo=2](0.7,\rA)(0.7,-\rA)}% + }}}% + \fi + \rput(#1){\ps@Bar@Magnet}% + \endgroup + \ignorespaces +} +% +\catcode`\@=\PstAtCode\relax +% +%% END +\endinput + |