% $Id: pst-electricfield.tex 479 2011-03-26 10:12:49Z herbert $
%% Package `pst-electricfield.tex'
%%
%% Manuel Luque
%% Jürgen Gilg
%% Patrice Megret
%% 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 electric field lines
%% It uses the method from Euler
%%
\csname PSTElectricFieldLoaded\endcsname
\let\PSTElectricFieldLoaded\endinput
%
% Requires some packages
\ifx\PSTricksLoaded\endinput\else \input pstricks   \fi
\ifx\MultidoLoaded\endinput\else  \input multido.tex\fi
\ifx\PSTXKeyLoaded\endinput\else  \input pst-xkey   \fi
%
\def\fileversion{0.14}
\def\filedate{2011/03/26}
\message{`pst-electricfield' v\fileversion, \filedate\space (ml,jg,hv)}
%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax
%
\SpecialCoor
\pst@addfams{pst-electricfield}

%% prologue for postcript
\pstheader{pst-electricfield.pro}%

%% [q1 x1 y1 N1 plotCharge] [q2 x2 y2 N2 plotCharge] [...] etc
%% [charge, coordonnees, nombre de lignes, plotCircle]
%% number of lines and boolean for the circle are optional
\define@key[psset]{pst-electricfield}{Q}[{[1 -2 0 10][1 1 0][1 0 1 15]}]{\def\psk@electricfieldQ{#1}}
\psset[pst-electricfield]{Q=[1 -2 0 10][1 1 0][1 0 1 15]}
\define@key[psset]{pst-electricfield}{N}[17]{\def\psk@electricfieldN{#1 }} %% par defaut 16 lignes
\psset[pst-electricfield]{N=17}
%% nombre de points du trace
\define@key[psset]{pst-electricfield}{points}[400]{\def\psk@electricfieldpoints{#1 }}
\psset[pst-electricfield]{points=400}
%% pas du trace
\define@key[psset]{pst-electricfield}{Pas}[0.025]{\def\psk@electricfieldPas{#1 }}
\psset[pst-electricfield]{Pas=0.025}
\define@key[psset]{pst-electricfield}{posArrow}[0.25]{\def\psk@ElectricFieldposArrow{#1 }}
\psset[pst-electricfield]{posArrow=0.25}
%
\def\tx@EFieldDict{ tx@EFieldDict begin }
%
\def\psElectricfield{\pst@object{psElectricfield}}
\def\psElectricfield@i{%
 \pst@killglue%
 \addbefore@par{radius=1mm}%
 \begin@OpenObj%
 \pssetlength\pst@dimb\psk@radius
 \addto@pscode{%
   \tx@EFieldDict
   /QXYN [\psk@electricfieldQ] def
   /ChargeRadius \pst@number\pst@dimb def
   /N \psk@electricfieldN def
   /NbrePoints \psk@electricfieldpoints def
   /Pas \psk@electricfieldPas def
   /posArrow \psk@ElectricFieldposArrow def
   /arrowscale { \psk@arrowscale } def
   /xUnit \pst@number\psxunit def
   /yUnit \pst@number\psyunit def
   Electricfield
   end
}%
 \end@OpenObj%
 \ignorespaces}

\define@key[psset]{pst-electricfield}{Vmax}[10]{\def\psk@electricfieldVmax{#1 }}
\psset[pst-electricfield]{Vmax=10}
\define@key[psset]{pst-electricfield}{Vmin}[-10]{\def\psk@electricfieldVmin{#1 }}
\psset[pst-electricfield]{Vmin=-10}
\define@key[psset]{pst-electricfield}{stepV}[2]{\def\psk@electricfieldStepV{#1 }}
\psset[pst-electricfield]{stepV=2}
\define@key[psset]{pst-electricfield}{stepFactor}[0.67]{\def\psk@electricfieldStepFactor{#1 }}
\psset[pst-electricfield]{stepFactor=0.67}
%
\def\psEquipotential{\pst@object{psEquipotential}}
\def\psEquipotential@i(#1,#2)(#3,#4){%
 \pst@killglue%
 \addbefore@par{radius=1mm}%
 \begin@OpenObj%
 \pssetlength\pst@dimb\psk@radius
 \addto@pscode{%
  \tx@EFieldDict
  /QXYN [\psk@electricfieldQ] def
  /ChargeRadius \pst@number\pst@dimb def
  /N \psk@electricfieldN def
  /NbrePoints \psk@electricfieldpoints def
  /Vmax \psk@electricfieldVmax def
  /Vmin \psk@electricfieldVmin def
  /StepV \psk@electricfieldStepV def
  /StepFactor \psk@electricfieldStepFactor def
  /posArrow \psk@ElectricFieldposArrow def
  /arrowscale { \psk@arrowscale } def
  /xUnit \pst@number\psxunit def
  /yUnit \pst@number\psyunit def
  /LW \pst@number\pslinewidth def
  /xMin #1 def
  /xMax #3 def
  /yMin #2 def
  /yMax #4 def
  Equipotential
  end
 }%
\end@OpenObj%
 \ignorespaces}
\catcode`\@=\PstAtCode\relax
%% END
\endinput