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-optexp |
Initial commit
Diffstat (limited to 'graphics/pstricks/contrib/pst-optexp')
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/Changes | 266 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/Makefile | 88 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/README | 28 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/pst-optexp-DE.pdf | bin | 0 -> 3057779 bytes | |||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/pst-optexp-quickref.pdf | bin | 0 -> 56318 bytes | |||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/pst-optexp.dtx | 25632 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/pst-optexp.ins | 101 | ||||
-rw-r--r-- | graphics/pstricks/contrib/pst-optexp/pst-optexp.pdf | bin | 0 -> 3016989 bytes |
8 files changed, 26115 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-optexp/Changes b/graphics/pstricks/contrib/pst-optexp/Changes new file mode 100644 index 0000000000..ad6fd6c872 --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/Changes @@ -0,0 +1,266 @@ +5.2 2014-11-26 + * Added component \asphericlens. + * Added component \axicon. + * Added component \optwedge. + +5.1 2014-11-19 + * Added component \oapmirror. + * Added support for filled beams with path interfaces. + +5.0 2014-10-30 + * Added support for arbitrary interface shapes (experimental, + requires the pst-intersect package and pstricks version 2.53). + * Added component \parabolicmirror. + +4.10 2014-06-04 + * Added value firstcomp to parameter beamalign. + * Modified \optsource to handle also the beam alignment. + +4.9 2014-06-03 + * Added new component \optsource. + * Improved naming of the last component name, which can now be + accessed also by its number besides using N. + * Fixed bug related to extnodes together with compname + +4.8 2014-02-28 + * Added component \optaom. + * Added option beammode. + * Added option showinterfaces. + +4.7 2014-01-12 + * Added syntax <\prm{num} for accessing relative component IDs. + +4.6 2013-11-27 + * Added option extnodes. + * Added option optdipolecomp. + * Added option opttripolecomp. + +4.5 2013-07-21 + * Added option usewirestyle. + * Added line style fade, with options fadeto, fadepoints, + fadefunc, and fadefuncname.. + +4.4 2013-07-14 + * Added component \transmissiongrating. + * Modified innerlabel to explicitly set labelalign=c + * Fixed trailing spaces in savebeampoints (and savebeam). + * Allow Postscript code in angle. + +4.3a 2013-07-02 + * Fixed tripole alignment bugs introduced in version 4.3. + * Again fixed the alignment of reflective \optprism. + * Fixed improper alignment of \optprism label. + +4.3 2013-06-28 + * Added option raprismalign. + * Fixed alignment of \rightangleprism and rotation of its label. + +4.2 2013-06-07 + * Added option startinsidecount. + * Added option stopinsidecount. + * Added option beampathcount. + * Added option beamnodealign. + * Added \oeBeamVecMedian. + * Added \oeBeamCenter. + * Modified the orientation of a reflective \optprism. + * Fixed bug of \optprism and \rightangleprism inside an + \env{optexp} environment. + * Fixed bug of wrong \rightangleprism rotation in special cases. + * Fixed buggy handling of multiple saved beams. + +4.1 2013-05-21 + * Added option prismtype. + +4.0 2013-04-15 + * Added electrical components. + * Added wire connections with \drawwire. + * Added component \optarrowcomp. + * Added component \optbarcomp. + * Improved \optdetector. + * Extended \drawfiber to support component ranges. + * Extended couplersep to support automatic calculation. + * Fixed appearance of \optfiber. + * Fixed extnodealign to affect also multipoles. + * Fixed pswarning. + * Removed old, buggy beam connection code. + * Removed option conn. + * Removed option connjoin. + * Removed \newOptexpDipoleNolabel. + +3.6 2013-03-20 + * Added option compoffset. + * Added option beampathskip. + * Added option innercompalign. + * Fixed some bugs in the raytracing and beam code. + +3.5 2013-02-22 + * Added option filterangle. + * Fixed wrong output fiber style in \optcoupler + * Fixed strange Postscript error which occured with some + interpreters. + +3.4 2013-02-03 + * Fixed bugs when using fillstyle for some components. + * Extended option switchsize. + * Modified coupler center node to be on the base line. + * Extended error checking for \drawbeam and \drawfiber. + * Fixed some bugs in the connection code. + +3.3a 2012-09-18 + * Fixed bug which was exposed by an update of pst-node. + * Fixed trailing spaces. + +3.3 2012-08-17 + * Extended \opttripole and \optdipole. + * Modified reference angle for label of \opttripole. + * Added option optdipolesize to support two interfaces for + \optdipole. + * Added option gratingalign. + * Added option forcebeaminside. + * Extended option mirrorradius. + * Improved \drawbeam and \drawwidebeam to be able to use + ArrowInside without linestyle. + * Fixed orientation of \oenodeBeamUp and \oenodeBeamLow. + * Fixed a bug related to beaminside and ambiguous components. + * Fixed some trailing spaces. + * Added more examples. + +3.2 2012-07-26 + * Added component \glanthompson. + * Added access to beam vectors with \oeBeamVec, \oeBeamVecUp and + \oeBeamVecLow. + * Fixed wrong computation of node distance in \fiberbox + * Fixed bug in \wdmsplitter for coupleralign=b and + couplertype=none + * Fixed bug when filling components placed with position=end/start + * Added value absolute to parameter labelref. + * Added examples. + +3.1 2012-07-17 + * Added component \fiberbox. + * Extended connection macros to not required curly braces around + node parenthesis any more. + * Modified \fibercollimator to have allowbeaminside=false by + default. + * Extended fiber couplers to allow using only two nodes. + * Fixed a bug concerning node expressions with \drawfiber + +3.0 2012-07-09 + * Modified beam connections with \drawbeam to support raytracing. + * Added wide beams with \drawwidebeam. + * Added \drawfiber for fiber connections. + * Added optexp environment for layering of components and + connections. + * Added german documentation. + * Modified naming of component nodes. + * Modified extnode to work with more components. + * Modified angle and rotateref to affect all components. + * Modified endbox to affect all components. + * Extended position by values start and end. + * Extended abspos by values start and end. + * Removed deprecated lens code which used lenswidth and lensheight + for construction. + * Added option platesize. + * Added option phwidth. + * Modified option caxislength. + * Deprecated option lampscale. + * Added style CrystalCaxis. + * Added style CrystalLamp. + * Added option optboxsize. + * Extended option detsize. + * Added style DetectorStyle. + * Removed deprecated \detector, use \optdetector. + * Extended option doveprismsize. + * Added style Polarization. + * Deprecated option pollinewidth. + * Removed option polwidth. + * Removed option pol. + * Added style VariableStyle. + * Added mirror type semitrans. + * Renamed \optgrid to \optgrating. + * Renamed optgridwidth to gratingwidth. + * Renamed optgridheight to gratingheight. + * Renamed optgriddepth to gratingdepth. + * Renamed optgridcount to gratingcount. + * Renamed optgridtype to gratingtype. + * Renamed optgridlinewidth to gratinglinewidth. + * Added option prismalign. + * Modified faulty alignment of \rightangleprism. + * Extended option optampsize. + * Extended option optmzmsize. + * Added option polcontroltype. + * Extended option isolatorsize. + * Added style IsolatorArrow. + * Extended option fdlsize. + * Added style FdlArrow. + * Extended option fiberpolsize. + * Added component \optcirculator. + * Extended option couplersize. + * Extended option couplertype. + * Renamed option align to coupleralign. + * Added style VariableCoupler. + * Added style FilterStyle. + * Extended option fibercolsize. + * Removed deprecated option labelrelative. + * Removed deprecated option iwidth. + * Removed deprecated option owidth. + * Removed deprecated option bswidth. + * Deprecated \newOptexpDipoleNolabel, use \newOptexpDipole. + * Deprecated option refractiveindex. + * Deprecated option conn. + * Extended option fiber. + +2.1 2009-11-05 + * Added component \optfiberpolarizer. + * Added option compshift. + * Added option label. + * Added option connjoin + * Added options addtoBeam and newBeam. + * Added style OptComp and related options addtoOptComp and + newOptComp. + * Added option bsstyle. + * Extended \fibercollimator to use up to four reference nodes. + * Improved thicklens to work also with plain lenses. + * Use pst-doc class for the documentation. + +2.0 2008-07-27 + * Added fiber-optical components. + * Added component \optdiode. + * Added component \pentaprism. + * Added component \rightangleprism. + * Added component \doveprism. + * Added component \optprism. + * Added \drawbeam. + * Added component connections (options fiber, conn and beam). + * Added option compname. + * Added option extnode. + * Renamed \detector to \optdetector. + +1.2 2008-06-17 + * Modified lens design to use interface curvatures. + * Added options lensradiusleft and lensradiusright. + * Added option thicklens. + * Added option lenstype. + * Added option mirrorradius (curved mirrors). + * Added option optgridtype (binary gratings). + * Added \newOptexpDipole. + * Added \newOptexpDipoleNolabel. + * Added \newOptexpTripole. + * Added \newOptexpFiberDipole. + * General improvements of \TeX{} and Postscript code + +1.1 2007-09-06 + * Improved labeling features. + * Added parameter labelref. + * Replaced labelrelative by labelref=relative. + * Renamed \polarisation to \polarization. + * Renamed polwidth to polsize. + * Renamed pol to poltype. + * Renamed bswidth to bssize. + * Renamed iwidth to innerheight. + * Renamed owidth to outerheight. + * Added support for fillstyle for all components + +1.0 2007-07-18 + * First CTAN version + diff --git a/graphics/pstricks/contrib/pst-optexp/Makefile b/graphics/pstricks/contrib/pst-optexp/Makefile new file mode 100644 index 0000000000..cec090e1b8 --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/Makefile @@ -0,0 +1,88 @@ +.SUFFIXES : .tex .ltx .dvi .ps .pdf .eps + +PACKAGE = pst-optexp + +LATEX = latex + +ARCHNAME = $(PACKAGE)-$(shell date +"%y%m%d") + +ARCHFILES = Makefile README Changes \ + $(addprefix $(PACKAGE), -quickref.pdf .dtx .ins .pdf -DE.pdf) + +PS2PDF = GS_OPTIONS=-dPDFSETTINGS=/prepress ps2pdf + +all : doc-all Changes + +doc-all: doc doc-DE doc-code quickref + +doc: $(PACKAGE).pdf +doc-DE: $(PACKAGE)-DE.pdf +doc-code: $(PACKAGE)-code.pdf +quickref: $(PACKAGE)-quickref.pdf + +dist: $(ARCHFILES) + mkdir -p $(PACKAGE) + cp $(ARCHFILES) $(PACKAGE) + zip -r $(PACKAGE).zip $(PACKAGE) + $(RM) -rf $(PACKAGE)/ + +$(PACKAGE).dvi: L = english +$(PACKAGE)-DE.dvi: L = ngerman +$(PACKAGE)-code.dvi: L = english +%.dvi: $(PACKAGE).dtx $(PACKAGE).sty $(PACKAGE).ist $(PACKAGE).pro + + if [ "$@" = "$(PACKAGE)-code.dvi" ]; then \ + sed 's/^\\OnlyDescription//' < $(PACKAGE).dtx > tmp.dtx; \ + else cp $(PACKAGE).dtx tmp.dtx; \ + fi + + $(LATEX) -jobname=$(basename $@) '\newcommand*{\mainlang}{$(L)}\input{tmp.dtx}' + $(LATEX) -jobname=$(basename $@) '\newcommand*{\mainlang}{$(L)}\input{tmp.dtx}' + splitindex -m "" $(basename $@).idx + if test -e $(basename $@)-idx.idx; then \ + makeindex -s gind.ist -t $(basename $@)-idx.ilg \ + -o $(basename $@)-idx.ind $(basename $@)-idx.idx; \ + fi + if test -e $(basename $@)-doc.idx; then \ + makeindex -s $(PACKAGE).ist -t $(basename $@)-doc.ilg \ + -o $(basename $@)-doc.ind $(basename $@)-doc.idx; \ + fi + $(LATEX) -jobname=$(basename $@) '\newcommand*{\mainlang}{$(L)}\input{tmp.dtx}' + splitindex -m "" $(basename $@).idx + if test -e $(basename $@)-idx.idx; then \ + makeindex -s gind.ist -t $(basename $@)-idx.ilg \ + -o $(basename $@)-idx.ind $(basename $@)-idx.idx; \ + fi + if test -e $(basename $@)-doc.idx; then \ + makeindex -s $(PACKAGE).ist -t $(basename $@)-doc.ilg \ + -o $(basename $@)-doc.ind $(basename $@)-doc.idx; \ + fi + $(LATEX) -jobname=$(basename $@) '\newcommand*{\mainlang}{$(L)}\input{tmp.dtx}' + $(RM) -f tmp.dtx + +%.ps: %.dvi + dvips $< +%.pdf: %.ps + $(PS2PDF) $< $@ + +$(PACKAGE)-quickref.tex: $(PACKAGE)-quickref.py $(PACKAGE).dtx + python $< + +$(PACKAGE)-quickref.pdf: $(PACKAGE)-quickref.tex + pdflatex $< + +$(PACKAGE).sty $(PACKAGE).pro $(PACKAGE).ist: $(PACKAGE).ins $(PACKAGE).dtx + tex $< + +Changes: Changes.py $(PACKAGE).dtx + python $< + +clean : + $(RM) $(foreach prefix, $(PACKAGE) $(PACKAGE)-code $(PACKAGE)-DE $(PACKAGE)-quickref, \ + $(addprefix $(prefix), .dvi .ps .log .aux .bbl .blg .out .tmp \ + .toc .idx .ind .ilg .hd \ + -idx.idx -idx.ilg -idx.ind -doc.idx -doc.ilg -doc.ind .hd)) \ + $(PACKAGE)-quickref.tex + +veryclean : clean + $(RM) $(addprefix $(PACKAGE), .pdf -DE.pdf -code.pdf -quickref.pdf .sty .pro .ist) Changes diff --git a/graphics/pstricks/contrib/pst-optexp/README b/graphics/pstricks/contrib/pst-optexp/README new file mode 100644 index 0000000000..ed6ea59a2e --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/README @@ -0,0 +1,28 @@ +------------------------------------------------------------------------ +The pst-optexp package --- Drawing optical experimental setups +Maintained by Christoph Bersch +E-mail: usenet@bersch.net +Released under the LaTeX Project Public License v1.3c or later +See http://www.latex-project.org/lppl.txt +------------------------------------------------------------------------ + +The package pst-optexp is a collection of optical components that +facilitate easy sketching of optical experimental setups. A lot of +different free-ray and fiber components are provided, which alignment, +positioning and labelling can be achieved in very simple and flexible +ways. The components can be connected with fibers or beams, realistic +raytraced beam paths are also possible. + +Installation +------------ + +The package is supplied in dtx format and as a pre-extracted zip file, +pst-optexp.tds.zip. The later is most convenient for most users: simply +unzip this in your local texmf directory and run texhash to update the +database of file locations. The pst-optexp package is also contained in +MiKTeX and TeX Live distributions. If you want to unpack the dtx +yourself you must run "tex pst-optexp.ins", to typeset the documentation +run "latex pst-optexp.dtx". + +The package requires recent version of pst-node, multido, pstricks-add, +pst-eucl, and environ. diff --git a/graphics/pstricks/contrib/pst-optexp/pst-optexp-DE.pdf b/graphics/pstricks/contrib/pst-optexp/pst-optexp-DE.pdf Binary files differnew file mode 100644 index 0000000000..e4a77fb61c --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/pst-optexp-DE.pdf diff --git a/graphics/pstricks/contrib/pst-optexp/pst-optexp-quickref.pdf b/graphics/pstricks/contrib/pst-optexp/pst-optexp-quickref.pdf Binary files differnew file mode 100644 index 0000000000..ba9b8a54a3 --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/pst-optexp-quickref.pdf diff --git a/graphics/pstricks/contrib/pst-optexp/pst-optexp.dtx b/graphics/pstricks/contrib/pst-optexp/pst-optexp.dtx new file mode 100644 index 0000000000..3b42360117 --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/pst-optexp.dtx @@ -0,0 +1,25632 @@ +% \iffalse meta-comment +% +% Copyright (C) 2007-2014 by Christoph Bersch <usenet@bersch.net> +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008/05/04 or later. +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{pst-optexp.dtx} +%</driver> +%<stylefile>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<stylefile>\ProvidesPackage{pst-optexp} +%<*stylefile> + [2014/11/26 v5.2 Optical experimental setups with PSTricks] +%</stylefile> +% +%<*driver> +\documentclass[a4paper, DIV=9, oneside, toc=index, parskip=half-]{scrreprt} +\usepackage{doc} +\setcounter{IndexColumns}{2} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage{amsmath, marvosym} +\usepackage{bera} +\providecommand*\mainlang{} +\usepackage[ngerman, english,\mainlang]{babel} +\usepackage{prettyref} +\usepackage[dvipsnames,x11names,svgnames]{xcolor} +\usepackage{array,booktabs,paralist,tabularx} +\usepackage{ragged2e, calc} +\newlength{\POEcaptionmargin} +\newlength{\POEcaptionheight} +\usepackage[labelfont={color=DOrange}, + singlelinecheck=false, + justification=raggedright]{caption} +\DeclareCaptionFormat{poenocaption}{% + \setlength{\POEcaptionmargin}{\widthof{#1}+7pt}% + \setlength{\POEcaptionheight}{\heightof{#1}+3pt}% + \hspace*{-\POEcaptionmargin}#1\par\vspace*{-\POEcaptionheight}% +}% +\DeclareCaptionFormat{poecaption}{% + \setlength{\POEcaptionmargin}{\widthof{#1}+7pt}% + \hspace*{-\POEcaptionmargin}#1#2#3\par +}% +\captionsetup[lstlisting]{format=poenocaption} +\usepackage{nicefrac} +\usepackage{pst-func} +\usepackage{pst-optexp} +\usepackage[makeindex]{splitidx} +\usepackage{hypdoc} +\hypersetup{% + colorlinks=true, + urlcolor=DOrange, + linkcolor=pdflinkcolor, + breaklinks, + linktocpage=true} +\usepackage{breakurl} +\definecolor{DOrange}{rgb}{1,.4,.2}% +\definecolor{DDOrange}{rgb}{0.7, 0.23, 0.07}% +\colorlet{pdflinkcolor}{DOrange} +\colorlet{DGreen}{green!90!black} +\usepackage{pst-tree} +\usepackage{showexpl} +\usepackage{scrhack} +\makeatletter\renewcommand*\SX@Info{}\makeatother +\usepackage{etoolbox} +\undef{\cs}\undef{\cmd} +\usepackage{ltxdockit} +\newcommand{\poeTR}[1]{\TR{\ttfamily\color{DOrange}#1}} +\definecolor{colKeys}{rgb}{0,0,0} +\definecolor{colIdentifier}{rgb}{0,0,0} +\colorlet{colComments}{green!60!black} +\definecolor{colString}{rgb}{0,0.5,0} +\newlength{\codeoverhang} +\setlength{\codeoverhang}{0.5\marginparwidth+\marginparsep} +\lstset{% + language=[LaTeX]TeX, identifierstyle=\color{colIdentifier}, + keywordstyle=\color{colKeys}, + keywordstyle = [21]\color{DOrange}, + keywordstyle = [22]\color{DOrange}, + stringstyle=\color{colString}, + commentstyle=\color{colComments}, + alsoletter={12}, + float=hbp, + basicstyle=\ttfamily\small, + columns=flexible, + tabsize=4, + showspaces=false, + showstringspaces=false, + breaklines=true, + breakautoindent=true, + breakatwhitespace=true, + captionpos=t, + belowcaptionskip=0pt, + abovecaptionskip=0pt, + xleftmargin=1em, + prebreak = {\raisebox{-0.5ex}[\ht\strutbox]{\kern0.5ex\large\Righttorque}}, + rulecolor=\color{black!20}, + texcsstyle = [20]\color{DDOrange}, + moretexcs = [20]{lens, optbox, oenode, oenodeIn, oenodeExt, oenodeOut, + oenodeRefA, oenodeRefB, oenodeTrefA, oenodeTrefB, oenodeLabel, + oenodeRotref, oenodeBeam, oenodeBeamUp, oenodeBeamLow, oenodeCenter, + oenodeIfc, oeBeamVec, oeBeamVecUp, oeBeamVecLow, oeBeamVecMedian, + oeBeamCenter, optplate, optretplate, pinhole, crystal, optdetector, + optdiode, doveprism, glanthompson, polarization, mirror, parabolicmirror, + oapmirror, axicon, optwedge, asphericlens, + beamsplitter, optgrating, optprism, rightangleprism, pentaprism, optaom, + optdipole, opttripole, optfiber, optamp, optmzm, optfilter, optsource, + polcontrol, optisolator, optswitch, fiberdelayline, + optfiberpolarizer, fibercollimator, optcoupler, wdmcoupler, + wdmsplitter, optcirculator, fiberbox, eleccoupler, elecsynthesizer, + elecmixer, optarrowcomp, optbarcomp, transmissiongrating, drawbeam, drawwidebeam, + drawfiber, drawwire, frontlayer, backlayer, newOptexpDipole, + newOptexpTripole, newOptexpFiberDipole, newOptexpComp, + newOptexpFiberComp, optplane}, + explpreset={% + pos=l, width=-99pt, hsep=5mm, overhang=\codeoverhang, varwidth, + vsep=\bigskipamount, rframe={}}, extendedchars=true +}% +\lstdefinestyle{example}{explpreset={% + escapechar=*, pos=l, width=-99pt, hsep=5mm, overhang=\codeoverhang, + varwidth, vsep=\bigskipamount, rframe={}}} +\makeatletter +\providecommand\ON{% + \gdef\lst@alloverstyle##1{\textcolor{black!50}{\strut##1}% +}} +\providecommand\OFF{\xdef\lst@alloverstyle##1{##1}} +\makeatother +\colorlet{sectioncolor}{DOrange} +\addtokomafont{sectioning}{\color{sectioncolor}} +\usepackage[automark,nouppercase]{scrpage2} +\pagestyle{scrheadings} +\clearscrheadings +\clearscrplain +\ohead{\pagemark} +\ihead{\headmark} +\ofoot[\pagemark]{} +\automark[subsection]{section} +\setheadsepline{.4pt}[\color{DOrange}] +\setheadwidth[0pt]{text} +\setfootwidth[0pt]{text} +\makeatletter +\patchcmd{\l@chapter}{1.5em}{2em}{}{} +\renewcommand*\l@section{\bprot@dottedtocline{1}{1.5em}{3.0em}} +\renewcommand*\l@subsection{\bprot@dottedtocline{2}{3.8em}{4.0em}} +\newrobustcmd*{\fnurl}[1][]{\hyper@normalise\ltd@fnurl{#1}} +\def\ltd@fnurl#1#2{\footnote{#1\hyper@linkurl{\Hurl{#2}}{#2}}} +\newrobustcmd*{\arxivurl}[1]{\href{http://arxiv.org/abs/#1}{arXiv:#1}} +\newrobustcmd*{\doiurl}[1]{\href{http://dx.doi.org/#1}{DOI:#1}} +\makeatother +\usepackage{csquotes} +\MakeAutoQuote{«}{»} +%^^A spot is used in ltxdockit.sty +\colorlet{spot}{sectioncolor} +\newpsstyle{Refline}{linecolor=gray!70} +\newpsstyle{CenterNode}{linecolor=blue, dotstyle=x, dotscale=1.5} +\psset[optexp]{usefiberstyle} +\colorlet{Refline}{gray!70} +%^^A Fonts definitions used in ltxdockit.sty +\renewcommand*{\verbatimfont}{\ttfamily} +\renewcommand*{\displayverbfont}{\ttfamily} +\renewcommand*{\marglistfont}{\spotcolor\sffamily\small} +\renewcommand*{\margnotefont}{\sffamily\small} +\renewcommand*{\optionlistfont}{\spotcolor\sffamily\displayverbfont} +\renewcommand*{\ltxsyntaxfont}{\ttfamily} +\renewcommand*{\ltxsyntaxlabelfont}{\spotcolor\displayverbfont} +\renewcommand*{\changelogfont}{\normalfont} +\renewcommand*{\changeloglabelfont}{\spotcolor\sffamily\bfseries} + +\makeatletter +%^^A an idea from GL to provide links inside the listings to the pst-optexp commands: +%^^A <https://groups.google.com/groups/search?as_umsgid=4d89ee49%240%2418590%24426a74cc%40news.free.fr> +\providerobustcmd*\ifrefundefined [1]{% + \begingroup% + \csname @safe@activestrue\endcsname% + \expandafter\endgroup\csname @\ifodd + \ifcsname r@comp:#1\endcsname 1\else + \ifcsname r@prm:#1\endcsname 1\else + \ifcsname r@cs:#1\endcsname 1\else + \ifcsname r@sty:#1\endcsname 1\else 0 + \fi\fi\fi\fi second\else first\fi oftwo\endcsname +}% \ifrefundefined +\def\lsthk@OutputBox@H@@k{% + \begingroup% + \let\lst@UM\@empty% + \edef\@tempc{\detokenize\expandafter{\the\lst@token }}%\edef + \ifrefundefined{\@tempc}% + \endgroup% + \sethyperlistings% +}% \lsthk@OutputBox@H@@k +\def\sethyperlistings {\global\let \hyperlistingsreference =\@tempc + \endgroup \aftergroup \dohyperlistings }% after \hbox +\def\dohyperlistings {\def\lst@alloverstyle ##1{\hyperlistings ##1}} +\def\hyperlistings{% + \setbox\@tempboxa\hbox% + \bgroup% + \rlap{\hypersetup {linkcolor=.}\relax\fboxrule\z@% + \ifcsdef{r@prm:\hyperlistingsreference}% + {\hyperref[prm:\hyperlistingsreference]{\xLkeyword{\hyperlistingsreference}\boxframe{\wd\@tempboxa}{\ht\@tempboxa}{\dp\@tempboxa}}}% + {\ifcsdef{r@comp:\hyperlistingsreference}% + {\hyperref[comp:\hyperlistingsreference]{\xLcomp{\hyperlistingsreference}\boxframe{\wd\@tempboxa}{\ht\@tempboxa}{\dp\@tempboxa}}}% + {\ifcsdef{r@sty:\hyperlistingsreference}% + {\hyperref[sty:\hyperlistingsreference]{\xLstyle{\hyperlistingsreference}\boxframe{\wd\@tempboxa}{\ht\@tempboxa}{\dp\@tempboxa}}}% + {\hyperref[cs:\hyperlistingsreference]{\xLcs{\hyperlistingsreference}\boxframe{\wd\@tempboxa}{\ht\@tempboxa}{\dp\@tempboxa}}}}}}% + \unhbox\@tempboxa% + \egroup% +}% \hyperlistings +\let\lsthk@OutputBox\lsthk@OutputBox@H@@k + +\renewenvironment*{ltxsyntax} + {\list{}{% + \setlength{\labelwidth}{\marglistwidth}% + \setlength{\labelsep}{0pt}% + \setlength{\leftmargin}{0pt}% + \renewcommand*{\makelabel}[1]{% + \hss\ltxsyntaxfont\ltxsyntaxlabelfont##1}}% + \let\cmditem\POE@cmditem + \let\envitem\ltd@envitem + \let\compitem\POE@compitem} + {\endlist} + +\newenvironment*{stylelist} + {\list{}{% + \setlength{\labelwidth}{\marglistwidth}% + \setlength{\labelsep}{0.5\marglistsep}% + \setlength{\leftmargin}{0pt}% + \renewcommand*{\makelabel}[1]{\hss\optionlistfont##1}}% + \let\styleitem\POE@styleitem + \let\typeitem\POE@typeitem}% + {\endlist} + +\def\ltd@optionlist{% + \let\optitem\POE@optitem + \let\valitem\POE@valitem + \let\choitem\POE@choitem + \let\boolitem\POE@boolitem + \let\intitem\POE@intitem + \let\numitem\POE@numitem + \let\psnumitem\POE@psnumitem + \let\poeitem\ltd@item + \let\styleitem\POE@styleitem + \let\typeitem\POE@typeitem} + +\def\POE@styleitem{% + \@ifnextchar[%] + {\POE@styleitem@i} + {\POE@styleitem@i[]}} +\def\POE@styleitem@i[#1]#2{% + \item[{#2}]% + \label{sty:#2}\xdefLstyle{#2}% + \begingroup\raggedright + \prm{psstyle}% + \settowidth\@tempdimb{\prm{psstyle}}% + \settowidth\@tempdimc{#2}% + \@tempdimc=\dimexpr\@tempdimc+\labelsep-\labelwidth\relax + \ifdim\@tempdimc>0pt% + \@tempdima=\dimexpr\linewidth-\@tempdimb-\@tempdimc-1em\relax + \else + \@tempdima=\dimexpr\linewidth-\@tempdimb-1em\relax + \fi + \ifblank{#1}{}{\hfill\parbox[t]{\@tempdima}{\raggedleft default:~\ltd@textverb{#1}}}% + \par\endgroup} + +\def\POE@typeitem#1#2{% + \item[{#1}]% + \label{prm:#1}\docindexdef{#1=\nxLkeyword{#1}}% + \begingroup\raggedright + #2% + \settowidth\@tempdimb{\prm{psstyle}}% + \settowidth\@tempdimc{#1}% + \@tempdimc=\dimexpr\@tempdimc+\labelsep-\labelwidth\relax + \ifdim\@tempdimc>0pt% + \@tempdima=\dimexpr\linewidth-\@tempdimb-\@tempdimc-1em\relax + \else + \@tempdima=\dimexpr\linewidth-\@tempdimb-1em\relax + \fi + \par\endgroup} + +\def\POE@option#1#2#3{% + \item[#1]% + \begingroup\raggedright + \ltd@textverb{=}% + \settowidth\@tempdimb{\ltd@textverb{=}}% + \settowidth\@tempdimc{#1}% + \@tempdimc=\dimexpr\labelwidth-\@tempdimc\relax + \ifdim\@tempdimc<0pt + \@tempdima=\dimexpr\linewidth-\@tempdimb+\@tempdimc-2em\relax + \else + \@tempdima=\dimexpr\linewidth-\@tempdimb-2em\relax + \fi + \ifblank{#3} + {} + {\settowidth\@tempdimb{default: #3}% + \@tempdima=\dimexpr\@tempdima-\@tempdimb-2em\relax}% + \parbox[t]{\@tempdima}{\raggedright #2}% + \ifblank{#3} + {} + {\hfill default:~#3}% + \par\endgroup + \nobreak\vspace{\itemsep}} + +\def\POE@optitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@optitem@i} + {\booltrue{@tempswa}\POE@optitem@i}} +\newcommand*{\POE@optitem@i}[3][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{#3}{}} + {\POE@option{#2}{#3}{\ltd@textverb{#1}}}}% + +\def\POE@valitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@valitem@i} + {\booltrue{@tempswa}\POE@valitem@i}} +\newcommand*{\POE@valitem@i}[3][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\prm{#3}}{}} + {\POE@option{#2}{\prm{#3}}{\ltd@textverb{#1}}}}% + +\def\POE@choitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@choitem@i} + {\booltrue{@tempswa}\POE@choitem@i}} +\newcommand*{\POE@choitem@i}[3][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\ltd@verblist{#3}}{}} + {\POE@option{#2}{\ltd@verblist{#3}}{\ltd@textverb{#1}}}}% + +\def\POE@boolitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@boolitem@i} + {\booltrue{@tempswa}\POE@boolitem@i}} +\newcommand*{\POE@boolitem@i}[2][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\ltd@verblist{true,false}}{}} + {\POE@option{#2}{\ltd@verblist{true,false}}{\ltd@textverb{#1}}}}% + +\def\POE@intitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@intitem@i} + {\booltrue{@tempswa}\POE@intitem@i}} +\newcommand*{\POE@intitem@i}[2][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\prm{int}}{}} + {\POE@option{#2}{\prm{int}}{\ltd@textverb{#1}}}}% + +\def\POE@numitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@numitem@i} + {\booltrue{@tempswa}\POE@numitem@i}} +\newcommand*{\POE@numitem@i}[2][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\prm{num}}{}} + {\POE@option{#2}{\prm{num}}{\ltd@textverb{#1}}}}% + +\def\POE@psnumitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@psnumitem@i} + {\booltrue{@tempswa}\POE@psnumitem@i}} +\newcommand*{\POE@psnumitem@i}[2][]{% + \ifbool{@tempswa}% + {\label{prm:#2}\xdefLkeyword{#2}}% + {\xLkeyword{#2}}% + \ifblank{#1} + {\POE@option{#2}{\prm{psnum}}{}} + {\POE@option{#2}{\prm{psnum}}{\ltd@textverb{#1}}}}% + +\def\ltd@csitem{% + \@ifstar + {\boolfalse{@tempswa}\ltd@csitem@i} + {\booltrue{@tempswa}\ltd@csitem@i}} +\def\ltd@csitem@i#1{% + \ifbool{@tempswa} + {\ltd@item@ii{\textbackslash#1\hspace\marglistsep}{#1}} + {\ltd@item@ii{\textbackslash#1\hspace\marglistsep}{}}} + +\def\POE@cmditem{% + \@ifstar + {\boolfalse{@tempswa}\POE@cmditem@i} + {\booltrue{@tempswa}\POE@cmditem@i}} +\def\POE@cmditem@i#1{% + \ifbool{@tempswa} + {\POE@cmditem@ii{\textbackslash#1}{cs:#1}} + {\POE@cmditem@ii{\textbackslash#1}{}}} +\def\POE@compitem{% + \@ifstar + {\boolfalse{@tempswa}\POE@compitem@i} + {\booltrue{@tempswa}\POE@compitem@i}} +\def\POE@compitem@i#1{% + \ifbool{@tempswa} + {\POE@cmditem@ii{\textbackslash#1}{comp:#1}} + {\POE@cmditem@ii{\textbackslash#1}{}}} +\def\POE@cmditem@ii#1#2{% + \ltd@itemsave + \ifhmode + \itemsep-\topsep + \else + \ltd@itembreak + \fi + \item[#1]% + \ltd@itemrest + \ifblank{#2}{}{\label{#2}}% + \begingroup + \ltd@syntaxsetup + \ltxsyntaxfont + \let\@tempa\@empty + \ltd@parseargs} + +\def\ltd@csitem@ii#1#2{% + \ltd@itemsave + \ifhmode + \itemsep-\topsep + \else + \ltd@itembreak + \fi + \item[#1]% + \ltd@itemrest + \ifblank{#2}{}{\label{cs:#2}}% + \begingroup + \ltd@syntaxsetup + \ltxsyntaxfont + \let\@tempa\@empty + \ltd@parseargs} + + +\let\plainllap\llap +\newrobustcmd\macro@llap[1]{{\global\let\llap\plainllap + \setbox0=\hbox\bgroup \macro@font\small\saved@macroname\egroup + \ifdim\wd0>30mm + \hbox to\z@ \bgroup\hss \hbox to30mm{\unhcopy0\hss}\egroup + \edef\@tempa{\hskip\dimexpr\the\wd0-30mm}\global\everypar\expandafter{\the\expandafter\everypar + \@tempa \global\everypar{}}% + \else \llap{\unhbox0}\fi}} + \AtBeginEnvironment{macro}{\let\llap\macro@llap} +\makeatother + +\newcommand*{\PSstring}[1]{{\normalfont\small\ttfamily(#1)}} +\newcommand*{\PSarray}[1]{{\normalfont\small\ttfamily[#1]}} +\newcommand*{\PSname}[1]{{\normalfont\small\ttfamily/#1}} +\newcommand*{\PSproc}[1]{{\normalfont\small\ttfamily\textbraceleft #1\textbraceright}} +\newcommand*{\PSvar}[1]{{\normalfont\small\ttfamily #1}} +\newcommand*{\PSop}[1]{{\normalfont\small\ttfamily\color{DOrange}\hskip 3pt #1\hskip 3pt}} + +\newcommand*{\compref}[1]{\ref{comp:#1}} +\newcommand*{\hyperpagedef}[1]{\textbf{\hyperpage{#1}}} +\newcommand*{\nodename}[1]{\emph{#1}} +\newcommand*{\param}[1]{\normalfont\texttt{#1}} +\newcommand*{\paramvalue}[1]{\texttt{#1}} +\newcommand*{\styleshape}[1]{\texttt{#1}} +\newcommand{\docindex}[1]{\sindex[doc]{#1|hyperpage}} +\newcommand{\docindexdef}[1]{\sindex[doc]{#1|hyperpagedef}} +\makeatletter +\def\Lcs{\@ifstar{\Lcs@nobm}{\Lcs@bm}} +\def\Lcs@nobm#1{\nxLcs{#1}\xLcs{#1}} +\def\Lcs@bm#1{\hyperref[cs:#1]{\Lcs@nobm{#1}}} +\def\xLcs#1{\docindex{#1=\nxLcs{#1}}\docindex{\POEindexMacro!#1=\nxLcs{#1}}} +\def\nxLcs#1{\texttt{\textbackslash#1}} + +\def\Lcomp{\@ifstar{\Lcomp@nobm}{\Lcomp@bm}} +\def\Lcomp@nobm#1{\nxLcomp{#1}\xLcomp{#1}} +\def\Lcomp@bm#1{\hyperref[comp:#1]{\Lcomp@nobm{#1}}} +\def\xLcomp#1{\docindex{#1=\nxLcomp{#1}}\docindex{\POEindexComp!#1=\nxLcomp{#1}}} +\def\nxLcomp#1{\texttt{\textbackslash#1}} + +\def\LPack#1{\nxLPack{#1}\docindex{#1=\nxLPack{#1}}\docindex{\POEindexPack!#1=\nxLPack{#1}}} +\def\nxLPack#1{\texttt{#1}} + +\def\Lenv{\@ifstar{\Lenv@nobm}{\Lenv@bm}} +\def\Lenv@nobm#1{\nxLenv{#1}\xLenv{#1}} +\def\Lenv@bm#1{\hyperref[env:#1]{\Lenv@nobm{#1}}} +\def\xLenv#1{\docindex{#1=\nxLenv{#1}}\docindex{\POEindexEnv!#1=\nxLenv{#1}}} +\def\nxLenv#1{\texttt{#1}} +\let\orig@ltd@envitem\ltd@envitem +\def\ltd@envitem#1{\orig@ltd@envitem{#1}\label{env:#1}\xLenv{#1}} + +\def\Lkeyword{\@ifstar{\Lkeyword@nobm}{\Lkeyword@bm}} +\def\Lkeyword@nobm#1{\nxLkeyword{#1}\xLkeyword{#1}} +\def\Lkeyword@bm#1{\hyperref[prm:#1]{\Lkeyword@nobm{#1}}} +\def\xLkeyword#1{\docindex{#1=\nxLkeyword{#1}}\docindex{\POEindexKeyword!#1=\nxLkeyword{#1}}} +\def\xdefLkeyword#1{\docindexdef{#1=\nxLkeyword{#1}}\docindexdef{\POEindexKeyword!#1=\nxLkeyword{#1}}} +\def\nxLkeyword#1{\texttt{#1}} + +\def\xLoption#1{\docindex{#1=\texttt{#1}}} +\def\Loption#1{\texttt{#1}\xLoption{#1}} +\def\nxLoption#1{\texttt{#1}} + +\def\Lstyle{\@ifstar{\Lstyle@nobm}{\Lstyle@bm}} +\def\Lstyle@nobm#1{\nxLstyle{#1}\xLstyle{#1}} +\def\Lstyle@bm#1{\hyperref[sty:#1]{\Lstyle@nobm{#1}}} +\def\xLstyle#1{\docindex{#1=\nxLstyle{#1}}\docindex{\POEindexStyle!#1=\nxLstyle{#1}}} +\def\xdefLstyle#1{\docindexdef{#1=\nxLstyle{#1}}\docindexdef{\POEindexStyle!#1=\nxLstyle{#1}}} +\def\nxLstyle#1{\texttt{#1}} + +\def\Ldipole#1{\nxLcs{#1}\xLdipole{#1}} +\def\xLdipole#1{\docindexdef{#1=\nxLcs{#1}}\docindexdef{\POEindexComp!#1=\nxLcs{#1}}} + +\def\Ltripole#1{\nxLcs{#1}\xLtripole{#1}} +\def\xLtripole#1{\docindexdef{#1=\nxLcs{#1}}\docindexdef{\POEindexComp!#1=\nxLcs{#1}}} + +\def\Lfdipole#1{\nxLcs{#1}\xLfdipole{#1}} +\def\xLfdipole#1{\docindexdef{#1=\nxLcs{#1}}\docindexdef{\POEindexComp!#1=\nxLcs{#1}}} + +\def\Lfmultipole#1{\nxLcs{#1}\xLfmultipole{#1}} +\def\xLfmultipole#1{\docindexdef{#1=\nxLcs{#1}}\docindexdef{\POEindexComp!#1=\nxLcs{#1}}} + +\def\Lemultipole#1{\nxLcs{#1}\xLemultipole{#1}} +\def\xLemultipole#1{\docindexdef{#1=\nxLcs{#1}}\docindexdef{\POEindexComp!#1=\nxLcs{#1}}} +\makeatother + +\newcommand{\dipoledesc}[1]{% + \xLdipole{#1}% + \compitem{#1}[options](in)(out){label}% +} +\newcommand{\tripoledesc}[1]{% + \xLtripole{#1}% + \compitem{#1}[options](in)(center)(out){label}% +} + +\newcommand{\fiberdipoledesc}[1]{% + \xLfdipole{#1}% + \compitem{#1}[options](in)(out){label}% +} + +\newenvironment*{pssyntax} + {\list{}{\small + \setlength{\labelsep}{0pt}% + \setlength{\leftmargin}{10pt}% + \item[]}} + {\endlist} + +\newcommand{\psarglistfont}{\small} +\newenvironment*{psarglist} + {\list{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\labelsep}{0pt}% + \setlength{\leftmargin}{0pt}% + \setlength{\itemsep}{\parsep}% + \setlength{\parsep}{0pt}% + \renewcommand*{\makelabel}[1]{\hss\psarglistfont##1}}} + {\endlist} + +\makeatletter +\renewenvironment{theglossary}{\GlossaryParms \let\item\@idxitem \ignorespaces}{} +\makeatother +\def\psargitem#1{\item[#1]\hfill\par\nobreak} + +\addtopsstyle{Fiber}{linecolor=DOrange,linewidth=1.5\pslinewidth} +\addtopsstyle{Beam}{linewidth=1.5\pslinewidth} +\EnableCrossrefs +\CodelineIndex +\OnlyDescription +\begin{document} + \DocInput{pst-optexp.dtx} +\end{document} +%</driver> +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \GetFileInfo{pst-optexp.dtx} +% +% \DoNotIndex{\@,\g@addto@macro,\newif,\gdef,\xdef,\newcounter,\or,\ifcase,\\} +% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\let,\if,\ifx,\else,\fi,\@ifnextchar} +% \DoNotIndex{\space,\relax,\nr,\val,\ignorespaces,\ifdim,\ifcat,\@nil,\@none,\@empty} +% \DoNotIndex{\PackageError,\PackageWarning,\advance,\csname,\endcsname,\bgroup,\egroup} +% \DoNotIndex{\expandafter,\POE@comp,\@postcode} +% \DoNotIndex{\psset} +% \DoNotIndex{\@wd,\@sz,\@ht,\@yshift,\@step,\@xl,\@sep,\@r,\@dp,\@altan,\@extpostcode} +% \DoNotIndex{\@f@cnt,\@f@r,\@f@sep,\@hshift,\@bs@wd,\@c@caxisL,\@cnt,\@pstfalse,\@psttrue} +% \DoNotIndex{\@th,\@rL,\@rR,\i,\long,\optexp@nodeA,\optexp@nodeB} +% \DoNotIndex{\POE@temp,\POE@tempa,\POE@tempb,\POE@tempc,\POE@tempd} +% \DoNotIndex{\POE@getref@b,\POE@getref@c,\POE@getref@l,\POE@getref@r,\POE@getref@t} +% \DoNotIndex{\the,\toks@} +% +% \newif\ifGERMAN \GERMANfalse +% \newif\ifENGLISH \ENGLISHfalse +% \iflanguage{ngerman}{\GERMANtrue}{% +% \iflanguage{german}{\GERMANtrue}{\GERMANfalse}} +% \iflanguage{english}{\ENGLISHtrue}{\ENGLISHfalse} +% +% \ifGERMAN +% \newrefformat{chap}{Kap.~\ref{#1}} +% \newrefformat{sec}{Kap.~\ref{#1}} +% \newrefformat{l}{Zeile~\ref{#1}} +% \newrefformat{ex}{Bsp.~\ref{#1}} +% \newrefformat{tab}{Tab.~\ref{#1}} +% \newrefformat{fig}{Abb.~\ref{#1}} +% \newindex[Quelltextindex]{idx} +% \newindex[Dokumentationsindex]{doc} +% \newcommand{\POEindexComp}{Komponenten} +% \newcommand{\POEindexStyle}{Stile} +% \newcommand{\POEindexMacro}{Makros} +% \newcommand{\POEindexKeyword}{Parameter} +% \newcommand{\POEindexEnv}{Umgebungen} +% \newcommand{\POEindexPack}{Pakete} +% \renewcommand*\lstlistingname{Bsp.} +% \fi +% \ifENGLISH +% \newrefformat{chap}{Sec.~\ref{#1}} +% \newrefformat{sec}{Sec.~\ref{#1}} +% \newrefformat{l}{Line~\ref{#1}} +% \newrefformat{ex}{Ex.~\ref{#1}} +% \newrefformat{tab}{Tab.~\ref{#1}} +% \newrefformat{fig}{Fig.~\ref{#1}} +% \newindex[Code index]{idx} +% \newindex[Documentation index]{doc} +% \newcommand{\POEindexComp}{components} +% \newcommand{\POEindexStyle}{styles} +% \newcommand{\POEindexMacro}{macros} +% \newcommand{\POEindexKeyword}{parameters} +% \newcommand{\POEindexEnv}{environments} +% \newcommand{\POEindexPack}{packages} +% \renewcommand*\lstlistingname{Ex.} +% \fi +% +% \newcommand{\refpointexplanation}{% +% \ifGERMAN +% Analog zum Referenzpunkt von \nxLcs{rput}, kann jede Kombination von +% \opt{c} (mittig), \opt{t} (oben), \opt{b} (unten), \opt{l} (links) und +% \opt{r} (rechts) sein. +% \fi +% \ifENGLISH +% Like the reference point of \nxLcs{rput}, can be any comination of +% \opt{c} (center), \opt{t} (top), \opt{b} (bottom), \opt{l} (left), and +% \opt{r} (right). +% \fi} +% +% \newcommand*{\linewidthexplanation}[2]{% +% \ifGERMAN +% Die Linienbreite #1. Diese könnte ebenfalls über den +% \opt{linewidth} Parameter gesetzt werden. Mit diesem Parameter kann +% aber die Linienbreite aller #2 global eingestellt werden. +% \fi +% \ifENGLISH +% The linewidth of the #1. This could be defined also with the +% generic \opt{linewidth} option. But this parameter allows setting +% globally the linewidth of all #2. +% \fi +% } +% +% \newcommand*{\deprecatedmsg}[2][3.0]{% +% \ifGERMAN Dieser Parameter ist seit Version #1 veraltet, verwenden Sie stattdessen #2. \fi +% \ifENGLISH This parameter is deprecated since version #1, use #2 instead.\fi +% } +% +% \newcommand*{\addtostylemsg}[1]{% +% \ifGERMAN Der vorhandene \Lstyle{#1}-Stil wird lokal um die Parameter in +% \prm{list} erweitert, \prm{list} muss mit geschweiften Klammern gekapselt +% werden. +% \fi +% \ifENGLISH +% The \Lstyle{#1} style is extended by locally adding the +% parameters contained in \prm{list}. The \prm{list} must be surrounded +% by curly braces. +% \fi +% } +% \newcommand*{\newstylemsg}[1]{% +% \ifGERMAN Ähnlich wie \Lkeyword{addto#1}, nur wird der +% \Lstyle{#1}-Stil mit den neuen Parametern überschrieben. +% \fi +% \ifENGLISH Similar to \Lkeyword{addto#1}, but an existing +% \Lstyle{#1} style is overwritten with the new parameter set. +% \fi +% } +% +% \makeatletter +% \renewcommand\maketitle{^^A +% \thispagestyle{empty}^^A +% \begin{titlepage} +% \begin{pspicture}(1.6in,0.685in)(10,21.7) +% \psframe[fillstyle=solid,linecolor=lightgray,fillcolor=lightgray,linestyle=solid](0,-5.75)(21.5,10) +% \psframe[fillstyle=solid,linecolor=Orange!85!Red,fillcolor=Orange!85!Red,linestyle=solid](0,10)(21.5,10.5) +% \psframe[fillstyle=solid,linecolor=Orange!85!Red,fillcolor=Orange!85!Red,linestyle=solid](0,21.1)(21.5,21.2) +% \rput[lb](3,22){\Huge\sffamily\color{Orange!65!Red}\psscalebox{2}{\textbf{PSTricks}}} +% \rput[lb](3,14.1){\parbox{15cm}{\sffamily\RaggedRight\bfseries\huge\@title}} +% \rput[lb](3,7.6){\parbox{13cm}{\sffamily\@date}} +% \rput[lb](3,-2.6){\parbox[b]{17cm}{\sffamily\RaggedRight +% ~\hfill\makebox[7cm][l]{\ifGERMAN Paketautor:\fi\ifENGLISH Package author:\fi}\\ +% ~\hfill\makebox[7cm][l]{^^A +% \bfseries\tabular[t]{@{}l@{}}\@author\endtabular}}} +% \rput[C](11,4){\bgImage} +% \end{pspicture}^^A +% \end{titlepage}} +% \makeatother +% +% \ifGERMAN +% \title{\texttt{pst-optexp}\\ Optische Versuchsaufbauten\\[0.5ex] \small \fileversion} +% \hypersetup{pdftitle={Optische Versuchsaufbauten}} +% \fi +% \ifENGLISH +% \title{\texttt{pst-optexp}\\ Drawing optical experimental setups\\[0.5ex] \small \fileversion} +% \hypersetup{pdftitle={Optical experimental setups}} +% \fi +% \author{Christoph Bersch} +% \date{\filedate} +% \def\bgImage{\psset{unit=1.3} +% \begin{pspicture}(-0.2,0.1)(8.2,5.3) +% \pnode(0,3){M1} +% \pnode(8,3){M2} +% \pnode(8,0.5){In} +% \pnode(6.5,0.5){Min} +% \pnode(6.5,3){Pin} +% \pnode(4.5,3){Min2} +% \pnode(1.3, 0.5){Mout} +% \pnode(1.3,3){Pout} +% \pnode(3.5,3){Mout2} +% \pnode(0,0.5){Out} +% \definecolor[ps]{bl}{rgb}{tx@addDict begin Red Green Blue end} +% \addtopsstyle{Beam}{linecolor=bl, linejoin=1} +% \psset{mirrortype=extended, mirrordepth=0.15} +% \newpsstyle{ExtendedMirror}{linestyle=none, hatchwidth=0.5\pslinewidth, hatchsep=1.2\pslinewidth, +% fillstyle=hlines} +% \begin{optexp} +% \mirror[mirrorwidth=4, mirrorradius=11.](M2)(M1)(M2) +% \mirror[mirrorwidth=4, mirrorradius=10.4](M1)(M2)(M1) +% \mirror(In)(Min)(Pin) +% \optprism[n=1.85, addtoOptComp={linewidth=1.5\pslinewidth}](Min)(Pin)(Min2) +% \mirror[compshift=-0.4](Pin)(Min2)(Pin) +% \mirror[compshift=0.4](Pout)(Mout2)(Pout) +% \optprism[n=1.85, linewidth=1.5\pslinewidth](Mout2)(Pout)(Mout) +% \mirror(Pout)(Mout)(Out) +% \multido{\i=0+1}{40}{^^A +% \pstVerb{^^A +% \i\space 650 400 sub 39 div mul 400 add +% tx@addDict begin wavelengthToRGB end }^^A +% \drawbeam[n={-0.002 \i\space mul n add}](In){3-5}{2}{1}{6-7} +% }^^A +% \newpsstyle{Beam}{linecolor=red} +% \backlayer{\psline[style=Beam,ArrowInside=->, linewidth=2\pslinewidth, arrowinset=0](In)(\oenodeIn{3})(\oenodeOut{4})} +% \drawbeam[linewidth=2\pslinewidth, arrows=->, arrowinset=0, loadbeampoints, beaminsidefirst, n=1.9325]{7-8}(Out) +% \end{optexp} +% \rput(4,4.5){^^A +% \psframe[fillstyle=solid,fillcolor=gray!70](-0.1, -0.6)(0.1, 0.7) +% \multido{\r=-0.5+0.1}{12}{^^A +% \psline[linewidth=0.5\pslinewidth](-0.1,\r)(0.1,\r) +% }^^A +% } +% \end{pspicture}} +% +% \maketitle +% +% \clearpage +% \tableofcontents +% \clearpage +% +% \ifGERMAN +% \chapter{Einführung} +% \fi +% \ifENGLISH +% \chapter{Introduction} +% \fi +% +% \ifGERMAN +% \section{Über das Paket} +% +% \LPack{pst-optexp} ist ein PSTricks-Paket zum Skizzieren optischer +% Versuchsaufbauten. Dafür werden viele unterschiedliche Freistrahl- und +% Faserkomponenten bereitgestellt, deren Ausrichtung, Positionierung und +% Beschriftung einfach und flexibel eingestellt werden kann. Die Komponenten +% können dann mit Fasern oder Lichtstrahlen verbunden werden, wobei auch +% realistische Strahlengänge mit Raytracing möglich sind. +% \fi +% \ifENGLISH +% \section{About the package} +% The package \LPack{pst-optexp} is a collection of optical components that +% facilitate easy sketching of optical experimental setups. A lot of different +% free-ray and fiber components are provided, which alignment, positioning and +% labelling can be achieved in very simple and flexible ways. The components +% can be connected with fibers or beams, realistic raytraced beam paths are +% also possible. +% \fi +% +% \ifGERMAN +% \section{Anforderungen} +% \LPack{pst-optexp} benötigt \LaTeX{} und aktuelle Versionen der +% Pakete \LPack{pstricks} ($\geq 2.53$), \LPack{pst-plot} ($\geq +% 1.6.1$), \LPack{pst-node}, \LPack{pstricks-add}, \LPack{multido}, +% \LPack{pst-eucl}, \LPack{pst-intersect} ($\geq 0.4$) und +% \LPack{environ}. +% +% Alle PSTricks-Pakete machen regen Gebrauch von der Postscript-Sprache, so +% dass der typische Arbeitsfluss \opt{latex}, \opt{dvips} und +% ggf. \opt{ps2pdf} umfasst. Es gibt viele alternative Methoden um die +% Dokumente zu +% kompilieren.\fnurl{http://tug.org/PSTricks/main.cgi?file=pdf/pdfoutput} +% \fi +% \ifENGLISH +% \section{Requirements} +% \LPack{pst-optexp} requires \LaTeX{} and recent versions of +% \LPack{pstricks} ($\geq 2.53$), \LPack{pst-plot} ($\geq 1.61$), +% \LPack{pst-node}, \LPack{multido}, \LPack{pstricks-add}, +% \LPack{pst-eucl}, \LPack{pst-intersect} ($\geq 0.4$) and +% \LPack{environ}. +% +% All PSTricks package rely heavily on the Postscript language so that the +% typical workflow involves \opt{latex}, \opt{dvips}, and \opt{ps2pdf}. Of +% course there are several alternative ways to compile your +% documents.\fnurl{http://tug.org/PSTricks/main.cgi?file=pdf/pdfoutput} +% \fi +% +% \ifGERMAN +% \section{Verbreitung und Installation} +% Dieses Paket ist auf +% CTAN\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-optexp.html} +% erhältlich und in \TeX Live and MiK\TeX{} enthalten. +% +% Das \LPack{pst-optexp}-Paket umfasst die zwei Hauptdateien +% \texttt{pst-optexp.ins} und \texttt{pst-optexp.dtx}. Durch Aufrufen +% von \texttt{tex pst-optexp.ins} werden die beiden folgenden +% Dateien erzeugt: +% \begin{itemize} +% \item \texttt{pst-optexp.pro}: die Postscript Prologdatei +% \item \texttt{pst-optexp.sty}: die \LaTeX{} Stildatei +% \end{itemize} +% Speichern Sie diese Dateien in einem Verzeichnis der Teil Ihres +% lokalen \TeX-Baums ist. +% +% Vergessen Sie nicht \texttt{texhash} aufzurufen um den Baum zu +% aktualisieren. MiK\TeX{}-Benutzer müssen die Dateinamen-Datenbank +% (FNDB) aktualisieren. +% +% Detailliertere Information finden Sie in der Dokumentation Ihrer +% \LaTeX-Distribution über die Installation in den lokalen +% \TeX{}-Baum. +% \fi +% \ifENGLISH +% \section{Distribution and installation} +% This package is available on +% CTAN\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-optexp.html} and +% is included in \TeX Live and MiK\TeX. +% +% The \LPack{pst-optexp} package consists of the two main files +% \texttt{pst-optexp.ins} and \texttt{pst-optexp.dtx}. By running \texttt{tex +% pst-optexp.ins} the following derived files are generated: +% \begin{itemize} +% \item \texttt{pst-optexp.pro}: the Postscript prolog file +% \item \texttt{pst-optexp.sty}: the \LaTeX{} style file +% \end{itemize} +% Save the files in a directory which is part of your local \TeX{} tree. +% +% Do not forget to run \texttt{texhash} to update this tree. For MiK\TeX{} +% users, do not forget to update the file name database (FNDB). +% +% For more detailed information see the documentation of your personal +% \LaTeX{} distribution on installing packages to your local \TeX{} +% system. +% \fi +% +% \ifGERMAN\section{Lizenz}\fi +% \ifENGLISH\section{License}\fi +% \ifGERMAN +% Es wird die Erlaubnis gewährt, dieses Dokument zu kopieren, zu verteilen +% und\slash oder zu modifizieren, unter den Bestimmungen der \LaTeX{} Project +% Public License, Version +% 1.3c.\fnurl{http://www.latex-project.org/lppl.txt}. Dieses +% Paket wird vom Autor betreut (author-maintained). +% \fi +% \ifENGLISH +% Permission is granted +% to copy, distribute and\slash or modify this software under the terms of the +% \LaTeX{} Project Public License, version +% 1.3c.\fnurl{http://www.latex-project.org/lppl.txt} This +% package is author-maintained. +% \fi +% +% \ifGERMAN +% \section{Abwärtskompatibilität} +% \fi +% \ifENGLISH +% \section{Backward compatibility} +% \fi +% \ifGERMAN In Version 3.0 wurde dem Paket erheblich fortgeschrittenere +% Funktionalität hinzugefügt, die es zu schwierig machte zur +% Vorgängerversion 2.1 vollständig abwärtskompatibel zu +% bleiben. Insbesondere war die Funktionsweise des \Lcs{drawbeam} +% Makros grundlegend falsch konzipiert, so dass ein Wechsel zur neuen +% Funktionalität so schnell wie möglich erfolgen sollte. +% +% Eine genauere Zusammenstellung der nicht-kompatiblen Änderungen und Hinweise +% zur Migration von älteren Dokumenten finden Sie in \prettyref{sec:bwd-comp}. +% \fi +% \ifENGLISH +% Version 3.0 introduced a lot of advanced features which made it too difficult +% to maintain full backward compatibility with version 2.1. Especially the +% \Lcs{drawbeam} macro was broken by design, so that it was best to drop the old +% flaw as early as possible. +% +% You find a more detailled list of changes and information for migration of old +% documents in \prettyref{sec:bwd-comp}. +% \fi +% +% \section{Notation}\label{sec:notation} +% \ifGERMAN +% Die meisten Parametertypen, die im Laufe des Dokuments verwendet werden, sind +% selbsterklärend, andere bedürfen einer genaueren Erläuterung (z.B. der +% Unterschied zwischen \prm{num} und \prm{psnum}). \prettyref{tab:paramref} +% erklärt die geläufigsten Typen. +% \fi +% \ifENGLISH +% Often the parameter types are self-explanatory, but in some cases a clear +% distinction is needed, e.g. between \prm{num} and +% \prm{psnum}. \prettyref{tab:paramref} explains some commonly used types. +% \fi +% +% \begin{table}\centering +% \begin{tabularx}{0.9\linewidth}{>{\itshape}lX} \toprule +% Name & \ifENGLISH description\fi\ifGERMAN Beschreibung\fi\\ \midrule +% num & \ifENGLISH float number\fi\ifGERMAN Gleitkommazahl\fi \\ +% psnum & \ifENGLISH Postscript code which evaluates to a number\fi +% \ifGERMAN Postscript-Kode der zu einer Zahl auswertet\fi\\ +% int & \ifENGLISH integer number\fi\ifGERMAN Ganzzahl\fi\\ +% dimen & \ifENGLISH dimension\fi\ifGERMAN Länge\fi\\ +% psstyle & \ifENGLISH custom graphics parameter configuration defined with \Lcs*{newpsstyle}\fi +% \ifGERMAN Benutzerdefinierte Parameterkonfiguration definiert mit \Lcs*{newpsstyle}\fi\\ +% refpoint & \refpointexplanation\\ \bottomrule +% \end{tabularx} +% \ifGERMAN +% \caption{Parametertypen die in den Parameterdefinitionen verwendet werden.} +% \fi +% \ifENGLISH +% \caption{Parameter types used in the parameter reference.} +% \fi +% \label{tab:paramref} +% \end{table} +% +% \ifGERMAN +% \section{Danksagung} +% \fi +% \ifENGLISH +% \section{Acknowledgements} +% \fi +% \ifGERMAN +% Ich danke allen Aktiven auf der PSTricks-Mailingliste für ihre Hilfe, +% insbesondere Herbert Voß. Mein Dank gilt ebenfalls unterschiedlichen +% Paketautoren, von denen ich Code kopiert und viel gelernt habe: David +% Carlisle, Florent Chervet, Enrico Gregorio, Rolf Niepraschk und Heiko +% Oberdiek. Christine Römer hat mich mit ihrem Artikel in der +% DTK\footnote{Pakete in Deutsch dokumentieren. in Die TeXnische +% Komödie. Heft 2/2011, S. 28-35.} überzeugt, ebenfalls eine deutsche +% Dokumentation bereitzustellen. Der Dokumentationsstil ist eine +% Mischung aus der \opt{pst-doc} Klasse (Herbert Voß) und dem +% \opt{ltxdockit} Paket für die \opt{biblatex} Dokumentation (Philipp +% Lehmann). +% \fi +% \ifENGLISH +% I thank all the people of the PSTricks mailinglist for the continuous +% help, especially Herbert Voß. Thanks also to various package authors +% from which I learned and adopted code for this package: David +% Carlisle, Florent Chervet, Enrico Gregorio, Rolf Niepraschk and Heiko +% Oberdiek. Christine Römer convinced me with her article in the german +% DTK\footnote{Pakete in Deutsch dokumentieren. in Die TeXnische +% Komödie. Heft 2/2011, S. 28-35.} to provide a german translation of +% the documentation. The documentation style is a mixture of the +% \opt{pst-doc} class (Herbert Voß) and the \opt{ltxdockit} package for +% the \opt{biblatex} documentation (Philipp Lehman). +% \fi +% +% \ifGERMAN +% \chapter{Grundlegende Ideen} +% \fi +% \ifENGLISH +% \chapter{Basic ideas} +% \fi\label{chap:basics} +% +% \ifGERMAN Dieses Kapitel zeigt die grundlegenden Ideen und Konzepte, die in +% diesem Paket stecken. Anhand von elementaren Beispielen werden die +% Grundfunktionen wie Ausrichtung, Positionierung (\ref{sec:intro-comp}) und +% Beschriftung (\ref{sec:intro-label}) von Komponenten beschrieben. Anschließen +% wird deren Verbindung mit Strahlen (\ref{sec:intro-beam}) oder Fasern +% (\ref{sec:intro-fiber}) vorgestellt. +% +% In \prettyref{sec:step-by-step} wird Schritt für Schritt die angedachte +% Vorgehensweise für das Erstellen von umfassenden Experimentskizzen +% erläutert. Eine vollständige Referenz aller Makros und deren Parameter finden +% Sie in \prettyref{chap:generalparam}--\ref{chap:custom}. +% +% Ein Versuchsaufbau besteht aus Komponenten, die anhand ihrer Referenzknoten +% positioniert, verschoben und gedreht werden können und optional eine +% Beschriftung erhalten. Anschließen werden die Komponenten mit Lichtstrahlen +% oder Fasern verbunden. +% \fi +% \ifENGLISH +% This chapter shows the basic ideas and concepts of this package. Starting with +% simple examples, basic functionality such as alignment, positioning +% (\ref{sec:intro-comp}) and labelling (\ref{sec:intro-label}) of components is +% presented. Following, the connection of components with beam rays +% (\ref{sec:intro-beam}) or fiber (\ref{sec:intro-fiber}) is demonstrated. +% +% In \prettyref{sec:step-by-step} several propositions for preparing large +% experimental sketches are illustrated step by step. For a complete reference +% of all macros and their parameters, see +% \prettyref{chap:generalparam}--\ref{chap:custom}. +% +% A drawing consists of components, which can be positioned, shifted and rotated +% based on their reference nodes, and may have an optional label. Then, the +% components are connected with beam rays or fibers. +% \fi +% +% \ifGERMAN\section{Die Komponenten}\fi +% \ifENGLISH\section{The components}\fi +% \label{sec:intro-comp} +% +% \ifGERMAN Eine Komponente wird anhand der Knoten, die bei ihrere Definition +% angegeben werden -- den Referenzknoten -- platziert. Im folgenden Beispiel +% wird eine Linse mittig auf die Verbindungslinie zwischen den Knoten +% \prm{A} und \prm{B} gesetzt: +% \fi +% \ifENGLISH +% A component is positioned according to the nodes which are used for its +% definition---the reference nodes. In the following examples, the lens is +% placed centered between nodes \prm{A} and \prm{B}: +% \fi +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[linerange={1-3,6-6}] +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnodes(0,1){A}(3,1){B} + \lens(A)(B) + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[90](A){A}\psdot(B)\uput[90](B){B} +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \ifGERMAN +% Diese Positionierung kann anhand von unterschiedlichen Parametern, wie +% z.B. \Lkeyword{abspos} beinflusst werden (siehe dazu +% \prettyref{sec:positioning} und \prettyref{sec:rotshift}). Im +% folgenden Beispiel wird die Linse \opt{0.5} Einheiten vom Knoten +% \prm{A} entfernt platziert, die Box sitzt am Ende der Referenzlinie +% $\overline{AB}$. +% \fi +% \ifENGLISH +% This position can be changed with a number of parameters, such as +% \Lkeyword{abspos} (see \prettyref{sec:positioning} and +% \prettyref{sec:rotshift}). In the next example, the lens is positioned +% \opt{0.5} units apart from node \prm{A}, the box is placed at the end +% of the reference line $\overline{AB}$. +% \fi +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[morekeywords={[21]{abspos, position}}, linerange={1-4,7-7}] +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnode(0,1){A}\pnode(1.5,1){B} + \lens[abspos=0.5](A)(B) + \optbox[position=end](A)(B) + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[90](A){A}\psdot(B)\uput[135](B){B} +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \ifGERMAN Die Komponenten lassen sich allgemein in zwei Kategorien +% unterteilen: Faser- und Freistrahlkomponenten. Diese unterscheiden sich in +% erster Linie bezüglich ihrer Verbindungsmöglichkeiten: Freistrahlkomponenten +% können sowohl mit Lichtstrahlen als auch mit Fasern verbunden werden, +% wohingegen Faserkomponenten nur Faserverbindungen erlauben. +% \fi +% \ifENGLISH +% The components can be divided in two categories: free-ray and fiber +% components. These differ only in their connection possibilities: Free-ray +% components can have fiber or free-ray connections, whereas fiber components +% support fiber connections only. +% \fi +% +% \ifGERMAN\section{Beschriftungen}\fi +% \ifENGLISH\section{Labels}\fi +% \label{sec:intro-label} +% +% \ifGERMAN Jede Komponente kann optional eine Beschriftung erhalten, die +% relativ zur Komponente platziert wird. +% \fi +% \ifENGLISH Every component can have an optional label, which is positioned +% relative to the component. +% \fi +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[morekeywords={[21]{labelangle, labelref, labeloffset}}, linerange={1-5,8-8}] +\begin{pspicture}[showgrid](0,-0.3)(3,3.3) + \pnode(0,2.5){A}\pnode(2,2.5){B}\pnode(2,1.5){C} + \mirror[labelangle=-45](A)(B)(C){M} + \optbox[position=start, labeloffset=0, labelref=relative](C)(B){box} + \drawbeam(A){1}{2} + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[90](A){A}\psdot(B)\uput[-135](B){B}\psdot(C)\uput[45](C){C} +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \ifGERMAN\section{Freistrahl-Verbindungen}\fi +% \ifENGLISH\section{Free-ray connections}\fi +% \label{sec:intro-beam} +% +% \ifGERMAN +% Freistrahlkomponenten können mit Lichtstrahlen verbunden werden, deren Weg mit +% Raytracing berechnet werden kann. Da es sich um ein Paket zum +% \emph{Skizzieren} experimenteller Aufbauten handelt, werden hier trotz der +% realistischen Berechnungen viele Möglichkeiten offen gehalten den Strahlengang +% zu manipulieren. +% +% Im einfachsten Fall wird eine einzelne Linie gezeichnet, deren optischer Weg +% über den Brechungsindex \Lkeyword{n} und das Snelliussche Brechungsgesetz +% bestimmt wird. +% +% Das Beispiel zeigt zwei Strahlen, die mit unterschiedlichen Anfangsbedingungen +% auf die Linse treffen, der rote Strahl startet mit einem Abstand von \opt{0.2} +% von der optischen Achse (\Lkeyword{beampos}) und wird entsprechend von der +% Linse abgelenkt. +% \fi +% \ifENGLISH +% Free-ray components can be connected with beam rays, which path can be +% calculated by raytracing. Besides the realistic tracing possibilities, there +% are many ways to manipulate the beam paths because you are dealing with a +% package for \emph{sketching} experimental setups. +% +% In the simplest case a single line is drawn, which optical path is determined +% by the refractive index \Lkeyword{n} and Snell's law. +% +% The example shows two beams which hit the lens with different initial +% conditions. The red beam starts at a distance of \opt{0.2} from the optical +% axis (\Lkeyword{beampos}) and is deflected by the lens accordingly. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-5,8-8}] +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnode(0,1){A}\pnode(3,1){B} + \lens[n=2, lensradius=2 2, lensheight=1.5](A)(B) + \drawbeam(A){1}(B) + \drawbeam[beampos=0.4, linecolor=red](A){1}(B) + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[-90](A){A}\psdot(B)\uput[90](B){B} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Die Strahlen können mit beliebigen Strichlierungen und Pfeilen +% dekoriert werden. +% \fi +% \ifENGLISH The beams can be decorated with arbitrary dashs and arrows. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-4,7-7}] +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnode(0,1){A}\pnode(3,1){B} + \lens[n=2, lens=2 2 1.5](A)(B) + \drawbeam[beamangle=10, ArrowInside=->, arrows=-|, beaminside=false](A){1}(B) + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[90](A){A}\psdot(B)\uput[-90](B){B} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Ebenfalls können ausgedehnte Strahlen gezeichnet werden deren +% Randstrahlen mit \Lkeyword*{linestyle} etc. und deren Füllung über +% \Lkeyword*{fillstyle} geändert werden können. +% \fi +% \ifENGLISH You can also draw wide beams. The marginal rays can be changed with +% \Lkeyword*{linestyle} etc. and the filling with \Lkeyword*{fillstyle} etc. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-5,8-8}] +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnode(0.5,1){A}\pnode(3,1){B} + \optbox[position=start, optboxsize=0.5 1](A)(B) + \lens[n=2](A)(B) + \drawwidebeam[beamwidth=0.2, fillstyle=solid, fillcolor=green!40]{1-2}(B) + \psset{style=Refline}\color{Refline} + \psdot(A)\uput[45](A){A}\psdot(B)\uput[135](B){B} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Die Strahlen können auch hinter die Komponenten gelegt werden. Dafür +% müssen alle beteiligten Komponenten und Strahlen in eine +% \Lenv{optexp}-Umgebung gepackt werden (vergleiche das folgende Beispiel mit +% dem vorangegangenen). +% \fi +% \ifENGLISH The beams can also lay behind the components. For this you must +% enclose all respective components and rays in a \Lenv{optexp} environment +% (compare the previous example with the following one). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}[showgrid](0,-0.3)(3,2.3) + \pnode(1.5,1){A}\pnode(3,1){B} + \begin{optexp} + \optbox[position=start](A)(B) + \lens[n=2](A)(B) + \drawwidebeam[beamwidth=0.2, fillstyle=solid, fillcolor=green!40]{1}{2}(B) + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Faserverbindungen}\fi +% \ifENGLISH\section{Fiber connections}\fi +% \label{sec:intro-fiber} +% +% \ifGERMAN +% Eine andere Möglichkeit, Komponenten zu verbinden, sind Fasern +% (\Lcs{drawfiber}). Hiermit bestehen weitreichende Möglichkeiten die Fasern +% automatisch an die Komponentenausrichtung anzupassen. +% \fi +% \ifENGLISH +% Fibers (\Lcs{drawfiber}) are another possibility of connecting +% components. Here, you have several way of automatically adapting the fiber +% connection to the component alignment. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}[showgrid](0,-0.3)(3,3.3) + \pnode(1,2.5){A}\pnode(2.5,1){B} + \psset{optboxsize=1 0.6} + \optbox[position=start](A)(B|A) + \optbox[position=end](B|A)(B) + \drawfiber{1}{2} + \drawfiber[linecolor=blue, ncurv=1.2]{1}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Üblicherweise werden Fasern mit einer \Lcs*{nccurve}-Verbindung +% gezeichnet, jede andere Knotenverbindung ist aber ebenfalls möglich +% (\Lkeyword{fiberstyle}). +% \fi +% \ifENGLISH Usually, the fibers are drawn as \Lcs*{nccurve} connections, other +% node connections are possible as well (\Lkeyword{fiberstyle}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}[showgrid](0,-0.3)(3,3.3) + \pnode(1,2.5){A}\pnode(2.5,1){B} + \psset{optboxsize=1 0.6} + \optbox[position=start](A)(B|A) + \optbox[position=end](B|A)(B) + \drawfiber[fiberstyle=angle, linearc=0.5]{1}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \newpage +% \ifGERMAN\section{Schritt-für-Schritt-Beispiele}\fi +% \ifENGLISH\section{Step-by-step examples}\fi +% \label{sec:step-by-step} +% +% \ifGERMAN +% \subsection{Freistrahlaufbau} +% In diesem ersten Beispiel werden alle Komponenten auf eine Verbindungslinie +% verteilt und mit einem Strahl verbunden. +% +% Zuerst werden Anfangsknoten \prm{A} und Endknoten \prm{B} definiert. Die erste +% \Lcomp{optbox} wird an den Anfang platziert, die Wellenplatte und der +% Polarisator werden innerhalb der Verbindungslinie positioniert. Der Parameter +% \Lkeyword{position} erwartet Werte zwischen \opt{0} und \opt{1}, die relativ +% zur Länge der Verbindungslinie sind, oder \opt{start}/\opt{end}. Der Detektor +% wird immer an das Ende der Linie gesetzt. +% +% Zuletzt werden alle Komponenten mit einem einfachen Lichtstrahl verbunden. +% \fi +% \ifENGLISH +% In this first example, all components are distributed on a single line and +% connected with a beam. +% +% First we define the start node \prm{A} and the stop node \prm{B}. The first +% \Lcomp{optbox} is positioned at the start, the wave plate and the polarizer are +% positioned between the nodes. The parameter \Lkeyword{position} expects a +% value between \opt{0} and \opt{1} which is relative to the length of the +% reference line, or \opt{start}/\opt{end}. The detector is always positioned at +% the end of its reference line. +% +% Finally, all components are connected with a simple beam ray. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-7,10-10}] +\begin{pspicture}[showgrid](4,2) + \pnode(1,1){A}\pnode(3,1){B} + \optbox[position=start, optboxwidth=1.2, labeloffset=0](A)(B){Laser} + \optretplate[position=0.3](A)(B){$\nicefrac{\lambda}{2}$} + \optplate[position=0.7](A)(B){pol} + \optdetector[dettype=diode](A)(B){PD} + \drawbeam{1}{2}{3}{4} + \psset{style=Refline, dotscale=1.5}\psdot(A)\psdot(B) + \uput[45](A){\color{Refline}A}\uput[135](B){\color{Refline}B} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\subsection{Galilei-Fernrohr}\fi +% \ifENGLISH\subsection{Galilean telescope}\fi +% +% \ifGERMAN +% Im Folgenden wird ein sehr einfacher Aufbau mit einer konkaven und +% einer konvexen Linse schrittweise erläutert. +% +% Zuerst werden die Referenzknoten \prm{A} und \prm{B} definiert, die für die +% Ausrichtung der Komponenten verwendet werden. Zur besseren Übersicht werden +% beide Knoten gekennzeichnet, desweiteren dient ein Koordinatengitter der +% Orientierung. +% +% Die erste Linse soll konkav gekrümmte Grenzflächen haben. Mit +% \Lkeyword{lensradius} werden die Radien der linken und rechten Fläche auf +% negative Werte gesetzt, was eine konkave Krümmung ergibt. Die Linse wird mit +% \Lkeyword{abspos} eine Einheit vom \prm{A}-Knoten entfernt positioniert. +% \fi +% \ifENGLISH +% This example describes a simple setup with a concave and a convex lens and the +% raytracing through them. +% +% First, we define the reference nodes \prm{A} and \prm{B} which are used for +% alignment of the components. For better overview, these nodes are highlighted +% and a grid is drawn. +% +% The first lens should have concave interfaces. With \Lkeyword{lensradius} the +% interface radii are set to negative values, which correspond to concave +% curvatures. With \Lkeyword{abspos} the lens is positioned one unit from +% \prm{A} node. +% \fi +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example, linerange={1-4,6-6}] +*\ON*\begin{pspicture}[showgrid](0,-0.3)(5,2.3) + \pnode(0,1){A}\pnode(3.5,1){B}*\OFF* + \lens[lensradius=-0.7, + abspos=1](A)(B){concave}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B) +\end{pspicture}*\OFF* +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Die zweite Linse bekommt eine konvexe Krümmung (\Lkeyword{lensradius} +% ist positiv) und wird \opt{2.6} Einheiten von \prm{A} +% positioniert. Die Linsenhöhe wird mit \Lkeyword{lensheight} +% eingestellt. +% \fi +% \ifENGLISH +% The second lens has a convex curvature (\Lkeyword{lensradius} is positive) and +% is positioned \opt{2.6} units apart from \prm{A}. Parameter +% \Lkeyword{lensheight} sets the total height of the lens. +% \fi +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example, linerange={1-6,9-9}] +*\ON*\begin{pspicture}[showgrid](0,-0.3)(5,2.3) + \pnode(0,1){A}\pnode(3.5,1){B} + \lens[lensradius=-0.7, + abspos=1](A)(B){concave}*\OFF* + \lens[lensradius=2.3, lensheight=1.3, + abspos=2.6](A)(B){convex}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B) + \uput[45](A){\color{Refline}A}\uput[135](B){\color{Refline}B} +\end{pspicture}*\OFF* +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Die Lichtstrahlen sollen auf einer CCD-Kamera enden, die mit einer +% \Lcomp{optbox} gezeichnet wird. Mit \Lkeyword{position}\opt{=end} wird die Box +% ans Ende der Referenzlinie von \prm{A} nach \prm{B} gesetzt, die +% Beschriftung wird mit \Lkeyword{labeloffset} in die Mitte der Komponente +% gelegt. +% \fi +% \ifENGLISH +% The beam rays are supposed to end at the CCD camera which is drawn as a +% \Lcomp{optbox}. With \Lkeyword{position}\opt{=end} the box is positioned at +% the end of the reference line from \prm{A} to \prm{B}. The label is put at +% the center of the component with \Lkeyword{labeloffset}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example, linerange={1-7,10-10}] +*\ON*\begin{pspicture}[showgrid](0,-0.3)(5,2.3) + \pnode(0,1){A}\pnode(3.5,1){B} + \lens[lensradius=-0.7, + abspos=1](A)(B){concave} + \lens[lensradius=2.3, lensheight=1.3, + abspos=2.6](A)(B){convex}*\OFF* + \optbox[position=end, labeloffset=0](A)(B){CCD}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B) + \uput[45](A){\color{Refline}A}\uput[135](B){\color{Refline}B} +\end{pspicture}*\OFF* +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Zum Schluß wird ein aufgeweiteter Strahl mit einer Strahlbreite von \opt{0.2} +% und ohne anfängliche Divergenz durch die Komponenten geschickt. Der +% Strahlengang wird mittels Raytracing berechnet. Die Linsenparameter in diesem +% Beispiel wurden so gewählt das bei kollimiertem Eingangsstrahl der +% Ausgangsstrahl ebenfalls kollimiert ist. +% \fi +% \ifENGLISH +% Finally, a wide beam with an initial beam width of \opt{0.2} without +% divergence is sent through the components. The beam path is calculated by +% raytracing. The lens parameters in this example were set such, that for a +% collimated input beam also the output beam is collimated. +% \fi +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example] +*\ON*\begin{pspicture}(5,2) + \pnode(0,1){A}\pnode(3.5,1){B} + \lens[lensradius=-0.7, + abspos=1](A)(B){concave} + \lens[lensradius=2.3, lensheight=1.3, + abspos=2.6](A)(B){convex} + \optbox[position=end, labeloffset=0](A)(B){CCD}*\OFF* + \drawwidebeam[beamwidth=0.2](A){1}{2}{3}*\ON* +\end{pspicture}*\OFF* +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Das Aussehen des Lichtstrahls wird über den \Lstyle{Beam}-Stil +% eingestellt, und kann z.B. mit einer halbtransparenten Füllung +% versehen werden. +% \fi +% \ifENGLISH +% The appearance of the beam can be changed via the \Lstyle{Beam} style, and may +% have e.g. a semitransparent fill pattern. +% \fi +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example, label=ex:galileo, caption={caption}] +*\ON*\begin{pspicture}(5,2) + \pnode(0,1){A}\pnode(3.5,1){B} + \lens[lensradius=-0.7, + abspos=1](A)(B){concave} + \lens[lensradius=2.3, lensheight=1.3, + abspos=2.6](A)(B){convex} + \optbox[position=end, labeloffset=0](A)(B){CCD}*\OFF* + \addtopsstyle{Beam}{fillstyle=solid, + fillcolor=green, opacity=0.2} + *\ON*\drawwidebeam[beamwidth=0.2](A){1}{2}{3} +\end{pspicture}*\OFF* +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\subsection{Faseraufbau}\fi +% \ifENGLISH\subsection{Fiber setup}\fi +% \label{sec:fiber-setup} +% +% \ifGERMAN +% Dieses Beispiel zeigt, wie ein faseroptischer Aufbau mit automatisch +% gezeichneten Faserverbindungen konstruiert werden kann. +% +% Auch hier werden die Referenzknoten zur besseren Orientierung +% eingezeichnet. Im Gegensatz zum vorhergehenden Beispiel benötigen wir +% mehr Referenzknoten, da die Faserkomponenten direkt mit diesen +% verbunden werden. +% +% Der Laser wird wieder an den Anfang gesetzt. Der Abstand +% der Beschriftung wird mit dem Parameter \Lkeyword{label} eingestellt, +% mit dem alle Beschriftungsparameter gesammelt eingestellt werden +% können. Da eine \Lcomp{optbox} sowohl als Freistrahl- als auch als +% Faserkomponente verwendet werden kann, wird in der Standardeinstellung +% keine Faser gezeichnet, was mit \Lkeyword{fiber} geändert werden +% kann. Die Breite dieser und aller folgenden \Lcomp{optbox} wird auf +% \opt{0.7} geändert. +% \fi +% \ifENGLISH +% This example shows how to setup a fiber drawing with automatic fiber +% connections. +% +% Again, the reference nodes are shown for better orientation. In contrast to +% the previous example, here, we need more reference nodes because the +% components are connected directly with them. +% +% The laser is set at the start. The label offset is set with the +% \Lkeyword{label} parameter, which would allow setting all label parameters at +% once. A \Lcomp{optbox} is originally a free-ray component, so that for it the +% fiber connection must be enabled with \Lkeyword{fiber}. The width of all +% \Lcomp{optbox} is changed to \opt{0.7}. +% \fi +% \iffalse +%<*ignore> +% \fi +% \begingroup +% \catcode`\*=13 +% \def*{}% +\begin{LTXexample}[style=example, linerange={1-4,6-6}] +*\ON*\begin{pspicture}[showgrid](4.7,2) + \pnodes(0.7,1){A}(1,1){B}(2.8,1){C}(4,1.5){D}(4,0.5){E}*\OFF* + \psset{optboxwidth=0.7, labelstyle=\scriptsize} + \optbox[position=start, label=0, fiber](A)(B){LD}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B)\psdot(C)\psdot(D)\psdot(E) +\end{pspicture}*\OFF* +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Als nächstes wird ein Mach-Zehnder-Modulator ohne Beschriftung gezeichnet, der +% automatisch mit Fasern mit seinen Referenzknoten verbunden wird. +% \fi +% \ifENGLISH The Mach--Zehner modulator is drawn without label and connected +% automatically with fibers to its reference nodes. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[style=example, linerange={1-5,7-7}] +*\ON*\begin{pspicture}[showgrid](4.7,2) + \pnodes(0.7,1){A}(1,1){B}(2.8,1){C}(4,1.5){D}(4,0.5){E} + \psset{optboxwidth=0.7, labelstyle=\scriptsize} + \optbox[position=start, label=0, fiber](A)(B){LD}*\OFF* + \optmzm(B)(C)*\ON* + \psset{style=Refline}\psdot(A)\psdot(B)\psdot(C)\psdot(D)\psdot(E) +\end{pspicture}*\OFF* +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Danach wird ein Faserkoppler mit einem Eingang und zwei Ausgängen +% gezeichnet. Der Koppler wird zwischen dem Eingangsknoten und dem +% Mittelpunkt der beiden Ausgangsknoten ausgerichtet. +% \fi +% \ifENGLISH Then, we draw a fiber coupler with one input and two output +% fibers. The coupler is positioned between the input node and the center of the +% two output nodes. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[style=example, linerange={1-6,8-8}] +*\ON*\begin{pspicture}[showgrid](4.7,2) + \pnodes(0.7,1){A}(1,1){B}(2.8,1){C}(4,1.5){D}(4,0.5){E} + \psset{optboxwidth=0.7, labelstyle=\scriptsize} + \optbox[position=start, label=0, fiber](A)(B){LD} + \optmzm(B)(C)*\OFF* + \wdmsplitter(C)(D)(E){50\%}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B)\psdot(C)\psdot(D)\psdot(E) +\end{pspicture}*\OFF* +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% An die Enden des Kopplers wird ein optischer Spektrumanalysator (OSA) +% und eine Leistungsmessgerät (PD) gesetzt. Der \Lcomp{optdetector} wird +% nach Voreinstellung ans Ende der Referenzlinie gesetzt +% (\Lkeyword{position}\opt{=end}). Diese beiden Komponenten werden ohne +% weitere Einstellungen ohne Faserverbindungen gezeichnet. Das passt, da +% ihre jeweiligen Endpunkte mit den Ausgängen des Kopplers +% zusammenfallen. +% +% Die Schreibweise \opt{(A|E)} nimmt die $x$-Koordinate von \prm{A} und die +% $y$-Koordinate von \prm{E}. +% \fi +% \ifENGLISH +% At the ends of the coupler we put an optical spectrum analyzer (OSA) +% and a power meter (PD). The \Lcomp{optdetector} is set by default at the +% end of the reference line, it has \Lkeyword{position} preset to +% \opt{end}. These two components are drawn without fibers, because +% their end nodes coincide with the two outputs of the coupler. +% +% The notation \opt{(A|E)} uses the $x$-coordinate of \prm{A} and the +% $y$-coordinate of \prm{E}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[style=example, caption={caption}, label={ex:fiber-setup}, linerange={1-8,10-10}] +*\ON*\begin{pspicture}[showgrid](4.7,2) + \pnodes(0.7,1){A}(1,1){B}(2.8,1){C}(4,1.5){D}(4,0.5){E} + \psset{optboxwidth=0.7, labelstyle=\scriptsize} + \optbox[position=start, label=0, fiber](A)(B){LD} + \optmzm(B)(C) + \wdmsplitter[abspos=0.3, label=0.4](C)(D)(E){50\%}*\OFF* + \optbox[position=end, label=0](A|D)(D){OSA} + \optdetector(A|E)(E){PD}*\ON* + \psset{style=Refline}\psdot(A)\psdot(B)\psdot(C)\psdot(D)\psdot(E) +\end{pspicture}*\OFF* +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\subsection{Faseraufbau (Alternative)}\fi +% \ifENGLISH\subsection{Fiber setup (alternative)}\fi +% +% \ifGERMAN +% Dieses Beispiel ist vom Ergebnis her identisch mit dem vorangegangenen +% (\prettyref{ex:fiber-setup}), wird aber anders angegangen. +% +% Hier verwenden wir nicht die automatischen Faserverbindungen sondern zeichnen, +% wie bei Freistrahlaufbauten, zuerst die Komponenten und verbinden diese zum +% Schluß explizit mit Fasern (\Lcs{drawfiber}). Daher benötigen wir weniger +% Referenzknoten, die Faserverbindungen werden mit \Lkeyword{fiber}\opt{=none} +% global unterdrückt. +% +% Welche Herangehensweise verwendet wird ist meistens Geschmackssache, bei +% Ringstrukturen wie z.B. Faserlasern kann das nachträgliche Verbinden mit +% \Lcs{drawfiber} von Vorteil sein. +% \fi +% +% \ifENGLISH +% This example has the same result as the previous one +% (\prettyref{ex:fiber-setup}), but is constructed differently. +% +% This time we do not use the automatic fiber connections, but draw all +% components first and connect them afterwards with fibers +% (\Lcs{drawfiber}). This requires less reference nodes, the fiber connections +% are suppressed globally with \Lkeyword{fiber}\opt{=none}. +% +% The choice of the procedure depends on personal preferences, for loop setups, +% like for fiber lasers, it looks better if the fibers are drawn after the +% components with \Lcs{drawfiber}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[caption={caption}, label={ex:fiber-setup-alt}, linerange={1-10,13-13}] +\begin{pspicture}[showgrid](4.9,2) + \pnode(0.7,1){A}\pnode(4,1){B} + \psset{optboxwidth=0.7, labelstyle=\scriptsize, fiber=none} + \optbox[position=start, labeloffset=0](A)(B){LD} + \optmzm[abspos=1.1](A)(B) + \wdmsplitter[abspos=2.25, label=0.4](A)(B)(B){50\%} + \optbox[position=end,label=0, compshift=0.5](A)(B){OSA} + \optdetector[compshift=-0.5](A)(B){PD} + \drawfiber{1-4} + \drawfiber{3}{5} + \psset{style=Refline}\psdot(A)\psdot(B) + \color{Refline}\uput[45](A){A}\uput[135](B){B} +\end{pspicture} +\end{LTXexample} +% \endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% \newpage +% \subsection{Michelson-Interferometer} +% \fi +% \ifENGLISH +% \subsection{Michelson-Interferometer} +% \fi +% +% \ifGERMAN +% In diesem Beispiel werden neben Linsen auch reflektierende Elemente +% (Spiegel) eingesetzt sowie Elemente, die sowohl transmittieren als +% auch reflektieren (Strahlteiler). +% \fi +% \ifENGLISH +% In this example we use lenses, reflective elements (mirrors) and components +% which can be either transmittive or reflective (beamsplitter). +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begingroup +\catcode`\*=13 +\def*{}% +\begin{LTXexample}[style=example, hsep=8mm, numbers=left, numberstyle=\footnotesize, caption={caption}, label=ex:michelson] +\begin{pspicture}(3.2,5) + \pnodes(0,3){A}(1,3){BS}(3,3){M1}(1,5){M2}(1,1){PD}*\label{l:ex2-nodes}* + \psset{mirrortype=extended, mirrordepth=0.2}*\label{l:ex2-set}* + \begin{optexp}*\label{l:ex2-begin}* + \beamsplitter[bsstyle=plate, compname=BS](A)(BS)(PD)*\label{l:ex2-bs}* + \mirror[compname=M1](BS)(M1)(BS)*\label{l:ex2-m1}* + \mirror[compname=M2, variable](BS)(M2)(BS)*\label{l:ex2-m2}* + \lens[compname=L](BS)(PD)*\label{l:ex2-l}* + \optdetector[compname=Det, dettype=diode](BS)(PD)*\label{l:ex2-det}* + \addtopsstyle{Beam}{beamwidth=0.2, fillstyle=solid, fillcolor=green!20!white}*\label{l:ex2-style}* + \drawwidebeam(A){BS}{M1}{BS}{M2}{BS}{L}{Det}*\label{l:ex2-beam}* + \end{optexp} +\end{pspicture} +\end{LTXexample} +\endgroup +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Wir beginnen wieder, indem wir die Referenzknoten definieren +% (\prettyref{l:ex2-nodes}) und ein paar +% grundlegende Einstellungen setzen (\prettyref{l:ex2-set}). +% +% Dann werden der Reihe nach alle Komponenten platziert +% (\prettyref{l:ex2-bs}--\ref{l:ex2-det}). Die reflektierenden benötigen +% drei Referenzknoten: den Eingangsknoten, den Knoten an dem die +% reflektierende Grenzfläche ist und den Ausgangsknoten. Anschließend +% wird noch das Aussehen des Lichtstrahls festgelegt +% (\prettyref{l:ex2-style}) und der Strahl gezeichnet +% (\prettyref{l:ex2-beam}). +% +% Diese Mal haben wir den Komponenten Namen gegeben (\Lkeyword{compname}) die +% beim Raytracing anstelle der IDs -- der automatisch vergebenen Nummern -- +% verwendet werden können. Dies kann die Nachverfolgung des Strahlengangs +% erleichtern. +% +% Alle Komponenten und Strahlen wurden zusätzlich in eine +% \Lenv{optexp}-Umgebung gekapselt. Innerhalb dieser werden alle +% Lichtstrahlen hinter die Komponenten gelegt, sodass diese nicht +% verdeckt werden. +% \fi +% \ifENGLISH +% We start with definition of the reference nodes +% (\prettyref{l:ex2-nodes}) and setting some basic +% parameters (\prettyref{l:ex2-set}). +% +% Following, all components are positioned +% (\prettyref{l:ex2-bs}--\ref{l:ex2-det}). The reflective ones need three +% reference nodes, the input node, the node where the reflective interface is +% situated, and the output node. Then, the appearance of the beam is set +% (\prettyref{l:ex2-style}), and the beam is drawn (\prettyref{l:ex2-beam}). +% +% In this example, all components have a name (\Lkeyword{compname}), which can +% be used instead of the numerical IDs---automatically assigned, unique +% numbers---for the raytracing. This can simplify follwing the beam path. +% +% All components and beams are enclosed in a \Lenv{optexp} environment. Inside +% of this, all beams are drawn behind the components. +% \fi +% +% +% \ifGERMAN\chapter{Allgemeine Komponentenparameter}\fi +% \ifENGLISH\chapter{General component parameters}\fi +% \label{chap:generalparam} +% +% \ifGERMAN Dieses Kapitel enthält alle Informationen zu allgemeinen Parametern +% und Konzepten. Das beinhaltet das Setzen von Beschriftungen +% (\ref{sec:labels}), Positionierung (\ref{sec:positioning}), Drehen und +% Verschieben von Komponenten (\ref{sec:rotshift}) und Anpassen der Aussehens +% (\ref{sec:styles} und \ref{sec:appearance}). +% \fi +% \ifENGLISH This chapter introduces generic parameters and concepts such as +% labels (\ref{sec:labels}), positioning (\ref{sec:positioning}), rotating and +% shifting of components (\ref{sec:rotshift}) and changing the appearance of +% components (\ref{sec:styles} and \ref{sec:appearance}). +% \fi +% +% \ifGERMAN\section{Beschriftungen}\fi +% \ifENGLISH\section{Labels}\fi +% \label{sec:labels} +% +% \ifGERMAN Alle Komponenten können mit einer Beschriftung versehen werden, +% deren Position und Ausrichtung genau angepasst werden kann. Die Beschriftung +% ist für jede Komponente optional. Sollten die vielfältigen Parameter nicht +% ausreichend sein, können Sie den Beschriftungsknoten -- in einigen Beispielen +% mit einem roten Punkt gekennzeichnet -- auch direkt verwenden (siehe auch +% \prettyref{sec:labelnode}). +% \fi +% \ifENGLISH All components may have a label which position and alignment can be +% adjusted at will. The label is optional for every component. If the various +% parameters are not sufficient, you can access the label node---marked as red +% dot in some examples---directly (see also \prettyref{sec:labelnode}). +% \fi +% +% \begin{optionlist} +% \numitem[0.8]{labeloffset} +% \ifGERMAN Der Abstand des Referenzknotens für die Beschriftung (roter +% Punkt) zur Komponentenmitte (blaues Kreuz). +% \fi +% \ifENGLISH The offset of the label reference node (red dot) from the +% component center (blue cross). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,6-6}, morekeywords={[21]{labeloffset}}] +\begin{pspicture}(3,1.8) + \optbox[beam, labeloffset=1](0,1.5)(3,0.8){label} + \psdot[style=CenterNode](\oenodeCenter{}) + \psdot[linecolor=red](\oenodeLabel{}) + \ncline[arrows=<->, style=Refline, arrowinset=0, arrowscale=1.5]{\oenodeCenter{}}{\oenodeLabel{}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \valitem{labelstyle}{macros} +% \ifGERMAN Der Schriftstil der Beschriftungen.\fi +% \ifENGLISH The text style that is used to typeset the label.\fi +% +% \valitem[c]{labelalign}{refpoint} +% \ifGERMAN Definiert die Ausrichtung der Beschriftung bezüglich des +% Beschriftungsknotens. +% \fi +% \ifENGLISH Defines the alignment of the label relative to the label node. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,6-6}, morekeywords={[21]{labeloffset, labelalign}}] +\begin{pspicture}(3,1.8) + \psset{beam, labeloffset=1} + \optbox[labelalign=bl](0,1.5)(3,0.8){label} + \psdot[style=CenterNode](\oenodeCenter{}) + \psdot[linecolor=red](\oenodeLabel{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \numitem[0]{labelangle} +% \ifGERMAN +% Der Rotationswinkel des Beschriftungsknotens um die Mitte. Der Nullpunkt hängt +% sowohl von der jeweiligen Komponenten und dem gewählten Referenzsystem ab +% (siehe \Lkeyword{labelref}). +% \fi +% \ifENGLISH +% The rotation angle of the label node around the component center. The origin +% depends both on the component and the choosen reference system (see +% \Lkeyword{labelref}). +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,4-6,27-27}, morekeywords={[21]{labelangle}}] +\begin{pspicture}(-0.3,0)(2,3.7) + \psset{labeloffset=1, optboxwidth=1, arrowscale=1.5, arrowinset=0} + \begin{optexp} + \optbox[position=end, labelangle=90](1,1)(1,2){Box} + \beamsplitter[labelangle=-90](1,2)(1,1)(2,1){BS} + \drawbeam[arrows=->]{1}{2}(2,1) + \frontlayer{% + \psdot[style=CenterNode](\oenodeCenter{1}) + \psdot[style=CenterNode](\oenodeCenter{2}) + \psdot[linecolor=red](\oenodeLabel{1}) + \psdot[linecolor=red](\oenodeLabel{2}) + } + \backlayer{% + \bgroup + \psset{style=Refline} + \psline(\oenodeCenter{2})([offset=-1]\oenodeCenter{2}) + \psline(\oenodeCenter{2})([Xnodesep=-1]\oenodeCenter{2}) + \psarc[arrows=<-](\oenodeCenter{2}){0.7}{180}{270} + \uput{0.9}[-135](\oenodeCenter{2}){\small $-90$\textdegree} + \psline(\oenodeCenter{1})([Xnodesep=1]\oenodeCenter{1}) + \psline(\oenodeCenter{1})([offset=1]\oenodeCenter{1}) + \psarc[arrows=->](\oenodeCenter{1}){0.7}{0}{90} + \uput{0.9}[45](\oenodeCenter{1}){\small $90$\textdegree} + \egroup + } + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[relgrav]{labelref}{relative, relgrav, global, absolute} +% \ifGERMAN +% Wählt das Bezugssystem für \Lkeyword{labelangle} und die Orientierung der +% Beschriftung. +% \fi +% \ifENGLISH +% Set the reference coordinate system for the \Lkeyword{labelangle} and the +% orientation of the label text. +% \fi +% +% \begin{valuelist} +% \item[relative] +% \ifGERMAN Die Beschriftung ist parallel zu der Referenzlinie der +% Komponente und der Winkel wird immer auf den Bereich zwischen $-90$° und +% $+90$° zurückgerechnet. +% \fi +% \ifENGLISH The label is parallel to the component reference line and the +% actual angle is always projected to the range between $-90$° and $+90$°. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{labelref}}] +\begin{pspicture}(0,-2.2)(2,2.2) + \psset{position=end, optboxsize=1 0.6, labeloffset=0, labelref=relative} + \multido{\i=0+45}{8}{% + \optbox(0,0)(1;\i){\i} + } +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item[relgrav] +% \ifGERMAN Die Beschriftung ist immer horizontal, lediglich der +% Beschriftungsknoten wird zusammen mit der Komponente gedreht. +% \fi +% \ifENGLISH The label itself is always horizontal, only the label node is +% rotated together with the component. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{labelref}}] +\begin{pspicture}(0,-2.2)(2,2.2) + \psset{position=end, optboxsize=1 0.6, labelref=relgrav} + \multido{\i=0+72}{5}{% + \optbox(0,0)(1;\i){\i} + } +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item[global, absolute] +% \ifGERMAN Die Beschriftung ist unabhängig von der Komponentenausrichtung.\fi +% \ifENGLISH The label is independent of the component alignment.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{labelref}}] +\begin{pspicture}(0,-2.2)(2,2.2) + \psset{position=end, optboxsize=1 0.6, labelref=global} + \multido{\i=0+72}{5}{% + \optbox(0,0)(1;\i){\i} + } +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{valuelist} +% +% \optitem{label}{\prm{offset}[ \prm{angle}[ \prm{refpoint}[ \prm{labelref}]]]} +% \ifGERMAN +% Diese Option erlaubt die kompakte Definition mehrerer +% Beschriftungsparameter. Es können bis zu vier Leerzeichen-getrennte +% Argumente übergeben werden (\Lkeyword{labeloffset}, +% \Lkeyword{labelangle}, \Lkeyword{labelalign} und +% \Lkeyword{labelref}). Mit einem Punkt kann eine Option übersprungen +% werden. +% \fi +% \ifENGLISH +% Allows compact definition of several label parameters. It takes up to +% four space-separated arguments (\Lkeyword{labeloffset}, +% \Lkeyword{labelangle}, \Lkeyword{labelalign}, and +% \Lkeyword{labelref}). Unchanged intermediate arguments can be +% skipped with a dot. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{label}}] +\begin{pspicture}(0,0)(4,3) + \psset{endbox, beam} + \optbox[label=0.7](1.5,2.5)(2.5,2.5){box} + \optbox[label=1 -45](1.5,1)(2.5,1){$-45$} + \optbox[label=0 . . relative]% + (0.6,0.6)(0.6,1.6){relative} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \choitem{innerlabel}{true} +% \ifGERMAN Das ist ein Alias für \opt{label=0 .\ c relative}\fi +% \ifENGLISH This is an alias for \opt{label=0 .\ c relative}\fi +% \end{optionlist} +% +% +% +% \ifGERMAN\section{Positionierung}\fi +% \ifENGLISH\section{Positioning}\fi +% \label{sec:positioning} +% +% \ifGERMAN +% Alle Komponenten außer den Freistrahl-Dreipolen können zwischen ihren +% beiden Referenzknoten \Lcs{oenodeRefA} und \Lcs{oenodeRefB} +% positioniert werden. +% \fi +% \ifENGLISH +% All components except for the free-ray tripoles can be positioned between +% their two reference nodes \Lcs{oenodeRefA} and \Lcs{oenodeRefB}. +% \fi +% \begin{optionlist} +% \choitem{position}{\prm{num},start,end} +% \ifGERMAN +% Ist der Wert eine Zahl, so wird damit die relative Position der Mitte eines +% Objektes (blaues Kreuz) bezüglich seiner beiden Referenzknoten (schwarze +% Punkte) gesetzt. Das ist äquivalent zum \Lkeyword*{npos} Parameter von +% \Lcs*{ncput}, d.h. eine Zahl im Intervall $[0,1]$ (siehe \LPack{pst-node} +% Dokumentation\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-node.html}). +% \fi +% \ifENGLISH Controls the relative position of an object center (blue cross) +% between its two reference points (black dots), if the value is a number. In +% this case it is equivalent to the \Lkeyword*{npos} parameter of +% \Lcs*{ncput}, i.e. a number in the range $[0,1]$ (see \LPack{pst-node} +% documentation\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-node.html}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{position}}, linerange={1-2,5-5}] +\begin{pspicture}(3,1.5) + \lens[beam, position=0.8](0,1)(3,1){L} + \psdot(\oenodeRefA{})\psdot(\oenodeRefB{}) + \psdot[style=CenterNode](\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Der Wert \opt{start} setzt ein Objekt an den Anfang, \opt{end} ans Ende der +% Referenzlinie, so dass die entsprechende Grenzfläche auf dem Referenzknoten +% (schwarzer Punkt) liegt, und nicht die Mitte des Objektes (blaues Kreuz), wie +% es mit \opt{position=1} bzw. \opt{position=0} der Fall wäre. Unter Verwendung +% von Zahlen wäre dieses Verhalten deutlich schwieriger und weniger flexibel zu +% erreichen, da die Größe und Form des Objektes berücksichtigt werden muss. +% \fi +% \ifENGLISH +% The values \opt{start} and \opt{end} place an object at the start or end of +% the reference line, respectively. The respective object interface is placed on +% the respective reference node (black dot) instead of the object center (blue +% cross) which would be the case for \opt{position=0} or +% \opt{position=1}. Achieving this with numerical values would me more difficult +% and unflexible, because the object size and shape must be taken into account. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{position}}, linerange={1-4,8-8}] +\begin{pspicture}(3,2) + \pnodes(0.5,1){A}(2.5,1){B}\psdot(A)\psdot(B) + \optbox[optboxsize=0.5 0.5, position=start](A)(B) + \lens[position=end](A)(B) + \psline[style=Refline](A)(B) + \psdot[style=CenterNode](\oenodeCenter{1}) + \psdot[style=CenterNode](\oenodeCenter{2}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Hier ist im Vergleich dazu die Positionierung mit +% \opt{position=0}/\opt{1}. +% \fi +% \ifENGLISH Here is for comparison the positioning with +% \opt{position=0}/\opt{1}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{position}}, linerange={1-4,8-8}] +\begin{pspicture}(3,2) + \pnodes(0.5,1){A}(2.5,1){B}\psdot(A)\psdot(B) + \optbox[optboxsize=0.5 0.5, position=0](A)(B) + \lens[position=1](A)(B) + \psline[style=Refline](A)(B) + \psdot[style=CenterNode](\oenodeCenter{1}) + \psdot[style=CenterNode](\oenodeCenter{2}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem{abspos}{\prm{num},start,end} +% \ifGERMAN +% Eine Zahl setzt die absolute Position eines Objektes auf der +% Referenzlinie. Die Werte \opt{start} und \opt{end} werden identisch wie bei +% \Lkeyword{position} behandelt. +% \fi +% \ifENGLISH +% Controls the absolute position of an object on the reference line. The values +% \opt{start} and \opt{end} are handled identically to \Lkeyword{position}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{abspos}}, linerange={1-2,5-5}] +\begin{pspicture}(3,1.5) + \lens[beam, abspos=1](0,1)(3,1){L} + \psdot(\oenodeRefA{})\psdot(\oenodeRefB{}) + \psdot[style=CenterNode](\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem{endbox} +% \ifGERMAN Dieser Parameter sollte nicht mehr verwendet werden, er ist +% äquivalent zu \Lkeyword{position}\opt{=end}. +% \fi +% \ifENGLISH This parameter should not be used any more, it is +% equivalent to \Lkeyword{position}\opt{=end}. +% \fi +% \end{optionlist} +% +% +% +% \ifGERMAN\section{Drehen und Verschieben}\fi +% \ifENGLISH\section{Rotating and shifting}\fi +% \label{sec:rotshift} +% +% \ifGERMAN +% Alle Komponenten können versetzt und um verschiedene Bezugspunkte +% gedreht werden. +% +% Beachten Sie, dass mit den Komponenten auch die Grenzflächenknoten +% (\prettyref{sec:ifcnode}, in den folgenden Beispielen mit blauen Kreuzen +% markiert) transformiert werden, wodurch Verbindungen beinflußt werden. Die +% transformierten Referenzknoten sind als eigene Knoten verfügbar +% (\prettyref{sec:refnode}). +% \fi +% \ifENGLISH +% All components can be shifted and rotated around different reference nodes. +% +% Please note, that together with the components also their interface nodes +% (\prettyref{sec:ifcnode}, marked as blue crosses in the following examples) +% are transformed, which may impact the connections. The transformed reference +% nodes are accessible as new nodes (\prettyref{sec:refnode}). +% \fi +% +% \begin{optionlist} +% \psnumitem[0]{angle} +% \ifGERMAN Dreht eine Komponente um den Winkel \prm{num} (in Grad). Die +% Ausgangsposition ist grau gestrichelt eingezeichnet. +% \fi +% \ifENGLISH Rotate a component by an angle \prm{num} (in degree). The original +% position is drawn gray dashed. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,4-4,10-10}, morekeywords={[21]{angle}}] +\begin{pspicture}(3,2) + \pnodes(0,1){A}(2.7,1){B} + \optbox[addtoOptComp={style=Refline, linestyle=dashed}](A)(B) + \optbox[angle=20, innerlabel](A)(B){box} + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psdot[style=CenterNode](\oenodeOut{}) +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \valitem[c]{rotateref}{refpoint} +% \ifGERMAN +% Setzt den Bezugspunkt für die Drehung der Komponente. Bitte lesen Sie +% \prettyref{sec:rotrefnode} für eine genauere Beschreibung und entnehmen Sie +% \prettyref{sec:overview-extnode} die möglichen Bezugspunkte für alle +% Komponenten. Die Ausgangsposition ist grau gestrichelt eingezeichnet. +% \fi +% \ifENGLISH +% Set the reference point for the rotation of the component. Please see +% \prettyref{sec:rotrefnode} for a detailed explanation and +% \prettyref{sec:overview-extnode} for a list of the possible reference nodes of +% all components. The original position is drawn gray dashed. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,4-4,10-10}, morekeywords={[21]{angle,rotateref}}] +\begin{pspicture}(3,2) + \pnodes(0,1){A}(2.7,1){B} + \optbox[addtoOptComp={style=Refline, linestyle=dashed}](A)(B) + \optbox[angle=20, rotateref=bl, innerlabel](A)(B){box} + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psdot[style=CenterNode](\oenodeOut{}) +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \numitem[0]{compshift} +% \ifGERMAN Verschiebt eine Komponente vertikal bezüglich ihrer Referenzlinie +% (siehe \prettyref{sec:refnode}). Reflektive Komponenten werden entlang der +% reflektiven Grenzfläche verschoben. +% \fi +% \ifENGLISH +% Shift a component perpendicular to its reference line (see +% \prettyref{sec:refnode}). For reflective components it is shifted along the +% reflective interface. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,10-10}, morekeywords={[21]{compshift}}] +\begin{pspicture}(4,2) + \pnodes(0.4, 0.5){A}(3.6,0.5){B} + \lens[lens=2 2 2, compshift=0.5](A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psdot[style=CenterNode](\oenodeOut{}) + \psline[linecolor=DOrange, arrows=|->, arrowscale=1.5, arrowinset=0](\oenodeCenter{}|A)(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[linerange={1-3,9-9}, morekeywords={[21]{compshift}}] +\begin{pspicture}(4,2) + \pnodes(0.4,1.2){A}(3,0.2){B} + \mirror[compshift=0.5](A)(B|A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}|\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[0](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psline[linecolor=DOrange, arrows=|->, arrowscale=1.5, arrowinset=0](B|A)(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0]{compoffset} +% \ifGERMAN Verschiebt eine Komponente vertikal bezüglich ihrer +% Referenzlinie (siehe \prettyref{sec:refnode}). Reflektierende +% Komponenten werden entlang der reflektiven Grenzfläche verschoben. Die +% Verschiebung erfolgt also senkrecht zu einer Verschiebung mit +% \Lkeyword{compshift}. Ein Anwendungsbeispiel ist +% \prettyref{ex:autocorrelation}. +% \fi +% \ifENGLISH +% Shift a component perpendicular to its reference line (see +% \prettyref{sec:refnode}). For reflective components it is shifted +% along the reflective interface. The displacement is vertical to a +% displacement with \Lkeyword{compshift}. For an example see +% \prettyref{ex:autocorrelation}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,10-10}, morekeywords={[21]{compoffset}}] +\begin{pspicture}(4,2) + \pnodes(0.4, 1){A}(3.6, 1){B} + \lens[lens=2 2 2, compoffset=0.5](A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psdot[style=CenterNode](\oenodeOut{}) + \psline[linecolor=DOrange, arrows=|->, arrowscale=1.5, arrowinset=0]([Xnodesep=-0.5]\oenodeCenter{})(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[linerange={1-3,9-9}, morekeywords={[21]{compoffset}}] +\begin{pspicture}(4,2) + \pnodes(0.4,1.2){A}(3,0.2){B} + \mirror[compoffset=0.5](A)(B|A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}|\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[0](\oenodeRefB{}){RefB} + \psdot[style=CenterNode](\oenodeIn{}) + \psline[linecolor=DOrange, arrows=|->, arrowscale=1.5, arrowinset=0](B|A)(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \choitem{innercompalign}{rel, relative, abs, absolute} +% \ifGERMAN Ist dieser Parameter auf \opt{absolute} gesetzt, so wird das +% «Innere» einer Komponente nicht mitgedreht. Diese Option wird derzeit +% von \Lcomp{optfilter}, \Lcomp{elecsynthesizer} und \Lcomp{optdipole} verwendet. +% \fi +% \ifENGLISH If this parameter is set to \opt{absolute}, the «inner» +% component part is not rotated with the component. At the moment, this +% option is used by \Lcomp{optfilter}, \Lcomp{elecsynthesizer}, and \Lcomp{optdipole}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) +\psset[optexp]{labelangle=-90} +\elecsynthesizer[innercompalign=rel](0.5,1.2)(0.5,2){rel} +\elecsynthesizer[innercompalign=abs](2.5,1.2)(2.5,2){abs} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% +% \ifGERMAN\section{Verwendung von Stilen}\fi +% \ifENGLISH\section{Using psstyles}\fi\label{sec:styles} +% +% \ifGERMAN +% Stile sind benutzerdefinierte Grafik-Konfigurationen für +% PSTricks-Objekte. Das \LPack{pst-optexp}-Paket macht umfangreichen +% Gebrauch von Stilen um einzelne, logische Bereiche von Komponenten +% flexibel gestalten zu können, was über das optionale Argument meistens +% nicht möglich ist. +% +% Vorhandene Stile können mit \Lcs*{addtopsstyle} erweitert und mit +% \Lcs*{newpsstyle} überschrieben werden. +% +% Als Beispiel nehmen wir einen \opt{extended} Spiegel und möchten nur +% den «extended»-Teil verändern. Hierfür wird der Stil +% \Lstyle{ExtendedMirror} bereitgestellt: +% \fi +% \ifENGLISH +% Psstyles are custom graphics parameter configurations for PSTricks +% objects. The \LPack{pst-optexp} package makes extensive use of styles +% to facilitate flexible design of single, logical parts of +% components. This is in general not possible with the optional +% argument. +% +% Existing styles can be extended with \Lcs*{addtopsstyle} and +% overwritten with \Lcs*{newpsstyle}. +% +% As example we consider an \opt{extended} mirror and want to change +% only the «extended» part which is controlable with the +% \Lstyle{ExtendedMirror} style: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \addtopsstyle{ExtendedMirror}{hatchcolor=red} + \mirror[mirrortype=extended, beam](0,0)(2,1.5)(0,2) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \ifGERMAN +% Die veränderbaren Unterbereiche einer Komponente sind in der +% jeweiligen Referenz zu finden. +% \fi +% \ifENGLISH +% The changeable parts of each component are listed in the respective +% reference. +% \fi +% +% +% +% \ifGERMAN\section{Aussehen der Komponenten}\fi +% \ifENGLISH\section{Component appearance}\fi +% \label{sec:appearance} +% +% \begin{stylelist} +% \styleitem{OptComp} +% \ifGERMAN +% Bestimmt das grundlegende Aussehen aller optischen Komponenten. Die +% üblichen Parameter, wie z.B. \opt{linestyle}, würden auch die +% Verbindungen beeinflussen, die mit der Komponente zusammen gezeichnet +% werden (\Lkeyword{beam}, \Lkeyword{fiber} usw.). Mit +% \Lkeyword{newOptComp} und \Lkeyword{addtoOptComp} kann der Stil für +% einzelne Komponenten oder zusammen mit \Lcs*{newpsobject} im optionalen +% Argument verwendet werden. +% \fi +% \ifENGLISH +% Affects the basic appearence of all optical components. Using standard +% graphics parameters like e.g.\ \opt{linestyle} would change also the +% connections that are drawn together with the component +% (\Lkeyword{beam}, \Lkeyword{fiber} etc.). Use the key +% \Lkeyword{newOptComp} and \Lkeyword{addtoOptComp} to change the style +% for single components or for use with \Lcs*{newpsobject} via the +% optional argument. +% \fi +% \iffalse +%<*ignore> +% \fi +\ifGERMAN +\begin{LTXexample}[morekeywords={[21]{addtoOptComp}}] +\begin{pspicture}(2.5,4) + \psset{beam} + % falsch, die Strahlbreite wird auch geaendert + \mirror[linewidth=3\pslinewidth](0,3)(2,3)(2,2) + % korrektes Ergebnis + \addtopsstyle{OptComp}{linewidth=3\pslinewidth} + \mirror(0,1)(2,1)(2,0) +\end{pspicture} +\end{LTXexample} +\fi\ifENGLISH +\begin{LTXexample}[morekeywords={[21]{addtoOptComp}}] +\begin{pspicture}(2.5,4) + \psset{beam} + % wrong, also beam width is changed + \mirror[linewidth=3\pslinewidth](0,3)(2,3)(2,2) + % correct result + \addtopsstyle{OptComp}{linewidth=3\pslinewidth} + \mirror(0,1)(2,1)(2,0) +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% \styleitem[linestyle=dashed,dash=1.5pt 1pt]{OptionalStyle} +% \ifGERMAN +% Der Stil wird zusätzlich zu \Lstyle{OptComp} auf Komponenten angewendet, +% die als \Lkeyword{optional} markiert sind. +% \fi +% \ifENGLISH +% This style is applied to components marked as \Lkeyword{optional} in addition +% to \Lstyle{OptComp}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{optional}}] +\begin{pspicture}(3,1.5) +\lens[optional, beam](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% \Lstyle{OptionalStyle} wird nach \Lstyle{OptComp} angewendet, so dass +% einzelne Einstellungen überschrieben werden können. +% \fi +% \ifENGLISH +% \Lstyle{OptionalStyle} is applied after \Lstyle{OptComp} so that it +% can overwrite the general settings. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\ifGERMAN +\begin{LTXexample}[morekeywords={[21]{OptComp, OptionalStyle, optional}}] +\begin{pspicture}(3,1.5) +\addtopsstyle{OptComp}{linewidth=3\pslinewidth, linecolor=red} +\newpsstyle{OptionalStyle}{linecolor=blue} +\lens(0,1)(2,1) +% Liniefarbe wird ueberschrieben, die Linienbreite nicht. +\lens[optional](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +\fi\ifENGLISH +\begin{LTXexample}[morekeywords={[21]{OptComp, OptionalStyle, optional}}] +\begin{pspicture}(3,1.5) +\addtopsstyle{OptComp}{linewidth=3\pslinewidth, linecolor=red} +\newpsstyle{OptionalStyle}{linecolor=blue} +\lens(0,1)(2,1) +% linecolor overwritten, linewidth kept +\lens[optional](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% \styleitem[linewidth=0.8\cs{pslinewidth}, arrowinset=0, arrowscale=0.8, arrows=<->]{VariableStyle} +% \ifGERMAN Der Stil der Pfeile für verstellbare Komponenten (\Lcomp{mirror} und +% \Lcomp{optgrating}). +% \fi +% \ifENGLISH The style of the arrows of variable components (\Lcomp{mirror} and +% \Lcomp{optgrating}). +% \fi +% \end{stylelist} +% +% \begin{optionlist} +% \valitem{addtoOptComp}{list} +% \addtostylemsg{OptComp} +% +% \valitem{newOptComp}{list} +% \newstylemsg{OptComp} +% +% \iffalse +%<*ignore> +% \fi +\ifGERMAN +\begin{LTXexample}[morekeywords={[21]{addtoOptComp,newOptComp}}] +\begin{pspicture}(3,1.5) + \psset{beam} + \newpsstyle{OptComp}{linewidth=3\pslinewidth} + \mirror[addtoOptComp={linestyle=dotted}](0.5,0)(0.5,1)(1.5,1) + % Ueberschreibt linewidth-Einstellungen + \mirror[newOptComp={linestyle=dotted}](1.5,1)(2.5,1)(2.5,0) +\end{pspicture} +\end{LTXexample} +\fi +\ifENGLISH +\begin{LTXexample}[morekeywords={[21]{addtoOptComp,newOptComp}}] +\begin{pspicture}(3,1.5) + \psset{beam} + \newpsstyle{OptComp}{linewidth=3\pslinewidth} + \mirror[addtoOptComp={linestyle=dotted}](0.5,0)(0.5,1)(1.5,1) + % overwrites the linewidth settings + \mirror[newOptComp={linestyle=dotted}](1.5,1)(2.5,1)(2.5,0) +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{optional} +% \ifGERMAN +% Markiert eine Komponente als optional indem der Stil +% \Lstyle{OptionalStyle} angewendet wird. +% \fi +% \ifENGLISH +% Mark an object as optional by applying the \Lstyle{OptionalStyle} style. +% \fi +% \end{optionlist} +% +% \ifGERMAN\chapter{Freistrahlkomponenten}\fi +% \ifENGLISH\chapter{Free-ray components}\fi +% \label{chap:freeraycomp} +% +% \ifGERMAN In diesem Kapitel werden alle Freistrahlkomponenten und deren +% Parameter beschrieben. Freistrahlkomponenten können, im Gegensatz zu +% Faserkomponenten, transmittive und reflektive Grenzflächen haben, die für +% Raytracing von Lichtstrahlen verwendet werden können. Es gibt zwei +% unterschiedliche Komponententypen: manche benötigen nur zwei Knoten um +% positioniert zu werden (\compref{lens}--\compref{polarization}), wohingegen +% z.B. Spiegel drei Knoten benötigen um korrekt ausgerichtet zu werden +% (\compref{mirror}--\compref{pentaprism}). +% \fi +% \ifENGLISH This chapter describes all free-ray components and their +% options. Free-ray components differ from fiber components in that they provide +% transmittive or reflective interfaces which can be used to raytrace +% beams. They are divided in two types: some components like lenses need only +% two nodes for positioning (\compref{lens}--\compref{polarization}), whereas +% e.g. mirrors require three nodes to determine the orientation +% (\compref{mirror}--\compref{pentaprism}). +% \fi +% +% \ifGERMAN\section{Linse}\fi +% \ifENGLISH\section{Lens}\fi +% \label{sec:lens} +% +% \begin{ltxsyntax} +% \dipoledesc{lens} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \lens[beam](0,1)(3,1){L} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH A lens is defined by its height and the radii of the input and +% output interfaces. +% \fi +% \ifGERMAN Eine Linse wird durch ihre Höhe und die beiden Radien der Eingangs- +% und Ausgangsflächen definiert. +% \fi +% +% \begin{optionlist} +% \numitem[1]{lensheight} +% \ifGERMAN Setzt die Höhe der Linse.\fi +% \ifENGLISH Set the height of the lens.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{lensheight}}] +\begin{pspicture}(3,1.5) + \lens[beam](0,1)(3,1){L1} + \lens[lensheight=0.5](2,1)(3,1){L2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \numitem[1]{lensradiusleft} +% \ifGERMAN +% Setzt den Radius der linken Linsengrenzfläche. Ein positiver Wert \prm{num} +% ist für eine konvexe, ein negativer für eine konkave Krümmung. Null ergibt +% eine ebene Fläche. +% \fi +% \ifENGLISH +% Set the left radius of the lens. A positive \prm{num} is for convex, a +% negative one for concave curvatures. Use zero for a plain surface. +% \fi +% +% \numitem[1]{lensradiusright} +% \ifGERMAN +% Das Gleiche wie \Lkeyword{lensradiusleft}, nur für die rechte Grenzfläche. +% \fi +% \ifENGLISH +% Same as \Lkeyword{lensradiusleft} but for the right surface. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{lensradiusleft, lensradiusright}}] +\begin{pspicture}(3,1.5) + \psset{lensradiusright=0, beam} + \lens[lensradiusleft=1](0,1)(1.5,1){$R > 0$} + \lens[lensradiusleft=-1](1.5,1)(3,1){$R < 0$} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \optitem{lensradius}{\prm{left}[ \prm{right}]} +% \ifGERMAN +% Setzt die linke und rechte Linsenkrümmung. Wird nur ein Wert angegeben, so +% wird dieser für beide Krümmungen verwendet. +% \fi +% \ifENGLISH +% Set the left and right lens curvatures. If only a single value is given, it is +% used for both curvatures. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{lensradius}}] +\begin{pspicture}(3,1.5) + \lens[lensradius=-2, beam](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0]{lenswidth} +% \ifGERMAN +% Üblicherweise werden nur die Höhe und die beiden Radien für die +% Konstruktion der Linse verwendet, die Mittenbreite wird automatisch +% berechnet. Wenn \Lkeyword{lenswidth} auf einen Wert größer Null gesetzt wird, +% wird diese Breite verwendet. Das ist nur sinnvoll, wenn dicke Linsen +% gezeichnet werden sollen, da es andernfalls für zu kleine Werte zu unschönen +% Ergebnissen führt. +% \fi +% \ifENGLISH +% Usually only the height and the two radii are used to construct the lens, +% the width is calculated automatically. For \Lkeyword{lenswidth} greater +% than zero, this width is used instead. This is only useful if you want to draw +% thick lenses and it can give ugly results if the value is choosen too +% small. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{lenswidth}}] +\begin{pspicture}(3,2) + \lens[lenswidth=0.5, beam](0,1)(2,1){thick lens} + \lens[lenswidth=0.1, beam](2,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \optitem{lens}{\prm{radiusleft}[ \prm{radiusright}[ \prm{height}[ \prm{width}]]]} +% \ifGERMAN +% Eine Option zum gleichzeitigen Setzen mehrerer Linsenparameter. Werte +% mittendrin können mit einem Punkt übersprungen und Werte am Ende können +% weggelassen werden (z.B. \opt{lens=. 1 1}). +% \fi +% \ifENGLISH +% A convenience option to specify all lens parameters with a single +% option. Intermediate values can be skipped with a dot, values at the end can +% be omitted (e.g. \opt{lens=.\ 1 1}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \lens[lens=1](0,1)(1,1){L1} + \lens[lensradius=-2 1, beam](0,1)(3,1){L2} + \lens[lens=2 -0.7 1.2](2,1)(3,1){L3} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{thicklens} +% \ifENGLISH +% This option was necessary until version 2.1 in order to draw a thick lens of +% width \Lkeyword{lenswidth} instead of using the calculated lens width. This +% option is superfluous since version 3.0 because setting \Lkeyword{lenswidth} +% to a positive value automatically draws a thick lens. +% \fi +% \ifGERMAN +% Diese Option was bis Version 2.1 notwendig um dicke Linsen der Breite +% \Lkeyword{lenswidth} zu zeichnen, anstatt die berechnete Breite zu +% verwenden. Seit Version 3.0 ist diese Option überflüssig, da dicke Linsen +% gezeichnet werden, sobald \Lkeyword{lenswidth} auf einen positiven Wert +% gesetzt wird. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Asphärische Linse}\fi +% \ifENGLISH\section{Aspheric lens}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{asphericlens} +% \end{ltxsyntax} +% +% \ifGERMAN Eine asphärische Linse besitzt eine Oberfläche, deren Form durch die Gleichung +% \begin{equation*} +% z(y) = \frac{y^2}{R(1 + \sqrt{1 - (1+k)y^2/R^2})} + A_4y^4 + A_6y^6 + A_8y^8 + A_{10}y^{10} +% \end{equation*} +% gegeben ist. $z$ ist der Sagittalschnitt parallel zur optischen Achse, +% $y$ der Abstand zur optischen Achse und $R$ der +% Krümmungsradius. Desweiteren ist $k$ die konische Konstante und $A_4$, +% $A_6$, $A_8$ und $A_{10}$ die Asphärenkoeffizienten der 4. bis +% 10. Ordnung. +% \fi +% \begin{optionlist} +% \numitem[1]{asphereheight} +% \ifGERMAN Die Höhe der Linse.\fi +% \ifENGLISH The lens height.\fi +% +% \numitem[0]{aspherewidth} +% \ifGERMAN +% Die Breite der Linse. Wird nur verwendet, wenn der angegebene Wert +% über dem minimal berechneten liegt. +% \fi +% \ifENGLISH +% The lens center thickness. Is use only, if the given value is larger +% than the minimum calculated value. +% \fi +% +% \numitem[1]{asphereradiusleft} +% \ifGERMAN Der Krümmungsradius der linken, asphärischen Oberfläche.\fi +% \ifENGLISH Curvature radius of the left, aspheric surface.\fi +% +% \numitem[0]{asphereradiusright} +% \ifGERMAN +% Der Krümmungsradius der rechten Oberfläche. Ist dieser gleich Null, +% dann ist die Oberfläche plan. +% \fi +% \ifENGLISH +% Curvature radius of the right surface. IF the value is zero, the +% surface is plane. +% \fi +% +% \numitem{asphereconstant} +% \ifGERMAN Die konische Konstante $k$ der linken Oberfläche.\fi +% \ifENGLISH The conic constant $k$ of the left surface.\fi +% +% \optitem{aspherecoefficients}{\prm{$A_4$} [\prm{$A_6$} [\prm{$A_8$} [\prm{$A_{10}$}]]]} +% \ifGERMAN +% Die Asphärenkoeffizienten $A_4$ bis $A_{10}$. Es können ein bis vier +% Zahlen angegeben werden. +% \fi +% \ifENGLISH +% The aspheric terms of fourth to tenth order. One to four values can be +% specified. +% \fi +% \end{optionlist} +% +% \ifGERMAN +% Als Beispiel nehmen wir die Parameter einer kommerziell erhältlichen +% asphärische +% Kondensorlinse\fnurl{http://www.thorlabs.de/thorproduct.cfm?partnumber=ACL25416U}: +% \fi +% \ifENGLISH +% As example we use the parameters of a commercially available condensor +% lens\fnurl{http://www.thorlabs.de/thorproduct.cfm?partnumber=ACL25416U}: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,-0.3)(5,2.3) + \pnodes(0,1){A}(5,1){B} + \asphericlens[% + plotstyle=cspline, + asphereheight=2.54, + aspherewidth=1.4, + asphereradiusleft=0.8818197, + aspherecoefficients=8.682e-3 6.376e-3 2.4073e-2 -1.719e-2, + asphereconstant=-0.9992, + asphereradiusright=6.99995](A)(B) + \multido{\r=-1+0.1}{21}{% + \drawbeam[beampos=\r, linewidth=0.3\pslinewidth](A){}(B)} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Ein weiteres Beispiel zeigt anschaulich den Unterschied +% einer asphärischen Linsen zu einer sphärischen Linse mit gleichem +% Krümmungsradius: +% \fi +% \ifENGLISH +% Another example illustrates the difference between an aspheric lens an +% a spheric lens with equal curvature: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t,linerange={2-11}] +\psset{unit=0.5cm} +\begin{pspicture*}(15,8) + \pnodes(0,4){A}(15,4){B} + \asphericlens[asphereheight=7.5, asphereradiusleft=3.12848, + asphereconstant=-1.991145, aspherecoefficients=4.98e-3](A)(B) + \multido{\r=-3.2+0.8}{9}{% + \drawbeam[beampos=\r, linewidth=0.5\pslinewidth](A){}(B)} + \lens[lens=3.12848 0 6 5.49, abspos=6.13, style=Refline, linestyle=dashed](A)(B) + \multido{\r=-2.8+0.8}{8}{% + \drawbeam[beampos=\r, linewidth=0.5\pslinewidth, linecolor=red](A){}(B)}% +\end{pspicture*} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Optisches Plättchen}\fi +% \ifENGLISH\section{Optical plate}\fi +% +% +% \begin{ltxsyntax} +% \dipoledesc{optplate} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optplate[beam](0,1)(3,1){filter} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \numitem[1]{plateheight} +% \ifGERMAN Die Höhe des Plättchens.\fi +% \ifENGLISH The height of the plate.\fi +% +% \optitem[2\nxLcs{pslinewidth}]{platelinewidth}{\prm{num} or \prm{dimen}} +% \ifGERMAN \linewidthexplanation{des Plättchens}{Plättchen}\fi +% \ifENGLISH \linewidthexplanation{plate}{plates}\fi +% \end{optionlist} +% +% \ifGERMAN\section{Verzögerungsplättchen}\fi +% \ifENGLISH\section{Retardation plate}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optretplate} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optretplate[beam](0,1)(3,1){$\nicefrac{\lambda}{2}$} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem*[1]{plateheight} +% \ifGERMAN Die Höhe des Plättchens.\fi +% \ifENGLISH The height of the plate.\fi +% +% \numitem[0.1]{platewidth} +% \ifGERMAN Die Breite des Plättchens.\fi +% \ifENGLISH The width of the plate.\fi +% +% \optitem{platesize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe des Plättchens, äquivalent zum Aufruf von +% \Lkeyword{platewidth} und \Lkeyword{plateheight}. +% \fi +% \ifENGLISH The width and height of the plate, is equivalent to calling both +% \Lkeyword{platewidth} and \Lkeyword{plateheight}. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Lochblende}\fi +% \ifENGLISH\section{Pinhole}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{pinhole} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \pinhole[beam](0,1)(3,1){PH} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1]{outerheight} +% \ifGERMAN Die Gesamthöhe der Lochblende.\fi +% \ifENGLISH The total height of the pinhole.\fi +% +% \numitem[0.1]{innerheight} +% \ifGERMAN Die Höhe des Lochs.\fi +% \ifENGLISH The height of the hole.\fi +% +% \optitem[2\nxLcs{pslinewidth}]{phlinewidth}{\prm{num} or \prm{dimen}} +% \ifGERMAN \linewidthexplanation{der Lochblende}{Lochblenden}\fi +% \ifENGLISH \linewidthexplanation{pinhole}{pinholes}\fi +% +% \numitem[0]{phwidth} +% \ifGERMAN +% Die Lochblende wird plastischer gezeichnet, falls \Lkeyword{phwidth} +% ungleich Null ist. In diesem Fall wird \Lkeyword{phlinewidth} ignoriert. Bei +% einem negativen Wert wird die Form gespiegelt. +% \fi +% \ifENGLISH +% The pinhole is drawn in a more plastic style if \Lkeyword{phwidth} is +% not zero, in this case the \Lkeyword{phlinewidth} is ignored. For negative +% values the shape is mirrored. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{phwidth}}] +\begin{pspicture}(3,1.5) + \pinhole[beam, phwidth=-0.1](0,1)(1.5,1){neg} + \pinhole[beam, phwidth=0.2](1.5,1)(3,1){pos} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% +% \ifGERMAN\section{Box}\fi +% \ifENGLISH\section{Box}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optbox} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \optbox[beam](0,0)(3,2){box} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.4]{optboxwidth} +% \ifGERMAN Die Breite der Box.\fi +% \ifENGLISH The width of the box.\fi +% +% \numitem[0.8]{optboxheight} +% \ifGERMAN Die Höhe der Box.\fi +% \ifENGLISH The height of the box.\fi +% +% \optitem{optboxsize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe der Box, äquivalent zum Aufruf von +% \Lkeyword{optboxwidth} und \Lkeyword{optboxheight}. +% \fi +% \ifENGLISH The width and height of the box, is equivalent to calling both +% \Lkeyword{optboxwidth} and \Lkeyword{optboxheight}. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Pfeilkomponente}\fi +% \ifENGLISH\section{Arrow component}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optarrowcomp} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.7) + \optarrowcomp[wire](0,1)(3,1){box} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \ifENGLISH A general purpose component, similar to \Lcomp{fiberdelayline}, +% but much more flexible. +% \fi +% \ifGERMAN Eine Komponente für den allgemeinen, flexiblen Gebrauch +% ähnlich zu \Lcomp{fiberdelayline}, aber deutlich variabler. +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.4]{arrowcompwidth} +% \ifGERMAN Die Breite der Box.\fi +% \ifENGLISH The width of the box.\fi +% +% \numitem[0.8]{arrowcompheight} +% \ifGERMAN Die Höhe der Komponente.\fi +% \ifENGLISH The height of the Komponente.\fi +% +% \optitem{arrowcompsize}{\prm{size} or \prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe der Komponente, äquivalent zum Aufruf von +% \Lkeyword{arrowcompwidth} und \Lkeyword{arrowcompheight}. +% \fi +% \ifENGLISH The width and height of the component, is equivalent to calling both +% \Lkeyword{arrowcompwidth} and \Lkeyword{arrowcompheight}. +% \fi +% +% \numitem[70]{arrowcompangle} +% \ifGERMAN Der Winkel des Pfeils bezüglich der $x$-Achse.\fi +% \ifENGLISH The angle of the arrow with respect to the $x$-axis.\fi +% +% \choitem[rectangle]{arrowcompshape}{rectangle, circle} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]arrowcompshape}] +\begin{pspicture}(3,1) + \optarrowcomp[arrowcompshape=circle, wire](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% \begin{stylelist} +% \styleitem[arrowinset=0, arrows=->]{ArrowCompStyle} +% \ifGERMAN +% Der Stil für den Pfeil. Das kann insbesonders nützlich sein um die +% Länge und Ausrichtung des Pfeils zu verändern. +% \fi +% \ifENGLISH +% The style of the arrow. This can be especially useful to +% adapt the length and orientation of the arrow. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]ArrowCompStyle}] +\begin{pspicture}(3,1.5) + \addtopsstyle{ArrowCompStyle}{xunit=-1, arrowscale=2} + \optarrowcomp[fiber](0,1)(3,1){delay line} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Balkenkomponente}\fi +% \ifENGLISH\section{Bar component}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optbarcomp} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optbarcomp[fiber](0,1)(3,1){box} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \ifENGLISH A general purpose component, similar to \Lcomp{optfiberpolarizer}, +% but much more flexible. +% \fi +% \ifGERMAN Eine Komponente für den allgemeinen, flexiblen Gebrauch +% ähnlich zu \Lcomp{optfiberpolarizer}, aber deutlich variabler. +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.4]{barcompwidth} +% \ifGERMAN Die Breite der Box.\fi +% \ifENGLISH The width of the box.\fi +% +% \numitem[0.8]{barcompheight} +% \ifGERMAN Die Höhe der Box.\fi +% \ifENGLISH The height of the box.\fi +% +% \optitem{barcompsize}{\prm{size} or \prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe der Box, äquivalent zum Aufruf von +% \Lkeyword{barcompwidth} und \Lkeyword{barcompheight}. +% \fi +% \ifENGLISH The width and height of the box, is equivalent to calling both +% \Lkeyword{barcompwidth} and \Lkeyword{barcompheight}. +% \fi +% +% \numitem[70]{barcompangle} +% \ifGERMAN Der Winkel des Balkens bezüglich der $x$-Achse.\fi +% \ifENGLISH The angle of the bar with respect to the $x$-axis.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]barcompangle}] +\begin{pspicture}(3,1) + \optbarcomp[barcompangle=90, fiber](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[rectangle]{barcompshape}{rectangle, circle} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]barcompshape}] +\begin{pspicture}(3,1) + \optbarcomp[barcompshape=circle, fiber](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% \begin{stylelist} +% \styleitem{BarCompStyle} +% \ifENGLISH The style of the bar.\fi +% \ifGERMAN Der Stil für den Balken.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]BarCompStyle}] +\begin{pspicture}(3,1) + \newpsstyle{BarCompStyle}{unit=0.7, arrows=->} + \optbarcomp[barcompshape=circle, barcompangle=45, fiber](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Optische Quelle}\fi +% \ifENGLISH\section{Optical source}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optsource} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \optsource(1.5,1)(3,1){Laser} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH +% An optical source predefines some properties of any outgoing beam, if +% it is the first component in a beam path. The definable beam +% properties are \Lkeyword{beamangle}, \Lkeyword{beamwidth}, +% \Lkeyword{beamdiv} and \Lkeyword{beamalign}. The properties defined by +% the optical source cannot be overwritten by the beam properties. If a +% property wasn't explicitely defined for a source, it is taken from the +% beam properties. +% +% The default settings for the component position are +% \Lkeyword{position}\opt{=start}. +% \fi +% \ifGERMAN +% Eine optische Quelle gibt ein paar Eigenschaften für alle von ihr +% ausgehenden Strahlen vor, falls es die erste Komponente in einem +% Strahlengang ist. Die verwendbaren Eigenschaften sind +% \Lkeyword{beamangle}, \Lkeyword{beamwidth}, \Lkeyword{beamdiv} und +% \Lkeyword{beamalign}. Alle Eigenschaften, die von einer optischen +% Quelle definiert werden, können nicht später durch Strahlparameter +% überschrieben werden. Wird ein Parameter nicht explizit von der Quelle +% definiert, so werden die Parameter von dem Strahl-Stil verwendet. +% +% Die Voreinstellung für die Positionierung ist +% \Lkeyword{position}\opt{=start}. +% \fi +% \end{ltxsyntax} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(5,2) + \pnodes(1.5,1){A}(5,1){B} + \optsource[innerlabel, beamdiv=10, beamangle=10](A)(B){Laser} + \lens[lens=2 2 2](A)(B) + \optplane(B) + \drawwidebeam{-} + \drawbeam[linecolor=red]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \numitem[1.4]{sourcewidth} +% \ifGERMAN Die Breite der Box.\fi +% \ifENGLISH The width of the box.\fi +% +% \numitem[0.8]{sourceheight} +% \ifGERMAN Die Höhe der Box.\fi +% \ifENGLISH The height of the box.\fi +% +% \optitem{sourcesize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe der Box, äquivalent zum Aufruf von +% \Lkeyword{sourcewidth} und \Lkeyword{sourceheight}. +% \fi +% \ifENGLISH The width and height of the box, is equivalent to calling both +% \Lkeyword{sourcewidth} and \Lkeyword{sourceheight}. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Kristall}\fi +% \ifENGLISH\section{Crystal}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{crystal} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.3) + \crystal[beam](0,1)(3,1){Crystal} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.4]{crystalwidth} +% \ifGERMAN Die Breite des Kristalls.\fi +% \ifENGLISH The width of the crystal.\fi +% +% \numitem[0.6]{crystalheight} +% \ifGERMAN Die Höhe des Kristalls.\fi +% \ifENGLISH The height of the crystal.\fi +% +% \optitem{crystalsize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe des Kristalls, äquivalent zum Aufruf von +% \Lkeyword{crystalwidth} und \Lkeyword{crystalheight}. +% \fi +% \ifENGLISH The width and height of the crystal, is equivalent to calling both +% \Lkeyword{crystalwidth} and \Lkeyword{crystalheight}. +% \fi +% +% \numitem[0.3]{caxislength} +% \ifGERMAN Die zusätzliche Länge des Pfeils für die $c$-Achse, wird weggelassen +% falls die Länge \opt{0} ist und gespiegelt falls der Wert negativ ist. Die +% Gesamtlänge ist \Lkeyword{caxislength} plus \Lkeyword{crystalheight}. +% \fi +% \ifENGLISH The additional length of the $c$-axis, is dropped when set to +% \opt{0} and is mirrored if the values is negative. The total length is +% \Lkeyword{caxislength} plus \Lkeyword{crystalheight}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{caxislength}}] +\begin{pspicture}(0,0.4)(3,1.5) + \psset{crystalsize=0.5 0.8, label=-45 . l} + \crystal[position=0.2, caxislength=0.5](0,1)(3,1){pos} + \crystal[beam, caxislength=0](0,1)(3,1){0} + \crystal[position=0.8, caxislength=-0.5](0,1)(3,1){neg} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{caxisinv} +% \ifGERMAN +% Invertiert die Richtung der $c$-Achse, ist äquivalent zu einem +% Vorzeichenwechsel von \Lkeyword{caxislength}. +% \fi +% \ifENGLISH +% Invert the direction of the $c$-axis, this is equivalent to changing the sign +% of \Lkeyword{caxislength}. +% \fi +% +% \boolitem[false]{voltage} +% \ifGERMAN Zeichnet einen Spannungsanschluss und ein Erdungszeichen.\fi +% \ifENGLISH Draw a voltage connection and a ground symbol.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{voltage}}] +\begin{pspicture}(0,0.4)(3,1.5) + \crystal[voltage, beam](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{lamp} +% \ifGERMAN Zeichnet eine Lampe neben den Kristall.\fi +% \ifENGLISH Draw a lamp near the crystal.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{lamp}}] +\begin{pspicture}(0,0.4)(3,1.7) + \crystal[lamp, beam](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem{lampscale} +% \ifGERMAN Skalierung der Lampe.\fi +% \ifENGLISH Scaling of the lamp.\fi +% \deprecatedmsg{\ifGERMAN den Stil \fi\ifENGLISH style \fi\Lstyle{CrystalLamp}} +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[linewidth=0.7\cs{pslinewidth}, linestyle=dashed, dash=2pt 2pt, arrowinset=0, arrows=->]{CrystalCaxis} +% \ifGERMAN Der Stil für die $c$-Achse inklusive der Pfeilart.\fi +% \ifENGLISH The style of the $c$-axis including the arrow type.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{CrysalCaxis}}] +\begin{pspicture}(0,0.5)(3,1.6) + \newpsstyle{CrystalCaxis}{linecolor=red, arrows=->>} + \crystal[beam](0,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \styleitem[linewidth=0.6\cs{pslinewidth}]{CrystalLamp} +% \ifGERMAN Der Stil für die Hintergrundlampe.\fi +% \ifENGLISH The style of the crystal background lamp.\fi +% \end{stylelist} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{voltage, lamp}}] +\begin{pspicture}(3,1.7) + \crystal[fillstyle=solid, fillcolor=yellow!90!black, + label=1.2 -45, voltage, + lamp, beam](0,1)(3,1){SBN:Ce} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Optische Diode}\fi +% \ifENGLISH\section{Optical diode}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optdiode} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{optdiode}}] +\begin{pspicture}(3,2) + \optdiode[beam](0,1)(3,1){Diode} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH The optical diode has a default setting of +% \Lkeyword{allowbeaminside}\opt{=false}. +% \fi +% \ifGERMAN Die optische Diode hat die Voreinstellung +% \Lkeyword{allowbeaminside}\opt{=false}. +% \fi +% +% \begin{optionlist} +% \numitem[0.8]{optdiodesize} +% \ifGERMAN +% Die Seitenlänge der optischen Diode. +% \fi +% \ifENGLISH +% The side length of the optical diode. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Doveprisma}\fi +% \ifENGLISH\section{Dove prism}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{doveprism} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{doveprism}}] +\begin{pspicture}(3,1.5) + \doveprism[beam](0,1)(3,1){Dove} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.6]{doveprismsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Wenn eine Zahl angegeben ist, dann ist das die Höhe des Prismas, die +% Gesamtbreite beträgt das dreifache. Zwei Zahlen geben Breite und Höhe des +% Doveprisma an. Die Winkel an der Eingangs- und Ausgangsfläche betragen immer +% 45\textdegree. +% \fi +% \ifENGLISH +% A single number defines the height of the prism, the total width is set to +% three times the height. Two number define the width and height of the dove +% prism. The angles at the input and output faces are always 45\textdegree. +% \fi +% \end{optionlist} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{doveprism}}] +\begin{pspicture}(4,1.5) + \optplane(0,1) + \doveprism[doveprismsize=1.2](0,1)(4,1) + \optplane(4,1) + \drawbeam[raytrace=false, linecolor=black]{-} + \drawbeam[n=1.5, linecolor=red]{-} + \drawbeam[n=*sqrt(5), linecolor=green, linestyle=dashed]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Glan-Thompson-Prisma}\fi +% \ifENGLISH\section{Glan--Thompson prism}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{glanthompson} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{glanthompson}}] +\begin{pspicture}(3,1.5) + \glanthompson[beam](0,1)(3,1){Glan-Thompson} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.0]{glanthompsonwidth} +% \ifGERMAN Die Breite des Prisma.\fi +% \ifENGLISH The width of the prism.\fi +% +% \numitem[0.5]{glanthompsonheight} +% \ifGERMAN Die Höhe des Prisma.\fi +% \ifENGLISH The height of the prism.\fi +% +% \optitem{glanthompsonsize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe des Prisma, äquivalent zum Aufruf von +% \Lkeyword{glanthompsonwidth} und \Lkeyword{glanthompsonheight}. +% \fi +% \ifENGLISH The width and height of the prism, is equivalent to calling both +% \Lkeyword{glanthompsonwidth} and \Lkeyword{glanthompsonheight}. +% \fi +% +% \numitem[0]{glanthompsongap} +% \ifGERMAN +% Der Abstand der beiden Teilprismen in $x$-Richtung, die Linienbreiten +% werden nicht berücksichtigt. Die Gesamtbreite ist von diesem Wert +% unabhängig, aber der Winkel der reflektierenden Fläche wird davon beeinflusst. +% \fi +% \ifENGLISH The separation of the two prisms in $x$-direction. The +% total width does not depend on this value, but the angle of the +% reflective plane is affected. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1) + \glanthompson[glanthompsongap=0.1, beam](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN Von der Implementierung entspricht das Glan-Thompson-Prisma +% für \Lkeyword{glanthompsongap}\opt{=0} einem Strahlteiler, der nur +% zwei Knoten zur Positionierung benötigt und nicht quadratisch ist. +% +% Beachten Sie, dass das Prisma für \Lkeyword{glanthompsongap}\opt{>\,0} +% nicht von beiden Seiten gleich verwendet werden kann, da in der +% derzeitigen Implementierung nur eine uneindeutige Grenzfläche +% (reflektierend oder transmittierend) zugelassen ist. In dem folgenden +% Beispiel sieht man, dass der rote Strahl an der falsche Fläche +% reflektiert wird. +% \fi +% \ifENGLISH +% The implementation of the Glan--Thompson prism for +% \Lkeyword{glanthompsongap}\opt{=0} is equivalent to a beamsplitter +% which is positioned with two nodes only and which is not quadratic. +% +% Please note, that the Prism cannot be used properly from both sides +% for \Lkeyword{glanthompsongap}\opt{>\,0} because the current +% implementation allows only a single ambiguous interface (reflective or +% transmittive). In the following example you see, that the red beam is +% reflected at the wrong interface. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(4,2) + \pnodes(0,1){A}(4,1){B} + \glanthompson[glanthompsongap=0.2, glanthompsonsize=2 1](A)(B) + \optplane[angle=90](2,0)\optplane[angle=90](2,2) + \addtopsstyle{Beam}{ArrowInside=->, arrowscale=1.5} + \drawbeam[beampos=0.1](A){1-2} + \drawbeam[beampos=0.1, linecolor=red](B){1}{3} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN \prettyref{ex:glan-thompson} enthält ein weiterführendes +% Beispiel mit einem Glan-Thompson-Prisma.\fi +% \ifENGLISH \prettyref{ex:glan-thompson} shows a further setup with a +% Glan--Thompson prism.\fi +% +% \ifGERMAN\section{Polarisation}\fi +% \ifENGLISH\section{Polarization}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{polarization} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{polarization}}] +\begin{pspicture}(3,1) + \polarization[beam](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \numitem[0.6]{polsize} +% \ifGERMAN Die Größe des Polarisationszeichens, der Kreis für \opt{perp} und +% \opt{polmisc} ist halb so groß. +% \fi +% \ifENGLISH The size of the polarization symbol, the circle for \opt{perp} and +% \opt{polmisc} is half of this. +% \fi +% +% \optitem[0.7\nxLcs{pslinewidth}]{pollinewidth}{\prm{num} or \prm{dimen}} +% \ifGERMAN \linewidthexplanation{des Polarisationszeichens}{Polarisationszeichen}\fi +% \ifENGLISH \linewidthexplanation{polarisation sign}{polarisation signs}\fi +% \deprecatedmsg{\ifGERMAN den Stil \fi\ifENGLISH style \fi\Lstyle{Polarization}} +% +% \choitem[parallel]{poltype}{parallel, perp, misc, lcirc, rcirc} +% \ifGERMAN Dieser Parameter wählt die Polarizationsart aus.\fi +% \ifENGLISH This parameter choses the polarization type.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{poltype}}] +\begin{pspicture}(0,-0.3)(3,4.3) + \psset[optexp]{beam} + \begin{optexp} + \polarization[poltype=parallel, abspos=0.5](0,4)(3,4) + \polarization[poltype=perp, abspos=1](0,3)(3,3) + \polarization[poltype=misc, abspos=1.5](0,2)(3,2) + \polarization[poltype=lcirc, abspos=2](0,1)(3,1) + \polarization[poltype=rcirc, abspos=2.5](0,0)(3,0) + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[arrowscale=0.8, linewidth=0.7\cs{pslinewidth}, dotsize=3\cs{pslinewidth}]{Polarization} +% \ifGERMAN Bestimmt das Aussehen der Polarisationssymbole.\fi +% \ifENGLISH Affects the style of the polarisation symbols.\fi +% \end{stylelist} +% +% \ifGERMAN\section{Keil}\fi +% \ifENGLISH\section{Wedge}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optwedge} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \optwedge[beam](0,1)(3,1){Wedge} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.8]{wedgeheight} +% \ifGERMAN Höhe des Keils.\fi +% \ifENGLISH The height of the wedge.\fi +% +% \numitem[10]{wedgeangleright} +% \ifGERMAN Der obere Winkel der rechten Grenzfläche bezogen auf die Vertikale.\fi +% \ifENGLISH The upper angle of the right interface with respect to a vertical line.\fi +% +% \numitem[0]{wedgeangleleft} +% \ifGERMAN Der obere Winkel der linken Grenzfläche bezogen auf die Vertikale.\fi +% \ifENGLISH The upper angle of the left interface with respect to a vertical line.\fi +% +% \optitem{wedgeangles}{\prm{left}[ \prm{right}]} +% \ifGERMAN +% Erlaubt beide Winkel gleichzeitig zu setzen. Wird nur ein Wert +% angegeben, dann wird dieser für beide Winkel verwendet. +% \fi +% \ifENGLISH +% Allows setting both angles at once. If only a single value is given, +% it is used for both angles. +% \fi +% \numitem[0]{wedgewidth} +% \ifGERMAN Ist der Wert größer als die berechnete Grundbreite, dann wird der Keil auf die angegebene Breite vergrößert.\fi +% \ifENGLISH If this value is larger than the calculated base width, then the wedge's width is increase to this value.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(2,1) + \optwedge[wedgeangles=10 0, wedgewidth=0.4](0,0.5)(2,0.5) + \drawwidebeam[beamwidth=0.5](0,0.5){}(2,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \end{optionlist} +% +% \ifGERMAN\section{Axikon}\fi +% \ifENGLISH\section{Axicon}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{axicon} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \axicon[label=1](0,1)(3,1){Axicon} + \drawwidebeam[beamwidth=0.5](0,1){}(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1.5]{axiconheight} +% \ifGERMAN Die Höhe des Axikons.\fi +% \ifENGLISH The height of the axicon.\fi +% +% \numitem[0.4]{axiconwidth} +% \ifGERMAN Die Breite des Axikons.\fi +% \ifENGLISH The width of the axicon.\fi +% +% \numitem[10]{axiconangle} +% \ifGERMAN Der obere Winkel der rechten Grenzfläche bezogen auf die Vertikale.\fi +% \ifENGLISH The upper angle of the right interface with respect to a vertical line.\fi +% +% \end{optionlist} +% +% \ifGERMAN\section{Spiegel}\fi +% \ifENGLISH\section{Mirror}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{mirror} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \mirror[beam](0,0)(1.8,1.5)(0,2){M} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1]{mirrorwidth} +% \ifGERMAN Die Breite des Spiegels.\fi +% \ifENGLISH The width of the mirror.\fi +% +% \optitem[2\nxLcs{pslinewidth}]{mirrorlinewidth}{\prm{num} or \prm{dimen}} +% \ifGERMAN \linewidthexplanation{des Spiegels}{Spiegel}\fi +% \ifENGLISH \linewidthexplanation{mirror}{mirrors}\fi +% +% \optitem[0]{mirrorradius}{\prm{radius}[ 0]} +% \ifGERMAN +% Diese Parameter setzt die Krümmung des Spiegels. Null ergibt einen +% ebenen, ein negativer Radius einen konvexen und ein positiver Radius +% einen konkaven Spiegel. +% \fi +% \ifENGLISH +% This parameter defines the curvature of the mirror. A value of \opt{0} +% is for a plain mirror, a negative radius for a convex mirror and a +% positive radius gives you a concave mirror. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrorradius}}] +\begin{pspicture}(3,3) + \psset[optexp]{labeloffset=0.5} + \mirror[mirrorradius=1](0,0)(1,2)(1.8,1){convex} + \mirror[mirrorradius=-1](1,2)(1.8,1)(2.5,3){concave} + \drawbeam(0,0){-}(2.5,3) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Wird kein zweiter Wert angegeben, so ist die Krümmung der +% zweiten Fläche eines \opt{extended} oder \opt{semitrans} Spiegels die +% Gleiche wie bei der Hauptgrenzfläche (siehe vorheriges Beispiel). Wird +% die Null als zweiter Wert angegeben (andere Werte werden nicht +% unterstützt), so ist die zweite Fläche flach: +% \fi +% \ifENGLISH If no second value is specified, the curvature of the +% second interface of an \opt{extended} or \opt{semitrans} mirror is the +% same as that of the main interface (see previous example). If zero is +% given as second value (other values are not supported), the second +% interface is plain. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrorradius}}] +\begin{pspicture}(3,3) + \mirror[mirrorradius=1 0, mirrortype=semitrans](0,0)(1,2)(1.8,1){convex} + \mirror[mirrorradius=-1 0, mirrortype=extended](1,2)(1.8,1)(2.5,3){concave} + \drawbeam(0,0){-}(2.5,3) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Die Angabe von \Lkeyword{mirrordepth} bezieht sich immer auf +% die Mindesttiefe des Spiegels. +% \fi +% \ifENGLISH The value of \Lkeyword{mirrordepth} always refers to the +% minimum depth of the mirror. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrorradius, mirrordepth}}] +\begin{pspicture}(3,3) + \psset[optexp]{mirrordepth=0.2} + \mirror[mirrorradius=1 0, mirrortype=semitrans](0,0)(1,2)(1.8,1){convex} + \mirror[mirrorradius=-1 0, mirrortype=extended](1,2)(1.8,1)(2.5,3){concave} + \drawbeam(0,0){-}(2.5,3) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[plain]{mirrortype}{plain, piezo, extended, semitrans} +% \ifGERMAN +% Diese Parameter wählt die Spiegelart aus. Das Aussehen wird mit +% \Lstyle{PiezoMirror}, \Lstyle{ExtendedMirror} und \Lstyle{SemitransMirror} +% gesteuert. +% \fi +% \ifENGLISH +% The \nxLkeyword{mirrortype} selects between different types of mirrors. The +% style is controlled with \Lstyle{PiezoMirror}, \Lstyle{ExtendedMirror}, and +% \Lstyle{SemitransMirror}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype}}] +\begin{pspicture}(3,2) + \mirror[mirrortype=extended, + beam](0,0)(1.8,1.5)(0,2){ext} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Beachten Sie, dass der Anschlussdraht für den Piezospiegel nicht +% gezeichnet wird, falls \Lkeyword{extnode} verwendet wird. +% \fi +% \ifENGLISH Note, that the default piece of wire is omitted when using +% \Lkeyword{extnode} with a piezo mirror. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype}}] +\begin{pspicture}(3,2) +\mirror[mirrortype=piezo, + beam](0,0)(1.8,1.5)(0,2){piezo} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Ein halbdurchlässiger Spiegel (\opt{semitrans}) hat, im Gegensatz zu +% den anderen Spiegeltypen, zwei Grenzflächen, deren Abstand und Position vom +% Wert und Vorzeichen von \Lkeyword{mirrordepth} abhängt. +% \fi +% \ifENGLISH A semi-transparent mirror (\opt{semitrans}) has two interfaces, in +% contrast to the other mirror types. Their distance and position depends on the +% value and sign of \Lkeyword{mirrordepth}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype, mirrordepth}}] +\psset{unit=1.5} +\begin{pspicture}(2,2) + \mirror[mirrortype=semitrans](0,1)(1,1)(1,0) + \drawbeam(0,1){}(1,0) + \drawbeam[linecolor=red](2,1){}(1,2) + \drawbeam[beampos=0.05, linecolor=blue](0,1){}(2,1) +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[morekeywords={[21]{mirrortype, mirrordepth}}] +\psset{unit=1.5} +\begin{pspicture}(2,2) + \mirror[mirrortype=semitrans, mirrordepth=-0.15](0,1)(1,1)(1,0) + \drawbeam(0,1){}(1,0) + \drawbeam[linecolor=red](2,1){}(1,2) + \drawbeam[beampos=0.05, linecolor=blue](0,1){}(2,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Eine negative Spiegeltiefe \Lkeyword{mirrordepth} ist +% äquivalent zu einer positiven Tiefe kombiniert mit +% \Lkeyword{angle}\opt{=180}. +% \fi +% \ifENGLISH A negative \Lkeyword{mirrordepth} is equivalent to a +% positive depth combined with \Lkeyword{angle}\opt{=180}. +% \fi +% +% \boolitem[false]{variable} +% \ifGERMAN +% Zeichnet einen verstellbaren Spiegel, der mit zwei zusätzlichen gekrümmten +% Pfeilen an beiden Seiten angedeutet wird. Das Aussehen, inklusive der Pfeile, +% wird von \Lstyle{VariableStyle} vorgegeben. +% \fi +% \ifENGLISH +% Draw an adjustable mirror which has two additional curved arrows on both +% sides. The appearance including the arrow types is determined by +% \Lstyle{VariableStyle}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{variable}}] +\begin{pspicture}(3,2) + \mirror[beam, variable](0,0)(1.8,1.5)(0,2){var} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0.1]{mirrordepth} +% \ifGERMAN Die Gesamttiefe eines breiten Spiegels.\fi +% \ifENGLISH The total depth of an extended mirror.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype, mirrordepth}}] +\begin{pspicture}(3,2) + \mirror[mirrortype=extended, mirrordepth=0.2, + beam](0,0)(1.8,1.5)(0,2) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[linestyle=none, hatchwidth=0.5\cs{pslinewidth}, hatchsep=1.4\cs{pslinewidth}, fillstyle=hlines]{ExtendedMirror} +% \ifGERMAN Der Stil für den \opt{extended} Spiegel.\fi +% \ifENGLISH The style for the \opt{extended} mirror.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype, ExtendedMirror}}] +\begin{pspicture}(3,2) + \newpsstyle{ExtendedMirror}{fillstyle=solid, + fillcolor=Gold, + linestyle=none} + \mirror[mirrortype=extended, + beam](0,0)(1.8,1.5)(0,2){ext} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \styleitem[fillstyle=solid, fillcolor=black!30]{PiezoMirror} +% \ifGERMAN +% Der Stil für den \opt{piezo} Spiegel. Dieser kann auch dazu verwendet +% werden, die Größe des Piezos zu verändern, wie in dem folgenden Beispiel zu sehen ist. +% \fi +% \ifENGLISH +% This style defines the appearance of the \opt{piezo} mirror. This can also +% be used to change the size of piezo part, as the example shows. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{mirrortype, PiezoMirror}}] +\begin{pspicture}(3,2) + \addtopsstyle{PiezoMirror}{xunit=2} + \mirror[mirrortype=piezo, + beam](0,0)(1.8,1.5)(0,2){piezo} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \styleitem[linestyle=none, fillstyle=solid, fillcolor=black!30]{SemitransMirror} +% \ifGERMAN +% Der Stil für den \opt{semitrans} Spiegel. +% \fi +% \ifENGLISH +% This style defines the appearance of the \opt{semitrans} mirror. +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Parabolspiegel}\fi +% \ifENGLISH\section{Parabolic mirror}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{parabolicmirror} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \parabolicmirror(0,1)(2,1){PM} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[1]{parmirrorwidth} +% \ifGERMAN Die Breite des Parabolspiegels.\fi +% \ifENGLISH The width of the parabolic mirror.\fi +% +% \numitem[1]{parmirrorheight} +% \ifGERMAN Die Höhe des Parabolspiegels.\fi +% \ifENGLISH The height of the parabolic mirror.\fi +% \end{optionlist} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,-2)(3,2) + \parabolicmirror[parmirrorheight=4, parmirrorwidth=2](0,0)(3,0) + \addtopsstyle{Beam}{beamalign=abs, linewidth=0.2\pslinewidth, beaminsidelast, stopinsidecount=1} + \multido{\r=-1.55+0.1}{33}{% + \drawbeam[beampos=\r](0,0){1}} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample} +\begin{pspicture}(0,-1)(3,1) + \optplane(0,0) + \parabolicmirror[parmirrorheight=2, parmirrorwidth=1.5](0,0)(3,0) + \addtopsstyle{Beam}{arrows=->, beamalign=abs} + \drawbeam[beampos=0.5, linecolor=red]{1}{2}{1} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Off-axis-Parabolspiegel}\fi +% \ifENGLISH\section{Off-axis parabolic mirror}\fi +% +% \begin{ltxsyntax} +% \xLtripole{oapmirror}% +% \compitem{oapmirror}[options](in)(center)(focus){label}% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.5) + \oapmirror(3,2)(1,2)(2,0){OAP} + \drawwidebeam[beamwidth=0.5](3,2){1}(2,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[1]{oapmirroraperture}{\prm{num} or \prm{inner} \prm{outer}} +% \ifGERMAN +% Apertur des Spiegels bezogen auf die Eingangsrichtung. Wird eine +% Zahl angegeben, dann gibt diese die gesamte Apertur an, die vertikal +% und symmetrisch zur Verbindung zwischen \prm{in} und \prm{center} +% gemessen wird. Bei zwei Zahlen geben diese die innere und äußere +% Apertur an. +% \fi +% \ifENGLISH +% Mirror aperture with respect to the input direction. If a single +% number is given, it specifies the whole aperture, measured +% perpendicularly and symmetric to the connection from \prm{in} to +% \prm{center}. Two numbers give the inner and the outer apertures. +% \fi +% \end{optionlist} +% +% \ifGERMAN \newpage +% Die Konstruktion des Spiegels anhand der vorgegebenen Punkte geschieht +% wie folgt: Die Gerade von Knoten \prm{in} zu \prm{center} liegt +% parallel zur optischen Achse, \prm{focus} gibt den Fokuspunkt der +% Parabel an. Die Apertur des Spiegels wird mittels des Parameters +% \Lkeyword{oapmirroraperture} angegeben, gemessen senkrecht zum +% einfallenden Strahl. +% +% Die unterschiedlichen Parameter und die zugrundeliegende ganze Parabel +% sind in der folgenden Skizze dargestellt: +% \fi +% \ifENGLISH +% The mirror construction using the given nodes is done as follows: the +% line from node \prm{in} to \prm{center} is parallel to the optical +% axis, \prm{focus} specifies the focal point of the parabola. The +% mirror aperture is given by the parameter +% \Lkeyword{oapmirroraperture}, measured perpendicular to the incoming +% beam. +% +% The different parameters and the whole original parabola are shown in +% the following illustration: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\ifENGLISH +\begin{LTXexample}[linerange={1-2,4-6,15-15}] +\begin{pspicture}(6,5) +\pnodes(5.5,3){In}(1.5,3){Center}(1.5,1.5){Focus} +\oapmirror[oapmirroraperture=3 2, linestyle=dashed, style=Refline](In)(Center)(Focus) +\oapmirror[oapmirroraperture=1.5, linewidth=3\pslinewidth, plotpoints=200](In)(Center)(Focus){OAP} +\multido{\r=-0.5+0.5}{3}{% + \drawbeam[beampos=\r](In){}(Focus)} +\psset{style=Refline}\color{Refline} +\psdot(In)\uput[0](In){In}\psdot(Center)\uput[180](Center){\rput[r](0,0){Center}}\psdot(Focus)\uput[-90](Focus){Focus} +\pnodes([Xnodesep=1]Center){TmpA}([Xnodesep=1,offset=0.75]Center){TmpB} +\psline[arrowscale=1.5, arrows=<->](TmpA)(TmpB)\rput[l]([Xnodesep=0.3]TmpB){outer aperture} +\pnode([Xnodesep=1,offset=-0.75]Center){TmpB} +\psline[arrowscale=1.5, arrows=<->](TmpA)(TmpB)\rput[l]([Xnodesep=0.3]TmpB){inner aperture} +\pnode(In|Focus){Tmp} +\psline[linestyle=dotted]([Xnodesep=-1.5]Focus)(Tmp)\rput[r]([offset=-0.5]Tmp){optical axis} +\end{pspicture} +\end{LTXexample} +\fi\ifGERMAN +\begin{LTXexample}[linerange={1-2,4-6,15-15}] +\begin{pspicture}(6,5) +\pnodes(5.5,3){In}(1.5,3){Center}(1.5,1.5){Focus} +\oapmirror[oapmirroraperture=3 2, linestyle=dashed, style=Refline](In)(Center)(Focus) +\oapmirror[oapmirroraperture=1.5, linewidth=3\pslinewidth, plotpoints=200](In)(Center)(Focus){OAP} +\multido{\r=-0.5+0.5}{3}{% + \drawbeam[beampos=\r](In){}(Focus)} +\psset{style=Refline}\color{Refline} +\psdot(In)\uput[0](In){In}\psdot(Center)\uput[180](Center){\rput[r](0,0){Center}}\psdot(Focus)\uput[-90](Focus){Focus} +\pnodes([Xnodesep=1]Center){TmpA}([Xnodesep=1,offset=0.75]Center){TmpB} +\psline[arrowscale=1.5, arrows=<->](TmpA)(TmpB)\rput[l]([Xnodesep=0.3]TmpB){aeussere Apertur} +\pnode([Xnodesep=1,offset=-0.75]Center){TmpB} +\psline[arrowscale=1.5, arrows=<->](TmpA)(TmpB)\rput[l]([Xnodesep=0.3]TmpB){innere Apertur} +\pnode(In|Focus){Tmp} +\psline[linestyle=dotted]([Xnodesep=-1.5]Focus)(In|Focus)\rput[r]([offset=-0.5]Tmp){optische Achse} +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% +% \ifGERMAN\section{Strahlteiler}\fi +% \ifENGLISH\section{Beamsplitter}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{beamsplitter} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \beamsplitter[beam](0,1)(2,1)(2,0){BS} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.8]{bssize} +% \ifGERMAN Die Größe des Strahlteilers.\fi +% \ifENGLISH The beamsplitter size.\fi +% +% \choitem[cube]{bsstyle}{cube, plate} +% \ifGERMAN +% Wählt zwischen zwei Strahlteilertypen: einem Strahlteilerwürfel (\opt{cube}) +% und einem halbdurchlässigen Spiegel (\opt{plate}). Dieser halbdurchlässige +% Spiegel ist äquivalent zu \Lcomp{mirror} mit +% \Lkeyword{mirrortype}\opt{=semitrans} für \Lkeyword{mirrordepth}\opt{=0}. +% \fi +% \ifENGLISH +% Selects between two types of beamsplitters: the beamsplitter cube (\opt{cube}) +% and the semitransparent mirror (\opt{plate}). This semitransparent mirror ist +% equivalent to \Lcomp{mirror} with \Lkeyword{mirrortype}\opt{=semitrans} and +% \Lkeyword{mirrordepth}\opt{=0}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{bsstyle}}] +\begin{pspicture}(3,2) + \beamsplitter[bsstyle=plate, beam](0,1)(2,1)(2,0){BS} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Optisches Gitter}\fi +% \ifENGLISH\section{Optical grating}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{optgrating} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \optgrating[beam](0,2)(1.8,1.5)(0,0){G} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH Before package version 3.0 this component was called +% \Lcomp*{optgrid}. Since then this command name is deprecated and will be removed +% in future versions. +% \fi +% \ifGERMAN Vor Paketversion 3.0 hieß diese Komponente \Lcomp*{optgrid}. Seitdem +% ist diese Benennung veraltet und wird in zukünftigen Versionen entfernt +% werden. +% \fi +% \begin{optionlist} +% \numitem[1]{gratingwidth} +% \ifGERMAN Die Breite des Gitters.\fi +% \ifENGLISH The width of the grating.\fi +% +% \numitem[0.15]{gratingheight} +% \ifGERMAN Die Gesamthöhe des Gitters.\fi +% \ifENGLISH The total height of the grating.\fi +% +% \numitem[0.075]{gratingdepth} +% \ifGERMAN +% Die absolute Modulationstiefe der Gitterstruktur. Die Gesamthöhe wird +% an diesen Wert angepasst falls sie kleiner als die Modulationtiefe ist, +% andernfalls wird sie nicht beinflusst. +% \fi +% \ifENGLISH +% The modulation depth of the grating structure. The total height is +% adapted to this value if it is smaller than the modulation +% depth. Otherwise the total height is not affected. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{gratingdepth}}] +\begin{pspicture}(3,2) + \optgrating[gratingdepth=0.05, + beam](0,2)(1.8,1.5)(0,0){G} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \intitem[10]{gratingcount} +% \ifGERMAN Die Anzahl der Gitterlinien.\fi +% \ifENGLISH The number of grating grooves.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{gratingcount}}] +\begin{pspicture}(3,2) + \optgrating[gratingcount=3, + beam](0,2)(1.8,1.5)(0,0){G} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[blazed]{gratingtype}{blazed, binary} +% \ifGERMAN +% Wählt zwischen einem binären Gitter (\opt{binary}) und einem Blazegitter +% (\opt{blazed}). +% \fi +% \ifENGLISH +% Select between a \opt{binary} and a \opt{blazed} grating. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{gratingtype}}] +\begin{pspicture}(3,2) + \optgrating[gratingtype=binary, + beam](0,2)(1.8,1.5)(0,0){G} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[top]{gratingalign}{t, top, c, center} +% \ifGERMAN +% Wählt, ob die Reflektionsebene auf den Gitterspitzen (\opt{top}), oder +% in der Mitte des Gitters (\opt{center}) liegt. Wählt man \opt{center} +% aus, macht es Sinn die \Lenv{optexp}-Umgebung oder eine +% halbtransparente Strahlfüllung zu verwenden. +% \fi +% \ifENGLISH +% Selects if the reflection plane resides on \opt{top} of the grating or +% in its \opt{center}. If you choose \opt{center}, you should use the +% \Lenv{optexp} environment or a semitransparent beam filling. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{gratingalign}}] +\begin{pspicture}(3,2) +\pnodes(0.5,0){A}(0.5,1.5){B}(2,1.5){C}(2,0){D} +\psset{unit=1.5, labeloffset=0.4} +\begin{optexp} + \optgrating[gratingalign=top](A)(B)(C){top} + \optgrating[gratingalign=center](B)(C)(D){center} + \drawwidebeam[fillstyle=solid, fillcolor=green!50, beamwidth=0.5](A){-}(D) +\end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{reverse} +% \ifGERMAN +% Invertiert die Steigung des Blazegitters. +% \fi +% \ifENGLISH +% Reverse the slope of the grooves of the \opt{blazed} grating. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{reverse}}] +\begin{pspicture}(3,2) + \optgrating[reverse, beam](0,2)(1.8,1.5)(0,0){grating} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \optitem[0.7\nxLcs{pslinewidth}]{gratinglinewidth}{\prm{num} or \prm{dimen}} +% \ifGERMAN \linewidthexplanation{des Gitters}{Gitter}\fi +% \ifENGLISH \linewidthexplanation{grating}{gratings}\fi +% \end{optionlist} +% +% \begin{stylelist} +% \item[\smash{% +% \begin{tabular}[t]{@{}l@{}} +% \Lkeyword*{optgridwidth}\\ +% \Lkeyword*{optgridheight}\\ +% \Lkeyword*{optgriddepth}\\ +% \Lkeyword*{optgridcount}\\ +% \Lkeyword*{optgridtype}\\ +% \Lkeyword*{optgridlinewidth} +% \end{tabular}}]^^A +% \noindent +% \ifGERMAN Diese Parameter wurden in die entsprechenden \opt{grating*} +% Parameter umbenannt und sind seit Version 3.0 veraltet. +% \fi +% \ifENGLISH These parameters were renamed to the respective \opt{grating*} +% parameters and are deprecated since version 3.0. +% \fi +% \vspace*{2cm} +% \end{stylelist} +% +% +% \ifGERMAN\section{Transmissionsgitter}\fi +% \ifENGLISH\section{Transmission grating}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{transmissiongrating} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \transmissiongrating[beam](0,1)(1.5,1)(3,0.5){TG} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN +% Das Transmissiongitter unterstützt alle Optionen von +% \Lcomp{optgrating}. Der Strahlengang wird so berechnet, dass der +% Strahl an einer Ebene senkrecht zum dargestellten Gitter reflektiert +% wird. Diese Ebene ist im folgenden Beispiel dargestellt: +% \fi +% \ifENGLISH +% The transmission grating supports all options of +% \Lcomp{optgrating}. The beam path is calculated such, that the beam is +% reflected at an interface which is perpendicular to the drawn +% grating. This virtual interface is shown in the following example: +% \fi +% +% \hspace*{\fill}% +% \begin{pspicture}(3,3) +% \transmissiongrating[beam, label=0 . . relative](0,1)(1.5,1)(3,0.5){\psline[linewidth=0.7\pslinewidth, linestyle=dashed](0,-1)(0,1)} +% \ifENGLISH +% \rput[lB](0,2.4){\parbox{3cm}{virtual reflection interface}} +% \fi +% \ifGERMAN +% \rput[lB](0,2.4){\parbox{3cm}{Virtuelle \\ Reflexionsebene}} +% \fi +% \end{pspicture} +% \hspace*{\fill}% +% \begin{pspicture}(3.5,3) +% \pnodes(0,1.3){A}(2,1.3){B}(1,0.3){C} +% \optgrating[reverse, gratingcount=9](A)(B)(C) +% \optplane[angle=45](C) +% \addtopsstyle{Beam}{ArrowInside=->, ArrowInsidePos=0.8, arrowinset=0, arrowscale=1.5} +% \drawbeam[linecolor=black](A){1} +% \addtopsstyle{Beam}{loadbeam, savebeam=false} +% \drawbeam[linecolor=green]{1-2} +% \drawbeam[linecolor=red, beamangle=15]{1-2} +% \drawbeam[linecolor=blue, beamangle=-15]{1-2} +% \ifENGLISH +% \rput[lB](0,2.4){\parbox{5cm}{reflection grating\\\Lcomp{optgrating}}} +% \fi +% \ifGERMAN +% \rput[lB](0,2.4){\parbox{5cm}{Reflexionsgitter\\\Lcomp{optgrating}}} +% \fi +% \end{pspicture} +% \hspace*{\fill}% +% \begin{pspicture}(4,3) +% \pnodes(0,1.3){A}(2,1.3){B}(4,1){C} +% \transmissiongrating[reverse, gratingcount=9](A)(B)(C) +% \optplane[angle=-30](C) +% \addtopsstyle{Beam}{ArrowInside=->, ArrowInsidePos=0.8, arrowinset=0, arrowscale=1.5} +% \drawbeam[linecolor=black](A){1} +% \addtopsstyle{Beam}{loadbeam, savebeam=false} +% \drawbeam[linecolor=green]{1-2} +% \drawbeam[linecolor=red, beamangle=5]{1-2} +% \drawbeam[linecolor=blue, beamangle=-5]{1-2} +% \ifENGLISH +% \rput[lB](0,2.4){\parbox{5cm}{transmission grating\\\Lcomp{transmissiongrating}}} +% \fi +% \ifGERMAN +% \rput[lB](0,2.4){\parbox{5cm}{Transmissionsgitter\\\Lcomp{transmissiongrating}}} +% \fi +% \end{pspicture} +% \hspace*{\fill}% +% +% \ifENGLISH If this is not what you want, you may e.g. rotate the +% component further with \Lkeyword{angle}, and then adjust also the +% \Lkeyword{beamangle}. +% \fi +% \ifGERMAN Ist dieses Verhalten nicht gewünscht, so kann man z.B. die +% Komponente mit \Lkeyword{angle} weiter drehen, und den Strahlwinkel +% mit \Lkeyword{beamangle} entsprechend korrigieren. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.4) + \pnodes(0,1){A}(1,1){B}(3,0.6){C} + \transmissiongrating[angle=-10, reverse](A)(B)(C){TG} + \addtopsstyle{Beam}{ArrowInside=->, ArrowInsidePos=0.8, arrowinset=0, arrowscale=1.5} + \drawbeam[linecolor=black](A){1} + \drawbeam[linecolor=green, loadbeam, beamangle=20]{1}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Akustooptischer Modulator}\fi +% \ifENGLISH\section{Acousto-optic modulator}\fi +% +% \begin{ltxsyntax} +% \xLtripole{optaom}\compitem{optaom}[options](in)(trans)(diff){label} +% \end{ltxsyntax} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,7-7}] +\begin{pspicture}(3,2) + \pnodes(0,1.5){A}(3,0.5){B}(3,1.5){C} + \optaom[beam](A)(B)(C){AOM} + \psdots(A)(B)(C) + \color{Refline} + \uput[-90](A){A}\uput[-90](B){B}\uput[-90](C){C} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Dieses Makro stellt einen akustooptischen Modulator dar. Dieser kann, +% ähnlich einem \Lcomp{beamsplitter} entweder transmittierend oder +% reflektierend sein. Beachten Sie, dass die Knoten nicht so angeordnet +% sind, wie bei den üblichen Tripolen wie z. B. dem +% \Lcomp{optgrating}. Der mittlere Knoten gibt die Richtung eines +% transmittierten, und der dritte Knoten die Richtung der ersten +% Beugungsordnung an. +% +% Diese erste Umsetzung des AOM in Version 4.8 ist +% noch etwas experimentell, da ich nicht genügend Testfälle hatte um +% alle Eventualitäten zu prüfen. Es könnten sich also noch Änderungen +% ergeben, die nicht abwärts kompatibel sind. +% \fi +% \ifENGLISH +% This macro draw an acousto-optic modulator, which either be +% transmittive or reflective, like a \Lcomp{beamsplitter}. Please note, +% that the nodes do not correspond to those of a usual tripole like an +% \Lcomp{optgrating}. The second node is in the direction of the +% transmitted beam, the third node gives the direction of the first +% diffraction order. +% +% This first implementation in version 4.8 is still experimental, +% because I didn't have enough test cases to check all possible +% cases. Therefore, future versions may have changes, which are not +% backwards compatible. +% \fi +% +% \begin{optionlist} +% \numitem[1]{aomheight} +% \ifGERMAN Die Höhe des Modulators.\fi +% \ifENGLISH The height of the modulator.\fi +% +% \numitem[1.5]{aomwidth} +% \ifGERMAN Die Breite des Modulators.\fi +% \ifENGLISH The width of the modulator.\fi +% +% \optitem{aomsize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe des Modulators, äquivalent zum Aufruf von +% \Lkeyword{aomwidth} und \Lkeyword{aomheight}. +% \fi +% \ifENGLISH The width and height of the modulator, is equivalent to calling both +% \Lkeyword{aomwidth} and \Lkeyword{aomheight}. +% \fi +% +% \intitem[9]{aomgratingcount} +% \ifGERMAN +% Gibt die Anzahl der Gitterlinien an. Werden weitere Änderungen des +% Gitters oder des Modulators allgemein gewünscht, dann muss der Parameter +% \Lkeyword{aomcomp} verwendet werden. +% \fi +% \ifENGLISH +% Changes the number of grating lines. For other changes of the grating +% you must use the \Lkeyword{aomcomp} parameter to redefine the whole grating. +% \fi +% +% \choitem[symmetric]{aomalign}{symmetric, straight} +% \ifGERMAN +% Die Ausrichtung eines \Lcomp{optaom} bezüglich der drei Referenzknoten +% kann mit diesem Parameter eingestellt werden. Die symmetrische +% (\opt{symmetric}) Ausrichtung ist im folgenden Beispiel zu sehen: +% \fi +% \ifENGLISH +% The alignment of an \Lcomp{optaom} with respect to the three reference +% nodes can be set with this option. The \opt{symmetric} alignment is +% shown in the following example: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,11-11}] +\begin{pspicture}(3,2) + \pnodes(0,1.5){A}(3,0.5){B}(3,1.5){C} + \optaom[aomalign=symmetric](A)(B)(C){symmetric} + \addtopsstyle{Beam}{fillstyle=solid, linestyle=none, beamwidth=0.1} + \drawwidebeam[fillcolor=red!50](A){}(C) + \drawwidebeam[fillcolor=red](A){}(B) + \color{Refline} + \psdot(A)\uput[-90](A){A} + \psdot(B)\uput[-90](B){B} + \psdot(C)\uput[90](C){C} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% In der geraden (\opt{straight}) Ausrichtung sieht der Strahlengang wie +% folgt aus: +% \fi +% \ifENGLISH +% For \opt{straight} alignment the sketch looks like +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,11-11}] +\begin{pspicture}(3,2) + \pnodes(0,1){A}(3,1){B}(3,1.5){C} + \optaom[aomalign=straight](A)(B)(C){straight} + \addtopsstyle{Beam}{fillstyle=solid, linestyle=none, beamwidth=0.1} + \drawwidebeam[fillcolor=red!50](A){}(C) + \drawwidebeam[fillcolor=red](A){}(B) + \color{Refline} + \psdot(A)\uput[-90](A){A} + \psdot(B)\uput[-90](B){B} + \psdot(C)\uput[90](C){C} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[parallel]{aomreflalign}{perp, parallel} +% \ifGERMAN +% Die Ausrichtung der reflektiven Grenzfläche kann entweder +% \opt{parallel} oder senkrecht (\opt{perp}) zur Komponente +% liegen. Diese Option ist lediglich aus technischer Sicht notwendig, +% die Richtung des reflektierten Strahls wird dadurch nicht +% verändert. +% \fi +% \ifENGLISH +% The reflective interface can be oriented either \opt{parallel} or +% \opt{perp}endicular to the component. This option was necessary in +% first place for technical reasons, the direction of the reflected ray +% is not affected by this option. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-5,10-10}] +\begin{pspicture}(3,2) + \pnodes(0,1.5){A}(3,0.5){B}(3,1.5){C} + \optaom[aomreflalign=parallel](A)(B)(C){parallel} + \addtopsstyle{Beam}{fillstyle=solid, linestyle=none, beamwidth=0.2} + \drawwidebeam[fillcolor=red!50](A){}(C) + \color{Refline} + \psdot(A)\uput[-90](A){A} + \psdot(B)\uput[-90](B){B} + \psdot(C)\uput[90](C){C} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-5,10-10}] +\begin{pspicture}(3,2) + \pnodes(0,1.5){A}(3,0.5){B}(3,1.5){C} + \optaom[aomreflalign=perp](A)(B)(C){perp} + \addtopsstyle{Beam}{fillstyle=solid, linestyle=none, beamwidth=0.2} + \drawwidebeam[fillcolor=red!50](A){}(C) + \color{Refline} + \psdot(A)\uput[-90](A){A} + \psdot(B)\uput[-90](B){B} + \psdot(C)\uput[90](C){C} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Das folgende Beispiel zeigt einen Fall, der mit +% \Lkeyword{aomreflalign}\opt{=parallel} nicht funktioniert, da der +% Einfallswinkel so flach ist, dass die Schnittpunkte mit der +% reflektierenden Grenzfläche außerhalb der Komponente liegen: +% \fi +% \ifENGLISH +% The following example show a use case, which doesn't work properly +% with \Lkeyword{aomreflalign}\opt{=parallel}, because the incident +% angle is so shallow, that the intersection points with the interface +% lay outside of the component. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \pnodes(0,1.1){A}(3,0.8){B}(3,1.1){C} + \optaom[aomreflalign=parallel](A)(B)(C){parallel} + \addtopsstyle{Beam}{fillstyle=solid, linestyle=none, beamwidth=0.2} + \drawwidebeam[fillcolor=red!50](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[default]{aomcomp}{default, \prm{macro}} +% \ifGERMAN Tauscht die Gitterlinien durch eine beliebige Zeichung aus.\fi +% \ifENGLISH Changes the grating lines to an arbitrary drawing.\fi +% +% \intitem[2]{diffractionorders} +% \ifGERMAN +% Die Anzahl der Beugungsordnungen (positive und negative), die mit +% \Lkeyword{beamdiffractionorder} ausgewählt werden können, also +% $-$\prm{num},$-$\prm{num}$+1$,\ldots ,\prm{num}. +% +% Gleichzeitig werden entsprechende Knoten +% \lstinline!\oenode{DO-1}{<comp>}!, \lstinline!\oenode{DO0}{<comp>}!, +% \lstinline!\oenode{DO1}{<comp>}! usw. definiert. +% \fi +% \ifENGLISH +% The number or diffraction orders (positive and negative) which can be +% selected with \Lkeyword{beamdiffractionorder}, +% i.e. $-$\prm{num},$-$\prm{num}$+1$,\ldots ,\prm{num}. +% +% At the same time the nodes \lstinline!\oenode{DO-1}{<comp>}!, +% \lstinline!\oenode{DO0}{<comp>}!, \lstinline!\oenode{DO1}{<comp>}! +% etc. are defined. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0.6)(4.3,3.6) + \pnodes(0,2.5){A}(4,2){B}(4,2.5){C} + \optaom[aomsize=1 2, aomreflalign=perp, diffractionorders=3](A)(B)(C) + \addtopsstyle{Beam}{beamwidth=0.2, linestyle=none, fillstyle=solid} + \drawwidebeam[fillcolor=red!40](A){}(C) + \drawwidebeam[fillcolor=red](A){}(B) + \multido{\i=-3+1}{7}{% + \psdot(\oenode{DO\i}{})\uput[0](\oenode{DO\i}{}){\i}}% +\end{pspicture}% +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \intitem[\{\}]{beamdiffractionorder} +% \ifGERMAN +% Die Beugungsordnung, die für einen reflektierten Strahl durch den AOM +% verwendet wird. Wenn der Wert leer ist, \opt{\{\}} dann wird die +% Option ignoriert. +% +% Mit Verwendung dieser Option wird unmittelbar das Verhalten der +% Grenzfläche festgelegt, hängt also nicht von der relativen Position +% von AOM und der folgenden Komponente ab. Für +% \Lkeyword{beamdiffractionorder}$\neq 0$ wird der Strahl reflektiert, +% für den Wert $0$ hingegen transmittiert. Der Parameter +% \Lkeyword{beammode} wird dann ignoriert. +% +% Es können nur die Beugungsordnungen verwendet werden, die für die +% entsprechende Komponente mit \Lkeyword{diffractionorders} definiert +% wurden. Wird eine nicht-definierte Ordnung verwendet, dann wird die +% nächstliegende verwendet und eine Postscript-Warnung (siehe +% \Lkeyword{pswarning}) ausgegeben. +% \fi +% \ifENGLISH +% The diffraction order, which is used for a reflected beam going +% through the aom. The option is ignored if its value is empty +% \opt{\{\}}. +% +% By using this option you automatically select the behaviour of the +% interface, which then doesn't depend on the relative position of AOM +% and the following component. For \Lkeyword{beamdiffractionorder}$\neq +% 0$ a beam gets reflected, for the value $0$ it gets transmitted. The +% parameter \Lkeyword{beammode} is ignored. +% +% You can select only those orders, where have been defined for the +% respective component with \Lkeyword{diffractionorders}. If an +% undefined order is selected, the closest one is choosen instead and a +% Postscript warning is issued (see \Lkeyword{pswarning}). +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, linerange={1-7,12-12}] +\begin{pspicture}(0,-0.2)(4.4,3.8) + \pnodes(0,2.5){A}(4,2){B}(4,2.5){C} + \optaom[aomsize=1 2, aomreflalign=perp, diffractionorders=3](A)(B)(C) + \optplane(B) + \addtopsstyle{Beam}{beamwidth=0.2, linestyle=none, fillstyle=solid} + \multido{\i=-3+1,\r=10+15}{7}{% + \drawwidebeam[fillcolor=red!\r, beamdiffractionorder=\i](A){-}} + \color{Refline} + \uput[90](A){A}\psdot(A) + \uput[0](B){B}\psdot(B) + \uput[0](C){C}\psdot(C) +\end{pspicture}% +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Prisma}\fi +% \ifENGLISH\section{Prism}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{optprism} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \optprism[beam](0,1)(2,1)(3,0){Prism} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \ifGERMAN +% Das Prisma wird immer symmetrisch bezüglich der \prm{in} und \prm{out} +% Knoten ausgerichtet. Für asymmetrischen Strahlengang siehe +% \prettyref{chap:connecting}. +% \fi +% \ifENGLISH +% The prism is always placed symmetric between \prm{in} and \prm{out} +% nodes. For asymmetric beam traces see \prettyref{chap:connecting}. +% \fi +% +% \begin{optionlist} +% \numitem[1]{prismsize} +% \ifGERMAN Die Höhe des Prismas.\fi +% \ifENGLISH The height of the prism.\fi +% +% \numitem[60]{prismangle} +% \ifGERMAN Der obere Winkel des Prismas.\fi +% \ifENGLISH The upper angle of the prism.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]prismangle}] +\begin{pspicture}(3,2) + \optprism[prismangle=30, beam](0,1)(2,1)(3,0){Prism} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[transmittive]{prismtype}{transmittive, reflective} +% \ifGERMAN Ist dieser Parameter auf \opt{reflective} gesetzt, so wird +% die Grundfläche als zusätzliche, reflektierende Grenzfläche +% verwendet. +% \fi +% \ifENGLISH If this parameter is set to \opt{reflective}, the prism +% base is used as additional, reflective interface. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]prismtype}] +\begin{pspicture}(1.5,0.6)(5.1,2.2) + \optprism[prismtype=reflective](0,1)(3,0.9)(6,1) + \lens(1,2)(\oenodeIfc{2}{1}) + \lens(\oenodeIfc{2}{1})(5,2) + \drawwidebeam[beamwidth=0.3, fillstyle=solid, fillcolor=green, opacity=0.3](1,2){2}{1}{3}(5,2) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[auto]{prismalign}{auto,center} +% \ifENGLISH Sets the vertical alignment of the prism with respect to the +% «reflection» node \prm{center}. For \opt{auto}, the prism is shifted such, +% that the interface nodes lay on the connection between the respective +% reference node and the «reflection» node. If the value is \opt{center}, the +% «reflection» node coincides with the component center. See the following +% examples for further explanation. +% \fi +% \ifGERMAN Wählt die vertikale Ausrichtung des Prisma bezüglich des +% «Reflektionsknoten» \prm{center}. Ist der Wert \opt{auto}, so wird das Prisma +% so verschoben, dass die Grenzflächenknoten auf der Verbindungslinie zwischen +% dem entsprechenden Referenzknoten und dem «Reflektionsknoten» liegen. Für +% \opt{center} fällt der «Reflektionsknoten» mit der Komponentenmitte +% zusammen. Siehe die folgende Beispiele zur weiteren Erklärung. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{pspicture}(0,-0.5)(14,3.2) + \footnotesize + \pnodes(0,1){A}(2,2){B}(4,1){C} + \psdot(A)\uput[90](A){A} + \psdot(B)\uput[90](B){B} + \psdot(C)\uput[90](C){C} + \optprism[prismsize=2](A)(B)(C) + \psline[style=Refline, linestyle=dashed](A)(B)(C) + \newpsstyle{IfcDot}{dotstyle=+, linecolor=red, linewidth=1.5\pslinewidth} + \psdot[style=IfcDot](\oenodeCenter{})\uput{0.1}[-90](\oenodeCenter{}){\prm{center}} + \psdot[style=IfcDot](\oenodeIn{})\uput{0.1}[150](\oenodeIn{}){\prm{in}} + \psdot[style=IfcDot](\oenodeOut{})\uput{0.1}[30](\oenodeOut{}){\prm{out}} + \rput[t](\oenodeCenter{}|0,0.2){% + \begin{tabular}{@{}c@{}}\opt{prismalign=auto}\\\opt{prismtype=transmittive}\end{tabular}} + + \pnodes(5,1){A}(7,2){B}(9,1){C} + \psdot(A)\uput[90](A){A} + \psdot(B)\uput[90](B){B} + \psdot(C)\uput[90](C){C} + \optprism[prismsize=2, prismalign=center](A)(B)(C) + \psline[style=Refline, linestyle=dashed](A)(B)(C) + \newpsstyle{IfcDot}{dotstyle=+, linecolor=red, linewidth=1.5\pslinewidth} + \psdot[style=IfcDot](\oenodeCenter{})\uput{0.1}[-90](\oenodeCenter{}){\prm{center}} + \psdot[style=IfcDot](\oenodeIn{})\uput{0.1}[150](\oenodeIn{}){\prm{in}} + \psdot[style=IfcDot](\oenodeOut{})\uput{0.1}[30](\oenodeOut{}){\prm{out}} + \rput[t](\oenodeCenter{}|0,0.2){% + \begin{tabular}{@{}c@{}}\opt{prismalign=center}\\\opt{prismtype=transmittive}\end{tabular}} + + \pnodes(10,2){A}(12,1){B}(14,2){C} + \psdot(A)\uput[90](A){A} + \psdot(B)\uput[-90](B){B} + \psdot(C)\uput[90](C){C} + \optprism[prismsize=2, prismtype=reflective](A)(B)(C) + \psline[style=Refline, linestyle=dashed](A)(B)(C) + \newpsstyle{IfcDot}{dotstyle=+, linecolor=red, linewidth=1.5\pslinewidth} + \psdot[style=IfcDot](\oenodeCenter{})\uput{0.1}[90](\oenodeCenter{}){\prm{center}} + \psdot[style=IfcDot](\oenodeIn{})\uput{0.1}[-160](\oenodeIn{}){\prm{in}} + \psdot[style=IfcDot](\oenodeOut{})\uput{0.1}[-20](\oenodeOut{}){\prm{out}} + \rput[t](\oenodeCenter{}|0,0.2){% + \begin{tabular}{@{}c@{}}\opt{prismalign=auto}\\\opt{prismtype=reflective}\end{tabular}} +\end{pspicture} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Umkehrprisma}\fi +% \ifENGLISH\section{Right-angle prism}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{rightangleprism} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \psdot(1.8,1) + \rightangleprism[beam](0,1.5)(1.8,1)(0,0.5){RA} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \ifGERMAN +% Das Umkehrprisma wird so ausgerichtet, dass der einfallende und der +% reflektierte Strahl parallel sind und der \prm{center} Knoten vertikal +% zentriert in dem Prisma liegt. +% \fi +% \ifENGLISH +% The right-angle prisms is align such that the incoming and reflected +% beam are parallel and the \prm{center} node is vertically centered in +% the prism. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3.5,2) + \pnodes(0,2){A}(2.5,0.5){G}(0,1.5){B} + \begin{optexp} + \rightangleprism[beam, showifcnodes, showoptdots](A)(G)(B){RA} + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \numitem[1.5]{raprismsize} +% \ifGERMAN Die Länge der Eingangsfläche.\fi +% \ifENGLISH The length of the input plane.\fi +% +% \choitem[auto]{raprismalign}{auto, center} +% \ifGERMAN Schaltet die automatische Positionierung der Komponente +% vertikal zur Eingangsfläche ein oder aus: +% \fi +% \ifENGLISH Switch between automatic and fixed alignment of the +% component vertical to the entrance interface: +% \fi +% +% \begin{pspicture}(0,-0.5)(13,2) +% \pnodes(0,1.6){A}(0,0.4){B} +% \rightangleprism(A)(2,1)(B)\psdot(\oenodeCenter{}) +% \drawbeam(A){}(B) +% \pnodes(3,1.2){A}(3,0.8){B} +% \rightangleprism(A)(5,1)(B)\psdot(\oenodeCenter{}) +% \drawbeam(A){}(B) +% \rput[t](3,0){\opt{raprismalign=auto}} +% \psset{raprismalign=center} +% \pnodes(7,1.6){A}(7,0.4){B} +% \rightangleprism(A)(9,1)(B)\psdot(\oenodeCenter{}) +% \drawbeam(A){}(B) +% \pnodes(10,1.2){A}(10,0.8){B} +% \rightangleprism(A)(12,1)(B)\psdot(\oenodeCenter{}) +% \drawbeam(A){}(B) +% \rput[t](10,0){\opt{raprismalign=center}} +% \end{pspicture} +% +% \end{optionlist} +% +% \ifGERMAN\section{Pentaprisma}\fi +% \ifENGLISH\section{Penta prism}\fi +% +% \begin{ltxsyntax} +% \tripoledesc{pentaprism} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \pentaprism[beam](0,1)(2,1)(2,0){PP} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.7]{pentaprismsize} +% \ifGERMAN Die Länge der Eingangs- und Ausgangsfläche.\fi +% \ifENGLISH The length of the input and output plane.\fi +% \end{optionlist} +% +% +% \ifGERMAN\chapter{Faserkomponenten}\fi +% \ifENGLISH\chapter{Fiber components}\fi +% \label{chap:fibercomp} +% +% \ifENGLISH This chapter describes all fiber components and their +% options. They differ from free-ray components in that they are +% connected by default with fibers to their reference nodes, and that +% they cannot be used for raytracing. Instead of automatic fiber +% connections the components can also be connected manually with fibers, +% see \prettyref{sec:drawfiber}. +% +% Most components require only two reference nodes and are handled like +% the free-ray dipoles. Some special components like couplers +% (\prettyref{sec:coupler}) and circulators +% (\prettyref{sec:optcirculator}) are treated differently. +% \fi +% \ifGERMAN In diesem Kapitel werden alle Faserkomponenten und deren +% Parameter beschrieben. Diese werden automatisch über Fasern mit ihren +% Referenzknoten verbunden und unterstützen kein Raytracing. Anstelle +% der automatischen Faserverbindungen können die Komponenten auch +% manuell mit Fasern verbunden werden, siehe \prettyref{sec:drawfiber}. +% +% Die meisten Komponenten benötigen nur zwei Referenzknoten und werden +% wie die Freistrahlzweipole behandelt. Manche spezielle Komponenten wie +% Koppler (\ref{sec:coupler}) und Zirkulatoren (\compref{optcirculator}) +% werden anders ausgerichtet. +% \fi +% +% \begin{optionlist} +% \boolitem{usefiberstyle} +% \ifGERMAN +% Bei manchen Komponenten (z.B. \Lcomp{optfilter} oder \Lcomp{optmzm}) +% kann es vorteilhaft sein interne Faserteile hervorzuheben. Mit +% diesem Parameter werden z.B. die durchlässigen Teile eines Filter +% angezeigt und mit dem \Lstyle{Fiber}-Stil gezeichnet. In der +% Dokumentation ist dieses Verhalten angeschaltet um die betroffenen +% Bereiche hervorzuheben. Hat Vorrang vor der Option +% \Lkeyword{usewirestyle}, sind beide Optionen gesetzt, dann wird eine +% Faser gezeichnet. +% \fi +% \ifENGLISH +% For some components (e.g. \Lcomp{optfilter} or \Lcomp{optmzm}) it +% can be nice to highlight some internals. For example, if this option +% is enabled the passing parts of the optical filter are drawn with +% the \Lstyle{Fiber} style. In the documentation this parameter is +% enabled to show the parts which are affected. Takes precedence over +% \Lkeyword{usewirestyle}. +% \fi +% \boolitem{usewirestyle} +% \ifGERMAN +% Kann verwendet werden, um interne Verbindungen als \Lstyle{Wire} +% darzustellen. Setzt \Lkeyword{usefiberstyle} auf \opt{false}, daher +% kann es sinnvoll sein, z.B. einen elektrischen Filter zu definieren: +% \fi +% \ifENGLISH +% Can be used to draw internal connections als \Lstyle{Wire}. Sets +% \Lkeyword{usefiberstyle} to \opt{false}, therefore it can be useful +% to define e.g. an electrical filter: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{lstlisting} +\newpsobject{elecfilter}{optfilter}{usewirestyle} +\end{lstlisting} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Optische Faser}\fi +% \ifENGLISH\section{Optical fiber}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optfiber} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optfiber[label=0.3](0,0.5)(3,0.5){SSMF} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \intitem[3]{fiberloops} +% \ifGERMAN Anzahl der Faserschleifen.\fi +% \ifENGLISH Number of the fiber loops.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberloops}] +\begin{pspicture}(3,1.5) + \optfiber[fiberloops=2, label=0.3](0,0.5)(3,0.5){SSMF} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0.4]{fiberloopradius} +% \ifGERMAN Radius der Faserschleifen.\fi +% \ifENGLISH Radius of the fiber loops.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberloopradius}] +\begin{pspicture}(3,1.5) + \optfiber[fiberloopradius=0.2, label=0.3](0,0.5)(3,0.5){SSMF} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0.2]{fiberloopsep} +% \ifGERMAN Abstand zwischen zwei aufeinanderfolgenden Faserschleifen.\fi +% \ifENGLISH Separation between two successive fiber loops.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberloopsep}] +\begin{pspicture}(3,1.5) + \optfiber[fiberloopsep=0.6, label=0.3](0,0.5)(3,0.5){SSMF} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Optischer Verstärker}\fi +% \ifENGLISH\section{Optical amplifier}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optamp} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optamp(0,1)(3,1){EDFA} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.8]{optampsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Seitenlänge des Verstärkers an, zwei Zahlen die +% Breite und Höhe. Beachten Sie, dass \opt{optampsize=1} und \opt{optampsize=1 +% 1} nicht dasselbe Ergebnis liefern. Alternativ kann das Verhältnis zwischen +% Höhe und Breite mit \opt{xunit} und \opt{yunit} geändert werden. +% \fi +% \ifENGLISH +% A single number gives the side length of the amplifier, two numbers the width +% and height. Note, that \opt{optampsize=1} and \opt{optampsize=1 1} do not give +% the same result. You may also change the relation of width and height with +% \opt{xunit} and \opt{yunit}. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Mach-Zehnder-Modulator}\fi +% \ifENGLISH\section{Mach--Zehnder modulator}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optmzm} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optmzm(0,1)(3,1){MZM} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.8]{optmzmsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Höhe des Modulators an, die Breite ist \opt{1.6} mal die +% Höhe. Zwei Zahlen geben Breite und Höhe des Modulators direkt an. +% \fi +% \ifENGLISH +% A single number gives the modulator height, the width is \opt{1.6} times the +% height. Two numbers define width and height directly. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Polarisationssteller}\fi +% \ifENGLISH\section{Polarization controller}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{polcontrol} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \polcontrol(0,1)(3,1){PC} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.15]{polcontrolsize} +% \ifGERMAN Der Radius der Polarisationssteller-Kreise.\fi +% \ifENGLISH The radius of the polarization controller circles.\fi +% +% \choitem[linear]{polcontroltype}{linear, triangle} +% \ifGERMAN Der Typ des Polarisationsstellers.\fi +% \ifENGLISH The type of polarization controller.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]polcontroltype}] +\begin{pspicture}(3,1.5) + \polcontrol[polcontroltype=triangle](0,1)(3,1){PC} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Isolator}\fi +% \ifENGLISH\section{Isolator}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optisolator} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optisolator(0,1)(3,1){isolator} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.6]{isolatorsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Höhe des Isolators an, die Breite ist \opt{1.6} mal die +% Höhe. Zwei Zahlen geben Breite und Höhe des Isolators direkt an. +% \fi +% \ifENGLISH +% A single number gives the isolator height, the width is \opt{1.6} times the +% height. Two numbers define width and height directly. +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[linewidth=2\cs{pslinewidth}, arrowinset=0]{IsolatorArrow} +% \ifGERMAN +% Der Stil für den Isolatorpfeil. Das kann insbesondere nützlich sein um +% die Länge des Pfeils zu verändern. +% \fi +% \ifENGLISH +% The style of the isolator arrow. This can be especially useful to +% adapt the length of the arrow. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]IsolatorArrow}] +\begin{pspicture}(3,1.5) + \addtopsstyle{IsolatorArrow}{xunit=1.2} + \optisolator(0,1)(3,1){isolator} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Optischer Schalter}\fi +% \ifENGLISH\section{Optical switch}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optswitch} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optswitch(0,1)(3,1){opened switch} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.8]{switchsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Wird nur eine Zahl angegeben, so ist das die Seitenlänge des +% Schalters, andernfalls können Breite und Höhe getrennt angegeben +% werden. +% \fi +% \ifENGLISH +% A single number defines the side length of the switch, otherwise the +% height and width can be specified separately. +% \fi +% +% \choitem[opened]{switchstyle}{opened, closed} +% \ifGERMAN Der Zustand des Schalters kann geschlossen (\opt{closed}) oder +% geöffnet (\opt{opened}) sein. +% \fi +% \ifENGLISH Indicate the switch as \opt{opened} or \opt{closed}.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]switchstyle}] +\begin{pspicture}(3,1.5) + \optswitch[switchstyle=closed](0,1)(3,1){closed switch} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Faserverzögerungstrecke}\fi +% \ifENGLISH\section{Fiber delay-line}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{fiberdelayline} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \fiberdelayline(0,1)(3,1){delay line} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.6]{fdlsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Höhe der Komponente an, die Breite ist \opt{1.6} +% mal die Höhe. Zwei Zahlen geben Breite und Höhe der Komponente direkt an. +% \fi +% \ifENGLISH +% A single number gives the component height, the width is \opt{1.6} times the +% height. Two numbers define width and height directly. +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[arrowinset=0, arrows=->]{FdlArrow} +% \ifGERMAN +% Siehe \Lstyle{ArrowCompStyle}. +% \fi +% \ifENGLISH +% See \Lstyle{ArrowCompStyle}. +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Polarisator}\fi +% \ifENGLISH\section{Polarizer}\fi +% +% \begin{ltxsyntax} +% \fiberdipoledesc{optfiberpolarizer} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optfiberpolarizer(0,1)(3,1){polarizer} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[0.6]{fiberpolsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Höhe der Komponente an, die Breite ist \opt{1.6} +% mal die Höhe. Zwei Zahlen geben Breite und Höhe der Komponente direkt an. +% \fi +% \ifENGLISH +% A single number gives the component height, the width is \opt{1.6} times the +% height. Two numbers define width and height directly. +% \fi +% \end{optionlist} +% +% +% \ifGERMAN\section{Optischer Zirkulator}\fi +% \ifENGLISH\section{Optical circulator}\fi +% +% \label{sec:optcirculator} +% \begin{ltxsyntax} +% \xLfmultipole{optcirculator}% +% \compitem{optcirculator}(left)(right)(bottom){label}% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \addtopsstyle{Fiber}{arrows=->} + \addtopsstyle{FiberOut1}{linecolor=blue} + \addtopsstyle{FiberOut2}{linecolor=green!80!black} + \optcirculator(0,1)(3,1)(1.5,0){Circulator} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \numitem[0.8]{optcircsize} +% \ifGERMAN Der Durchmesser des Zirkulators.\fi +% \ifENGLISH The diameter of the circulator.\fi +% +% \numitem[-160]{optcircangleA} +% \ifGERMAN Der Startwinkel des internen Pfeils.\fi +% \ifENGLISH The starting angle of the internal arrow.\fi +% +% \numitem[-20]{optcircangleB} +% \ifGERMAN Der Endwinkel des internen Pfeils.\fi +% \ifENGLISH The ending angle of the internal arrow.\fi +% +% \optitem{optcircangle}{\prm{num} \prm{num}} +% \ifGERMAN Kurzschreibweise um beide Winkel gleichzeitig zu setzen.\fi +% \ifENGLISH Short notation to specifying both angles.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]optcircangle}] +\begin{pspicture}(3,1.5) + \optcirculator[optcircangle=0 -90](0,1)(3,1)(1.5,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[unit=0.7, arrows=->, arrowinset=0]{OptCircArrow} +% \ifGERMAN +% Der Stil für den internen Pfeil. Damit wird sowohl die Richtung des Pfeils als +% auch die Größe des Bogens bestimmt. +% \fi +% \ifENGLISH The style of the internal arrow. It specifies the direction of the +% arrow and the size of the arc. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{optcircangle, OptCircArrow}}] +\begin{pspicture}(3,1.5) + \newpsstyle{OptCircArrow}{unit=0.5, arrows=<-, arrowinset=0} + \optcirculator[optcircangle=0 -90](0,1)(3,1)(1.5,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifENGLISH +% The circulator is positioned by default such that the input and output fibers +% are orthogonal to each other, like shown in the example: +% \fi +% \ifGERMAN +% Der Zirkulator wird so positioniert, dass Eingangs- und Ausgangsverbindung +% senkrecht zueinander stehen, wie das folgende Beispiel verdeutlicht: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \addtopsstyle{Fiber}{arrowscale=1.3, arrows=->, arrowinset=0} + \optcirculator(0,0.5)(3,2)(1.5,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH The positioning parameters (\prettyref{sec:positioning}) refer to +% the reference nodes \prm{left} and \prm{right} as usual and are not related +% to the automatic position. This implies, that the default position is not +% equivalent to \Lkeyword{position}\opt{=0.5}. +% \fi +% \ifGERMAN Die Positionierungsparameter (\prettyref{sec:positioning}) beziehen +% sich wie üblich auf die Referenzknoten \prm{left} und \prm{right}, und nicht +% auf die automatisch bestimmte Position. Das bedeutet auch, dass die +% automatische Position i.a. nicht mit \Lkeyword{position}\opt{=0.5} +% übereinstimmt. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \addtopsstyle{Fiber}{arrowscale=1.3, arrows=->, arrowinset=0, ncurv=1.5} + \optcirculator[position=0.5](0,0.5)(3,2)(1.5,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Faserkoppler}\fi +% \ifENGLISH\section{Fiber coupler}\fi +% \label{sec:coupler} +% +% \ifGERMAN Es stehen drei Faserkoppler zur Verfügung, die alle die gleichen +% Formen und Parameter verwenden. +% \fi +% \ifENGLISH The package provides three fiber couplers which all share the same +% shapes and parameters. +% \fi +% \begin{ltxsyntax} +% \xLfmultipole{optcoupler}% +% \compitem{optcoupler}(tl)(bl)(tr)(br){label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,-0.4)(3,1) + \optcoupler(0,1)(0,0)(3,1)(3,0){optcoupler} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \xLfmultipole{wdmcoupler}% +% \compitem{wdmcoupler}(tl)(bl)(r){label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,-0.4)(3,1) + \wdmcoupler(0,1)(0,0)(3,0.5){wdmcoupler} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \xLfmultipole{wdmsplitter}% +% \compitem{wdmsplitter}(l)(tr)(br){label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,-0.4)(3,1) + \wdmsplitter(0,0.5)(3,1)(3,0){wdmsplitter} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \optitem[0.2]{couplersize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Wird eine Zahl angegeben, so ist die Breite des Kopplers doppelt so groß, die +% Höhe entspricht \opt{0.8} mal dem Wert. Mit zwei Zahlen werden Breite und Höhe +% direkt angegeben. +% \fi +% \ifENGLISH +% For a single number the width is twice this value, the height \opt{0.8} times +% this value. Two numbers define width and height directly. +% \fi +% +% \numitem[0.05]{couplersep} +% \ifGERMAN Der vertikale Abstand zwischen zwei Faserports.\fi +% \ifENGLISH The vertical distance between two fiber ports.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{couplersep}}] +\begin{pspicture}(0,-0.5)(3,1) + \optcoupler[couplersep=0](0,1)(0,0)(3,1)(3,0){coupler} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH If this value is set to \{\}, the separation is calculated +% automatically according to the \Lkeyword{couplertype} and +% \Lkeyword{couplersize}. +% \fi +% \ifGERMAN Wird dieser Wert auf \{\} gesetzt, dann wird der Abstand +% automatisch berechnet, abhängig von \Lkeyword{couplertype} und +% \Lkeyword{couplersize}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{couplersep}}] +\begin{pspicture}(3,4.5) + \psset{couplersep={}, couplersize=0.5, labeloffset=0.5} + \optcoupler[couplertype=none]% + (0,4.5)(0,3.5)(3,4.5)(3,3.5){none} + \optcoupler[couplertype=rectangle]% + (0,3)(0,2)(3,3)(3,2){rectangle} + \optcoupler[couplertype=ellipse]% + (0,1.5)(0,0.5)(3,1.5)(3,0.5){ellipse} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \choitem[ellipse]{couplertype}{none, ellipse, rectangle, cross} +% \ifGERMAN Wählt zwischen unterschiedlichen Kopplertypen.\fi +% \ifENGLISH Select between different coupler types.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{couplertype}}] +\begin{pspicture}(3,4.5) + \psset{labeloffset=0.5} + \optcoupler[couplertype=none]% + (0,4.5)(0,3.5)(3,4.5)(3,3.5){none} + \optcoupler[couplertype=rectangle]% + (0,3)(0,2)(3,3)(3,2){rectangle} + \optcoupler[couplertype=cross]% + (0,1.5)(0,0.5)(3,1.5)(3,0.5){cross} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[center]{coupleralign}{t, top, b, bottom, c, center} +% \ifGERMAN Die Ausrichtung des Kopplers bezüglich der +% Referenzknoten. Beachten Sie, dass die Position der Komponentenmitte +% und damit der Beschriftung von dieser Einstellung abhängt (siehe +% \ref{sec:centernode}). +% \fi +% \ifENGLISH The alignment of the coupler with respect to the reference +% nodes. Note, that the exact position of the coupler center and +% accordingly that of the label depends on this setting (see +% \ref{sec:centernode}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{coupleralign}}] +\begin{pspicture}(3,3) + \psset{labeloffset=0.4} + \optcoupler[coupleralign=top]% + (0,3)(0,2)(3,3)(3,2){top} + \optcoupler[coupleralign=bottom]% + (0,1.5)(0,0.5)(3,1.5)(3,0.5){bottom} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \choitem[center]{align}{top, bottom, center} +% \ifGERMAN Dieser Parameter wurde in Version 3.0 in \Lkeyword{coupleralign} +% umbenannt und ist seitdem veraltet. +% \fi +% \ifENGLISH This parameter was renamed in version 3.0 to +% \Lkeyword{coupleralign} and is deprecated. +% \fi +% +% \boolitem*[true]{variable} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{variable}}] +\begin{pspicture}(3,1) + \optcoupler[variable](0,1)(0,0)(3,1)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem[arrowinset=0, arrows=->]{VariableCoupler} +% \ifGERMAN +% Der Stil des Pfeiles des verstellbaren Kopplers. +% \fi +% \ifENGLISH +% The style of the arrow of the variable coupler. +% \fi +% \end{stylelist} +% +% \ifGERMAN +% Jeder Koppler hat eine Variante, die nur zwei Knoten benötigt, einen Eingangs- +% und einen Ausgangsknoten. \Lcomp{optcoupler} verwendet jeden dieser Knoten +% zweimal, \Lcomp{wdmsplitter} verwendet den Knoten \prm{out} zweimal und +% \Lcomp{wdmcoupler} verwendet \prm{in} zweimal. Das kann sehr praktisch sein, +% wenn man für einen Koppler die automatischen Verbindungen nicht verwendet, +% sondern die Komponente manuell verbindet. +% \fi +% \ifENGLISH +% Every coupler has a variant which needs only two nodes, one input and one +% output node. For \Lcomp{optcoupler}, both nodes are used twice, +% \Lcomp{wdmsplitter} uses node \prm{out} twice, and \Lcomp{wdmcoupler} uses node +% \prm{in} twice. This can be very useful if you do not use the automatic +% connections but connect the components manually. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(4,2) + \pnodes(0,1){A}(4,1){B} + \psset[optexp]{fiber=none} + \wdmsplitter[position=0.2, coupleralign=b](A)(B) + \wdmcoupler[position=0.8, coupleralign=t](A)(B) + \drawfiber{(A)}{1}{2}{(B)} + \drawfiber{1}{([offset=0.5, Xnodesep=1]\oenodeIfc{2}{1})} + \drawfiber{([offset=-0.5, Xnodesep=-1]\oenodeIfc{2}{2})}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \ifGERMAN\subsection{Eingangs- und Ausgangsknoten}\fi +% \ifENGLISH\subsection{Input and output nodes}\fi +% \label{sec:coupler-nodes} +% +% \ifGERMAN +% Die Definition der Eingangs- und Ausgangsknoten aus \prettyref{sec:ifcnode} +% ist für Koppler nicht anwendbar. Hier werden die Knoten einfach von \opt{1} +% (links oben) bis \opt{N} (rechts unten) durchnummeriert. +% \fi +% \ifENGLISH +% The definition of input and output nodes from \prettyref{sec:ifcnode} cannot +% be applied to couplers. Here, the nodes are simply numbered from \opt{1} (left +% top) to \opt{N} (right bottom). +% \fi +% \begin{center} +% \begin{pspicture}(11,2) +% \psset{couplersize=0.5, couplertype=rectangle, couplersep=0.2} +% \wdmsplitter(0, 1.25)(3,2)(3,0.5) +% \psdot(\oenodeIfc{1}{})\uput[120](\oenodeIfc{1}{}){1} +% \psdot(\oenodeIfc{2}{})\uput[90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{N}{})\uput[-90](\oenodeIfc{N}{}){N} +% \wdmcoupler(4, 2)(4,0.5)(7,1.25) +% \psdot(\oenodeIfc{1}{})\uput[90](\oenodeIfc{1}{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{N}{})\uput[60](\oenodeIfc{N}{}){N} +% \optcoupler(8,2)(8,0.5)(11,2)(11,0.5) +% \psdot(\oenodeIfc{1}{})\uput[90](\oenodeIfc{1}{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[90](\oenodeIfc{3}{}){3} +% \psdot(\oenodeIfc{N}{})\uput[-90](\oenodeIfc{N}{}){N} +% \rput[b](1.5,0){\nxLcomp{wdmsplitter}} +% \rput[b](5.5,0){\nxLcomp{wdmcoupler}} +% \rput[b](9.5,0){\nxLcomp{optcoupler}} +% \end{pspicture} +% \end{center} +% +% +% \ifGERMAN\subsection{Referenzknoten}\fi +% \ifENGLISH\subsection{Reference nodes}\fi +% \label{sec:coupler-refnodes} +% +% \ifGERMAN +% Die Definition der Referenzknoten aus \prettyref{sec:refnode} ist für Koppler +% nicht anwendbar und hängt von \Lkeyword{coupleralign} ab. +% \fi +% \ifENGLISH +% The definition of reference nodes from \prettyref{sec:refnode} cannot be +% applied to couplers and depends on \Lkeyword{coupleralign}. +% \fi +% \begin{center} +% \begin{pspicture}(12,2) +% \psset{couplersize=0.5, couplertype=rectangle, couplersep=0.2} +% \optcoupler(0, 2)(0,0.7)(3,2)(3,0.7) +% \psdot(\oenodeRefA{})\uput[90](\oenodeRefA{}){RefA} +% \psdot(\oenodeRefB{})\uput[90](\oenodeRefB{}){RefB} +% \optcoupler[coupleralign=top](4.5, 2)(4.5,0.7)(7.5,2)(7.5,0.7) +% \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} +% \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} +% \optcoupler[coupleralign=bottom](9, 2)(9,0.7)(12,2)(12,0.7) +% \psdot(\oenodeRefA{})\uput[90](\oenodeRefA{}){RefA} +% \psdot(\oenodeRefB{})\uput[90](\oenodeRefB{}){RefB} +% \rput[b](1.5,0){\opt{coupleralign=none}} +% \rput[b](6,0){\opt{coupleralign=top}} +% \rput[b](10.5,0){\opt{coupleralign=bottom}} +% \end{pspicture} +% \end{center} +% +% +% \ifGERMAN\section{Faserbox}\fi +% \ifENGLISH\section{Fiber box}\fi +% +% \begin{ltxsyntax} +% \xLfmultipole{fiberbox}% +% \compitem{fiberbox}(in)(out){label} +% \compitem*{fiberbox}(tl)(bl)(tr)(br){label} +% \end{ltxsyntax} +% +% \ifGERMAN +% Eine \Lcomp{fiberbox} kann entweder mit zwei, oder mit vier Knoten +% positioniert werden. Die Wahl beeinflusst die Position der Komponente +% und der Komponentenknoten und die automatischen Faserverbindungen. +% +% Werden nur zwei Knoten verwendet, dann sind das die Referenzknoten und +% der Abstand zwischen zwei benachbarten Eingangs- oder Ausgangsknoten +% muss manuell angegeben werden (siehe \Lkeyword{fiberboxsepin} und +% \Lkeyword{fiberboxsepout}). Nur die Seiten der Komponente wird +% automatische mit Fasern verbunden, die nur einen einzigen Knoten hat +% (siehe \Lkeyword{fiberboxcount} und das folgende Beispiel). +% \fi +% \ifENGLISH +% A \Lcomp{fiberbox} can be positioned either with two, or four nodes which +% affects the positioning of the component and the interface nodes, and the +% automatic fiber connections. +% +% If only two nodes are used these are the reference nodes and the separation +% between the components input and output nodes must be specified manually (see +% \Lkeyword{fiberboxsepin} and \Lkeyword{fiberboxsepout}). Only the side of the +% component is connected automatically which has a single node only (see +% \Lkeyword{fiberboxcount} and the following example). +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,5-5}] +\begin{pspicture}(3,2) + \fiberbox[fiberboxcount=1x2, showifcnodes](0,1)(3,1) + \psdot(\oenodeRefA{})\uput[90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[90](\oenodeRefB{}){RefB} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Werden vier Knoten verwendet, dann wird die Lage der Komponentenknoten +% und deren Abstand automatisch bestimmt. Die Komponente wird zwischen +% der Mitte der beiden Eingangsknoten und der Mitte der beiden +% Ausgangsknoten positioniert. Der erste Eingangsknoten wird an dem +% \prm{tl}-Knoten ausgerichtet, der letzte Eingangsknoten an dem +% \prm{bl}-Knoten. Die übrigen Eingangsknoten werden dazwischen +% gleichverteilt. Die Ausgangsknoten werden entsprechend behandelt. Die +% vier angegebenen Knoten werden automatisch mit den jeweils +% zugeordneten Komponentenknoten verbunden. +% \fi +% \ifENGLISH +% When four nodes are used the interface nodes and their separation are +% determined automatically. The component is positioned between the +% center of the two input and the center of the two output nodes. The +% first input interface node is aligned with the \prm{tl} node, the last +% input node is aligned with \prm{bl}, all other input nodes are equally +% distributed between these. The output nodes are handled +% accordingly. The four specified nodes are connected automatically to +% the component, each with the interface node it is aligned to. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,5-5}] +\begin{pspicture}(3,2) + \fiberbox[fiberboxcount=3x4, showifcnodes](0.5,1.6)(0,0.4)(2.5,2)(3,0) + \psdot(\oenodeRefA{})\uput[90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[90](\oenodeRefB{}){RefB} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \numitem[1]{fiberboxwidth} +% \ifGERMAN Die Breite der Faserbox.\fi +% \ifENGLISH The width of the fiber box.\fi +% +% \numitem[0]{fiberboxheight} +% \ifGERMAN Die Höhe der Faserbox. Ist die Höhe kleiner als der Platz +% der von den Eingangs- oder Ausgangsknoten benötigt wird, dann wird +% die Höhe automatisch berechnet. Die berechnete Höhe ist +% $\text{max}\,(\text{sepin}\times(\text{N}-1), +% \text{sepout}\times(\text{M}-1))$. +% \fi +% \ifENGLISH The height of the fiber box. If the height is lower than +% the space required by the input or output nodes, it is calculated +% automatically. The calculated height is +% $\text{max}\,(\text{sepin}\times(\text{N}-1), +% \text{sepout}\times(\text{M}-1))$. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.8) + \psset[optexp]{innerlabel, fiberboxwidth=1, fiberboxcount=1x2} + \fiberbox(0,2)(0,2)(3,2.5)(3,1.5){auto} + \fiberbox[fiberboxheight=1.05](0,0.5)(0,0.5)(3,1)(3,0){fix} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \optitem{fiberboxsize}{\prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe der Faserbox, ist äquivalent zum Aufruf von +% \Lkeyword{fiberboxwidth} und \Lkeyword{fiberboxheight}. +% \fi +% \ifENGLISH The width and height of the fiber box, is equivalent to calling +% both \Lkeyword{fiberboxwidth} and \Lkeyword{fiberboxheight}. +% \fi +% +% \numitem[0.2]{fiberboxsepin} +% \ifGERMAN Der Abstand zwischen zwei Eingangsknoten. Dieser Wert wird nur +% verwendet, falls die Faserbox mit zwei Knoten positioniert wird. Ansonsten +% wird der Abstand automatisch ermittelt wird. +% \fi +% \ifENGLISH The separation between two input nodes. This value is +% used only if the fiber box is positioned with two nodes. Otherwise +% the separation is calculated automatically. +% \fi +% +% \numitem[0.2]{fiberboxsepout} +% \ifGERMAN Analog zu \Lkeyword{fiberboxsepin}, aber für die Ausgangsknoten.\fi +% \ifENGLISH Equivalent to \Lkeyword{fiberboxsepout}, but for the output nodes.\fi +% +% \optitem[2x2]{fiberboxcount}{\prm{N}x\prm{M}} +% \ifGERMAN Anzahl der Eingangs- (\prm{N}) und Ausgangsknoten (\prm{M}).\fi +% \ifENGLISH Number of input (\prm{N}) and output nodes (\prm{M}).\fi +% \end{optionlist} +% +% \ifGERMAN Für bestimmte Parameterkombinationen ist eine \Lcomp{fiberbox} +% äquivalent zu einer \Lcomp{optbox}. +% \fi +% \ifENGLISH For certain parameter configurations a \Lcomp{fiberbox} is +% equivalent to an \Lcomp{optbox}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0.3)(3,2.6) + \psset[optexp]{label=0.6} + \fiberbox[fiberboxsize=1.2 0.6, fiberboxcount=1x1](0,2.5)(3,2.5){fiberbox} + \optbox[optboxsize=1.2 0.6, fiber](0,1)(3,1){optbox} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \psset{usefiberstyle=false} +% +% +% \ifGERMAN\chapter{Elektrische Komponenten}\fi +% \ifENGLISH\chapter{Electrical components}\fi +% \label{chap:electrcomp} +% +% \ifGERMAN\section{Koppler}\fi +% \ifENGLISH\section{Coupler}\fi +% +% \begin{ltxsyntax} +% \xLemultipole{eleccoupler}% +% \compitem{eleccoupler}(tl)(bl)(tr)(br){label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \eleccoupler(0,1.5)(0,0)(3,1.5)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \optitem[0.8]{eleccouplersize}{\prm{size} or \prm{width} \prm{height}} +% \ifGERMAN Die Breite und Höhe des Kopplers, wird nur ein Wert +% angegeben dann ist die Komponente quadratisch. +% \fi +% \ifENGLISH The width and height of the couplers, if only one value +% is given the component is squared. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]eleccouplersize}] +\begin{pspicture}(3,1.5) + \eleccoupler[eleccouplersize=1 0.6](0,1.5)(0,0)(3,1.5)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \numitem[\{\}]{eleccouplersep} +% \ifGERMAN Der vertikale Abstand zwischen den beiden Eingangs- +% bzw. Ausgangsanschlüssen. Ist der Wert leer, bzw. gleich \{\}, dann +% wird der Abstand auf 75\% der Höhe gesetzt. +% \fi +% \ifENGLISH The vertical distance between the two input and output +% ports. If the value is empty \{\}, then the separation is set to +% 75\% of the height. +% \fi +% +% \choitem[standard]{eleccouplertype}{standard, directional} +% \ifGERMAN Wählt zwischen unterschiedlichen Kopplertypen.\fi +% \ifENGLISH Select between different coupler types.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]eleccouplertype}] +\begin{pspicture}(3,1.5) + \eleccoupler[eleccouplertype=directional](0,1.5)(0,0)(3,1.5)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[left]{eleccouplerinput}{left, right} +% \ifGERMAN Gibt beim direktionalen Koppler die Eingangsseite an.\fi +% \ifENGLISH Selects the input side for the directional coupler.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]eleccouplerinput}] +\begin{pspicture}(3,1.5) + \eleccoupler[eleccouplertype=directional, eleccouplerinput=right](0,1.5)(0,0)(3,1.5)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN Die automatischen Verbindungen des elektrischen Kopplers +% sind, anders als beim optischen Koppler, alle auf die Komponente +% gerichtet. Das ergibt ein symmetrisches Layout der automatischen +% Verbindungen des elektrischen Kopplers bei Verwendung der Vorgabe +% \Lkeyword{wirestyle}\opt{=angle}. +% \fi +% \ifENGLISH The automatic connections of the electrical coupler are all +% directed towards the component, in contrast to the optical +% coupler. This gives a symmetric layout of the automatic electrical coupler +% connections when using the default of +% \Lkeyword{wirestyle}\opt{=angle}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,4) + \addtopsstyle{Wire}{arrows=->} + \addtopsstyle{Fiber}{arrows=->, fiberstyle=angle} + \eleccoupler(0,4)(0,2)(3,4)(3,2) + \optcoupler[couplersize=0.8 0.8, couplersep={}, couplertype=rectangle](0,1.5)(0,0)(3,1.5)(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Synthesizer}\fi +% \ifENGLISH\section{Synthesizer}\fi +% +% \begin{ltxsyntax} +% \xLemultipole{elecsynthesizer}% +% \compitem{elecsynthesizer}(in)(out){label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \elecsynthesizer(1,1)(3,1){SYN} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \elecsynthesizer[position=0.5](0,1)(3,1){SYN} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \begin{optionlist} +% \optitem[0.8]{synthsize}{\prm{size} or \prm{width} \prm{height}} +% \ifGERMAN Die Größe der Komponente, ist diese rund und wurden zwei +% Werte angegeben, dann wird der kleinere als Durchmesser verwendet. +% \fi +% \ifENGLISH The size of the component, if this is of circular shape +% and two values were given, the smaller one is used as diameter. +% \fi +% +% \choitem[sine]{synthtype}{sine, pulse, sawtooth, rectangle, triangle, custom} +% \ifGERMAN Wählt zwischen unterschiedlichen Typen.\fi +% \ifENGLISH Select between different synthesizer types.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]synthtype}] +\begin{pspicture}(0,0.6)(3,5.4) + \elecsynthesizer[synthtype=sine](1,5)(3,5) + \elecsynthesizer[synthtype=sawtooth](1,4)(3,4) + \elecsynthesizer[synthtype=triangle](1,3)(3,3) + \elecsynthesizer[synthtype=rectangle](1,2)(3,2) + \elecsynthesizer[synthtype=pulse](1,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Es kann auch eine frei wählbare Wellenform gewählt werden.\fi +% \ifENGLISH You can also use a freely customizable waveform.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]synthtype}] +\begin{pspicture}(0,0)(3,2) + \makeatletter + \def\elecsynthesizer@custom{% + \psline(-0.25,-0.1)(-0.1,-0.1)(-0.1,0)% + (0.1,0)(0.1,0.1)(0.25,0.1)} + \makeatother + \elecsynthesizer[synthtype=custom](1,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[circle]{synthshape}{circle, rectangle} +% \ifGERMAN Wählt zwischen kreisförmiger und rechteckiger Außenform.\fi +% \ifENGLISH Select between circular and rectangular outer shape.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]synthshape}] +\begin{pspicture}(3,1.5) + \elecsynthesizer[synthshape=rectangle](1,1)(3,1){SYN} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem{SynthStyle} +% \ifGERMAN Beinflusst das Aussehen der internen Symbole.\fi +% \ifENGLISH Change the style of the internal synthesizer symbol.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]SynthStyle}] +\begin{pspicture}(3,1) + \newpsstyle{SynthStyle}{xunit=0.5, yunit=-1} + \elecsynthesizer(1,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifGERMAN\section{Mixer}\fi +% \ifENGLISH\section{Mixer}\fi +% +% \begin{ltxsyntax} +% \xLemultipole{elecmixer}% +% \compitem{elecmixer}(left)(right)(bottom){label}% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \newpsstyle{Wire}{arrowscale=1.5, arrowinset=0, arrows=->} + \addtopsstyle{WireOut1}{linecolor=blue} + \addtopsstyle{WireOut2}{linecolor=green!80!black} + \elecmixer(0,1)(3,1)(1.5,0){Mixer} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.8]{elecmixersize} +% \ifGERMAN Der Durchmesser des Mixers.\fi +% \ifENGLISH The diameter of the mixer.\fi +% \end{optionlist} +% +% \ifGERMAN Weitere Details bezüglich der Referenzknoten und +% Positionierung finden Sie unter \Lcomp{optcirculator}. +% \fi +% \ifENGLISH For further details about the reference nodes and the +% positioning, please refer to \Lcomp{optcirculator}. +% \fi +% +% \ifGERMAN\chapter{Hybridkomponenten}\fi +% \ifENGLISH\chapter{Hybrid components}\fi +% \label{sec:hybridcomp} +% +% \ifENGLISH This chapter describes the components which can be used both for +% free-ray and fiber optics but which differ from these two categories. +% +% The \Lcomp{optfilter} is connected by default with automatic fiber +% connections, but can likewise be used with free-ray beams, in contrast +% to the fiber components (\prettyref{chap:fibercomp}). The +% \Lcomp{fibercollimator} has one interface only, the other connection is +% a fiber and the \Lcomp{optdetector} has one interface, the other +% connection is a wire. +% \fi +% \ifGERMAN Dieses Kapitel beschreibt die Komponenten, die sowohl für +% Freistrahl- als auch Faseroptik zu verwenden sind, sich von diesen aber etwas +% abgrenzen. +% +% Der \Lcomp{optfilter} wird mit den Voreinstellungen zwar als +% Faserkomponente gehandhabt, kann jedoch im Gegensatz zu den reinen +% Faserkomponenten (\prettyref{chap:fibercomp}) auch als +% Freistrahlkomponente verwendet werden. Der \Lcomp{fibercollimator} hat +% nur eine Faser, die andere Verbindung ist Freistrahl und der +% \Lcomp{optdetector} hat eine Freistrahl- und eine elektrische +% Verbindung. +% \fi +% +% \ifGERMAN\section{Optischer Filter}\fi +% \ifENGLISH\section{Optical filter}\fi +% +% \psset{usefiberstyle} +% \begin{ltxsyntax} +% \fiberdipoledesc{optfilter} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optfilter(0,1)(3,1){bandpass} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \numitem[0.8]{filtersize} +% \ifGERMAN Die Größe des Filters.\fi +% \ifENGLISH The size of the filter.\fi +% +% \choitem[bandpass]{filtertype}{bandpass, bandstop, lowpass, highpass} +% \ifGERMAN Wähle zwischen unterschiedlichen Filtertypen.\fi +% \ifENGLISH Select between different filter types.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{filtertype}}] +\begin{pspicture}(3,1.5) + \optfilter[filtertype=bandstop](0,1)(3,1){bandstop} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{filtertype}}] +\begin{pspicture}(3,1.5) + \optfilter[filtertype=lowpass](0,1)(3,1){lowpass} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[morekeywords={[21]{filtertype}}] +\begin{pspicture}(3,1.5) + \optfilter[filtertype=highpass](0,1)(3,1){highpass} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0]{filterangle} +% \ifGERMAN Dreht das «Innere» des Filters relativ zum seinem +% Rahmen. Anstattdessn kann auch \Lkeyword{innercompalign} verwendet +% werden. +% \fi +% \ifENGLISH Rotates the «inner» part of the filter relativ to its +% frame. Alternatively \Lkeyword{innercompalign} can be used. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{filterangle}}] +\begin{pspicture}(2,2) + \optfilter(0.5,0)(0.5,2) + \optfilter[filterangle=90](1.5,0)(1.5,2) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem{FilterStyle} +% \ifGERMAN Beinflusst das Aussehen der internen Filterlinien.\fi +% \ifENGLISH Change the style of the internal filter lines.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]FilterStyle}] +\begin{pspicture}(3,1.5) + \newpsstyle{OptComp}{linewidth=2\pslinewidth} + \optfilter(0,1)(1.5,1) + \newpsstyle{FilterStyle}{linewidth=0.5\pslinewidth} + \optfilter(1.5,1)(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% \ifGERMAN Verwendung als Freistrahlkomponenten, \Lkeyword{allowbeaminside} ist +% auf \opt{false} voreingestellt: +% \fi +% \ifENGLISH Usage as free-ray component, \Lkeyword{allowbeaminside} is set to +% \opt{false} by default: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \optfilter[fiber=none](0,1)(3,1) + \addtopsstyle{Beam}{beamwidth=0.3, + fillstyle=solid, fillcolor=green, opacity=0.2} + \drawwidebeam(0,1){}(3,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% +% \ifGERMAN\section{Faserkollimator}\fi +% \ifENGLISH\section{Fiber collimator}\fi +% +% \begin{ltxsyntax} +% \xLdipole{fibercollimator}\compitem{fibercollimator}(in)(A)(B)(out){label}% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \fibercollimator[beam](0,1)(3,1){FC} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN +% Der Faserkollimator kann mit zwei, drei oder vier Punkten verwendet +% werden. Bei zwei Punkten wird der Kollimator wie jeder andere Zweipol zwischen +% \prm{in} und \prm{out} Knoten platziert. Bei drei Punkten wird eine +% \Lcs*{psbezier} Kurve gezeichnet, wobei der mittlere Punkt doppelt verwendet +% wird. Die Positionierungsparameter (siehe \prettyref{sec:positioning}) können +% verwendet werden um den Kollimator zwischen dem \prm{in} und \prm{A} Knoten +% auszurichten. +% \fi +% \ifENGLISH +% The fiber collimator can be used with two, three or four points. With two +% points, the collimator is placed like any other dipole component between +% \prm{in} and \prm{out} node. For three nodes, the fiber is drawn as +% \Lcs*{psbezier} curve for which the central node \prm{A} is used +% twice. Positioning parameters (see \prettyref{sec:positioning}) can be used to +% shift the object between \prm{in} and \prm{A} nodes. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \fibercollimator[beam](0,1)(2,1)(3,2){FC} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \medskip +% +% \ifGERMAN +% Bei vier Knoten wird eine \Lcs*{psbezier} Kurve mit allen vier Knoten +% gezeichnet. Die Positionierungsparameter (siehe \prettyref{sec:positioning}) +% können verwendet werden um den Kollimator zwischen den ersten beiden Knoten +% (\prm{in} und \prm{A}) zu verschieben. +% \fi +% \ifENGLISH +% For four nodes, the fiber is drawn as \Lcs*{psbezier} curve with the specified +% nodes. Positioning parameters (siehe \prettyref{sec:positioning}) can be used +% to shift the object between the first two nodes (\prm{in} and \prm{A}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \fibercollimator[beam](0,1)(2,1)(3,1)(3,2){FC} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \optitem[0.3]{fibercolsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Eine einzelne Zahl gibt die Seitenlänge des Kollimators an, zwei Zahlen die Breite und +% Höhe. Beachten Sie, dass \opt{fibercolsize=1} und \opt{fibercolsize=1 1} nicht +% dasselbe Ergebnis liefern. Alternativ kann das Verhältnis zwischen Höhe und +% Breite mit \opt{xunit} und \opt{yunit} geändert werden. +% \fi +% \ifENGLISH +% A single number gives the side length of the collimator, two numbers the width +% and height. Note, that \opt{fibercolsize=1} and \opt{fibercolsize=1 1} do not give +% the same result. You may also change the relation of width and height with +% \opt{xunit} and \opt{yunit}. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Detektor}\fi +% \ifENGLISH\section{Detector}\fi +% +% \begin{ltxsyntax} +% \dipoledesc{optdetector} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.2) + \optdetector[beam](0,0)(1.5,1){detector} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH The detector is placed by default at the end of the +% reference line (\Lkeyword{position}\opt{=end}). If this setting is +% overwritten, the output connection is treated like that of an +% electrical component. +% \fi +% \ifGERMAN Der Detektor wird in der Voreinstellung ans Ende der +% Referenzlinie platziert (\Lkeyword{position}\opt{=end}). Wird dieser +% Parameter überschrieben, dann wird die ausgehende Verbindung wie bei +% einer elektrischen Komponente behandelt. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.2) + \optdetector[position=0.5](0,0)(1.5,1){detector} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \optitem[0.8]{detsize}{\prm{num} or \prm{width} \prm{height}} +% \ifGERMAN +% Wenn eine einzelne Zahl angegeben ist, dann ist das die Seitenlänge +% (\opt{diode}) bzw. der Durchmesser (\opt{round}) des Detektors. Werden zwei +% Zahlen angegeben, so sind das Breite und Höhe des Detektors. Beachten Sie, +% dass \opt{detsize=1} und \opt{detsize=1 1} für \opt{dettype=round} nicht dasselbe ist. +% \fi +% \ifENGLISH +% If a single number is given it is the side length (\opt{diode}) or the +% diameter (\opt{round}) of the detector. Two numbers define the width and +% height of the detector. Note, that \opt{detsize=1} and \opt{detsize=1 1} are +% not equivalent for \opt{dettype=round}. +% \fi +% +% \choitem[round]{dettype}{round, diode} +% \ifGERMAN +% Dieser Parameter bestimmt den Typ und damit das Aussehen des Detektors. +% \fi +% \ifENGLISH +% This parameter selects between different types of detectors. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{dettype}}] +\begin{pspicture}(3,1.5) + \optdetector[beam, dettype=diode](0,0)(1.5,1){detector} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \begin{stylelist} +% \styleitem{DetectorStyle} +% \ifGERMAN +% Der Stil der Diode für \Lkeyword{dettype}\opt{=diode}. +% \fi +% \ifENGLISH +% The style of the diode for \Lkeyword{dettype}\opt{=diode}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \newpsstyle{OptComp}{linewidth=3\pslinewidth} + \newpsstyle{DetectorStyle}{linewidth=0.333\pslinewidth} + \optdetector[dettype=diode](0,1)(2,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% +% \ifGERMAN\chapter{Spezielle Knoten}\fi +% \ifENGLISH\chapter{Special nodes}\fi +% \label{sec:objnodes} +% +% \ifGERMAN +% Jedes \nxLPack{pst-optexp}-Objekt stellt mehrere spezielle Knoten zur +% Verfügung, die mit dessen Geometrie und Positionierung zusammenhängen. Diese +% Knoten stehen für weitere Verwendung zur Verfügung. +% +% Sie sollten immer die dafür vorgesehenen Makros verwenden um auf die +% Knotennamen zuzugreifen. +% \fi +% \ifENGLISH +% Every \nxLPack{pst-optexp} object of an experimental setup provides +% several special nodes which are related to its geometry and +% positioning. They can be accessed and used for related positioning and +% drawing. +% +% You should always use the dedicated macros to access these node names. +% \fi +% \begin{ltxsyntax} +% \cmditem{oenode}{node}{comp} +% +% \ifGERMAN +% Das ist das grundlegende Makro mit dem auf die Knotennamen einer Komponente +% zugegriffen werden kann. Das erste Argument \prm{node} ist der Bezeichner des +% angeforderten Knotens. Das zweite Argument \prm{comp} ist der Name der +% Komponente (gemäß \prettyref{sec:namingobj}). Ist dieses leer so wird das +% zuletzt definierte Objekt verwendet. +% +% Für viele der Knoten wird ein eigenes Makro bereitgestellt, das Sie dann auch +% verwenden sollten, da sich die Namenskonventionen ändern könnten. Die Makros +% stellen sicher, dass Sie immer die passenden Knotennamen erhalten. Daher sind +% die verfügbaren Bezeichner auch nicht aufgelistet. +% \fi +% \ifENGLISH +% This is the basic command to access any node associated with a certain +% component. The first argument \prm{node} is the identifier of the requested +% node. The second argument \prm{comp} is the name of the target component +% (according to \prettyref{sec:namingobj}). If left empty, it uses the last +% component defined. +% +% For most special nodes an appropriate macro is provided, which you are +% strongly advised to use, because the naming conventions may change. Using the +% macros makes sure, that you always get the correct node names. Therefore, the +% available identifiers are not listed explicitely. +% \fi +% \end{ltxsyntax} +% +% \begin{optionlist} +% \optitem[new]{namingscheme}{old, new} +% \ifGERMAN +% Diese Option ist nur aus Kompatibilitätsgründen vorhanden. In Version 2.1 +% mussten spezielle Komponentenknoten über ihren expliziten Namen angesprochen +% werden. Sie sollten diese Option nur dann verwenden und auf \opt{old} +% setzen, wenn Sie in älteren Dokumenten direkt auf die Knoten zugegriffen +% haben. Seit Version 3.0 werden Makros für den Zugriff auf die +% Komponentenknoten bereitgestellt, so dass das eigentliche Namensschema +% unerheblich ist. +% \fi +% \ifENGLISH +% This option is for backward compatibility only. In version 2.1 special +% component nodes had to be accessed by their explicit name. You should use +% this option only if you accessed internal nodes directly in old +% documents. Since version 3.0 explicit macros are provided to access all +% special component nodes, so that the actual naming scheme does not matter. +% \fi +% +% \boolitem[false]{showoptdots} +% \ifGERMAN +% Markiert einige der speziellen Komponentenknoten: die schwarzen Punkte sind +% die normalen und die schwarzen Kreuze die transformierten Referenzknoten +% (\prettyref{sec:refnode}), der rote Punkt ist der Mittelpunktknoten +% (\prettyref{sec:centernode}) und das rote Kreuz der Beschriftungsknoten +% (\prettyref{sec:labelnode}). +% \fi +% \ifENGLISH +% Draw some special component nodes for debugging: The black points are the +% normal and the black crosses are the transformed reference nodes +% (\prettyref{sec:refnode}), the red point is the center node +% (\prettyref{sec:centernode}), and the red cross is the label node +% (\prettyref{sec:labelnode}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) +\mirror[showoptdots, angle=10, beam](0,1)(1.9,1)(1.9,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Komponenten-Bezeichner}\fi +% \ifENGLISH\section{Component identifiers}\fi +% \label{sec:namingobj} +% +% \ifGERMAN +% Alle Komponenten einer Aufbauskizze werden in Reihenfolge ihrer Definition im +% Code aufsteigend nummeriert, angefangen bei \opt{1}. Die Komponenten und deren +% Spezialknoten können immer über diese Nummer (ID) referenziert werden. +% +% IDs können auch relativ zur aktuellen ID über die Syntax +% \opt{<}\prm{num} angegeben werden: \opt{<1} ist die vorletzte ID, +% \opt{<2} die vorvorletzte ID usw. Die vorletzte ID kann abgekürzt auch +% mit \opt{<} erhalten werden, und die aktuelle ID mit \opt{<0}, was +% äquivalent zu einem leeren Parameter ist. +% \fi +% \ifENGLISH +% All components of a setup drawing are numbered automatically in increasing +% order according to their definition in the code, starting with \opt{1}. The +% components as well as their special nodes can always be accessed by this +% number (ID). +% +% ID specifications relative to the current ID can be used with the +% syntax \opt{<}\prm{num}: \opt{<1} is the previous ID, \opt{<2} is the +% current ID minus two etc. The previous ID can also be accessed by only +% \opt{<}, and the current ID is \opt{<0}, which is equivalent to an +% empty parameter. +% \fi +% +% \begin{optionlist} +% \valitem{compname}{string} +% \ifGERMAN +% Weist einer Komponente einen Bezeichner zu. Die Komponente kann nun sowohl +% über diesen Bezeichner als auch über die ID referenziert werden. Dieser +% Parameter kann nur im optionalen Argument einer \nxLPack{pst-optexp} +% Komponente verwendet werden. Der Bezeichner sollte innerhalb einer +% \Lenv*{pspicture}-Umgebung eindeutig sein. +% \fi +% \ifENGLISH +% Assigns a name identifier to a component, which can then be +% referenced both by this name and by its ID. The parameter can be +% assigned only locally, i.e. in the optional argument of a +% \nxLPack{pst-optexp} component, and should be unique within one +% \Lenv*{pspicture} environment. +% \fi +% \end{optionlist} +% +% \ifGERMAN Beispiele für unterschiedliche Methoden auf ein und +% dieselbe Komponente zuzugreifen. +% \fi +% \ifENGLISH Examples for different methods to access the same +% component. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\ifGERMAN +\begin{LTXexample} +\begin{pspicture}(2,2) + \optbox[compname=MyBox](0,1)(2,2) + \psdot[linecolor=red](\oenodeIn{MyBox}) % Verwende den Namen + \psdot[linecolor=blue](\oenodeOut{1}) % Verwende die ID + \psdot[linecolor=green](\oenodeCenter{})% Nimm die letzte Komponente +\end{pspicture} +\end{LTXexample} +\fi\ifENGLISH +\begin{LTXexample} +\begin{pspicture}(2,2) + \optbox[compname=MyBox](0,1)(2,2) + \psdot[linecolor=red](\oenodeIn{MyBox})% use the compname + \psdot[linecolor=blue](\oenodeOut{1}) % use the ID + \psdot[linecolor=green](\oenodeCenter{}) % the last component +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Die Verwendung von relativen IDs ist u.a. nützlich, um eine neue +% Komponente relativ zur vorangegangenen zu definieren. Die Verwendung +% von z.B. \Lcs{oenodeOut}\opt{\{\}} in den Referenzknoten ist nicht +% möglich, da hiermit zum Zeitpunkt der Auswertung der Koordinaten schon +% auf die neue, nicht fertige Komponente referenziert wird. Ein Aufruf +% der Art \lstinline!\optbox(\oenodeOut{})(B)! ist daher nicht möglich, +% und führt zu einem Fehler. Mit relativen IDs kann das allerdings mit +% \lstinline!\optbox(\oenodeOut{<})(B)! erreicht werden: +% \fi +% \ifENGLISH +% Using relative IDs can be very handy to define a component relative to +% the previous one. It is not possible to use +% e.g. \Lcs{oenodeOut}\opt{\{\}} as reference node, because at the time +% these coordinates are evaluated, they reference to the new, not yet +% defined component. A call like \lstinline!\optbox(\oenodeOut{})(B)! +% is, therefore, not possible and gives an error. With relative IDs one +% can achieve that with \lstinline!\optbox(\oenodeOut{<})(B)!: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(4,2) + \psset{optboxsize=0.4 0.8, abspos=0.5} + \optbox(0,1)(4,1) + \multido{}{3}{\optbox(\oenodeOut{<})(4,1)} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Referenzknoten}\fi +% \ifENGLISH\section{Reference nodes}\fi +% \label{sec:refnode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeRefA}{comp} +% \cmditem{oenodeRefB}{comp} +% +% \ifGERMAN +% Die Eingangs- und Ausgangs-Referenzknoten. +% +% Das sind die ursprünglichen Knoten, die für die Positionierung der Komponente +% benutzt wurden, \nxLcs{oenodeRefA} ist der erste und \nxLcs{oenodeRefB} der +% letzte Knoten. Diese Zuordnung ist nicht gültig für Faserkoppler +% (\ref{sec:coupler-refnodes}) und Zirkulatoren (\compref{optcirculator}). +% \fi +% \ifENGLISH +% The input and output reference nodes. +% +% These are the original nodes which were used for the component positioning, +% \nxLcs{oenodeRefA} is the first and \nxLcs{oenodeRefB} the last node. This +% definition is not valid couplers (\ref{sec:coupler-refnodes}) and circulators +% (\compref{optcirculator}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, linerange={1-3, 4-7}] +\begin{pspicture}(5,1) + \pnodes(0.5,0.5){A}(4.5,0.5){B} + \optbox(A)(B) + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \cmditem{oenodeTrefA}{comp} +% \cmditem{oenodeTrefB}{comp} +% +% \ifGERMAN +% Die transformierten Eingangs- und Ausgangs-Referenzknoten. +% +% Das sind die Referenzknoten nachdem sie zusammen mit der Komponente gemäß +% der \Lkeyword{compshift} und \Lkeyword{angle} Parameter transformiert wurden. +% \fi +% \ifENGLISH +% The transformed input and output reference nodes. +% +% These are the input and output reference nodes which are transformed +% together with the component according to the \Lkeyword{compshift} and +% \Lkeyword{angle} parameters. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, linerange={1-3,5-9}] +\begin{pspicture}(5,1.8) + \pnodes(0.5,0.5){A}(4.5,0.5){B} + \optbox[compshift=0.5, angle=10](A)(B) + \psline[style=Refline](\oenodeTrefA{})(\oenodeTrefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot(\oenodeTrefA{})\uput[90](\oenodeTrefA{}){TrefA} + \psdot(\oenodeTrefB{})\uput[90](\oenodeTrefB{}){TrefB} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN\section{Mittelpunktknoten}\fi +% \ifENGLISH\section{Center node}\fi +% \label{sec:centernode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeCenter}{comp} +% +% \ifGERMAN +% Dieser Knoten liegt, bis auf wenige Ausnahmen, wie +% z.B. \Lcomp{optdetector} und \Lcomp{optcoupler} (siehe unten), im +% Mittelpunkt der Komponente. +% \fi +% \ifENGLISH +% This node lays, except for a few components like +% e.g. \Lcomp{optcirculator} and \Lcomp{optcoupler} (see below), in the +% center of the component. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2, 5-5, 8-8}] +\begin{pspicture}(3,2) + \optbox(0,0.5)(3,0.5) + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeCenter{}) + \optdetector(0,1.5)(2.5,1.5) + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Bei \Lcomp{optcoupler} hängt die Position der Komponentenmitte +% von den \Lkeyword{coupleralign} Einstellungen ab. +% \fi +% \ifENGLISH For \Lcomp{optcoupler} the position of the component center +% depends on the \Lkeyword{coupleralign} settings. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0.3)(3,3) + \psset[optexp]{couplersize=0.6 0.4, couplersep=0.2, couplertype=rectangle} + \optcoupler(0,3)(0,2)(3,3)(3,2) + \psdot(\oenodeCenter{}) + \optcoupler[coupleralign=b](0,1.5)(0,0.5)(3,1.5)(3,0.5) + \psdot(\oenodeCenter{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN\section{Beschriftungsknoten}\fi +% \ifENGLISH\section{Label node}\fi +% \label{sec:labelnode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeLabel}{comp} +% +% \ifGERMAN +% Auf diesen Knoten wird die Beschriftung platziert. Der Knoten ist auch +% verfügbar wenn keine Beschriftung angegeben wurde. Für +% \Lkeyword{labeloffset}\opt{=0} ist dieser Knoten +% identisch mit dem Mittelpunktsknoten (\prettyref{sec:centernode}). +% \fi +% \ifENGLISH +% The component label is placed at this node. It is also available +% if no label was specified. The label node is identical with the center +% node for \Lkeyword{labeloffset}\opt{=0}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-2,5-5}] +\begin{pspicture}(3,1.5) + \optbox(0,1)(3,1) + \psline[style=Refline](\oenodeTrefA{})(\oenodeTrefB{}) + \psdot(\oenodeLabel{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN\section{Externe Knoten}\fi +% \ifENGLISH\section{External nodes}\fi +% \label{sec:extnode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeExt}{comp} +% +% \ifGERMAN +% Ein externer Knoten kann an unterschiedliche Positionen entlang des +% Komponentenrandes gesetzt werden. Dieser wird nur für den externen Zugriff +% definiert, und beeinflusst in keiner Weise die Komponente. +% \fi +% \ifENGLISH +% An external node can be placed at different positions along the component +% boundary. It gets defined only for external usage and does not affect the +% component in any way. +% \fi +% \end{ltxsyntax} +% \begin{optionlist} +% \valitem{extnode}{refpoint} +% \ifGERMAN +% Bestimmt die Position des externen Knotens. \refpointexplanation Nicht +% jede Komponente unterstützt alle möglichen Kombinationen, die möglichen +% Positionen jeder Komponente sind in \prettyref{sec:overview-extnode} +% zusammengefasst. +% \fi +% \ifENGLISH +% Set the position of the external node. \refpointexplanation Not all +% components support any possible combination. The allowed positions of each +% component are listed in \prettyref{sec:overview-extnode}. +% \fi +% +% \begin{pspicture}(6,2.5) +% \addtopsstyle{Beam}{beaminside=false, arrows=->, arrowinset=0, arrowscale=1.5} +% \psset{optboxsize=2.5 1.5}\ttfamily +% \pnodes(0,1.25){A}(6,1.25){B} +% \optbox[beam, extnode=tl](A)(B) +% \psdot(\oenodeExt{})\uput[135](\oenodeExt{}){tl} +% \backlayer{% +% \optbox[extnode=t](A)(B)\psdot(\oenodeExt{})\uput[90](\oenodeExt{}){t} +% \optbox[extnode=tr](A)(B)\psdot(\oenodeExt{})\uput[90](\oenodeExt{}){tr} +% \optbox[extnode=r](A)(B)\psdot(\oenodeExt{})\uput[45](\oenodeExt{}){r} +% \optbox[extnode=br](A)(B)\psdot(\oenodeExt{})\uput[-90](\oenodeExt{}){br} +% \optbox[extnode=b](A)(B)\psdot(\oenodeExt{})\uput[-90](\oenodeExt{}){b} +% \optbox[extnode=bl](A)(B)\psdot(\oenodeExt{})\uput[-90](\oenodeExt{}){bl} +% \optbox[extnode=l](A)(B)\psdot(\oenodeExt{})\uput[135](\oenodeExt{}){l} +% \optbox[extnode=c](A)(B)\psdot(\oenodeExt{})\uput[180](\oenodeExt{}){c} +% } +% \end{pspicture} +% +% \choitem[abs]{extnodealign}{rel,relative,abs,absolute} +% \ifGERMAN +% Die Bezeichnung von «oben» (\opt{t}) und den anderen Positionierungsparametern +% von \Lkeyword{extnode} können absolut oder relativ zur Komponente betrachtet +% werden. +% +% In dem folgenden Beispiel ist der externe Knoten immer «oben rechts» +% (\opt{tr}) platziert, unabhängig von der Reihenfolge der Referenzknoten +% (\opt{extnodealign=abs}). Das Verhalten ist identisch zu +% \Lkeyword{labelref}\opt{=relative} für die Ausrichtung der Beschriftung. +% \fi +% \ifENGLISH +% The definition of «top» (\opt{t}) and the other \Lkeyword{extnode} refpoint +% parameters can be absolute or relative to the component. +% +% In the following example the external node is always placed «top right» +% independent of the actual order of the reference nodes +% (\opt{extnodealign=abs}). The behaviour is identical to the label rotation for +% \Lkeyword{labelref}\opt{=relative}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]extnodealign}] +\begin{pspicture}(-2,-2)(2,2) + \psset{endbox, optboxsize=1 0.6, dotscale=1.5} + \psset{extnodealign=abs, extnode=tr} + \multido{\i=0+45}{8}{% + \optbox[innerlabel](0,0)(1;\i){\i} + \psdot(\oenodeExt{}) + }% +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[morekeywords={[21]extnodealign}] +\begin{pspicture}(-2.2,-2.2)(2.2,2.2) + \psset{dotscale=1.5, mirrortype=extended, mirrordepth=0.5, label=0.25 . . relative, extnodealign=abs, extnode=tr} + \newpsstyle{ExtendedMirror}{} + \multido{\i=0+45,\ii=-45+45}{8}{% + \mirror(0,0)(1.5;\i)(2.1212;\ii){\i} + \psdot(\oenodeExt{}) + }% +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% In dem darauffolgenden Beispiel bezieht sich die Positionierung relativ zur +% Verbindung zwischen Eingangs- und Ausgangsreferenzknoten +% (\opt{extnodealign=rel}). +% \fi +% \ifENGLISH +% In the next example the position is relative to the order of input and output +% reference node (\opt{extnodealign=rel}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]extnodealign}] +\begin{pspicture}(-2,-2)(2,2) + \psset{endbox, optboxsize=1 0.6, dotscale=1.5} + \psset{extnodealign=rel, extnode=tr} + \multido{\i=0+45}{8}{% + \optbox[innerlabel](0,0)(1;\i){\i} + \psdot(\oenodeExt{}) + }% +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[morekeywords={[21]extnodealign}] +\begin{pspicture}(-2.2,-2.2)(2.2,2.2) + \psset{dotscale=1.5, mirrortype=extended, mirrordepth=0.5, label=0.25 . . relative, extnodealign=abs, extnode=tr} + \newpsstyle{ExtendedMirror}{} + \multido{\i=0+45,\ii=-45+45}{8}{% + \mirror(0,0)(1.5;\i)(2.1212;\ii){\i} + \psdot(\oenodeExt{}) + }% +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \valitem{extnodes}{list} +% \ifGERMAN Erlaubt die Definition mehrerer externer Knoten, \prm{list} +% ist eine Liste von \prm{refpoint}, wie sie von \Lkeyword{extnode} +% verwendet werden. Der erste Knoten kann wie gewohnt mit +% \Lcs{oenodeExt} angesprochen werden (ist äquivalent zu +% \Lcs{oenode}{\{Ext\}} und \Lcs{oenode}{\{Ext1\}}). Für alle weiteren +% Knoten muss \Lcs{oenode} mit den Knotenbezeichnungen +% \opt{Ext}\prm{num} verwendet werden: \Lcs{oenode}\opt{\{Ext1\}} für den +% ersten, \Lcs{oenode}{\{Ext2\}} für den zweiten usw. +% \fi +% \ifENGLISH +% Define multiple external nodes, with their \prm{refpoints} given in +% the \prm{list} and separated by commas. The first node can be accessed +% as usual with \Lcs{oenodeExt} (is equivalent to \Lcs{oenode}{\{Ext\}} +% and \Lcs{oenode}{\{Ext1\}}). All additional nodes must be accessed +% with \Lcs{oenode} and the node label \opt{Ext}\prm{num}: +% \Lcs{oenode}{\{Ext1\}} for the first one, \Lcs{oenode}{\{Ext2\}} for +% the second, etc. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]extnodes}, linerange={1-3,5-5}] +\begin{pspicture}(3,2) + \optbox[extnodes={tl,tr,br,bl}](0,1)(3,1) + \multido{\i=1+1}{4}{\psdot[dotstyle=o](\oenode{Ext\i}{})}% + \multido{\i=1+1,\ii=135+-90}{4}{\uput[\ii](\oenode{Ext\i}{}){Ext\i}}% +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Grenzflächenknoten}\fi +% \ifENGLISH\section{Interface nodes}\fi +% \label{sec:ifcnode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeIfc}{num}{comp} +% +% \ifGERMAN +% Der Grenzflächenknoten \prm{num}, wobei \prm{num} eine positive +% Ganzzahl oder der Buchstabe \opt{N} ist. Der letzte Knoten ist immer +% \opt{N}, kann aber auch über die entsprechende Zahl angesprochen +% werden. +% \fi +% \ifENGLISH +% The interface node \prm{num}, where the number is a positive integer +% or the character \opt{N}. The last node is always defined as \opt{N} +% but can also be accessed via its number. +% \fi +% +% \cmditem{oenodeIn}{comp} +% +% \ifGERMAN +% Der Knoten \prm{1} ist der Eingangsknoten und sollte immer über +% \nxLcs{oenodeIn} angesprochen werden. +% \fi +% \ifENGLISH +% The interface node \prm{1} is the input node and should always be accessed +% via \nxLcs{oenodeIn}. +% \fi +% +% \cmditem{oenodeOut}{comp} +% +% \ifGERMAN +% Der Knoten \opt{N} ist der Ausgangsknoten und sollte +% immer über \nxLcs{oenodeOut} angesprochen werden. +% \fi +% \ifENGLISH +% The interface node \prm{N} is the output node and should always be accessed +% via \nxLcs{oenodeOut}. +% \fi +% +% \ifGERMAN +% «Eingang» und «Ausgang» können nur anhand einer relativen Orientierung +% definiert werden. Per Definition ist der Eingangsknoten derjenige zu dem ein +% Lichtstrahl ausgehend vom Referenzknoten \Lcs{oenodeRefA} verläuft. Analog +% dazu ist die Definition ds Ausgangsknotens. Diese Bezeichnung kann nur für +% Faserkoppler (siehe \prettyref{sec:coupler-nodes}) und Strahlteiler +% (\compref{beamsplitter}) nicht angewendet werden. +% +% \nxLcs{oenodeIn} ist äquivalent zu \nxLcs{oenodeIfc\{1\}} und +% \nxLcs{oenodeOut} ist äquivalent zu \nxLcs{oenodeIfc\{N\}}. Die Eingangs- +% und Ausgangsknoten sollten über die explizit bereitgestellten Makros +% angesprochen werden, \nxLcs{oenodeIfc} sollte nur für die weiteren +% Grenzflächenknoten, sofern vorhanden, verwendet werden. +% \fi +% \ifENGLISH +% «Input» and «output» can define only relative orientations. The input node +% is by definition the node to which a beam coming from the reference node +% \Lcs{oenodeRefA} is connected to. Correspondingly is the definition of the +% output node. This definition breaks down only for fiber couplers (see +% \prettyref{sec:coupler-nodes}) and beamsplitter (\compref{beamsplitter}). +% +% \nxLcs{oenodeIn} is equivalent to \nxLcs{oenodeIfc\{1\}} and +% \nxLcs{oenodeOut} is equivalent to \nxLcs{oenodeIfc\{N\}}. You should use +% the \nxLcs{oenodeIfc} macro only to access the nodes which are not the input +% and output nodes as for those explicit macros are provided. +% \fi +% \end{ltxsyntax} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(2.8,3) + \pentaprism[pentaprismsize=1.3](0,1.5)(1.5,1.5)(1.5,0) + \drawbeam[arrows=->, arrowinset=0, arrowscale=1.5](0,1.5){}(1.5,0) + \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} + \psdot(\oenodeIfc{2}{})\uput[0](\oenodeIfc{2}{}){2} + \psdot(\oenodeIfc{3}{})\uput[90](\oenodeIfc{3}{}){3} + \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% In \prettyref{sec:overview-ifcnode} finden Sie eine vollständige Liste aller +% Komponenten mit ihren Grenzflächenknoten. +% \fi +% \ifENGLISH +% See \prettyref{sec:overview-ifcnode} for a complete list of all +% components with their interface nodes. +% \fi +% +% \ifGERMAN\section{Referenzknoten für die Rotation}\fi +% \ifENGLISH\section{Rotation reference node}\fi +% \label{sec:rotrefnode} +% +% \begin{ltxsyntax} +% \cmditem{oenodeRotref}{comp} +% +% \ifGERMAN +% Der Referenzknoten um den eine Komponente mit \Lkeyword{angle} gedreht +% wird. Die Position des Knotens wird mit dem \Lkeyword{rotateref} Parameter +% definiert und kann dieselben Werte annehmen wie \Lkeyword{extnode}. Eine +% vollständige Liste der möglichen Positionen finden Sie in +% \prettyref{sec:overview-extnode}. +% \fi +% \ifENGLISH +% The node around which a component is rotated by \Lkeyword{angle}. The +% position is defined with the \Lkeyword{rotateref} parameter and can take the +% same values as \Lkeyword{extnode}. See \prettyref{sec:overview-extnode} for +% possible rotation reference nodes of all components. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, linerange={1-2, 6-7, 11-12}] +\begin{pspicture}(0,0.1)(12,1.8) + \optbox[angle=20](0.5,1)(4.5,1) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRotref{})\uput[-90](\oenodeRotref{}){Rotref} + \optbox[angle=20, rotateref=bl](7.5,1)(11.5,1) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psline[style=Refline](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRotref{})\uput[-90](\oenodeRotref{}){Rotref} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN\section{Strahlknoten}\fi +% \ifENGLISH\section{Beam nodes}\fi +% \label{sec:beamnode} +% +% \ifGERMAN +% Die Endknoten eines \Lcs{drawbeam} oder \Lcs{drawwidebeam} Kommandos +% können wieder verwendet werden, wenn \Lkeyword{savebeampoints} gesetzt ist. +% \fi +% \ifENGLISH +% The end points of a recent \Lcs{drawbeam} or \Lcs{drawwidebeam} command can +% be reused if \Lkeyword{savebeampoints} is set. +% \fi +% \begin{ltxsyntax} +% \cmditem{oenodeBeam}{num} +% +% \ifGERMAN +% Damit wird der Endknoten eines vorangegangenen \Lcs{drawbeam} Kommandos +% angesprochen. Wird \prm{num} leer gelassen so wird \opt{1} genommen, was in +% der Regel dem letzten Strahlengang entspricht. Auf welchen Strahl genau +% Bezug genommen wird, hängt i.a. von den gewählten Einstellungen von +% \Lkeyword{savebeampoints} und entsprechender Wahl von \prm{num} ab. +% \fi +% \ifENGLISH +% Access the end point of a preceeding \Lcs{drawbeam} command. If \prm{num} is +% left empty it defaults to \opt{1} which usually refers to the last beam +% ray. However, generally it depends on the settings of +% \Lkeyword{savebeampoints} and the choice of \prm{num} which beam you refer +% to. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0)(3,2) + \pnodes(0,1){A}(1.6,1){B} + \optbox[position=end](A)(B) + \drawbeam[beaminsidelast=false](A){1} + \psdot(\oenodeBeam{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \cmditem{oenodeBeamUp}{num} +% \cmditem{oenodeBeamLow}{num} +% +% \ifGERMAN +% Damit wird der obere («upper») oder untere («lower») Endknoten eines +% vorangegangenen \Lcs{drawwidebeam} Kommandos angesprochen. Wird \prm{num} +% leer gelassen so wird \opt{1} genommen, womit man sich in der Regel auf den +% letzten Strahlengang bezieht. Auf welchen Strahl genau Bezug genommen wird, +% hängt i.a. von den gewählten Einstellungen von \Lkeyword{savebeampoints} und +% entsprechender Wahl von \prm{num} ab. +% \fi +% \ifENGLISH +% Access the upper or lower end point of a preceeding \Lcs{drawwidebeam} +% command. If \prm{num} is left empty it defaults to \opt{1}, which usually +% refers to the last beam ray. However, generally it depends on the settings +% of \Lkeyword{savebeampoints} and the choice of \prm{num} which beam you +% refer to. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,10-10}] +\begin{pspicture}(0,0)(3,2) + \pnodes(0,1){A}(3,1){B} + \lens[abspos=1, lensradius=-2](A)(B) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \drawwidebeam[beamwidth=0.5](A){}(B) + \psdot(\oenodeBeamUp{})\psdot(\oenodeBeamLow{}) + \uput[90](\oenodeBeamUp{}){\rput[rb](0,0){BeamUp}} + \uput[-90](\oenodeBeamLow{}){\rput[rt](0,0){BeamLow}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Beachten Sie, dass «oben» («upper») und «unten» («lower») bezüglich der +% Ausbreitungsrichtung des Strahls definiert ist. Ein Randstrahl der als «upper» +% startet can zu «lower» werden, wenn er den anderen Randstrahl kreuzt. Das wird +% in dem folgenden Beispiel erläutert: +% \fi +% \ifENGLISH +% Note, that «upper» and «lower» is defined with respect to the propagation +% direction of the beam. A marginal beam which started as «upper» can change to «lower» +% if it crosses the other marginal beam. This is shown in the following example, +% where the marginal rays exchange their roles: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,10-10,14-14}] +\begin{pspicture}(0,0)(3,2) + \pnodes(0,1){A}(3,1){B} + \lens[abspos=1, n=2](A)(B) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \drawwidebeam[beamwidth=0.5](A){} + \psdot(\oenodeBeamUp{})\psdot(\oenodeBeamLow{}) + \uput[90](\oenodeBeamUp{}){\rput[rb](0,0){BeamUp}} + \uput[-90](\oenodeBeamLow{}){\rput[rt](0,0){BeamLow}} + \drawwidebeam[loadbeam, beaminsidefirst]{}(B) + \psdot(\oenodeBeamUp{})\psdot(\oenodeBeamLow{}) + \uput[90](\oenodeBeamUp{}){\rput[rb](0,0){BeamUp}} + \uput[-90](\oenodeBeamLow{}){\rput[rt](0,0){BeamLow}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Bei einer Reflektion können ebenfalls die Rollen vertauscht werden.\fi +% \ifENGLISH After a reflection the roles can also be exchanged.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,8-8,15-15}] +\begin{pspicture}(0,-1)(4,2) + \pnodes(0,1.5){A}(2,1.5){B}(2.8,0){C} + \mirror[mirrorwidth=1.2, mirrortype=extended](A)(B)(C) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \drawwidebeam[beamwidth=0.5](A){} + \pnodes(\oenodeBeamUp{}){Up1}(\oenodeBeamLow{}){Low1} + \drawwidebeam[loadbeam]{}(C) + \psdot(\oenodeBeamUp{})\psdot(\oenodeBeamLow{}) + \uput[90](\oenodeBeamUp{}){\rput[lb](0,0){BeamUp}} + \uput[-90](\oenodeBeamLow{}){BeamLow} + \psdot(Up1)\psdot(Low1) + \uput[90](Up1){\rput[lb](0,0){BeamUp}} + \uput[0](Low1){\rput[l](0,0){BeamLow}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Beachten Sie, dass sich die Orientierung von «oben» und «unten» in +% Version 3.3 geändert hat, siehe \prettyref{sec:bwd-comp-3.3}. +% \fi +% \ifENGLISH +% Note, that the orientation of «upper» and «lower» changed with version +% 3.3, for more details see \prettyref{sec:bwd-comp-3.3}. +% \fi +% +% \cmditem{oeBeamCenter}{num} +% +% \ifGERMAN Damit erhält man die Mitte zwischen oberem und unterem +% Endknoten, die Koordinaten sind nur aus Postscript-Ebene verfügbar, +% im Gegensatz zu \Lcs*{oenodeBeam*}, daher auch die an +% \Lcs*{oeBeamVec*} angelehnte Nomenklatur. Ein Anwendungsbeispiel ist +% \prettyref{ex:beamcenter}. +% \fi +% \ifENGLISH Get the mean of upper and lower beam node. The +% coordinates are available only at Postscript level, in contrast to +% the \Lcs*{oenodeBeam*} macros. For an example see +% \prettyref{ex:beamcenter}. +% \fi +% \end{ltxsyntax} +% +% \ifGERMAN +% Die Strahlknoten können nur innerhalb der \Lenv*{pspicture}-Umgebung verwendet +% werden, in der sie definiert wurden. Um auf bestimmte Strahlknoten von +% außerhalb zugreifen zu können müssen diese vorher explizit umdefiniert werden: +% \fi +% \ifENGLISH +% The beam nodes can be accessed only within the \Lenv*{pspicture} environment +% they were defined in. If you want to use one of these nodes from outside, you +% must explicitely redefine them beforehand: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{lstlisting} +\pnode(\oenodeBeam{}){MyBeamNode} +\end{lstlisting} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Desweiteren werden die Endknoten durch \Lkeyword{stopinside} +% beeinflusst. Siehe \prettyref{sec:custombeam} für weitere Details. +% \fi +% \ifENGLISH +% The end points are also affected by \Lkeyword{stopinside}. See +% \prettyref{sec:custombeam} for further details. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0)(3,2) + \pnodes(0,1){A}(1.6,1){B} + \optbox[position=end](A)(B) + \psset{beaminsidelast=false} + \drawbeam[linecolor=red, beampos=0.3](A){1} + \psdot(\oenodeBeam{}) + \drawbeam[stopinside](A){1} + \psdot(\oenodeBeam{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\section{Strahlvektor}\fi +% \ifENGLISH\section{Beam vector}\fi +% +% \ifENGLISH In addition to the beam nodes (see +% \prettyref{sec:beamnode}) also the normalized vectors of the last +% saved beams (see \Lkeyword{savebeam}) can be accessed at Postscript +% level. +% +% These are again separated in single, upper and lower beams. \prm{num} +% has the same meaning as for \Lcs{oenodeBeam}. +% \fi +% +% \ifGERMAN Zusätzlich zu den Strahlknoten (siehe +% \prettyref{sec:beamnode}) kann auf Postscript-Ebene auf die normierten +% Strahlvektoren der letzten gespeicherten Strahlen (siehe +% \Lkeyword{savebeam}) zugegriffen werden. +% +% Auch hier wird zwischen Einzelstrahlen, und oberem bzw. unterem Strahl +% unterschieden. \prm{num} hat dieselbe Bedeutung wie bei \Lcs{oenodeBeam}. +% \fi +% \begin{ltxsyntax} +% \cmditem{oeBeamVec}{num} +% \cmditem{oeBeamVecUp}{num} +% \cmditem{oeBeamVecLow}{num} +% \end{ltxsyntax} +% +% \ifGERMAN Bei den gespeicherten Werten handelt es sich um den +% normierten Richtungsvektor des letzten Strahlsegments, dieser ist nur +% auf Postscript-Ebene verfügbar. Dieser Richtungsvektor ist im +% folgenden Beispiel in rot zu sehen. Im Gegensatz dazu wird mit +% \Lkeyword{savebeam} der Richtungsvektor gespeichert, der nach der +% letzten Grenzfläche gelten würde, also für einen nachfolgenden Strahl +% verwendet würde. Dieser ist im Beispiel in blau eingezeichnet. +% \fi +% \ifENGLISH The saved values are those of the normalized direction +% vector of the last beam segment and are drawn in red in the next example. In contrast +% to this, the vector saved with \Lkeyword{savebeam} is that behind the +% last interface and would be used for a following beam. This is shown +% in blue in the following example. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]beaminsidelast}] +\begin{pspicture}(4,2) + \optbox[optboxsize=2 1, angle=20, n=2](0,1)(4,1) + \drawbeam[beaminsidelast, beamalign=abs](0,1){1} + \pnode(\oenodeBeam{}){Out} + \nodexn{(Out)+(!\oeBeamVec{})}{C} + \drawbeam[linecolor=blue, arrows=->, loadbeam]{1}(C) + \drawbeam[linecolor=red, arrows=->](Out)(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Das Verhalten ist unabhängig davon, ob der letzte Strahl nur +% berechnet, oder auch gezeichnet wurde. Das nächste Beispiel verwendet +% \Lkeyword{stopinside} anstelle vom Parameter \Lkeyword{beaminsidelast} +% im vorangegangenen Beispiel; die Strahlvektoren bleiben davon +% unbeeinflusst. +% \fi +% \ifENGLISH This behaviour is independent of whether the last beam was +% only calculated or also drawn. The next example uses +% \Lkeyword{stopinside} instead of \Lkeyword{beaminsidelast} compared to +% the previous example; the beam vectors are not affected by this. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]stopinside}] +\begin{pspicture}(4,2) + \optbox[optboxsize=2 1, angle=20, n=2](0,1)(4,1) + \drawbeam[stopinside, beamalign=abs](0,1){1} + \pnode(\oenodeBeam{}){Out} + \nodexn{(Out)+(!\oeBeamVec{})}{C} + \drawbeam[linecolor=blue, arrows=->, loadbeam]{1}(C) + \drawbeam[linecolor=red, arrows=->](Out)(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Das kann dazu genutzt werden, um z.B. die Polarisation eines +% Strahls zu kennzeichnen. Im folgenden Beispiel werden die neuen Knoten +% \prm{U} und \prm{L}definiert, indem mit \Lcs*{nodexn} die Endpunkte +% des oberen bzw. unteren Strahls entlang ihrer Trajektorie zurück +% verschoben werden. +% \fi +% \ifENGLISH A possible application is marking of the polarization of a +% beam. In the following example we define the nodes \prm{U} and \prm{L} +% which are shifted with \Lcs*{nodexn} from the end point of the upper +% and lower beam along the respective beam trajectory. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-9,11-11}] +\begin{pspicture}(3,3) + \pnodes(0,1.5){A}(3,1.5){B} + \lens[abspos=1, lens=5 5 3, n=2.0](A)(B) + \optplane[angle=90](B) + \drawwidebeam[beamwidth=2](A){1-2} + \nodexn{(\oenodeBeamUp{})-2(!\oeBeamVecUp{})}{U} + \nodexn{(\oenodeBeamLow{})-2(!\oeBeamVecLow{})}{L} + \polarization(U)(\oenodeBeamUp{}) + \polarization(L)(\oenodeBeamLow{}) + \psdot(U)\uput[45](U){U}\psdot(L)\uput[-45](L){L} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{ltxsyntax} +% \cmditem{oeBeamVecMedian}{num} +% \ifGERMAN Der Mittelwert aus oberem und unterem Strahlvektor.\fi +% \ifENGLISH The mean of upper and lower beam vector.\fi +% \end{ltxsyntax} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[caption={caption}, label={ex:beamcenter}] +\begin{pspicture}(3.5,2.6) + \pnodes(0,2){A}(1,2){B}(3,1){C} + \optprism(A)(B)(C) + \newpsstyle{Beam}{linestyle=none, fillstyle=solid, beamwidth=0.2, beamnodealign=vector} + \drawwidebeam[fillcolor=orange](A){} + \psset[optexp]{beampathskip=1} + \drawwidebeam[fillcolor=green, n=1.2, savebeam=2](A){}(C) + \drawwidebeam[fillcolor=red, n=1.4, savebeam=3](A){}(C) + \drawwidebeam[fillcolor=red!50!black, n=1.57, savebeam=4](A){}(C) + \multido{\i=2+1}{3}{% + \backlayer{% + \pnode(!\oeBeamCenter{\i}){Det\i} + \nodexn{(Det\i)-(!\oeBeamVecMedian{\i})}{Det\i'}} + \optdetector[detsize=0.4 0.4](Det\i')(Det\i)} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Weitere Anwendungsbeispiele sind \prettyref{ex:glan-thompson} und \prettyref{ex:wgm-pdc}.\fi +% \ifENGLISH Further example are \prettyref{ex:glan-thompson} and \prettyref{ex:wgm-pdc}.\fi +% +% +% \ifGERMAN\section{Knotenübersicht}\fi +% \ifENGLISH\section{Node overview}\fi +% +% \ifENGLISH This is an overview of all available component nodes.\fi +% \ifGERMAN Dies ist eine Übersicht über alle verfügbaren Komponentenknoten.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, linerange={2-4,17-17}] +\psset{unit=2} +\begin{pspicture}(0.3,0.1)(4.8,1.6) + \pnodes(0.5,0.5){A}(4.5,0.5){B} + \optbox[compshift=0.5, angle=10, rotateref=tr, extnode={-0.5,1}](A)(B) + \psline[style=Refline](\oenodeTrefA{})(\oenodeTrefB{}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\uput[-90](\oenodeRefA{}){RefA} + \psdot(\oenodeRefB{})\uput[-90](\oenodeRefB{}){RefB} + \psdot(\oenodeTrefA{})\uput[90](\oenodeTrefA{}){TrefA} + \psdot(\oenodeTrefB{})\uput[90](\oenodeTrefB{}){TrefB} + \psdot(\oenodeOut{})\uput[80](\oenodeOut{}){\rput[l](0,0.1){Out}} + \psdot(\oenodeIn{})\uput[100](\oenodeIn{}){\rput[r](0,0){In}} + \psdot(\oenodeCenter{})\uput[90](\oenodeCenter{}){Center} + \psdot(\oenodeRotref{})\uput[90](\oenodeRotref{}){Rotref} + \psdot(\oenodeExt{})\uput[90](\oenodeExt{}){Ext} + \psdot(\oenodeLabel{})\uput[90](\oenodeLabel{}){Label} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\chapter{Verbinden von Komponenten}\fi +% \ifENGLISH\chapter{Connecting components}\fi +% \label{chap:connecting} +% +% \ifGERMAN +% Das \nxLPack{pst-optexp}-Paket stellt unterschiedlichen Methoden +% bereit, Komponenten vollautomatisch oder manuell, mit Lichtstrahlen, +% Fasern oder Drähten zu verbinden. +% \begin{compactitem} +% \item In \prettyref{sec:accessobj} wird beschrieben wie Komponenten +% und Knoten für Verbindungen angesprochen werden. +% \item Strahlverbindungen im Allgemeinen und das Verhalten von +% Einzelstrahlen wird in \prettyref{sec:drawbeam} beschrieben. +% \item \prettyref{sec:drawwidebeam} erweitert diese Beschreibung von +% Strahlverbindungen auf ausgedehnte Strahlen und deren Eigenheiten. +% \item In \prettyref{sec:error-handling} wird gezeigt, wie fehlerhafte +% Strahlverbindungen (verfehlen von Grenzflächen) gehandhabt wird). +% \item \prettyref{sec:custombeam} erläutert, wie bestimmte, stückweise +% definierte Strahlengänge, wie z.B. bei eine Teleskop, einfach +% realisiert werden können. +% \item Manuelle Faserverbindungen werden in \prettyref{sec:drawfiber} +% behandelt, manuelle elektrischen Verbindungen, die sehr ähnlich +% funktionieren, in \prettyref{sec:drawwire}. +% \item Automatische Verbindungen werden in +% \prettyref{sec:drawconn-auto} erklärt. +% \item \prettyref{sec:layers} erklärt das Konzept der «front» und +% «back»-Ebene. +% \end{compactitem} +% \fi +% \ifENGLISH +% The \LPack{pst-optexp} package provides several methods for automatic +% and manual connections of components with beams, fibers, or wires. +% \begin{compactitem} +% \item \prettyref{sec:accessobj} describes how to access objects and +% nodes for use with the connection macros. +% \item Beam drawing in general and the behavior of single beams is +% explained in \prettyref{sec:drawbeam}. +% \item \prettyref{sec:drawwidebeam} extends this description of beam +% drawing to wide beams and their special properties. +% \item \prettyref{sec:error-handling} shows how errors in beam +% connections (missed interfaces etc.) are handled. +% \item \prettyref{sec:custombeam} explains how customized, piecewise +% defined beam paths, like e.g. in a telescope, can be easily +% constructed. +% \item Manual fiber connections are described in +% \prettyref{sec:drawfiber}, manual wire connections, which show the +% same behavior, are treated in \prettyref{sec:drawwire}. +% \item Automatic connections are explained in +% \prettyref{sec:drawconn-auto}. +% \item \prettyref{sec:layers} introduces the concept of front and back +% layer for the drawings. +% \end{compactitem} +% \fi +% \ifGERMAN\section{Zugriff auf Komponenten}\fi +% \ifENGLISH\section{Accessing components}\fi\label{sec:accessobj} +% +% \ifENGLISH +% All macros for connections can take either an ID, a \Lkeyword{compname} +% identifier (see \prettyref{sec:namingobj}) or PSTricks nodes as arguments, +% which are denoted with \prm{obj$_1$}, \prm{obj$_2$}, \ldots. To distinguish +% between nodes and components, nodes must be either enclosed in parenthesis +% within the brackets, or enclosed only in parenthesis: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, or \Lcs{drawbeam}\opt{(node)\{comp\}}. +% \fi +% \ifGERMAN +% Alle Makros für Verbindungen akzeptieren entweder eine ID, ein +% \Lkeyword{compname} Bezeichner (siehe \prettyref{sec:namingobj}) oder einen +% PSTricks-Knoten als Argument, die als \prm{obj$_1$}, \prm{obj$_2$}, \ldots{} +% bezeichnet werden. Um zwischen Knoten und Komponenten unterscheiden zu können, +% müssen Knoten entweder in runde Klammern innerhalb der geschweiften Klammern +% eingeschlossen werden oder dürfen nur runde Klammern haben: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, oder +% \Lcs{drawbeam}\opt{(node)\{comp\}}. +% \fi +% +% \begin{enumerate} +% \item +% \ifGERMAN Auf alle Komponenten kann immer unter Verwendung der ID +% zugegriffen werden. +% \fi +% \ifENGLISH All components can always be accessed via their ID.\fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \pnodes(0,1){A}(1.5,1){B} + \optbox[position=end, labeloffset=0](A)(B){1} + \drawbeam(A){1} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifGERMAN Wenn eine Komponente mit \Lkeyword{compname} einen zusätzlichen +% Namen erhalten hat, so kann dieser anstelle der ID verwendet werden. +% \fi +% \ifENGLISH A component which has been assigned a name with +% \Lkeyword{compname} can also be accessed via this instead of its ID. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{compname}}] +\begin{pspicture}(3,2) + \psset{position=end, labeloffset=0} + \optbox[compname=obj](0,1)(1.5,1){obj} + \drawbeam(0,1){obj} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifGERMAN Wird das Argument leer gelassen, dann greift man auf die zuletzt +% definierte Komponente zu. +% \fi +% \ifENGLISH If the argument is left empty, use the last component defined. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \psset{position=end, labeloffset=0} + \optbox(0,0.5)(1.5,0.5){1} + \optbox(0,1.5)(1.5,1.5){2} + \drawbeam(0,1){} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifGERMAN +% Es können auch Zahlintervalle verwendet werden, gültige Intervallangaben sind +% \begin{description} +% \item[\parbox{2em}{\texttt{x-y}}] Von \opt{x} bis \opt{y}, ist \opt{x} +% größer als \opt{y}, so wird heruntergezählt. Ist der gesamte +% Bereich nicht definiert, dann wird ein Fehler ausgegeben. +% \item[\parbox{2em}{\texttt{x-}}] Von \opt{x} bis zur letzten Komponente. +% \item[\parbox{2em}{\texttt{\hphantom{x}-y}}] Von der ersten Komponente +% bis \opt{y}. Ist \opt{y} außerhalb des definierten Bereichs, dann +% wird eine Warnung ausgegeben. +% \item[\parbox{2em}{\texttt{\hphantom{x}-}}] Verbinde alle Komponenten. +% \end{description} +% \fi +% \ifENGLISH You can also use number ranges, valid range specifications are +% \begin{description} +% \item[\parbox{2em}{\texttt{x-y}}] From \opt{x} to \opt{y}, if \opt{x} +% is greater than \opt{y}, the numbers are decremented. If the whole +% range is not defined, an error is raised. +% \item[\parbox{2em}{\texttt{x-}}] From \opt{x} to the last component. +% \item[\parbox{2em}{\texttt{\hphantom{x}-y}}] From the first component +% to \opt{y}. If \opt{y} is outside the valid range, a warning is +% raised. +% \item[\parbox{2em}{\texttt{\hphantom{x}-}}] Connect all components. +% \end{description} +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,3) + \psset{position=end, optboxsize=0.5 0.5, bssize=0.5} + \optbox[compname=obj](0.5,0.5)(0.5,2.5){obj, 1} + \beamsplitter(0.5,2.5)(0.5,1)(2.5,1){2} + \optbox(0.5,1)(2.5,1){3} + \drawbeam{1-3} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \ifENGLISH\section{Drawing beams}\fi +% \ifGERMAN\section{Strahlen zeichnen}\fi +% \label{sec:drawbeam} +% +% \ifENGLISH +% The package provides several ways to connect components and nodes with beams, +% which can be either single rays or wide beams. Most parameters have the same +% effect on both single and wide beams so most examples will be shown for +% single beams only. For options specific to wide beams please see +% \prettyref{sec:drawwidebeam}. +% \fi +% \ifGERMAN Es gibt mehrere Möglichkeiten Komponenten und Knoten mit Strahlen zu +% verbinden: einfache Linien oder ausgedehnte Strahlen. Die meisten Parameter +% haben für beide Typen dieselbe Bedeutung, daher beschränken sich die +% entsprechenden Beispiele auf die einfachen Strahlen. Die Parameter die nur +% ausgedehnte Strahlen betreffen, werden in \prettyref{sec:drawwidebeam} +% beschrieben. +% \fi +% +% \begin{ltxsyntax} +% \xLcs{drawbeam}\cmditem{drawbeam}[options]{obj$_1$}{obj$_2$}\ldots +% \xLcs{drawwidebeam}\cmditem*{drawwidebeam}[options]{obj$_1$}{obj$_2$}\ldots +% +% \ifENGLISH +% These are the two macros for beam connections; they can take a +% variable number of arguments (minimum of two) which can be either an +% ID, an ID range, a \Lkeyword{compname}, or a PSTricks nodes (see +% \prettyref{sec:accessobj}). To distinguish between nodes and +% components, nodes must be either enclosed in parenthesis within the +% brackets, or enclosed only in parenthesis: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, or +% \Lcs{drawbeam}\opt{(node)\{comp\}}. +% \fi +% \ifGERMAN +% Diese beiden Makros sind für die Strahlverbindungen zuständig, sie +% akzeptieren eine variable Anzahl an Argumenten (mindestens zwei), +% die entweder eine ID, ein ID-Intervall, ein \Lkeyword{compname} oder +% ein PSTricks-Knoten sein können (siehe \prettyref{sec:accessobj}. Um +% zwischen Knoten und Komponenten unterscheiden zu können, müssen +% Knoten entweder in runde Klammern innerhalb der geschweiften +% Klammern eingeschlossen werden oder dürfen nur runde Klammern haben: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, oder +% \Lcs{drawbeam}\opt{(node)\{comp\}}. +% \fi +% \end{ltxsyntax} +% +% \subsection{Raytracing}\label{sec:raytracing} +% \ifENGLISH +% The beam connection macros support two modes of tracing the beam across the +% optical components: one is to use refractive indices and Snell's law to +% determine the beam path. The other mode is to connect the components only, +% regardless of their optical properties. +% +% You must always keep in mind, that this is a package for \emph{sketching} +% experimental setups. Therefore, we do not provide a comprehensive raytracing +% framwork, because deviations from the actual physical path are often desired +% for sketches: beam angles and divergences should be in many cases more extreme +% than in the real setup in order to highlight certain aspects. You should also +% consider the refractive index (see \prettyref{sec:n}) only as a tool to +% optimize the visual effects of the beam path, and not stick with its +% physically correct values. +% \fi +% \ifGERMAN +% Der Strahlengang durch die Komponenten kann mit zwei unterschiedlichen +% Methoden ermittelt werden: über den Brechungsindex und das Snelliussche +% Brechungsgesetz, oder indem die Komponenten unabhängig von ihren optischen +% Eigenschaften einfach verbunden werden. +% +% Behalten Sie immer im Hinterkopf, dass dieses Paket für \emph{Skizzen} +% optischer Aufbauten gedacht ist und daher keine vollständige Umgebung zur +% Strahlverfolgung bereitstellt. Abweichungen vom physikalisch richtigen Weg +% können in vielen Fällen erwünscht sein: Winkel und Divergenzen werden häufig +% extremer dargestellt um bestimmte Effekte hervorzuheben. Daher sollten Sie den +% Brechungsindex (siehe \prettyref{sec:n}) lediglich as Mittel zur Optimierung +% des gewünschten Lichtweges sehen und nicht zu sehr an den physikalisch +% richtigen Werten festhalten. +% \fi +% +% \begin{optionlist} +% \boolitem[true]{raytrace} +% \ifENGLISH +% Chooses the mode of tracing the beam path, +% \opt{true} uses the refractive index («raytracing»), \opt{false} selects +% component connection («connect» mode). +% +% In most cases, the «connect» mode is equivalent to «raytracing» with +% \Lkeyword{n}\opt{=1}, except for \Lcomp{optprism} and \Lcomp{doveprism}, where +% the interface nodes (\prettyref{sec:ifcnode}) are simply connected. +% See the following two example for the differences between the tracing modes +% using these two components. The interface nodes are highlighted for clarity. +% +% The raytraced beam with \Lkeyword{n}\opt{=1} (blue) passes the component +% without changing its direction, the refraction for \Lkeyword{n}\opt{=1.5} is +% calculated (red), and the «connect» beam (green) just passes through the two +% interface nodes. +% \fi +% \ifGERMAN +% Wählt die Methode der Strahlverfolgung, mit \opt{true} wird der +% Brechungsindex («raytracing») verwendet, \opt{false} verbindet die +% Komponente lediglich («connect» Variante). +% +% In vielen Fällen ist «connect» identisch mit «raytracing» für +% \Lkeyword{n}\opt{=1}, außer für \Lcomp{optprism} oder \Lcomp{doveprism} bei +% denen die Grenzflächenknoten (\prettyref{sec:ifcnode}) dann einfach nur +% verbunden werden. Die folgenden beiden Beispiele zeigen die Unterschiede +% der beiden Methoden für diese Komponenten. Die Grenzflächenknoten sind zum +% besseren Verständnis hervorgehoben. +% +% Der «raytracing» Strahl mit \Lkeyword{n}\opt{=1} (blau) wird durch die +% Komponente transmittiert ohne die Richtung zu verändern, für +% \Lkeyword{n}\opt{=1.5} (rot) wird die Brechung an den Grenzflächen berechnet, +% und der «connect» Strahl (grün) durchläuft genau die Grenzflächenknoten. +% \fi +% +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[linerange={1-7,9-9}] +\begin{pspicture}(3,2.2) + \pnodes(0,1.5){A}(1,1.5){B}(3,1){C} + \optprism[prismsize=1.2](A)(B)(C) + \optplane(C) + \drawbeam[n=1, linecolor=blue](A){1}{2} + \drawbeam[n=1.5, linecolor=red](A){1}{2} + \drawbeam[raytrace=false, linecolor=DGreen](A){1}{2} + \psdot(\oenodeIn{1})\psdot(\oenodeOut{1}) +\end{pspicture} +\end{LTXexample} +%\iffalse +%</ignore> +%\fi +% +% \ifENGLISH +% For the \Lcomp{doveprism} the same applies as for the \Lcomp{optprism}, but the +% raytraced beam with \Lkeyword{n}\opt{=1} (blue) misses the second interface +% because it is not refracted and stops therefore at the first interface (see +% \prettyref{sec:error-handling}). Again, the green «connect» ray passes through +% all interface nodes. +% \fi +% \ifGERMAN +% Das \Lcomp{doveprism} wird im Prinzip genauso behandelt wie das \Lcomp{optprism}, +% der «raytracing» Strahl mit \Lkeyword{n}\opt{=1} (blau) trifft wegen fehlender +% Brechung die zweite Grenzfläche gar nicht, und endet daher schon an der ersten +% Grenzflächen (siehe \prettyref{sec:error-handling}). Der grüne «connect» +% Strahl verläuft wieder durch die Grenzflächenknoten. +% \fi +% +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[linerange={1-6,8-8}] +\begin{pspicture}(4,2) + \pnodes(0,1){A}(4,1){B} + \doveprism[doveprismsize=1](A)(B) + \drawbeam[n=1, linecolor=blue, beampos=0.1](A){1}(B) + \drawbeam[n=1.5, linecolor=red](A){1}(B) + \drawbeam[raytrace=false, linecolor=DGreen](A){1}(B) + \psdot(\oenodeIn{1})\psdot(\oenodeIfc{2}{1})\psdot(\oenodeOut{1}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Für «connect» können auch unterschiedliche Anfangsbedingungen +% (\ref{prm:beampos}) verwendet werden. +% \fi +% \ifENGLISH +% The «connect» mode also supports changing the initial conditions +% (\ref{prm:beampos}). +% \fi +%\iffalse +%<*ignore> +%\fi +\begin{LTXexample}[linerange={1-7,9-9}, morekeywords={[21]beampos,beamangle}] +\begin{pspicture}(3.7,2) + \pnodes(0,1){A}(4,1){B} + \doveprism[doveprismsize=1](A)(B) + \psset[optexp]{raytrace=false} + \drawbeam[linecolor=blue, beampos=0.2, beamangle=-10](A){1}(B) + \drawbeam[raytrace=false, linecolor=DGreen](A){1}(B) + \drawbeam[linecolor=red, beampos=-0.2, beamangle=10](A){1}(B) + \psdot(\oenodeIn{1})\psdot(\oenodeIfc{2}{1})\psdot(\oenodeOut{1}) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[linerange={1-7,9-9}, morekeywords={[21]beampos,beamangle}] +\begin{pspicture}(3.7,2) + \pnodes(0,1){A}(4,1){B} + \doveprism[doveprismsize=1](A)(B) + \psset[optexp]{raytrace=false} + \drawbeam[linecolor=blue, beampos=0.2](A){1}(B) + \drawbeam[linecolor=DGreen](A){1}(B) + \drawbeam[linecolor=red, beampos=-0.2](A){1}(B) + \psdot(\oenodeIn{1})\psdot(\oenodeIfc{2}{1})\psdot(\oenodeOut{1}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[true]{useNA} +% \ifGERMAN Ein Strahlengang wird abgebrochen, falls eine Komponente nicht +% getroffen wird. Für manche Zwecke, z.B. zum Ermitteln des richtigen +% Brechungsindex, kann es sinnvoll sein, wenn die numerische Apertur eine +% Komponente nicht berücksichtigt wird. In dem folgenden Beispiel wird der +% rote Strahl gezeichnet, obwohl er außerhalb der gezeichneten Spiegelfläche +% liegt. +% \fi +% \ifENGLISH The beam path is interrupted if an interface is missed. In some +% cases, e.g. to estimate the correct refractive index for a ray trace, it can +% be useful if the numerical aperture of the components is not considered. The +% red beam in the following example is drawn, although it hits the mirror +% outside the drawn mirror surface. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \pnodes(0,0.5){A}(2.5,0.5){B}(2.5,2){C} + \mirror(A)(B)(C) + \psset{useNA=false} + \drawbeam(A){}(C) + \drawbeam[linecolor=red, beamangle=10](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \end{optionlist} +% +% \ifENGLISH\subsection{Refractive index}\fi +% \ifGERMAN\subsection{Brechungsindex}\fi +% \label{sec:n} +% +% \ifENGLISH +% The raytracing depends on the refractive index, which may be set for each +% component separately. The refractive index is always relative to the +% background which has a constant value for the whole sketch. +% \fi +% \ifGERMAN +% Das Raytracing wird durch den Brechungsindex bestimmt, der für jede Komponente +% einzeln gesetzt werden kann. Der Wert ist relativ zum Hintergrund, für den ein +% konstanter Wert für die gesamte Skizze angenommen wird. +% \fi +% +% \begin{optionlist} +% \valitem[1.5]{n}{code} +% \ifGERMAN +% Setzt den Brechungsindex relativ zum Hintergrund. Diese Option hat zwei +% Anwendungsbereiche: zum einen kann der Index einer Komponente gesetzt werden, +% zum anderen der Brechungsindex für einen Strahlengang: +% \fi +% \ifENGLISH Sets the relative refractive index respect to the background. This +% parameter has two scopes, you can either set the refractive index of each +% component or of each beam ray: +% \fi +% \end{optionlist} +% +% \ifGERMAN +% \begin{enumerate} +% \item Wird \Lkeyword{n} als globaler Parameter oder als Komponentenparameter +% verwendet, so wird der Index für alle betroffenen Komponenten gesetzt. Ohne +% weitere Änderungen wird jeder Lichtstrahl diese Werte verwenden. +% \item Als Parameter zu \Lcs{drawbeam} oder \Lcs{drawwidebeam} kann der +% Brechungsindex der Komponenten für einzelne Strahlengänge überschrieben oder +% geändert werden. Das kann sehr nützlich sein, um z.B. chromatische +% Dispersion zu illustrieren. Soll die Änderung global für alle oder mehrere +% Lichtstrahlen wirksam sein, so muss der gewünschte Wert dem +% \Lstyle{Beam}-Stil hinzugefügt werden, da globale Definitionen von +% \Lkeyword{n} nur die Komponenten betreffen. +% \end{enumerate} +% \fi +% \ifENGLISH +% \begin{enumerate} +% \item Using \Lkeyword{n} as global parameter or component argument +% sets a fixed refractive index for each affected component. Without further +% actions, all beam paths experience this refractive index. +% \item As parameter for \Lcs{drawbeam} or \Lcs{drawwidebeam} you can overwrite +% or even change the refractive index of the components for specific beam +% paths. This can be very useful e.g. to simulate chromatic dispersion. To set +% this globally for all beams you must add the respective parameter +% definition to the \Lstyle{Beam} style because global definitions of +% \Lkeyword{n} affect only the components and not the beams. +% \end{enumerate} +% \fi +% +% \ifENGLISH +% The \prm{code} can in general be any Postscript code which evaluates to a +% number, e.g. \opt{1.5}, or \opt{5 sqrt}. If the \prm{code} starts with a +% \opt{*}, it will be interpreted as an algebraic +% expression\fnurl{http://mirror.ctan.org/graphics/pstricks/base/doc/pst-news08.pdf}, +% e.g. \opt{*sqrt(5)} is equivalent to \opt{5 sqrt}. Inside the \prm{code} you +% can access the predefined refractive index of the component via \opt{n} which +% allows you to change the index relative to its original value. Use +% e.g. \opt{n=n 1.01 mul} to change \opt{n} by one percent. +% +% In the following you find several examples about the different aspects of +% using \Lkeyword{n}. +% \fi +% \ifGERMAN +% Der \prm{code} kann jeglicher Postscript-Kode sein, der zu einer Zahl +% ausgewertet werden kann, also z.B. \opt{1.5} oder \opt{5 sqrt}. Beginnt +% \prm{code} mit einem \opt{*}, so wird der Code als algebraischer +% Ausdruck\fnurl{http://mirror.ctan.org/graphics/pstricks/base/doc/pst-news08.pdf} +% ausgewertet, d.h. \opt{*sqrt(5)} ist äquivalent zu \opt{5 sqrt}. Innerhalb von +% \prm{code} kann mit \opt{n} auf den vordefinierten Brechungsindex der +% Komponenten zugegriffen werden, es kann also eine Änderung relativ zum +% ursprünglichen Wert erzielt werden. Mit \opt{n=n 1.01 mul} kann \opt{n} +% z.B. um ein Prozent geändert werden. +% +% In den folgenden Beispielen werden diese unterschiedlichen Möglichkeiten von +% \Lkeyword{n} gezeigt. +% \fi +% +% \begin{enumerate} +% \item +% \ifENGLISH Set a fixed refractive index for the component. Interestingly, +% for the default shape of the \Lcomp{doveprism} a refractive index of +% $\sqrt{5}$ gives the ideal output direction which is the same as the input +% direction. +% \fi +% \ifGERMAN +% Setze den Brechungsindex einer Komponente. Interessanterweise ist für die +% Standardform des \Lcomp{doveprism} ein Brechungsindex von $\sqrt{5}$ der +% ideale Wert so dass der Ausgangsstrahl parallel zum Eingangsstrahl verläuft. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \pnodes(0,1){A}(3,1){B} + \doveprism[n=*sqrt(5)](A)(B) + \drawbeam(A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH In this example one beam uses the default refractive index of the +% components (green), the other one overwrites it with a value of \opt{2} +% (red). +% \fi +% \ifGERMAN +% Ein Strahl (grün) verwendet die voreingestellten Werte der Komponenten, der +% rote überschreibt diese mit \opt{2}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{n}}] +\begin{pspicture}(3,3) + \pnodes(0,1){A}(3,1){B} + \optplane(A) + \psset{lens=3 3 2, n=1.5} + \lens[abspos=0.5](A)(B) + \lens[abspos=2](A)(B) + \optplane(B) + \addtopsstyle{Beam}{beampos=0.5} + \drawbeam{-} + \drawbeam[linecolor=red, n=2]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH +% Now, the red beam uses the default refractive index of the component, the +% yellow beam adds \opt{0.5} to the default index. +% \fi +% \ifGERMAN +% Der rote Strahl verwendet die voreingestellten Werte, der grüne ändert diese +% um \opt{0.5}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{n}}] +\begin{pspicture}(3,3) + \pnodes(0,1.5){A}(3,1.5){B} + \lens[lens=4 4 3, n=2, abspos=0.3](A)(B) + \optplane[compname=Plane](B) + \psset{beampos=0.6} + \drawbeam[linecolor=red](A){1}{Plane} + \drawbeam[linecolor=yellow, n=*(n+0.5)](A){1}{Plane} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH +% Dynamically changing the refractive index is very useful to emulate +% chromatic dispersion. Here, we sketch the dispersion of a prism by +% calculating the refractive index with Sellmaier's +% equation\fnurl{http://en.wikipedia.org/wiki/Sellmeier_equation} for +% different wavelengths. +% \fi +% \ifGERMAN +% Mit dynamischer Anpassung von \Lkeyword{n} kann chromatische Dispersion sehr +% gut emuliert werden. Hier wird die Dispersion eines Prisma gezeigt, der +% Brechungsindex wird mit der Sellmaier +% Gleichung\fnurl{http://en.wikipedia.org/wiki/Sellmeier_equation} für die +% unterschiedlichen Wellenlängen berechnet. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{n}}] +\begin{pspicture}(3,3) + \pnodes(-1,0){A}(1,2.2){B}(3,0){C} + \optplane(0,2.15) + \optprism[prismalign=center, prismangle=59](A)(B)(C) + \optplane(C) + \definecolor[ps]{bl}{rgb}{% + tx@addDict begin tx@OptexpDict begin + Wavelength wavelengthToRGB + Red Green Blue + end end }% + \addtopsstyle{Beam}{linecolor=bl, linewidth=0.4\pslinewidth, beamalign=abs} + \multido{\iLambda=400+4}{60}{% + \pstVerb{/Wavelength \iLambda\space def }% + \drawbeam[n=Wavelength Sellmaier]{-}% + }% +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Using the numerical aperture of a pinhole as spectral filter.\fi +% \ifGERMAN Die numerische Apertur einer Lochblende als spektraler Filter.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{n}}] +\begin{pspicture}(0.3,0)(3.3,5.2) + \pnodes(0.3,1){A}(2,1){B}(3,2){C}(2.5,5){D} + \optplane(A) + \optgrating[reverse](A)(B)(C) + \pinhole[phwidth=-0.1, innerheight=0.03, abspos=0.5](D)(B) + \optplate[position=end, plateheight=1.5](B)(D) + \definecolor[ps]{bl}{rgb}{% + tx@addDict begin Red Green Blue end}% + \drawbeam[linecolor=red]{1-2} + \addtopsstyle{Beam}{linecolor=bl, linewidth=0.4\pslinewidth} + \multido{\i=0+1}{60}{% + \pstVerb{% + \i\space 650 400 sub 59 div mul 400 add + tx@addDict begin wavelengthToRGB end }% + \drawbeam[beamangle=\i\space 0.1 mul 3 sub]{2-}% + }% +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \begin{optionlist} +% \valitem{refractiveindex}{code} +% \deprecatedmsg{\Lkeyword{n}} +% \end{optionlist} +% +% \ifENGLISH\subsection{Initial conditions}\fi +% \ifGERMAN\subsection{Anfangsbedingungen}\fi +% +% \begin{optionlist} +% \optitem[0]{beampos}{[\prm{x} ]\prm{y}} +% \ifENGLISH +% This is the start position (\prm{x}, \prm{y}) of the beam at the first +% interface. Both values are of \prm{psnum} type. If a single number is given, +% the $x$-coordinate is set to \opt{0}. +% \fi +% \ifGERMAN +% Die Startposition (\prm{x}, \prm{y}) des Strahls an der ersten +% Grenzfläche. Beide Zahlen sind vom Typ \prm{psnum}. Wird eine einzelne Zahl +% angegeben, wird die $x$-Koordinate auf \opt{0} gesetzt. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beampos}}] +\begin{pspicture}(4,3.8) + \pnodes(1.5,0.5){A}(3.5,0.5){B}(3.5,3.5){C} + \optbox[position=end](B)(A) + \mirror[mirrortype=extended, mirrorradius=3](A)(B)(C) + \optplate[position=end](B)(C) + \drawbeam[linecolor=red, beampos=-0.2]{1-3} + \drawbeam[linecolor=blue, beampos=0]{1-3} + \drawbeam[linecolor=green, beampos=0.2]{1-3} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH The start position is relative to the respective interface node, as +% it is illustrated in the following example. The beam start position is fixed, +% but depending on e.g. the \Lkeyword{beamangle}, the actual intersection with +% the curved interface is at a different position. +% \fi +% \ifGERMAN +% Die Startposition ist relativ zum entsprechenden Grenzflächenknoten, wie im +% folgenden Beispiel gezeigt wird. Die Startposition ist fest, abhängig z.B. von +% \Lkeyword{beamangle} kann der eigentliche Schnittpunkt mit der ersten +% Grenzfläche jedoch anders sein. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-7,9-9}, morekeywords = {[21]{beampos}}, explpreset={escapeinside={}}] +\begin{pspicture*}(0,2)(3.05,6) + \lens[lens=8 8 8, abspos=0.6](0.5,2)(3,2) + \optplate[position=1, plateheight=6](0.5,2)(3,2) + \psset{beampos=2.1} + \drawbeam[beamangle=-60]{1}{2} + \drawbeam[beamangle=-40]{1}{2} + \drawbeam[beamangle=-20]{1}{2} + \psline[style=Refline, linewidth=3\pslinewidth, arrows=->, arrowinset=0, arrowscale=1.3](\oenodeOut{1})([offset=2.1]\oenodeOut{1}) +\end{pspicture*} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH +% Which interface the beam starts at is determined by the options +% \Lkeyword{beaminsidefirst} and \Lkeyword{startinside}. +% \fi +% \ifGERMAN +% An welcher Grenzfläche der ersten Komponente gestartet wird hängt von +% \Lkeyword{beaminsidefirst} und \Lkeyword{startinside} ab. +% \fi +% +% \psnumitem[0]{beamangle} +% \ifGERMAN +% Der Anfangswinkel des Strahls. Dieser ist in der Regel relativ zu der +% Verbindung von der ersten zur zweiten Komponente, mit \Lkeyword{beamalign} +% kann dieses Verhalten verändert werden. +% \fi +% \ifENGLISH +% This is the start angle of the beam. Usually, it is relative to the connection +% between the first two components, use \Lkeyword{beamalign} to change this. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beamangle}}] +\begin{pspicture}(4,4) + \pnodes(1.5,0.5){A}(3.5,0.5){B}(3.5,3.5){C} + \optbox[position=end](B)(A) + \mirror[mirrortype=extended](A)(B)(C) + \optplate[position=end](B)(C) + \drawbeam[linecolor=red, beamangle=3]{-3} + \drawbeam[linecolor=blue, beamangle=0]{1-} + \drawbeam[linecolor=green, beamangle=-3]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[relative]{beamalign}{rel, relative, abs, absolute, firstcomp} +% \ifGERMAN +% Gibt vor, ob der Winkel \Lkeyword{beamangle} relativ zu der Verbindung +% zwischen den ersten beiden Komponenten ist, ob es sich um einen +% absoluten Winkel handelt, oder ob der Winkel durch die Ausrichtung der +% ersten Komponente vorgegeben wird. +% +% Ein absoluter Winkel kann sehr hilfreich sein, falls eine der beiden ersten +% Komponenten gedreht oder verschoben wurde. Dabei werden die +% Grenzflächenknoten, auf die sich ein relativer Winkel bezieht, ebenfalls +% transformiert (siehe \prettyref{sec:rotshift}). In dem folgenden Beispiel +% verläuft daher der grüne Strahl mit der relativen Ausrichtung nicht +% horizontal. +% \fi +% \ifENGLISH +% Select whether the \Lkeyword{beamangle} is relative to the connection between +% the first two components, or if it is an absolute angle. +% +% A typical situation where an absolute angle is helpful is with rotated or +% shifted components. By rotating or shifting a component also its interface +% nodes are rotated (see \prettyref{sec:rotshift}) which are then used to +% determine the input angle for relative alignment. Accordingly, in the +% following example, the green beam with the relative alignment is not +% horizontal. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beamalign, angle}}] +\begin{pspicture}(3,1.5) + \pnodes(0,0.75){A}(3,0.75){B} + \optbox[angle=10, showifcnodes](A)(B) + \drawbeam(A){}(B) + \drawbeam[linecolor=red, beamalign=abs](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Im folgenden Beispiel liegen beide Komponenten auf der horizontalen +% Linie $\overline{AB}$. Der grüne Strahl, mit +% \Lkeyword{beamalign}\opt{=rel} verläuft daher auch horizontal. Der +% rote Strahl ist hingegen mit \Lkeyword{beamalign}\opt{=firstcomp} +% entsprechend der Drehung der ersten Komponente ausgerichtet. +% \fi +% \ifENGLISH +% Both components in the following example are align on the horizontal +% line $\overline{AB}$. The green beam with +% \Lkeyword{beamalign}\opt{=rel} is accordingly aligned +% horizontally. The red beam with \Lkeyword{beamalign}\opt{=firstcomp} +% is aligned according to the rotation of the first component: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beamalign, angle}}] +\begin{pspicture}(4,3) + \pnodes(1.5,1.5){A}(4,1.5){B} + \optbox[position=start, rotateref=r, angle=10](A)(B) + \optplate[position=end, plateheight=3](A)(B) + \addtopsstyle{Beam}{beamdiv=20} + \drawwidebeam{-} + \drawwidebeam[beamalign=firstcomp, linecolor=red]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[0]{beampathskip} +% \ifGERMAN +% Überspringt \prm{num} Segmente am Anfang des Strahlengangs. Diese +% Option beinflusst lediglich ab welchem Segment der Strahlgang +% gezeichnet wird, das Raytracing beginnt immer noch an der ersten +% Grenzfläche. Um das zu ändern können Sie \Lkeyword{startinsidecount} +% verwenden. +% \fi +% \ifENGLISH +% Skip \prm{num} segments at the beginning of the beam path. This option +% determines only at which segment the beam is drawn, the ray tracing +% always starts at the first interface. To change this, see option +% \Lkeyword{startinsidecount}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beampathskip}}, pos=t] +\begin{pspicture}(5,2) +\pnodes(0,1){A}(5,1){B}(2,0){C} +\begin{optexp} + \glanthompson(A)(B) + \optplane(B)\optplane[angle=90](C) + \polarization[abspos=1, poltype=misc, linecolor=yellow!80!black](A)(B) + \drawbeam[beaminsidelast, linecolor=yellow!80!black](A){1} + \drawbeam[beampathskip=2](A){1-2} + \drawbeam[beampathskip=2, savebeam, linestyle=dashed, dash=2pt 2pt, linecolor=red,arrowscale=1.5, arrows=->](A){1}{3} +\end{optexp} +\nodexn{(\oenodeBeam{})-1.5(!\oeBeamVec{})}{D} +\polarization[poltype=parallel, linecolor=red](D)(\oenodeBeam{}) +\polarization[abspos=4, poltype=perp, linecolor=green, dotscale=1.5](A)(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[-1]{beampathcount} +% \ifGERMAN +% Anzahl der Strahlsegmente, die gezeichnet werden sollen. Werden am +% Anfang Segmente mit \Lkeyword{beampathskip} übersprungen, so werden +% diese nicht mitgezählt. +% \fi +% \ifENGLISH +% Number of beam segments, which are drawn. Segments which are skipped +% at the beam start with \Lkeyword{beampathskip} do not count. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beampathcount}}] +\begin{pspicture}(3,2) + \pnodes(0,2){A}(2,0.8){B}(4,2){C} + \optprism[compname=P, prismtype=reflective, prismangle=90](A)(B)(C) + \lens[abspos=1.33](\oenodeIfc{2}{P})(A)% + \drawwidebeam[beamwidth=0.2, beaminsidelast, beampathcount=4](A){2}{1} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\subsection{Interner Strahlengang}\fi +% \ifENGLISH\subsection{Internal beam path}\fi +% +% \ifENGLISH +% A beam path is composed of rays between components and rays inside the +% components. Depending on some options these internal beams can be drawn or +% not. Generally, the first, the last, and all other components are treated +% separately. +% \fi +% \ifGERMAN +% Ein Strahlengang setzt sich aus Strahlen zwischen den Komponenten und +% innerhalb der Komponenten zusammen. Ob diese internen Strahlen gezeichnet +% werden, kann mit mehreren Parametern festgelegt werden. Die erste, letzte und +% die übrigen Komponenten werden separat gehandhabt. +% \fi +% +% \begin{optionlist} +% \boolitem[true]{beaminside} +% \ifGERMAN +% Zeichnet den Strahlengang innerhalb aller Komponenten mit Ausnahme der +% ersten und letzten, die von dieser Option nicht beeinflusst. +% \fi +% \ifENGLISH +% Draw the internal beams in all intermediate components, the first and last +% components are not affected. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beaminside}}] +\begin{pspicture}(0.3,0.3)(3,4) + \psset{optboxwidth=1} + \optbox[position=end](1,1)(1,3) + \optretplate(1,1)(1,3) + \pentaprism(1,3)(1,1)(2,1) + \optbox[position=end](1,1)(2,1) + \drawbeam[beampos=-0.05, linecolor=red]{-} + \drawbeam[beampos=0.05, beaminside=false]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{beaminsidefirst} +% \ifGERMAN +% Zeichne den Strahlengang innerhalb der ersten Komponenten. +% \fi +% \ifENGLISH +% Draw the internal beams of the first component. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beaminsidefirst}}] +\begin{pspicture}(0.3,0.3)(3,4) + \psset{optboxwidth=1} + \optbox[position=end](1,1)(1,3) + \optretplate(1,1)(1,3) + \pentaprism(1,3)(1,1)(2,1) + \optbox[position=end](1,1)(2,1) + \drawbeam[beampos=-0.05, linecolor=red]{-} + \drawbeam[beampos=0.05, beaminsidefirst]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{beaminsidelast} +% \ifGERMAN +% Zeichne den Strahlengang innerhalb der letzten Komponenten. +% \fi +% \ifENGLISH +% Draw the internal beams of the last component. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beaminsidelast}}] +\begin{pspicture}(0.3,0.3)(3,4) + \psset{optboxwidth=1} + \optbox[position=end](1,1)(1,3) + \optretplate(1,1)(1,3) + \pentaprism(1,3)(1,1)(2,1) + \optbox[position=end](1,1)(2,1) + \drawbeam[beampos=-0.05, linecolor=red]{-} + \drawbeam[beampos=0.05, beaminsidelast]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[true]{allowbeaminside} +% \ifGERMAN +% Damit kann bestimmt werden, ob der Strahlengang innerhalb einer Komponente +% gezeichnet werden darf. Dieser Parameter wirkt nur auf Komponenten und +% überschreibt, falls auf \opt{false} gesetzt, jegliche Strahleinstellungen mit +% \Lkeyword{beaminside}, \Lkeyword{beaminsidefirst} und +% \Lkeyword{beaminsidelast}. Damit kann der Strahlengang in einzelnen +% Komponenten unterdrückt werden, für die es keinen Sinn macht +% (z.B. \Lcomp{optfilter} und \Lcomp{optdiode}, was sonst nicht möglich ist. +% \fi +% \ifENGLISH +% Define whether a beam is drawn inside a component. The option affects +% components only and overwrites all settings of \Lkeyword{beaminside}, +% \Lkeyword{beaminsidefirst}, and \Lkeyword{beaminsidelast} if set to +% \opt{false}. With this you can forbid any internal beams for components where +% it does not make any sense (e.g. \Lcomp{optfilter} and \Lcomp{optdiode}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{allowbeaminside}}] +\begin{pspicture}(3,2) + \psset{optboxwidth=0.5} + \pnodes(0,1){A}(3,1){B} + \optbox[position=0.2](A)(B) + \optbox[position=0.4, allowbeaminside=false](A)(B) + \optbox[position=0.6](A)(B) + \optbox[position=0.8](A)(B) + \drawbeam(A){-}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{forcebeaminside} +% \ifGERMAN +% Wenn auf \opt{true} gesetzt, wird der Strahlengang innerhalb der +% betroffenen Komponenten immer gezeichnet wird, unabhängig von allen +% anderen Strahleinstellungen mit \Lkeyword{allowbeaminside}, +% \Lkeyword{beaminside}, \Lkeyword{beaminsidefirst} und +% \Lkeyword{beaminsidelast}. Damit kann der Strahl innerhalb einzelner +% Komponenten gezeichnet werden, auch wenn alle anderen Komponenten in +% dem Strahlengang keinen internen Strahl haben sollen. +% \fi +% \ifENGLISH +% Forces to draw a beam inside a component. The option affects +% components only and overwrites all settings of +% \Lkeyword{allowbeaminside}, \Lkeyword{beaminside}, +% \Lkeyword{beaminsidefirst}, and \Lkeyword{beaminsidelast} if set to +% \opt{true}. With this you can force an internal beams for single +% components within a beam path. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{forcebeaminside}}] +\begin{pspicture}(3,2) + \psset{optboxwidth=0.5} + \pnodes(0,1){A}(3,1){B} + \optbox[position=0.2](A)(B) + \optbox[position=0.4, forcebeaminside](A)(B) + \optbox[position=0.6](A)(B) + \optbox[position=0.8](A)(B) + \drawbeam[beaminside=false](A){-}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[-1]{startinsidecount} +% \ifGERMAN +% Anzahl der Segmente, die innerhalb der ersten Komponente verwendet +% werden. Diese Option hat nur eine Wirkung, wenn +% \Lkeyword{beaminsidefirst} oder \Lkeyword{startinside} auf \opt{true} +% gesetzt sind. +% \fi +% \ifENGLISH +% Number of segments, which are used inside the first component. This +% option is in effect only with \Lkeyword{beaminsidefirst} or +% \Lkeyword{startinside} set to \opt{true}. +% \fi +% +% \numitem[-1]{stopinsidecount} +% \ifGERMAN +% Anzahl der Segmente, die innerhalb der letzten Komponente verwendet +% werden. Diese Option hat nur eine Wirkung, wenn +% \Lkeyword{beaminsidelast} oder \Lkeyword{stopinside} auf \opt{true} +% gesetzt sind. +% \fi +% \ifENGLISH +% Number of segments, which are used inside the last component. This +% option is in effect only with \Lkeyword{beaminsidelast} or +% \Lkeyword{stopinside} set to \opt{true}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{stopinsidecount, startinsidecount}}] +\begin{pspicture}(4,2) + \pnodes(0,2){A}(2,0){B}(4,2){C} + \optprism[compname=P, n=1, prismtype=reflective, prismangle=90](A)(B)(C) + \lens[abspos=1.08](\oenodeIfc{2}{P})(A) + \lens[abspos=1.08](\oenodeIfc{2}{P})(C) + \newpsstyle{Beam}{linestyle=none, fillstyle=solid} + \drawwidebeam[fillcolor=green, beamwidth=0.2, beaminsidelast, stopinsidecount=1](A){2}{1} + \drawwidebeam[fillcolor=orange, beaminsidefirst, startinsidecount=1, loadbeam]{1}{3}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[auto]{beammode}{refl, trans, reflective, transmittive, auto} +% \ifGERMAN +% Mit dieser Option kann das Strahlverhalten bei Komponenten wie +% z. B. dem \Lcomp{beamsplitter} auf reflektierend oder transmittierend +% festgelegt werden, unabhängig von den verwendeten Knoten und deren +% relative Position bezüglich der Komponente. +% \fi +% \ifENGLISH +% With this option one can force the beam path through e.g. a +% \Lcomp{beamsplitter} to \opt{reflective} or \opt{transmittive} +% independent of the choosen nodes and their position relative to the +% component. +% \fi +% \end{optionlist} +% +% \ifENGLISH\subsection{Connecting with nodes}\fi +% \ifGERMAN\subsection{Verbinden mit Knoten}\fi +% +% \ifENGLISH +% As mentioned earlier in this chapter, beams can connect components +% also with nodes. For raytracing you need a plane, which can be created +% automatically or manually in different ways. +% \fi +% \ifGERMAN +% Wie vorher schon einmal erwähnt können Komponenten auch mit Knoten +% verbunden werden. Für Raytracing wird in der Regel eine Ebene +% benötigt, die auf unterschiedliche Weise automatisch oder manuell +% erstellt werden kann. +% \fi +% +% \begin{optionlist} +% \choitem[connection]{beamnodealign}{vec, conn, vector, connection} +% \ifENGLISH +% This parameter controls the alignment of the automatically created +% node interfaces. By default (\opt{connection}) the interface is +% aligned perpendicular to the direct connection between node and the +% previous interface node. +% \fi +% \ifGERMAN +% Dieser Parameter bestimmt die Ausrichtung der automatisch erstellen +% Grenzflächen. In der Voreinstellung (\opt{connection}) wird die Ebene +% vertikal zur direkten Verbindung zwischen dem Knoten und dem +% vorangegangenen Grenzflächenknoten ausgerichtet. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \pnodes(0,1){A}(2.5,1){B} + \lens[lens=3 3 2, n=2.5, abspos=0.5](A)(B) + \multido{\r=-0.3+0.3}{3}{% + \drawbeam[beampos=\r](A){}(B)} +\end{pspicture} +\end{LTXexample} +\begin{LTXexample} +\begin{pspicture}(3,2) + \pnodes(0,1){A}(3,1){B} + \lens[abspos=0.5](A)(B) + \addtopsstyle{Beam}{linecolor=black, fillstyle=solid, beamwidth=0.2, fillcolor=red, opacity=0.5, beaminside=false} + \multido{\r=-0.3+0.3}{3}{\drawwidebeam[beampos=\r](A){}(B)} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Ist der Wert auf \opt{vector} gesetzt, dann wird die Ebene vertikal +% zum einfallenden Strahlvektor ausgerichtet. Bei weiten Strahlen wird +% der gemittelte Strahlenvektor (siehe \Lcs{oeBeamVecMedian}) als +% Referenz verwendet. Beispiele in dem das sehr praktisch ist, sind +% \prettyref{ex:beamcenter} und \prettyref{ex:wgm-pdc}. +% \fi +% \ifENGLISH +% For a value \opt{vector}, the plane is aligned vertical to the +% incoming beam vector. For wide beams the mean beam vector is used (see +% \Lcs{oeBeamVecMedian}). Examples where this is very convenient are +% \prettyref{ex:beamcenter} and \prettyref{ex:wgm-pdc}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]beamnodealign}] +\begin{pspicture}(3,2) + \pnodes(0,1){A}(3,1){B} + \lens[abspos=0.5](A)(B) + \addtopsstyle{Beam}{linecolor=black, fillstyle=solid, beamwidth=0.2, beamnodealign=vector, fillcolor=green, opacity=0.5, beaminside=false} + \multido{\r=-0.3+0.3}{3}{\drawwidebeam[beampos=\r](A){}(B)} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifENGLISH +% The automatic alignment is very handy in many cases, but does not +% allow to rotate the node planes to a fixed angle and can give again +% problems with shifted and rotated components (see +% \prettyref{sec:rotshift}). In the following example the green beam is +% with \Lkeyword{beamnodealign} set to \opt{vector}, for the red beam it +% is set to \opt{connection}: +% \fi +% \ifGERMAN +% Die automatische Ausrichtung ist in vielen Fällen sehr praktisch, kann +% aber wiederum unerwünschte Ergebnisse bei gedrehten und verschobenen +% Komponenten ergeben und die Ebenenausrichtung kann nicht beliebig +% gesetzt werden. Im folgenden Beispiel ist beim grünen Strahl +% \Lkeyword{beamnodealign} auf \opt{vector} gesetzt, bei dem roten +% Strahl hingegen auf \opt{connection}: +% \fi +% +% \hspace*{\fill}% +% \begin{pspicture}(4,2.7) +% \pnodes(0,0.5){A}(4,0.5){B} +% \lens[compshift=0.5, abspos=1, lens=1.5 1.5 2](A)(B) +% \drawwidebeam[beamalign=absolute, linecolor=black, fillstyle=solid, beamwidth=0.6, fillcolor=green, opacity=0.5, beamnodealign=vector](A){}(B) +% \rput[rb](4,0){\ttfamily vector} +% \end{pspicture} +% \hspace*{1cm}% +% \begin{pspicture}(5,3) +% \pnodes(0,0.5){A}(4,0.5){B} +% \lens[compshift=0.5, abspos=1, lens=1.5 1.5 2](A)(B) +% \drawwidebeam[beamalign=absolute, linecolor=black, fillstyle=solid, beamwidth=0.6, fillcolor=red, opacity=0.5](A){}(B) +% \rput[rb](5,0){\ttfamily connection} +% \end{pspicture} +% \hspace*{\fill}% +% +% \ifENGLISH +% For more flexibility, the package provides an «invisible» plane which +% can be used for this purpose. +% \fi +% \ifGERMAN +% Das kann mit einer «unsichtbaren» Ebene erreicht werden, die mit +% \Lcomp{optplane} definiert wird. +% \fi +% +% \begin{ltxsyntax} +% \xLcomp{optplane}\compitem{optplane}(center) +% +% \ifENGLISH +% The plane is defined by a single node only, the rotation around this node +% is defined with \Lkeyword{angle}. The angle is with respect to the default +% alignment, which is vertical. +% \fi +% \ifGERMAN Die Ebene wird durch lediglich einen Knoten definiert, die Drehung +% darum kann mit \Lkeyword{angle} angegeben werden. Der Winkel ist relativ zur +% ursprünglichen, vertikalen Ausrichtung. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \pnodes(0,1){A}(2.5,1){B} + \lens[lens=3 3 2, n=2.5, abspos=0.5](A)(B) + \optplane[angle=-30](B) + \multido{\r=-0.3+0.3}{3}{% + \drawbeam[beampos=\r](A){-}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH\subsection{Automatic connections}\fi +% \ifGERMAN\subsection{Automatische Verbindungen}\fi +% +% \ifENGLISH +% Beam can also be drawn at definition time of a component, which can be handy, +% but allows only very elemental beams. +% \fi +% \ifGERMAN Lichtstrahlen können auch zusammen mit der Komponentendefinition +% gezeichnet werden. Das kann für einfache Strahlengänge sehr praktisch sein, +% ist aber sehr unflexibel. +% \fi +% +% \begin{optionlist} +% \boolitem[false]{beam} +% \ifGERMAN Kann als Option für jede Komponente verwendet werden, ist äquivalent +% zu +% \fi +% \ifENGLISH Can be used as option for every component, is equivalent to the +% statement +% \fi +% \begin{lstlisting}[gobble=2] +% \drawbeam[raytrace=false](\oenodeRefA{}){}(\oenodeRefB{}) +% \end{lstlisting} +% \ifENGLISH which draws a beam from one reference node via the component to the +% other reference node. +% \fi +% \ifGERMAN womit ein Strahl vom ersten Referenzknoten über die Komponente zum +% zweiten Referenzknoten gezeichnet wird. +% \fi +% \end{optionlist} +% +% \ifENGLISH\subsection{Beam appearance}\fi +% \ifGERMAN\subsection{Strahlaussehen}\fi +% \label{sec:beamappearance-single} +% +% \begin{stylelist} +% \styleitem[linecolor=green!90!black, linejoin=1]{Beam} +% \ifENGLISH +% The appearance of beams is controlled with this style. The optional argument +% of \nxLcs{draw*beam} can also be used, these options can overwrite settings from +% the \Lstyle{Beam} style. +% \fi +% \ifGERMAN +% Das Aussehen der Lichtstrahlen kann mit diesem Stil gesteuert werden. Das +% optionale Argument von \nxLcs{draw*beam} kann ebenfalls dafür verwendet +% werden und kann die Einstellungen des \Lstyle{Beam}-Stils überschreiben. +% \fi +% \end{stylelist} +% +% \begin{optionlist} +% \valitem{addtoBeam}{list} +% \addtostylemsg{Beam} +% \valitem{newBeam}{list} +% \newstylemsg{Beam} +% +% \psnumitem[0.2]{ArrowInsideMinLength} +% \ifGERMAN +% \nxLcs{draw*beam} verwendet auch die Option \Lkeyword*{ArrowInside} aus +% \LPack{pstricks-add}. In dem Fall wird für alle Strahlsegmente ein Pfeil +% gezeichnet, was häufig für die internen, kurzen Strahlengänge unerwünscht +% ist. Mit \Lkeyword{ArrowInsideMinLength} kann angegeben werden ab welcher +% Mindestlänge eines Strahlsegmentes die Pfeil gezeichnet werden. In dem +% folgenden Beispiel ist der Wert so gewählt, dass nur der untere interne +% Strahl einen Pfeil hat (siehe auch \prettyref{ex:czerny-turner}). +% \fi +% \ifENGLISH +% \nxLcs{draw*beam} uses also the option \Lkeyword*{ArrowInside} from +% \LPack{pstricks-add}. In this case the arrows would be drawn for every beam +% segment, which is often undesired for the internal, short beam +% paths. \Lkeyword{ArrowInsideMinLength} sets a minimum segment length, below +% which no internal arrows are drawn. In the following example the value is +% selected such that only the lower internal beam has an arrow (see also +% \prettyref{ex:czerny-turner}). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{ArrowInsideMinLength}}] +\begin{pspicture}(3,2) + \optprism(0,1)(2,1)(3,0.5) + \drawwidebeam[beamwidth=0.4, ArrowInside=->, ArrowInsideMinLength=0.5, arrowscale=1.5, raytrace=false](0,1){}(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \psnumitem[-1]{ArrowInsideMaxLength} +% \ifGERMAN Gibt analog zu \Lkeyword{ArrowInsideMinLength} die maximale Länge +% eines Segments an, für das Pfeile gezeichnet werden. Ist der Wert negativ, +% dann gibt es keine obere Grenze. +% \fi +% \ifENGLISH Like \Lkeyword{ArrowInsideMaxLength}, but sets the maximum length +% of a segment for which the arrows are drawn. If the value is negative, no +% upper limit is defined. +% \fi +% \end{optionlist} +% +% \ifGERMAN \Lkeyword*{ArrowInside} kann auch verwendet werden ohne dass +% ein Linientyp definiert ist. +% \fi +% \ifENGLISH \Lkeyword*{ArrowInside} can be used also without a +% linestyle. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(0,0)(3.5,2) + \pnodes(0,1.5){A}(2,1.5){B}(2.8,0){C} + \mirror[mirrorwidth=1.2, mirrortype=extended](A)(B)(C) + \newpsstyle{Beam}{linecolor=green, linestyle=none, fillstyle=solid, fillcolor=green, opacity=0.2} + \drawwidebeam[beamwidth=0.5](A){}(C) + \drawbeam[ArrowInside=->, arrowscale=2.5, ArrowFill=false, linewidth=1.5\pslinewidth, ArrowInsidePos=0.9, ArrowInsideMaxLength=1.8](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{stylelist} +% \typeitem{fade}{\prm{linestyle}} +% \ifENGLISH +% Fade from the current \opt{linecolor} to another color, defined by +% \Lkeyword{fadeto}. The line style currently works only for line, not +% for curves. The complete path is divided in \Lkeyword{fadepoints}$ - +% 1$ segments. +% \fi +% \ifGERMAN +% Erzeugt einen Farbverlauf von der aktuellen \opt{linecolor} zu einer +% anderen Farbe, definiert durch \Lkeyword{fadeto}. Der Linienstil +% funktioniert momentan nur vernünftig mit Linien, nicht jedoch mit +% Kurven. Der gesamte Pfad wird in \Lkeyword{fadepoints}$- 1$ Segmente +% unterteilt. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1) + \psline[linewidth=0.2, linecolor=red, linestyle=fade, fadepoints=50](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% \begin{optionlist} +% \choitem[white]{fadeto}{white, black, transparency} +% \ifENGLISH +% The color at the fade end, depends on \Lkeyword{fadefuncname} and +% \Lkeyword{fadefunc}. +% \fi +% \ifGERMAN +% Die Endfarbe des Farbverlaufs, hängt auch von \Lkeyword{fadefuncname} +% und \Lkeyword{fadefunc} ab. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1) + \psset{linewidth=0.2, linecolor=red, linestyle=fade, fadepoints=50} + \psline[fadeto=white](0,0.9)(3,0.9) + \psline[fadeto=black](0,0.5)(3,0.5) + \psline[fadeto=transparency](0,0.1)(3,0.1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \numitem[200]{fadepoints} +% \ifENGLISH +% Number of points used for lines with style \opt{fade}. +% \fi +% \ifGERMAN +% Anzahl der Punkte, die für den Linienstil \opt{fade} verwendet werden. +% \fi +% +% \choitem[linear]{fadefuncname}{gauss, linear, squared, exp, custom} +% \ifENGLISH +% Some predefined fade functions, which determine the color gradient. If +% set to \opt{custom}, the Postscript code in \Lkeyword{fadefunc} is +% used. +% \fi +% \ifGERMAN +% Ein paar vordefinierte Funktionen, die den Farbverlauf bestimmen. Wird +% \opt{custom} angegeben, dann wird der Postscript-Code aus +% \Lkeyword{fadefunc} verwendet. +% \fi +% +% \valitem{fadefunc}{PS code} +% \ifENGLISH +% Define a custom gradient for line style \Lkeyword{fade}. The \prm{PS +% code} must evaluate a number on the stack in the range $[0,1]$ (0: +% path start, 1: path end) to $[0,1]$ (0: \Lkeyword{fadeto} color, 1: +% current line color). The function values are clipped to $[0,1]$. +% \fi +% \ifGERMAN +% Eine benutzerdefinierte Funktion für den Farbverlauf des Linienstils +% \Lkeyword{fade}. Der \prm{PS code} muss eine Zahl auf dem Stack im +% Intervall $[0,1]$ (0: Pfadanfang, 1: Pfadende) auf das Intervall $[0, +% 1]$ abbilden (0: \Lkeyword{fadeto}-Farbe, 1: aktuelle +% Linienfarbe). Die Funktionswerte werden auf das Intervall $[0, 1]$ +% abgeschnitten. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1) + \psset{linewidth=0.2, linecolor=red, linestyle=fade, fadepoints=50} + \psline[fadefuncname=gauss](0,1)(3,1) + \psline[fadefuncname=exp](0,0.7)(3,0.7) + \psline[fadefuncname=custom, fadefunc={360 mul cos 1 add 0.5 mul}](0,0.4)(3,0.4) + \psline[fadefuncname=custom, fadefunc={neg 1 add 2 mul}](0,0.1)(3,0.1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH For a nice example see \prettyref{ex:dsotm}.\fi +% \ifGERMAN Ein schönes Beispiel ist \prettyref{ex:dsotm}.\fi +% \end{optionlist} +% +% \ifGERMAN\section{Aufgeweitete Strahlen}\fi +% \ifENGLISH\section{Drawing wide beams}\fi +% \label{sec:drawwidebeam} +% +% \ifENGLISH +% All information about single beams (see \prettyref{sec:drawbeam}) apply to +% wide beams as well. Here, you find all additional information which apply to +% wide beams only. +% \fi +% \ifGERMAN +% Alle Informationen über einfache Strahlen (siehe \prettyref{sec:drawbeam}) +% betreffen auch aufgeweitete Strahlen. Hier werden nur zusätzliche +% Einstellmöglichkeiten aufgeweiteter Strahlen behandelt. +% \fi +% +% \begin{ltxsyntax} +% \xLcs{drawwidebeam}\cmditem{drawwidebeam}[options]{obj$_1$}{obj$_2$}\ldots +% \end{ltxsyntax} +% +% \begin{optionlist} +% \psnumitem[0]{beamwidth} +% \ifENGLISH The initial beam width, measured at the initial position (defined +% with \Lkeyword{beampos}) perpendicular to the beam direction. +% \fi +% \ifGERMAN Die Anfangsstrahlbreite an der mit \Lkeyword{beampos} angegebenen +% Position, gemessen vertikal zur Verbindungslinie zur nächsten Komponente. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beamwidth}}] +\begin{pspicture}(4,4) + \pnodes(1.5,0.5){A}(3.5,0.5){B}(3.5,3.5){C} + \optbox[position=end](B)(A) + \mirror[mirrortype=extended](A)(B)(C) + \optplate[position=end](B)(C) + \drawwidebeam[beamwidth=0.3]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \psnumitem[0]{beamdiv} +% \ifENGLISH The total beam divergence at the starting position, given in +% degree. Positive values give an expanding beam, negative values a contracting +% beam. +% \fi +% \ifGERMAN Die Strahldivergenz an der Startposition, angegeben in +% Grad. Positive Werte ergebenen einen expandierenden Strahl, negative einen +% kontrahierenden. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{beamdiv}}, linerange={1-8,11-11}] +\begin{pspicture}(3,2) + \pnodes(0,1){A}(3,1){B} + \psset{plateheight=2} + \optplate[position=start](A)(B) + \optplate[position=end](A)(B) + \addtopsstyle{Beam}{beamwidth=0.2} + \drawwidebeam[beampos=0.4, beamdiv=5]{-} + \drawwidebeam[beampos=-0.4, beamdiv=-5, linecolor=red]{-} + \rput[b](1.5,0){\footnotesize\ttfamily beamdiv < 0} + \rput[t](1.5,2){\footnotesize\ttfamily beamdiv > 0} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifENGLISH\subsection{Beam appearance}\fi +% \ifGERMAN\subsection{Strahlaussehen}\fi +% +% \ifENGLISH +% The appearance of wide beams can be controlled like that of single beams with +% the optional argument or the \Lstyle{Beam} style (see +% \prettyref{sec:beamappearance-single}). +% +% Wide beams have two marginal rays, which are drawn according to the line +% settings, and may be filled. +% \fi +% \ifGERMAN Das Aussehen aufgeweiteter Strahlen kann genauso wie bei einfachen +% Strahlen über \Lstyle{Beam} oder das optionale Argument vorgegeben werden +% (siehe \prettyref{sec:beamappearance-single}). +% +% Breite Strahlen bestehen aus zwei Randstrahlen, die gemäß der +% Linieneinstellungen gezeichnet werden, und können zusätzlich gefüllt werden. +% \fi +% +% \begin{enumerate} +% \item +% \ifENGLISH Only marginal rays.\fi +% \ifGERMAN Nur die Randstrahlen.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2) + \pnodes(0,0.5){A}(1,0.5){B}(2.8,2){C} + \mirror[mirrorwidth=1.5](A)(B)(C) + \drawwidebeam[beamwidth=0.4](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Marginal rays, and with fill style.\fi +% \ifGERMAN Randstrahlen, und Füllstil.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fillstyle, linestyle}] +\begin{pspicture}(3,2) + \pnodes(0,0.5){A}(1,0.5){B}(2.8,2){C} + \mirror[mirrorwidth=1.5](A)(B)(C) + \addtopsstyle{Beam}{fillstyle=solid, fillcolor=red!50!white, linecolor=red} + \drawwidebeam[beamwidth=0.4](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Only with fill style.\fi +% \ifGERMAN Nur Füllstil.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fillstyle, linestyle}] +\begin{pspicture}(3,2) + \pnodes(0,0.5){A}(1,0.5){B}(2.8,2){C} + \mirror[mirrorwidth=1.5](A)(B)(C) + \addtopsstyle{Beam}{fillstyle=solid, fillcolor=red, opacity=0.3, linestyle=none} + \drawwidebeam[beamwidth=0.4](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \ifGERMAN\section{Fehlerbehandlung}\fi +% \ifENGLISH\section{Error handling}\fi +% \label{sec:error-handling} +% +% \ifGERMAN +% Alle Strahlen werden direkt mit Postscript berechnet und gezeichnet, +% so dass eine umfassende Fehlerbehandlung zur Zeit der Kompilation +% nicht möglich ist. Um jedoch trotzdem fehlerfreie Bilder zu bekommen, +% wird der Strahlengang abgebrochen, sobald eine Situation eintritt, die +% nicht unterstützt wird. Das kann eintreten, falls der Strahl eine +% Grenzfläche nicht trifft, Totalreflektion auftritt oder wenn die +% folgende Komponente keine Freistrahlverbindungen unterstützt. Die +% folgenden Beispiele zeigen Situationen, in denen diese Fehler +% auftreten: +% \fi +% \ifENGLISH +% All beam are calculated and drawn directly in Postscript, so that a +% comprehensive error handling at compilation time is not possible. If a +% situation arises which is not supported by the drawing algorithm, the beam +% path is truncated at this point. This happens in the following cases: +% \fi +% \begin{enumerate} +% \item +% \ifENGLISH A beam misses an interface. The red beam in the following example +% misses the last plane and is truncated at the last valid interface. +% \fi +% \ifGERMAN Ein Strahl trifft eine Grenzfläche nicht. Der rote Strahl in dem +% folgenden Beispiel verpasst die letzte Grenzfläche und endet daher an der +% vorhergehenden. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.7) + \pnodes(0,1){A}(3,1){B} + \optplate[position=start](A)(B) + \lens[lens=4 4 2, abspos=0.5, n=2.5](A)(B) + \optplate[position=end, plateheight=0.5](A)(B) + \drawbeam{-} + \drawbeam[beampos=0.2]{-} + \drawbeam[beampos=0.4, linecolor=red]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Total internal reflection occurs at an interface which is +% not set up for this. The red beam in the following example would be +% reflected, but this is not supported and the beam is truncated at the +% interface where the total internal reflection occurs. +% \fi +% \ifGERMAN Totale interne Reflektion tritt an einer Grenzfläche auf, die +% nicht dafür vorgesehen ist. Der rote Strahl im folgenden Beispiel würde +% reflektiert werden, aber das wird für diese Komponente nicht unterstützt und +% der Strahl endet an der total reflektierenden Grenzfläche. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.5) + \pnodes(0,2){A}(3,0){B} + \optplane(A) + \optprism[n=1.8](A)([Xnodesep=1.5]A)(B) + \optplane(B) + \drawbeam[beamangle=5]{-} + \drawbeam[beamangle=-5, linecolor=red]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Dasselbe gilt ebenfalls für aufgeweitete Strahlen (siehe +% \prettyref{sec:drawwidebeam}). Bei diesen wird der Strahlengang abgebrochen, +% falls einer der beiden Randstrahlen einen Fehler aufweist. +% \fi +% \ifENGLISH These conditions apply to wide beams (see \prettyref{sec:drawwidebeam}) as +% well, the beam path is interrupted as soon as one of the marginal rays has an +% error. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.5) + \pnodes(0,2){A}(3,0){B} + \optplane(A) + \optprism[n=1.8](A)([Xnodesep=1.5]A)(B) + \optplane(B) + \drawwidebeam[beamdiv=10, linecolor=red]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifGERMAN Eine Komponente soll verbunden werden, die jedoch keine +% Freistrahlverbindungen unterstützt. In diesem Fall wird die falsche +% Komponente und alle Folgenden ignoriert. +% \fi +% \ifENGLISH A component is to be connected, which does not support +% free-ray connections. In this case, the wrong component and all +% following ones are ignored. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,2.7) + \pnodes(0,1){A}(2,1){B} + \optplate[position=start](A)(B) + \lens[lens=4 4 2, abspos=0.5, n=2.5](A)(B) + \fiberdelayline[fdlsize=1 0.7, position=end, fiber=none](A)(B) + \drawbeam[beampos=0.2, linecolor=red]{-} + \drawbeam[beampos=-0.2, linecolor=blue, beaminsidelast]{-} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \begin{optionlist} +% \boolitem[false]{pswarning} +% \ifENGLISH To simplify debugging, you can have a message printed out +% if any of these situations arises. The message will be printed to +% standard output, when a Postscript interpreter reads the file, +% e.g. when you view the file, or you convert it with \opt{ps2pdf} or +% similar. +% \fi +% \ifGERMAN Um eine Fehlersuche zu vereinfachen kann ein Hinweis +% ausgegeben werden sobald ein Strahlengang vorzeitig beendet. Die +% Fehlermeldung wird auf die Standardausgabe geschrieben, wenn die +% Datei mit einem Postscript-Interpreter gelesen wird, also mit einem +% Betrachter geöffnet oder z.B. mit \opt{ps2pdf} konvertiert wird. +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Angepasste Strahlen}\fi +% \ifENGLISH\section{Custom beams}\fi +% \label{sec:custombeam} +% +% \ifGERMAN +% Im Prinzip können alle Strahlengänge mit passender Wahl des Brechungsindex und +% der Komponentenparameter (z.B. der Linsenkrümmung) realisiert werden, was +% jedoch sehr aufwendig werden kann. Um das zu vereinfachen, besteht die +% Möglichkeit die Endpunkte eines Strahls als Anfangspunkte für folgende +% Strahlen zu nutzen, so dass man abschnittsweise die Divergenz und die +% Ausbreitungsrichtung definieren kann. +% \fi +% \ifENGLISH +% In principal, all kind of beam paths can be realized with an +% appropriate choice of refractive index and component parameters +% (e.g. lens curvature). This can become very cumbersome, so that the +% package provides the means to simplify this. The end points of one +% beam path can be used as starting points for the next beam, which +% allows piecewise definition of the beam divergence, angle, and +% direction. +% \fi +% +% \begin{optionlist} +% \choitem[true]{savebeampoints}{true,false,\prm{int}} +% \ifGERMAN Speichert die Endpunkte eines \nxLcs{draw*beam} Makros, +% vorangegangene Punkte werden überschrieben. \Lcs{drawbeam} und +% \Lcs{drawwidebeam} werden getrennt behandelt. Wird hier eine Zahl +% \prm{int} $> 0$ angegeben, so können beliebig viele Endpunkte +% separat gespeichert werden, siehe z.B. \prettyref{ex:ratchet}. In +% der Regel reicht an- und abschalten vollkommen aus, was den Zahlen 1 +% und 0 entspricht. +% \fi +% \ifENGLISH Saves the end points of a \nxLcs{draw*beam} macro, +% previous points are overwritten. \Lcs{drawbeam} and +% \Lcs{drawwidebeam} are treated separately. If a number \prm{int} $> +% 0$ is given, you can save as many end points as you like, see +% e.g. \prettyref{ex:ratchet}. But in most cases enabling (1) and +% disabling (0) this option is sufficient. +% \fi +% +% \choitem[false]{loadbeampoints}{true,false,\prm{int}} +% \ifGERMAN Verwende die Endpunkte eines vorangegangenen Strahls als +% Startpunkte. Wird keine Zahl \prm{int} angegeben, dann wird \opt{1} +% verwendet. +% \fi +% \ifENGLISH Use the end points of a previous beam as starting points for the +% next beam. If no number \prm{int} is specified, \opt{1} is used. +% \fi +% \end{optionlist} +% +% \ifGERMAN Als Beispiel nehmen wir ein Teleskop, die Strahldivergenz am Eingang +% und am Ausgang ist Null. Anstatt die Linsenparameter und den Brechungsindex +% genau einzustellen, so dass die Ausgangsdivergenz Null ist, zeichnen wir +% einfach die drei Strahlenteile mit den gewünschten Divergenzen, und verwenden +% die Endpunkte des jeweils vorangegangenen Strahls als neue Ausgangspunkte. +% \fi +% \ifENGLISH As example we consider a telescope which has no divergence at the +% input and output. Usually we would need to tweak the refractive index and the +% lens parameters to get an output beam without divergence. Instead, we draw the +% three beam parts separately using the end points of the previous beams as new +% starting points and specifying the divergence for each beam part +% explicitely. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{savebeampoints, loadbeampoints}}] +\begin{pspicture}(4,2) + \pnodes(0,1){A}(4,1){B} + \begin{optexp} + \lens[lens=0.5 0.5 0.5, abspos=0.5](A)(B) + \lens[lens=4 4 2, abspos=2](A)(B) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \psset{loadbeampoints} + \drawwidebeam[beamwidth=0.2, stopinside](A){1} + \drawwidebeam[beamdiv=-60]{1}{2} + \drawwidebeam{2}(B) + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Als weiteres Beispiel betrachten wir die Beugung an einem Gittern in +% die nullte und erste Beugungsordnung. Zuerst wird der Strahl von dem Eingang +% bis zum Gitter gezeichnet, die Endpunkte dieses Strahls werden nun für die +% Strahlen in beide Beugungsordnungen verwendet. +% \fi +% \ifENGLISH The next example shows diffraction from a grating in the zeroth and +% first diffraction order. First we draw the beam to the grating, its end points +% are used for the beams into both diffraction orders. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{savebeampoints, loadbeampoints}}, + linerange={1-12,16-16}, caption={caption}, label={ex:loadbeampoints}] +\begin{pspicture}(3.5,3.5) + \pnodes(0,0.5){A}(2,0.5){B}(2,3){C} + \nodexn{(C)-(1,0)}{C'} + \nodexn{(C)(1,0)}{C''} + \optgrating(A)(B)(C) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \drawwidebeam[beamwidth=0.3](A){1} + \psset{savebeampoints=false, loadbeampoints} + \drawwidebeam{1}(C) + \drawwidebeam{1}(C') + \drawwidebeam{1}(C'') + \rput[b]([offset=0.2]C){0th} + \rput[b]([offset=0.2]C'){1st} + \rput[b]([offset=0.2]C''){-1st} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \choitem[true]{savebeam}{true,false,\prm{int}} +% \ifGERMAN Speichert die Endzustände, d.h. Endpunkte und Ausgangsvektoren, +% eines \nxLcs{draw*beam} Makros, vorangegangene Werte werden +% überschrieben. \Lcs{drawbeam} und \Lcs{drawwidebeam} werden getrennt +% behandelt. Wird hier eine Zahl \prm{int} $> 0$ angegeben, so können beliebig +% viele Strahlen separat gespeichert werden. In der Regel reicht an- und +% abschalten vollkommen aus. +% \fi +% \ifENGLISH Saves the end conditions, i.e. end points and output vectors, of +% each \nxLcs{draw*beam} macro, previous values are +% overwritten. \Lcs{drawbeam} and \Lcs{drawwidebeam} are treated +% separately. If a number \prm{int} $> 0$ is given, you can save as many end +% points as you like, but in most use cases enabling and disabling this option +% is sufficient. +% \fi +% +% \choitem[false]{loadbeam}{true,false,\prm{int}} +% \ifGERMAN Verwende den Endzustand (Punkte und Richtung) eines +% vorangegangenen Strahls als Anfangszustand. Der Parameter +% \Lkeyword{beamangle} kann verwendet werden um die Richtung relativ zu der +% geladenen zu verändern (siehe folgendes Beispiel). +% \fi +% \ifENGLISH Use the end condition (points and vectors) of a previous beam as +% starting conditions for the next beam. The parameter \Lkeyword{beamangle} +% can be used to change the direction relative to the loaded one (see +% following example). +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{savebeam, loadbeam}}, + linerange={1-10,14-14}, caption={caption}, label={ex:loadbeam}] +\begin{pspicture}(3.5,3.5) + \pnodes(0,0.5){A}(2,0.5){B}(2,3){C} + \optgrating(A)(B)(C) + \addtopsstyle{Beam}{% + fillstyle=solid, fillcolor=green, opacity=0.3} + \drawwidebeam[savebeam, beamwidth=0.3](A){1} + \psset{savebeam=false, loadbeam} + \drawwidebeam[beamangle=-20]{1}(C) + \drawwidebeam{1}(C) + \drawwidebeam[beamangle=20]{1}(C) + \rput[b]([offset=0.2]C){0th} + \rput[b]([Xnodesep=-0.9, offset=0.2]C){1st} + \rput[b]([Xnodesep=0.9,offset=0.2]C){-1st} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Beachten Sie, dass \Lkeyword{loadbeam} und +% \Lkeyword{savebeam} nicht immer funktionieren, wenn der Strahlengang an +% einem halbdurchlässigen Spiegel oder einem Strahlteiler endet. In +% diesen Fällen wird nur der transmittierte Strahlvektor gespeichert, +% soll der Strahlengang über den reflektierenden Weg fortgesetzt werden, +% so ist das nicht möglich. +% +% In den beiden folgenden Beispielen wird demnach der rote Strahl, der +% von der Komponente zum Knoten \prm{B} fortgesetzt werden soll, nicht +% gezeichnet. +% \fi +% \ifENGLISH Please note, that \Lkeyword{loadbeam} and +% \Lkeyword{savebeam} do not always work, if the beam path ends inside a +% semitransparent mirror or a beamsplitter. In these cases only the +% transmitted ray vector is saved and continuing the beam via the +% reflective path is not possible. +% +% Accordingly, in the following examples the red beam is not drawn, +% which should continue the green beam from the component to node +% \prm{B}. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-6,9-9}, morekeywords={[21]{savebeam, loadbeam}}] +\begin{pspicture}(3,1.5) + \pnodes(0,0.5){A}(1.5,1.5){B}(3,0.5){C} + \beamsplitter(A)(1.5,0.5)(B) + \drawbeam[beaminsidelast, savebeam](A){} + \drawbeam[linecolor=red, beaminsidefirst, loadbeam]{}(B) + \drawbeam[linecolor=blue, beaminsidefirst, loadbeam]{}(C) + \psdot(B)\uput[-30](B){B} + \psdot(C)\uput[-120](C){C} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-6,9-9}, morekeywords={[21]{savebeam, loadbeam}}] +\begin{pspicture}(3,1.5) + \pnodes(0,0.5){A}(1.5,1.5){B}(3,0.5){C} + \mirror[mirrortype=semitrans](A)(1.5,0.5)(B) + \drawbeam[beaminsidelast, savebeam](A){} + \drawbeam[linecolor=red, beaminsidefirst, loadbeam]{}(B) + \drawbeam[linecolor=blue, beaminsidefirst, loadbeam]{}(C) + \psdot(B)\uput[-30](B){B} + \psdot(C)\uput[-120](C){C} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% +% +% \begin{optionlist} +% \boolitem[false]{startinside} +% \ifENGLISH +% The parameter \Lkeyword{beaminsidefirst} controls if the internal beams are +% drawn inside the first component. However, for custom beams it can also be +% necessary to trace the internal beam of the first component without drawing +% it, e.g. if the previous beam ended at the first interface. +% +% In the following example the red beam is the wrong continuation of the +% incoming green beam because it assumes that the loaded beam conditions refer +% to the output interface. But the previous beam stopped at the input +% interface, so one needs to set \Lkeyword{startinside} in order to continue +% the beam properly (see blue beam). The dashed line helps to understand the +% correct beam path through the lens. +% \fi +% \ifGERMAN Mit dem Parameter \Lkeyword{beaminsidefirst} kann eingestellt +% werden, ob der interne Strahlengang in der erste Komponente gezeichnet +% wird. Für angepasste Strahlengänge kann es aber notwendig sein dem internen +% Strahlengang in der ersten Komponente zu folgen ohne diesen zu zeichnen, +% z.B. wenn der vorangegangene Strahl an der ersten Grenzfläche schon endet. +% +% Im folgenden Beispiel wird der einfallende grüne Strahl falsch durch den +% roten Strahl fortgesetzt, da der grüne an der linken Grenzfläche endet, der +% rote aber fälschlicherweise annimmt, dass der Endzustand sich auf die rechte +% Grenzfläche bezieht. Dem blauen Strahl wird nun mit \Lkeyword{startinside} +% mitgeteilt, dass der Endzustand sich auf die linke Grenzfläche bezieht. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{startinside}}] +\begin{pspicture*}(0,2)(3.05,6) + \optplane(0,2) + \lens[lens=8 8 8, abspos=0.6, n=1.8](0.5,2)(3,2) + \optplate[position=1, plateheight=6](0.5,2)(3,2) + \psset{savebeam=false} + \drawbeam[beampos=3, linestyle=dashed]{-} + \drawbeam[beampos=3, savebeam]{1-2} + \drawbeam[loadbeam, linecolor=red]{2-3} + \drawbeam[loadbeam, startinside, linecolor=blue]{2-3} +\end{pspicture*} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \boolitem[false]{stopinside} +% \ifENGLISH This option is equivalent to \Lkeyword{startinside} but refers +% to the last component. +% \fi +% \ifGERMAN Äquivalent zu \Lkeyword{startinside}, bezieht sich aber auf die +% letzte Komponenten. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords = {[21]{stopinside}}] +\begin{pspicture*}(0,2)(3.05,6) + \optplane(0,2) + \lens[lens=8 8 8, abspos=0.6, n=1.8](0.5,2)(3,2) + \optplate[position=1, plateheight=6](0.5,2)(3,2) + \psset{savebeam=false} + \drawbeam[beampos=3, linestyle=dashed]{-} + \drawbeam[beampos=3, savebeam, stopinside]{1-2} + \drawbeam[loadbeam, linecolor=blue]{2-3} +\end{pspicture*} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% +% \ifGERMAN\section{Faserverbindungen}\fi +% \ifENGLISH\section{Drawing fibers}\fi +% \label{sec:drawfiber} +% +% \ifENGLISH +% All available components can be connected with fiber connections, the +% fiber components in \prettyref{chap:fibercomp} are connected automatically. +% \fi +% \ifGERMAN +% Alle Komponenten können mit Fasern verbunden werden, die Faserkomponenten +% in \prettyref{chap:fibercomp} werden automatisch verbunden. +% \fi +% +% \begin{ltxsyntax} +% \xLcs{drawfiber}\cmditem{drawfiber}[options]{obj$_1$}{obj$_2$}\ldots +% \end{ltxsyntax} +% \ifENGLISH +% This macro draws fiber connections and takes a variable number of +% arguments (minimum of two) which can be either an ID, an ID range, a +% \Lkeyword{compname}, or a PSTricks node (see +% \prettyref{sec:accessobj}). To distinguish between nodes and +% components, nodes must be either enclosed in parenthesis within the +% brackets, or enclosed only in parenthesis: +% \Lcs{drawfiber}\opt{\{(node)\}\{comp\}}, or +% \Lcs{drawfiber}\opt{(node)\{comp\}}. If you specify more than two +% arguments, it draws the connections $1\rightarrow 2$, $2\rightarrow +% 3$, and so on. +% +% The automatic fiber connections are drawn internally with +% \Lcs{drawfiber} commands from each reference node to the component. +% \fi +% \ifGERMAN +% Dieses Makro zeichnet Faserverbindungen und akzeptiert eine variable +% Anzahl an Argumenten (mindestens zwei), die entweder eine ID, ein +% ID-Intervall, ein \Lkeyword{compname} oder ein PSTricks-Knoten sein +% können (siehe \prettyref{sec:accessobj}. Um zwischen Knoten und +% Komponenten unterscheiden zu können, müssen Knoten entweder in runde +% Klammern innerhalb der geschweiften Klammern eingeschlossen werden +% oder dürfen nur runde Klammern haben: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, oder +% \Lcs{drawbeam}\opt{(node)\{comp\}}. Werden mehr als zwei Argumente +% mitgegeben, werden die Verbindungen $1\rightarrow 2$, $2\rightarrow +% 3$, usw. gezeichnet. +% +% Die automatischen Faserverbindungen werden intern als +% \Lcs{drawfiber} von den Referenzknoten zur Komponente gezeichnet. +% \fi +% +% \ifENGLISH\subsection{Fiber angles}\fi +% \ifGERMAN\subsection{Faserwinkel}\fi +% \label{sec:drawfiber-angles} +% +% \ifENGLISH +% The fibers are usually drawn as \Lcs*{nccurve} connections, the angles at both +% curve ends are automatically determined by the component orientation and +% depend on whether you connect a component with a component, or a component +% with a node. +% \fi +% \ifGERMAN +% Üblicherweise werden Fasern als \Lcs*{nccurve}-Verbindungen gezeichnet, die +% Winkel an beiden Kurvenenden werden automatisch anhand der +% Komponentenausrichtung bestimmt und hängen davon ab, ob eine Komponente mit +% einer anderen Komponente oder einem Knoten verbunden wird. +% \fi +% +% \ifENGLISH\minisec{Component with node}\fi +% \ifGERMAN\minisec{Komponente mit Knoten}\fi +% +% \ifENGLISH +% A connection of a component with a node is what is used for automatic +% connections (see \prettyref{sec:drawconn-auto}). Consider the following +% example for clarification of the curve alignment: +% \fi +% \ifGERMAN +% Eine Verbindung zwischen einer Komponente und einem Knoten ist das, was bei +% automatischen Verbindungen verwendet wird (siehe +% \prettyref{sec:drawconn-auto}). Folgendes Beispiel erläutert die Ausrichtung +% der Kurve: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,10-11}] +\begin{pspicture}(-1,-0.7)(7,2.7) + \pnodes(0,1){A}(6,1){B} + \optbox[angle=30](A)(B) + \psdot(\oenodeRefA{})\uput[180](\oenodeRefA{}){RefA}% + \psdot(\oenodeRefB{})\uput[0](\oenodeRefB{}){RefB}% + \psdot(\oenodeTrefA{})\uput[180](\oenodeTrefA{}){TrefA}% + \psdot(\oenodeTrefB{})\uput[0](\oenodeTrefB{}){TrefB}% + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{})(\oenodeTrefB{}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \drawfiber(A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH +% The angle at the component itself agrees with the transformed reference line. +% The angle at the node corresponds to the angle of the original reference line +% of the component which it gets connected to. The fiber is always directed to +% the component node. +% +% Considering the following example, this means that the start angles of the red +% fibers are rotated by 180° with respect to the blue fibers. The angles at the +% component do not change. +% \fi +% \ifGERMAN +% Der Winkel an der Komponente entspricht dem der transformierten +% Referenzlinie. Der Winkel an dem Knoten entspricht dem der ursprünglichen +% Referenzlinie der Komponente zu der die Verbindung geht. Die Faser ist in +% Richtung des entsprechenden Komponentenknotens orientiert. +% +% Das führt dazu, dass im folgenden Beispiel die Anfangswinkel der roten Fasern +% um 180° gegenüber den blauen Fasern gedreht sind, die Winkel an der Komponente +% bleiben unverändert. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-1,4-4,7-14}] +\begin{pspicture}(-2,-1.6)(2,2) + \psset[optexp]{optboxsize=1.6 0.8} + \addtopsstyle{Fiber}{ArrowInside=->, ArrowInsidePos=0.3, arrowscale=1.5} + \optbox[position=end](0,1)(0,0) + \psarc[fillstyle=solid,fillcolor=gray!20, linestyle=none](0,0){2}{0}{180} + \psline[linestyle=dashed]([Xnodesep=-2]\oenodeIn{})([Xnodesep=2]\oenodeIn{}) + \addtopsstyle{Fiber}{linecolor=blue} + \multido{\i=10+40}{5}{% + \drawfiber(2;\i){} + } + \addtopsstyle{Fiber}{linecolor=red!90!black} + \drawfiber(2;-20){} + \drawfiber(2;200){} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH\minisec{Component with component}\fi +% \ifGERMAN\minisec{Komponente mit Komponente}\fi +% +% \ifENGLISH +% This variant is very helpful to achieve smoother connections between +% components which are not aligned on the same reference line but are arranged +% maybe in a loop or similar, see \prettyref{ex:nalm} and +% \prettyref{ex:recirc-loop}. +% +% In this case, the curve angles are determined by the orientation of +% the component which the respective curve end is connected to. The +% fibers are always directed away from the component center. +% \fi +% \ifGERMAN +% Diese Variante ist sehr nützlich um glattere Verbindungen zwischen Komponenten +% zu erreichen, die nicht auf derselben Referenzlinie positioniert sind, sondern +% z.B. in einer Schleife angeordnet werden, siehe \prettyref{ex:nalm} und +% \prettyref{ex:recirc-loop}. +% +% In diesem Fall werden die Kurvenwinkel von der Komponente bestimmt, mit der +% das jeweilige Ende verbunden ist. Die Fasern zeigen immer von der +% Komponentenmitte weg. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-4,9-10}] +\begin{pspicture}(0,-0.8)(7,0.8) + \pnodes(0,0){A}(3,0){B}(4,0){C}(7,0){D} + \optbox[angle=30](A)(B) + \optbox[angle=-30](C)(D) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{1})(\oenodeTrefB{1}) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{2})(\oenodeTrefB{2}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{1})(\oenodeRefB{2}) + \psdot(\oenodeRefA{1})\psdot(\oenodeRefB{2}) + \drawfiber(A){1}{2}(D) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH These automatically calculated start and stop angles can be changed +% in a variety of ways, the available parameters are listed in the following. +% \fi +% \ifGERMAN +% Diese automatisch berechneten Winkel können vielfältig manipuliert werden, die +% möglichen Parameter sind im Folgenden aufgelistet. +% \fi +% +% \begin{optionlist} +% \choitem[relative]{fiberalign}{rel,relative,center,abs,absolute} +% \ifENGLISH Set the reference for the fiber angles. +% \fi +% \ifGERMAN +% Wählt die Referenz für die Faserwinkel. +% \fi +% \begin{valuelist} +% \item[relative] +% \ifENGLISH The fiber angles are relative to the component. When +% connecting a node to a component, the angle at the node is that of the +% component reference line. The angle at the component agrees with that of +% its transformed reference line. +% \fi +% \ifGERMAN +% Die Faserwinkel sind relativ zur Komponente. Wird ein Knoten mit der +% Komponente verbunden, so entspricht der Winkel am Knoten dem der +% Referenzlinie der Komponente. Der Winkel an der Komponente entspricht dem +% der transformierten Referenzlinie. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-4,9-10}] +\begin{pspicture}(1,-1.7)(7,1.7) + \pnodes(0,0){A}(4,0){B}(3,0){C}(7,0){D} + \optbox[angle=30](A)(B) + \optbox[angle=-30](C)(D) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{1})(\oenodeTrefB{1}) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{2})(\oenodeTrefB{2}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{1})(\oenodeRefB{2}) + \psdot(\oenodeRefA{1})\psdot(\oenodeRefB{2}) + \drawfiber(A){1}{2}(D) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item[center] +% \ifENGLISH +% The fiber angles both at the node and the component are relative to +% the connection between the involved interface node and the center +% node of the component. In most cases this is equivalent to +% \opt{relative}, but necessary e.g. for \Lcomp{optcirculator} and +% \Lcomp{elecmixer}. In the example, the green fiber shows the correct +% alignment, while the red one is with \opt{relative} alignment. +% \fi +% \ifGERMAN +% Die Winkel sowohl am Knoten als auch an der Komponente sind relativ +% zu der Verbindung zwischen dem betroffenen Komponentenknoten und der +% Komponentenmitte. Meistens ist das äquivalent zu \opt{relative}, +% wird aber z.B. für \Lcomp{optcirculator} und \Lcomp{elecmixer} +% benötigt. In dem Beispiel hat die grüne Faser die korrekte +% Ausrichtung, während die rote \opt{relative} ausgerichtet wird. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberalign}] +\begin{pspicture}(1,0)(3,2) + \addtopsstyle{Fiber}{arrowscale=1.3, arrows=->, arrowinset=0} + \optcirculator[fiber=t](0,0.5)(3,2)(1.5,0) + \drawfiber[linecolor=red]{}(1.5,0) + \drawfiber[fiberalign=center, linecolor=green]{}(1.5,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item[absolute] +% \ifENGLISH The fiber angles are absolute, no automatic values are added. +% \fi +% \ifGERMAN +% Die Faserwinkel werden als absolute Werte angegeben, die automatischen +% Winkel werden nicht berücksichtigt. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberalign}, linerange={1-3,7-8}] +\begin{pspicture}(1,-1)(4.5,1) + \pnodes(0,0){A}(4,0){B} + \optbox[angle=30](A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{})(\oenodeTrefB{}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\psdot(\oenodeRefB{}) + \drawfiber[fiberalign=abs, ncurv=1.5](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{valuelist} +% +% \numitem[0]{fiberangleA} +% \ifENGLISH An additive value for the starting angle, the total angle depends +% on \Lkeyword{fiberalign}. If this parameter is set to \opt{absolute}, then +% \Lkeyword{fiberangleA} is the total angle, otherwise its value is added to +% the calculated angle. +% \fi +% \ifGERMAN +% Ein additiver Wert für den Anfangswinkel, der gesamte Winkel hängt von +% \Lkeyword{fiberalign} ab. Ist dieser auf \opt{absolute} eingestellt, so ist +% \Lkeyword{fiberangleA} der absolute Winkel, andernfalls wird der Wert zu dem +% automatisch berechneten Winkel hinzuaddiert. +% \fi +% +% \numitem[0]{fiberangleB} +% \ifENGLISH Like \Lkeyword{fiberangleA}, but for the end angle.\fi +% \ifGERMAN Wie \Lkeyword{fiberangleB}, aber für den Endwinkel.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberangleA, fiberangleB}, linerange={1-3,7-9}] +\begin{pspicture}(0,-1)(4,1) + \pnodes(0,0){A}(4,0){B} + \optbox[angle=30](A)(B) + \psline[style=Refline, linestyle=dashed](\oenodeTrefA{})(\oenodeTrefB{}) + \psline[style=Refline, linestyle=dashed](\oenodeRefA{})(\oenodeRefB{}) + \psdot(\oenodeRefA{})\psdot(\oenodeRefB{}) + \drawfiber[fiberangleA=-90](A){} + \drawfiber[fiberangleB=-90]{}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \choitem[auto]{startnode}{auto, N, 1, 2, \ldots} +% \ifGERMAN Für die Verbindungen mit \Lcs{drawfiber} werden die Knoten +% genommen, die sich am nächsten sind. Das passt häufig, aber nicht +% immer. Hiermit kann der Startknoten explizit gewählt werden. +% \fi +% \ifENGLISH The connections with \Lcs{drawfiber} are drawn between the +% two nodes which are nearest to each other. This fits most of the time, but not +% always. With this option you can choose the start node explicitely. +% \fi +% +% \choitem[auto]{stopnode}{auto, N, 1, 2, \ldots} +% \ifGERMAN Genau wie \Lkeyword{startnode}, aber für den Stopknoten.\fi +% \ifENGLISH Like \Lkeyword{startnode}, but for the stop node.\fi +% \end{optionlist} +% +% \ifENGLISH +% The following examples show some use cases for \Lkeyword{startnode} and +% \Lkeyword{stopnode}. +% \fi +% \ifGERMAN +% Die folgenden Beispiele zeigen Anwendungsmöglichkeiten für +% \Lkeyword{startnode} und \Lkeyword{stopnode}. +% \fi +% +% \begin{enumerate} +% \item +% \ifENGLISH This example shows a situation, where choosing the nearest nodes +% is correct. +% \fi +% \ifGERMAN In diesem Fall ist der nächstgelegene Knoten auch der richtige. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-1,3-6}] +\begin{pspicture}(3,2) + \psset{label=0, optboxwidth=1} + \pnodes(-0.5,1){A}(1.5,1){B}(3.5,1){C} + \optbox(A)(B){Box1}\optbox(B)(C){Box2} + \drawfiber{1}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH In this case, the nearest connection is not well defined because +% two connections have the same length. +% \fi +% \ifGERMAN +% Hier ist der kürzeste Abstand nicht eindeutig definiert, da es zwei +% Verbindungen mit der gleichen Länge gibt. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-1,3-6}] +\begin{pspicture}(2,2) + \psset{label=0} + \pnodes(0,0.5){A}(2,0.5){B}([offset=1]B){C}(A|C){D} + \optbox(A)(B){Box1}\optbox(C)(D){Box2} + \drawfiber{1}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH To select the desired connection it is often enough to set either +% \Lkeyword{startnode} or \Lkeyword{stopnode}. With this you fix one node, the +% other is the one nearest to it. In rare cases it might be necessary to fix +% both nodes. +% \fi +% \ifGERMAN +% Um die gewünschte Verbindung zu wählen ist es meistens ausreichend entweder +% \Lkeyword{startnode} oder \Lkeyword{stopnode} zu setzen. Ist ein Knoten fest +% vorgegeben, wird der anderen wieder als der mit dem kürzesten Abstand +% gewählt. Nur in Ausnahmefällen sollte es notwendig sein beide Knoten +% explizit anzugegeben. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]startnode}] +\begin{pspicture}(2,2) + \psset{label=0} + \pnodes(0,0.5){A}(2,0.5){B}([offset=1]B){C}(A|C){D} + \optbox(A)(B){Box1}\optbox(C)(D){Box2} + \drawfiber[startnode=1]{1}{2} + \drawfiber[startnode=N, linecolor=black]{1}{2} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Another example where you need to specify the +% \Lkeyword{startnode}. +% \fi +% \ifGERMAN Ein weiteres Beispiel, bei dem \Lkeyword{startnode} vorgegeben +% werden muss. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]startnode}, caption={caption}, label={ex:nalm}] +\begin{pspicture}(2.1,3) + \pnodes(0,0){A}(2,0){B}(0.3,3){C}(1.7,3){D} + \psset{fiber=none, arrowscale=1.2, arrowinset=0} + \optcoupler[fiber=l, + addtoFiberIn1={angleA=0, ArrowInside=->}, + addtoFiberIn2={angleA=180, arrows=<-}, + abspos=0.5, compname=Cpl](A)(B)(C)(D) + \optfiber[compname=Hnlf, abspos=1](C)(C|A) + \optamp[abspos=2, compname=Amp](D|B)(D) + \drawfiber{Cpl}{Hnlf} + \drawfiber[startnode=1, ncurv=1.2]{Hnlf}{Amp} + \drawfiber{Cpl}{Amp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \ifENGLISH\subsection{Fiber appearance}\fi +% \ifGERMAN\subsection{Faseraussehen}\fi +% \label{sec:fiberappearance} +% +% \begin{stylelist} +% \styleitem{Fiber} +% \ifENGLISH +% The appearance of fibers is controlled with this style. The optional +% argument of \Lcs{drawfiber} can be used as well, these options can overwrite +% settings from the \Lstyle{Fiber} style. +% \fi +% \ifGERMAN +% Das Aussehen der Fasern wird durch diesen Stil vorgegeben. Das optionale +% Argument von \Lcs{drawfiber} kann ebenfalls verwendet werden, die +% entsprechenden Parameter können die Einstellungen von \Lstyle{Fiber} +% überschreiben. +% \fi +% \end{stylelist} +% \begin{optionlist} +% \valitem{addtoFiber}{list} +% \addtostylemsg{Fiber} +% \ifGERMAN Siehe z.B. \prettyref{ex:recirc-loop}.\fi +% \ifENGLISH See for example \prettyref{ex:recirc-loop}.\fi +% +% \valitem{newFiber}{list} +% \newstylemsg{Fiber} +% +% \valitem[curve]{fiberstyle}{string} +% \ifGERMAN +% Die Fasern werden in der Regel als \Lcs*{nccurve} gezeichnet, aber eine +% beliebige andere Knotenverbindung \nxLcs{nc}\prm{string} des +% \LPack{pst-node} Paketes kann ausgewählt werden, lesen Sie die entsprechende +% Dokumentation\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-node.html} +% für mögliche Werte. In den folgenden Beispielen werden +% Anwendungsmöglichkeiten gezeigt, eine weitere ist in +% \prettyref{ex:transmission-loop} zu sehen. +% \fi +% \ifENGLISH +% The fibers are usually drawn as \Lcs*{nccurve}, but any type of node +% connection \nxLcs{nc}\prm{string} from \LPack{pst-node} can be selected with +% this parameter, see the \LPack{pst-node} +% documentation\fnurl{http://mirror.ctan.org/help/Catalogue/entries/pst-node.html} +% for possible values. The following examples show possible use cases, +% \prettyref{ex:transmission-loop} contains another typical use case. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]fiberstyle}] +\begin{pspicture}(3,3) + \pnodes(1, 0.5){A}(2.5,0.5){B}(2.5,2){C} + \psset{optboxsize=1 0.6, innerlabel} + \optbox[position=start](A)(B){start} + \optbox[position=end](B)(C){stop} + \drawfiber[fiberstyle=diag, linearc=0.5]{1}{2} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[morekeywords={[21]fiberstyle}, label={ex:recirc-loop}, caption={caption}] +\begin{pspicture}(4,2.5) + \pnodes(1,2.5){In}(3,2.5){Out}(0,2){A}(4,2){B}(4,0){C}(0,0){D} + \optcoupler[fiber=t, addtoFiber={ArrowInside=->}, coupleralign=b](In)(A)(Out)(B) + \psset{fiber=none} + \optamp[position=0.35](C)(D) + \optfiber[position=0.35](D)(C) + \drawfiber{2}{3} + \addtopsstyle{Fiber}{fiberstyle=bar, linearc=0.5, armA=1.5} + \drawfiber[stopnode=1]{1}{2} + \drawfiber[stopnode=1]{1}{3} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{optionlist} +% +% \ifGERMAN\section{Elektrische Verbindungen}\fi +% \ifENGLISH\section{Drawing wires}\fi +% \label{sec:drawwire} +% +% \ifENGLISH +% All available components can be connected with wire connections, the +% wire components in \prettyref{chap:electrcomp} are connected +% automatically. The \Lkeyword*{wire*} parameters are equivalent to +% their \Lkeyword*{fiber*} counterparts, see their respective +% documentation for details. +% \fi +% \ifGERMAN +% Alle Komponenten können mit Drähten verbunden werden, die elektrischen +% Komponenten in \prettyref{chap:electrcomp} werden automatisch +% verbunden. Die \Lkeyword*{wire*}-Parameter sind äquivalent zu den +% entsprechenden \Lkeyword*{fiber*}-Parametern, die detailliertere +% Informationen enthalten. +% \fi +% +% \begin{ltxsyntax} +% \xLcs{drawwire}\cmditem{drawwire}[options]{obj$_1$}{obj$_2$}\ldots +% \end{ltxsyntax} +% \ifENGLISH +% This command can take a variable number of arguments (minimum of +% two) which can be either an ID, an ID range, a \Lkeyword{compname}, +% or a PSTricks nodes (see \prettyref{sec:accessobj}). To distinguish +% between nodes and components, nodes must be either enclosed in +% parenthesis within the brackets, or enclosed only in parenthesis: +% \Lcs{drawwire}\opt{\{(node)\}\{comp\}}, or +% \Lcs{drawwire}\opt{(node)\{comp\}}. If you specify more than two +% arguments, you get connections $1\rightarrow 2$, $2\rightarrow 3$, +% and so on. +% +% The automatic connections are drawn internally with +% \Lcs{drawwire} commands from each reference node to the component. +% \fi +% \ifGERMAN +% Dieses Makro akzeptiert eine variable Anzahl an Argumenten +% (mindestens zwei), die entweder eine ID, ein ID-Intervall, ein +% \Lkeyword{compname} oder ein PSTricks-Knoten sein können (siehe +% \prettyref{sec:accessobj}. Um zwischen Knoten und Komponenten +% unterscheiden zu können, müssen Knoten entweder in runde Klammern +% innerhalb der geschweiften Klammern eingeschlossen werden oder +% dürfen nur runde Klammern haben: +% \Lcs{drawbeam}\opt{\{(node)\}\{comp\}}, oder +% \Lcs{drawbeam}\opt{(node)\{comp\}}. Werden mehr als zwei Argumente +% mitgegeben, werden die Verbindungen $1\rightarrow 2$, $2\rightarrow +% 3$, usw. gezeichnet. +% +% Die automatischen Verbindungen werden intern als +% \Lcs{drawwire} von den Referenzknoten zur Komponente gezeichnet. +% \fi +% +% \begin{optionlist} +% \choitem[relative]{wirealign}{rel,relative,center,abs,absolute} +% \ifGERMAN Siehe \Lkeyword{fiberalign}.\fi +% \ifENGLISH See \Lkeyword{fiberalign}.\fi +% +% \numitem[0]{wireangleA} +% \ifGERMAN Siehe \Lkeyword{fiberangleA}.\fi +% \ifENGLISH See \Lkeyword{fiberangleA}.\fi +% +% \numitem[0]{wireangleB} +% \ifGERMAN Siehe \Lkeyword{fiberangleB}.\fi +% \ifENGLISH See \Lkeyword{fiberangleB}.\fi +% +% \valitem[angle]{wirestyle}{string} +% \ifGERMAN Siehe \Lkeyword{fiberstyle}, der Vorgabewert ist jedoch \opt{angle}.\fi +% \ifENGLISH See \Lkeyword{fiberstyle}, the default value is \opt{angle}.\fi +% +% \valitem{addtoWire}{list} +% \addtostylemsg{Wire} +% +% \valitem{newWire}{list} +% \newstylemsg{Wire} +% \end{optionlist} +% \begin{stylelist} +% \styleitem{Wire} +% \ifENGLISH +% The appearance of wires is controlled with this style, compare with +% \prettyref{sec:fiberappearance}. The optional argument of +% \Lcs{drawwire} can be used as well, these options can overwrite +% settings from the \Lstyle{Wire} style. +% \fi +% \ifGERMAN +% Das Aussehen der elektrischen Verbindungen wird durch diesen Stil +% vorgegeben, analog zu \prettyref{sec:fiberappearance}. Das optionale +% Argument von \Lcs{drawwire} kann ebenfalls verwendet werden, die +% entsprechenden Parameter können die Einstellungen von \Lstyle{Wire} +% überschreiben. +% \fi +% \end{stylelist} +% +% \ifENGLISH\section{Automatic fiber and wire connections}\fi +% \ifGERMAN\section{Automatische Faser- und Drahtverbindungen}\fi +% \label{sec:drawconn-auto} +% +% \ifENGLISH +% All fiber components described in \prettyref{chap:fibercomp} are +% connected automatically to their reference nodes with \Lcs{drawfiber}, +% their behaviour is descibed in \prettyref{sec:drawfiber-angles}. The +% electrical components (\prettyref{chap:electrcomp}) are accordingly +% connected with \Lcs{drawwire}. The connections can also be controlled +% in a number of ways, without explicitely using these macros. The style +% of each connection can be configure independently, see +% \prettyref{sec:drawconn-auto-styles}. +% \fi +% \ifGERMAN +% Alle Faserkomponenten, die in \prettyref{chap:fibercomp} beschrieben +% werden, werden automatisch über \Lcs{drawfiber} mit ihren +% Referenzknoten verbunden, das Verhalten ist in +% \prettyref{sec:drawfiber-angles} beschrieben. Entsprechend dazu werden +% die elektrischen Komponenten (\prettyref{chap:electrcomp}) mit +% \Lcs{drawwire} mit Drähten verbunden. Die automatischen Verbindungen +% können umfangreich kontrolliert werden, ohne diese Makros explizit zu +% verwenden. Das Aussehen jeder Verbindung kann ebenfalls separat +% konfiguriert werden, siehe \prettyref{sec:drawconn-auto-styles}. +% \fi +% +% \begin{optionlist} +% \choitem[all]{fiber}{[*+]none,all,i,o,\prm{refpoint}} +% \ifENGLISH This parameter selects which fiber connections are drawn. +% The value of this parameter can affect either only the fiber +% components (if the value is prefixed with \opt{*}), only free-ray +% and electrical components (prefixed with \opt{+}), or all component types +% otherwise. Typical free-ray components which are often used with +% fibers as well are \Lcomp{optbox} and \Lcomp{optdetector}. Please +% note, that electrical components cannot be connected automatically +% with fibers, in these cases you must use \Lcs{drawfiber} +% explicitely. +% +% You can select to connect \opt{all} nodes, \opt{none}, or select distinct +% connections to draw. Value \opt{i} (\opt{l} is equivalent) draws all input +% fibers, \opt{o} (\opt{r} is equivalent) draws all output fibers. These +% values are exclusive, that means \opt{io} does not select all fibers, but +% none. +% +% Components which have more than one input or output fiber +% (\hyperref[sec:coupler]{couplers} and \Lcomp{optcirculator}) allow also +% values \opt{t} and \opt{b}, possibly in combination with \opt{i}, \opt{o}, +% \opt{r}, or \opt{l}. +% +% See the following examples for some variants. +% \fi +% \ifGERMAN +% Dieser Parameter gibt an, welche Faserverbindungen gezeichnet +% werden. Der Parameter kann nur die Faserkomponenten betreffen (falls +% ein \opt{*} vorangestellt ist), nur die elektrischen und +% Freistrahlkomponenten (\opt{+} wird vorangestellt), oder alle +% Komponententypen. Typische Freistrahlkomponenten, die häufig als +% Faserkomponenten verwendet werden, sind \Lcomp{optbox} und +% \Lcomp{optdetector}. Beachten Sie, dass elektrische Komponenten +% nicht automatisch mit Fasern verbunden werden können, Sie müssen +% dann explizit \Lcs{drawfiber} verwenden. +% +% Es können alle Verbindungen gezeichnet werden (\opt{all}), keine +% (\opt{none}), oder es können bestimmte ausgewählt werden. Die Werte \opt{i} +% (\opt{l} ist äquivalent) zeichnet nur die Eingangsfasern, \opt{o} +% (bzw. \opt{r}) alle ausgehenden Fasern. Diese Angaben sind ausschließend, +% d.h. mit \opt{io} werden gar keine Verbindungen gezeichnet. +% +% Komponenten, die über mehr als einen Eingang oder Ausgang verfügen +% (\hyperref[sec:coupler]{Koppler} und \Lcomp{optcirculator}) erlauben +% weitergehende Auswahl mit \opt{t} und \opt{b}, möglicherweise in Verbindung +% mit \opt{i}, \opt{o}, \opt{l} und \opt{r}. +% +% Die folgenden Beispiele zeigen einige Möglichkeiten. +% \fi +% \end{optionlist} +% +% \begin{enumerate} +% \item +% \ifENGLISH Enable all fiber connections all components.\fi +% \ifGERMAN Zeichne alle Fasern für alle Komponenten.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,3) + \psset{fiber} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Draw only the input fiber of a fiber component (\Lcomp{optmzm}), +% the other components are not affected. +% \fi +% \ifGERMAN Nur die Eingangsverbindung einer Faserkomponente (\Lcomp{optmzm}) +% wird gezeichnet, die anderen Komponenten bleiben unbeeinflusst. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,3) + \psset{fiber=*i} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](1,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH All connections of the fiber component are drawn, the +% other components get only the output fiber. +% \fi +% \ifGERMAN Von der Faserkomponente werden alle Verbindungen +% gezeichnet, die anderen Komponenten erhalten nur eine +% Ausgangsverbindung. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,3) + \psset{fiber=+o} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](1,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH The values \opt{t} and \opt{b} affect only components which have +% more than two fibers, i.e \Lcomp{optcirculator} and the couplers +% (\prettyref{sec:coupler}). +% \fi +% \ifGERMAN +% Die Werte \opt{t} und \opt{b} betreffen nur die Komponenten mit mehr als +% zwei Verbindungen, also \Lcomp{optcirculator} und die Koppler +% (\prettyref{sec:coupler}). +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,1) + \optcoupler[fiber=t](0,1)(0,0)(3,1)(3,0) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,1) + \wdmsplitter[fiber=br](0,0.5)(3,1)(3,0) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[morekeywords={[21]{fiber}}] +\begin{pspicture}(3,1) + \optcirculator[fiber=b](0,0.5)(3,1)(1,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% \begin{optionlist} +% \choitem[all]{wire}{[*+]none,all,i,o,\prm{refpoint}} +% \ifENGLISH +% This parameter selects which wire connections are drawn. The value +% of this parameter can affect either only the electrical components +% (if the value is prefixed with \opt{*}), only free-ray and fiber +% components (prefixed with \opt{+}), or all components otherwise. +% \fi +% \ifGERMAN +% Dieser Parameter gibt an, welche elektrische Verbindungen gezeichnet +% werden. Der Parameter kann nur die elektrischen Komponenten +% betreffen (falls ein \opt{*} vorangestellt ist), nur die Faser- und +% Freistrahlkomponenten (\opt{+} wird vorangestellt), oder alle +% Komponenten. +% \fi +% \end{optionlist} +% \begin{enumerate} +% \item +% \ifENGLISH Enable all wire connections for all components.\fi +% \ifGERMAN Zeichne alle Drähte aller Komponenten.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{wire}}] +\begin{pspicture}(3,3) + \psset{wire} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Draw only the input wire of an electrical component +% (\Lcomp{elecsynthesizer}), the other components are not affected. +% \fi +% \ifGERMAN Nur die Eingangsverbindung einer elektrischen Komponente +% (\Lcomp{elecsynthesizer}) wird gezeichnet, die anderen Komponenten +% bleiben unbeeinflusst. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{wire}}] +\begin{pspicture}(3,3) + \psset{wire=*i} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH Draw only the output wire of the free-ray and fiber +% components, but all connections of the wire component. +% \fi +% \ifGERMAN Von der Freistrahl- und Faserkomponente wird nur die Ausgangsverbindung +% gezeichnet, die elektrischen Komponente erhält jedoch alle Verbindungen. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{wire}}] +\begin{pspicture}(3,3) + \psset{wire=+o} + \optbox(0,2.5)(3,2.5) + \optmzm(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \item +% \ifENGLISH The values \opt{t} and \opt{b} affect only components which have +% more than two connections, i.e \Lcomp{elecmixer} and \Lcomp{eleccoupler}. +% \fi +% \ifGERMAN +% Die Werte \opt{t} und \opt{b} betreffen nur die Komponenten mit mehr als +% zwei Verbindungen, also \Lcomp{elecmixer} und \Lcomp{eleccoupler}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{wire}}] +\begin{pspicture}(3,1) + \eleccoupler[wire=t](0,1)(0,0)(3,1)(3,0) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample}[morekeywords={[21]{wire}}] +\begin{pspicture}(3,1.5) + \elecmixer[wire=b](0,1)(3,1)(1,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{enumerate} +% +% +% \ifENGLISH\subsection{Appearance of automatic connections}\fi +% \ifGERMAN\subsection{Aussehen der automatischen Verbindungen}\fi +% \label{sec:drawconn-auto-styles} +% +% \begin{figure}\centering +% \begin{pspicture}(0,-0.2)(12,4.4) +% \rput[lt](0,4.4){% +% \pstree[levelsep=1.5cm, treesep=0.6, +% nodesep=4pt, arrows=<-, +% arrowinset=0, arrowscale=1.5]{\poeTR{Fiber}}{% +% \pstree{\poeTR{FiberIn}}{% +% \poeTR{FiberIn1} \poeTR{FiberIn2}% +% }% +% \pstree{\poeTR{FiberOut}}{% +% \poeTR{FiberOut1} \poeTR{FiberOut2}% +% }% +% }% +% \rput[l](-1,0|T-0){\ifGERMAN Grundstil\fi\ifENGLISH parent style\fi} +% \rput[l](-1,0|T-0-0){% +% \ifGERMAN +% \parbox{\widthof{ausgehende Fasern}}{% +% \RaggedRight eingehende und ausgehende Fasern}% +% \fi +% \ifENGLISH +% \parbox{\widthof{outgoing fibers}}{% +% \RaggedRight incoming and outgoing fibers}% +% \fi +% } +% \rput[t](! \psGetNodeCenter{T-0-0-0} \psGetNodeCenter{T-0-0-1} +% T-0-0-0.x T-0-0-1.x add 2 div T-0-0-0.y 0.4 sub){% +% \ifGERMAN +% \parbox{\widthof{Obere(1) oder untere(2)}}{% +% \RaggedRight Obere(1) oder untere(2) eingehende Faser.}% +% \fi +% \ifENGLISH +% \parbox{\widthof{Upper(1) or lower(2)}}{% +% \RaggedRight Upper(1) or lower(2) incoming fiber.}% +% \fi +% } +% \rput[t](! \psGetNodeCenter{T-0-1-0} \psGetNodeCenter{T-0-1-1} +% T-0-1-0.x T-0-1-1.x add 2 div T-0-1-0.y 0.4 sub){% +% \ifGERMAN +% \parbox{\widthof{Obere(1) oder untere(2)}}{% +% \RaggedRight Obere(1) oder untere(2) ausgehende Faser.}% +% \fi +% \ifENGLISH +% \parbox{\widthof{Upper(1) or lower(2)}}{% +% \RaggedRight Upper(1) or lower(2) outgoing fiber.}% +% \fi +% } +% }% +% \end{pspicture} +% \ifGERMAN +% \caption{Vererbungsdiagramm der PS-Stile für die automatischen +% Faserverbindungen. Sie sollten diese Stile mit \protect\Lcs*{addtopsstyle} +% oder den entsprechenden \opt{addto}\prm{style} Parametern ändern um die +% Vererbungslinie beizubehalten. Eine identisches Vererbungsdiagramm besteht +% für die entsprechenden \opt{Wire\ldots} Stile.}% +% \fi \ifENGLISH +% \caption{Inheritance diagram for the psstyles used for the automatic fiber +% connections. These styles should be changed with \protect\Lcs*{addtopsstyle} +% or the respective \opt{addto}\prm{style} options to preserve the +% inheritance. An identical inheritance tree applies to the respective +% \opt{Wire\ldots} styles.}% +% \fi +% \label{fig:fiberstyles} +% \end{figure} +% +% \ifENGLISH +% The styles of all automatic fiber connections can be configured independently, +% they are all derived from the basic \Lstyle{Fiber} style which is described in +% \prettyref{sec:fiberappearance}. +% \fi +% \ifGERMAN +% Die Stile aller automatischen Faserverbindungen können separat konfiguriert +% werden, der zugrundeliegende Stil ist immer \Lstyle{Fiber}, der in +% \prettyref{sec:fiberappearance} beschrieben ist. +% \fi +% +% \begin{stylelist} +% \item[\smash{% +% \begin{tabular}[t]{@{}r@{}}% +% \opt{FiberIn}\\ +% \opt{FiberIn1}\\ +% \opt{FiberIn2}\\ +% \opt{FiberOut}\\ +% \opt{FiberOut1}\\ +% \opt{FiberOut2} +% \end{tabular}}% +% ]% +% \xLstyle{FiberIn}\label{sty:FiberIn}% +% \xLstyle{FiberIn1}\label{sty:FiberIn1}% +% \xLstyle{FiberIn2}\label{sty:FiberIn2}% +% \xLstyle{FiberOut}\label{sty:FiberOut}% +% \xLstyle{FiberOut1}\label{sty:FiberOut1}% +% \xLstyle{FiberOut2}\label{sty:FiberOut2}% +% \ifENGLISH +% Style \Lstyle{FiberIn} applies to all input fibers, it inherits from +% \Lstyle{Fiber}. If the component has more than one input fiber they use the +% styles \Lstyle{FiberIn1} and \Lstyle{FiberIn2} which inherit from +% \Lstyle{FiberIn}. All output fibers use the style \Lstyle{FiberOut}, in case of two output fibers they use the styles \Lstyle{FiberOut1} and \Lstyle{FiberOut2} which +% inherit from \Lstyle{FiberOut}. See \prettyref{fig:fiberstyles} for an +% inheritance diagram of the styles. You must have in mind, that this +% inheritance is effective only if you use \Lcs*{addtopsstyle} to change the +% styles (see also below). +% \fi +% \ifGERMAN +% Der Stil \Lstyle{FiberIn} bezieht sich auf alle Eingangsfasern und erbt alle +% Eigenschaften von \Lstyle{Fiber}. Hat eine Komponente zwei davon, so können +% diese mit \Lstyle{FiberIn1} und \Lstyle{FiberIn2} angesprochen werden, die +% alles von \Lstyle{FiberIn} übernehmen. Entsprechend bezieht sich +% \Lstyle{FiberOut} auf alle Ausgangsfasern, falls es davon zwei gibt dann +% können diese mit \Lstyle{FiberOut1} und \Lstyle{FiberOut2} geändert +% werden. Siehe \prettyref{fig:fiberstyles} für ein Vererbungsdiagramm der +% Faserstile. Beachten Sie, dass diese Vererbung nur erhalten bleibt, falls die +% Stile nur mit \Lcs*{addtopsstyle} oder den entsprechenden +% \opt{addto}\prm{style} Parametern verändert werden. +% \fi +% \item[\smash{% +% \begin{tabular}[t]{@{}r@{}}% +% \opt{WireIn}\\ +% \opt{WireIn1}\\ +% \opt{WireIn2}\\ +% \opt{WireOut}\\ +% \opt{WireOut1}\\ +% \opt{WireOut2} +% \end{tabular}}% +% ]% +% \ifENGLISH +% Style \Lstyle{WireIn} applies to all input wires, it inherits from +% \Lstyle{Wire}. If the component has more than one input wire they use +% the styles \Lstyle{WireIn1} and \Lstyle{WireIn2} which inherit from +% \Lstyle{WireIn}. All output wires use the style \Lstyle{WireOut}, in +% case of two output wires they use the styles \Lstyle{WireOut1} and +% \Lstyle{WireOut2} which inherit from \Lstyle{WireOut}. See +% \prettyref{fig:fiberstyles} for an inheritance diagram of the +% styles. You must have in mind, that this inheritance is effective only +% if you use \Lcs*{addtopsstyle} to change the styles (see also below). +% \fi +% \ifGERMAN +% Der Stil \Lstyle{WireIn} bezieht sich auf alle eingehenden +% elektrischen Verbindungen und erbt alle Eigenschaften von +% \Lstyle{Wire}. Hat eine Komponente zwei davon, so können diese mit +% \Lstyle{WireIn1} und \Lstyle{WireIn2} angesprochen werden, die alles +% von \Lstyle{WireIn} übernehmen. Entsprechend bezieht sich +% \Lstyle{WireOut} auf alle ausgehenden elektrischen Verbindungen, falls +% es davon zwei gibt dann können diese mit \Lstyle{WireOut1} und +% \Lstyle{WireOut2} geändert werden. Siehe \prettyref{fig:fiberstyles} +% für ein Vererbungsdiagramm der Stile. Beachten Sie, dass diese +% Vererbung nur erhalten bleibt, falls die Stile nur mit +% \Lcs*{addtopsstyle} oder den entsprechenden \opt{addto}\prm{style} +% Parametern verändert werden. +% \fi +% \xLstyle{WireIn}\label{sty:WireIn}% +% \xLstyle{WireIn1}\label{sty:WireIn1}% +% \xLstyle{WireIn2}\label{sty:WireIn2}% +% \xLstyle{WireOut}\label{sty:WireOut}% +% \xLstyle{WireOut1}\label{sty:WireOut1}% +% \xLstyle{WireOut2}\label{sty:WireOut2}% +% +% \item[\smash{\begin{tabular}[t]{@{}r@{}}% +% \opt{new}\prm{style}\\ +% \opt{addto}\prm{style} +% \end{tabular}}] +% \xLkeyword{newFiberIn}\xLkeyword{addtoFiberIn}% +% \label{prm:newFiberIn}\label{prm:addtoFiberIn} +% \xLkeyword{newFiberIn1}\xLkeyword{addtoFiberIn1} +% \label{prm:newFiberIn1}\label{prm:addtoFiberIn1} +% \xLkeyword{newFiberIn2}\xLkeyword{addtoFiberIn2} +% \label{prm:newFiberIn2}\label{prm:addtoFiberIn2} +% \xLkeyword{newFiberOut}\xLkeyword{addtoFiberOut} +% \label{prm:newFiberOut}\label{prm:addtoFiberOut} +% \xLkeyword{newFiberOut1}\xLkeyword{addtoFiberOut1} +% \label{prm:newFiberOut1}\label{prm:addtoFiberOut1} +% \xLkeyword{newFiberOut2}\xLkeyword{addtoFiberOut2} +% \label{prm:newFiberOut2}\label{prm:addtoFiberOut2} +% \xLkeyword{newWireIn}\xLkeyword{addtoWireIn} +% \label{prm:newWireIn}\label{prm:addtoWireIn} +% \xLkeyword{newWireIn1}\xLkeyword{addtoWireIn1} +% \label{prm:newWireIn1}\label{prm:addtoWireIn1} +% \xLkeyword{newWireIn2}\xLkeyword{addtoWireIn2} +% \label{prm:newWireIn2}\label{prm:addtoWireIn2} +% \xLkeyword{newWireOut}\xLkeyword{addtoWireOut} +% \label{prm:newWireOut}\label{prm:addtoWireOut} +% \xLkeyword{newWireOut1}\xLkeyword{addtoWireOut1} +% \label{prm:newWireOut1}\label{prm:addtoWireOut1} +% \xLkeyword{newWireOut2}\xLkeyword{addtoWireOut2} +% \label{prm:newWireOut2}\label{prm:addtoWireOut2} +% \ifENGLISH +% For every style two appropriate keys \opt{new}\prm{style} and +% \opt{addto}\prm{style} are provided which can be used to change the +% styles for single objects. This can be used to define own components +% (\prettyref{sec:customcomp}) with respectively changed connections +% or to avoid explicit grouping. +% \fi +% \ifGERMAN +% Für jeden Faserstil werden zwei Parameter \opt{new}\prm{style} und +% \opt{addto}\prm{style} bereitgestellt, mit denen die Stile für +% einzelne Komponenten verändert werden können. Damit können neuen +% Komponenten mit anderen voreingestellten Verbindungen definiert +% werden (\prettyref{sec:customcomp}), oder explizite Gruppierung kann +% vermieden werden. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{addtoFiberOut1}}] +\begin{pspicture}(3,2) + \newpsobject{tapcoupler}{wdmsplitter}{% + coupleralign=b, + addtoFiberOut1={arrows=->, arrowscale=1.2, arrowinset=0}} + \tapcoupler(0,0.5)(3,1.5)(3,0.5){99/1} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{stylelist} +% +% +% \ifGERMAN\subsection{Bekannte Einschränkungen}\fi +% \ifENGLISH\subsection{Known limitations}\fi +% +% \ifGERMAN Die Kombination von \Lkeyword{fiber} und \Lkeyword{wire} +% erlaubt in der derzeitigen Implementierung (Version \fileversion) +% nicht die beliebige Kombination aller Parametervarianten. Die meisten +% funktionieren, aber das folgende Beispiel zeigt eine Variante, die +% nicht korrekt funktioniert (der \Lcomp{elecsynthesizer} sollte eine +% Eingangsfaser haben): +% \fi +% \ifENGLISH The combination of \Lkeyword{fiber} and \Lkeyword{wire} +% does not allow any arbitrary combination of all parameter values in +% the current implementation (version \fileversion). Most combinations +% do work, but the following examples shows a variant, which does not +% work correctly (the \Lcomp{elecsynthesizer} should have an input fiber): +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{fiber, wire}}] +\begin{pspicture}(3,3) + \psset[optexp]{fiber=i, wire=+i} + \fiberdelayline(0,2.5)(3,2.5) + \optbox(0,1.5)(3,1.5) + \elecsynthesizer[position=0.5](0,0.5)(3,0.5) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN In solchen speziellen Fällen muss auf manuelle Verbindungen +% zurückgegriffen werden. +% \fi +% \ifENGLISH In such special cases one must resort to manual +% connections. +% \fi +% +% \ifGERMAN\section{Zeichenebenen}\fi +% \ifENGLISH\section{Layers}\fi +% \label{sec:layers} +% +% \ifENGLISH +% The necessary order of constructing a drawing is to define the components +% first before you can connect them. This implies that all connections are drawn +% on top of the components, which might be unwanted. +% +% To circumvent this, we provide the \Lenv{optexp} environment, inside which all +% connections are drawn behind the components. +% \fi +% \ifGERMAN +% Die Reihenfolge der Konstruktion einer Skizze ist die, dass zuerst die +% Komponenten definiert werden müssen, bevor diese verbunden werden können. Das +% beinhaltet aber, dass alle Verbindungen über die Komponenten gezeichnet +% werden, was nicht erwünscht sein muss. +% +% Um das zu vermeiden, wird die \Lenv{optexp}-Umgebung bereitgestellt, innerhalb +% derer alle Verbindungen hinter die Komponenten gelegt werden. +% \fi +% +% \begin{ltxsyntax} +% \envitem{optexp} +% \end{ltxsyntax} +% +% \iffalse +%<*ignore> +% \fi +\ifENGLISH +\begin{LTXexample} +\begin{pspicture}(3,4) + \psset{beam, fillstyle=solid, fillcolor=black} + \optbox(0,3.5)(3,3.5){no layers} + \begin{optexp} + \optbox(0,1.5)(3,1.5){with layers} + \end{optexp} +\end{pspicture} +\end{LTXexample} +\fi +\ifGERMAN +\begin{LTXexample} +\begin{pspicture}(3,4) + \psset{beam, fillstyle=solid, fillcolor=black} + \optbox(0,3.5)(3,3.5){ohne Ebenen} + \begin{optexp} + \optbox(0,1.5)(3,1.5){mit Ebenen} + \end{optexp} +\end{pspicture} +\end{LTXexample} +\fi +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH +% Beware, that this is achieved by executing twice all code included in the +% environment. This works fine for all \LPack{pst-optexp} commands which take +% care of not drawing stuff twice but only in a changed order. All other text +% and graphics are drawn twice which leads to ugly results because of altered +% anti-aliasing in the viewer. +% +% To avoid this, you can either move all other code outside the environment, or +% use the following two commands to define code parts which are executed only +% once. +% \fi +% \ifGERMAN +% Beachten Sie, dass das erreicht wird, indem der gesamte Code innerhalb der +% Umgebung doppelt ausgeführt wird. Das funktioniert mit allen +% \LPack{pst-optexp}-Makros, da diese sich intern darum kümmern nichts doppelt +% sondern nur in geänderter Reihenfolge zu zeichnen. Alle anderen Zeichnungen +% und Texte werden zweimal gezeichnet, was zu unschönen Ergebnissen aufgrund +% von geändertem Antialiasing in dem Betrachter führen kann. +% +% Um zu verhindern, dass anderer Code doppelt ausgeführt wird, muss dieser +% entweder außerhalb der \Lenv{optexp}-Umgebung definiert werden, oder durch +% eins der beiden folgenden Makros auf eine Ebene beschränkt werden. +% \fi +% +% \begin{ltxsyntax} +% \cmditem{backlayer}{code} +% +% \ifENGLISH Execute \prm{code} only once in the first pass.\fi +% \ifGERMAN Führe \prm{code} nur beim ersten Durchgang aus.\fi +% +% \cmditem{frontlayer}{code} +% +% \ifENGLISH Execute \prm{code} only once in the second pass.\fi +% \ifGERMAN Führe \prm{code} nur beim zweiten Durchgang aus.\fi +% \end{ltxsyntax} +% +% \ifENGLISH +% In this example, the text is put on top of the frame although the text is +% defined first: +% \fi +% \ifGERMAN In diesem Beispiel wird der Text über dem Rechteck angezeigt, obwohl +% der Text zuerst definiert wird: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1) +\begin{optexp} + \frontlayer{\rput(1.5,0.5){front}} + \backlayer{\psframe*[linecolor=DOrange!50](1,0)(2,1)} +\end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% +% \ifGERMAN\chapter{Benutzerdefinierte Komponenten}\fi +% \ifENGLISH\chapter{Custom components}\fi +% \label{chap:custom} +% +% \ifGERMAN +% Das \LPack{pst-optexp}-Paket stellt zwei Makros zur Verfügung um +% eigene Komponenten zu zeichnen. Diese können z.B. aus Bildern oder +% eigenen Zeichnungen bestehen. +% \fi +% \ifENGLISH +% The \nxLPack{pst-optexp} package provides two commands which can use +% anything as optical components. This includes e.g. external images or +% your own drawings. +% \fi +% +% \begin{ltxsyntax} +% \xLdipole{optdipole}% +% \compitem{optdipole}[options](in)(out){comp}{label} +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,3) + \optdipole[labeloffset=1, beam](0,2)(3,1){% + \rput(0,0){\rule{0.5cm}{1cm}}% + }{label} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \xLdipole{opttripole}% +% \compitem{opttripole}[options](in)(center)(out){comp}{label} +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,3) + \opttripole[beam](3,1.5)(1.5,2)(0,0){% + \rput[b](0,0){text}% + }{label} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% \end{ltxsyntax} +% +% \ifENGLISH +% These components can also be connected with beams and fibers, but do +% not provide full access to all options. \Lcomp{opttripole} defines a +% single reflective interface, whereas \Lcomp{optdipole} can have two +% transmittive interfaces: +% \fi +% \ifGERMAN +% Diese Komponenten können sowohl mit Fasern als auch mit Strahlen +% verbunden werden, können aber nicht deren volles Potential +% ausschöpfen. \Lcomp{opttripole} definiert eine einzelne reflektive +% Grenzfläche, \Lcomp{optdipole} kann zwei transmittive Grenzflächen haben: +% \fi +% +% \begin{optionlist} +% \optitem[0 0]{optdipolesize}{\prm{width}[ \prm{height}]} +% \ifGERMAN +% Hiermit können zwei transmittierende Grenzflächen für +% \Lcomp{optdipole} definiert werden, die sich bei +% $(\pm 0.5\text{\prm{width}}, 0)$ befinden. +% \fi +% \ifENGLISH +% With this option you can define two transmittive interfaces for +% \Lcomp{optdipole}, which are placed at $(\pm 0.5\text{\prm{width}}, 0)$. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]optdipolesize}] +\begin{pspicture}(3,2) +\pnodes(0,1){A}(3,1){B} +\optdipole[optdipolesize=1, showifcnodes](A)(B){% + \psframe[fillstyle=solid,fillcolor=black!30](-0.5,-0.5)(-0.3,0.5) + \psframe(-0.5,-0.5)(0.5,0.5)}{label} +\drawwidebeam[beamwidth=0.3, beaminside=false](A){}(B) +\drawbeam[beaminside=false, linecolor=red](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Wenn zusätzlich eine Höhe \prm{height} ungleich Null +% angegeben wird, so wird diese als Apertur für das Raytracing genommen +% (siehe \Lkeyword{useNA}). Im folgenden Beispiel ist die Höhe gleich +% \opt{0.2} und damit kleiner als der aufgeweitete Strahl der deshalb +% anders als im vorangegangenen Beispiel nicht gezeichnet wird. +% \fi +% \ifENGLISH +% If also a \prm{height} greater than zero is set, this is used as size +% of the numerical aperture for ray tracing (see \Lkeyword{useNA}). In +% the following example the height is set to \opt{0.2} which is smaller +% than the wide beam which is not drawn, in contrast to the previous +% example. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]optdipolesize}] +\begin{pspicture}(3,2) +\pnodes(0,1){A}(3,1){B} +\optdipole[optdipolesize=1 0.2, showifcnodes](A)(B){% + \psframe[fillstyle=solid,fillcolor=black!30](-0.5,-0.5)(-0.3,0.5) + \psframe(-0.5,-0.5)(0.5,0.5)}{label} +\drawwidebeam[beamwidth=0.3, beaminside=false](A){}(B) +\drawbeam[beaminside=false, linecolor=red](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% Weitere Beispiel sind \prettyref{ex:lclv} und +% \prettyref{ex:absspektr}. +% \fi +% \ifENGLISH +% Further examples are \prettyref{ex:lclv} and +% \prettyref{ex:absspektr}. +% \fi +% +% \optitem{optdipolecomp}{\prm{macros}} +% \ifGERMAN Mit dieser Option kann die Zeichnung einer Komponente +% definiert werden, um dann mit \Lcs*{newpsobject} basierend auf +% \Lcomp{optdipole} eine neuen Komponente zu definieren. +% \fi +% \ifENGLISH +% This option defines the drawing of a component, and can be used to +% define a new component based in \Lcomp{optdipole} with +% \Lcs*{newpsobject}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]optdipolecomp}] +\begin{pspicture}(3,2) +\def\phasemodulatorcomp{% + \psframe(-1,-0.4)(1,0.4) + \psframe[fillstyle=hlines](-1.3,-0.5)(1.3,-0.4) + \psframe[fillstyle=hlines](-1.3,0.5)(1.3,0.4)} +\newpsobject{phasemodulator}{optdipole}{optdipolesize=2 0.8, optdipolecomp={\phasemodulatorcomp}} +\pnodes(0,1){A}(3,1){B} +\phasemodulator(A)(B){LiNbO$_3$} +\drawwidebeam[beamwidth=0.3, beaminside=false](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \optitem{opttripolecomp}{\prm{macros}} +% \ifGERMAN Mit dieser Option kann die Zeichnung einer Komponente +% definiert werden, um dann mit \Lcs*{newpsobject} basierend auf +% \Lcomp{opttripole} eine neuen Komponente zu definieren. +% \fi +% \ifENGLISH +% This option defines the drawing of a component, and can be used to +% define a new component based in \Lcomp{opttripole} with +% \Lcs*{newpsobject}. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]opttripolecomp}] +\begin{pspicture}(3,2) +\def\ampmodcomp{% + \psframe*[linestyle=none](-0.5,0)(0.5,0.1) + \psframe*[linestyle=none, linecolor=gray](-0.5,0.1)(0.5,0.2)} +\newpsobject{ampmod}{opttripole}{opttripolecomp={\ampmodcomp}} +\pnodes(0,0){A}(2,1.5){B}(3,0){C} +\ampmod(A)(B)(C){AM} +\drawwidebeam[beamwidth=0.3](A){}(C) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \end{optionlist} +% +% \ifGERMAN +% \section{Benutzerdefinierte Version existierender Komponenten} +% \fi +% \ifENGLISH +% \section{Customized versions of existing components} +% \fi +% \label{sec:customcomp} +% +% \ifENGLISH +% You can define a customized version of an existing component using the +% \Lcs*{newpsobject} macro. With this you can define a new component using +% predefined objects with a set of options. These options serve only as default +% values and can be overridden when calling the macro. +% \fi +% \ifGERMAN +% Sie können eine benutzerdefinierte Version einer existierenden Komponente mit +% \Lcs*{newpsobject} definieren, die z.B. andere Voreinstellungen oder und ein +% anderes Aussehen hat. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{newpsobject}}] +\begin{pspicture}(3,1.7) +\newpsobject{sbn}{crystal}{% + voltage, lamp, % + fillstyle=solid, fillcolor=yellow!90!black} +\sbn[label=1.2 45, beam](0,1)(3,1){SBN:Ce} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[morekeywords={[21]{newpsobject}}] +\begin{pspicture}(3,1.7) +\newpsobject{pumpcoupler}{wdmcoupler}{% + coupleralign=top, addtoFiberIn2={ArrowInside=->, arrowscale=2}} +\pumpcoupler[label=0.5 180](0,1)(0,0)(3,1){Pumpcoupler} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[pos=t, morekeywords={[21]{newpsobject}}, caption={caption}] +\begin{pspicture}(10,2) + \newpsobject{MOLensIn}{lens}{lens=0.5 0.5 0.5} + \newpsobject{MOLensOut}{lens}{lens=1.5 1.5 1.5} + \pnodes(0,1){A}(10,1){B} + \MOLensIn[abspos=1](A)(B)\MOLensOut[abspos=2](A)(B) + \optplate[plateheight=1.5](A)(B) + \MOLensOut[abspos=8](A)(B)\MOLensIn[abspos=9](A)(B) + \addtopsstyle{Beam}{n=1, fillstyle=solid, fillcolor=green, opacity=0.3} + \psset{loadbeampoints} + \drawwidebeam[beamwidth=0.2, stopinside](A){1} + \drawwidebeam[beamdiv=-70]{1}{2} + \drawwidebeam[stopinside]{2-4} + \drawwidebeam[beamdiv=-70]{4}{5} + \drawwidebeam{5}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH\section{Defining new objects}\fi +% \ifGERMAN\section{Neue Objekte definieren}\fi +% \label{sec:newobj} +% +% \ifENGLISH +% \nxLPack{pst-optexp} provides some high-level macros to allow very convenient +% definition of your own custom components. +% +% Note, that this part of the documentation is not complete. It roughly +% describes the steps to define own components since version 3.0. Some parts may +% be subject to change which are not backward compatible. +% \fi +% \ifGERMAN +% \nxLPack{pst-optexp} stellt einige Benutzermakros zur Verfügung, mit denen +% sehr bequem neue, eigene Komponenten definiert werden können. +% +% Beachten Sie, dass dieser Teil der Dokumentation nicht vollständig ist. Die +% notwendigen Schritte zur Definition neuer Komponenten seit Version 3.0 werden +% grob beschrieben, können sich aber noch ändern und sind nicht zwangsläufig +% abwärtskompatibel. +% \fi +% +% \begin{ltxsyntax} +% \xLcs{newOptexpDipole}\cmditem{newOptexpDipole}[fixopt]{name}{dftopt} +% \xLcs{newOptexpTripole}\cmditem{newOptexpTripole}[fixopt]{name}{dftopt} +% \xLcs{newOptexpFiberDipole}\cmditem{newOptexpFiberDipole}[fixopt]{name}{dftopt} +% \xLcs{newOptexpElecDipole}\cmditem{newOptexpElecDipole}[fixopt]{name}{dftopt} +% \end{ltxsyntax} +% +% \ifENGLISH +% These macros generate all organizing code for the component +% \textbackslash\prm{name} which handle the positioning, label +% placement, rotation and shifting, and the layering. In the simplest +% case you only have to define the actual drawing of the component +% outline. +% +% With the argument \prm{fixopt} you can specify argument settings which +% will not be allowed to be overwritten, with \prm{dftopt} you can +% specify a set of default arguments which may be overwritten with the +% components optional argument. Both arguments \prm{fixopt} and +% \prm{dftopt} are optional and may be omitted. +% +% The macros \Lcs{newOptexpFiberDipole} and \Lcs{newOptexpElecDipole} +% only differ from the generic \Lcs{newOptexpDipole} in the connection +% settings, like the components in \prettyref{chap:fibercomp} and +% \prettyref{chap:electrcomp}, respectively. +% +% The actual process of creating a new component is split up in different parts, +% depending on the component complexity and user requirements: +% \begin{enumerate} +% \item The component drawing (see \prettyref{sec:newobj-comp}), this is the +% only required part. +% \item Support for raytracing (optional) +% \item Optional support for \Lkeyword{rotateref}, \Lkeyword{extnode} and +% \Lkeyword{position}\opt{=start|end} (optional). +% \end{enumerate} +% \fi +% \ifGERMAN +% Diese Makros erzeugen den Code für die Positionierung, Drehung, +% Beschriftung und die Ebenenverwaltung der neuen Komponente +% \textbackslash\prm{name}. Im einfachsten Fall müssen Sie lediglich die +% eigentliche Zeichnung der Komponente erstellen. +% +% Mit dem Argument \prm{fixopt} können Optionen voreingestellt werden, +% die später über das optionale Argument der Komponente nicht verändert +% werden können, \prm{dftopt} erlaubt Voreinstellungen zu machen, die +% überschrieben werden können. Beide Argumente \prm{fixopt} und +% \prm{dftopt} sind optional und können auch ganz weggelassen werden. +% +% Die Definition der neuen Komponenten kann in unterschiedliche Schritte +% eingeteilt werden, je nach Komplexität und Anforderung des Benutzers: +% \begin{enumerate} +% \item Die Zeichnung (siehe \prettyref{sec:newobj-comp}), das ist der einzige +% erforderliche Schritt. +% \item Unterstützung von Raytracing (optional). +% \item Unterstützung für \Lkeyword{rotateref}, \Lkeyword{extnode} und +% \Lkeyword{position}\opt{=start|end} (optional). +% \end{enumerate} +% \fi +% +% \ifGERMAN Die folgenden Abschnitte enthalten die Entwicklung einer +% einfachen Beispielkomponente \nxLcs{testcomp}. +% \fi +% \ifENGLISH The following section show the development of a simple +% example component \nxLcs{testcomp}. +% \fi +% +% \ifENGLISH\subsection{The component drawing}\fi +% \ifGERMAN\subsection{Die Zeichnung der Komponente}\fi +% \label{sec:newobj-comp} +% +% \ifENGLISH +% You must define a macro which is called e.g. \cs{\ldots @comp}, which +% contains the component drawings. See the following two examples for dipole and +% tripole which show the orientation and position of the component coordinate +% system. +% \fi +% \ifGERMAN Sie müssen ein Makro \cs{\ldots @comp} definieren, welches +% die Zeichnung enthält. In den folgenden Beispielen sehen Sie die Ausrichtung +% und Position des Koordinatensystems für einen Zweipol und einen Dreipol. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3.5,2.6) +\newOptexpDipole{mydipole} +\makeatletter +\def\mydipole@comp{% + \psaxes[arrows=->](0,0)(0,-1.1)(1.3,1.3)[$x$,90][$y$,0] +}% +\makeatother +\mydipole(0,1)(3.5,1){\color{spot}label} +\drawbeam(0,1){}(3.5,1) +\end{pspicture} +\end{LTXexample} +\begin{LTXexample} +\begin{pspicture}(3.5,3.7) +\newOptexpTripole{mytripole}{labelangle=-60} +\makeatletter +\def\mytripole@comp{% + \psaxes[arrows=->](0,0)(-1.1,0)(1.3,1.3)[$x$,90][$y$,0] +}% +\makeatother +\mytripole(0,1)(2,1.7)(3,0){\color{spot}label} +\drawbeam(0,1){}(3,0) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Unsere Beispielkomponente und ihre Zeichnung wird also wie +% folgt definiert: +% \fi +% \ifENGLISH Our example component and its drawing are defined as +% follows: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{testcomp@comp}}] +\begin{pspicture}(3, 2) +\newOptexpDipole{testcomp} +\makeatletter +\def\testcomp@comp{% + \psframe[fillstyle=solid, fillcolor=black!30](-0.5,-0.5)(-0.3,0.5) + \psframe(-0.5,-0.5)(0.5,0.5) +}% +\makeatother +\begin{optexp} +\testcomp[position=0.6, labelalign=l](0,1)(3,1){label} +\drawbeam[beaminside=false](0,1){}(3,1) +\end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN Die Positionierung der Komponente und der Beschriftung, +% sowie die Ebenen funktioniert also schon. +% \fi +% \ifENGLISH The positioning of the component and the label, and the +% layering is working already. +% \fi +% +% \ifENGLISH\subsection{Support for raytracing}\fi +% \ifGERMAN\subsection{Unterstützung von Raytracing}\fi +% +% \ifGERMAN Damit die Komponente Raytracing unterstützt, müssen die +% Grenzflächen mit ihren Eigenschaften definiert werden. Die Definition +% der Ebenen werden in einenm Makro \nxLcs{\prm{name}@nodes} definiert, +% damit sie auch in den unterschiedlichen Ebenen verfügbar sind. +% +% Die Definition der Ebenen erfolgt dann über das Makro \Lcs*{newOptexpComp} +% +% \begin{lstlisting}[gobble=2] +% \def\testcomp@nodes{% +% \newOptexpComp{% +% % Definition der ersten Grenzflaeche (GF) +% {-0.5 0} % x- und y-Koordinate der GF-Mitte +% {0 1} % Richtungsvektor der GF (x und y) +% -0.5 0.5 % Grenzen fuer die NA, gesehen als Faktoren des GF-Vektor +% trans % Verhalten der GF, kann 'trans', 'refl' oder 'abs' sein +% {PlainIfc} % Art der GF +% % Dasselbe fuer die rechte GF, nur die Mitte ist anders +% {0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} +% \POE@key@n % Brechungsindex, koennte jede Zahl sein +% }% +% }% +% \end{lstlisting} +% \fi +% \ifENGLISH To add support for ray-tracing, you must define the +% interface with their properties. The definitions are nested in a macro +% \nxLcs{\prm{name}@nodes} in order to be accessible in the different +% layers. +% +% The definitions are done with the macro \Lcs*{newOptexpComp} +% +% \begin{lstlisting}[gobble=2] +% \def\testcomp@nodes{% +% \newOptexpComp{% +% % definition of the first interface (IF) +% {-0.5 0} % x- and y-coordinate of the IF center +% {0 1} % direction vector of the IF (x and y) +% -0.5 0.5 % limits use for the NA as factor for IF vector. +% trans % behavior of the IF, can be 'trans', 'refl' or 'abs' +% {PlainIfc} % type of IF +% % the same for the right IF, only the center is different +% {0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} +% \POE@key@n % refractive index, could be any number +% }% +% }% +% \end{lstlisting} +% \fi +% +% \ifENGLISH So, in condensed form, our example component looks like +% this, and the beam is not drawn inside the component any more: +% \fi +% \ifGERMAN Unsere Komponent sieht also folgendermaßen aus, und der +% Strahl verläuft nicht mehr innerhalb der Komponente: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{testcomp@comp, testcomp@nodes}}] +\begin{pspicture}(3, 2) +\newOptexpDipole{testcomp} +\makeatletter +\def\testcomp@comp{% + \psframe[fillstyle=solid, fillcolor=black!30](-0.5,-0.5)(-0.3,0.5) + \psframe(-0.5,-0.5)(0.5,0.5)}% +\def\testcomp@nodes{% + \newOptexpComp{% + {-0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} + {0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} \POE@key@n }}% +\makeatother +\begin{optexp} +\testcomp[position=0.6, labelalign=l](0,1)(3,1){label} +\drawbeam[beaminside=false](0,1){}(3,1) +\end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH\subsection{Support for external nodes}\fi +% \ifGERMAN\subsection{Unterstützung von externen Knoten}\fi +% +% \ifGERMAN Damit nun, als letzter Schritt auch externe Knoten mit \Lkeyword{extnode}, +% Positionierung an den Anfang oder das Ende mit +% \Lkeyword{position}\opt{=start|end}, oder auch das Setzen eines +% anderen Drehpunktes mit \Lkeyword{rotateref} möglich wird, müssen die +% externen Dimensionen der Komponente bekannt gemacht werden. Dafür muss +% ein weiteres Makro mit dem Name \nxLcs{\prm{name}@ref} definiert +% werden, in dem auf Postscript-Ebene die Werte \opt{@@x} (halbe +% Breite), \opt{@@y} (halbe Höhe), und optional auch \opt{@@x0} und +% \opt{@@y0} (Verschiebung der Mitte) definiert werden müssen. +% \fi +% \ifENGLISH To enable, as last step, support for external nodes with +% \Lkeyword{extnode}, positioning at the start or end with +% \Lkeyword{position}\opt{=start|end}, and setting the rotation +% reference node with \Lkeyword{rotateref}, we need to provide the +% external dimensions of the component. For this we need to define a new +% macro \nxLcs{\prm{name}@ref}, which defines at Postscript level the +% values \opt{@@x} (half width), \opt{@@y} (half height), and optionally +% \opt{@@x0} and \opt{@@y0} (offset of the center). +% \fi +% \begin{lstlisting}[gobble=2] +% \def\testcomp@ref{% +% \POE@setref{ /@@x 0.5 def /@@y 0.5 def }% +% }% +% \end{lstlisting} +% +% \ifGERMAN Der Code für unsere Beispielkomponente \nxLcs{testcomp} ist +% damit vollständig, und sieht folgendermaßen aus: +% \fi +% \ifENGLISH This completes the code for our example component +% \nxLcs{testcomp}, which now looks like this: +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]{testcomp@comp, testcomp@nodes, testcomp@ref}}] +\begin{pspicture}(3, 2) +\newOptexpDipole{testcomp} +\makeatletter +\def\testcomp@comp{% + \psframe[fillstyle=solid, fillcolor=black!30](-0.5,-0.5)(-0.3,0.5) + \psframe(-0.5,-0.5)(0.5,0.5)}% +\def\testcomp@nodes{% + \newOptexpComp{% + {-0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} + {0.5 0} {0 1} -0.5 0.5 trans {PlainIfc} \POE@key@n }}% +\def\testcomp@ref{% + \POE@setref{ /@@x 0.5 def /@@y 0.5 def }}% +\makeatother +\begin{optexp} +\testcomp[position=0.6, labelalign=l, extnode=tl](0,1)(3,1){label} +\drawbeam[beaminside=false](0,1){}(3,1) +\psdot(\oenodeExt{}) +\end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% \subsection{Beispiele für benutzerdefinierte Komponenten} +% \fi +% \ifENGLISH +% \subsection{Examples of custom components} +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(6,4) + \newOptexpTripole{raindrop} + \makeatletter + \def\raindrop@nodes{% + \newOptexpComp{% + {0 -2} { 0 2 } -2 2 trans {CurvedIfc} + {0 2} {0 -2} -2 2 refl {CurvedIfc} + {0 -2} { 0 2 } -2 2 trans {CurvedIfc} + \POE@key@n }}% + \def\raindrop@comp{\pscircle(0,0){2}}% + \raindrop(0,4)(4,2)(0,0) + \psset{beamalign=abs, arrows=->, arrowscale=2} + \drawbeam[linecolor=red](0,3){}(0,1) + \drawbeam[n=*n*1.05, linecolor=blue](0,3){}(0,1) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN +% \chapter{Beispiele} +% \fi +% \ifENGLISH +% \chapter{Examples} +% \fi +% \label{sec:examples} +% \iffalse +%<*ignore> +% \fi +\enlargethispage{1.5cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0.1,0.4)(10,4.5) + \psset[optexp]{lens=1 1 0.7, loadbeampoints} + \pnodes(2,4){L}([Xnodesep=4]L){M}([Xnodesep=1.5]M){IRSpec}([offset=-2.5]M){OSA} + \begin{optexp} + \optbox[position=start, innerlabel, optboxwidth=1.8](L)(M){fs laser} + \lens[abspos=1](L)(M) + \optbox[abspos=1.85, optboxsize=0.7 0.15, fillstyle=solid, fillcolor=black](L)(M){sample} + \lens[abspos=2.7](L)(M) + \mirror[labelangle=45](L)(M)(OSA){flip mirror} + \optbox[position=end, optboxsize=3.2 1, innerlabel, compshift=-0.2](M)(IRSpec){IR spectrometer} + \lens[abspos=1](M)(OSA) + \optplane[angle=90]([offset=-1.5]M) + \optfiber[fiberloopradius=0.2, label=1, newFiber={linewidth=1.5\pslinewidth}]([offset=-1.5]M)(OSA){MM fiber} + \optbox[position=end, innerlabel, optboxwidth=1.1](M)(OSA){OSA} + \newpsstyle{Beam}{linestyle=none, fillcolor=red, fillstyle=solid, raytrace=false} + \drawwidebeam[beamwidth=0.2, stopinside]{1-2} + \drawwidebeam[beamdiv=-25]{2-3} + \drawwidebeam[loadbeampoints=false, beamdiv=25]{3-4} + \drawwidebeam[startinside]{4-5} + \drawwidebeam[savebeampoints=false, beamalign=abs]{5-6} + \drawwidebeam[stopinside]{5}{7} + \drawwidebeam[beamdiv=-25]{7-8} +\end{optexp} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(-4.2,-1)(3,3) +\pnodes(-2,0){LOut}(0,0){Grat}(4;45){Out}(2.5;70){Mvar} +\newpsstyle{Beam}{linewidth=2\pslinewidth, linecolor=red!90!black} +\begin{optexp} + \optbox[optboxwidth=2.2, labeloffset=0, position=start](LOut)(Grat){diode laser} + \mirror[variable, label=0.5](Grat)(Mvar)(Grat){M$_\mathrm{var}$} + \optretplate[position=0.3](LOut)(Grat){$\nicefrac{\lambda}{4}$} + \optgrating(LOut)(Grat)(Out){grating} + \drawbeam[arrows=->]{1}{3}{4}(Out) + \drawbeam{2}{4} +\end{optexp} +\rput[l](-3,2){Littman setup} +\end{pspicture} +\end{LTXexample} +\bigskip + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(8.5,1.9) +\pnodes(1.4,1.3){Laser}(7.6,1.3){Diode} +\optbox[position=start, labeloffset=0](Laser)(Diode){Laser}% +\optbox[abspos=4, optboxsize=1 0.6, labeloffset=1, n=3, + compname=PC, angle=-10, rotateref=l](Laser)(Diode){Photonic Crystal} +\optdetector[dettype=diode](\oenodeOut{PC})(Diode|\oenodeOut{PC}){PD} +\nodexn{(\oenodeIn{PC}) + (2;170)}{Angle1} +\psline[linestyle=dashed](\oenodeIn{PC})(Angle1) +\psarc{<->}(\oenodeIn{PC}){1.3}{330}{30} +\psarc[arcsep=1pt]{<->}(\oenodeIn{PC}){2}{170}{180} +\uput{2.1}[175](\oenodeIn{PC}){\small $\varphi$} +\drawbeam{-} +\end{pspicture} +\end{LTXexample} +\bigskip + +\enlargethispage{2cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(10.4,1.7) +\pnodes(1.2,1){Start}(9.2,1){CCD} +\begin{optexp} +\optbox[position=end, label=0, optboxwidth=1.2](CCD)(Start){Laser} +\optbox[position=end, label=0, optboxwidth=1.2](Start)(CCD){CCD} +\polarization[poltype=perp,abspos=0.5](Start)(CCD) +\optretplate[abspos=1](Start)(CCD){$\nicefrac{\lambda}{2}$} +\lens[lens=0.4 0.4 0.5,abspos=2](Start)(CCD){$L_1$} +\lens[abspos=4](Start)(CCD){$L_2$} +\optplate[abspos=6, platelinewidth=3\pslinewidth](Start)(CCD){SLM} +\optplate[abspos=6.5, labelangle=180](Start)(CCD){PF} +\polarization[abspos=6.7](Start)(CCD) +\lens[abspos=7](Start)(CCD){$L_3$} +\drawbeam[linewidth=2\pslinewidth]{1}{2} +\end{optexp} +\end{pspicture} +\end{LTXexample} +\medskip + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(10.4,1.7) +\pnodes(1.2,1){Start}(9.2,1){CCD} +\begin{optexp} +\optbox[position=start, label=0, optboxwidth=1.2](Start)(CCD){Laser} +\polarization[poltype=perp,abspos=0.5](Start)(CCD) +\optretplate[abspos=1](Start)(CCD){$\nicefrac{\lambda}{2}$} +\lens[lens=0.4 0.4 0.5,abspos=2](Start)(CCD){$L_1$} +\pinhole[phwidth=0.05, abspos=2.35, labelangle=180](Start)(CCD){iris} +\lens[abspos=4](Start)(CCD){$L_2$} +\optplate[abspos=6,platelinewidth=3\pslinewidth](Start)(CCD){SLM} +\optplate[abspos=6.5,labelangle=180](Start)(CCD){PF} +\lens[abspos=7](Start)(CCD){$L_3$} +\optbox[position=end, label=0, optboxwidth=1.2](Start)(CCD){CCD} +\polarization[abspos=6.7, polsize=0.8](Start)(CCD) +\addtopsstyle{Beam}{fillstyle=solid, fillcolor=green!40!white, loadbeampoints} +\drawwidebeam[beamwidth=0.1, stopinside]{1}{4} +\drawwidebeam[beamdiv=-20]{4}{6} +\drawwidebeam[stopinside]{6-9} +\drawwidebeam[beamdiv=-30]{9-10} +\end{optexp} +\end{pspicture} +\end{LTXexample} +\bigskip + +\enlargethispage{2cm} +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\arxivurl{1112.5270v2}}] +\begin{pspicture}(0.3,0.4)(5.5,8.3) +\pnodes(2,7){L}(2,5.8){Pbs}([Xnodesep=1]Pbs){Blk1}(2,2.3){Bs} +\pnodes([Xnodesep=-1]Bs){Blk2}([Xnodesep=3.5]Bs){Out}(2,1.3){Slm} +\begin{optexp} + \optbox[position=end, innerlabel, optboxsize=1.2 0.6](Pbs)(L){Laser} + \psset{labelalign=r, mirrortype=extended} + \newpsstyle{ExtendedMirror}{fillstyle=solid, fillcolor=black} + \optretplate[position=0.4](L)(Pbs){HWP} + \beamsplitter[labelangle=-90](L)(Pbs)(Blk1){PBS} + \mirror[label=. -90 c](Pbs)(Blk1)(Pbs){B} + \lens[abspos=0.8, lens=0.7 0.7 0.7, n=2](Pbs)(Bs){MO} + \pinhole[phwidth=0.15, abspos=1.2](Pbs)(Bs){PH} + \lens[abspos=2.6, lensradius=1.4](Pbs)(Bs){L} + \psset{labelalign=c} + \beamsplitter[labelangle=-135](Pbs)(Bs)(Blk2){BS} + \mirror[labeloffset=0.4](Bs)(Blk2)(Bs){B} + \lens[abspos=1, lensradius=1.4](Bs)(Out){L} + \lens[abspos=2.8, lens=0.7 0.7 0.7, n=2](Bs)(Out){L} + \opttripole(Bs)(Slm)(Bs){% + \psframe[fillstyle=solid,fillcolor=gray!50](-0.3,0)(0.3,0.2) + \psline(-0.3,0.1)(-0.5,0.1)(-0.5,0.5)(0.5,0.5)(0.5,0.1)(0.3,0.1)}{SLM} + \addtopsstyle{Beam}{linestyle=none, fillstyle=solid, fillcolor=green!70!black} + \drawwidebeam[beamwidth=0.1]{1-4} + \drawwidebeam[beamwidth=0.1, beaminsidefirst, beaminsidelast]{3}{5-8} + \psset{savebeampoints=false, loadbeampoints} + \drawwidebeam{8-11}(Out)\drawwidebeam[beaminsidefirst]{8}{12} +\end{optexp} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(6.4,3.2) +\addtopsstyle{Fiber}{linecolor=red}\psset{fiber=none} +\pnodes(2.3,2.3){Lin}([Xnodesep=4.5]Lin){Det} +\optbox[label=0.2, position=start, compname=L, extnode=b](Lin)(Det){% + \psGauss[yunit=0.03,sigma=0.03]{-0.5}{0.5}} +\optbox[label=0, compname=EAM, extnode=b, abspos=1.5](Lin)(Det){EAM} +\optfiber[labeloffset=0.3, abspos=3.2](Lin)(Det){fibre} +\optdetector(Lin)(Det){OSA} +\pnode([Xnodesep=-0.5,offset=-1]\oenodeExt{L}){Osc} +\elecsynthesizer[wire=none](Osc)(\oenodeExt{EAM}|Osc){10\,GHz} +\optarrowcomp[arrowcompsize=0.8 0.6, arrowscale=1.5](Osc)(\oenodeExt{EAM}|Osc){$\tau$} +\drawfiber{1-4} +\addtopsstyle{Wire}{arrows=->, arrowinset=0, arrowscale=1.5} +\drawwire{5}{6}\psset[optexp]{wireangleB=90} +\drawwire{6}(\oenodeExt{EAM})\drawwire{5}(\oenodeExt{L}) +\end{pspicture} +\end{LTXexample} + +\enlargethispage{1cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0.2,0.6)(8.2,3.5) +\pnodes(2,3){Laser}(2,1){PwMeter}(6,3){CplTop}(6,1){CplBot} +\psset{arrowscale=1.5, arrowinset=0} +\optbox[position=start, optboxsize=1.8 1, labeloffset=0](Laser)([Xnodesep=0.1]Laser){% + \begin{tabular}{@{}c@{}}Nd:YAG\\[-0.4ex]cw laser\end{tabular}} +\optcoupler[addtoFiberIn1={ArrowInside=->}, addtoFiberIn2={ArrowInside=-<}, + labeloffset=0.4](Laser)(PwMeter)(CplTop)(CplBot){WDM} +\optfiber[addtoFiberOut={ncurv=1, angleB=0}, addtoFiberIn={ncurv=1, angleA=0}, + compshift=-1, label=0.2 . l](CplBot)(CplTop){fiber} +\optdetector[dettype=diode]([Xnodesep=0.1]PwMeter)(PwMeter){power meter} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0.9,0.9)(10.4,6.1) +\psset{arrowscale=1.5, arrowinset=0} +\pnodes(2,5){PC1in}(4,5){PC1out}(6,5){PC2in}(8,5){PC2out}(2,2){CplSig} +\pnodes(5,2){CplIn}(2,1){CplOut}(10,4.5){Pump}(8,2){PumpSig} +\optisolator[compshift=0.8, addtoFiberIn={angleA=180}, + addtoFiberOut={angleB=180}, label=0.5 . l]% + (CplSig)(PC1in){isolator} +\polcontrol[addtoFiberIn={arrows=|-}](PC1in)(PC1out) +\optfiberpolarizer[labeloffset=0.6](PC1out)(PC2in){polarizer} +\polcontrol[addtoFiberOut={arrows=-|}](PC2in)(PC2out) +\wdmsplitter[labeloffset=0.3, coupleralign=bottom, addtoFiberIn={arrows=|-}, + addtoFiberOut1={arrows=->}, addtoFiberOut2={arrows=-|}]% + (CplIn)(CplOut)(CplSig){95/5} +\wdmcoupler[addtoFiberIn1={ArrowInside=->}, addtoFiberIn2={angleA=0}, + addtoFiberOut={angleB=0,arrows=-|}, ncurv=0.9, + coupleralign=bottom, compshift=0.8](Pump)(PC2out)(PumpSig){pump} +\optbox[position=start, innerlabel, optboxwidth=1.6](Pump)([offset=-0.1]Pump){980~nm} +\optfiber[fiberloops=2, labeloffset=0.4](CplIn)(PumpSig){Er$^+$-doped} +\end{pspicture} +\end{LTXexample} +\bigskip + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(1,1.2)(6.2,5) +\pnodes(1,4){SigIn}(3,4){BS}(3,5){LO}(5,4){Det1}(3,2){Det2} +\begin{optexp} + \optplane[compname=LO, angle=90](LO) + \beamsplitter[compname=BS](SigIn)(BS)(Det2) + \lens[abspos=0.5, compname=L2, n=2.1](Det2)(BS){$L_2$} + \lens[abspos=0.5, compname=L1, n=2.1](Det1)(BS){$L_1$} + \psset[optexp]{extnodealign=rel, extnode=r} + \optdetector[compname=Det1](BS)(Det1){PD1} + \optdetector[compname=Det2](BS)(Det2){PD2} + \addtopsstyle{Beam}{beamwidth=0.2, fillstyle=solid, + fillcolor=green, opacity=0.2} + \drawwidebeam(SigIn){BS}{L2}{Det2} + \drawwidebeam[beaminsidefirst]{BS}{L1}{Det1} + \newpsstyle{Beam}{linecolor=red, linestyle=dashed, linewidth=1.5\pslinewidth} + \drawbeam{LO}{BS}{L1}{Det1} + \drawbeam[beaminsidefirst]{BS}{L2}{Det2} +\end{optexp} +\cnodeput[framesep=5pt]([Xnodesep=0.5, offset=-0.5]\oenodeExt{Det1}|\oenodeExt{Det2}){M}{\rule{2.5mm}{1pt}} +\psset{arrows=<-, arrowscale=1.5, arrowinset=0} +\nccurve[angleA=90]{M}{\oenodeExt{Det1}} +\nccurve[angleA=180, angleB=-90]{M}{\oenodeExt{Det2}} +\end{pspicture} +\end{LTXexample} +\bigskip + +\begin{LTXexample}[pos=t, caption={caption}, label={ex:lclv}] +\begin{pspicture}(-0.2,0)(9,5) +\psset[optexp]{lens=1.2 0 1.2, n=1.72} +\addtopsstyle{Beam}{fillstyle=solid, fillcolor=green, opacity=0.3} +\pnodes(2.4,1){BS1}([offset=3]BS1){M1}([Xnodesep=5.5]M1){PP}(PP|BS1){BS2} +\begin{optexp} + \optbox[label=0, position=start, optboxwidth=1.6]([Xnodesep=-1]BS1)(BS1){Nd:YAG} + \beamsplitter[compname=BS](BS2)(BS1)(M1){BS} + \optdipole[position=0.2, compname=LCLV, optdipolesize=0.28 1](BS1)(BS2){% + \psframe[fillstyle=solid,fillcolor=black,dimen=outer](-0.14,-0.5)(-0.02,0.5) + \psframe[fillstyle=solid,fillcolor=gray!50,dimen=outer](-0.02,-0.5)(0.14,0.5) + }{LCLV} + \optretplate(BS1)(M1){P} + \mirror(BS1)(M1)(PP){M} + \lens[position=0.2](M1)(PP){L} + \pinhole(M1)(PP) + \lens[position=0.2](PP)(M1){L} + \pentaprism(M1)(PP)(BS2){PP} + \beamsplitter(PP)(BS2)(BS1){BS} + \doveprism[compname=Dove, position=0.27, n=2.3](BS2)(BS1){Dove} + \lens[n=2.5](BS2)(BS1){L} + \drawwidebeam[beamwidth=0.3]{1-3} + \drawwidebeam[loadbeampoints]{3}{2}{4-}{3} +\end{optexp} +\end{pspicture} +\end{LTXexample} + +\enlargethispage{1cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0,-0.2)(8.6,5.6) +\pnodes(1.5,5){Laser}(4,5){PBS}(6.5,5){PBS2}(6.5,5.7){piezo}(4,2){BSFwd} +\pnodes(6.5,2){BSBwd}(2,2){BS4f}(2,0.5){M4f3}(8,2){M4f1}(8,0.5){M4f2}(1,2){CCD} +\psset{mirrorwidth=0.6, plateheight=0.7, outerheight=0.7, labeloffset=0.7, labelstyle=\scriptsize, lens=1.2 1.2 0.8, bssize=0.5} +\optbox[position=start, optboxsize=1.5 0.7, innerlabel]% + (Laser)(PBS){\parbox{1.5cm}{\centering Nd:YAG\\ 532\,nm}} +\lens[lensheight=0.5, position=0.2](Laser)(PBS){MO} +\pinhole[position=0.3,labelangle=180](Laser)(PBS){PH} +\lens[position=0.5](Laser)(PBS){L} +\optretplate[position=0.8](Laser)(PBS){$\nicefrac{\lambda}{2}$} +\beamsplitter(Laser)(PBS)(BSFwd){PBS} +\optretplate[position=0.4](PBS)(BSFwd){$\nicefrac{\lambda}{2}$} +\polarization(PBS)(BSFwd)\polarization(PBS2)(BSBwd) +\lens[position=0.8](PBS)(BSFwd){L} +\optretplate(PBS)(PBS2){$\nicefrac{\lambda}{2}$} +\beamsplitter(PBS)(PBS2)(piezo){PBS} +\optretplate[abspos=0.5](PBS2)(piezo){$\nicefrac{\lambda}{4}$} +\mirror[mirrortype=piezo,labelangle=90](PBS2)(piezo)(PBS2){PZ} +\lens[position=0.8,labelangle=180](PBS2)(BSBwd){L} +\crystal[crystalsize=1 0.5, voltage, lamp, fillstyle=solid, fillcolor=yellow!90!black, labeloffset=0.8](BSFwd)(BSBwd){SBN:Ce} +\beamsplitter(PBS)(BSFwd)(BSBwd){BS} +\beamsplitter[labelangle=-90](PBS2)(BSBwd)(BSFwd){BS} +\mirror(BSBwd)(M4f1)(M4f2){M}\mirror(M4f1)(M4f2)(M4f3){M} +\lens[labelangle=180](M4f2)(M4f3){L}\mirror(M4f2)(M4f3)(BS4f){M} +\beamsplitter(M4f3)(BS4f)(CCD){BS} +\optbox[position=end, label=0, optboxwidth=1](BS4f)(CCD){CCD} +\lens[abspos=0.7](BS4f)(BSFwd){L}\lens[abspos=0.7](BSBwd)(M4f1){L} +\addtopsstyle{Beam}{linewidth=2\pslinewidth, linejoin=2} +\drawbeam{1-6}{11-14}{13}{12}{15}{18}{16}{17}{25}{23}{24} +\drawbeam[beaminsidefirst]{6}{7}{10}{17}{16}{18}{26}{19-24} +\end{pspicture} +\end{LTXexample} + +\bgroup +\psset{unit=0.9} +\begin{LTXexample}[pos=t, caption={caption}, label=ex:transmission-loop] +\begin{pspicture}(13,5.5) +\psset{optboxwidth=1, labelstyle=\footnotesize, fiber=none} +\pnodes(1,5){LD}([Xnodesep=5.5]LD){CPLin1}([offset=-2]CPLin1){CPLin2} +\pnodes([Xnodesep=2.5]CPLin1){CPLout1}([Xnodesep=2.5]CPLin2){CPLout2} +\pnode([Xnodesep=3]CPLout1){RX} +\optbox[position=start, label=0](LD)(CPLin1){LD} +\optmzm[abspos=0.8](LD)(CPLin1){MZM} +\optamp[abspos=2](LD)(CPLin1){EDFA} +\optfilter[abspos=3](LD)(CPLin1){BPF} +\optswitch[abspos=4](LD)(CPLin1){SW} +\polcontrol[abspos=5, fiber=out](LD)(CPLin1) +\drawfiber{1-6} +\optcoupler[couplertype=none, fiber](CPLin1)(CPLin2)(CPLout1)(CPLout2) +\optamp[abspos=0.8, fiber=in](CPLout1)(RX){EDFA} +\optfilter[abspos=2](CPLout1)(RX){BPF} +\optbox[position=end](CPLout1)(RX){RX} +\drawfiber{8-10} +\pnodes([Xnodesep=-0.5]LD|CPLin2){TL}(RX|TL){TR}([offset=-2.5]TR){BR}(TL|BR){BL} +\optamp[fiber=i](CPLout2)(TR){EDFA} +\optfiber[label=0.3 . t, position=0.85](BL)(BR){SSMF 89.8~km} +\drawfiber[fiberstyle=angle, arm=1.2, linearc=0.5, startnode=N]{11}{12} +\optamp[position=0.3](BR)(BL){EDFA} +\optfilter[position=0.55, labelangle=180](BL)(BR){BPF} +\optfiber[fiberloops=1, label=0.3 . t, position=0.35](BL)(BR){DCF 16.2~km} +\optamp[position=0.85](BR)(BL){EDFA} +\optfilter[position=0.2](TL)(CPLin2){BPF} +\optswitch(TL)(CPLin2){SW} +\polcontrol[position=0.8, fiber=out](TL)(CPLin2) +\drawfiber{12-16}\drawfiber{17-19} +\drawfiber[fiberstyle=angle, arm=0.5, linearc=0.5, stopnode=1]{16}{17} +\end{pspicture} +\end{LTXexample} +\egroup + +\enlargethispage{1cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(12, 4) + \psset{labeloffset=0.3, fiber=none} + \pnodes(1.6,2){In}(12, 2){Ref} + \optplate[linestyle=dashed, plateheight=3, position=1, compname=RefPlane](In)(Ref) + \addtopsstyle{Beam}{linestyle=none, beamdiv=20, beaminside=false, fillstyle=solid, fillcolor=red, opacity=0.3} + \multido{\i=1+1, \ii=165+10}{4}{% + \rput(Ref){\pnode(6;\ii){A\i}} + \optbox[optboxsize=0.5 0.3, position=end, compname=Box\i, extnode=l](Ref)(A\i) + \lens[lens=0 -0.6 0.6, abspos=0.5, compname=L\i](A\i)(Ref) + \lens[lens=1.2 1.2 0.8, abspos=1.1, n=1.65, compname=LC\i](A\i)(Ref) + \drawwidebeam{Box\i}{L\i}{LC\i}{RefPlane} + }% + \optcoupler[abspos=1](In)(In)(Ref)(Ref) + \wdmsplitter[abspos=2.5, compshift=1](In)(Ref)(Ref) + \wdmsplitter[abspos=2.5, compshift=-1](In)(Ref)(Ref) + \optbox[compshift=-1, position=start, label=0](In)(Ref){Laser1} + \optbox[compshift=1, position=start, label=0](In)(Ref){Laser2} + \drawfiber{17}{14}{15}{Box1}\drawfiber{15}{Box2} + \drawfiber{18}{14}{16}{Box3}\drawfiber{16}{Box4} +\end{pspicture} +\end{LTXexample} +\medskip + +\begin{LTXexample}[caption={caption}] +\begin{pspicture}(0.5,0)(2.2,4) + \pnodes(0,1){A}(1,1){BS}(2,1){G}(1,4){B} + \beamsplitter(G)(BS)(B) \optgrating(BS)(G)(BS) + \lens[lens=2 2 1.5, compshift=0.1, n=2.25](BS)(B) + \pinhole[phwidth=0.05, innerheight=0.05, position=0.8, compshift=0.18](BS)(B) + \optplane[angle=90](B) + \addtopsstyle{Beam}{linestyle=none, beamwidth=0.2, fillstyle=solid} + \drawwidebeam[fillcolor=red!25!white](A){1-2}{1}{3-5} + \drawwidebeam[fillcolor=red!50!white, beamangle=-5]{2}{1}{3-5} +\end{pspicture} +\end{LTXexample} + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\href{http://de.wikipedia.org/w/index.php?title=Datei:Czerny-turner.png}{Wikipedia}}, label={ex:czerny-turner}] +\begin{pspicture}(0,-1)(8.5,4) +\psframe[fillstyle=solid,fillcolor=gray!90,linestyle=none](0,-1)(8.5,4) +\addtopsstyle{OptComp}{linecolor=white} +\newpsstyle{Beam}{ArrowInside=->, linejoin=2, arrowscale=1.3, arrowinset=0} +\addtopsstyle{ExtendedMirror}{hatchcolor=white, hatchsep=0.5\pslinewidth} +\pnodes(0,3){A}(8,3){B}(3,1.5){C}(8,0){D}(0,0){E}% +\psset{linewidth=1.5\pslinewidth, mirrorradius=13, mirrorwidth=1.5, gratingwidth=1.3, mirrortype=extended, phwidth=0.1, outerheight=1.5}% +\begin{optexp} + \pinhole[position=0.2](A)(B)% + \mirror(A)(B)(C) + \optgrating[reverse, angle=15, variable](B)(C)(D) + \mirror(C)(D)(E) + \pinhole[position=0.8](D)(E) + \drawwidebeam[ArrowInsidePos=0.3, beamwidth=0.2, linecolor=white, beamdiv=-7.15](A){1-3} + \psset{loadbeampoints, savebeampoints=false}% + \drawwidebeam[ArrowInsidePos=0.6, beamangle=3, linecolor=blue!60!white]{3-5}(E) + \drawwidebeam[ArrowInsidePos=0.7, linecolor=green!60!white, arrows=->, ArrowInsideMinLength=2]{3-5}(E) + \drawwidebeam[ArrowInsidePos=0.8, beamangle=-3, linecolor=red!60!white]{3-5}(E) +\end{optexp} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0,0.7)(9.4,3.3) + \psset[optexp]{couplertype=rectangle, fiber=none, detsize=0.5 0.6} + \multido{\i=1+1}{3}{% + \optbox[optboxsize=1.5 0.6, innerlabel,position=start](1.5,\i)(7,\i){Laser \i} + \wdmsplitter[position=0.2](1.5,\i)(7,\i)(7,\i) + \wdmcoupler[position=0.8](1.5,\i)(1.5,\i)(7,\i) + \optdetector[label=0.4 90 l](1.5,\i)(7,\i){Detector \i} + }% + \drawfiber[linecolor=blue, startnode=N]{1}{2}{7} + \drawfiber[linecolor=blue]{2}{11} + \drawfiber[linecolor=green, stopnode=1]{5}{6}{11} + \drawfiber[linecolor=green, stopnode=2]{6}{3} + \drawfiber[linecolor=red]{9}{10}{3} + \drawfiber[linecolor=red, startnode=2]{10}{7} + \drawfiber[linecolor=cyan]{11}{12} + \drawfiber[linecolor=magenta]{7}{8} + \drawfiber[linecolor=yellow]{3}{4} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[caption={caption}] +\psset{unit=1.5} +\begin{pspicture}(0,1)(2.2,4.2) + \pnodes(0,2){In}(1,2){G}(1,4){M1}(2,2){M2}(1,1){S} + \mirror[mirrortype=semitrans](In)(G)(M1) + \optbox[optboxwidth=0.15, angle=45, style=SemitransMirror](G)(M1) + \mirror[mirrortype=extended](G)(M1)(G) + \mirror[mirrortype=extended](G)(M2)(G) + \optplate[position=end](G)(S) + \newpsstyle{Beam}{linecolor=red, ArrowInside=->, ArrowInsidePos=0.4, arrowscale=1.5} + \drawbeam(In){1}{4}{1}{5} + \drawbeam(In){1-3}{2}{1}{5} +\end{pspicture} +\end{LTXexample} + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[vsep=10mm, pos=t, caption={\ifENGLISH Adapted from \fi\ifGERMAN Angepasst von \fi\href{http://www.semibyte.de/wp/graphicslibrary/gl-physics/versuchsaufbauten-f-praktikum/}{semibyte.de}}] +\begin{pspicture}(13.6,2.6) + \psset[optexp]{labeloffset=1, mirrorwidth=0.5, optboxwidth=2} + \pnodes(2,1){Laser}(12,2){Film}(Film|Laser){Ref} + \begin{optexp} + \optbox[position=start](Laser)(Ref){HeNe-Laser} + \pinhole[abspos=0.8](Laser)(Ref){Blende} + \optbox[abspos=2.5](Laser)(Ref){Raumfilter} + \lens[fillstyle=solid, fillcolor={[rgb]{0.87,0.91,0.93}}](Laser)(Ref){Linse} + \mirror[label=1 30]([offset=0.2]Laser)([offset=0.2]Ref)(Film){% + \begin{tabular}{c}Spiegel\\(fest)\end{tabular}} + \opttripole[label=0.4](Ref)(Film)(Ref){% + \psframe(0.5,1\pslinewidth)(-0.5,5\pslinewidth) + \psline[linewidth=2\pslinewidth](0.5,0)(-0.5,0) + }{Film} + \newpsstyle{Beam}{linewidth=2\pslinewidth, linecolor=red!90!black, beamalign=absolute} + \drawbeam{1-4} + \drawbeam[beampos=0.2]{4-6} + \mirror[variable, label=0.8 -30]([offset=-0.2]Laser)([offset=-0.2, Xnodesep=-0.7]Ref)(Film){var. Spiegel} + \drawbeam[beampos=-0.2]{4}{7}{6} + \end{optexp} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(0,0.2)(6.6,3.1) + \psset{mirrorwidth=0.6, useNA=false, beaminsidefirst} + \pnodes(0,2){In}(1,2){BS}(1,0.5){M1}(2,1){M2}(6,1.5){Det} + \mirror[mirrortype=semitrans, n=1](In)(BS)(M1) + \mirror[label=0.6 180 . absolute, compname=M](BS)(M1)(M2|M1) + \mirror(M1)(M2|M1)(M2) + \mirror(M2|M1)(M2)([Xnodesep=1]M2) + \optbox[optboxsize=2 1, abspos=2, label=0, allowbeaminside=false](BS)([offset=0.5]Det){% + \parbox{1.6\psxunit}{spectral\\filter ($\Omega$)}} + \lens[lens=4 4 2, n=3.3]([Xnodesep=-3]Det)(Det) + \optbox[optboxsize=0.2 0.6, n=1, label=-1.2](\oenodeOut{6})(Det){% + \begin{tabular}{@{}c@{}}nonlinear\\ crystal\end{tabular}} + \optplate[linestyle=none](\oenodeOut{7})(Det) + \optdetector[detsize=0.6 0.6, fillstyle=solid, fillcolor=blue](\oenodeOut{6})(Det) + \newpsstyle{Beam}{linewidth=1.5\pslinewidth} + \drawbeam[linecolor=blue]{7-9} + \addtopsstyle{Beam}{linecolor=red} + \drawbeam(In){1-4}{6-8} + \drawbeam{1}{5-8} + \rput[r](\oenodeLabel{M}){$\tau$ + \psline[arrows=<->, arrowinset=0](0.15,0.25)(0.15,-0.15)} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}, label={ex:glan-thompson}] +\begin{pspicture}(-1,-0.5)(8,1.5) + \newpsobject{perppol}{polarization}{poltype=perp, linecolor=green, polsize=1} + \newpsobject{parpol}{polarization}{poltype=parallel, linecolor=red, polsize=0.8} + \newpsstyle{Polarization}{arrowinset=0, arrowscale=1.2} + \pnodes(0,1){A}(8,1){B}(4,-0.5){C} + \glanthompson[glanthompsongap=0.2, glanthompsonsize=2 1](A)(B) + \optplane(B)\optplane[angle=90](C) + \drawbeam(A){1-2} + \drawbeam[linestyle=dashed, dash=2pt 2pt, linecolor=red, arrows=->](A){1}{3} + \parpol[abspos=1](A)(B)\perppol[abspos=1](A)(B) + \nodexn{(\oenodeBeam{})-1.5(!\oeBeamVec{})}{D} + \perppol[abspos=7](A)(B)\parpol(D)(\oenodeBeam{}) +\end{pspicture} +\end{LTXexample} +\enlargethispage{1cm} +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(13.7,2.9) +\newpsstyle{Wire}{arm=0.1, arrows=->} +\psset[optexp]{optboxsize=1.2 0.8, optmzmsize=1.2 0.8, fiber=none, label=0.7} +\pnodes(2,1){L}([Xnodesep=11]L){A} +\optbox[position=start, optboxwidth=2, label=0](L)(A){DFB-Laser} +\optbox[abspos=1, label=0, compname=Eam, extnode=t](L)(A){EAM} +\optmzm[abspos=4.5, compname=Mzm1, extnode=t](L)(A){MZM} +\optmzm[abspos=6, compname=Mzm2, extnode=t](L)(A){MZM} +\optamp[abspos=9](L)(A){EDFA} +\drawfiber{1-5}\drawfiber[arrows=->]{}(A) +\pnode([offset=1.5]\oenodeExt{Eam}){Osci} +\elecsynthesizer[compname=Syn, position=0.5, wire=o, label=0.5 . r](Osci)(\oenodeExt{Eam}){10\,GHz} +\psset[optexp]{label=0, wire, optboxsize=0.8 1.2} +\optbox[compname=Ppg1](\oenodeExt{Mzm1}|Osci)(\oenodeExt{Mzm1}){PPG} +\optbox[compname=Ppg2](\oenodeExt{Mzm2}|Osci)(\oenodeExt{Mzm2}){PPG} +\drawwire[arrows=-, wireangleB=-90]{Syn}(\oenodeExt{Mzm2}|Osci) +\rput([offset=0.5, Xnodesep=-0.3]A){Faserschleife} +\end{pspicture} +\end{LTXexample} + +\enlargethispage{110pt} +\begingroup +\captionsetup[lstlisting]{format=poecaption}% +\begin{LTXexample}[pos=t, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\doiurl{10.1364/OL.37.000930}}] +\begin{pspicture}(0,0.2)(13.5,4.7) +\psset[optexp]{optboxsize=1 0.8, label=0, fiber=none} +\pnodes(1,3.2){Scan}\pnode([offset=-1.6]Scan){Sat} +\pnode([Xnodesep=5]Scan){ScanCpl}\pnode(ScanCpl|Sat){SatCpl} +\pnode([Xnodesep=1.5,offset=-0.8]ScanCpl){Cpl}\pnode([Xnodesep=5]Cpl){PD} +\pnode([Xnodesep=2.5, offset=-1.4]Cpl){Pump} +\optbox[position=start](Scan)(ScanCpl){Scan} +\optmzm[abspos=1, compname=M1, extnode=t](Scan)(ScanCpl) +\optmzm[abspos=2.5, compname=M2, extnode=t](Scan)(ScanCpl) +\optamp[abspos=3.7](Scan)(ScanCpl) +\polcontrol[abspos=4.5, fiber=o](Scan)(ScanCpl) +\drawfiber{1-5} +\optbox[position=start, compname=S, extnode=b](Sat)(SatCpl){Sat} +\optmzm[abspos=1.75, compname=M3, extnode=b](Sat)(SatCpl) +\optamp[abspos=3.7](Sat)(SatCpl) +\polcontrol[abspos=4.5, fiber=o](Sat)(SatCpl) +\drawfiber{6-9} +\wdmcoupler[fiber=i](ScanCpl)(SatCpl)(Cpl) +\optisolator[position=0.1](Cpl)(Pump|Cpl) +\optfiber[position=0.6](Cpl)(Pump|Cpl) +\addtopsstyle{OptCircArrow}{arrows=<-} +\optcirculator[optcircangle=0 -90](Cpl)(PD)(Pump) +\wdmsplitter[position=0.8, coupleralign=t](Cpl)(PD) +\optbox[position=end, compname=Pd, extnode=t](Cpl)(PD){PD} +\optbox[position=end, compshift=-1.5](Cpl)(PD){OSA} +\optamp[fiber](Pump)(\oenodeIfc{2}{13}) +\optbox[position=start, optboxsize=0.6 1.2](Pump)(Pump|Cpl){Pump} +\drawfiber{10-15}\drawfiber{14}{16} +\optbox[compshift=0.7, optboxsize=2.5 0.8](\oenodeExt{M2})(\oenodeExt{Pd}|\oenodeExt{M2}){Lock-In Amp} +\addtopsstyle{Wire}{arm=0.1} +\drawwire[wireangleA=90, linearc=0.3](\oenodeExt{M2}){} +\drawwire[wireangleB=90, linearc=0.3]{}(\oenodeExt{Pd}) +\elecsynthesizer([offset=0.2]\oenodeExt{M1})(\oenodeExt{M1}) +\psset[optexp]{synthshape=rectangle} +\elecsynthesizer[synthtype=sawtooth](\oenodeExt{S}|Pump)(\oenodeExt{S}) +\elecsynthesizer[synthtype=triangle](\oenodeExt{M3}|Pump)(\oenodeExt{M3}) +\end{pspicture} +\end{LTXexample} +\endgroup + +\enlargethispage{100pt} +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, caption={\ifENGLISH Adapted from \fi\ifGERMAN Angepasst von \fi\href{http://www.semibyte.de/wp/graphicslibrary/gl-physics/versuchsaufbauten-f-praktikum/}{semibyte.de}}, label={ex:absspektr}] +\begin{pspicture}(0.2,0.5)(9,7.4) + \pnode(1,2){DL}\pnode([offset=0.5]DL){OAP}\pnode([Xnodesep=2]OAP){ST} + \pnode([offset=-1.4]ST){SP4}\pnode([Xnodesep=4]SP4){SP3} + \pnode([offset=3]SP3){JL}\pnode([Xnodesep=1]SP3|ST){SP1} + \pnode([Xnodesep=1]ST|JL){SP2}\pnode([Xnodesep=1.5,offset=3]SP2){Det} + \psset[optexp]{optboxsize=1.5 0.9, labeloffset=0.6} + \begin{optexp} + \optbox[position=start, innerlabel](DL)(OAP){\parbox{1.5\psunit}{\centering Dioden-\\laser}} + \psset[optexp]{mirrortype=extended} + \mirror[mirrorradius=2](DL)(OAP)(ST){OAP} + \psset[optexp]{variable} + \beamsplitter[bssize=0.4, labelangle=-45](SP4)(ST)(SP1){ST} + \optplate[abspos=1, plateheight=0.7](ST)(SP1){CP} + \mirror(ST)(SP1)(SP2){SP1}\mirror(SP1)(SP2)(Det){SP2} + \optdipole[label=-0.7 . b relative, optdipolesize=2, position=0.6](SP2)(Det){% + \psframe[dimen=outer](-1,-0.6)(1,0.6) + \psset{fillstyle=solid, fillcolor=blue!40, linestyle=none} + \psframe(-1,-0.5)(-0.9,0.5)\psframe(0.9,-0.5)(1,0.5)}{Plasmareaktor} + \optdetector[label=. 30 l](SP2)(Det){Detektor} + \optbox[position=end, innerlabel](SP3)(JL){\parbox{1.5\psunit}{\centering Justage-\\laser}} + \mirror(SP4)(SP3)(JL){SP3}\mirror(ST)(SP4)(SP3){SP4} + \psset{linewidth=2\pslinewidth} + \drawbeam[linecolor=blue, beampos=0.03]{1-2} + \drawbeam[beamalign=abs, loadbeampoints, linecolor=blue]{2-8} + \drawbeam[linecolor=red, beampos=-0.03]{9-11}{3-8} + \end{optexp} + \pnode([Xnodesep=1.2,offset=-0.6]\oenodeIn{8}){NaCl} + \psset{linestyle=dashed, arrows=->, arrowscale=1.5} + \ncline[nodesepA=0.1, nodesepB=0.2]{NaCl}{\oenodeIn{7}} + \ncline[nodesepA=0.1, nodesepB=0.3]{NaCl}{\oenodeOut{7}} + \rput[l](NaCl){NaCl-Fenster} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\doiurl{10.1364/AOP.1.000308}, \ifGERMAN Abb. \fi\ifENGLISH Fig. \fi 8}, label={ex:autocorrelation}] +\begin{pspicture}(5.7,2.8) +\psset{mirrorwidth=0.7, bsstyle=plate, bssize=0.5, arrowinset=0, arrowscale=1.2} +\newpsobject{splitterplate}{beamsplitter}{linewidth=2\pslinewidth, linecolor=gray!50} +\pnodes(2.3,0){In}([offset=0.5]In){STM1}([Xnodesep=-2]STM1){M1} +\pnodes([offset=1]M1){M2}([offset=2]STM1){M3}([Xnodesep=-1]M3){M4}(M4|M2){STM2} +\splitterplate(In)(STM1)(M1) +\mirror(STM1)(M1)(M2) +\mirror(M1)(M2)(M3|M2) +\mirror(STM1)(M3)(M4) +\mirror[label=0.6 180 . absolute](M3)(M4)(STM2) +\rput[r](\oenodeLabel{}){$\tau$ + \psline[arrows=<->](0.15, 0.4)(0.15, -0.2)} +\splitterplate[compoffset=0.2, compname=STM2](M4)(STM2)([Xnodesep=1]STM2) +\pnode(\oenodeCenter{STM2}){STM2C} +\pnode([Xnodesep=4]STM2C){Out} +\lens[n=2](STM2C)(Out) +\optbox[position=0.65, optboxsize=0.1 0.6](STM2C)(Out) +\optplate[linestyle=none, position=0.75](STM2C)(Out) +\pinhole[position=0.95, outerheight=0.6](STM2C)(Out) +\optdetector[detsize=0.5 0.6](STM2C)(Out) +\drawbeam[linecolor=blue]{8-} +\newpsstyle{Beam}{ArrowInside=->, linecolor=red, ArrowInsideMinLength=1, arrows=>-} +\drawbeam[ArrowInsidePos=0.835](In){1-3}{7-9} +\drawbeam[ArrowInsidePos=0.74](In){1}{4-9} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(13.8,3.8) + \pnode(2.3,2){Signal} + \pnode([Xnodesep=1.5,offset=0.8]Signal){UpIn} + \pnode([Xnodesep=1.5, offset=-0.8]Signal){LowIn} + \pnode([Xnodesep=3.5]UpIn){UpOut} + \pnode(UpOut|LowIn){LowOut} + \pnode([Xnodesep=1.5]UpOut){UpIn2} + \pnode([Xnodesep=3]UpIn2){UpOut2} + \pnode([Xnodesep=1.5]LowOut){LowIn2} + \pnode(UpOut2|LowIn2){LowOut2} + \psset{labelstyle=\footnotesize} + \psset{fiber=none}\addtopsstyle{Fiber}{linecolor=red} + \psset{wire=none}\addtopsstyle{Wire}{arm=0.1, arrows=->} + \optbox[position=start, label=0, optboxsize=2.3 0.8](Signal)([Xnodesep=0.1]Signal){2.5\,ps, 10\,GHz} + \wdmsplitter[label=0.4](Signal)(UpIn)(LowIn){50\%} + \optfiber[fiberloops=4, label=0.4, position=0.3](LowIn)(LowOut){L$_2$} + \optswitch[position=0.7](LowIn)(LowOut){AOM} + \optfiber[fiberloops=2, label=0.4, position=0.2](UpIn)(UpOut){L$_1$} + \optswitch[position=0.7](UpIn)(UpOut) + \optcoupler[label=0.4, position=0.3](UpOut)(LowOut)(UpIn2)(LowIn2){50\%} + \optbox[optboxsize=2 0.8, position=end, label=0, extnode=t](LowIn2)(LowOut2){Messsystem} + \drawfiber{1-4}{7}(LowIn2)\drawfiber[arrows=->](LowIn2){8} + \optdetector[abspos=0.4, detsize=0.6 0.8](UpIn2)(UpOut2){PD} + \optbox[optboxsize=0.8 0.8, label=0, position=0.44](UpIn2)(UpOut2){$\div 8$} + \optamp[position=0.8](UpIn2)(UpOut2) + \optbox[position=end, extnode=b, label=0, optboxsize=2 0.8](UpIn2)(UpOut2){Faserkamm} + \drawfiber{2}{5-7}(UpIn2)\drawfiber[arrows=->](UpIn2){9} + \drawwire{9-12} + \drawfiber[arrows=->](\oenodeExt{12})(\oenodeExt{8}) +\end{pspicture} +\end{LTXexample} + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\doiurl{10.1103/PhysRevLett.105.263904}}, label={ex:wgm-pdc}] +\begin{pspicture}(0.6,2.8)(6.8,7.8) +\pnodes(1,6){Laser}(1,5){M}(3,4){PR}(5,5){PT}(6,7){D1} +\newpsstyle{Glass}{fillcolor=blue, fillstyle=solid, opacity=0.15, linecolor=blue!30!white} +\begin{optexp} + \optbox[position=start, innerlabel, optboxwidth=1.8](Laser)(M){Nd:YAG} + \optprism[style=Glass, compname=P, n=1, prismtype=reflective, prismangle=60, labeloffset=1.2](M)(PR)(PT){\begin{tabular}{@{}c@{}}diamond\\ prism\end{tabular}} + \mirror(Laser)(M)(\oenodeIfc{2}{P})% + \lens[abspos=1.05, style=Glass](\oenodeIfc{2}{P})(M)% + \optprism[compname=PDet, style=Glass](\oenodeIfc{2}{P})(PT)(D1)% + \lens[abspos=1.05, style=Glass](\oenodeIfc{2}{P})(\oenodeOut{PDet})% + \newpsstyle{Beam}{linestyle=none, fillstyle=solid}% + \drawwidebeam[fillcolor=green, beamwidth=0.2, beaminsidelast, beampathcount=5]{1}{3}{4}{2}% + \drawwidebeam[fillcolor=orange, beaminsidefirst, startinsidecount=1, loadbeam, beaminsidelast]{2}{6}% + \psset{savebeam=false, loadbeam, beamnodealign=vector}% + \drawwidebeam[fillcolor=orange]{6}{5}% + \drawwidebeam[fillcolor=green, n=1.2, beampathskip=1, savebeam=2]{6}{5}(D1) + \drawwidebeam[fillcolor=red, beampathskip=1, n=1.4, savebeam=3]{6}{5}(D1) + \drawwidebeam[fillcolor=red!50!black, beampathskip=1, n=1.57, savebeam=4]{6}{5}(D1) + \multido{\i=2+1}{3}{% + \backlayer{% + \pnode(!\oeBeamCenter{\i}){Det\i} + \nodexn{(Det\i)-(!\oeBeamVecMedian{\i})}{Det\i'}} + \optdetector[detsize=0.6 0.5](Det\i')(Det\i)} +\end{optexp} +\pscircle[style=Glass]([offset=-0.5]\oenodeIfc{2}{P}){0.5} +\rput[l]([offset=-0.5,Xnodesep=0.7]\oenodeIfc{2}{P}){WGM} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[caption={caption}] +\begin{pspicture}(2.2,2.2) +\definecolor[ps]{bl}{rgb}{tx@addDict begin Red Green Blue end}% +\pnode(0,0.5){In}\pnode(2,0.5){G1} +\pnode([Xnodesep=-1.5, offset=1.3]G1){G2}\pnode(G1|G2){MG} +\begin{optexp} + \optgrating[angle=40, gratingalign=c](In)(G1)(G2) + \optgrating[reverse, angle=40, gratingalign=c](G1)(G2)(MG) + \mirror[mirrorwidth=1, mirrortype=extended](G2)(MG)(G2) + \drawbeam[linecolor=red](In){1} + \multido{\i=0+1}{40}{% + \pstVerb{\i\space 650 400 sub 39 div mul 400 add + tx@addDict begin wavelengthToRGB end }% + \drawbeam[linecolor=bl, beamangle=\i\space 16 sub 0.2 mul]{1-2}% + \drawbeam[linecolor=bl, loadbeampoints]{2-3} + }% +\end{optexp} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(5.6,3) +\pnodes(0,0.5){S1}(2,2.5){S2}(3,1.5){S3}(4,0.5){S4}(4.5,1){S5} +\psset{prismangle=30, mirrortype=extended} +\definecolor[ps]{bl}{rgb}{tx@addDict begin Red Green Blue end}% +\begin{optexp} + \optprism(S1)(S2)(S3)\optprism(S3)(S4)(S5) + \mirror[compshift=-0.07](\oenodeIn{2})([offset=1,Xnodesep=1]\oenodeIn{2})(\oenodeIn{2}) + \drawbeam[linecolor=orange, ArrowInside=->, ArrowInsidePos=0.2, arrowscale=1.5](S1){1} + \addtopsstyle{Beam}{linecolor=bl, linewidth=0.35\pslinewidth, beampathskip=1} + \multido{\r=0+0.5}{120}{% + \pstVerb{\r\space 620 590 sub 59 div mul 590 add + tx@addDict begin wavelengthToRGB end }% + \drawbeam[n=3.42 -0.002 \r\space mul add, beampos=\r\space 60 sub 0.0002 mul](S1){1-3} + }% +\end{optexp} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}, label=ex:dsotm] +\begin{pspicture}(3,1.7) +\pnodes(-1,0){A}(1,1){B}(3,0){C} +\psframe*(0,0)(3,1.7) +\begin{optexp} + \optplane(0,0.7) + \optprism[prismalign=center, linecolor=white](A)(B)(C) + \optplane(C) + \addtopsstyle{Beam}{linecolor=white} + \drawbeam[ArrowInside=->]{1-2} + \definecolor[ps]{bl}{rgb}{% + tx@addDict begin Red Green Blue end}% + \addtopsstyle{Beam}{linestyle=fade, beaminsidelast, fadeto=black} + \multido{\i=0+1}{60}{% + \drawbeam[n=1.5 \i\space 0.003 mul add, linecolor=white, beampathskip=1, fadefuncname=gauss]{1-2} + \pstVerb{\i\space 650 400 sub 59 div mul 400 add + tx@addDict begin wavelengthToRGB end }% + \drawbeam[n=1.5 \i\space 0.003 mul add, linecolor=bl, beampathskip=2, linewidth=0.3\pslinewidth]{-}% + }% +\end{optexp} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, linerange={1-1}, caption={caption}] + +\psset{unit=1.1, usefiberstyle=false} +\begin{pspicture}(9.3,6.1) + \psset{labeloffset=0.5, optboxsize=1 0.8, arrowscale=1.2, arrowinset=0} + \newpsstyle{Fiber}{linecolor=red!70!black, linewidth=1.5\pslinewidth} + \pnode(1, 3.7){LD}\pnode([Xnodesep=3.2]LD){LoopIn}\pnode([offset=-1.2]LoopIn){LoopInsIn} + \pnode([Xnodesep=2]LoopInsIn){LoopInsOut}\pnode(LoopInsOut|LoopIn){LoopOut} + \optswitch[compname=LSw, label=. 180 b, abspos=2.7, fiber=o](LD)(LoopIn){load switch} + \optcoupler[addtoFiber={ArrowInside=->, ArrowInsidePos=0.7}](LoopIn)(LoopInsIn)(LoopOut)(LoopInsOut){50/50} + \optbox[labelstyle=\footnotesize, position=end, fiber, label=0, optboxsize=1.6 1.2](LoopOut)([Xnodesep=0.1]LoopOut){\parbox{1.4\psxunit}{\centering Linear\\Optical\\Sampling}}% + \pnode([Xnodesep=2.8]LoopInsOut){TR} + \pnode([offset=-2]TR){BR} + \pnode([Xnodesep=-1.5]LoopInsIn){TL} + \pnode(TL|BR){BL} + \psset[optexp]{fiber=none} + \optisolator[isolatorsize=0.5, abspos=0.6](LoopInsOut)(TR){isolator}% 4 + \optbox[label=0, extnode=t, compname=PM, abspos=2](LoopInsOut)(TR){PM} + \drawfiber(LoopInsOut){4}{5} + \optfiber[label=0.2 . t, abspos=4](BL)(BR){fiber} + \drawfiber[fiberstyle=bar, angleA=0, startnode=N, linearc=0.5, armA=0.6]{5}{6} + \optamp[labelalign=b, abspos=3.8](BR)(BL){EDFA} + \optfilter[label=. 180 b, usefiberstyle, abspos=1](BL)(BR){OBPF} + \drawfiber{6-8} + \optswitch[labelalign=t, abspos=1, fiber=o](TL)(LoopInsIn){unload switch} + \drawfiber[angleA=180, linearc=0.5, armA=1, startnode=1, fiberstyle=bar]{8}{9} + \optbox[extnode=t, compname=Mod, innerlabel, abspos=0.7](LD)(LoopIn){MOD} + \optbox[position=start, innerlabel](LD)(LoopIn){LD} + \drawfiber{}{Mod} + \drawfiber[arrows=->]{Mod}{LSw} + \pnode([offset=1.2, Xnodesep=-0.7]\oenodeExt{Mod}){Osci}\pnode(\oenodeExt{PM}|Osci){Tmp} + \psset{wire=none, fiber=none, label=0.5 180 b} + \elecsynthesizer(Osci)(Tmp){SYN} + \elecsynthesizer[synthshape=rectangle, synthtype=pulse, abspos=0.7, compname=Pg, extnode=b](Osci)(Tmp){PG} + \optfilter[abspos=2](Osci)(Tmp){BPF} +\rput[r]([offset=0.4, Xnodesep=0.2]\oenodeOut{}){\psplot[plotpoints=200]{0}{1}{360 3.14159 div x 6 mul mul sin 2 exp 0.3 mul 0.15 sub}} + \drawwire[arm=0]{12-14}\drawwire[wireangleB=-90, arrows=->]{14}(\oenodeExt{PM}) + \psline[style=Wire, arrows=->](\oenodeExt{Pg})(\oenodeExt{Mod}) + \rput([Xnodesep=0.1, offset=0.2]\oenodeOut{Mod}){% + \psplot[plotpoints=200, unit=0.7]{0}{1}{2.7182818 x 0.5 sub 0.08 div 2 exp neg exp 0.5 mul}% + }% +\end{pspicture} +\end{LTXexample} + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, linerange={1-1}, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\doiurl{10.1364/OL.37.000797}}, label={ex:ratchet}] + +\begin{pspicture}(12.3,8.8) +\newpsobject{laser}{optbox}{position=start, innerlabel} +\psset[optexp]{lens=2, phwidth=0.07, outerheight=0.6} +\pnode(1,7){L}\pnode([offset=-6]L){PSLM} +\pnode([Xnodesep=2,offset=1]L){ASLM}\pnode([offset=-0.5,Xnodesep=9]L){MRef} +\pnode([offset=-7]ASLM){ML}\pnode([Xnodesep=8.5]ML){Cam} +\begin{optexp} + \laser[optboxsize=1.6 0.6](L)(PSLM){Nd:YAG} + \beamsplitter[bssize=0.4, labelangle=-90](L)(L|MRef)(MRef){BS} + \lens[abspos=1.2, lens=0.5 0.5 0.4, n=2.5, labelangle=-10](L)(PSLM){MO} + \pinhole[abspos=1.4, labelangle=10](L)(PSLM){PH} + \lens[abspos=2.3](L)(PSLM){L} + \opttripole[label=0.5](L)(PSLM)(ASLM){\psframe[dimen=outer](-0.5,0)(0.5,0.1)}{PSLM} + \lens[label=0.6 -40](PSLM)(ASLM){L} + \opttripole[label=0.5](PSLM)(ASLM)(ML){\psframe[dimen=outer](-0.5,0)(0.5,0.1)}{ASLM} + \lens[position=0.45, labelangle=180](ASLM)(ML){L} + \optretplate[labelangle=180, position=0.55](ASLM)(ML){$\lambda/2$} + \optplate[labelangle=180, position=0.62](ASLM)(ML){P} + \mirror[labeloffset=0.4](ASLM)(ML)(Cam){M} + \newpsstyle{Beam}{fillcolor=green!80!black, opacity=0.5, fillstyle=solid, linestyle=none, beaminside=false} + \drawwidebeam[beamwidth=0.1, stopinside]{1-5} + \psset{loadbeampoints} + \drawwidebeam[stopinside, savebeampoints=2]{5-7} + \drawwidebeam[loadbeampoints=2, beamdiv=-8.5]{7-8} + \drawwidebeam[loadbeampoints=2, beamdiv=-8.5, beamangle=-4]{7-8} + \drawwidebeam[beamdiv=-8.5, beamangle=-4.5]{8-9} + \drawwidebeam[loadbeampoints=2, beamdiv=-8.5, beamangle=4]{7-8} + \drawwidebeam[beamdiv=-8.5, beamangle=4.5]{8-9} + \lens[abspos=2](ML)(Cam){L} + \lens[abspos=4](ML)(Cam){L} + \crystal[abspos=6, voltage, crystalsize=1 0.6, fillcolor=yellow!90!black, fillstyle=solid](ML)(Cam){SBN} + \beamsplitter[bssize=0.6](MRef)(MRef|Cam)(Cam){BS} + \lens[n=2.4](MRef|Cam)(Cam){L} + \optbox[optboxsize=0.8 0.6, position=end](ML)(Cam){Cam} + \drawwidebeam[savebeampoints=2, stopinside]{9-13} + \drawwidebeam[loadbeampoints=2, beamdiv=-16, beamangle=5, stopinside]{13-14} + \drawwidebeam[beamangle=-5]{14-18} + \drawwidebeam[loadbeampoints=2, beamdiv=-16, beamangle=-5, stopinside]{13-14} + \drawwidebeam[beamangle=5]{14-18} + \lens[lens=0.5 0.5 0.4, n=2](L|MRef)(MRef){MO} + \pinhole[position=0.53, labelangle=180](L|MRef)(MRef){PH} + \lens[position=0.65](L|MRef)(MRef){L} + \optplate[position=0.7](L|MRef)(MRef){S} + \mirror[labeloffset=0.4](L|MRef)(MRef)(MRef|Cam){M} + \addtopsstyle{Beam}{fillcolor=red!70} + \drawwidebeam[loadbeampoints=false, beamwidth=0.1, savebeampoints]{2}{19-21} + \drawwidebeam{21-23}{16-18} +\end{optexp} +\end{pspicture} +\end{LTXexample} +\endgroup + +\begingroup +\captionsetup[lstlisting]{format=poecaption} +\begin{LTXexample}[pos=t, linerange={1-1}, caption={\ifGERMAN Angepasst von \fi\ifENGLISH Adapted from \fi\doiurl{10.1364/AOP.1.000308}, \ifGERMAN Abb. \fi\ifENGLISH Fig. \fi 37}] + +\begin{pspicture}(-2,-0.2)(8.3,5.9) + \scriptsize + \definecolor[ps]{bl}{rgb}{tx@addDict begin Red Green Blue end}% + \addtopsstyle{SemitransMirror}{linestyle=solid, linewidth=0.7\pslinewidth} + \newpsstyle{ExtendedMirror}{style=SemitransMirror} + \psset[optexp]{mirrortype=extended, mirrorwidth=0.7, n=1, gratingalign=c} + \newpsstyle{Beam}{linecolor=red!80!black, linewidth=1.5\pslinewidth, beaminside=false} + \pnode(-2,0.5){In}\pnode(8,0.5){G1}\pnode([Xnodesep=-1.5, offset=1.3]G1){G2}\pnode(G1|G2){MG} + \pnode([Xnodesep=1,offset=1]In){M1} + \pnode([Xnodesep=5]In){M} + \begin{optexp} + \mirror[mirrortype=semitrans, mirrorlinewidth=0.7\pslinewidth, label=0.6 -90, compname=Et](In)([Xnodesep=-3]G1)(M1){Etalon} + \optgrating[angle=40](In)(G1)(G2) + \optgrating[reverse, angle=40](G1)(G2)(MG) + \mirror[mirrorwidth=1, label=1 135](G2)(MG)(G2){Stretcher} + \multido{\i=0+1}{40}{% + \pstVerb{% + \i\space 650 400 sub 39 div mul 400 add + tx@addDict begin wavelengthToRGB end }% + \drawbeam[linecolor=bl, beamangle=\i\space 16 sub 0.2 mul]{2-3}% + \drawbeam[linecolor=bl, loadbeampoints]{3-4} + }% + \newpsstyle{Beam}{fillstyle=solid, fillcolor=red!90!black, beamwidth=0.1, linestyle=none} + \drawwidebeam(In){1-2} + \pnode([offset=4]M1){M2}\pnode([Xnodesep=3]M2){M3} + \pnode([offset=0.2,Xnodesep=0.2]M|M1){M4} + \pnode([Xnodesep=4, offset=4]M){CM} + \pnode([Xnodesep=-1,offset=-2]M3){SM} + \pnode([offset=0.5]SM){S} + \mirror[compname=M1](\oenodeIn{Et})(M1)(M2) + \mirror(M1)(M2)(M3) + \mirror(M2)(M3)(M4) + \mirror[compname=M4, angle=1.5](M3)(M4)(CM) + \mirror[mirrorradius=3.5 0, angle=2, compname=CM](M4)(CM)(SM) + \mirror(G1)(M)(CM) + \optretplate[plateheight=0.5, abspos=1.5, label=0.6](M)(CM){$\lambda/2$} + \optbox[optboxsize=0.3 0.5, position=0.25, fillstyle=solid, fillcolor=yellow!90!black](CM)(SM){\begin{tabular}{@{}c@{}}nonlinear\\crystal\end{tabular}} + \pinhole[phwidth=0.1, position=0.35](CM)(SM) + \lens[lens=0.7 0.7 0.7, position=0.5, n=1.25](CM)(SM) + \lens[lens=0.7 0.7 0.7, position=0.9, n=1.31](CM)(SM) + \mirror[compname=SM](CM)(SM)(S) + \optbox[position=end, optboxsize=0.8 1.9, compshift=0.6, label=0](SM)(S){Spectrometer} + \drawwidebeam{Et}{5-8}\backlayer{\pnode(\oenodeBeamLow{}){BeamA}} + \drawwidebeam[loadbeam]{8-9}\backlayer{\pnode(\oenodeBeamUp{}){BeamB}} + \drawwidebeam[loadbeam]{9}{12-13} + \drawwidebeam[beamangle=-1.9, beaminsidelast]{10-11}\backlayer{\pnode(\oenodeBeamLow{}){BeamC}} + \drawwidebeam[loadbeam]{11}{9}\backlayer{\pnode(\oenodeBeamLow{}){BeamD}} + \drawwidebeam[loadbeam]{9}{12-13} + \addtopsstyle{Beam}{fillcolor=blue!40} + \drawwidebeam[beamwidth=0, beamdiv=8, stopinside]{12-14}\backlayer{\pnode(\oenodeBeamUp{}){BeamE}} + \drawwidebeam[loadbeam]{14-15}\backlayer{\pnode(\oenodeBeamUp{}){BeamF}} + \drawwidebeam[loadbeam, startinside]{15-17} + \end{optexp} + % now put the pulses + \def\mypulse{\psplot[style=Pulse]{-0.3}{0.3}{2.7182818 x 0.1 div 2 exp neg exp 0.8 mul}}% + \newpsstyle{Pulse}{linecolor=red!90!black, linewidth=1.5\pslinewidth, plotpoints=200} + \newpsstyle{Arrow}{arrowinset=0, arrowscale=1.2, linewidth=2\pslinewidth, linecolor=red!90!black} + \rput([Xnodesep=0.3,offset=0.1]In){% + \mypulse\psline[arrows=->, style=Arrow](0.3,0.2)(1,0.2)}% + \rput([Xnodesep=1.5,offset=-0.3]\oenodeCenter{Et}){\psline[arrows=<->, style=Arrow](-0.7,0)(0.7,0)} + \nlput[nrot=:U](\oenodeIn{M1})(\oenodeIn{Et}){2}{% + \psline[arrows=->, style=Arrow](-0.3,0.25)(-1,0.25)% + \rput(0,0.1){\psset{unit=0.7}\mypulse\rput(0.8,0){\mypulse}}}% + \nlput[nrot=:U](BeamA)(BeamB){1}{% + \psline[arrows=->, style=Arrow](1,0.25)(1.7,0.25)% + \rput(0,0.05){\psset{unit=0.7}\mypulse\rput(0.8,0){\mypulse}}}% + \nlput[nrot=:U](BeamD)(BeamC){2}{% + \psline[arrows=->, style=Arrow](-1,0.25)(-1.7,0.25)% + \psplot[style=Pulse]{-1}{1}{2.7182818 x 1 div 2 exp neg exp 0.5 mul 0.1 sub}}% + \nlput[nrot=:U](BeamF)(BeamE){1.9}{% + \rput(0,0.05){\addtopsstyle{Pulse}{linecolor=blue!50!red!50}\mypulse + \rput(-0.7,0){\addtopsstyle{Pulse}{linecolor=blue!50}\mypulse}}}% +\end{pspicture} +\end{LTXexample} +\endgroup + +\begin{LTXexample}[pos=t, linerange={1-1}, caption={caption}] + +\begin{pspicture}(-0.5,-0.4)(13,11) +\psset{% + optboxsize=0.8 0.6, + arrowcompsize=0.8 0.5, + optmzmsize=0.8 0.6, + isolatorsize=0.8 0.5, + filtersize=0.6, + detsize=0.5 0.6, + fiber=none, wire=none, + usefiberstyle=false, + labeloffset=0.5, labelstyle=\footnotesize +} +\footnotesize +\newpsobject{elecfilter}{optfilter}{usewirestyle} +\addtopsstyle{Wire}{arrowscale=1.2, arrows=->, linewidth=1.5\pslinewidth} +\newpsstyle{FiberComp}{linecolor=red!80!black} +\newpsstyle{Fiber}{style=FiberComp, arrows=->, linewidth=1.5\pslinewidth} + \pnode(1,10){Syn}\pnode([Xnodesep=8]Syn){Pm} + \elecsynthesizer[compname=Syn, labelalign=t](Syn)(Pm){10\,GHz} + \fiberdelayline[compname=Voa1, abspos=2.5, label= 0.6 . t](Syn)(Pm){VOA} + \optbox[compname=Am, abspos=4, innerlabel, extnode=b](Syn)(Pm){AM} + \fiberdelayline[compname=DelayPm, abspos=5.5, label=0.6 . t](Syn)(Pm){DLY} + \optbox[fiber, addtoFiber={arrows=->}, style=FiberComp, label=0, compname=Pm, extnode=t, optboxheight=0.7]([offset=-1]Pm)([offset=1]Pm){PM} + \elecsynthesizer[synthtype=rectangle, synthrectwidth=0.3, wire, addtoWire={arrows=->}, label=. -45 l]([offset=-0.5]\oenodeExt{Am})(\oenodeExt{Am}){AWG} + \pnode([offset=-0.5, Xnodesep=-1]\oenodeIn{Voa1}){A} + \pnode([offset=-1.5]A){B} + \eleccoupler[eleccouplertype=directional, eleccouplerinput=right, compname=Cpl](B)(A) + \pnode([Xnodesep=-1.2]\oenodeIn{}){EamIn} + \pnode([Xnodesep=0.5,offset=-0.3]\oenodeIfc{2}{}){N1} + \pnode([offset=-1.3]N1){N2} + \optisolator[label=0.4 . r, compname=Iso1](N1)(N2){Isolator} + \optarrowcomp[compname=DelayPpg, labelalign=l]([offset=-1.4]N2)(N2){DLY} + \fiberbox[position=start, + label=0, + fiberboxsize=0.7 1, + fiberboxcount=2x1, + fiberboxsepin=0.2, + compname=Ppg]([offset=-0.4]\oenodeIn{DelayPpg})(\oenodeIn{DelayPpg}){PPG} + \pnode([offset=-0.5,Xnodesep=-0.5]\oenodeIn{Ppg}){MzmAmp1} + \pnode([offset=-0.5,Xnodesep=0.5]\oenodeIfc{2}{Ppg}){MzmAmp2} + \pnode([offset=-1.5,Xnodesep=-0.9]MzmAmp1){MzmIn} + \pnode([offset=-1.5,Xnodesep=0.9]MzmAmp2){MzmOut} + \optamp[abspos=0.5, compname=MzmAmp1](MzmAmp1)(MzmAmp1|MzmIn) + \optamp[abspos=0.5, compname=MzmAmp2](MzmAmp2)(MzmAmp2|MzmIn) + \optmzm[abspos=0.9, usefiberstyle, style=FiberComp, compname=Mzm1, extnode=t, labelalign=t](MzmIn)(MzmOut){MZM} + \optmzm[abspos=2.3, usefiberstyle, style=FiberComp, compname=Mzm2, extnode=t, labelalign=t](MzmIn)(MzmOut){MZM} + \rput(\oenodeCenter{Ppg}|[offset=-0.2]\oenodeCenter{MzmAmp1}){AMP} + \pnode([Xnodesep=-1]\oenodeIn{Mzm1}){Eam} + \optbox[style=FiberComp, + label=0, + optboxsize=1 0.6, + compname=Eam, + extnode=t]([Xnodesep=-1]Eam)([Xnodesep=0.8]Eam){EAM} + \drawfiber[style=FiberComp, arrows=->]([Xnodesep=-1.2]Eam){Eam}{Mzm1}{Mzm2}(MzmOut) + \pnode([Xnodesep=8]N2){N3} + \optfilter[abspos=2, label=. 180 b, compname=Bpf1](N2)(N3){\parbox{\widthof{10\,GHz}}{\centering BPF\\[-1pt] 10\,GHz}} + \makeatletter\edef\mystart{\the\POE@cnt}\makeatother + \optbox[label=0, + abspos=3.2, + optboxsize=0.6 0.6](N2)(N3){$\div 8$} + \makeatletter\edef\mystartb{\the\POE@cnt}\makeatother + \optamp[abspos=4.7, label=. 180 b](N2)(N3){AMP} + \optbox[label=0, + abspos=6, + optboxsize=0.6 0.6, + compname=Div5](N2)(N3){$\div 5$} + \optfilter[abspos=7.3, label=. 180 b](N2)(N3){\parbox{\widthof{250\,MHz}}{\centering BPF\\[-1pt] 250\,MHz}} + \pnode([offset=-1]N3){N4} + \pnode([offset=-2.4]N4){Mixer} + \optamp[abspos=0.4, label=. 0 l global](N4)(Mixer){AMP} + \optfilter[innercompalign=abs, + filtertype=lowpass, + abspos=1.4, + compname=Bpf, + extnode=t, + label=. 0 l global](N4)(Mixer){% + \parbox{\widthof{300\,MHz}}{LPF\\[-1pt]300\,MHz}% + } + \pnode([Xnodesep=-4]Mixer){MixerI} + \pnode([offset=-2.5]Mixer){MixerR} + \elecmixer[compname=Mixer, elecmixersize=0.7, labelalign=l](Mixer)(MixerR)(MixerI){Mixer} + \pnode([Xnodesep=-9.8]MixerR){Menlo} + \optbox[position=start, + compname=Lo, + innerlabel, + style=FiberComp](Menlo)(MixerR){LO} + \optdetector[extnode=r, + labelalign=t, + compname=Pd](Menlo)([Xnodesep=0.5]Menlo){\parbox{\widthof{2\,GHz}}{\centering PD\\[-1pt]2\,GHz}} + \optfilter[abspos=1.5, labelalign=t, + compname=LoBpf](\oenodeExt{Pd})(MixerR){\parbox{\widthof{250\,MHz}}{\centering BPF\\[-1pt]250\,MHz}} + \optamp[abspos=3, labelalign=t, + compname=LoAmp](\oenodeExt{Pd})(MixerR){AMP} + \drawfiber[arrows=->]{Lo}{Pd} + \drawwire(\oenodeExt{Pd}){LoBpf}{LoAmp} + \drawwire[stopnode=N]{LoAmp}{Mixer} + \optfilter[filtertype=lowpass, + abspos=1, + label=1.1 180 t, + compname=LpfP2](MixerI)(\oenodeIfc{2}{Mixer}){% + \parbox{\widthof{500\,kHz}}{\centering LPF\\[-1pt]500\,kHz}% + } + \optfilter[filtertype=lowpass, + abspos=2.7, + label=1.1 180 t, + compname=LpfP1](MixerI)(\oenodeIfc{2}{Mixer}){% + \parbox{\widthof{10.7\,MHz}}{\centering LPF\\[-1pt]10.7\,MHz}% + } + \optbox[compname=T0, + extnode=b, + position=start, + optboxsize=2.2 0.8, + innerlabel](MixerI)(\oenodeIfc{2}{Mixer}){$T_0$-Messung} + \drawwire[wirealign=center]{Mixer}{LpfP1}{LpfP2}{} + \psline[style=Wire](\oenodeExt{T0}|Menlo)(\oenodeExt{T0}) + \uput{0.4}[-60](\oenodeExt{T0}){\rput[l](0,0){Takt}} + \drawwire[arrows=<-](\oenodeExt{Eam}){Cpl} + \drawwire{Syn}{Voa1}{Am}{DelayPm}(\oenodeExt{Pm}) + \drawwire{Syn}{Cpl}{Iso1}{DelayPpg}{Ppg}{MzmAmp1}(\oenodeExt{Mzm1}) + \drawwire{Ppg}{MzmAmp2}(\oenodeExt{Mzm2}) + \drawwire{Iso1}{Bpf1} + \multido{\i=\mystart+1,\ii=\mystartb+1}{7}{% + \drawwire{\i}{\ii}} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[pos=t, caption={caption}] +\begin{pspicture}(10,3) +\makeatletter +\newOptexpTripole{roughsurface} +\def\roughsurface@nodes{% + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{A}}{% + \code{0 srand} + \moveto(!-3 Rand 0.5 sub 0.1 mul) + \multido{\r=-2.7+0.3}{20}{% + \lineto(!\r\space Rand 0.5 sub 0.1 mul)}% + }% + \newOptexpComp{% + {0 0} tx@IntersectDict /\PIT@name{\oenode@Path{A}} get 0 0 refl {PathIfc} + 1 }% +}% +\def\roughsurface@comp{% + \pstracecurve{\oenode@Path{A}} +}% +\makeatother +\optplane[angle=90](1,3) +\roughsurface(0,3)(5,0)(10,3) +\addtopsstyle{Beam}{beamalign=abs, beamangle=-45, arrows=->, arrowscale=2} +\multido{\r=0+0.3}{6}{% +\drawbeam[beampos=\r]{1}{2}{1}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifGERMAN\chapter{Zusatzinformationen}\fi +% \ifENGLISH\chapter{Additional information}\fi +% +% \ifENGLISH\section{Internal component structure}\fi +% \ifGERMAN\section{Interne Struktur der Komponenten}\fi +% +% \begin{optionlist} +% \boolitem[false]{showifcnodes} +% \styleitem[dotstyle=x, dotscale=1.5, linecolor=blue]{IfcNodeStyle} +% \end{optionlist} +% +% \ifENGLISH +% Every component consists internally of interfaces which are defined by a node +% on the optical axis, a plane vector or a curvature radius, and by its optical +% characteristics (reflective or transmittive, or both e.g. for +% \Lcomp{beamsplitter}). The interface nodes can be visualized for each component +% with the \Lkeyword{showifcnodes} parameter. +% \fi +% \ifGERMAN +% Jede Komponente besteht aus Grenzflächen, die über einen Knoten auf der +% optischen Achse, einen Ebenevektor bzw. einen Krümmungsradius, und ihre +% optische Eigenschaft (reflektiv oder transmittiv, oder beides für +% z.B. \Lcomp{beamsplitter}) definiert ist. Die Grenzflächenknoten können mit +% \Lkeyword{showifcnodes} angezeigt werden. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(4,3) + \psset{showifcnodes} + \optbox(0,2.5)(4,2.5) + \doveprism(0,1.5)(4,1.5) + \lens(0,0.5)(4,0.5) + \mirror(0,0.5)(3.5,0.5)(3.5,3) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \medskip +% +% \ifENGLISH +% \nxLcs{draw*beam}\xLcs{drawbeam}\xLcs{drawwidebeam} calculates the distance +% between the interface nodes of two components and connects the two nearest +% to each other. +% \fi +% \ifGERMAN +% \nxLcs{draw*beam}\xLcs{drawbeam}\xLcs{drawwidebeam} berechnet den Abstand +% zwischen den Grenzflächenknoten zweier Komponenten und verbindet die beiden +% nächstgelegenen. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(-3,-3)(3,3) + \psset{optboxsize=0.6 0.5, labeloffset=0} + \multido{\i=0+60,\ii=1+1}{6}{% + \pnode(2.5;\i){A} + \optbox([Xnodesep=-1]A)([Xnodesep=1]A){\ii} + } + \optbox[compname=ref](-1,0)(1,0){ref} + \addtopsstyle{Beam}{arrows=->} + \multido{\i=1+1}{6}{\drawbeam{ref}{\i}} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \begin{optionlist} +% \boolitem[false]{showinterfaces} +% \ifGERMAN Zeigt alle Grenzflächen einer Komponente an.\fi +% \ifENGLISH Visualizes all interfaces of a component.\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \psset[optexp]{showinterfaces, aomgratingcount=6} + \addtopsstyle{IfcStyle}{linewidth=2\pslinewidth} + \pnodes(0,1.5){A}(3,0.5){B}(3,1.5){C} + \optaom[aomalign=symmetric](A)(B)(C){symmetric} + \addtopsstyle{Beam}{arrows=->, linewidth=4\pslinewidth} + \drawbeam[linecolor=red!50](A){}(C) + \drawbeam[linecolor=red](A){}(B) +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample} +\begin{pspicture}(3,1.5) + \psset[optexp]{showinterfaces, aomgratingcount=6} + \addtopsstyle{IfcStyle}{linewidth=2\pslinewidth} + \pnodes(0,1){A}(3,1){B}(3,1.5){C} + \optaom[aomalign=straight](A)(B)(C){straight} + \addtopsstyle{Beam}{arrows=->, linewidth=4\pslinewidth} + \drawbeam[linecolor=red!50](A){}(C) + \drawbeam[linecolor=red](A){}(B) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \styleitem[linestyle=dashed, dash=1pt 1pt, linecolor=red!70!black]{IfcStyle} +% \ifGERMAN +% Bestimmt das Aussehen der mit \Lkeyword{showinterfaces} angezeigten +% Grenzflächen. +% \fi +% \ifENGLISH +% Determines the appearance of the interfaces, which are shown with +% \Lkeyword{showinterfaces}. +% \fi +% \end{optionlist} +% +% \ifENGLISH\section{Overview of special nodes}\fi +% \ifGERMAN\section{Übersicht der Spezialknoten}\fi +% +% \ifENGLISH In this section you find overviews of all special nodes which +% each component provides. The possible positions for external and rotation +% reference nodes, and the interface nodes. +% \fi +% \ifGERMAN +% In diesem Abschnitt finden sie Übersichten für alle Spezialknoten, die von +% allen Komponenten bereitgestellt werden: die möglichen Positionen für externe +% und Rotationsknoten, und die Grenzflächenknoten. +% \fi +% +% \ifENGLISH\subsection{External and rotation reference nodes}\fi +% \ifGERMAN\subsection{Externe und Rotationsreferenzknoten}\fi +% \label{sec:overview-extnode} +% +% \ifENGLISH +% Here, you find all possible external (\prettyref{sec:extnode}) and rotation +% reference nodes (\prettyref{sec:rotrefnode}) for all components. Displayed are +% all possible combinations of \opt{t}, \opt{c}, or \opt{b} with \opt{l}, +% \opt{c}, or \opt{r}. Not all components support all combinations, e.g. a plain +% \Lcomp{mirror} ignores \opt{t} and \opt{b} and an \Lcomp{optplate} ignores \opt{l} +% and \opt{r}. +% +% Instead of these values also fractional parts can be used: \opt{t} +% corresponds to $+1\cdot\Delta y$, \opt{b} corresponds to +% $-1\cdot\Delta y$, \opt{l} corresponds to $-1\cdot\Delta x$, and +% \opt{r} corresponds to $+1\cdot\Delta x$. This can be especially +% useful for round outer shapes, as the following examples shows. +% \fi +% \ifGERMAN +% Hier finden Sie eine Übersicht über alle möglichen externen Knoten +% (\prettyref{sec:extnode}) und Rotationsknoten (\prettyref{sec:rotrefnode}) +% aller Komponenten. Angezeigt werden die Positionen für alle möglichen +% Kombinationen von \opt{t}, \opt{c} oder \opt{b} mit \opt{l}, \opt{c} oder +% \opt{r}. Es sind nicht immer alle Möglichkeiten vorhanden, so können \opt{t} +% und \opt{b} ignoriert werden (z.B. bei \Lcomp{mirror}), oder auch \opt{r} und +% \opt{l} (z.B. bei \Lcomp{optplate}). +% +% Anstelle dieser Werte können auch Bruchteile davon verwendet werden: +% \opt{t} entspricht $+1\cdot\Delta y$, \opt{b} entspricht +% $-1\cdot\Delta y$, \opt{l} entspricht $-1\cdot\Delta x$ und \opt{r} +% entspricht $+1\cdot\Delta x$. Das kann gerade im Fall einer runden +% Außenform sehr hilfreich sein, wie das folgende Beispiel zeigt. +% \fi +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[morekeywords={[21]extnode}] +\begin{pspicture}(2,1) + \elecsynthesizer[extnode={-0.707,0.707}](1,0.5)(2,0.5) + \psdot(\oenodeExt{}) +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \newpsstyle{ExtNodeStyle}{dotstyle=B+, dotangle=45, linewidth=2\pslinewidth, linecolor=DOrange} +% \makeatletter +% \newcommand{\testextnodes}[3][]{% +% \begin{pspicture}(3,2.2) +% \@nameuse{#2}[#1]#3 +% \rput[t](1.5,0.9){\ttfamily\small +% \ifx\\#1\\\relax +% \begin{tabular}{@{}c@{}}\textbackslash #2\end{tabular} +% \else\begin{tabular}{@{}c@{}}\textbackslash #2\\ #1\end{tabular}\fi} +% \POE@extnodes[style=ExtNodeStyle,#1]{#2} +% \end{pspicture} +% }% +% \makeatother +% +% \ifENGLISH\subsubsection*{Free-ray components}\fi +% \ifGERMAN\subsubsection*{Freistrahlkomponenten}\fi +% +% \testextnodes{lens}{(0,1.5)(3,1.5)} +% \testextnodes[lensradius=-1]{lens}{(0,1.5)(3,1.5)} +% \testextnodes{optplate}{(0,1.5)(3,1.5)} +% \testextnodes{optretplate}{(0,1.5)(3,1.5)} +% \testextnodes[phwidth=0.2]{pinhole}{(0,1.5)(3,1.5)} +% \testextnodes{optbox}{(0,1.5)(3,1.5)} +% \testextnodes{crystal}{(0,1.5)(3,1.5)} +% \testextnodes{optdetector}{(0,1.5)(2,1.5)} +% \testextnodes[dettype=diode]{optdetector}{(0,1.5)(2,1.5)} +% \testextnodes{optdiode}{(0,1.5)(3,1.5)} +% \testextnodes{doveprism}{(0,1.5)(3,1.5)} +% \testextnodes[glanthompsongap=0.15]{glanthompson}{(0,1.5)(3,1.5)} +% \bgroup +% \addtopsstyle{PiezoMirror}{unit=1.5} +% \testextnodes[mirrortype=piezo]{mirror}{(0,1.5)(2,1.5)(2,0)} +% \egroup +% \bgroup\psset{mirrordepth=0.25} +% \testextnodes[mirrortype=extended]{mirror}{(0,1.5)(2,1.5)(2,0)} +% \testextnodes{mirror}{(0,1.5)(2,1.5)(2,0)} +% \testextnodes[mirrortype=semitrans]{mirror}{(0,1.5)(2,1.5)(2,0)} +% \egroup +% \testextnodes{optprism}{(0,1.5)(1.5,1.5)(3,1)} +% \testextnodes{optgrating}{(0,1.5)(2,1.5)(2,0)} +% \testextnodes{beamsplitter}{(0,1.5)(2,1.5)(2,0)} +% \testextnodes[bsstyle=plate]{beamsplitter}{(0,1.5)(2,1.5)(2,0)} +% \testextnodes{rightangleprism}{(0,1.5)(2.5,1)(0,0.5)} +% \testextnodes{pentaprism}{(0,1.3)(2,1.3)(2,0)} +% \testextnodes{optarrowcomp}{(0,1.5)(3,1.5)} +% \testextnodes{optbarcomp}{(0,1.5)(3,1.5)} +% \begin{pspicture}(3,2) +% \optdipole[optdipolesize=1](0,1.5)(3,1.5){} +% \rput[t](1.5,0.9){\ttfamily\small +% \begin{tabular}{@{}c@{}}\textbackslash optdipole\end{tabular}} +% \makeatletter +% \POE@extnodes[style=ExtNodeStyle, optdipolesize=1]{optdipole} +% \makeatother +% \end{pspicture} +% \begin{pspicture}(3,2) +% \transmissiongrating(0,1.5)(1.5,1.5)(3,1) +% \rput[t](1.5,0.9){\ttfamily\small +% \begin{tabular}{@{}c@{}}\textbackslash transmissiongrating\end{tabular}} +% \makeatletter +% \POE@extnodes[style=ExtNodeStyle]{transmissiongrating} +% \makeatother +% \end{pspicture} +% +% \ifENGLISH\subsubsection*{Fiber components}\fi +% \ifGERMAN\subsubsection*{Faserkomponenten}\fi +% +% \testextnodes{optfiber}{(0,1)(3,1)} +% \testextnodes{optamp}{(0,1.5)(3,1.5)} +% \testextnodes{optmzm}{(0,1.5)(3,1.5)} +% \testextnodes{optfilter}{(0,1.5)(3,1.5)} +% \testextnodes{polcontrol}{(0,1.5)(3,1.5)} +% \testextnodes{optisolator}{(0,1.5)(3,1.5)} +% \testextnodes{optswitch}{(0,1.5)(3,1.5)} +% \testextnodes{fiberdelayline}{(0,1.5)(3,1.5)} +% \testextnodes{optfiberpolarizer}{(0,1.5)(3,1.5)} +% \testextnodes{fibercollimator}{(0,1.5)(3,1.5)} +% \testextnodes{optcirculator}{(0,1.6)(3,1.6)(1.5,0.9)} +% \testextnodes[couplersize=0.5 0.3]{optcoupler}{(0,2)(0,1)(3,2)(3,1)} +% \testextnodes{fiberbox}{(0,1.75)(0,1.25)(3,1.75)(3,1.25)} +% +% \ifENGLISH\subsubsection*{Electrical components}\fi +% \ifGERMAN\subsubsection*{Elektrische Komponenten}\fi +% +% \testextnodes{eleccoupler}{(0,2)(0,1)(3,2)(3,1)} +% \testextnodes{elecmixer}{(0,1.6)(3,1.6)(1.5,0.9)} +% \testextnodes{elecsynthesizer}{(1,1.5)(3,1.5)} +% +% +% \ifENGLISH\subsection{Interface nodes}\fi +% \ifGERMAN\subsection{Grenzflächenknoten}\fi +% \label{sec:overview-ifcnode} +% +% \ifENGLISH +% Here, all available components and their interface nodes are listed. If +% a node is labeled as «1, N», it means that both nodes are equal. +% \fi +% \ifGERMAN Hier sind alle Komponenten und deren Grenzflächenknoten +% aufgelistet. Ist ein Knoten mit «1, N» beschriftet, dann fallen beide +% Knoten zusammen. +% \fi +% +% \ifENGLISH\subsubsection*{Free-ray components}\fi +% \ifGERMAN\subsubsection*{Freistrahlkomponenten}\fi +% +% \begingroup +% \addtopsstyle{Beam}{arrows=->, arrowinset=0, arrowscale=1.5} +% \newcommand{\showdipoleifc}[1]{% +% \begin{pspicture}(0,-0.5)(3,1) +% \pnode(0,0.5){A}\pnode(3,0.5){B} +% \csname #1\endcsname(A)(B) +% \drawbeam(A){}(B) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash #1} +% \end{pspicture} +% }% +% \newcommand{\showdipoleoneifc}[1]{% +% \begin{pspicture}(0,-0.5)(3,1) +% \pnode(0,0.5){A}\pnode(3,0.5){B} +% \csname #1\endcsname(A)(B) +% \drawbeam(A){}(B) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1, N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash #1} +% \end{pspicture} +% }% +% \showdipoleifc{lens}\hspace{\fill}% +% \showdipoleoneifc{optplate}\hspace{\fill}% +% \showdipoleifc{optretplate}% +% \bigskip +% +% \noindent\showdipoleoneifc{pinhole}\hspace{\fill}% +% \showdipoleifc{optbox}\hspace{\fill}% +% \showdipoleifc{crystal} +% \bigskip +% +% \noindent +% \begin{pspicture}(0, -0.5)(3,1) +% \pnode(0,0.5){A}\pnode(2,0.5){B} +% \optdetector(A)(B) +% \drawbeam(A){} +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash optdetector} +% \end{pspicture}% +% \hspace{\fill}% +% \bgroup +% \addtopsstyle{Beam}{beaminside=false}% +% \showdipoleifc{optdiode}\egroup% +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1) +% \pnode(0,0.5){A}\pnode(3,0.5){B} +% \doveprism(A)(B) +% \drawbeam[raytrace=false](A){}(B) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash doveprism} +% \end{pspicture}% +% +% \begin{pspicture}(3,1.5) +% \pnode(0,1){A}\pnode(2.5,1){B}\pnode(2.5,0){C} +% \mirror(A)(B)(C) +% \drawbeam(A){}(C) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1, N} +% \rput[bl](0,0){\ttfamily\textbackslash mirror} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(3,1.5) +% \pnode(0,1){A}\pnode(1.5,1){B}\pnode(3,0){C} +% \optprism(A)(B)(C) +% \drawbeam[raytrace=false](A){}(C) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,0){\ttfamily\textbackslash optprism} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(3,1.5) +% \pnode(0,1.5){A}\pnode(1.5,1){B}\pnode(3,1.5){C} +% \optprism[prismtype=reflective](A)(B)(C) +% \drawbeam[raytrace=false](A){}(C) +% \psdot(\oenodeIn{})\uput[110](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[70](\oenodeOut{}){N} +% \psdot(\oenodeIfc{2}{})\uput[90](\oenodeIfc{2}{}){2} +% \rput[tl](0,0.42){\ttfamily\begin{tabular}{@{}l@{}}\textbackslash optprism\\prismtype=reflective\end{tabular}} +% \end{pspicture}% +% +% \begin{pspicture}(3,1.5) +% \pnode(0,1){A}\pnode(2.5,1){B}\pnode(2.5,0){C} +% \optgrating(A)(B)(C) +% \drawbeam(A){}(C) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1, N} +% \rput[bl](0,0){\ttfamily\textbackslash optgrating} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.7) +% \pnode(0,0.7){A}\pnode(3,0.7){B} +% \glanthompson[glanthompsonsize=1.8 1, glanthompsongap=0.2](A)(B) +% \drawbeam(A){}(B) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[45](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[30](\oenodeIfc{3}{}){3,C} +% \psdot(\oenodeIfc{4}{})\uput[150](\oenodeIfc{4}{}){4} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash glanthompson} +% \end{pspicture}% +% \hspace{\fill}% +% \showdipoleifc{optarrowcomp}% +% +% \showdipoleifc{optbarcomp}\hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.7) +% \pnode(0,0.7){A}\pnode(3,0.7){B} +% \optdipole[optdipolesize=1](A)(B){} +% \drawbeam(A){}(B) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash optdipole} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.7) +% \pnode(0,0.7){A}\pnode(1.5,0.7){B}\pnode(3,0.4){C} +% \transmissiongrating(A)(B)(C) +% \drawbeam(A){}(C) +% \psdot(\oenodeIn{})\uput[45](\oenodeIn{}){1, N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash transmissiongrating} +% \end{pspicture}% +% +% \noindent\begin{pspicture}(3,2.5) +% \pnode(0,1.5){A}\pnode(2.5,1.5){B}\pnode(2.5,0.4){C} +% \beamsplitter[bssize=1.2](A)(B)(C) +% \drawbeam(A){}(C) +% \psdot(\oenodeIfc{1}{})\uput[135](\oenodeIfc{1}{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-45](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[60](\oenodeIfc{3}{}){3,C} +% \psdot(\oenodeIfc{4}{})\uput[0](\oenodeIfc{4}{}){4} +% \psdot(\oenodeIfc{N}{})\uput[90](\oenodeIfc{N}{}){N} +% \rput[bl](0,0){\ttfamily\textbackslash beamsplitter} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(3,2.5) +% \pnode(0,2){A}\pnode(2.5,1.5){B}\pnode(0,1){C} +% \rightangleprism[raprismsize=2](A)(B)(C) +% \drawbeam[arrows=->, arrowinset=0, arrowscale=1.5](A){}(C) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[45](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[-45](\oenodeIfc{3}{}){3} +% \psdot(\oenodeOut{})\uput[-135](\oenodeOut{}){N} +% \rput[bl](0,0){\ttfamily\textbackslash rightangleprism} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(3,2.5) +% \pnode(0,1.5){A}\pnode(2.1,1.5){B}\pnode(2.1,0.4){C} +% \pentaprism[pentaprismsize=1](A)(B)(C) +% \drawbeam[arrows=->, arrowinset=0, arrowscale=1.5](A){}(C) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[0](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[90](\oenodeIfc{3}{}){3} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,0){\ttfamily\textbackslash pentaprism} +% \end{pspicture}% +% \endgroup +% +% \ifENGLISH\subsubsection*{Fiber components}\fi +% \ifGERMAN\subsubsection*{Faserkomponenten}\fi +% +% \newcommand{\showfdipoleifc}[1]{% +% \begin{pspicture}(0,-0.5)(3,1) +% \pnode(0,0.5){A}\pnode(3,0.5){B} +% \csname #1\endcsname(A)(B) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash #1} +% \end{pspicture}% +% }% +% \begingroup +% \addtopsstyle{Fiber}{ArrowInside=->, ArrowInsidePos=0.6, arrowscale=1.5, arrowinset=0} +% \vspace*{5mm}% +% \showfdipoleifc{optfiber}\hspace{\fill}% +% \showfdipoleifc{optamp}\hspace{\fill}% +% \showfdipoleifc{optmzm}% +% \bigskip +% +% \noindent\showfdipoleifc{optfilter}\hspace{\fill}% +% \showfdipoleifc{polcontrol}\hspace{\fill}% +% \showfdipoleifc{optisolator}% +% \bigskip +% +% \noindent\showfdipoleifc{optswitch}\hspace{\fill}% +% \showfdipoleifc{fiberdelayline}\hspace{\fill}% +% \showfdipoleifc{optfiberpolarizer}% +% \bigskip +% +% \bgroup\psset{beam} +% \noindent\showfdipoleifc{fibercollimator}\egroup +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.5) +% \pnode(0,1){A}\pnode(3,1){B}\pnode(1.2,-0.1){C} +% \optcirculator(A)(B)(C) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-45](\oenodeIfc{2}{}){2} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash optcirculator} +% \end{pspicture}\hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.5) +% \fiberbox[fiberboxcount=2x3](0,0.95)(0,0.45)(3,1.2)(3,0.2) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-135](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[45](\oenodeIfc{3}{}){3} +% \psdot(\oenodeIfc{4}{})\uput[0](\oenodeIfc{4}{}){4} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash fiberbox} +% \end{pspicture} +% \bigskip +% +% \noindent +% \begin{pspicture}(0,-0.5)(3,1.5) +% \pnode(0,0.75){A}\pnode(3,1.5){B}\pnode(3,0){C} +% \wdmsplitter[couplersize=0.5, couplersep=0.2](A)(B)(C) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeOut{})\uput[-90](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash wdmsplitter} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.5) +% \pnode(0,1.5){A}\pnode(0,0){B}\pnode(3,0.75){C} +% \wdmcoupler[couplersize=0.5, couplersep=0.2](A)(B)(C) +% \psdot(\oenodeIn{})\uput[90](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash wdmcoupler} +% \end{pspicture}% +% \hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.5) +% \pnode(0,1.5){A}\pnode(0,0){B}\pnode(3,1.5){C}\pnode(3,0){D} +% \optcoupler[couplersize=0.5, couplersep=0.2](A)(B)(C)(D) +% \psdot(\oenodeIn{})\uput[90](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-90](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[90](\oenodeIfc{3}{}){3} +% \psdot(\oenodeOut{})\uput[-90](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash optcoupler} +% \end{pspicture}% +% \endgroup +% +% +% \ifENGLISH\subsubsection*{Electrical components}\fi +% \ifGERMAN\subsubsection*{Elektrische Komponenten}\fi +% \begingroup +% \addtopsstyle{Wire}{arrows=->, arrowscale=1.5, arrowinset=0, arm=0.6} +% \noindent\begin{pspicture}(0, -0.5)(3,1.7) +% \pnode(2,1.2){A}\pnode(3,1.2){B} +% \elecsynthesizer(A)(B) +% \psdot(\oenodeIn{})\uput[135](\oenodeIn{}){1} +% \psdot(\oenodeOut{})\uput[45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash elecsynthesizer} +% \end{pspicture}\hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.7) +% \pnode(0,1.2){A}\pnode(3,1.2){B}\pnode(1.2,0.1){C} +% \elecmixer(A)(B)(C) +% \psdot(\oenodeIn{})\uput[-135](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-45](\oenodeIfc{2}{}){2} +% \psdot(\oenodeOut{})\uput[-45](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash elecmixer} +% \end{pspicture}\hspace{\fill}% +% \begin{pspicture}(0,-0.5)(3,1.7) +% \pnode(0,1.7){A}\pnode(0,0.2){B}\pnode(3,1.7){C}\pnode(3,0.2){D} +% \eleccoupler(A)(B)(C)(D) +% \psdot(\oenodeIn{})\uput[120](\oenodeIn{}){1} +% \psdot(\oenodeIfc{2}{})\uput[-120](\oenodeIfc{2}{}){2} +% \psdot(\oenodeIfc{3}{})\uput[60](\oenodeIfc{3}{}){3} +% \psdot(\oenodeOut{})\uput[-60](\oenodeOut{}){N} +% \rput[bl](0,-0.4){\ttfamily\textbackslash eleccoupler} +% \end{pspicture}% +% \endgroup +% +% \ifGERMAN +% \section{Abwärtskompatibilität} +% \fi +% \ifENGLISH +% \section{Backward compatibility} +% \fi\label{sec:bwd-comp} +% +% \ifENGLISH In this section you find a comprehensive listing of the behaviour +% which changed in a version compared to the previous one and which is not +% backward compatible. Here you find also information on what you must note when +% upgrading and how you must change old documents to work correctly with the +% newer version. +% \fi +% \ifGERMAN +% In diesem Abschnitt finden Sie eine umfangreiche Auflistung aller Änderungen +% in einer Version bezüglich der Vorgängerversion, die nicht abwärts kompatibel +% sind. Sie finden ebenfalls Informationen was Sie bei einem Wechsel zur neuen +% Version beachten müssen, und was sie bei älteren Dokumenten gegebenenfalls +% ändern müssen um mit der neuen Version korrekt zu funktionieren. \fi +% +% +% \subsection{Version 4.3a}\label{sec:bwd-comp-4.3a} +% +% \begin{optionlist} +% \poeitem{prismtype} +% \ifGERMAN Die Option \Lkeyword{prismtype} war immer noch +% «zusammengeschustert» und die automatische Positionierung war recht +% willkürlich. Dies sollte nun endlich korrigiert sein, unter +% Option \Lkeyword{prismalign} ist ein entsprechendes Beispiel zu sehen. +% \fi +% \ifENGLISH The option \Lkeyword{prismtype} was still not correctly +% implemented, die automatic alignment was somewhat arbitrary. This +% should be finally fixed, an example is shown for option +% \Lkeyword{prismalign}. +% \fi +% +% \poeitem{\cs{optprism}} +% \ifGERMAN Die Positionierung der Beschriftung war nicht konsistent mit +% anderen Komponenten, der Bezugspunkt war nicht der Mittelpunkt und +% auch nicht fest. Das ist jetzt behoben, könnte aber leichte +% Korrekturen an bestehenden Skizzen erfordern. +% \fi +% \ifENGLISH The positioning of the label was not consistent with other +% components, the reference point was not the center point and did also +% depend on the component rotation. This is fixed now, but could mean +% little corrections for existing images. +% \fi +% +% \end{optionlist} +% +% \subsection{Version 4.3}\label{sec:bwd-comp-4.3} +% +% \begin{optionlist} +% \poeitem{\cs{rightangleprism}} +% \ifGERMAN Die Ausrichtung des \Lcomp{rightangleprism} und die +% Positionierung der Beschriftung war falsch. Das kommt aber nur zum +% tragen, wenn Eingangs- und Ausgangsvektor sehr unterschiedliche Längen +% haben. +% \fi +% \ifENGLISH The alignment of the \Lcomp{rightangleprism} and the +% positioning of the label was wrong. This became apparent only if the +% input and output vectors had very different lenghts. +% \fi +% \end{optionlist} +% +% \subsection{Version 4.2}\label{sec:bwd-comp-4.2} +% +% \begin{optionlist} +% \poeitem{prismtype} +% \ifGERMAN +% Die in Version 4.1 eingeführte Option \Lkeyword{prismtype} benötigte +% immer eine zusätzliche Drehung der Komponente um 180\textdegree. Das +% entfällt nun, da die Komponentenausrichtung korrigiert wurde, +% erfordert aber gegebenenfalls eine Korrektur von Skizzen, die mit +% Version 4.1 erstellt wurden. +% \fi +% \ifENGLISH +% The option \Lkeyword{prismtype}, introduced in version 4.1, always +% needed an additional angle rotation of 180\textdegree. This is not +% necessary anymore, the component behavior was corrected, but this may +% require adjustment of drawings created with version 4.1. +% \fi +% \end{optionlist} +% +% \subsection{Version 4.0}\label{sec:bwd-comp-4.0} +% +% \ifGERMAN Die Option \Lkeyword*{conn} und das alte, fehlerhafte +% Verfahren Strahlverbindungen zu zeichnen, wurde nun entfernt. Zur +% Migration älterer Dokumente siehe +% \prettyref{sec:bwd-comp-3.0-conn}. Damit wurde auch die Option +% \Lkeyword*{connjoin} überflüssig und wurde entfernt. +% \fi +% \ifENGLISH The option \Lkeyword*{conn} and the old, buggy code for beam +% connections was finally removed. To update older documents, see +% \prettyref{sec:bwd-comp-3.0-conn}. With this change also option +% \Lkeyword*{connjoin} became useless. +% \fi +% +% \ifENGLISH +% The appearance of \Lcomp{optfiber} changed slightly, because the old +% implementation was buggy and the separation between the loops depended +% on the number of loops (see example below). Note, that to achieve a +% similar default look, the default value for \Lkeyword{fiberloopsep} +% was changed from 0.3 to 0.2. Therefore, the interface nodes are a bit +% closer together. +% \fi +% \ifGERMAN +% Das Aussehen von \Lcomp{optfiber} hat sich etwas geändert, da in der +% vorherigen Implementierung der Abstand zwischen zwei Schleifen von der +% Anzahl der Schleifen abhing (siehe das Beispiel unten). Beachten Sie, +% dass die Voreinstellung für \Lkeyword{fiberloopsep} von 0.3 auf 0.2 +% geändert wurde um ein ähnliches Aussehen bei Verwendung der +% Voreinstellungen zu erhalten. Dadurch sitzen die Eingangs- und +% Ausgangsknoten jedoch etwas näher zusammen (siehe unten). +% \fi +% +% \makeatletter +% \begin{pspicture}[showgrid](0,-0.3)(6,1.4) +% \newOptexpFiberDipole{optfiber@old} +% \def\optfiber@old@ref{% +% \POE@setref{/@@x 0.3 \POE@key@fiberloops\space 1 sub mul 0.5 mul def }% +% }% +% \def\optfiber@old@nodes{% +% \newOptexpFiberComp{{@@x neg 0} {@@x 0}}% +% \ignorespaces}% +% \def\optfiber@old@comp{% +% \edef\@f@cnt{\POE@key@fiberloops\space}% +% \edef\@f@r{0.4 }% +% \edef\@f@sep{0.3 }% +% \parametricplot[plotpoints=200, style=Fiber]{0}{1}{% +% t 360 mul \@f@cnt mul sin \@f@r mul \@f@sep +% \@f@cnt 1 sub mul t 0.5 sub mul add +% 1 t 360 mul \@f@cnt mul cos sub \@f@r mul +% }% +% \ignorespaces}% +% \psset[optexp]{label=0.5 . b, showifcnodes} +% \optfiber@old[fiberloops=2](0,0.5)(2,0.5) +% \optfiber@old[fiberloops=3](2,0.5)(4,0.5){old} +% \optfiber@old[fiberloops=4](4,0.5)(6,0.5) +% \end{pspicture} +% \makeatother +% \hspace{\fill} +% \begin{pspicture}[showgrid](0,-0.3)(6,1.4) +% \psset[optexp]{label=0.5 . b, showifcnodes} +% \optfiber[fiberloops=2](0,0.5)(2,0.5) +% \optfiber[fiberloops=3](2,0.5)(4,0.5){new} +% \optfiber[fiberloops=4](4,0.5)(6,0.5) +% \end{pspicture} +% +% \ifGERMAN Das Makro \Lcs*{newOptexpDipoleNolabel} wurde entfernt und +% kann ohne weitere Änderungen durch \Lcs{newOptexpDipole} ersetzt werden. +% \fi +% \ifENGLISH The macro \Lcs*{newOptexpDipoleNolabel} was removed and can +% be replaced by \Lcs{newOptexpDipole} without any further changes. +% \fi +% +% \ifGERMAN The alte Syntax mit \nxLcs{mycomp@iii} zur Definition eigener +% Komponenten wird nicht mehr unterstützt. +% \fi +% \ifENGLISH The old syntax of defining own components with +% \nxLcs{mycomp@iii} is not supported anymore. +% \fi +% +% \subsection{Version 3.3}\label{sec:bwd-comp-3.3} +% +% \begin{optionlist} +% \poeitem{\textbackslash opttripole} +% \ifGERMAN Der Ausgangswinkel für die Beschriftung des +% \Lcomp{opttripole} wurde um 180° geändert um konsistent zu den anderen +% Dreipolen zu sein. +% \fi +% \ifENGLISH Changed the reference angle for the label of the +% \Lcomp{opttripole} to be consistent with the other tripoles. +% \fi +% \end{optionlist} +% +% \ifGERMAN\subsubsection{Strahlknoten}\fi +% \ifENGLISH\subsubsection{Beam nodes}\fi +% +% \ifGERMAN Vor Version 3.3 sind the Strahlknoten \Lcs{oenodeBeamUp} und +% \Lcs{oenodeBeamLow} nicht korrekt ausgerichtet gewesen, «upper» und +% «lower» war immer relativ zur Strahlrichtung (analog zu +% \Lkeyword{extnodealign}\opt{=relative}). +% +% Das konnte zu Problemen führen wenn \Lkeyword{loadbeampoints} zusammen +% mit \Lkeyword{beamdiv} verwendet wurde, da das Vorzeichen von +% \Lkeyword{beamdiv} nicht eindeutig kontrahierenden bzw. expandierenden +% Strahlen zugeordnet war. +% +% Seit Version 3.3 werden die Strahlknoten analog zu +% \Lkeyword{extnodealign}\opt{=absolute} definiert und die Zuordnung +% eines negativen \Lkeyword{beamdiv} mit kontrahierenden Strahlen sowie +% positiven \Lkeyword{beamdiv} mit expandierenden Strahlen ist immer +% gültig. In den folgenden beiden Beispielen ist immer der +% \Lcs{oenodeBeamUp} gekennzeichnet. +% \fi +% \ifENGLISH Before version 3.3 the beam nodes +% \Lcs{oenodeBeamUp} and \Lcs{oenodeBeamLow} were not swapped correctly +% and the orientation of «upper» and «lower» was only relative to the +% beam direction (equivalent to +% \Lkeyword{extnodealign}\opt{=relative}). +% +% This could lead to problems when using \Lkeyword{loadbeampoints} with +% \Lkeyword{beamdiv}. In that case the sign of \Lkeyword{beamdiv} was +% not unambiguously associated with contracting or expanding beam. +% +% As of version 3.3 the beam nodes are arranged according to +% \Lkeyword{extnodealign}\opt{=absolute} and the association of negative +% \Lkeyword{beamdiv} with a contracting and positive \Lkeyword{beamdiv} +% with an expanding beam is always valid. In the following two examples +% all \Lcs{oenodeBeamUp} are marked. +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample} +\begin{pspicture}(-2,-2)(2,2) + \addtopsstyle{Beam}{fillstyle=solid, fillcolor=green!40} + \multido{\i=0+90,\ia=1+2,\ib=2+2}{4}{% + \optplate[position=end](0.3;\i)(1;\i) + \optplate[position=end, plateheight=1.5](1;\i)(2;\i) + \drawwidebeam[beamwidth=0.2](0.3;\i){\ia} + \pnode(\oenodeBeamUp{}){Up} + \drawwidebeam[loadbeampoints, beamdiv=45]{\ia-\ib} + \psdot(Up)\psdot(\oenodeBeamUp{}) + } +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample} +\begin{pspicture}(-2,-2)(2,2) + \addtopsstyle{Beam}{fillstyle=solid, fillcolor=green!40} + \multido{\i=0+90,\ia=1+2,\ib=2+2}{4}{% + \optplate[position=end](0.3;\i)(1;\i) + \optplate[position=end](1;\i)(2;\i) + \drawwidebeam[beamwidth=0.2](0.3;\i){\ia} + \pnode(\oenodeBeamUp{}){Up} + \drawwidebeam[loadbeampoints, beamdiv=-45]{\ia-\ib} + \psdot(Up)\psdot(\oenodeBeamUp{}) + } +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \subsection{Version 3.0}\label{sec:bwd-comp-3.0} +% +% \ifENGLISH The changes in version 3.0 compared to version 2.1 which are not +% backward compatible. +% \fi +% \ifGERMAN Die Änderungen in Version 3.0 gegenüber Version 2.1, die nicht +% abwärtskompatibel sind. +% \fi +% +% \ifENGLISH\subsubsection{General parameters}\fi +% \ifGERMAN\subsubsection{Allgemeine Parameter}\fi +% +% \begin{optionlist} +% \optitem*[new]{namingscheme}{old, new} +% \ifGERMAN +% In Version 2.1 mussten spezielle Komponentenknoten über ihren expliziten +% Namen angesprochen werden. Wenn Sie das alte Namensschema benötigen, da Sie +% direkt auf die Knoten zugegriffen haben, so müssen Sie +% \nxLkeyword{namingscheme=old} verwenden. Seit Version 3.0 werden Makros für +% den Zugriff auf die Komponentenknoten bereitgestellt, so dass das +% eigentlichen Namensschema unerheblich ist, siehe \prettyref{sec:objnodes} +% \fi +% \ifENGLISH +% In version 2.1 special component nodes had to be accessed by their explicit +% name. If you need the old naming scheme, because you accessed internal nodes +% directly, then you must set \nxLkeyword{namingscheme=old}. Since version 3.0 +% explicit macros are provided to access all special component nodes, so that +% the actual naming scheme does not matter, see \prettyref{sec:objnodes}. +% \fi +% +% \poeitem{\smash{\begin{tabular}[t]{@{}r@{}}endbox\\angle\\rotateref\end{tabular}}} +% \ifENGLISH These options now affect all components.\fi +% \ifGERMAN Diese Parameter wirken sich jetzt auf alle Komponenten aus.\fi +% \vspace*{1cm} +% +% \poeitem{extnode} +% \ifENGLISH +% Some components now provide more possible positions for +% \Lkeyword{extnode}. \Lcomp{optdetector} had only one possible external node, +% which was accessible for any value of \Lkeyword{extnode}, now this node can +% be accessed only with \Lkeyword{extnode}\opt{=r}. All other values give +% different node positions. +% \fi +% \ifGERMAN +% Einigen Komponenten stellen nun mehr mögliche Positionen für +% \Lkeyword{extnode} zur Verfügung. So muss war z.B. für \Lcomp{optdetector} nur +% ein Knoten möglich, der für jeden Wert von \Lkeyword{extnode} zugänglich +% war, jetzt aber nur mit \Lkeyword{extnode}\opt{=r}. Alle anderen Werte +% setzen den Knoten an andere Stellen. +% \fi +% +% \poeitem{\textbackslash optbox} +% \ifENGLISH An \Lcomp{optbox} does always have the input and output +% nodes at the respective interfaces, whereas in version 2.1 the input +% and output nodes where at the same position for +% \Lkeyword{endbox}\opt{=true}. +% \fi +% \ifGERMAN Eine \Lcomp{optbox} hat immer einen Eingangs- und +% Ausgangsknoten an den entsprechenden Grenzflächen. In Version 2.1 +% fielen Eingangs- und Ausgangsknoten zusammen falls \Lkeyword{endbox} +% auf \opt{true} gesetzt war. +% \fi +% +% \poeitem{\textbackslash fibercollimator} +% \ifENGLISH The \Lcomp{fibercollimator} has only a fiber connection by +% default, the beam must be drawn manually or with \Lkeyword{beam} +% option. +% \fi +% \ifGERMAN Der \Lcomp{fibercollimator} hat in den Voreinstellungen nur +% eine Faserverbindung, der Strahl muss manuell oder durch Angabe des +% \Lkeyword{beam} Parameters gezeichnet werden. +% \fi +% \end{optionlist} +% +% \ifENGLISH\subsubsection{Beam connections}\fi +% \ifGERMAN\subsubsection{Strahlverbindungen}\fi +% \label{sec:bwd-comp-3.0-conn} +% +% \ifENGLISH +% In version 2.1, beam connections could be internal, that is the connections +% were specified together with the compent (\Lkeyword{beam} or +% \Lkeyword*{conn}), or external with an additional call of \Lcs{drawbeam}. The +% main reason for internal connections was the aesthetic aspect of drawing the +% beam behind the component, but also convenience played a role. Drawing the +% beam behind the component is possible with layering (\prettyref{sec:layers}) +% since 3.0. +% +% Some of the variants of internal beam connections can be used also in 3.0: +% \fi +% \ifGERMAN +% In Version 2.1 konnten Strahlverbindungen intern sein, d.h. die Verbindung +% wurde zusammen mit der Komponenten definiert (z.B. mit \Lkeyword{beam}, oder +% \Lkeyword*{conn}) oder extern über einen separaten Aufruf von \Lcs{drawbeam}. +% Der Hauptgrund für die internen Verbindungen war der ästhetische Aspekt, +% zuerst die Verbindung und dann die Komponente darüber zu zeichnen, aber +% Bequemlichkeit spielte auch eine Rolle. Seit Version 3.0 kann die Reihenfolge +% von Verbindungen und Komponenten über Ebenen geregelt werden +% (\prettyref{sec:layers}). +% +% Manche Varianten für interne Strahlverbindungen können auch in 3.0 verwendet +% werden: +% \fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-3,5-5}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \optbox[beam](A)(B) + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=o-i, conn=i-o} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-3,5-5}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \optbox[beam, beaminside=false](A)(B) + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=o-o} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% \ifENGLISH +% Other internal connections need an additional \Lcs{drawbeam} call, and if you +% want to move the beam behind the component, the code must be wrapped in a +% \Lenv{optexp} environment. Except for this, external connection are equivalent: +% \fi +% \ifGERMAN +% Andere Verbindungen können nur über einen zusätzlichen \Lcs{drawbeam} Aufruf +% erreicht werden, falls die Verbindung dann hinter der Komponente sein soll, +% musst der beteiligte Code in eine \Lenv{optexp}-Umgebung geschachtelt +% werden. Außer diesem Aspekt sind die separaten Verbindungen äquivalent: +%\fi +% +% \iffalse +%<*ignore> +% \fi +\begin{LTXexample}[linerange={1-4,6-6}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \optbox(A)(B) + \drawbeam(A){} + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=o-, conn=a-} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-3,5-6}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \optbox(A)(B) + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=-o, conn=-b} + \drawbeam{}(B) +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-4,6-8}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \begin{optexp} + \optbox(A)(B) + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=i-, A-} + \drawbeam[beaminsidelast](A){} + \end{optexp} +\end{pspicture} +\end{LTXexample} + +\begin{LTXexample}[linerange={1-4,6-8}] +\begin{pspicture}(3,2) + \pnode(0,1){A}\pnode(3,1){B} + \begin{optexp} + \optbox(A)(B) + \rput[b]([offset=-0.9]\oenodeCenter{}){\ttfamily conn=-i, conn=-B} + \drawbeam[beaminsidefirst]{}(B) + \end{optexp} +\end{pspicture} +\end{LTXexample} +% \iffalse +%</ignore> +% \fi +% +% +% \makeatletter +% \bgroup +% \newcommand*{\index@preamble}{} +% \let\index@preamble=\relax +% \renewcommand{\setindexpreamble}[1]{\def\index@preamble{#1}} +% \renewcommand*{\idx@heading}{% +% \addchap{\indexname}% +% \@mkboth{\indexname}{\indexname}% +% } +% \renewenvironment{theindex}{% +% \idx@heading% +% \index@preamble\par\nobreak +% \thispagestyle{\indexpagestyle}\parindent\z@ +% \setlength{\parskip}{\z@ \@plus .3\p@}% +% \setlength{\parfillskip}{\z@ \@plus 1fil}% +% \let\item\@idxitem +% }{% +% \clearpage +% } +% \renewcommand*\@idxitem{\par\hangindent 40\p@} +% \renewcommand*\subitem{\@idxitem \hspace*{20\p@}} +% \renewcommand*\subsubitem{\@idxitem \hspace*{30\p@}} +% \renewcommand*\indexspace{% +% \par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax +% } +% \renewcommand*\indexname{Index} +% \printindex[doc] +% \egroup +% \makeatother +% +% \appendix +% +% \ifGERMAN +% \chapter{Versionsgeschichte} +% +% Diese Versionsgeschichte ist eine Liste von Änderungen, die für den Nutzer des +% Pakets von Bedeutung sind. Änderungen, die eher technischer Natur sind und für +% den Nutzer des Pakets nicht relevant sind und das Verhalten des Pakets nicht +% ändern, werden nicht aufgeführt. Wenn ein Eintrag der Versionsgeschichte ein +% Feature als \emph{improved} oder \emph{extended} bekannt gibt, so bedeutet +% dies, dass eine Modifikation die Syntax und das Verhalten des Pakets nicht +% beeinflusst, oder das es für ältere Versionen kompatibel ist. Einträge, die +% als \emph{deprecated}, \emph{modified}, \emph{renamed}, oder \emph{removed} +% deklariert sind, verlangen besondere Aufmerksamkeit. Diese bedeuten, dass eine +% Modifikation Änderungen in existierenden Dokumenten mit sich ziehen kann. Die +% Zahlen an der rechten Seite stehen für die relevante Stelle dieser +% Dokumentation, zusätzliche Informationen zur Migration von älteren Dokumenten +% sind in \prettyref{sec:bwd-comp} zu finden. +% \fi +% \ifENGLISH +% \chapter{Revision history} +% +% This revision history is a list of changes relevant to users of this +% package. Changes of a more technical nature which do not affect the +% user interface or the behavior of the package are not included in the +% list. If an entry in the revision history states that a feature has +% been \emph{improved} or \emph{extended}, this indicates a modification +% which either does not affect the syntax and behavior of the package or +% is syntactically backwards compatible (such as the addition of an +% optional argument to an existing command). Entries stating that a +% feature has been \emph{deprecated}, \emph{modified}, \emph{fixed}, +% \emph{renamed}, or \emph{removed} demand attention. They indicate a +% modification which may require changes to existing documents. The +% numbers on the right indicate the relevant section of this manual, +% more information regarding backward compatibility can be found in +% \prettyref{sec:bwd-comp}. \fi +% +% \begin{changelog} +% \patchcmd{\release}{\setlength{\itemsep}{0pt}}{\setlength{\itemsep}{0pt}\setlength{\parsep}{0pt}}{}{} +% \begin{release}{5.2}{2014-11-26} +% \item Added component \cs{asphericlens}\see{comp:asphericlens} +% \item Added component \cs{axicon}\see{comp:axicon} +% \item Added component \cs{optwedge}\see{comp:optwedge} +% \end{release} +% \begin{release}{5.1}{2014-11-19} +% \item Added component \cs{oapmirror}\see{comp:oapmirror} +% \item Added support for filled beams with path interfaces. +% \end{release} +% \begin{release}{5.0}{2014-10-30} +% \item Added support for arbitrary interface shapes (experimental, +% requires the \opt{pst-intersect} package and \opt{pstricks} +% version 2.53). +% \item Added component \cs{parabolicmirror}\see{comp:parabolicmirror} +% \end{release} +% \begin{release}{4.10}{2014-06-04} +% \item Added value \opt{firstcomp} to parameter \opt{beamalign}\see{prm:beamalign} +% \item Modified \cs{optsource} to handle also the beam alignment\see{comp:optsource} +% \end{release} +% \begin{release}{4.9}{2014-06-03} +% \item Added new component \cs{optsource}\see{comp:optsource} +% \item Improved naming of the last component name, which can now be +% accessed also by its number besides using \opt{N}. +% \item Fixed bug related to \opt{extnodes} together with \opt{compname} +% \end{release} +% \begin{release}{4.8}{2014-02-28} +% \item Added component \cs{optaom}\see{comp:optaom} +% \item Added option \opt{beammode}\see{prm:beammode} +% \item Added option \opt{showinterfaces}\see{prm:showinterfaces} +% \end{release} +% \begin{release}{4.7}{2014-01-12} +% \item Added syntax \opt{<}\prm{num} for accessing relative component +% IDs\see{sec:namingobj} +% \end{release} +% \begin{release}{4.6}{2013-11-27} +% \item Added option \opt{extnodes}\see{prm:extnodes} +% \item Added option \opt{optdipolecomp}\see{prm:optdipolecomp} +% \item Added option \opt{opttripolecomp}\see{prm:opttripolecomp} +% \end{release} +% \begin{release}{4.5}{2013-07-21} +% \item Added option \opt{usewirestyle}\see{prm:usewirestyle} +% \item Added line style \opt{fade}, with options \opt{fadeto}, +% \opt{fadepoints}, \opt{fadefunc}, and +% \opt{fadefuncname}\see{prm:fade}. +% \end{release} +% \begin{release}{4.4}{2013-07-14} +% \item Added component \cs{transmissiongrating}\see{comp:transmissiongrating} +% \item Modified \opt{innerlabel} to explicitly set \opt{labelalign=c} +% \item Fixed trailing spaces in \opt{savebeampoints} (and \opt{savebeam}). +% \item Allow Postscript code in \opt{angle}. +% \end{release} +% \begin{release}{4.3a}{2013-07-02} +% \item Fixed tripole alignment bugs introduced in version 4.3. +% \item Again fixed the alignment of reflective \cs{optprism}\see{prm:prismalign} +% \item Fixed improper alignment of \cs{optprism} label\see{sec:bwd-comp-4.3a} +% \end{release} +% \begin{release}{4.3}{2013-06-28} +% \item Added option \opt{raprismalign}\see{prm:raprismalign} +% \item Fixed alignment of \cs{rightangleprism} and rotation of its +% label. +% \end{release} +% \begin{release}{4.2}{2013-06-07} +% \item Added option \opt{startinsidecount}\see{prm:startinsidecount} +% \item Added option \opt{stopinsidecount}\see{prm:stopinsidecount} +% \item Added option \opt{beampathcount}\see{prm:beampathcount} +% \item Added option \opt{beamnodealign}\see{prm:beamnodealign} +% \item Added \cs{oeBeamVecMedian}\see{cs:oeBeamVecMedian} +% \item Added \cs{oeBeamCenter}\see{cs:oeBeamCenter} +% \item Modified the orientation of a reflective +% \cs{optprism}\see{sec:bwd-comp-4.2} +% \item Fixed bug of \cs{optprism} and \cs{rightangleprism} inside +% an \env{optexp} environment. +% \item Fixed bug of wrong \cs{rightangleprism} rotation in special +% cases. +% \item Fixed buggy handling of multiple saved beams\see{prm:savebeam} +% \end{release} +% \begin{release}{4.1}{2013-05-21} +% \item Added option \opt{prismtype}\see{prm:prismtype} +% \end{release} +% \begin{release}{4.0}{2013-04-15} +% \item Added electrical components\see{chap:electrcomp} +% \item Added wire connections with \cs{drawwire}\see{sec:drawwire} +% \item Added component \cs{optarrowcomp}\see{comp:optarrowcomp} +% \item Added component \cs{optbarcomp}\see{comp:optbarcomp} +% \item Improved \cs{optdetector}\see{comp:optdetector} +% \item Extended \cs{drawfiber} to support component +% ranges\see{cs:drawfiber} +% \item Extended \opt{couplersep} to support automatic +% calculation\see{prm:couplersep} +% \item Fixed appearance of \cs{optfiber}\see{sec:bwd-comp-4.0} +% \item Fixed \opt{extnodealign} to affect also +% multipoles\see{prm:extnodealign} +% \item Fixed \opt{pswarning}. +% \item Removed old, buggy beam connection code\see{sec:bwd-comp-4.0} +% \item Removed option \opt{conn}\see{sec:bwd-comp-4.0} +% \item Removed option \opt{connjoin}\see{sec:bwd-comp-4.0} +% \item Removed \cs{newOptexpDipoleNolabel}\see{sec:bwd-comp-4.0} +% \end{release} +% \begin{release}{3.6}{2013-03-20} +% \item Added option \opt{compoffset}\see{prm:compoffset} +% \item Added option \opt{beampathskip}\see{prm:beampathskip} +% \item Added option \opt{innercompalign}\see{prm:innercompalign} +% \item Fixed some bugs in the raytracing and beam code. +% \end{release} +% \begin{release}{3.5}{2013-02-22} +% \item Added option \opt{filterangle}\see{prm:filterangle} +% \item Fixed wrong output fiber style in \cs{optcoupler} +% \item Fixed strange Postscript error which occured with some +% interpreters. +% \end{release} +% \begin{release}{3.4}{2013-02-03} +% \item Fixed bugs when using \opt{fillstyle} for some components. +% \item Extended option \opt{switchsize}\see{comp:optswitch} +% \item Modified coupler center node to be on the base +% line\see{sec:centernode} +% \item Extended error checking for \cs{drawbeam} and +% \cs{drawfiber}\see{sec:accessobj} +% \item Fixed some bugs in the connection code. +% \end{release} +% \begin{release}{3.3a}{2012-09-18} +% \item Fixed bug which was exposed by an update of pst-node. +% \item Fixed trailing spaces. +% \end{release} +% \begin{release}{3.3}{2012-08-17} +% \item Extended \cs{opttripole} and \cs{optdipole}\see{comp:optdipole} +% \item Modified reference angle for label of +% \cs{opttripole}\see{sec:bwd-comp-3.3} +% \item Added option \opt{optdipolesize} to support two interfaces for +% \cs{optdipole}\see{prm:optdipolesize} +% \item Added option \opt{gratingalign}\see{prm:gratingalign} +% \item Added option \opt{forcebeaminside}\see{prm:forcebeaminside} +% \item Extended option \opt{mirrorradius}\see{prm:mirrorradius} +% \item Improved \cs{drawbeam} and \cs{drawwidebeam} to be able to use +% \opt{ArrowInside} without linestyle\see{prm:ArrowInsideMaxLength} +% \item Fixed orientation of \cs{oenodeBeamUp} and +% \cs{oenodeBeamLow}\see{cs:oenodeBeamUp} +% \item Fixed a bug related to \opt{beaminside} and ambiguous +% components. +% \item Fixed some trailing spaces. +% \item Added more examples\see{sec:examples} +% \end{release} +% \begin{release}{3.2}{2012-07-26} +% \item Added component \cs{glanthompson}\see{comp:glanthompson} +% \item Added access to beam vectors with \cs{oeBeamVec}, +% \cs{oeBeamVecUp} and \cs{oeBeamVecLow}\see{cs:oeBeamVec} +% \item Fixed wrong computation of node distance in \cs{fiberbox} +% \item Fixed bug in \cs{wdmsplitter} for \opt{coupleralign=b} and +% \opt{couplertype=none} +% \item Fixed bug when filling components placed with +% \opt{position=end}/\opt{start} +% \item Added value \opt{absolute} to parameter +% \opt{labelref}\see{prm:labelref} +% \item Added examples\see{sec:examples} +% \end{release} +% \begin{release}{3.1}{2012-07-17} +% \item Added component \cs{fiberbox}\see{comp:fiberbox} +% \item Extended connection macros to not required curly braces around +% node parenthesis any more\see{sec:namingobj} +% \item Modified \cs{fibercollimator} to have +% \opt{allowbeaminside=false} by default\see{comp:fibercollimator} +% \item Extended fiber couplers to allow using only two +% nodes\see{sec:coupler} +% \item Fixed a bug concerning node expressions with \cs{drawfiber} +% \end{release} +% \begin{release}{3.0}{2012-07-09} +% \item Modified beam connections with \cs{drawbeam} to support +% raytracing\see{cs:drawbeam} +% \item Added wide beams with \cs{drawwidebeam}\see{cs:drawwidebeam} +% \item Added \cs{drawfiber} for fiber connections\see{cs:drawfiber} +% \item Added \opt{optexp} environment for layering of components and +% connections\see{sec:layers} +% \item Added german documentation. +% \item Modified naming of component nodes\see{sec:objnodes} +% \item Modified \opt{extnode} to work with more +% components\see{prm:extnode} +% \item Modified \opt{angle} and \opt{rotateref} to affect all +% components\see{sec:rotshift} +% \item Modified \opt{endbox} to affect all +% components\see{sec:positioning} +% \item Extended \opt{position} by values \opt{start} and +% \opt{end}\see{sec:positioning} +% \item Extended \opt{abspos} by values \opt{start} and +% \opt{end}\see{sec:positioning} +% \item Removed deprecated lens code which used \opt{lenswidth} and +% \opt{lensheight} for construction\see{comp:lens} +% \item Added option \opt{platesize}\see{prm:platesize} +% \item Added option \opt{phwidth}\see{comp:pinhole} +% \item Modified option \opt{caxislength}\see{comp:crystal} +% \item Deprecated option \opt{lampscale}\see{comp:crystal} +% \item Added style \opt{CrystalCaxis}\see{comp:crystal} +% \item Added style \opt{CrystalLamp}\see{comp:crystal} +% \item Added option \opt{optboxsize}\see{comp:optbox} +% \item Extended option \opt{detsize}\see{comp:optdetector} +% \item Added style \opt{DetectorStyle}\see{comp:optdetector} +% \item Removed deprecated \cs{detector}, use +% \cs{optdetector}\see{comp:optdetector} +% \item Extended option \opt{doveprismsize}\see{comp:doveprism} +% \item Added style \opt{Polarization}\see{comp:polarization} +% \item Deprecated option \opt{pollinewidth}\see{comp:polarization} +% \item Removed option \opt{polwidth}\see{comp:polarization} +% \item Removed option \opt{pol}\see{comp:polarization} +% \item Added style \opt{VariableStyle}\see{comp:mirror} +% \item Added mirror type \opt{semitrans}\see{prm:mirrortype} +% \item Renamed \cs{optgrid} to \cs{optgrating}\see{comp:optgrating} +% \item Renamed \opt{optgridwidth} to +% \opt{gratingwidth}\see{comp:optgrating} +% \item Renamed \opt{optgridheight} to +% \opt{gratingheight}\see{comp:optgrating} +% \item Renamed \opt{optgriddepth} to +% \opt{gratingdepth}\see{comp:optgrating} +% \item Renamed \opt{optgridcount} to +% \opt{gratingcount}\see{comp:optgrating} +% \item Renamed \opt{optgridtype} to +% \opt{gratingtype}\see{comp:optgrating} +% \item Renamed \opt{optgridlinewidth} to +% \opt{gratinglinewidth}\see{comp:optgrating} +% \item Added option \opt{prismalign}\see{comp:optprism} +% \item Modified faulty alignment of +% \cs{rightangleprism}\see{comp:rightangleprism} +% \item Extended option \opt{optampsize}\see{comp:optamp} +% \item Extended option \opt{optmzmsize}\see{comp:optmzm} +% \item Added option \opt{polcontroltype}\see{comp:polcontrol} +% \item Extended option \opt{isolatorsize}\see{comp:optisolator} +% \item Added style \opt{IsolatorArrow}\see{comp:optisolator} +% \item Extended option \opt{fdlsize}\see{comp:fiberdelayline} +% \item Added style \opt{FdlArrow}\see{comp:fiberdelayline} +% \item Extended option \opt{fiberpolsize}\see{comp:optfiberpolarizer} +% \item Added component \cs{optcirculator}\see{comp:optcirculator} +% \item Extended option \opt{couplersize}\see{comp:optcoupler} +% \item Extended option \opt{couplertype}\see{comp:optcoupler} +% \item Renamed option \opt{align} to +% \opt{coupleralign}\see{comp:optcoupler} +% \item Added style \opt{VariableCoupler}\see{comp:optcoupler} +% \item Added style \opt{FilterStyle}\see{comp:optfilter} +% \item Extended option \opt{fibercolsize}\see{comp:fibercollimator} +% \item Removed deprecated option \opt{labelrelative}\see{sec:labels} +% \item Removed deprecated option \opt{iwidth}\see{comp:pinhole} +% \item Removed deprecated option \opt{owidth}\see{comp:pinhole} +% \item Removed deprecated option \opt{bswidth}\see{comp:beamsplitter} +% \item Deprecated \cs{newOptexpDipoleNolabel}, use +% \cs{newOptexpDipole}\see{sec:newobj} +% \item Deprecated option +% \opt{refractiveindex}\see{prm:refractiveindex} +% \item Deprecated option \opt{conn}\see{sec:drawbeam} +% \item Extended option \opt{fiber}\see{prm:fiber} +% \end{release} +% \begin{release}{2.1}{2009-11-05} +% \item Added component +% \cs{optfiberpolarizer}\see{comp:optfiberpolarizer} +% \item Added option \opt{compshift}\see{prm:compshift} +% \item Added option \opt{label}\see{prm:label} +% \item Added option \opt{connjoin} +% \item Added options \opt{addtoBeam} and +% \opt{newBeam}\see{sec:drawbeam} +% \item Added style \opt{OptComp} and related options +% \opt{addtoOptComp} and \opt{newOptComp}\see{sec:appearance} +% \item Added option \opt{bsstyle}\see{comp:beamsplitter} +% \item Extended \cs{fibercollimator} to use up to four reference +% nodes\see{comp:fibercollimator} +% \item Improved \opt{thicklens} to work also with plain +% lenses\see{prm:thicklens} +% \item Use pst-doc class for the documentation. +% \end{release} +% +% \begin{release}{2.0}{2008-07-27} +% \item Added fiber-optical components\see{chap:fibercomp} +% \item Added component \cs{optdiode}\see{comp:optdiode} +% \item Added component \cs{pentaprism}\see{comp:pentaprism} +% \item Added component +% \cs{rightangleprism}\see{comp:rightangleprism} +% \item Added component \cs{doveprism}\see{comp:doveprism} +% \item Added component \cs{optprism}\see{comp:optprism} +% \item Added \cs{drawbeam}\see{sec:drawbeam} +% \item Added component connections (options \opt{fiber}, \opt{conn} +% and \opt{beam})\see{chap:connecting} +% \item Added option \opt{compname}\see{prm:compname} +% \item Added option \opt{extnode}\see{prm:extnode} +% \item Renamed \cs{detector} to +% \cs{optdetector}\see{comp:optdetector} +% \end{release} +% \begin{release}{1.2}{2008-06-17} +% \item Modified lens design to use interface curvatures\see{comp:lens} +% \item Added options \opt{lensradiusleft} and +% \opt{lensradiusright}\see{comp:lens} +% \item Added option \opt{thicklens}\see{comp:lens} +% \item Added option \opt{lenstype}\see{comp:lens} +% \item Added option \opt{mirrorradius} (curved +% mirrors)\see{comp:mirror} +% \item Added option \opt{optgridtype} (binary +% gratings)\see{comp:optgrating} +% \item Added \cs{newOptexpDipole}\see{sec:newobj} +% \item Added \cs{newOptexpDipoleNolabel}\see{sec:newobj} +% \item Added \cs{newOptexpTripole}\see{sec:newobj} +% \item Added \cs{newOptexpFiberDipole}\see{sec:newobj} +% \item General improvements of \TeX{} and Postscript code +% \end{release} +% \begin{release}{1.1}{2007-09-06} +% \item Improved labeling features\see{sec:labels} +% \item Added parameter \opt{labelref}\see{sec:labels} +% \item Replaced \opt{labelrelative} by +% \opt{labelref=relative}\see{sec:labels} +% \item Renamed \cs{polarisation} to +% \cs{polarization}\see{comp:polarization} +% \item Renamed \opt{polwidth} to \opt{polsize}\see{comp:polarization} +% \item Renamed \opt{pol} to \opt{poltype}\see{comp:polarization} +% \item Renamed \opt{bswidth} to \opt{bssize}\see{comp:beamsplitter} +% \item Renamed \opt{iwidth} to \opt{innerheight}\see{comp:pinhole} +% \item Renamed \opt{owidth} to \opt{outerheight}\see{comp:pinhole} +% \item Added support for fillstyle for all components +% \end{release} +% +% \begin{release}{1.0}{2007-07-18} +% \item First CTAN version +% \end{release} +% \end{changelog} +% +% \StopEventually{} +% +% \begin{otherlanguage}{english} +% \printindex[idx] +% \end{otherlanguage} +% +% \chapter{The \LaTeX/\TeX\ implementation} +%<*stylefile> +% \section{Requirements} +% \begin{macrocode} +\RequirePackage{ifthen} +\RequirePackage{pstricks} +\RequirePackage{pst-xkey} +\RequirePackage{pst-node} +\RequirePackage{pst-plot} +\RequirePackage{multido} +\RequirePackage{pst-eucl} +\RequirePackage{pst-intersect} +\RequirePackage{pstricks-add} +\RequirePackage{environ} +% \end{macrocode} +% Add the Postscript header file. +% \begin{macrocode} +\@addtofilelist{pst-optexp.pro}{}% +\pst@addfams{optexp} +\pstheader{pst-optexp.pro} +% \end{macrocode} +% This holds a comma-separated list of all component names which are +% defined in a \nxLenv{pspicture} environment. The list is cleared when +% leaving the \nxLenv{pspicture} environment. +% \begin{macrocode} +\gdef\POE@complist{}% +% \end{macrocode} +% This hold a comma-separated list of the numbers of all saved beam end +% points in a \nxLenv{pspicture} environment. The list is used to delete +% all remaining Postscript information about the saved beams when +% leaving the current \nxLenv{pspicture}, as they may cause problems +% inside any following optexp-drawing. +% \begin{macrocode} +\gdef\POE@beamlist{1}% +\g@addto@macro{\endpspicture}{% +% \end{macrocode} +% Undefine all beam nodes at the end of the \nxLenv{pspicture}. +% \begin{macrocode} + \expandafter\XKV@for@n\expandafter{\POE@beamlist}\POE@temp{% + \POE@Verb{% + /lastBeamPointUp\POE@temp\space + /lastBeamPointLow\POE@temp\space + /lastBeamPoint\POE@temp\space + 3 { currentdict exch undef } repeat + /N@\oenodeBeam{\POE@temp} + /N@\oenodeBeamUp{\POE@temp} + /N@\oenodeBeamLow{\POE@temp} + 3 { tx@NodeDict exch undef } repeat + }% + }% +% \end{macrocode} +% Reset the component list. +% \begin{macrocode} + \gdef\POE@complist{}\gdef\POE@beamlist{1}\global\POE@cnt=0\relax +}% +% \end{macrocode} +% Some convenience definitions. +% \begin{macrocode} +\def\pst@optexpdict{tx@OptexpDict begin } +\def\POE@dict#1{\pst@optexpdict #1 end} +\def\POE@Verb#1{\pst@Verb{\pst@optexpdict #1 end }}% +% \end{macrocode} +% Save the pstricks-add line definition for use with the beams +% \begin{macrocode} +\let\POE@tx@Line\tx@Line +\SpecialCoor +% \end{macrocode} +% +% \section{Basic definitions} +% \subsection{Switches for the boolean keys} +% See respective key definitions for explanation. +% \begin{macrocode} +\newif\ifPOE@backlayer +\newif\ifPOE@frontlayer +\newif\ifPOE@optexpenv +\newif\ifPOE@variable +\newif\ifPOE@voltage +\newif\ifPOE@caxisinv +\newif\ifPOE@reverse +\newif\ifPOE@lamp +\newif\ifPOE@component@optional +\newif\ifPOE@debug@showoptdots +\newif\ifPOE@debug@showifcnodes +\newif\ifPOE@debug@showinterfaces +\newif\ifPOE@endbox +\newif\ifPOE@startbox +\newif\ifPOE@thicklens +\newif\ifPOE@usefiberstyle +\newif\ifPOE@usewirestyle +\newif\ifPOE@fiberin@ +\newif\ifPOE@fiberin@top +\newif\ifPOE@fiberin@bottom +\newif\ifPOE@fiberout@ +\newif\ifPOE@fiberout@top +\newif\ifPOE@fiberout@bottom +\newif\ifPOE@fiberpresetin@ +\newif\ifPOE@fiberpresetin@top +\newif\ifPOE@fiberpresetin@bottom +\newif\ifPOE@fiberpresetout@ +\newif\ifPOE@fiberpresetout@top +\newif\ifPOE@fiberpresetout@bottom +\newif\ifPOE@wirein@ +\newif\ifPOE@wirein@top +\newif\ifPOE@wirein@bottom +\newif\ifPOE@wireout@ +\newif\ifPOE@wireout@top +\newif\ifPOE@wireout@bottom +\newif\ifPOE@wirepresetin@ +\newif\ifPOE@wirepresetin@top +\newif\ifPOE@wirepresetin@bottom +\newif\ifPOE@wirepresetout@ +\newif\ifPOE@wirepresetout@top +\newif\ifPOE@wirepresetout@bottom +\newif\ifPOE@beam +\newif\ifPOE@startinside +\newif\ifPOE@stopinside +\newif\ifPOE@beaminsidefirst +\newif\ifPOE@beaminsidelast +\newif\ifPOE@savebeam +\newif\ifPOE@loadbeam +\newif\ifPOE@beaminside +\newif\ifPOE@raytrace +\newif\ifPOE@pswarning +\newif\ifPOE@useNA +% \end{macrocode} +% This is to check if \nxLkeyword{compname} is set inside or outside of a component. For this no boolean key is provided. +% \begin{macrocode} +\newif\ifPOE@insideobj\POE@insideobjfalse +% \end{macrocode} +% +% \subsection{Counters} +% Count the components in one \nxLenv{pspicture} environment. +% \begin{macrocode} +\newcount\POE@cnt +% \end{macrocode} +% Save the current count at the end of the optexp-environment, before +% the second pass. +% \begin{macrocode} +\newcount\POE@oldcnt +% \end{macrocode} +% Count the temporal planes which are created for connections to nodes. +% \begin{macrocode} +\newcount\POE@nodecnt +% \end{macrocode} +% +% \subsection{Fixed strings} +% These are all the fixed strings which are used as possible values for +% choicekeys. +% \begin{macrocode} +\def\POE@str@absolute{absolute} +\def\POE@str@auto{auto} +\def\POE@str@bandpass{bandpass} +\def\POE@str@bandstop{bandstop} +\def\POE@str@binary{binary} +\def\POE@str@blazed{blazed} +\def\POE@str@bottom{bottom} +\def\POE@str@center{center} +\def\POE@str@circle{circle} +\def\POE@str@closed{closed} +\def\POE@str@connection{connection} +\def\POE@str@coupling{coupling} +\def\POE@str@cross{cross} +\def\POE@str@cube{cube} +\def\POE@str@custom{custom} +\def\POE@str@default{default} +\def\POE@str@diode{diode} +\def\POE@str@directional{directional} +\def\POE@str@ellipse{ellipse} +\def\POE@str@elliptic{elliptic} +\def\POE@str@extended{extended} +\def\POE@str@global{global} +\def\POE@str@highpass{highpass} +\def\POE@str@lcirc{lcirc} +\def\POE@str@left{left} +\def\POE@str@linear{linear} +\def\POE@str@lowpass{lowpass} +\def\POE@str@misc{misc} +\def\POE@str@none{none} +\def\POE@str@opened{opened} +\def\POE@str@parallel{parallel} +\def\POE@str@perp{perp} +\def\POE@str@piezo{piezo} +\def\POE@str@plain{plain} +\def\POE@str@plate{plate} +\def\POE@str@pulse{pulse} +\def\POE@str@quiet{quiet} +\def\POE@str@rcirc{rcirc} +\def\POE@str@rectangle{rectangle} +\def\POE@str@reflective{reflective} +\def\POE@str@relative{relative} +\def\POE@str@relgrav{relgrav} +\def\POE@str@right{right} +\def\POE@str@round{round} +\def\POE@str@sawtooth{sawtooth} +\def\POE@str@semitrans{semitrans} +\def\POE@str@sine{sine} +\def\POE@str@standard{standard} +\def\POE@str@symmetric{symmetric} +\def\POE@str@top{top} +\def\POE@str@transmittive{transmittive} +\def\POE@str@transparency{transparency} +\def\POE@str@triangle{triangle} +\def\POE@str@vector{vector} +\def\POE@str@verbose{verbose} +% \end{macrocode} +% +% \section{Parameter and style definitions} +% The parameters and styles are commented quiet well in the user documentation, +% here you will find only additional comments about technical peculiarities. +% \begin{macrocode} +\newpsstyle{OptComp}{}% +\define@key[psset]{optexp}{newOptComp}{% + \newpsstyle{OptComp}{#1}% +} +\define@key[psset]{optexp}{addtoOptComp}{% + \addtopsstyle{OptComp}{#1}% +} +\newpsstyle{OptionalStyle}{linestyle=dashed,dash=1.5pt 1pt}% +\newpsstyle{IfcNodeStyle}{dotstyle=x, dotscale=1.5, linecolor=blue}% +\newpsstyle{IfcStyle}{linestyle=dashed, dash=1pt 1pt, linecolor=red!70!black}% +\newpsstyle{Beam}{linecolor=green!90!black, linejoin=1}% +\define@key[psset]{optexp}{newBeam}{% + \newpsstyle{Beam}{#1}% +} +\define@key[psset]{optexp}{addtoBeam}{% + \addtopsstyle{Beam}{#1}% +} +% \end{macrocode} +% Styles for the automatic fiber connections. +% \begin{macrocode} +\newpsstyle{Fiber}{}% +\define@key[psset]{optexp}{newFiber}{% + \newpsstyle{Fiber}{#1}% +} +\define@key[psset]{optexp}{addtoFiber}{% + \addtopsstyle{Fiber}{#1}% +} +\newpsstyle{FiberIn}{style=Fiber}% +\define@key[psset]{optexp}{newFiberIn}{% + \newpsstyle{FiberIn}{#1}% +} +\define@key[psset]{optexp}{addtoFiberIn}{% + \addtopsstyle{FiberIn}{#1}% +} +\newpsstyle{FiberOut}{style=Fiber}% +\define@key[psset]{optexp}{newFiberOut}{% + \newpsstyle{FiberOut}{#1}% +} +\define@key[psset]{optexp}{addtoFiberOut}{% + \addtopsstyle{FiberOut}{#1}% +} +\newpsstyle{FiberIn1}{style=FiberIn}% +\define@key[psset]{optexp}{newFiberIn1}{% + \newpsstyle{FiberIn1}{#1}% +} +\define@key[psset]{optexp}{addtoFiberIn1}{% + \addtopsstyle{FiberIn1}{#1}% +} +\newpsstyle{FiberIn2}{style=FiberIn}% +\define@key[psset]{optexp}{newFiberIn2}{% + \newpsstyle{FiberIn2}{#1}% +} +\define@key[psset]{optexp}{addtoFiberIn2}{% + \addtopsstyle{FiberIn2}{#1}% +} +\newpsstyle{FiberOut1}{style=FiberOut}% +\define@key[psset]{optexp}{newFiberOut1}{% + \newpsstyle{FiberOut1}{#1}% +} +\define@key[psset]{optexp}{addtoFiberOut1}{% + \addtopsstyle{FiberOut1}{#1}% +} +\newpsstyle{FiberOut2}{style=FiberOut}% +\define@key[psset]{optexp}{newFiberOut2}{% + \newpsstyle{FiberOut2}{#1}% +} +\define@key[psset]{optexp}{addtoFiberOut2}{% + \addtopsstyle{FiberOut2}{#1}% +} +% \end{macrocode} +% +% Electrical connection stuff +% \begin{macrocode} +\newpsstyle{Wire}{} +\define@key[psset]{optexp}{newWire}{% + \newpsstyle{Wire}{#1}% +} +\define@key[psset]{optexp}{addtoWire}{% + \addtopsstyle{Wire}{#1}% +} +\newpsstyle{WireIn}{style=Wire} +\define@key[psset]{optexp}{newWireIn}{% + \newpsstyle{WireIn}{#1}% +} +\define@key[psset]{optexp}{addtoWireIn}{% + \addtopsstyle{WireIn}{#1}% +} +\newpsstyle{WireIn1}{style=WireIn} +\define@key[psset]{optexp}{newWireIn1}{% + \newpsstyle{WireIn1}{#1}% +} +\define@key[psset]{optexp}{addtoWireIn1}{% + \addtopsstyle{WireIn1}{#1}% +} +\newpsstyle{WireIn2}{style=WireIn} +\define@key[psset]{optexp}{newWireIn2}{% + \newpsstyle{WireIn2}{#1}% +} +\define@key[psset]{optexp}{addtoWireIn2}{% + \addtopsstyle{WireIn2}{#1}% +} +\newpsstyle{WireOut}{style=Wire} +\define@key[psset]{optexp}{newWireOut}{% + \newpsstyle{WireOut}{#1}% +} +\define@key[psset]{optexp}{addtoWireOut}{% + \addtopsstyle{WireOut}{#1}% +} +\newpsstyle{WireOut1}{style=WireOut} +\define@key[psset]{optexp}{newWireOut1}{% + \newpsstyle{WireOut1}{#1}% +} +\define@key[psset]{optexp}{addtoWireOut1}{% + \addtopsstyle{WireOut1}{#1}% +} +\newpsstyle{WireOut2}{style=WireOut} +\define@key[psset]{optexp}{newWireOut2}{% + \newpsstyle{WireOut2}{#1}% +} +\define@key[psset]{optexp}{addtoWireOut2}{% + \addtopsstyle{WireOut2}{#1}% +} +\newpsstyle{ElecComp}{} +% \end{macrocode} +% Special styles to change only a part of some devices. +% \begin{macrocode} +\newpsstyle{ExtendedMirror}{% + linestyle=none, hatchwidth=0.5\pslinewidth, + hatchsep=1.4\pslinewidth, fillstyle=hlines +}% +\newpsstyle{VariableStyle}{% + linewidth=0.8\pslinewidth, arrowinset=0, arrowscale=0.8, arrows=<-> +} +\newpsstyle{SemitransMirror}{linestyle=none, fillstyle=solid,fillcolor=black!30}% +\newpsstyle{PiezoMirror}{fillstyle=solid,fillcolor=black!30}% +\newpsstyle{IsolatorArrow}{linewidth=2\pslinewidth, arrowinset=0} +\newpsstyle{CrystalCaxis}{% + linestyle=dashed, dash=2pt 2pt, linewidth=0.7\pslinewidth, + arrowinset=0, arrows=-> +} +\newpsstyle{CrystalLamp}{linewidth=0.6\pslinewidth} +\newpsstyle{FdlArrow}{arrowinset=0, arrows=->} +\newpsstyle{VariableCoupler}{arrowinset=0, arrows=->} +% \end{macrocode} +% +% \subsection{General parameters} +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@component@]{optional}[true]{} +\define@boolkey[psset]{optexp}[POE@]{usefiberstyle}[true]{} +\define@choicekey[psset]{optexp}{usewirestyle}% + [\val\nr]{true,false}[true]{% + \psset[optexp]{usefiberstyle=false}% + \ifcase\nr\relax + \POE@usewirestyletrue + \or + \POE@usewirestylefalse + \fi}% +\define@boolkey[psset]{optexp}[POE@]{usewirestyle}[true]{} +\define@boolkey[psset]{optexp}[POE@debug@]{showoptdots}[true]{} +\define@boolkey[psset]{optexp}[POE@debug@]{showifcnodes}[true]{} +\define@boolkey[psset]{optexp}[POE@debug@]{showinterfaces}[true]{} +% \end{macrocode} +% The positioning parameters. +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{endbox}[true]{} +\define@boolkey[psset]{optexp}[POE@]{startbox}[true]{} +\define@choicekey*+[psset]{optexp}{position}[\val\nr]{start,end}{% + \ifcase\nr\relax + \psset[optexp]{startbox, endbox=false}% + \or + \psset[optexp]{startbox=false, endbox=true}% + \fi +}{% + \psset[optexp]{startbox=false, endbox=false}% + \edef\POE@key@position{#1}% +}% +\define@choicekey*+[psset]{optexp}{abspos}[\val\nr]{start,end}{% + \ifcase\nr\relax + \psset[optexp]{startbox, endbox=false}% + \or + \psset[optexp]{startbox=false, endbox=true}% + \fi +}{% + \psset[optexp]{startbox=false, endbox=false}% + \edef\POE@key@abspos{#1}% +}% +\define@key[psset]{optexp}{compshift}{% + \pst@checknum{#1}\POE@key@compshift +} +\define@key[psset]{optexp}{angle}{% + \pst@checknum{#1}\POE@key@angle +} +\define@key[psset]{optexp}{compoffset}{% + \pst@checknum{#1}\POE@key@compoffset +} +\define@choicekey+[psset]{optexp}{innercompalign}% + [\val\nr]{rel,abs,relative,absolute}% + {% + \ifcase\nr\relax + \let\POE@key@innercompalign\POE@str@relative + \or + \let\POE@key@innercompalign\POE@str@absolute + \else + \def\POE@key@innercompalign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for innercompalign}}% +\psset[optexp]{% + position={}, + abspos={}, + compshift=0, + compoffset=0, + innercompalign=relative, + angle=0 +}% +% \end{macrocode} +% Layering +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{backlayer}[true]{} +\define@boolkey[psset]{optexp}[POE@]{frontlayer}[true]{} +\define@boolkey[psset]{optexp}[POE@]{optexpenv}[true]{} +\psset[optexp]{backlayer, frontlayer}% +% \end{macrocode} +% Labels +% \begin{macrocode} +\newcommand{\oelabel}[1]{#1}% +\define@key[psset]{optexp}{labelangle}{% + \pst@checknum{#1}\POE@key@labelangle +} +\define@key[psset]{optexp}{labeloffset}{% + \pst@checknum{#1}\POE@key@labeloffset +} +\define@key[psset]{optexp}{labelstyle}{% + \def\POE@key@labelstyle{#1}% +} +\define@key[psset]{optexp}{labelalign}{% + \def\POE@key@labelalign{#1}% +} +\define@choicekey+[psset]{optexp}{labelref}% + [\val\nr]{absolute,relative,relgrav,global}% + {% + \ifcase\nr\relax + \let\POE@key@labelref\POE@str@global + \else + \def\POE@key@labelref{#1}% + \fi + }{% + \PackageError{pst-optexp}% + {Unknown value '\val' for labelref}% +}% +\define@choicekey*+[psset]{optexp}{innerlabel}% + [\val\nr]{true}[true]% + {\ifcase\nr\relax + \psset[optexp]{labeloffset=0, labelref=relative, labelalign=c}% + \fi} + {\PackageError{pst-optexp}{Unknown value '\val' for innerlabel}}% +\define@key[psset]{optexp}{label}{% + \pst@expandafter\POE@psset@@label{#1} {} {} {} {} {}\@nil +}% +\def\POE@psset@@label#1 #2 #3 #4 #5\@nil{% + \edef\POE@temp{#4}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{labelref=#4}% + \fi + \fi + \edef\POE@temp{#3}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{labelalign=#3}% + \fi + \fi + \edef\POE@temp{#2}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{labelangle=#2}% + \fi + \fi + \edef\POE@temp{#1}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{labeloffset=#1}% + \fi + \fi +}% +% \end{macrocode} +% This is for internal use only, it sets the reference angle for the \opt{labelangle} parameter and can be different for some components. +% \begin{macrocode} +\define@key[psset]{optexp}{ref@angle}{% + \pst@checknum{#1}\POE@key@labelrefangle +}% +\psset[optexp]{% + labeloffset=0.8, + labelangle=0, + labelstyle=, + labelalign=c, + labelref=relgrav, + ref@angle=180 +}% +% \end{macrocode} +% External node +% \begin{macrocode} +\define@choicekey+[psset]{optexp}{extnodealign}% + [\val\nr]{rel,abs,relative,absolute}% + {% + \ifcase\nr\relax + \let\POE@key@extnodealign\POE@str@relative + \or + \let\POE@key@extnodealign\POE@str@absolute + \else + \def\POE@key@extnodealign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for extnodealign}} +% \end{macrocode} +% This part was copied and adapted from \cs{psset@@ref} from pstricks.tex +% \begin{macrocode} +\define@key[psset]{optexp}{extnodes}{% + \edef\POE@key@extnode{#1}% + \ifx\@empty\POE@key@extnode + \edef\POE@key@extnode@cnt{1}% + \edef\POE@key@extnode@xrefs{0 }% + \edef\POE@key@extnode@yrefs{0 }% + \else + \def\POE@key@extnode@xrefs{}% + \def\POE@key@extnode@yrefs{}% + \psForeach{\POE@tempD}{#1,}{% + \ifx\POE@tempD\@empty + \advance\psLoopIndex by -1 + \else + \pst@expandafter\POE@psset@@extnode{\POE@tempD}\@empty,,\@nil + \edef\POE@key@extnode@xrefs{\POE@key@extnode@xrefs\POE@key@extnode@xref\space}% + \edef\POE@key@extnode@yrefs{\POE@key@extnode@yrefs\POE@key@extnode@yref\space}% + \fi + }% + \edef\POE@key@extnode@cnt{\the\psLoopIndex}% + \fi +}% +% \end{macrocode} +% Need to have two options 'extnode' and 'extnodes' to allow extnode={-0.5,1} without +% \begin{macrocode} +\define@key[psset]{optexp}{extnode}{% + \edef\POE@key@extnode{#1}% + \edef\POE@key@extnode@cnt{1}% + \ifx\@empty\POE@key@extnode + \edef\POE@key@extnode@xrefs{0 }% + \edef\POE@key@extnode@yrefs{0 }% + \else + \pst@expandafter\POE@psset@@extnode{#1}\@empty,,\@nil + \edef\POE@key@extnode@xrefs{\POE@key@extnode@xref}% + \edef\POE@key@extnode@yrefs{\POE@key@extnode@yref}% + \fi +}% +\def\POE@key@extnode@xref{0}% +\def\POE@key@extnode@yref{0}% +\def\POE@psset@@extnode#1#2,#3,#4\@nil{% + \def\POE@key@extnode@xref{0}% + \def\POE@key@extnode@yref{0}% + \ifx\@empty#3\@empty + \@nameuse{POE@getref@#1}% + \@nameuse{POE@getref@#2}% + \else + \pst@checknum{#1#2}\POE@key@extnode@xref% + \pst@checknum{#3}\POE@key@extnode@yref% + \fi +}% +\def\POE@getref@c{}% +\def\POE@getref@t{\def\POE@key@extnode@yref{1}}% +\def\POE@getref@b{\def\POE@key@extnode@yref{-1}}% +\def\POE@getref@l{\def\POE@key@extnode@xref{-1}}% +\def\POE@getref@r{\def\POE@key@extnode@xref{1}}% +\psset[optexp]{% + extnode=\@empty, + extnodealign=absolute +}% +% \end{macrocode} +% Set the rotation reference point. For this to work properly, the components +% must define a proper \cs{component@ref} macro which sets the origin and +% sizes. See below for detailed information. +% \begin{macrocode} +\define@key[psset]{optexp}{rotateref}{% + \def\POE@temp{#1}% + \ifx\@empty\POE@temp\else + \pst@expandafter\POE@psset@@rotateref{#1}\@empty,,\@nil + \fi +}% +\def\POE@key@rotate@xref{0}% +\def\POE@key@rotate@yref{0}% +\def\POE@psset@@rotateref#1#2,#3,#4\@nil{% + \def\POE@key@rotate@xref{0}% + \def\POE@key@rotate@yref{0}% + \ifx\@empty#3\@empty + \@nameuse{POE@getref@rotate@#1}% + \@nameuse{POE@getref@rotate@#2}% + \else + \pst@checknum{#1#2}\POE@key@rotate@xref% + \pst@checknum{#3}\POE@key@rotate@yref% + \fi}% +\def\POE@getref@rotate@c{}% +\def\POE@getref@rotate@t{\def\POE@key@rotate@yref{1}}% +\def\POE@getref@rotate@b{\def\POE@key@rotate@yref{-1}}% +\def\POE@getref@rotate@l{\def\POE@key@rotate@xref{-1}}% +\def\POE@getref@rotate@r{\def\POE@key@rotate@xref{1}}% +\psset[optexp]{rotateref=c}% +% \end{macrocode} +% Naming parameters. +% \begin{macrocode} +\define@choicekey*[psset]{optexp}{namingscheme}% + [\val\nr]{old,new}[new]{% + \ifcase\nr\relax +% \end{macrocode} +% Use the old naming scheme which was used in version 2.x. +% \begin{macrocode} + \edef\POE@str@basicname@default{tempNode}% + \edef\POE@str@basicname@prefix{}% + \gdef\POE@str@basicname@sep{Intern}% + \edef\POE@str@extnode@postfix{ExtNode}% + \or + \edef\POE@str@basicname@default{@}% + \edef\POE@str@basicname@prefix{OE@}% + \gdef\POE@str@basicname@sep{}% + \edef\POE@str@extnode@postfix{Ext}% + \fi +}% +\psset[optexp]{namingscheme=new}% +\define@key[psset]{optexp}{b@sicname}{% + \edef\POE@key@b@sicname{\POE@str@basicname@prefix#1}% +}% +\define@key[psset]{optexp}{compname}{% + \ifPOE@insideobj\else + \PackageError{pst-optexp}{compname allowed only inside an object} + \fi + \edef\POE@temp{#1}% + \ifx\POE@temp\@empty + \edef\POE@key@compname{\the\POE@cnt}% + \else + \edef\POE@key@compname{#1}% + \fi +% \end{macrocode} +% check if compname was already defined. +% \begin{macrocode} + \@expandtwoargs\in@{,\POE@key@compname,}{,\POE@complist,}% + \ifin@ + \PackageWarning{pst-optexp}{% + ^^Jcompname '\POE@key@compname' already used,\MessageBreak + previous nodes will be overwritten!^^J + }% + \else +% \end{macrocode} +% +% Use definition of \cs{XKV@addtolist@x} with an \cs{xdef} instead of \cs{edef} in order to keep the bookkeeping global. +% \begin{macrocode} + \xdef\POE@complist{% + \POE@key@compname\ifx\POE@complist\@empty\else,\fi\POE@complist + }% + \fi +}% +\POE@insideobjtrue +\psset[optexp]{compname=\@empty} +\POE@insideobjfalse +% \end{macrocode} +% Error handling. +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{pswarning}[true]{} +\psset[optexp]{pswarning=false}% +% \end{macrocode} +% +% \subsection{Free-ray component parameters} +% Lens +% \begin{macrocode} +\define@key[psset]{optexp}{lensheight}{% + \pst@checknum{#1}\POE@key@lensheight +} +\define@key[psset]{optexp}{lenswidth}{% + \pst@checknum{#1}\POE@key@lenswidth + \ifdim\POE@key@lenswidth pt > 0pt + \psset[optexp]{thicklens=true} + \fi +} +\define@key[psset]{optexp}{lensradiusleft}{% + \pst@checknum{#1}\POE@key@lensradiusleft +} +\define@key[psset]{optexp}{lensradiusright}{% + \pst@checknum{#1}\POE@key@lensradiusright +} +\define@boolkey[psset]{optexp}[POE@]{thicklens}[true]{} +\define@key[psset]{optexp}{lensradius}{% + \pst@expandafter\POE@psset@@lensradius{#1} {} {} {}\@nil +}% +\def\POE@psset@@lensradius#1 #2 #3\@nil{% + \edef\POE@temp{#1}% + \ifx\POE@temp\@empty\else + \psset[optexp]{lensradiusleft=#1}% + \fi + \edef\POE@temp{#2}% + \ifx\POE@temp\@empty + \psset[optexp]{lensradiusright=#1}% + \else + \psset[optexp]{lensradiusright=#2}% + \fi +}% +\define@key[psset]{optexp}{lens}{% + \pst@expandafter\POE@psset@@lens{#1} {} {} {} {} {}\@nil +}% +\def\POE@psset@@lens#1 #2 #3 #4 #5\@nil{% + \edef\POE@temp{#4}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{lenswidth=#4}% + \fi + \fi + \edef\POE@temp{#3}% + \ifx\POE@temp\@empty\else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{lensheight=#3} + \fi + \fi + \edef\POE@temp{#2}% + \ifx\POE@temp\@empty + \psset[optexp]{lensradiusright=#1}% + \else + \expandafter\ifx\POE@temp.\else + \psset[optexp]{lensradiusright=#2}% + \fi + \fi + \edef\POE@temp{#1}% + \expandafter\ifx\POE@temp.\else + \psset[optexp]{lensradiusleft=#1}% + \fi +}% +\psset[optexp]{% + lenswidth=0, + lensheight=1, + lensradiusleft=1, + lensradiusright=1 +}% +% \end{macrocode} +% +% \begin{macrocode} +\define@key[psset]{optexp}{asphereheight}{% + \pst@checknum{#1}\POE@key@asphereheight +}% +\define@key[psset]{optexp}{aspherewidth}{% + \pst@checknum{#1}\POE@key@aspherewidth +}% +\define@key[psset]{optexp}{asphereradiusleft}{% + \pst@checknum{#1}\POE@key@asphereradiusleft +}% +\define@key[psset]{optexp}{asphereradiusright}{% + \pst@checknum{#1}\POE@key@asphereradiusright +}% +\define@key[psset]{optexp}{asphereconstant}{% + \pst@checknum{#1}\POE@key@asphereconstant +}% +\define@key[psset]{optexp}{aspherecoefficients}{% + \pst@expandafter\POE@psset@@aspherecoefficients{#1} {} {} {} {} {}\@nil +}% +\def\POE@psset@@aspherecoefficients#1 #2 #3 #4 #5\@nil{% + \def\POE@key@asphereAfour{0}% + \def\POE@key@asphereAsix{0}% + \def\POE@key@asphereAeight{0}% + \def\POE@key@asphereAten{0}% + \ifx\\#1\\\else + \def\POE@key@asphereAfour{#1}% + \ifx\\#2\\\else + \def\POE@key@asphereAsix{#2}% + \ifx\\#3\\\else + \def\POE@key@asphereAeight{#3}% + \ifx\\#4\\\else + \def\POE@key@asphereAten{#4}% + \fi + \fi + \fi + \fi +}% +\psset[optexp]{% + aspherewidth=0, + asphereheight=1, + asphereconstant=-1, + asphereradiusleft=1, + aspherecoefficients=0, + asphereradiusright=0 +} +% \end{macrocode} +% Pinhole +% \begin{macrocode} +\define@key[psset]{optexp}{innerheight}{% + \pst@checknum{#1}\POE@key@innerheight +} +\define@key[psset]{optexp}{outerheight}{% + \pst@checknum{#1}\POE@key@outerheight +} +\define@key[psset]{optexp}{phlinewidth}{% + \edef\POE@key@phlinewidth{#1}% +} +\define@key[psset]{optexp}{phwidth}{% + \edef\POE@key@phwidth{#1}% +} +\psset[optexp]{% + phlinewidth=2\pslinewidth, + phwidth=0, + outerheight=1, + innerheight=0.1 +}% +% \end{macrocode} +% Crystal +% \begin{macrocode} +\define@key[psset]{optexp}{crystalwidth}{% + \pst@checknum{#1}\POE@key@crystalwidth +} +\define@key[psset]{optexp}{crystalheight}{% + \pst@checknum{#1}\POE@key@crystalheight +} +\define@key[psset]{optexp}{crystalsize}{% + \pst@expandafter\POE@psset@@crystalsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@crystalsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'crystalsize' requires two numbers.}% + \fi + \psset[optexp]{crystalwidth=#1}% + \psset[optexp]{crystalheight=#2}% +}% +\define@key[psset]{optexp}{caxislength}{% + \pst@checknum{#1}\POE@key@caxislength +} +\define@boolkey[psset]{optexp}[POE@]{voltage}[true]{} +\define@boolkey[psset]{optexp}[POE@]{caxisinv}[true]{} +\define@boolkey[psset]{optexp}[POE@]{lamp}[true]{} +\define@key[psset]{optexp}{lampscale}{% + \pst@checknum{#1}\POE@key@lampscale + \pst@divide{\POE@key@lampscale pt}{0.3pt}{\POE@key@lampscale} + \addtopsstyle{CrystalLamp}{unit=\POE@key@lampscale} + \PackageWarning{pst-optexp}{% + Parameter 'lampscale' is deprecated, \MessageBreak + use style 'CrystalLamp' instead.}% +} +\psset[optexp]{% + crystalwidth=1.4, + crystalheight=0.6, + caxislength=0.3 +}% +% \end{macrocode} +% Box +% \begin{macrocode} +\define@key[psset]{optexp}{optboxwidth}{% + \pst@checknum{#1}\POE@key@optboxwidth +} +\define@key[psset]{optexp}{optboxheight}{% + \pst@checknum{#1}\POE@key@optboxheight +} +\define@key[psset]{optexp}{optboxsize}{% + \pst@expandafter\POE@psset@@optboxsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@optboxsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'optboxsize' requires two numbers.}% + \fi + \psset[optexp]{optboxwidth=#1, optboxheight=#2}% +}% +\psset[optexp]{optboxsize=1.4 0.8}% +% \end{macrocode} +% +% Box +% \begin{macrocode} +\define@key[psset]{optexp}{sourcewidth}{% + \pst@checknum{#1}\POE@key@sourcewidth +} +\define@key[psset]{optexp}{sourceheight}{% + \pst@checknum{#1}\POE@key@sourceheight +} +\define@key[psset]{optexp}{sourcesize}{% + \pst@expandafter\POE@psset@@sourcesize{#1} {} {} {}\@nil +}% +\def\POE@psset@@sourcesize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'sourcesize' requires two numbers.}% + \fi + \psset[optexp]{sourcewidth=#1, sourceheight=#2}% +}% +\psset[optexp]{sourcesize=1.4 0.8}% +% \end{macrocode} +% +% arrowbox +% \begin{macrocode} +\define@key[psset]{optexp}{arrowcompwidth}{% + \pst@checknum{#1}\POE@key@arrowcompwidth +} +\define@key[psset]{optexp}{arrowcompheight}{% + \pst@checknum{#1}\POE@key@arrowcompheight +} +\define@key[psset]{optexp}{arrowcompsize}{% + \pst@expandafter\POE@psset@@arrowcompsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@arrowcompsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \psset[optexp]{arrowcompwidth=#1, arrowcompheight=#1}% + \else + \psset[optexp]{arrowcompwidth=#1, arrowcompheight=#2}% + \fi +}% +\define@key[psset]{optexp}{arrowcompangle}{% + \pst@checknum{#1}\POE@key@arrowcompangle +}% +\define@choicekey+[psset]{optexp}{arrowcompshape}% + [\val\nr]{circle, rectangle}% + {\edef\POE@key@arrowcompshape{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for arrowcompshape}} +\psset[optexp]{% + arrowcompsize=1.4 0.8, + arrowcompangle=70, + arrowcompshape=rectangle +}% +\newpsstyle{ArrowCompStyle}{arrowinset=0, arrows=->}% +% \end{macrocode} +% BarBox +% \begin{macrocode} +\define@key[psset]{optexp}{barcompwidth}{% + \pst@checknum{#1}\POE@key@barcompwidth +} +\define@key[psset]{optexp}{barcompheight}{% + \pst@checknum{#1}\POE@key@barcompheight +} +\define@key[psset]{optexp}{barcompsize}{% + \pst@expandafter\POE@psset@@barcompsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@barcompsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \psset[optexp]{barcompwidth=#1, barcompheight=#1}% + \else + \psset[optexp]{barcompwidth=#1, barcompheight=#2}% + \fi +}% +\define@key[psset]{optexp}{barcompangle}{% + \pst@checknum{#1}\POE@key@barcompangle +}% +\define@choicekey+[psset]{optexp}{barcompshape}% + [\val\nr]{circle, rectangle}% + {\edef\POE@key@barcompshape{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for barcompshape}} +\psset[optexp]{% + barcompsize=1.4 0.8, + barcompangle=70, + barcompshape=rectangle +}% +\newpsstyle{BarCompStyle}{}% +% \end{macrocode} +% +% Plate +% \begin{macrocode} +\define@key[psset]{optexp}{platelinewidth}{% + \edef\POE@key@platelinewidth{#1}% +} +\define@key[psset]{optexp}{plateheight}{% + \pst@checknum{#1}\POE@key@plateheight +} +\psset[optexp]{% + plateheight=1, + platelinewidth=2\pslinewidth +}% +% \end{macrocode} +% Optical retardation plate, the height is the same as for \cs{optplate}. +% \begin{macrocode} +\define@key[psset]{optexp}{platewidth}{% + \pst@checknum{#1}\POE@key@platewidth +} +\define@key[psset]{optexp}{platesize}{% + \pst@expandafter\POE@psset@@platesize{#1} {} {} {}\@nil +}% +\def\POE@psset@@platesize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'platesize' requires two numbers.}% + \fi + \psset[optexp]{platewidth=#1, plateheight=#2}% +}% +\psset[optexp]{platewidth=0.1}% +% \end{macrocode} +% Detector +% \begin{macrocode} +\define@key[psset]{optexp}{detsize}{% + \pst@expandafter\POE@psset@@detsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@detsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@detsize + \else + \let\POE@key@detsize\@empty + \pst@checknum{#1}\POE@key@detwidth + \pst@checknum{#2}\POE@key@detheight + \fi +}% +\define@choicekey*+[psset]{optexp}{dettype}[\val\nr]{round,diode}% + {\edef\POE@key@dettype{\val}} + {\PackageError{pst-optexp}{Unknown value '\val' for dettype}} +\newpsstyle{DetectorStyle}{} +\psset[optexp]{% + detsize=0.8, + dettype=round +}% +% \end{macrocode} +% Polarization +% \begin{macrocode} +\define@key[psset]{optexp}{polsize}{% + \pst@checknum{#1}\POE@key@polsize +} +\define@key[psset]{optexp}{pollinewidth}{% + \edef\POE@key@pollinewidth{#1}% + \PackageWarning{pst-optexp}{% + Parameter 'pollinewidth' is deprecated, \MessageBreak + use style 'Polarization'.}% +}% +% \end{macrocode} +% This is defined manually, to avoid printing the warning inside the key definition above. +% \begin{macrocode} +\def\POE@key@pollinewidth{0.7\pslinewidth}% +\newpsstyle{Polarization}{% + linewidth=\POE@key@pollinewidth, + arrowscale=0.8, dotsize=3\pslinewidth} +\define@choicekey+[psset]{optexp}{poltype}% + [\val\nr]{parallel,misc,perp,rcirc,lcirc}% + {\edef\POE@key@poltype{#1}} + {\PackageError{pst-optexp}{Unknown value '\val' for poltype}% +} +\psset[optexp]{% + poltype=parallel, + polsize=0.6 +}% +% \end{macrocode} +% Optical diode +% \begin{macrocode} +\define@key[psset]{optexp}{optdiodesize}{% + \pst@checknum{#1}\POE@key@optdiodesize +} +\psset[optexp]{optdiodesize=0.8}% +% \end{macrocode} +% Dove prism +% \begin{macrocode} +\define@key[psset]{optexp}{doveprismsize}{% + \pst@expandafter\POE@psset@@doveprismsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@doveprismsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@doveprismheight + \pstFPmul\POE@key@doveprismwidth{3}{#1} + \else + \pst@checknum{#1}\POE@key@doveprismwidth + \pst@checknum{#2}\POE@key@doveprismheight + \fi +}% +\psset[optexp]{doveprismsize=0.6}% +% \end{macrocode} +% Glan-Thompson prism +% \begin{macrocode} +\define@key[psset]{optexp}{glanthompsongap}{% + \pst@checknum{#1}\POE@key@glanthompsongap +}% +\define@key[psset]{optexp}{glanthompsonwidth}{% + \pst@checknum{#1}\POE@key@glanthompsonwidth +}% +\define@key[psset]{optexp}{glanthompsonheight}{% + \pst@checknum{#1}\POE@key@glanthompsonheight +}% +\define@key[psset]{optexp}{glanthompsonsize}{% + \pst@expandafter\POE@psset@@glanthompsonsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@glanthompsonsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'glanthompsonsize' requires two numbers.}% + \fi + \psset[optexp]{glanthompsonwidth=#1, glanthompsonheight=#2}% +}% +\psset[optexp]{% + glanthompsongap=0, + glanthompsonsize=1 0.5 +}% +% \end{macrocode} +% Beamsplitter +% \begin{macrocode} +\define@key[psset]{optexp}{bssize}{% + \pst@checknum{#1}\POE@key@bssize +} +\define@key[psset]{optexp}{bsstyle}{% + \edef\POE@key@bsstyle{#1}% +} +\psset[optexp]{% + bssize=0.8, + bsstyle=cube +}% +% \end{macrocode} +% Mirror +% \begin{macrocode} +\define@key[psset]{optexp}{mirrorwidth}{% + \pst@checknum{#1}\POE@key@mirrorwidth +} +\define@key[psset]{optexp}{mirrorlinewidth}{% + \edef\POE@key@mirrorlinewidth{#1}% +} +\define@choicekey*[psset]{optexp}{mirrortype}% + [\val\nr]{piezo,extended,plain,semitrans}{% + \edef\POE@key@mirrortype{#1}% +} +\define@key[psset]{optexp}{mirrordepth}{% + \pst@checknum{#1}\POE@key@mirrordepth +} +\define@key[psset]{optexp}{mirrorradius}{% + \pst@expandafter\POE@psset@@mirrorradius{#1} {} {} {}\@nil +}% +\def\POE@psset@@mirrorradius#1 #2 #3\@nil{% + \pst@checknum{#1}\POE@key@mirrorradius + \ifx\\#2\\% + \def\POE@key@mirrorradiusB{}% + \else + \pst@checknum{#2}\POE@key@mirrorradiusB + \ifdim\POE@key@mirrorradiusB pt=0pt\else + \PackageWarning{optexp}{% + The second value for option 'mirrorradius' must be 0.}% + \fi + \fi +}% +\define@boolkey[psset]{optexp}[POE@]{variable}[true]{} +\psset[optexp]{% + mirrorwidth=1, + mirrordepth=0.15, + mirrorradius=0, + mirrortype=plain, + mirrorlinewidth=2\pslinewidth +}% +% \end{macrocode} +% +% Parabolic mirror +% \begin{macrocode} +\define@key[psset]{optexp}{parmirrorwidth}{% + \pst@checknum{#1}\POE@key@parmirrorwidth +} +\define@key[psset]{optexp}{parmirrorheight}{% + \pst@checknum{#1}\POE@key@parmirrorheight +} +\psset[optexp]{% + parmirrorwidth=1, + parmirrorheight=1 +}% +% \end{macrocode} +% +% Off-axis parabolic mirror +% \begin{macrocode} +\define@key[psset]{optexp}{oapmirroraperture}{% + \pst@expandafter\POE@psset@@oapmirroraperture{#1} {} {} {}\@nil +}% +\def\POE@psset@@oapmirroraperture#1 #2 #3\@nil{% + \ifx\\#2\\% + \def\POE@key@oapmirroraperture@outer{#1 0.5 mul} + \def\POE@key@oapmirroraperture@inner{#1 0.5 mul} + \else + \pst@checknum{#1}\POE@key@oapmirroraperture@inner + \pst@checknum{#2}\POE@key@oapmirroraperture@outer + \fi +}% +\psset[optexp]{oapmirroraperture=1} +% \end{macrocode} +% +% Axicon +% \begin{macrocode} +\define@key[psset]{optexp}{axiconheight}{% + \pst@checknum{#1}\POE@key@axiconheight +}% +\define@key[psset]{optexp}{axiconwidth}{% + \pst@checknum{#1}\POE@key@axiconwidth +}% +\define@key[psset]{optexp}{axiconangle}{% + \pst@checknum{#1}\POE@key@axiconangle +}% +\psset[optexp]{axiconheight=1.5, axiconwidth=0.4, axiconangle=10} +% \end{macrocode} +% +% Wedge +% \begin{macrocode} +\define@key[psset]{optexp}{wedgeangles}{% + \pst@expandafter\POE@psset@@wedgeangles{#1} {} {} {}\@nil +}% +\def\POE@psset@@wedgeangles#1 #2 #3\@nil{% + \pst@checknum{#1}\POE@key@wedgeangleleft + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@wedgeangleright + \else + \pst@checknum{#2}\POE@key@wedgeangleright + \fi +}% +\define@key[psset]{optexp}{wedgeangleleft}{% + \pst@checknum{#1}\POE@key@wedgeangleleft +}% +\define@key[psset]{optexp}{wedgeangleright}{% + \pst@checknum{#1}\POE@key@wedgeangleright +}% +\define@key[psset]{optexp}{wedgeheight}{% + \pst@checknum{#1}\POE@key@wedgeheight +}% +\define@key[psset]{optexp}{wedgewidth}{% + \pst@checknum{#1}\POE@key@wedgewidth +}% +\psset[optexp]{% + wedgeangles=0 10, + wedgeheight=0.8, + wedgewidth=0 +}% +% \end{macrocode} +% Grating +% +% These are the old \opt{optgrid*} parameters, which have been deprecated. +% \begin{macrocode} +\define@key[psset]{optexp}{optgridcount}{% + \pst@checknum{#1}\POE@key@gratingcount + \PackageWarning{pst-optexp}{% + Parameter 'optgridcount' is deprecated,\MessageBreak + use 'gratingcount' instead.}% +}% +\define@key[psset]{optexp}{optgridwidth}{% + \pst@checknum{#1}\POE@key@gratingwidth + \PackageWarning{pst-optexp}{% + Parameter 'optgridwidth' is deprecated,\MessageBreak + use 'gratingwidth' instead.}% +}% +\define@key[psset]{optexp}{optgridheight}{% + \pst@checknum{#1}\POE@key@gratingheight + \PackageWarning{pst-optexp}{% + Parameter 'optgridheight' is deprecated,\MessageBreak + use 'gratingheight' instead.}% +}% +\define@choicekey*[psset]{optexp}{optgridtype}% + [\val\nr]{binary,blazed}{% + \edef\POE@key@gratingtype{#1}% + \PackageWarning{pst-optexp}{% + Parameter 'optgridtype' is deprecated,\MessageBreak + use 'gratingtype' instead.}% +}% +\define@key[psset]{optexp}{optgriddepth}{% + \pst@checknum{#1}\POE@key@gratingdepth + \PackageWarning{pst-optexp}{% + Parameter 'optgriddepth' is deprecated,\MessageBreak + use 'gratingdepth' instead.}% +}% +\define@key[psset]{optexp}{optgridlinewidth}{% + \edef\POE@key@gratinglinewidth{#1}% + \PackageWarning{pst-optexp}{% + Parameter 'optgridlinewidth' is deprecated,\MessageBreak + use 'gratinglinewidth' instead.}% +}% +% \end{macrocode} +% These are the new grating parameters. +% \begin{macrocode} +\define@key[psset]{optexp}{gratingcount}{% + \pst@checknum{#1}\POE@key@gratingcount +} +\define@key[psset]{optexp}{gratingwidth}{% + \pst@checknum{#1}\POE@key@gratingwidth +} +\define@key[psset]{optexp}{gratingheight}{% + \pst@checknum{#1}\POE@key@gratingheight +} +\define@choicekey*[psset]{optexp}{gratingtype}% + [\val\nr]{binary,blazed}{% + \edef\POE@key@gratingtype{#1}% +} +\define@key[psset]{optexp}{gratingdepth}{% + \pst@checknum{#1}\POE@key@gratingdepth +} +\define@key[psset]{optexp}{gratinglinewidth}{% + \edef\POE@key@gratinglinewidth{#1}% +} +\define@choicekey+[psset]{optexp}{gratingalign}% + [\val\nr]{t,c,top,center}% + {% + \ifcase\nr\relax + \let\POE@key@gratingalign\POE@str@top + \or + \let\POE@key@gratingalign\POE@str@center + \else + \def\POE@key@gratingalign{#1}% + \fi}% + {\PackageError{pst-optexp}{Unknown value '\val' for gratingalign}} +\define@boolkey[psset]{optexp}[POE@]{reverse}[true]{} +\psset[optexp]{% + gratingcount=10, + gratingwidth=1, + gratingheight=0.15, + gratingdepth=0.075, + gratingtype=blazed, + gratinglinewidth=0.7\pslinewidth, + gratingalign=t +}% +% \end{macrocode} +% Penta prism +% \begin{macrocode} +\define@key[psset]{optexp}{pentaprismsize}{% + \pst@checknum{#1}\POE@key@pentaprismsize +} +\psset[optexp]{pentaprismsize=0.7} +% \end{macrocode} +% Right-angle prism +% \begin{macrocode} +\define@key[psset]{optexp}{raprismsize}{% + \pst@checknum{#1}\POE@key@raprismsize +} +\define@choicekey+[psset]{optexp}{raprismalign}[\val\nr]% + {auto,center}% + {\def\POE@key@raprismalign{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for raprismalign}}% +\psset[optexp]{% + raprismsize=1.5, + raprismalign=auto +} +% \end{macrocode} +% Prism +% \begin{macrocode} +\define@key[psset]{optexp}{prismsize}{% + \pst@checknum{#1}\POE@key@prismsize +} +\define@key[psset]{optexp}{prismangle}{% + \pst@checknum{#1}\POE@key@prismangle +} +\define@choicekey+[psset]{optexp}{prismalign}[\val\nr]% + {auto,center}% + {\def\POE@key@prismalign{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for prismalign}}% +\define@choicekey+[psset]{optexp}{prismtype}[\val\nr]% + {transmittive, reflective, coupling}% + {\def\POE@key@prismtype{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for prismtype}}% +\psset[optexp]{% + prismsize=1, + prismangle=60, + prismalign=auto, + prismtype=transmittive +}% +% \end{macrocode} +% +% Optdipole and Opttripole +% \begin{macrocode} +\define@key[psset]{optexp}{optdipolesize}{% + \pst@expandafter\POE@psset@@optdipolesize{#1} {} {} {}\@nil +}% +\def\POE@psset@@optdipolesize#1 #2 #3\@nil{% + \ifx\\#2\\% + \def\POE@key@optdipoleheight{0}% + \else + \pst@checknum{#2}\POE@key@optdipoleheight + \fi + \pst@checknum{#1}\POE@key@optdipolewidth +}% +\define@key[psset]{optexp}{optdipolecomp}{% + \def\POE@key@optdipolecomp{#1}% +} +\define@key[psset]{optexp}{opttripolecomp}{% + \def\POE@key@opttripolecomp{#1}% +} +\psset[optexp]{% + optdipolesize=0 0, + optdipolecomp=, + opttripolecomp=% +}% +% \end{macrocode} +% +% acousto-optic modulator +% \begin{macrocode} +\define@key[psset]{optexp}{aomwidth}{% + \pst@checknum{#1}\POE@key@aomwidth +}% +\define@key[psset]{optexp}{aomheight}{% + \pst@checknum{#1}\POE@key@aomheight +}% +\define@key[psset]{optexp}{aomsize}{% + \pst@expandafter\POE@psset@@aomsize{#1} {} {} {}\@nil +}% +\define@key[psset]{optexp}{aomgratingcount}{% + \edef\POE@key@aomgratingcount{#1}% +}% +\define@choicekey+[psset]{optexp}{aomalign}% + [\val\nr]{sym,symmetric,straight}% + {% + \ifcase\nr\relax + \let\POE@key@aomalign\POE@str@symmetric + \else + \def\POE@key@aomalign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for aomalign}}% +\define@choicekey+[psset]{optexp}{aomreflalign}% + [\val\nr]{perp,parallel}% + {\def\POE@key@aomreflalign{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for aomreflalign}}% +\def\POE@psset@@aomsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageWarning{pst-optexp}{% + Parameter 'aomsize' requires two numbers.}% + \fi + \psset[optexp]{aomwidth=#1, aomheight=#2}% +}% +\define@key[psset]{optexp}{aomcomp}{% + \def\POE@key@aomcomp{#1}% +}% +\define@key[psset]{optexp}{diffractionorders}{% + \def\POE@key@diffractionorders{#1}% +}% +\define@key[psset]{optexp}{beamdiffractionorder}{% + \def\POE@key@beamdiffractionorder{#1}% +}% +\psset[optexp]{% + aomsize=1.5 1, + aomcomp=default, + aomalign=sym, + aomreflalign=parallel, + aomgratingcount=9, + diffractionorders=2, + beamdiffractionorder= +}% +% \end{macrocode} +% +% \subsection{Parameters of fiber-optical components} +% \subsubsection{fiber} +% \begin{macrocode} +\define@key[psset]{optexp}{fiberloops}{% + \pst@checknum{#1}\POE@key@fiberloops +} +\define@key[psset]{optexp}{fiberloopradius}{% + \pst@checknum{#1}\POE@key@fiberloopradius +} +\define@key[psset]{optexp}{fiberloopsep}{% + \pst@checknum{#1}\POE@key@fiberloopsep +} +\psset[optexp]{% + fiberloops=3, + fiberloopradius=0.4, + fiberloopsep=0.2 +}% +% \end{macrocode} +% \subsubsection{optfilter} +% \begin{macrocode} +\define@key[psset]{optexp}{filtersize}{% + \pst@checknum{#1}\POE@key@filtersize +} +\define@choicekey+[psset]{optexp}{filtertype}[\val\nr]% + {bandstop,bandpass,lowpass,highpass}% + {\def\POE@key@filtertype{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for filtertype}} +\define@key[psset]{optexp}{filterangle}{% + \pst@checknum{#1}\POE@key@filterangle +} +\newpsstyle{FilterStyle}{} +\psset[optexp]{% + filterangle=0, + filtersize=0.8, + filtertype=bandpass +}% +% \end{macrocode} +% Polarization controller +% \begin{macrocode} +\define@key[psset]{optexp}{polcontrolsize}{% + \pst@checknum{#1}\POE@key@polcontrolsize +} +\define@choicekey+[psset]{optexp}{polcontroltype}[\val\nr]% + {linear,triangle}% + {\def\POE@key@polcontroltype{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for polcontroltype}} +\psset[optexp]{% + polcontrolsize=0.15, + polcontroltype=linear +}% +% \end{macrocode} +% +% \subsubsection{optamp} +% \begin{macrocode} +\define@key[psset]{optexp}{optampsize}{% + \pst@expandafter\POE@psset@@optampsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@optampsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@optampheight + \pstFPmul\POE@key@optampwidth{0.866}{#1} + \else + \pst@checknum{#1}\POE@key@optampwidth + \pst@checknum{#2}\POE@key@optampheight + \fi +}% +\psset[optexp]{optampsize=0.8} +% \end{macrocode} +% Mach-Zehnder modulator +% \begin{macrocode} +\define@key[psset]{optexp}{optmzmsize}{% + \pst@expandafter\POE@psset@@optmzmsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@optmzmsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@optmzmheight + \pstFPmul\POE@key@optmzmwidth{1.6}{#1} + \else + \pst@checknum{#1}\POE@key@optmzmwidth + \pst@checknum{#2}\POE@key@optmzmheight + \fi +}% +\psset[optexp]{optmzmsize=0.8} +% \end{macrocode} +% \subsubsection{Isolator} +% \begin{macrocode} +\define@key[psset]{optexp}{isolatorsize}{% + \pst@expandafter\POE@psset@@isolatorsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@isolatorsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@isolatorheight + \pstFPmul\POE@key@isolatorwidth{1.6}{#1} + \else + \pst@checknum{#1}\POE@key@isolatorwidth + \pst@checknum{#2}\POE@key@isolatorheight + \fi +}% +\psset[optexp]{isolatorsize=0.6}% +% \end{macrocode} +% Fiber polarizer +% \begin{macrocode} +\define@key[psset]{optexp}{fiberpolsize}{% + \pst@expandafter\POE@psset@@fiberpolsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@fiberpolsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@fiberpolheight + \pstFPmul\POE@key@fiberpolwidth{1.6}{#1} + \else + \pst@checknum{#1}\POE@key@fiberpolwidth + \pst@checknum{#2}\POE@key@fiberpolheight + \fi +}% +\psset[optexp]{fiberpolsize=0.6}% +% \end{macrocode} +% Optical switch +% \begin{macrocode} +\define@key[psset]{optexp}{switchsize}{% + \pst@expandafter\POE@psset@@switchsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@switchsize#1 #2 #3\@nil{% + \pst@checknum{#1}\POE@key@switchwidth + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@switchheight + \else + \pst@checknum{#2}\POE@key@switchheight + \fi +}% +\define@choicekey+[psset]{optexp}{switchstyle}% + [\val\nr]{opened,closed}% + {\edef\POE@key@switchstyle{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for switchstyle}} +\psset[optexp]{% + switchsize=0.8, + switchstyle=opened +}% +% \end{macrocode} +% \subsubsection{Fiber delay line} +% \begin{macrocode} +\define@key[psset]{optexp}{fdlsize}{% + \pst@expandafter\POE@psset@@fdlsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@fdlsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@fdlheight + \pstFPmul\POE@key@fdlwidth{1.6}{#1} + \else + \pst@checknum{#1}\POE@key@fdlwidth + \pst@checknum{#2}\POE@key@fdlheight + \fi +}% +\psset[optexp]{fdlsize=0.6}% +% \end{macrocode} +% Fiber collimator +% \begin{macrocode} +\define@key[psset]{optexp}{fibercolsize}{% + \pst@expandafter\POE@psset@@fibercolsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@fibercolsize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@fibercolheight + \pstFPmul\POE@key@fibercolwidth{0.866}{#1} + \else + \pst@checknum{#1}\POE@key@fibercolwidth + \pst@checknum{#2}\POE@key@fibercolheight + \fi +}% +\psset[optexp]{fibercolsize=0.3}% +% \end{macrocode} +% Optical Circulator +% \begin{macrocode} +\define@key[psset]{optexp}{optcircsize}{% + \pst@checknum{#1}\POE@key@optcircsize +}% +\define@key[psset]{optexp}{optcircangleA}{% + \pst@checknum{#1}\POE@key@optcircangleA +}% +\define@key[psset]{optexp}{optcircangleB}{% + \pst@checknum{#1}\POE@key@optcircangleB +}% +\define@key[psset]{optexp}{optcircangle}{% + \pst@expandafter\POE@psset@@optcircangle{#1} {} {} {}\@nil +}% +\def\POE@psset@@optcircangle#1 #2 #3\@nil{% + \ifx\\#2\\% + \PackageError{pst-optexp}{optcircangle requires two numbers}% + \else\ifx\\#1\\% + \PackageError{pst-optexp}{optcircangle requires two numbers}% + \else + \psset[optexp]{optcircangleA=#1, optcircangleB=#2}% + \fi\fi +}% +\psset[optexp]{% + optcircsize=0.8, + optcircangle=-160 -20 +}% +\newpsstyle{OptCircArrow}{unit=0.7, arrows=->, arrowinset=0} +% \end{macrocode} +% +% \subsubsection{Coupler} +% \begin{macrocode} +\define@key[psset]{optexp}{couplersize}{% + \pst@expandafter\POE@psset@@couplersize{#1} {} {} {}\@nil +}% +\def\POE@psset@@couplersize#1 #2 #3\@nil{% + \ifx\\#2\\% + \pstFPmul\POE@key@couplerheight{0.8}{#1} + \pstFPmul\POE@key@couplerwidth{2}{#1} + \else + \pst@checknum{#1}\POE@key@couplerwidth + \pst@checknum{#2}\POE@key@couplerheight + \fi +}% +\define@key[psset]{optexp}{couplersep}{% + \edef\POE@key@couplersep{#1}% +} +\define@choicekey+[psset]{optexp}{couplertype}% + [\val\nr]{none,elliptic,ellipse,cross,rectangle}% + {% + \edef\POE@key@couplertype{#1} + \ifx\POE@key@couplertype\POE@str@elliptic + \let\POE@key@couplertype\POE@str@ellipse + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for couplertype}} +\define@key[psset]{optexp}{align}{% + \psset[optexp]{coupleralign=#1}% + \PackageWarning{pst-optexp}{% + Parameter 'align' is deprecated,\MessageBreak + use 'coupleralign' instead.}% +} +\define@choicekey+[psset]{optexp}{coupleralign}% + [\val\nr]{t,b,c,top,bottom,center}% + {% + \ifcase\nr\relax + \let\POE@key@coupleralign\POE@str@top + \or + \let\POE@key@coupleralign\POE@str@bottom + \or + \let\POE@key@coupleralign\POE@str@center + \else + \def\POE@key@coupleralign{#1}% + \fi}% + {\PackageError{pst-optexp}{Unknown value '\val' for coupleralign}} +\psset[optexp]{% + couplersize=0.2, + couplersep=0.05, + coupleralign=center, + couplertype=elliptic +}% +% \end{macrocode} +% +% \subsection{Fiber box} +% +% \begin{macrocode} +\define@key[psset]{optexp}{fiberboxheight}{% + \pst@checknum{#1}\POE@key@fiberboxheight +}% +\define@key[psset]{optexp}{fiberboxwidth}{% + \pst@checknum{#1}\POE@key@fiberboxwidth +}% +\define@key[psset]{optexp}{fiberboxsize}{% + \pst@expandafter\POE@psset@@fiberboxsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@fiberboxsize#1 #2 #3\@nil{% + \psset[optexp]{fiberboxwidth=#1} + \ifx\\#2\\% + \psset[optexp]{fiberboxheight=0}% + \else + \psset[optexp]{fiberboxheight=#2}% + \fi +}% +\define@key[psset]{optexp}{fiberboxsepin}{% + \def\POE@key@fiberboxsepin{#1} +}% +\define@key[psset]{optexp}{fiberboxsepout}{% + \def\POE@key@fiberboxsepout{#1}% +}% +\define@key[psset]{optexp}{fiberboxcount}{% + \pst@expandafter\POE@psset@@fiberboxcount#1\@nil +}% +\def\POE@psset@@fiberboxcount#1x#2\@nil{% + \ifx\\#1\\% + \def\POE@key@fiberboxcountin{1}% + \else + \def\POE@key@fiberboxcountin{#1}% + \fi + \ifx\\#2\\% + \def\POE@key@fiberboxcountout{1}% + \else + \def\POE@key@fiberboxcountout{#2} + \fi +}% +\psset[optexp]{% + fiberboxsize=1, + fiberboxsepin=0.2, + fiberboxsepout=0.2, + fiberboxcount=2x2} +% \end{macrocode} +% +% \subsection{Electrical components} +% +% \subsubsection{elecmixer} +% \begin{macrocode} +\define@key[psset]{optexp}{elecmixersize}{% + \pst@checknum{#1}\POE@key@elecmixersize +}% +\psset[optexp]{elecmixersize=0.8}% +% \end{macrocode} +% +% \subsubsection{eleccoupler} +% \begin{macrocode} +\define@key[psset]{optexp}{eleccouplersize}{% + \pst@expandafter\POE@psset@@eleccouplersize{#1} {} {} {}\@nil +}% +\def\POE@psset@@eleccouplersize#1 #2 #3\@nil{% + \pst@checknum{#1}\POE@key@eleccouplerwidth + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@eleccouplerheight + \else + \pst@checknum{#2}\POE@key@eleccouplerheight + \fi +}% +\define@key[psset]{optexp}{eleccouplersep}{% + \edef\POE@key@eleccouplersep{#1}% +} +\define@choicekey+[psset]{optexp}{eleccouplertype}% + [\val\nr]{standard, directional}% + {\edef\POE@key@eleccouplertype{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for eleccouplertype}}% +\define@choicekey+[psset]{optexp}{eleccouplerinput}% + [\val\nr]{left, right}% + {\edef\POE@key@eleccouplerinput{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for eleccouplerinput}}% +\define@choicekey+[psset]{optexp}{eleccoupleralign}% + [\val\nr]{t,b,c,top,bottom,center}% + {% + \ifcase\nr\relax + \let\POE@key@eleccoupleralign\POE@str@top + \or + \let\POE@key@eleccoupleralign\POE@str@bottom + \or + \let\POE@key@eleccoupleralign\POE@str@center + \else + \def\POE@key@eleccoupleralign{#1}% + \fi}% + {\PackageError{pst-optexp}{Unknown value '\val' for eleccoupleralign}} +\psset[optexp]{% + eleccouplersize=0.8, + eleccouplersep={}, + eleccoupleralign=center, + eleccouplertype=standard, + eleccouplerinput=left +}% +% \end{macrocode} +% +% \begin{macrocode} +\define@key[psset]{optexp}{synthsize}{% + \pst@expandafter\POE@psset@@synthsize{#1} {} {} {}\@nil +}% +\def\POE@psset@@synthsize#1 #2 #3\@nil{% + \pst@checknum{#1}\POE@key@synthwidth + \ifx\\#2\\% + \pst@checknum{#1}\POE@key@synthheight + \else + \pst@checknum{#2}\POE@key@synthheight + \fi +}% +\define@key[psset]{optexp}{synthrectwidth}{% + \pst@checknum{#1}\POE@key@synthrectwidth +}% +\define@choicekey+[psset]{optexp}{synthshape}% + [\val\nr]{circle, rectangle}% + {\edef\POE@key@synthshape{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for synthshape}} +\define@choicekey+[psset]{optexp}{synthtype}% + [\val\nr]{sine, pulse, rectangle, triangle, sawtooth, custom}% + {\edef\POE@key@synthtype{#1}}% + {\PackageError{pst-optexp}{Unknown value '\val' for synthtype}} +\newpsstyle{SynthStyle}{} +\psset[optexp]{% + synthsize=0.8, + synthshape=circle, + synthtype=sine, + synthrectwidth=0.2 +}% +% \end{macrocode} +% +% \subsection{Beam-connection parameters} +% The keys related to the \cs{draw*} macros. +% +% Connect a component directly with its reference nodes using \cs{drawbeam}. +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{beam}[true]{} +% \end{macrocode} +% \begin{macrocode} +\define@key[psset]{optexp}{refractiveindex}{% + \psset[optexp]{n=#1}% + \PackageWarning{pst-optexp}{% + Option 'refractiveindex' is deprecated,\MessageBreak + use 'n' instead.}% +}% +\define@key[psset]{optexp}{n}{% + \POE@parsealg{n}#1\@nil +} +\def\POE@parsealg#1#2#3\@nil{% + \ifx#2*\relax + \POE@@parsealg#3\@nil + \expandafter\let\csname POE@key@#1\endcsname\POE@tempA + \else + \@namedef{POE@key@#1}{[#2#3] }% + \fi +} +\def\POE@@parsealg#1#2\@nil{% + \edef\POE@tempA{tx@Dict begin (#1#2) AlgParser end }% +} +\define@key[psset]{optexp}{beamangle}{% + \edef\POE@key@beamangle{#1}% +}% +\define@key[psset]{optexp}{beampos}{% + \edef\POE@key@beampos{#1}% +}% +\define@key[psset]{optexp}{beamdiv}{% + \edef\POE@key@beamdiv{#1}% +}% +\define@key[psset]{optexp}{beamwidth}{% + \edef\POE@key@beamwidth{#1}% +}% +\define@choicekey+[psset]{optexp}{beammode}% + [\val\nr]{trans,refl,reflective,transmittive,auto}% + {\ifcase\nr\relax + \let\POE@key@beammode\POE@str@transmittive + \or + \let\POE@key@beammode\POE@str@reflective + \else + \def\POE@key@beammode{#1}% + \fi}% + {\PackageError{pst-optexp}{Unknown value '\val' for beammode}} + +\define@boolkey[psset]{optexp}[POE@]{startinside}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{stopinside}[true]{}% +\define@key[psset]{optexp}{startinsidecount}{% + \pst@checknum{#1}\POE@key@startinsidecount +} +\define@key[psset]{optexp}{stopinsidecount}{% + \pst@checknum{#1}\POE@key@stopinsidecount +} +\define@boolkey[psset]{optexp}[POE@]{beaminsidefirst}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{beaminsidelast}[true]{}% +\define@choicekey+[psset]{optexp}{savebeampoints}% + [\val\nr]{true,false}[true]{% + \ifcase\nr\relax + \def\POE@key@savebeampoints{1}% + \or + \def\POE@key@savebeampoints{0}% + \fi + }{% + \ifnum9<1#1 + \def\POE@key@savebeampoints{#1}% + \else + \PackageError{pst-optexp}% + {savebeampoints must be a positive integer or 0}% + \fi + \@expandtwoargs\in@{,\POE@key@savebeampoints,}{,\POE@beamlist,}% + \ifin@\else + \xdef\POE@beamlist{% + \POE@key@savebeampoints + \ifx\POE@beamlist\@empty\else,\fi\POE@beamlist + }% + \fi +}% +\define@choicekey+[psset]{optexp}{loadbeampoints}% + [\val\nr]{true,false}[true]{% + \ifcase\nr\relax + \def\POE@key@loadbeampoints{1}% + \or + \def\POE@key@loadbeampoints{0}% + \fi + }{% + \ifnum9<1#1 + \def\POE@key@loadbeampoints{#1}% + \else + \PackageError{pst-optexp}% + {loadbeampoints must be a positive integer or 0}% + \fi + \@expandtwoargs\in@{,\POE@key@loadbeampoints,}{,\POE@beamlist,}% + \ifin@\else + \xdef\POE@beamlist{% + \POE@key@loadbeampoints + \ifx\POE@beamlist\@empty\else,\fi\POE@beamlist + }% + \fi +}% +\define@key[psset]{optexp}{loadbeam}[true]{% + \setkeys[psset]{optexp}{loadbeampoints=#1}% + \ifdim\POE@key@loadbeampoints pt>0pt + \POE@loadbeamtrue + \else + \POE@loadbeamfalse + \fi +}% +\define@key[psset]{optexp}{savebeam}[true]{% + \setkeys[psset]{optexp}{savebeampoints=#1}% + \ifdim\POE@key@savebeampoints pt>0pt + \POE@savebeamtrue + \else + \POE@savebeamfalse + \fi +}% +\define@boolkey[psset]{optexp}[POE@]{beaminside}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{allowbeaminside}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{forcebeaminside}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{raytrace}[true]{}% +\define@boolkey[psset]{optexp}[POE@]{useNA}[true]{}% +\define@choicekey+[psset]{optexp}{beamnodealign}% + [\val\nr]{vec, conn, vector, connection}% + {% + \ifcase\nr\relax + \let\POE@key@beamnodealign\POE@str@vector + \or + \let\POE@key@beamnodealign\POE@str@connection + \else + \def\POE@key@beamnodealign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for beamnodealign}} +\define@key[psset]{optexp}{beampathskip}{% + \pst@checknum{#1}\POE@key@beampathskip +}% +\define@key[psset]{optexp}{beampathcount}{% + \pst@getint{#1}\POE@key@beampathcount +}% +\define@choicekey+[psset]{optexp}{beamalign}% + [\val\nr]{rel,abs,relative,absolute,firstcomp}% + {% + \ifcase\nr\relax + \let\POE@key@beamalign\POE@str@relative + \or + \let\POE@key@beamalign\POE@str@absolute + \else + \def\POE@key@beamalign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for beamalign}} +\define@key[psset]{optexp}{ArrowInsideMinLength}{% + \def\POE@key@ArrowInsideMinLength{#1}% +}% +\define@key[psset]{optexp}{ArrowInsideMaxLength}{% + \def\POE@key@ArrowInsideMaxLength{#1}% +}% +\define@choicekey[psset]{optexp}{fadeto}[\val\nr]{white,black,transparency}{% + \def\POE@key@fadeto{#1}% +}% +\define@key[psset]{optexp}{fadefunc}{% + \def\POE@key@fadefunc{#1}% +}% +\define@key[psset]{optexp}{fadefuncname}{% + \def\POE@key@fadefuncname{#1}% +}% +\define@key[psset]{optexp}{fadepoints}{% + \def\POE@key@fadepoints{#1}% +}% +\def\psls@fade{% + \pst@optexpdict + \ifx\POE@key@fadefunc\@empty\else + /fadefunc@custom {\POE@key@fadefunc} def + \fi + /fadecorrect \ifx\POE@key@fadeto\POE@str@transparency 0 \else 0.1 \fi def + \pst@usecolor\pslinecolor + \POE@key@fadepoints\space + \psk@strokeopacityalpha + currentdict /fadeto@\POE@key@fadeto\space dup 3 1 roll known not { pop /fadeto@white } if load + currentdict /fadefunc@\POE@key@fadefuncname\space dup 3 1 roll known not { pop /fadefunc@linear } if load + FadeStroke + end +}% +\psset[optexp]{% + raytrace=true + ,useNA=true + ,beamnodealign=connection + ,startinside=false + ,stopinside=false + ,allowbeaminside=true + ,forcebeaminside=false + ,beaminside=true + ,beaminsidefirst=false + ,beaminsidelast=false + ,loadbeam=false + ,savebeam=true + ,loadbeampoints=false + ,savebeampoints=true + ,beamangle=0 + ,beampos=\@empty + ,beamalign=relative + ,beamwidth=0 + ,beamdiv=0 + ,beammode=auto + ,n=1.5 + ,beampathskip=0 + ,beampathcount=-1 + ,stopinsidecount=-1 + ,startinsidecount=-1 + ,ArrowInsideMinLength=0.2 + ,ArrowInsideMaxLength=-1 + ,fadepoints=200 + ,fadeto=white + ,fadefunc=\@empty + ,fadefuncname=linear +}% +% \end{macrocode} +% +% \subsection{Fiber-connection parameters} +% Select which fibers are drawn automatically. +% \begin{macrocode} +\define@key[psset]{optexp}{fiber}[all]{% + \POE@psset@fibercheck#1\@nil +} +% \end{macrocode} +% Check which components are affected by the fiber parameter. * is only for +% fiber-optical components, + refers to all components but the fiber-optical +% ones, otherwise all components are affected. +% \begin{macrocode} +\def\POE@psset@fibercheck#1#2\@nil{% + \ifx#1*\relax + \ifx\\#2\\% + \setkeys[psset]{optexp}{fiber@preset=all}% + \else + \setkeys[psset]{optexp}{fiber@preset=#2}% + \fi + \else\ifx#1+\relax + \ifx\\#2\\% + \setkeys[psset]{optexp}{fiber@all=all}% + \else + \setkeys[psset]{optexp}{fiber@all=#2}% + \fi + \POE@unset@wire + \else + \setkeys[psset]{optexp}{fiber@all=#1#2}% + \setkeys[psset]{optexp}{fiber@preset=#1#2}% + \POE@unset@wire + \fi\fi +}% +\def\POE@unset@wire{% + \ifPOE@fiberin@ + \setkeys[psset]{optexp}{wirepresetin@=false}% + \fi + \ifPOE@fiberout@ + \setkeys[psset]{optexp}{wirepresetout@=false}% + \fi + \ifPOE@fiberin@top + \setkeys[psset]{optexp}{wirepresetin@top=false}% + \fi + \ifPOE@fiberin@bottom + \setkeys[psset]{optexp}{wirepresetin@bottom=false}% + \fi + \ifPOE@fiberout@top + \setkeys[psset]{optexp}{wirepresetout@top=false}% + \fi + \ifPOE@fiberout@bottom + \setkeys[psset]{optexp}{wirepresetout@bottom=false}% + \fi +}% +% \end{macrocode} +% Set the fiber parameters for fiber-optical components only (use fiber=*...). +% \begin{macrocode} +\define@choicekey*+[psset]{optexp}{fiber@preset}% + [\val\nr]{false,none,true,all}[all]{% + \ifcase\nr\relax + \POE@getfiberpreset@none + \or + \POE@getfiberpreset@none + \or + \POE@getfiberpreset@all + \or + \POE@getfiberpreset@all + \fi +}{% + \ifx\@empty\val + \POE@getfiberpreset@none + \else + \pst@expandafter\POE@psset@@fiberpreset{#1}\@empty,,\@nil + \fi +}% +\def\POE@psset@@fiberpreset#1#2,#3,#4\@nil{% + \POE@getfiberpreset@all + \ifx\\#3\\% + \@nameuse{POE@getfiberpreset@#1}% + \@nameuse{POE@getfiberpreset@#2}% + \fi +}% +\def\POE@getfiberpreset@none{% + \setkeys[psset]{optexp}{% + fiberpresetin@=false, fiberpresetout@=false, + fiberpresetin@top=false, fiberpresetin@bottom=false, + fiberpresetout@top=false, fiberpresetout@bottom=false}% +}% +\def\POE@getfiberpreset@all{% + \setkeys[psset]{optexp}{% + fiberpresetin@, fiberpresetout@, + fiberpresetin@top, fiberpresetin@bottom, + fiberpresetout@top, fiberpresetout@bottom}% +}% +\def\POE@getfiberpreset@t{% + \setkeys[psset]{optexp}{% + fiberpresetin@bottom=false, fiberpresetout@bottom=false}% +}% +\def\POE@getfiberpreset@b{% + \setkeys[psset]{optexp}{% + fiberpresetin@top=false, fiberpresetout@top=false}% +}% +\def\POE@getfiberpreset@l{% + \setkeys[psset]{optexp}{% + fiberpresetout@=false, + fiberpresetout@top=false, + fiberpresetout@bottom=false}% +}% +\def\POE@getfiberpreset@r{% + \setkeys[psset]{optexp}{% + fiberpresetin@=false, + fiberpresetin@top=false, + fiberpresetin@bottom=false}% +}% +\let\POE@getfiberpreset@i\POE@getfiberpreset@l +\let\POE@getfiberpreset@o\POE@getfiberpreset@r +% \end{macrocode} +% +% This code is for all components, fiber-optical and free-ray. +% \begin{macrocode} +\define@choicekey*+[psset]{optexp}{fiber@all}% + [\val\nr]{false,none,true,all}[all]{% + \ifcase\nr\relax + \POE@getfiber@none + \or + \POE@getfiber@none + \or + \POE@getfiber@all + \or + \POE@getfiber@all + \fi +}{% + \ifx\@empty\val + \POE@getfiber@none + \else + \pst@expandafter\POE@psset@@fiber{#1}\@empty,,\@nil + \fi +}% +\def\POE@psset@@fiber#1#2,#3,#4\@nil{% + \POE@getfiber@all + \ifx\@empty#3\@empty + \@nameuse{POE@getfiber@#1}% + \@nameuse{POE@getfiber@#2}% + \fi +}% +\def\POE@getfiber@none{% + \setkeys[psset]{optexp}{% + fiberin@=false, fiberout@=false, + fiberin@top=false, fiberin@bottom=false, + fiberout@top=false, fiberout@bottom=false}% +}% +\def\POE@getfiber@all{% + \setkeys[psset]{optexp}{% + fiberin@, fiberout@, + fiberin@top, fiberin@bottom, + fiberout@top, fiberout@bottom}% +}% +\def\POE@getfiber@t{% + \setkeys[psset]{optexp}{% + fiberin@bottom=false, fiberout@bottom=false}% +}% +\def\POE@getfiber@b{% + \setkeys[psset]{optexp}{% + fiberin@top=false, fiberout@top=false}% +}% +\def\POE@getfiber@l{% + \setkeys[psset]{optexp}{% + fiberout@=false, fiberout@top=false, fiberout@bottom=false}% +}% +\def\POE@getfiber@r{% + \setkeys[psset]{optexp}{% + fiberin@=false, fiberin@top=false, fiberin@bottom=false}% +}% +\let\POE@getfiber@i\POE@getfiber@l +\let\POE@getfiber@o\POE@getfiber@r +% \end{macrocode} +% These are the internal boolkeys for the fiber choices done with \opt{fiberin}, +% \opt{fiberout} and \opt{fiber}. Do not use them directly. +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{fiberin@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberin@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberin@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberout@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberout@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberout@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetin@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetin@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetin@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetout@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetout@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{fiberpresetout@bottom}[true]{} +\psset[optexp]{fiber=*all}% +\define@key[psset]{optexp}{fiberangleA}{% + \pst@checknum{#1}\POE@key@fiberangleA +}% +\define@key[psset]{optexp}{fiberangleB}{% + \pst@checknum{#1}\POE@key@fiberangleB +}% +\define@choicekey+[psset]{optexp}{fiberalign}% + [\val\nr]{rel,abs,relative,center,absolute}% + {% + \ifcase\nr\relax + \let\POE@key@fiberalign\POE@str@relative + \or + \let\POE@key@fiberalign\POE@str@absolute + \else + \def\POE@key@fiberalign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for fiberalign}}% +\define@key[psset]{optexp}{fiberstyle}{% + \@ifundefined{nc#1}% + {\PackageError{pst-optexp}{Unknown value '#1' for fiberstyle}}% + {\def\POE@key@fiberstyle{#1}}} +\psset[optexp]{% + fiberangleA=0, + fiberangleB=0, + fiberalign=relative, + fiberstyle=curve +}% + +% \subsection{Wire connection parameters} +% Select which wires are drawn automatically. +% Note, this part is equivalent to the fiber connection parameters, only 'fiber' is replace by 'wire'. +% \begin{macrocode} +\define@key[psset]{optexp}{wire}[all]{% + \POE@psset@wirecheck#1\@nil +} +% \end{macrocode} +% Check which components are affected by the wire parameter: +% * is only for electrical components +% + refers to all components but the electrical ones, +% otherwise all components are affected. +% \begin{macrocode} +\def\POE@psset@wirecheck#1#2\@nil{% + \ifx#1*\relax + \ifx\\#2\\% + \setkeys[psset]{optexp}{wire@preset=all}% + \else + \setkeys[psset]{optexp}{wire@preset=#2}% + \fi + \else\ifx#1+\relax + \ifx\\#2\\% + \setkeys[psset]{optexp}{wire@all=all}% + \else + \setkeys[psset]{optexp}{wire@all=#2}% + \fi + \POE@unset@fiber + \else + \setkeys[psset]{optexp}{wire@all=#1#2, wire@preset=#1#2}% + \POE@unset@fiber + \fi\fi +}% +\def\POE@unset@fiber{% + \ifPOE@wirein@ + \setkeys[psset]{optexp}{fiberpresetin@=false, fiberin@=false}% + \fi + \ifPOE@wireout@ + \setkeys[psset]{optexp}{fiberpresetout@=false, fiberout@=false}% + \fi + \ifPOE@wirein@top + \setkeys[psset]{optexp}{fiberpresetin@top=false, fiberin@top=false}% + \fi + \ifPOE@wirein@bottom + \setkeys[psset]{optexp}{fiberpresetin@bottom=false, fiberin@bottom=false}% + \fi + \ifPOE@wireout@top + \setkeys[psset]{optexp}{fiberpresetout@top=false, fiberout@top=false}% + \fi + \ifPOE@wireout@bottom + \setkeys[psset]{optexp}{fiberpresetout@bottom=false, fiberout@bottom=false}% + \fi +}% +% \end{macrocode} +% Set the fiber parameters for fiber-optical components only (use fiber=*...). +% \begin{macrocode} +\define@choicekey*+[psset]{optexp}{wire@preset}% + [\val\nr]{false,none,true,all}[all]{% + \ifcase\nr\relax + \POE@getwirepreset@none + \or + \POE@getwirepreset@none + \or + \POE@getwirepreset@all + \or + \POE@getwirepreset@all + \fi +}{% + \ifx\@empty\val + \POE@getwirepreset@none + \else + \pst@expandafter\POE@psset@@wirepreset{#1}\@empty,,\@nil + \fi +}% +\def\POE@psset@@wirepreset#1#2,#3,#4\@nil{% + \POE@getwirepreset@all + \ifx\\#3\\% + \@nameuse{POE@getwirepreset@#1}% + \@nameuse{POE@getwirepreset@#2}% + \fi +}% +\def\POE@getwirepreset@none{% + \setkeys[psset]{optexp}{% + wirepresetin@=false, wirepresetout@=false, + wirepresetin@top=false, wirepresetin@bottom=false, + wirepresetout@top=false, wirepresetout@bottom=false}% +}% + +\def\POE@getwirepreset@all{% + \setkeys[psset]{optexp}{% + wirepresetin@, wirepresetout@, + wirepresetin@top, wirepresetin@bottom, + wirepresetout@top, wirepresetout@bottom}% +}% +\def\POE@getwirepreset@t{% + \setkeys[psset]{optexp}{% + wirepresetin@bottom=false, wirepresetout@bottom=false}% +}% +\def\POE@getwirepreset@b{% + \setkeys[psset]{optexp}{% + wirepresetin@top=false, wirepresetout@top=false}% +}% +\def\POE@getwirepreset@l{% + \setkeys[psset]{optexp}{% + wirepresetout@=false, + wirepresetout@top=false, + wirepresetout@bottom=false}% +}% +\def\POE@getwirepreset@r{% + \setkeys[psset]{optexp}{% + wirepresetin@=false, + wirepresetin@top=false, + wirepresetin@bottom=false}% +}% +\let\POE@getwirepreset@i\POE@getwirepreset@l +\let\POE@getwirepreset@o\POE@getwirepreset@r +% \end{macrocode} +% +% This code is for all components, fiber-optical and free-ray. +% \begin{macrocode} +\define@choicekey*+[psset]{optexp}{wire@all}% + [\val\nr]{false,none,true,all}[all]{% + \ifcase\nr\relax + \POE@getwire@none + \or + \POE@getwire@none + \or + \POE@getwire@all + \or + \POE@getwire@all + \fi +}{% + \ifx\@empty\val + \POE@getwire@none + \else + \pst@expandafter\POE@psset@@wire{#1}\@empty,,\@nil + \fi +}% +\def\POE@psset@@wire#1#2,#3,#4\@nil{% + \POE@getwire@all + \ifx\@empty#3\@empty + \@nameuse{POE@getwire@#1}% + \@nameuse{POE@getwire@#2}% + \fi +}% +\def\POE@getwire@none{% + \setkeys[psset]{optexp}{% + wirein@=false, wireout@=false, + wirein@top=false, wirein@bottom=false, + wireout@top=false, wireout@bottom=false}% +}% +\def\POE@getwire@all{% + \setkeys[psset]{optexp}{% + wirein@, wireout@, + wirein@top, wirein@bottom, + wireout@top, wireout@bottom}% +}% +\def\POE@getwire@t{% + \setkeys[psset]{optexp}{% + wirein@bottom=false, wireout@bottom=false}% +}% +\def\POE@getwire@b{% + \setkeys[psset]{optexp}{% + wirein@top=false, wireout@top=false}% +}% +\def\POE@getwire@l{% + \setkeys[psset]{optexp}{% + wireout@=false, wireout@top=false, wireout@bottom=false}% +}% +\def\POE@getwire@r{% + \setkeys[psset]{optexp}{% + wirein@=false, wirein@top=false, wirein@bottom=false}% +}% +\let\POE@getwire@i\POE@getwire@l +\let\POE@getwire@o\POE@getwire@r +% \end{macrocode} +% These are the internal boolkeys for the wire choices done with \opt{wirein}, +% \opt{wireout} and \opt{wire}. Do not use them directly. +% \begin{macrocode} +\define@boolkey[psset]{optexp}[POE@]{wirein@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirein@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirein@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wireout@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wireout@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wireout@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetin@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetin@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetin@bottom}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetout@}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetout@top}[true]{} +\define@boolkey[psset]{optexp}[POE@]{wirepresetout@bottom}[true]{} +\psset[optexp]{wire=*all}% +\define@key[psset]{optexp}{wireangleA}{% + \pst@checknum{#1}\POE@key@wireangleA +}% +\define@key[psset]{optexp}{wireangleB}{% + \pst@checknum{#1}\POE@key@wireangleB +}% +\define@choicekey+[psset]{optexp}{wirealign}% + [\val\nr]{rel,abs,relative,center,absolute}% + {% + \ifcase\nr\relax + \let\POE@key@wirealign\POE@str@relative + \or + \let\POE@key@wirealign\POE@str@absolute + \else + \def\POE@key@wirealign{#1}% + \fi + }% + {\PackageError{pst-optexp}{Unknown value '\val' for wirealign}}% +\define@key[psset]{optexp}{wirestyle}{% + \@ifundefined{nc#1}% + {\PackageError{pst-optexp}{Unknown value '#1' for wirestyle}}% + {\def\POE@key@wirestyle{#1}}} +\psset[optexp]{% + wireangleA=0, + wireangleB=0, + wirealign=relative, + wirestyle=angle +}% +% \end{macrocode} +% Which nodes to take for the automatic fiber and wire connections. +% \begin{macrocode} +\define@choicekey+[psset]{optexp}{startnode}% + [\val\nr]{auto,1,2,3,4,N}% + {\edef\POE@key@startnode{\val}} + {\PackageError{pst-optexp}{Unknown startnode number '\val'}} +\define@choicekey+[psset]{optexp}{stopnode}[\val\nr]{auto,1,2,3,4,N}% + {\edef\POE@key@stopnode{\val}} + {\PackageError{pst-optexp}{Unknown stopnode number '\val'}} +\psset[optexp]{% + startnode=auto, + stopnode=auto +}% +% \end{macrocode} +% +% \section{Layering} +% \begin{macrocode} +\newenvironment{optexp}{\Collect@Body\POE@collect}{}% +\long\def\POE@collect#1{% + \psset[optexp]{optexpenv} + \global\POE@oldcnt=\POE@cnt + \bgroup + \psset[optexp]{backlayer=true, frontlayer=false}#1% + \egroup + \gdef\POE@complist{}\global\POE@cnt=\POE@oldcnt\relax + \psset[optexp]{backlayer=false, frontlayer=true}% + #1\ignorespaces}% +% \end{macrocode} +% \begin{macro}{\backlayer} +% \begin{macrocode} +\def\backlayer#1{\ifPOE@backlayer #1\fi\ignorespaces}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\frontlayer} +% \begin{macrocode} +\def\frontlayer#1{\ifPOE@frontlayer #1\fi\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \section{Connection code} +% \subsection{drawfiber} +% \begin{macro}{\POE@getnode} +% \begin{macrocode} +\def\POE@getnode#1#2\@nil{% + \ifx(#1\relax%) + \POE@getcoor#1#2 + \edef\POE@temp{{\pst@coor}}% + \else + \POE@checkcompname{#1#2}% + \edef\POE@temp{/\oenode{}{#1#2}\space}% + \fi% +}% +% \end{macrocode} +% \begin{macro}{\POE@getcoor} +% \begin{macrocode} +\def\POE@getcoor(#1){\pst@@getcoor{#1}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\drawfiber} +% \begin{macrocode} +\def\drawfiber{\drawfiber@{Fiber}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawwire} +% \begin{macrocode} +\def\drawwire{\drawwire@{Wire}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawwire@} +% \begin{macrocode} +\def\drawwire@#1{% + \def\POE@setconnparam{% + \let\POE@key@connangleA\POE@key@wireangleA + \let\POE@key@connangleB\POE@key@wireangleB + \let\POE@key@connalign\POE@key@wirealign + \let\POE@key@connstyle\POE@key@wirestyle + }% + \drawconn@{#1} +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawfiber@} +% \begin{macrocode} +\def\drawfiber@#1{% + \def\POE@setconnparam{% + \let\POE@key@connangleA\POE@key@fiberangleA + \let\POE@key@connangleB\POE@key@fiberangleB + \let\POE@key@connalign\POE@key@fiberalign + \let\POE@key@connstyle\POE@key@fiberstyle + }% + \drawconn@{#1}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\drawconn@} +% \begin{macrocode} +\def\drawconn@#1{% + \ifPst@custom\else + \def\pst@par{style=#1}% + \fi + \@ifnextchar[%] + {\drawconn@i}{\drawconn@i[]}}% +\def\drawconn@i[#1]{% + \addafter@par{#1}% + \POE@normalizecomps\drawconn@ii} +\def\drawconn@ii{% + \@ifnextchar\bgroup + {\drawconn@iii}% + {}}% +\def\drawconn@iii#1{% + \def\POE@tempe{#1}\drawconn@iv}% +\def\drawconn@iv{% + \@ifnextchar\bgroup{\drawconn@v}{}}% +\def\drawconn@v#1{% + \expandafter\drawconn@vi\expandafter{\POE@tempe}{#1}% + \def\POE@tempe{#1}\drawconn@iv}% +\def\drawconn@vi#1#2{% + \begingroup + \let\psk@angleA\relax + \let\psk@angleB\relax + \use@par + \POE@setconnparam + \let\POE@angleA\psk@angleA + \let\POE@angleB\psk@angleB + \ifx\psk@angleA\relax + \def\psk@angleA{0 }%3 + \fi + \ifx\psk@angleB\relax + \def\psk@angleB{0 }% + \fi + \def\POE@tempa{#1} + \ifx\POE@tempa\@empty + \edef\POE@comps{/\oenode{}{}\space} + \else + \expandafter\POE@getnode#1\@nil + \edef\POE@comps{\POE@temp} + \fi + \def\POE@tempb{#2} + \ifx\POE@tempb\@empty + \edef\POE@comps{/\oenode{}{}\space \POE@comps} + \else + \expandafter\POE@getnode#2\@nil + \edef\POE@comps{\POE@temp\space \POE@comps} + \fi + \ifPOE@backlayer + \ifx\POE@key@startnode\POE@str@auto\else + \POE@pnode{/\POE@key@startnode\space \POE@comps exch pop + \POE@dict{GetIfcOrNodeCoord} \tx@UserCoor}{@@A} + \fi + \ifx\POE@key@stopnode\POE@str@auto\else + \POE@pnode{/\POE@key@stopnode\space \POE@comps pop + \POE@dict{GetIfcOrNodeCoord} \tx@UserCoor}{@@B} + \fi + \ifx\POE@key@startnode\POE@str@auto + \ifx\POE@key@stopnode\POE@str@auto + \POE@pnode{\POE@comps exch \POE@dict{NearestNode} + \tx@UserCoor}{@@A} + \POE@pnode{\POE@comps pop + \POE@dict{/N@@@A @GetCenter ToVec NearestNode} + \tx@UserCoor}{@@B} + \else + \POE@pnode{\POE@comps exch pop /N@@@B + \POE@dict{@GetCenter ToVec NearestNode} + \tx@UserCoor}{@@A} + \fi + \else\ifx\POE@key@stopnode\POE@str@auto + \POE@pnode{\POE@comps pop /N@@@A + \POE@dict{@GetCenter ToVec NearestNode} + \tx@UserCoor}{@@B} + \fi\fi + \pst@getcoor{@@A}\POE@tempa + \pst@getcoor{@@B}\POE@tempb + \ifx\POE@angleA\relax + \ifx\POE@key@connalign\POE@str@absolute + \psset{angleA=\POE@key@connangleA}% + \else + \psset{angleA=! \POE@dict{% + \POE@tempb \POE@tempa \POE@comps exch + \POE@key@connalign\space RelConnAngle + \POE@key@connangleA\space add } + }% + \fi + \fi + \ifx\POE@angleB\relax + \ifx\POE@key@connalign\POE@str@absolute + \psset{angleB=\POE@key@connangleB}% + \else + \psset{angleB=! \POE@dict{% + \POE@tempa \POE@tempb \POE@comps + \POE@key@connalign\space RelConnAngle + \POE@key@connangleB\space add} + }% + \fi + \fi + \@nameuse{nc\POE@key@connstyle}{@@A}{@@B} + \fi + \endgroup +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{POE@pnode} +% Do some trickery to define \cs{pnode} inside \cs{pscustom}, which is +% required if one wants to use \cs{drawfiber} inside \cs{pscustom}. +% \begin{macrocode} +\def\POE@pnode#1#2{% + \ifPst@custom + \code{% + gsave + /currentpoint load stopped { 0 0 moveto } if + 1 8.3021995 div dup neg scale + tx@NodeDict begin + {#1 \tx@ScreenCoor } false /N@#2 10 {InitPnode} + /NodeScale {} def NewNode + end + grestore + }% + \else + \pnode(!#1){#2} + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{drawbeam} +% +% \begin{macro}{\begin@BeamObj} +% \begin{macrocode} +\def\begin@BeamObj{% + \addbefore@par{n=n}% + \begin@SpecialObj% + \addto@pscode{% + \pst@optexpdict + /loadbeampoints \POE@key@loadbeampoints\space def + /loadbeam \ifPOE@loadbeam true \else false \fi def + /beamangle \POE@key@beamangle\space def + /beamdiv \POE@key@beamdiv\space def + /savebeampoints \POE@key@savebeampoints\space def + /savebeam \ifPOE@savebeam true \else false \fi def + /startinsidecount \POE@key@startinsidecount\space cvi def + startinsidecount 0 eq { + /beaminsidefirst false def + /startinside false def + } { + /beaminsidefirst \ifPOE@beaminsidefirst true \else false \fi def + /startinside \ifPOE@startinside true \else false \fi def + } ifelse + /stopinsidecount \POE@key@stopinsidecount\space cvi def + stopinsidecount 0 eq { + /beaminsidelast false def + /stopinside false def + } { + /beaminsidelast \ifPOE@beaminsidelast true \else false \fi def + /stopinside \ifPOE@stopinside true \else false \fi def + } ifelse + /beaminside \ifPOE@beaminside true \else false \fi def + /connectifc \ifPOE@raytrace false \else true \fi def + /beamalign + \ifx\POE@key@beamalign\POE@str@absolute\space + absolute + \else\ifx\POE@key@beamalign\POE@str@relative\space + relative + \else + firstcomp + \fi\fi def + /beampathskip \POE@key@beampathskip\space def + \POE@key@beampathcount\space dup -1 gt { beampathskip add } if /beampathcount ED + /useNA \ifPOE@useNA true \else false \fi def + /aligntovector \ifx\POE@key@beamnodealign\POE@str@vector true \else false \fi def + /beamdiffractionorder + \ifx\POE@key@beamdiffractionorder\@empty null + \else\POE@key@beamdiffractionorder\space + \fi def + /beammode + \ifx\POE@key@beammode\POE@str@reflective + refl + \else\ifx\POE@key@beammode\POE@str@transmittive + trans + \else + auto + \fi\fi def + }% + \let\tx@Line\POE@tx@Line +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\begin@WideBeamObj} +% \begin{macrocode} +\def\begin@WideBeamObj{% + \addbefore@par{style=Beam}% + \begin@BeamObj + \let\pst@linetype\pst@arrowtype + \pst@addarrowdef% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\begin@SingleBeamObj} +% \begin{macrocode} +\let\begin@SingleBeamObj\begin@WideBeamObj +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\drawbeam} +% \begin{macrocode} +\def\drawbeam{\pst@object{drawbeam}}% +\def\drawbeam@i{% + \begin@SingleBeamObj + \POE@getcomps[\drawbeam@ii% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\drawwidebeam} +% \begin{macrocode} +\def\drawwidebeam{\pst@object{drawwidebeam}}% +\def\drawwidebeam@i{% + \begin@WideBeamObj + \POE@getcomps[\drawwidebeam@ii% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@beam@use@pscode} +% +% This is a hack which allows us to leave the names and coordinates of the +% beam end points on the stack after the \opt{@endspecial} call. This replaces +% \nxLcs{use@pscode} in \nxLcs{end@BeamObj}. These values on the stack must be +% consumed directly after closing the beam object. +% \begin{macrocode} +\def\POE@beam@use@pscode{% + \pstverb{% + \pst@dict + \tx@STP + \pst@newpath + \psk@origin + \psk@swapaxes + \pst@code + end + count /ocount exch def + }% + \gdef\pst@code{}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@BeamObj} +% \begin{macrocode} +\def\end@BeamObj{% + \addto@pscode{ end }% + \let\psk@fillstyle\relax + \ifPOE@optexpenv + \ifPOE@frontlayer +% \end{macrocode} +% Erase all beam-drawing code and leave only \opt{false} on the stack to +% indicate that no beampoints should be stored. +% \begin{macrocode} + \def\pst@code{ false false }% + \fi + \fi + \let\use@pscode\POE@beam@use@pscode + \end@SpecialObj% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\drawbeam@ii} +% \begin{macrocode} +\def\drawbeam@ii{% + \ifodd +% \end{macrocode} +% Do not draw anything only if both linestyle and ArrowInside are not set. +% \begin{macrocode} + \ifx\pslinestyle\@none\ifx\psk@ArrowInside\@empty 1\else 0\fi\else 0\fi + \addto@pscode{ cleartomark false false }% + \else +% \end{macrocode} +% Get the beamproperties from the first component if it is a source. +% \begin{macrocode} + \POE@HandleSourceBeam +% \end{macrocode} +% I need to pack it this way in order to avoid replacing the \opt{n} inside the +% code here. This must be done later, when it refers to the correct refractive +% indices. +% \begin{macrocode} + \addto@pscode{% + {/nbeam {\POE@key@n cvx exec} bind def + \ifPOE@pswarning + /Warning /PrintWarning load def + \else + /Warning /pop load def + \fi}% + [ \POE@key@beampos\space counttomark dup + 0 eq { + pop 0 0 + } { + 1 eq { + 0 exch + } if + } ifelse \tx@ScreenCoor] cvx + beamangle + currentdict /lastBeamPointTmp undef + currentdict /lastVecTmp undef + loadbeampoints 1 ge + tx@NodeDict /N@\oenodeBeam{\POE@key@loadbeampoints} known and { + /N@\oenodeBeam{\POE@key@loadbeampoints} @GetCenter ToVec + /lastBeamPointTmp ED + } if + currentdict /lastVec\POE@key@loadbeampoints\space known + loadbeam and { + /lastVecTmp /lastVec\POE@key@loadbeampoints\space load def + } if + TraceBeam + \POE@strokesinglebeam + savebeampoints 1 ge + currentdict /lastBeamPointTmp known and dup { + lastBeamPointTmp + /N@\oenodeBeam{\POE@key@savebeampoints}\space 4 -1 roll + } if + savebeam currentdict /lastVecTmp known and dup { + /prevVec\POE@key@savebeampoints\space + currentdict /prevVecTmp known { prevVecTmp }{ 0 0 } ifelse + /lastVec\POE@key@savebeampoints\space lastVecTmp 7 -1 roll + } if + }% + \fi + \end@BeamObj + \POE@Verb{% + { tx@OptexpDict begin ToVec def ToVec def end } if + { \tx@NodeScale @NewNode } if + }% +}% +% \end{macrocode} +% \end{macro} +% This fix is necessary for pst-node since version 1.21. +% \begin{macrocode} +\def\tx@NodeScale{% + \pst@nodedict + /NodeScale {\ifx\pstnodescale\@undefined\else\pstnodescale\fi} def + end } +% \end{macrocode} +% +% \begin{macro}{\POE@strokesinglebeam} +% \begin{macrocode} +\def\POE@strokesinglebeam{% + gsave + /Lineto /lineto load def + 20 dict begin + DrawbeamPrepare +% \end{macrocode} +% If there are only three elements or less on the stack, the first ray +% misses the next interface or is even parallel to the input interface. +% \begin{macrocode} + counttomark 3 gt { +% \end{macrocode} +% Define some parameters for Drawbeam which are based on TeX-parameters +% \begin{macrocode} + \ifx\psk@arrowA\arrowType@H + \pst@number\pshooklength + \else + \psk@arrowsize\space CLW mul add dup \psk@arrowlength\space mul exch \psk@arrowinset mul neg add + \fi + /arrowlength exch def + /arrowminlength \POE@key@ArrowInsideMinLength\space\pst@number\psunit mul def + /arrowmaxlength \POE@key@ArrowInsideMaxLength\space\pst@number\psunit mul def + /arrowpos \psk@ArrowInsidePos\space def + /arrowno \psk@ArrowInsideNo\space cvi def + /ArrowPosStart \psk@ArrowInsideOffset\space def + /dArrowPosStart \psk@ArrowInsidePos\space def + counttomark 3 idiv /N exch def + (\psk@ArrowInside) length 0 gt { + DrawbeamArrowInside + }{ + DrawbeamSimple + } ifelse + } if + cleartomark + end + \tx@setlinejoin + \pst@number\pslinewidth SLW + \pst@usecolor\pslinecolor + \tx@setStrokeTransparency + \@nameuse{psls@\pslinestyle} + grestore +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\drawwidebeam@ii} +% \begin{macrocode} +\def\drawwidebeam@ii{% + \def\pst@fill##1{ gsave ##1 grestore }% +% \end{macrocode} +% Get the beamproperties from the first component if it is a source. +% \begin{macrocode} + \POE@HandleSourceBeam + \addto@pscode{% + {/nbeam {\POE@key@n cvx exec} bind def + \ifPOE@pswarning + /Warning /PrintWarning load def + \else + /Warning /pop load def + \fi}% + }% +% \end{macrocode} +% arrange and create the input vectors +% \begin{macrocode} + \addto@pscode{% + beamangle dup + beamdiv 0.5 mul dup 4 -1 roll add 3 1 roll sub + }% +% \end{macrocode} +% the start positions +% \begin{macrocode} + \addto@pscode{% + [ \POE@key@beampos\space counttomark dup + 0 eq { + pop 0 0 + } { + 1 eq { + 0 exch + } if + } ifelse +% \end{macrocode} +% if \opt{beamwidth} is defined at Postscript level, it was defined from the source object. +% \begin{macrocode} + currentdict /beamwidth known { + beamwidth currentdict /beamwidth undef + } { + mark \POE@key@beamwidth\space counttomark 0 eq { 0 } if exch pop + } ifelse 0.5 mul + 3 copy add \tx@ScreenCoor\space ToVec + 5 1 roll sub \tx@ScreenCoor + ] cvx + }% +% \end{macrocode} +% rearrange options +% \begin{macrocode} + \addto@pscode{ exch 4 -1 roll 4 2 roll exch }% +% \end{macrocode} +% stroke and/or fill +% \begin{macrocode} + \addto@pscode{% + counttomark mark exch 2 add 1 roll + gsave + \ifx\psk@fillstyle\relax + currentdict /fillBeam undef + \else + /fillBeam {\psk@fillstyle} def + \fi + /strokeBeam + \ifx\pslinestyle\@none false \else true \fi + \ifx\psk@ArrowInside\@empty false \else true \fi or def + [/lastBeamPointTmpLow /lastBeamPointTmpUp + /lastVecTmpLow /lastVecTmpUp] + {currentdict exch undef} forall + tx@NodeDict /N@\oenodeBeamLow{\POE@key@loadbeampoints} known + tx@NodeDict /N@\oenodeBeamUp{\POE@key@loadbeampoints} known + loadbeampoints 1 ge and and { + /N@\oenodeBeamLow{\POE@key@loadbeampoints} @GetCenter ToVec + /lastBeamPointTmpLow ED + /N@\oenodeBeamUp{\POE@key@loadbeampoints} @GetCenter ToVec + /lastBeamPointTmpUp ED + } if + loadbeam + currentdict /lastVecLow\POE@key@loadbeampoints\space known and + currentdict /lastVecUp\POE@key@loadbeampoints\space known and { + /lastVecTmpLow /lastVecLow\POE@key@loadbeampoints\space load def + /lastVecTmpUp /lastVecUp\POE@key@loadbeampoints\space load def + } if + TraceAndFillWideBeam + grestore pop % pop off the mark +% \end{macrocode} +% Rearrange the points so that we can use two Drawbeam calls. +% +% \begin{macrocode} + counttomark 0 gt strokeBeam and { + counttomark dup /cnta ED /cntb ED + cnta 6 idiv { + cnta 3 roll /cnta cnta 3 sub def + /cntb cntb 3 sub def + cntb 3 roll /cntb cntb 3 sub def + } repeat + counttomark 2 idiv 1 add mark exch 1 roll + \POE@strokesinglebeam + \POE@strokesinglebeam + } { + pop % pop off the mark + } ifelse + currentdict /fillBeam known strokeBeam or + savebeampoints 1 ge and + currentdict /lastBeamPointTmpLow known and + currentdict /lastBeamPointTmpUp known and dup { + lastBeamPointTmpLow /N@\oenodeBeamLow{\POE@key@savebeampoints} + lastBeamPointTmpUp /N@\oenodeBeamUp{\POE@key@savebeampoints} + 7 -1 roll + } if + currentdict /fillBeam known strokeBeam or + savebeam and + currentdict /lastVecTmpLow known and + currentdict /lastVecTmpUp known and dup { + /prevVecLow\POE@key@savebeampoints\space /prevVecUp\POE@key@savebeampoints\space + currentdict /prevVecLow known currentdict /prevVecUp known and { + prevVecLow 3 -1 roll prevVecUp + } { + 0 0 3 -1 roll 0 0 + } ifelse + /lastVecLow\POE@key@savebeampoints\space lastVecTmpLow + /lastVecUp\POE@key@savebeampoints\space lastVecTmpUp + 13 -1 roll + } if + }% + \end@BeamObj + \POE@Verb{% + { tx@OptexpDict begin 4 { ToVec def } repeat end } if + { \tx@NodeScale @NewNode @NewNode } if + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tx@Drawbeam} +% \begin{macrocode} +\pst@def{Drawbeam}< +% \end{macrocode} +% Remove trailing empty line parts. +% \begin{macrocode} + { counttomark 6 le { + exit + } if + 3 index not { + pop pop pop + }{ + exit + } ifelse + } loop +% \end{macrocode} +% Remove heading empty line parts. Note, that the first point must not have +% 'draw = true', because it is the starting point which we have to move to. +% \begin{macrocode} + { counttomark 3 le { + exit + } if + counttomark 3 sub index not { + counttomark -3 roll pop pop pop + }{ + exit + } ifelse + } loop +% \end{macrocode} +% \begin{macrocode} + counttomark 3 le { +% \end{macrocode} +% first ray misses the next interface or is even parallel to the input interface. +% \begin{macrocode} + cleartomark + }{ +% \end{macrocode} +% This is the /Line definition from \opt{pstricks-add}, adapted to the beam path +% structure which includes the boolean values to indicate if a line is drawn, or +% if we use moveto. There was no way to patch the original definition to account +% for the moveto parts and avoid duplicating the code. +% \begin{macrocode} + counttomark 3 div cvi /N ED + (\psk@ArrowInside) length 0 gt { + \ifx\psk@arrowA\arrowType@H % do we have a Hook arrow at the beginning? + \pst@number\pshooklength % yes + \else + \psk@arrowsize\space CLW mul add dup \psk@arrowlength\space mul exch \psk@arrowinset mul neg add + \fi + /arrowlength exch def + 6 copy pop % copy all four values for the arrow line + /y1 ED /x1 ED pop /y2 ED /x2 ED % save them + /Alpha y2 y1 sub x2 x1 sub Atan def % the gradient of the line + pop 3 -1 roll 5 1 roll + ArrowA + x1 Alpha cos arrowlength mul add % dx add + y1 Alpha sin arrowlength mul add % dy add, to get the current point at the end of the arrow tip + 5 -1 roll 3 1 roll true + /N N 1 sub def + N { + 6 copy pop + /y1 ED /x1 ED pop /y2 ED /x2 ED /draw ED +% \end{macrocode} +% Check for line segment length and draw the arrow only, if the segment is long +% enough. This is in first place to avoid drawing an inside arrow for the +% pinhole which has three interfaces instead of one so that it can be used as +% real spatial filter. +% \begin{macrocode} + x1 y1 x2 y2 @ABDist dup + \POE@key@ArrowInsideMinLength\space\pst@number\psunit mul ge + exch \POE@key@ArrowInsideMaxLength\space\pst@number\psunit mul dup 0 lt + 3 1 roll le or and { + x1 y1 + \psk@ArrowInsidePos\space 1 gt { + /Alpha y2 y1 sub x2 x1 sub Atan def + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsidePos\space abs def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def + x1 Alpha cos ArrowPos mul add + y1 Alpha sin ArrowPos mul add + 6 index { ArrowInside } if + pop pop + } repeat + }{ + /ArrowPos \psk@ArrowInsideOffset\space def + /dArrowPos \psk@ArrowInsideNo 1 gt {% + 1.0 \psk@ArrowInsideNo 1.0 add div + }{\psk@ArrowInsidePos } ifelse def + \psk@ArrowInsideNo\space cvi { + /ArrowPos ArrowPos dArrowPos add def + x2 x1 sub ArrowPos mul x1 add + y2 y1 sub ArrowPos mul y1 add + 6 index { ArrowInside } if + pop pop + } repeat + } ifelse + pop pop + } if + draw {Lineto}{moveto} ifelse + } repeat + }{ + pop 5 copy 3 -1 roll pop + ArrowA pop pop pop pop + counttomark 3 idiv -1 2 { + pop { + lineto + }{ + moveto + } ifelse + } for + } ifelse + {CP 4 2 roll ArrowB lineto pop pop } {moveto} ifelse +% \end{macrocode} +% remove the mark +% \begin{macrocode} + pop + } ifelse +> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@getcomprange} +% \begin{macrocode} +\def\POE@getcomprange#1-#2\@nil{% + \ifx\\#2\\% + \ifx\\#1\\% +% \end{macrocode} +% empty option, use the current component ID +% \begin{macrocode} + \@tempcnta=\POE@cnt + \@tempcntb=\POE@cnt + \else +% \end{macrocode} +% A single number was given +% \begin{macrocode} + \@tempcnta=#1 + \@tempcntb=#1 +% \end{macrocode} +% Check if the number is valid, otherwise quit with an error. +% \begin{macrocode} + \ifodd + \ifnum 0<\@tempcnta\ifnum\@tempcntb>\the\POE@cnt \@ne\else\z@\fi\else\@ne\fi + \PackageError{pst-optexp}% + {Component ID \the\@tempcnta\space is not valid, + \ifnum\the\POE@cnt=0 no components have been defined\else + valid range is from 1 to \the\POE@cnt\fi} + \fi + \fi + \else + \ifx\\#1\\% + \@tempcnta=\@ne + \else + \@tempcnta=#1 + \fi + \edef\POE@temp{\POE@getfirstchar#2\@nil}% + \expandafter\ifx\POE@temp<\relax + \POE@getlastcompprev#2% + \else + \POE@getlastcomp#2% + \fi + \POE@checkandfixcomprange + \fi +}% +\def\POE@getcomprangeprev<#1-#2\@nil{% + \@tempcnta=\POE@cnt + \@tempcntb=\POE@cnt + \ifx\\#1\\% + \advance\@tempcnta by -1 + \else + \advance\@tempcnta by -#1 + \fi + \ifx\\#2\\\else + \edef\POE@temp{\POE@getfirstchar#2\@nil}% + \expandafter\ifx\POE@temp<\relax + \POE@getlastcompprev#2% + \else + \POE@getlastcomp#2% + \fi + \fi + \POE@checkandfixcomprange +}% +\def\POE@checkandfixcomprange{% + \ifnum\@tempcnta>\POE@cnt + \ifnum\@tempcntb>\POE@cnt + \PackageError{pst-optexp}% + {All components \the\@tempcnta-\the\@tempcntb\space out of range}% + \fi + \fi + \ifnum\@tempcnta<\@ne + \PackageWarning{pst-optexp}% + {Component ID \the\@tempcnta\space is not valid, setting to 1.}% + \@tempcnta=\@ne + \else\ifnum\@tempcnta>\POE@cnt + \PackageWarning{pst-optexp}% + {A: Component ID \the\@tempcnta\space is not valid, setting to \MessageBreak + the last defined value (\the\POE@cnt).}% + \@tempcnta=\POE@cnt + \fi\fi + \ifnum\@tempcntb>\POE@cnt + \PackageWarning{pst-optexp}% + {B: Component ID \the\@tempcntb\space is not valid, setting to \MessageBreak + the last defined value (\the\POE@cnt).}% + \@tempcntb=\POE@cnt + \else\ifnum\@tempcntb<\@ne + \PackageWarning{pst-optexp}% + {Component ID \the\@tempcntb\space is not valid, setting to 1.}% + \@tempcntb=\@ne + \fi\fi +}% +\def\POE@getlastcomp#1-{% + \ifx\\#1\\% + \ifnum\@tempcnta>\POE@cnt + \PackageError{pst-optexp}{All components \the\@tempcnta- out of range.}% + \fi% + \@tempcntb=\POE@cnt + \else + \@tempcntb=#1\relax + \fi +}% +\def\POE@getlastcompprev<#1-{% + \@tempcntb=\POE@cnt + \ifx\\#1\\% + \advance\@tempcntb by -1 + \else + \advance\@tempcntb by -#1 + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@getcomps} +% \begin{macrocode} +\def\POE@getcomps#1#2{% + \def\POE@aftercomps{\addto@pscode{#1 \POE@comps }#2}% + \def\POE@comps{}% + \POE@getcomps@i% +}% +\def\POE@getcomps@i{% + \@ifnextchar(%) + {\POE@getplanenode@i}% + {\POE@getcomps@ii} +}% +\def\POE@getcomps@ii{% + \@ifnextchar\bgroup{\POE@getcomps@iii}{\POE@aftercomps}% +}% +\def\POE@getfirstchar#1#2\@nil{#1}% +\def\POE@getprevcompid<#1\@nil{% + \ifx\\#1\\% + \number\numexpr\POE@cnt-1\relax + \else + \number\numpexp\POE@cnt-#1\relax + \fi +}% +\def\POE@getcomps@iii#1{% + \edef\POE@temp{\POE@getfirstchar#1{}\@nil}% + \ifx\POE@temp\@empty + \POE@getcomp{(\oenode{}{})}% + \else\expandafter\ifx\POE@temp(\relax%) + \POE@getplanenode#1% + \else\ifnum9<1\POE@temp\relax + \expandafter\POE@getcomprange#1-\@nil + \POE@getcomp{% + (\POE@str@basicname@prefix\POE@str@basicname@default) + \the\@tempcnta\space\the\@tempcntb\space GetCompRange % + }% + \else\expandafter\ifx\POE@temp<\relax + \expandafter\POE@getcomprangeprev#1-\@nil + \POE@getcomp{% + (\POE@str@basicname@prefix\POE@str@basicname@default) + \the\@tempcnta\space\the\@tempcntb\space GetCompRange % + }% + \else\expandafter\ifx\POE@temp-\relax + \POE@getcomprange#1-\@nil + \POE@getcomp{% + (\POE@str@basicname@prefix\POE@str@basicname@default) + \the\@tempcnta\space\the\@tempcntb\space GetCompRange % + }% + \else + \POE@checkcompname{#1}% + \POE@getcomp{(\oenode{}{#1})}% + \fi\fi\fi\fi\fi% + \POE@getcomps@i% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@getplanenode} +% \begin{macrocode} +\def\POE@getplanenode(#1){% + \pst@@getcoor{#1}% + \advance\POE@nodecnt by 1 + \POE@getcomp{% + {\pst@coor} {0 1} + (\POE@str@basicname@default N@\the\POE@nodecnt) + {\tx@UserCoor} NewTempNodeComp + (\POE@str@basicname@default N@\the\POE@nodecnt) + }% +}% +\def\POE@getplanenode@i(#1){\POE@getplanenode(#1)\POE@getcomps@i}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@getcomp} +% \begin{macrocode} +\def\POE@getcomp#1{% + \ifx\POE@comps\@empty + \edef\POE@tempc{#1}% + \else + \edef\POE@tempd{#1}% + \fi + \edef\POE@comps{#1 \POE@comps}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@normalizecomps} +% Expands all component parameters by resolving the ranges, i.e. {1-3} +% becomes {1}{2}{3}. Nodes are wrapped with brackets, if necessary: +% (1,1) becomes {(1,1)}. +% \begin{macrocode} +\def\POE@normalizecomps#1{% + \def\POE@aftercomps{\expandafter#1\POE@comps}% + \def\POE@comps{}% + \POE@normalizecomps@i% +}% +\def\POE@normalizecomps@i{% + \@ifnextchar(%) + {\POE@normalizecomps@ii}% + {\POE@normalizecomps@iii} +}% +\def\POE@normalizecomps@ii(#1){% + \edef\POE@comps{\POE@comps{(#1)}}% + \POE@normalizecomps@i +}% +\def\POE@normalizecomps@iii{% + \@ifnextchar\bgroup{\POE@normalizecomps@iv}{\POE@aftercomps}% +}% +% \end{macrocode} +% +% Analyze the content of the comp id and expand it accordingly. +% \begin{macrocode} +\def\POE@normalizecomps@iv#1{% + \edef\POE@temp{\POE@getfirstchar#1{}\@nil}% + \let\POE@tempb\POE@getcomprange + \ifnum9<1\POE@temp\relax + \def\POE@tempa{1}% + \else\expandafter\ifx\POE@temp-\relax + \def\POE@tempa{1}% + \else\expandafter\ifx\POE@temp<\relax + \def\POE@tempa{1}% + \let\POE@tempb\POE@getcomprangeprev + \else + \def\POE@tempa{0}% + \fi\fi\fi + \ifodd\POE@tempa + \POE@tempb#1-\@nil + \ifnum\@tempcnta<\@tempcntb \def\POE@rel{<}\def\POE@inc{\@ne}% + \else \def\POE@rel{>}\def\POE@inc{\m@ne}\fi + \advance\@tempcntb\POE@inc + \whiledo{\@tempcnta\POE@rel\@tempcntb}{% + \edef\POE@comps{\POE@comps{\the\@tempcnta}}% + \advance\@tempcnta\POE@inc + }% + \else + \edef\POE@comps{\POE@comps{#1}}% + \fi + \POE@normalizecomps@i% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Automatic connections} +% +% \begin{macro}{\POE@PresetWireConn} +% Draw automatic wires for electrical components. +% \begin{macrocode} +\def\POE@PresetWireConn{% + \ifPOE@startbox\else + \ifPOE@wirepresetin@ + \drawwire@{WireIn}(\oenodeRefA{}){} + \else\ifPOE@fiberin@ + \drawfiber@{FiberIn}(\oenodeRefA{}){} + \fi\fi + \fi + \ifPOE@endbox\else + \ifPOE@wirepresetout@ + \drawwire@{WireOut}{}(\oenodeRefB{}) + \else\ifPOE@fiberout@ + \drawfiber@{FiberOut}{}(\oenodeRefB{}) + \fi\fi + \fi +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@PresetFiberConn} +% Draw automatic fiber or wires for fiber components. +% \begin{macrocode} +\def\POE@PresetFiberConn{% + \ifPOE@startbox\else + \ifPOE@fiberpresetin@ + \drawfiber@{FiberIn}(\oenodeRefA{}){} + \else\ifPOE@wirein@ + \drawwire@{WireIn}(\oenodeRefA{}){} + \fi\fi + \fi + \ifPOE@endbox\else + \ifPOE@fiberpresetout@ + \drawfiber@{FiberOut}{}(\oenodeRefB{}) + \else\ifPOE@wireout@ + \drawwire@{WireOut}{}(\oenodeRefB{}) + \fi\fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@InternalConn} +% \begin{macrocode} +\def\POE@InternalConn{% + \ifPOE@beam + \ifPOE@endbox + \drawbeam[raytrace=false](\oenodeRefA{}){} + \else\ifPOE@startbox + \drawbeam[raytrace=false]{}(\oenodeRefB{}) + \else + \drawbeam[raytrace=false](\oenodeRefA{}){}(\oenodeRefB{}) + \fi\fi + \else + \ifPOE@startbox\else + \ifPOE@fiberin@ + \drawfiber@{FiberIn}(\oenodeRefA{}){} + \else\ifPOE@wirein@ + \drawwire@{WireIn}(\oenodeRefA{}){} + \fi\fi + \fi + \ifPOE@endbox\else + \ifPOE@fiberout@ + \drawfiber@{FiberOut}{}(\oenodeRefB{}) + \else\ifPOE@wireout@ + \drawwire@{WireOut}{}(\oenodeRefB{}) + \fi\fi + \fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@usefiberorwirestyle} +% \begin{macrocode} +\def\POE@usefiberorwirestyle{% + \ifPOE@usefiberstyle + \psset{style=Fiber, arrows=-, ArrowInside=-}% + \else\ifPOE@usewirestyle + \psset{style=Wire, arrows=-, ArrowInside=-}% + \fi\fi +}% +% \end{macrocode} +% \end{macro} +% +% \section{Accessing component nodes} +% \begin{macro}{\POE@checkcompname} +% Check if a component with name \#1 was already defined. +% \begin{macrocode} +\def\POE@checkcompname#1{% + \@expandtwoargs\in@{,#1,}{,\POE@complist,}% + \ifin@\else + \PackageError{pst-optexp}{Component '#1' is undefined} + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oenode} +% Get the full node name of the node \#1 defined in component \#2. +% \begin{macrocode} +\def\oenode#1#2{% + \POE@str@basicname@prefix% + \ifx\\#2\\% + \POE@str@basicname@default\the\POE@cnt + \else + \ifnum9<1#2 + \POE@str@basicname@default + #2% + \else + \POE@prevnode#2\@nil + \POE@str@basicname@sep% + \fi% + \fi% + #1% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{POE@prevnode} +% \begin{macrocode} +\def\POE@prevnode#1#2\@nil{% + \ifx<#1% + \POE@str@basicname@default + \ifx\\#2\\% + \number\numexpr\POE@cnt-1\relax + \else + \number\numexpr\POE@cnt-#2\relax + \fi + \else + #1#2% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% Define some special nodes, which should be accessed always via these macros. +% +% \begin{macro}{\oenodeExt} +% The external node which is set with \opt{extnode}. +% \begin{macrocode} +\def\oenodeExt#1{\oenode{\POE@str@extnode@postfix}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeIn} +% The first (input) node of the component. +% \begin{macrocode} +\def\oenodeIn#1{\oenode{1}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeOut} +% The last (output) node of the component +% \begin{macrocode} +\def\oenodeOut#1{\oenode{N}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeCenter} +% The center node of the component. +% \begin{macrocode} +\def\oenodeCenter#1{\oenode{Center}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeLabel} +% The transformed label node of the component +% \begin{macrocode} +\def\oenodeLabel#1{\oenode{Label}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeRefA} +% The first reference node which is used for positioning of the +% component. For dipoles it is equivalent to the (\#1) node. +% \begin{macrocode} +\def\oenodeRefA#1{\oenode{A}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeRefB} +% The second reference node, for dipoles it is equivalent to the (\#2) +% node. +% \begin{macrocode} +\def\oenodeRefB#1{\oenode{B}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeRotref} +% The rotation reference node. +% \begin{macrocode} +\def\oenodeRotref#1{\oenode{Rotref}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeTrefA} +% The transformed first reference node, after applying parameters +% \opt{compshift}, \opt{compoffset} and \opt{angle}. +% \begin{macrocode} +\def\oenodeTrefA#1{\oenode{TrefA}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeTrefB} +% The transformed second reference node. +% \begin{macrocode} +\def\oenodeTrefB#1{\oenode{TrefB}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenode@RefA} +% The first reference node, after it was projected on the reflection +% plane of a tripole, at distance 1 from the center. +% \begin{macrocode} +\def\oenode@RefA#1{\oenode{@A}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenode@RefB} +% The second referencen node, projected on the reflection plane. +% \begin{macrocode} +\def\oenode@RefB#1{\oenode{@B}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenode@TrefA} +% The transformed, projected first reference node. +% \begin{macrocode} +\def\oenode@TrefA#1{\oenode{@TrefA}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenode@TrefB} +% The transformed, projected second reference node. +% \begin{macrocode} +\def\oenode@TrefB#1{\oenode{@TrefB}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenode@Origin} +% The origin of the component, available only for tripoles. Introduced +% to be able to compute the angle between AO and BO at later times +% (for \cs{rightangleprism} and \cs{optprism}. +% \begin{macrocode} +\def\oenode@Origin#1{\oenode{Origin}{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{oenode@Path} +% Use this macro for internal use with \cs{pssavepath}. +% \begin{macrocode} +\def\oenode@Path#1{\oenode{Path@#1}{}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeIfc} +% The node of the interface no. \#1 of component \#2. Only integer +% number, N or C are allowed. You should always use this e.g. to +% access coupler nodes. +% \begin{macrocode} +\def\oenodeIfc#1#2{% + \ifnum9<1#1 % + \oenode{#1}{#2}% + \else\ifx#1N % + \oenode{#1}{#2}% + \else\ifx#1C % + \oenode{#1}{#2}% + \else + \PackageWarning{pst-optexp}{% + \string\oenodeIfc\space node argument must be\MessageBreak + integer, 'N', or 'C'.} + \fi\fi\fi +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeBeam} +% The end point of the last beam path which was saved with number \#1 +% (default is 1). +% \begin{macrocode} +\def\oenodeBeam#1{% + \POE@str@basicname@prefix\POE@str@basicname@default Beam% + \ifx\\#1\\1\else#1\fi +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeBeamUp} +% The upper end point of the last wide beam path saved with number \#1 +% (default is 1). +% \begin{macrocode} +\def\oenodeBeamUp#1{% + \POE@str@basicname@prefix\POE@str@basicname@default BeamUp% + \ifx\\#1\\1\else#1\fi +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\oenodeBeamLow} +% The lower end point of the last wide beam path saved with number \#1 +% (default is 1). +% \begin{macrocode} +\def\oenodeBeamLow#1{% + \POE@str@basicname@prefix\POE@str@basicname@default BeamLow% + \ifx\\#1\\1\else#1\fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@beamvec} +% Generic macro to load the Postscript coordinates of the direction +% vector of the last beam segment (upper, lower, single, specified +% with \#1) saved with number \#2. +% \begin{macrocode} +\def\POE@beamvec#1#2{% + \POE@dict{% + /prevVec#1\ifx\\#2\\1\else#2\fi\space dup + currentdict exch known { load exec }{ pop 0 0 } ifelse + }% +}% +\def\oeBeamVec#1{\POE@beamvec{}{#1}}% +\def\oeBeamVecUp#1{\POE@beamvec{Up}{#1}}% +\def\oeBeamVecLow#1{\POE@beamvec{Low}{#1}}% +\def\oeBeamVecMedian#1{% + \oeBeamVecUp{#1} \oeBeamVecLow{#1} \POE@dict{VecAdd NormalizeVec} +}% +\def\oeBeamCenter#1{% + \psGetNodeCenter{\oenodeBeamUp{#1}} \oenodeBeamUp{#1}.x \oenodeBeamUp{#1}.y + \psGetNodeCenter{\oenodeBeamLow{#1}} \oenodeBeamLow{#1}.x \oenodeBeamLow{#1}.y + \POE@dict{VecAdd 0.5 VecScale} +}% +% \end{macrocode} +% \end{macro} +% +% \section{Components} +% +% \begin{macro}{\POE@useifccode} +% \begin{macro}{\begin@CompIfc} +% \begin{macrocode} +\def\POE@useifccode{% + \POE@Verb{% + [ \pst@code + \ifPOE@allowbeaminside true \else false \fi + \ifPOE@forcebeaminside true \else false \fi + (\oenode{}{}) {\tx@ScreenCoor} + NewOptexpComp + }% + \gdef\pst@code{}% +}% +\def\begin@CompIfc{% + \begingroup +}% +\def\end@CompIfc{% + \addto@pscode{ false }% + \POE@useifccode + \endgroup + \ignorespaces +}% +\def\end@AmbCompIfc{% + \addto@pscode{ true }% + \POE@useifccode + \endgroup + \ignorespaces +}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\newOptexpComp@} +% \begin{macrocode} +\def\newOptexpComp@#1#2{% + \POE@Verb{% + \tx@NodeScale + [ #1 #2 + \ifPOE@allowbeaminside true \else false \fi + \ifPOE@forcebeaminside true \else false \fi + (\oenode{}{}) {\tx@ScreenCoor} + NewOptexpComp + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newOptexpComp} +% \begin{macrocode} +\def\newOptexpComp#1{% + \newOptexpComp@{#1}{false}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newOptexpCompAmb} +% \begin{macrocode} +\def\newOptexpCompAmb#1{% + \newOptexpComp@{#1}{true}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newOptexpFiberComp} +% \begin{macrocode} +\def\newOptexpFiberComp#1{% + \POE@Verb{% + \tx@NodeScale + [ #1 (\oenode{}{}) {\tx@ScreenCoor} + NewOptexpFiberComp + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{newOptexpElecComp} +% This may change at later times. +% \begin{macrocode} +\let\newOptexpElecComp\newOptexpFiberComp +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optplane} +% Define an invisible plane which is used only for ray tracing. The first node +% is the origin, the second one is the difference vector. +% \begin{macrocode} +\def\optplane{% + \@ifnextchar[%] + {\optplane@i}{\optplane@i[]}% +}% +\def\optplane@i[#1](#2){% + \pst@getcoor{#2}\POE@tempa +% \end{macrocode} +% Set the height to 0 to circumvent problems with the NA beeing too low +% \begin{macrocode} + \optplate[#1, plateheight=0, linestyle=none]% + (! \POE@tempa exch 1 sub exch \tx@UserCoor)% + (! \POE@tempa exch 1 add exch \tx@UserCoor)% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@SaveBeamParameters} +% Save the current beam parameters. This is used to be able to set a +% source beam with the usual beam parameters. +% \begin{macrocode} +\def\POE@SaveBeamParameters{% + \let\POE@tempA\POE@key@beamangle + \let\POE@tempB\POE@key@beamdiv + \let\POE@tempC\POE@key@beamwidth + \let\POE@tempD\POE@key@beamalign + \let\POE@key@beamangle\relax + \let\POE@key@beamdiv\relax + \let\POE@key@beamwidth\relax + \let\POE@key@beamalign\relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@SetSourceAndRestoreBeamParameters} +% \begin{macrocode} +\def\POE@SetSourceAndRestoreBeamParameters{% + \let\POE@key@sourcebeamangle\POE@key@beamangle + \let\POE@key@sourcebeamdiv\POE@key@beamdiv + \let\POE@key@sourcebeamwidth\POE@key@beamwidth + \let\POE@key@sourcebeamalign\POE@key@beamalign + \let\POE@key@beamangle\POE@tempA + \let\POE@key@beamdiv\POE@tempB + \let\POE@key@beamwidth\POE@tempC + \let\POE@key@beamalign\POE@tempD +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@HandleSourceBeam} +% Load beam properties from the first component on the stack, if it is +% an optical source. Also handle the beamalign=firstcomp case, since +% this also depends on the first component. +% \begin{macrocode} +\def\POE@HandleSourceBeam{% + \addto@pscode{% + counttomark 0 eq not { + dup cvn load dup /source known { + /source get { def } forall + }{ pop } ifelse + } if +% \end{macrocode} +% Handle the beamalign=firstcomp case. Calculate the angle of the first +% component's reference line and set the beamalign parameter to +% absolute. +% \begin{macrocode} + beamalign firstcomp eq { + dup dup (Center) NodeName tx@NodeDict exch known not { +% \end{macrocode} +% If we have no node called \opt{\ldots Center}, the first object isn't +% a component, but a node. Switch to relative alignment. +% \begin{macrocode} + pop /beamalign relative def + } { + RelConnAngle@tref exch atan /beamangle exch def + /beamalign absolute def + } ifelse + } if + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\begin@OptexpObj} +% \begin{macrocode} +\def\begin@OptexpObj{% + \global\advance\POE@cnt by 1 + \addbefore@par{compname={}}% + \pst@killglue + \begingroup + \POE@insideobjtrue + \POE@Verb{InitOptexpComp }% + \POE@SaveBeamParameters + \use@par + \POE@SetSourceAndRestoreBeamParameters +% \end{macrocode} +% The \opt{compshift} refers to the $y$-direction, shifting in $x$-direction +% is done by \opt{abspos} or \opt{position} +% \begin{macrocode} + \let\POE@key@comp@Yshift\POE@key@compshift% + \let\POE@key@comp@Xshift\POE@key@compoffset% + \edef\POE@refnodeA{\oenodeRefA{}}% + \edef\POE@refnodeB{\oenodeRefB{}}% + \edef\POE@trefnodeA{\oenodeTrefA{}}% + \edef\POE@trefnodeB{\oenodeTrefB{}}% + \def\POE@transformnodes{% + \POE@transformnode{\oenodeRefA{}}{\oenodeTrefA{}}% + \POE@transformnode{\oenodeRefB{}}{\oenodeTrefB{}}% + }% + \def\tx@Line{Line }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\begin@OptexpTripole} +% \begin{macrocode} +\let\POE@disablepos\relax +\def\begin@OptexpTripole{% + \begin@OptexpObj +% \end{macrocode} +% for multipoles the default shifting is in $x$-direction +% \begin{macrocode} + \def\POE@key@comp@Xshift{\POE@key@compshift\space neg }% + \let\POE@key@comp@Yshift\POE@key@compoffset +% \end{macrocode} +% The positioning parameters are disabled, because \opt{compshift} does the job for tripoles. +% \begin{macrocode} + \def\POE@disablepos{% + \let\POE@key@abspos\@empty + \let\POE@key@position\@empty + }% + \POE@positionrefnodes +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@positionrefnodes} +% \begin{macrocode} +\def\POE@positionrefnodes{% + \edef\POE@refnodeA{\oenode@RefA{}}% + \edef\POE@refnodeB{\oenode@RefB{}}% + \edef\POE@trefnodeA{\oenode@TrefA{}}% + \edef\POE@trefnodeB{\oenode@TrefB{}}% + \def\POE@transformnodes{% + \POE@transformnode{\oenodeRefA{}}{\oenodeTrefA{}}% + \POE@transformnode{\oenodeRefB{}}{\oenodeTrefB{}}% + \POE@transformnode{\oenode@RefA{}}{\oenode@TrefA{}}% + \POE@transformnode{\oenode@RefB{}}{\oenode@TrefB{}}% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@unsetbeamparameters} +% Unset some beam parameters which might be used by \cs{optsource}. +% \begin{macrocode} +\def\POE@unsetbeamparameters{% + \let\POE@key@beamangle\relax + \let\POE@key@beamdiv\relax + \let\POE@key@beamwidth\relax +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@OptexpObj} +% \begin{macrocode} +\def\end@OptexpObj{% + \ifnum9<1\POE@key@compname\else + \POE@Verb{ + (\oenode{}{\POE@key@compname}) + (\oenode{}{\the\POE@cnt}) CompAlias }% + \fi + \endgroup + \ignorespaces% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@OptexpDipole} +% \begin{macrocode} +\let\end@OptexpDipole\end@OptexpObj +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@OptexpTripole} +% \begin{macrocode} +\let\end@OptexpTripole\end@OptexpObj +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addafter@par} +% Analog to \cs{addbefore@par} from pstricks.tex, but inserts new options at +% the end of the current token register. This can be useful to preset options +% that are not allowed to be changed by the user. +% \begin{macrocode} +\def\addafter@par#1{% + \ifx\pst@par\@empty + \def\pst@par{#1}% + \else + \toks@{#1}% + \pst@toks\expandafter{\pst@par}% + \edef\pst@par{\the\pst@toks,\the\toks@}% + \fi% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\POE@clwh{CLW \pst@number\psxunit 2 mul div }% +\def\POE@clw{CLW \pst@number\psxunit div }% +\let\POE@restorerefnodes\relax +% \end{macrocode} +% +% New high-level macros +% 1) Allow a compressed notation of all provided elements, as most of the organizing code +% is mostly equal. +% +% 2) Provide a rather easy-to-use interface for the user to allow new user-defined elements +% +% \begin{macro}{\newOptexpDipole} +% \begin{macrocode} +\def\newOptexpDipole{% + \@ifnextchar[%] + {\POE@newdipole}{\POE@newdipole[]}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newOptexpTripole} +% \begin{macrocode} +\def\newOptexpTripole{% + \@ifnextchar[%] + {\POE@newtripole}{\POE@newtripole[]}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\newOptexpFiberDipole} +% \begin{macrocode} +\def\newOptexpFiberDipole{% + \@ifnextchar[%] + {\POE@newfiberdipole}{\POE@newfiberdipole[]}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@newdipole} +% \begin{macrocode} +\def\POE@newdipole[#1]#2{% + \@ifnextchar\bgroup + {\POE@newdipole@i[#1]{#2}}{\POE@newdipole@i[#1]{#2}{}}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@newdipole@i} +% \begin{macrocode} +\def\POE@newdipole@i[#1]#2#3{% + \@ifundefined{#2@i}{% + \@namedef{#2}{\pst@object{#2}}% + \expandafter\def\csname #2@i\endcsname(##1)(##2){% + \@ifnextchar\bgroup% + {\@nameuse{#2@ii}(##1)(##2)}% + {\@nameuse{#2@ii}(##1)(##2){}}% + }% + \expandafter\def\csname #2@ii\endcsname(##1)(##2)##3{% + \addbefore@par{#3}% + \addafter@par{#1}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{##1}{##2} + \fi + \POE@drawcomponent{#2}{##3} + \ifPOE@backlayer + \POE@Verb{ (1) (N) (\oenode{}{}) CorrectDipoleIfc }% + \@ifundefined{#2@conn}{\POE@InternalConn}{\@nameuse{#2@conn}}% + \fi + \end@OptexpDipole + }% + \@ifundefined{#2@nodes}{\expandafter\def\csname #2@nodes\endcsname{\POE@dipole@nodes}}{}% + }{% + \PackageError{pst-optexp}{% + dipole component '#2' already defined}% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@newfiberdipole} +% \begin{macrocode} +\def\POE@newfiberdipole[#1]#2{% + \@ifnextchar\bgroup + {\POE@newfiberdipole@i[#1]{#2}}{\POE@newfiberdipole@i[#1]{#2}{}}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@newfiberdipole@i} +% \begin{macrocode} +\def\POE@newfiberdipole@i[#1]#2#3{% + \@ifundefined{#2@i}{% + \@namedef{#2}{\pst@object{#2}}% + \expandafter\def\csname #2@i\endcsname(##1)(##2){% + \@ifnextchar\bgroup% + {\@nameuse{#2@ii}(##1)(##2)}% + {\@nameuse{#2@ii}(##1)(##2){}}% + }% + \expandafter\def\csname #2@ii\endcsname(##1)(##2)##3{% + \addbefore@par{#3}% + \addafter@par{#1}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{##1}{##2} + \fi + \POE@drawcomponent{#2}{##3} + \ifPOE@backlayer + \POE@Verb{ (1) (N) (\oenode{}{}) CorrectDipoleIfc }% + \POE@PresetFiberConn + \fi + \end@OptexpDipole + }% + \@ifundefined{#2@nodes}{\expandafter\def\csname #2@nodes\endcsname{\POE@fiberdipole@nodes}}{}% + }{% + \PackageError{pst-optexp}{% + fiber dipole object '#2' already defined}% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@newtripole} +% \begin{macrocode} +\def\POE@newtripole[#1]#2{% + \@ifnextchar\bgroup + {\POE@newtripole@i[#1]{#2}}{\POE@newtripole@i[#1]{#2}{}}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@newtripole@i} +% \begin{macrocode} +\def\POE@newtripole@i[#1]#2#3{% + \@ifundefined{#2@i}{% + \@namedef{#2}{\pst@object{#2}}% + \expandafter\def\csname #2@i\endcsname(##1)(##2)(##3){% + \@ifnextchar\bgroup{\@nameuse{#2@ii}(##1)(##2)(##3)}% + {\@nameuse{#2@ii}(##1)(##2)(##3){}}% + }% + \expandafter\def\csname #2@ii\endcsname(##1)(##2)(##3)##4{% + \addbefore@par{#3}% + \addafter@par{ref@angle=0,#1}% + \begin@OptexpTripole + \ifPOE@backlayer + \POE@calcNodes{##1}{##2}{##3}% + \POE@regNodes{##1}{##3}% + \fi + \POE@drawcomponent{#2}{##4} + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpTripole + }% + \@ifundefined{#2@nodes}{\expandafter\def\csname #2@nodes\endcsname{\POE@tripole@nodes}}{}% + }{% + \PackageError{pst-optexp}{% + tripole object '#2' already defined}% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optaom} +% \begin{macrocode} +\def\optaom{\pst@object{optaom}}% +\def\optaom@i(#1)(#2)(#3){% + \@ifnextchar\bgroup + {\optaom@ii(#1)(#2)(#3)}% + {\optaom@ii(#1)(#2)(#3){}}% +}% +\def\optaom@ii(#1)(#2)(#3)#4{% + \addafter@par{ref@angle=180}% + \begin@OptexpTripole + \ifPOE@backlayer + \ifx\POE@key@abspos\@empty + \ifx\POE@key@position\@empty + \psLNode(#1)(#2){0.5}{\oenode{Tmp}{}} + \else + \psLNode(#1)(#2){\POE@key@position}{\oenode{Tmp}{}} + \fi + \else + \psLDNode(#1)(#2){\POE@key@abspos}{\oenode{Tmp}{}} + \fi + \POE@calcNodes{#1}{\oenode{Tmp}{}}{#3}% + \POE@regNodes{#1}{#3} + \fi + \POE@drawcomponent{optaom}{#4} + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpTripole +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optcoupler} +% \begin{macrocode} +\def\optcoupler{\pst@object{optcoupler}}% +\def\optcoupler@i(#1)(#2){% + \@ifnextchar(%) + {\optcoupler@ii(#1)(#2)}% + {\optcoupler@ii(#1)(#1)(#2)(#2)}% +}% +\def\optcoupler@ii(#1)(#2)(#3)(#4){% + \@ifnextchar\bgroup% + {\optcoupler@iii(#1)(#2)(#3)(#4)}% + {\optcoupler@iii(#1)(#2)(#3)(#4){}}% +}% +\def\optcoupler@iii(#1)(#2)(#3)(#4)#5{% + \begin@OptexpObj + \ifPOE@backlayer + \ifx\POE@key@coupleralign\POE@str@top + \pnode(#1){\oenodeRefA{}} + \pnode(#3){\oenodeRefB{}} + \else\ifx\POE@key@coupleralign\POE@str@bottom + \pnode(#2){\oenodeRefA{}} + \pnode(#4){\oenodeRefB{}} + \else + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefA{}} + \pst@getcoor{#3}\POE@tempa% + \pst@getcoor{#4}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefB{}} + \fi\fi + \fi + \POE@drawcomponent{optcoupler}{#5} + \ifPOE@backlayer + \POE@Verb{% + (1) (3) (\oenode{}{}) CorrectDipoleIfc + (2) (4) (\oenode{}{}) CorrectDipoleIfc + }% + \ifPOE@fiberpresetin@ + \ifPOE@fiberpresetin@top + \drawfiber@{FiberIn1}[stopnode=1](#1){} + \fi + \ifPOE@fiberpresetin@bottom + \drawfiber@{FiberIn2}[stopnode=2](#2){} + \fi + \fi + \ifPOE@fiberpresetout@ + \ifPOE@fiberpresetout@top + \drawfiber@{FiberOut1}[startnode=3]{}(#3) + \fi + \ifPOE@fiberpresetout@bottom + \drawfiber@{FiberOut2}[startnode=N]{}(#4) + \fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\wdmsplitter} +% \begin{macrocode} +\def\wdmsplitter{\pst@object{wdmsplitter}}% +\def\wdmsplitter@i(#1)(#2){% + \@ifnextchar(%) + {\wdmsplitter@ii(#1)(#2)}% + {\wdmsplitter@ii(#1)(#2)(#2)}% +}% +\def\wdmsplitter@ii(#1)(#2)(#3){% + \@ifnextchar\bgroup% + {\wdmsplitter@iii(#1)(#2)(#3)}% + {\wdmsplitter@iii(#1)(#2)(#3){}}% +}% +\def\wdmsplitter@iii(#1)(#2)(#3)#4{% + \begin@OptexpObj + \ifPOE@backlayer + \pnode(#1){\oenodeRefA{}} + \ifx\POE@key@coupleralign\POE@str@top + \pnode(#2){\oenodeRefB{}} + \else\ifx\POE@key@coupleralign\POE@str@bottom + \pnode(#3){\oenodeRefB{}} + \else + \pst@getcoor{#2}\POE@tempa% + \pst@getcoor{#3}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefB{}} + \fi\fi + \fi + \POE@drawcomponent{wdmsplitter}{#4} + \ifPOE@backlayer + \POE@Verb{% + (1) (2) (\oenode{}{}) CorrectDipoleIfc + (1) (3) (\oenode{}{}) CorrectDipoleIfc + }% + \ifPOE@fiberpresetin@ + \drawfiber@{FiberIn}[stopnode=1](#1){} + \fi + \ifPOE@fiberpresetout@ + \ifPOE@fiberpresetout@top + \drawfiber@{FiberOut1}[startnode=2]{}(#2) + \fi + \ifPOE@fiberpresetout@bottom + \drawfiber@{FiberOut2}[startnode=N]{}(#3) + \fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\wdmcoupler} +% \begin{macrocode} +\def\wdmcoupler{\pst@object{wdmcoupler}}% +\def\wdmcoupler@i(#1)(#2){% + \@ifnextchar(%) + {\wdmcoupler@ii(#1)(#2)}% + {\wdmcoupler@ii(#1)(#1)(#2)}% +}% +\def\wdmcoupler@ii(#1)(#2)(#3){% + \@ifnextchar\bgroup% + {\wdmcoupler@iii(#1)(#2)(#3)}% + {\wdmcoupler@iii(#1)(#2)(#3){}}% +}% +\def\wdmcoupler@iii(#1)(#2)(#3)#4{% + \begin@OptexpObj + \ifPOE@backlayer + \pnode(#3){\oenodeRefB{}} + \ifx\POE@key@coupleralign\POE@str@top + \pnode(#1){\oenodeRefA{}} + \else\ifx\POE@key@coupleralign\POE@str@bottom + \pnode(#2){\oenodeRefA{}} + \else + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefA{}} + \fi\fi + \fi + \POE@drawcomponent{wdmcoupler}{#4} + \ifPOE@backlayer + \POE@Verb{% + (1) (3) (\oenode{}{}) CorrectDipoleIfc + (2) (3) (\oenode{}{}) CorrectDipoleIfc + }% + \ifPOE@fiberpresetout@ + \drawfiber@{FiberOut}[startnode=N]{}(#3) + \fi + \ifPOE@fiberpresetin@ + \ifPOE@fiberpresetin@top + \drawfiber@{FiberIn1}[stopnode=1](#1){} + \fi + \ifPOE@fiberpresetin@bottom + \drawfiber@{FiberIn2}[stopnode=2](#2){} + \fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\optcirculator} +% \begin{macrocode} +\def\optcirculator{\pst@object{optcirculator}}% +\def\optcirculator@i(#1)(#2)(#3){% + \@ifnextchar\bgroup% + {\optcirculator@ii(#1)(#2)(#3)}% + {\optcirculator@ii(#1)(#2)(#3){}}% +}% +\def\POE@calcCircRefNodes#1#2#3{% +\ifPOE@backlayer + \POE@regNodes{#1}{#2} + \ifx\POE@key@position\@empty + \ifx\POE@key@abspos\@empty + \POE@positionrefnodes + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempc% + \pst@getcoor{#3}\POE@tempb% + \pnode(! \POE@dict{% + \POE@tempa \tx@UserCoor 2 copy 2 copy + \POE@tempc \tx@UserCoor 4 2 roll @ABVect + 2 copy 2 copy 10 4 roll + \POE@tempb \tx@UserCoor 6 -2 roll @ABVect + 4 2 roll tx@EcldDict begin Project end VecAdd + 2 copy 6 -2 roll -0.5 VecScale VecAdd + }){\oenode@RefA{}}% + \pnode(! \POE@dict{4 2 roll 0.5 VecScale VecAdd})% + {\oenode@RefB{}}% + \fi + \fi + \fi +}% +\def\optcirculator@ii(#1)(#2)(#3)#4{% + \addafter@par{ref@angle=0}% + \begin@OptexpObj + \POE@calcCircRefNodes{#1}{#2}{#3}% + \POE@drawcomponent{optcirculator}{#4} + \ifPOE@backlayer + \ifPOE@fiberpresetin@top + \drawfiber@{FiberIn}[stopnode=1](#1){} + \fi + \ifPOE@fiberpresetout@ + \ifPOE@fiberpresetout@top + \drawfiber@{FiberOut1}[startnode=N]{}(#2) + \fi + \ifPOE@fiberpresetout@bottom + \drawfiber@{FiberOut2}[startnode=2, fiberalign=center]{}(#3) + \fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fiberbox} +% \begin{macrocode} +\def\fiberbox{\pst@object{fiberbox}}% +\def\fiberbox@i(#1)(#2){% + \@ifnextchar(%) + {\fiberbox@ii(#1)(#2)}% + {\fiberbox@ii(#1)(#2)()()}% +}% +\def\fiberbox@ii(#1)(#2)(#3)(#4){% + \@ifnextchar\bgroup% + {\fiberbox@iii(#1)(#2)(#3)(#4)}% + {\fiberbox@iii(#1)(#2)(#3)(#4){}}% +}% +\def\fiberbox@iii(#1)(#2)(#3)(#4)#5{% + \begin@OptexpObj + \ifnum\POE@key@fiberboxcountin=1 + \ifnum\POE@key@fiberboxcountout=1 + \ifdim\POE@key@fiberboxheight pt=0pt + \PackageError{pst-optexp}{% + Cannot determine height of 1x1 fiberbox automatically, + use fiberboxheight}% + \fi + \fi + \fi + \ifPOE@backlayer + \ifx\\#3#4\\% + \POE@regNodes{#1}{#2} + \POE@Verb{/@@inht 0 def /@@outht 0 def}% + \else + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempb% + \pst@getcoor{#3}\POE@tempc% + \pst@getcoor{#4}\POE@tempd% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefA{}} + \pnode(!\POE@tempc \POE@tempd + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefB{}} + \POE@regNodes@ + \POE@Verb{% + gsave + STV CP T + /N@\oenodeRefA{} @GetCenter + /N@\oenodeRefB{} @GetCenter @ABVect NormalizeVec + 90 matrix rotate dtransform 2 copy + \POE@tempa \POE@tempb @ABVect + \tx@UserCoor DotProd abs 3 1 roll + \POE@tempc \POE@tempd @ABVect + \tx@UserCoor DotProd abs + grestore + /@@outht ED /@@inht ED + }% + \fi + \fi + \POE@drawcomponent{fiberbox}{#5} + \ifPOE@backlayer + \ifx\\#3#4\\% +% \end{macrocode} +% Connect only, if the fiberbox has a single related interface node. +% \begin{macrocode} + \ifnum\POE@key@fiberboxcountin=1 + \ifPOE@fiberpresetin@ + \drawfiber@{FiberIn}(#1){} + \else\ifPOE@wirein@ + \drawwire@{WireIn}(#1){} + \fi\fi + \fi + \ifnum\POE@key@fiberboxcountout=1 + \ifPOE@fiberpresetout@ + \drawfiber@{FiberOut}{}(#2) + \else\ifPOE@wireout@ + \drawwire@{WireOut}{}(#2) + \fi\fi + \fi + \else +% \end{macrocode} +% If four reference nodes are specified, connect all of them with the respective interface +% nodes they are aligned to. +% \begin{macrocode} + \ifPOE@fiberpresetin@top + \drawfiber@{FiberIn1}(#1){} + \else\ifPOE@wirein@top + \drawwire@{WireIn1}(#1){} + \fi\fi + \ifPOE@fiberpresetin@bottom + \drawfiber@{FiberIn2}(#2){} + \else\ifPOE@wirein@bottom + \drawwire@{WireIn2}(#2){} + \fi\fi + \ifPOE@fiberpresetout@top + \drawfiber@{FiberOut1}{}(#3) + \else\ifPOE@wireout@top + \drawwire@{WireOut1}{}(#3) + \fi\fi + \ifPOE@fiberpresetout@bottom + \drawfiber@{FiberOut2}{}(#4) + \else\ifPOE@wireout@bottom + \drawwire@{WireOut2}{}(#4) + \fi\fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@calcNodes} +% Some of the components need three points to be positioned. +% These are: +% +% \begin{enumerate} +% \item starting point of the beam (in the PS-Code: (XA,YA)) +% \item reflection point on the surface (XG, YG) +% \item end point (XB,YB) +% \end{enumerate} +% +% With these three points \cs{poe@calcNodes} calculates two new points 'tempNode@A' +% and 'tempNode@B', between which the component is placed by the macro +% \cs{poe@drawcomponent} in the way, that 'angle of incidence' == 'angle of deflection' +% regarding the reflection surface (mirror, diagonal of the beamsplitter, +% grid etc.) +% \begin{macrocode} +\def\POE@calcNodes#1#2#3{{% + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempb% + \pst@getcoor{#3}\POE@tempc% + \pnode(! \POE@dict{% + \POE@tempa \tx@UserCoor + \POE@tempc \tx@UserCoor + \POE@tempb \tx@UserCoor + calcNodes /exch@ref@\oenode{}{} ED + X@A Y@A}){\oenode@RefA{}}% + \pnode(! \POE@dict{X@B Y@B}){\oenode@RefB{}}% + \pnode(#2){\oenode@Origin{}}% +}\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@calcAngle} +% Calculate the angle between the vectors A->O and B->0, which is +% needed by \cs{rightangleprism} and \cs{optprism}. Also calculate the +% angle difference between 'Winkelhalbierende' and +% 'Seitenhalbierende', which is required for some corrections in +% \cs{rightangleprism}. +% \begin{macrocode} +\def\POE@calcAngle{% + \POE@Verb{% + gsave + STV CP T + /N@\oenode@Origin{} @GetCenter 2 copy + /N@\oenodeRefA{} @GetCenter VecSub /ay ED /ax ED + /N@\oenodeRefB{} @GetCenter VecSub /by ED /bx ED +% \end{macrocode} +% Winkelhalbierende (cx, cy) +% \begin{macrocode} + ax ay NormalizeVec bx by NormalizeVec VecAdd + 2 copy Pyth abs 1e-4 lt { +% \end{macrocode} +% vectors a and b are antiparallel +% \begin{macrocode} + pop pop + ax ay 90 matrix rotate dtransform + } if + NormalizeVec 2 copy +% \end{macrocode} +% Seitenhalbierende +% \begin{macrocode} + ax ay bx by VecAdd + 2 copy Pyth abs 1e-4 lt { +% \end{macrocode} +% vectors a and b are parallel +% \begin{macrocode} + pop pop ax ay + } if + NormalizeVec + 4 copy 4 copy + DotProd Acos 5 1 roll Chirality mul + /dOEangle exch def + ax ay Pyth bx by Pyth + 2 copy dup mul exch dup mul add + ax bx sub ay by sub Pyth dup mul exch sub + 3 1 roll -2 mul mul div Acos /OEangle exch def +% \end{macrocode} +% project vector (ax, by) on the normal to the bisector +% \begin{macrocode} + neg exch ax ay \tx@UserCoor DotProd abs /@myht exch def + grestore + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@saveDiffractionNodes} +% \begin{macrocode} +\def\POE@saveDiffractionNodes{% + \POE@Verb{% + gsave + STV CP T + /N@\oenodeRefA{} @GetCenter + /N@\oenode@Origin{} @GetCenter @ABVect exch atan /myangle ED + /N@\oenode@Origin{} @GetCenter + /N@\oenodeRefB{} @GetCenter @ABDist /mydist ED + grestore + }% + \pnode(! \POE@dict{mydist myangle 180 sub} PtoC \tx@UserCoor){\oenode{DO0}{}}% + \multido{\i=1+1}{\POE@key@diffractionorders}{% + \pnode(! \POE@dict{mydist myangle 180 sub 180 OEangle sub \i\space mul } add PtoC \tx@UserCoor){\oenode{DO\i}{}}% + \pnode(! \POE@dict{mydist myangle 180 sub 180 OEangle sub \i\space mul } sub PtoC \tx@UserCoor){\oenode{DO-\i}{}}% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@regNodes} +% If a macro needs only two points, they are equivalent to +% 'tempNode@A' and 'tempNode@B'. But for easier implementation of other +% macros the given points are assigned to the temporary nodes. +% \begin{macrocode} +\def\POE@regNodes#1#2{% + \pnode(#1){\oenodeRefA{}} + \pnode(#2){\oenodeRefB{}} + \POE@regNodes@ +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@regNodes@} +% Some additional work which needs to be done in \cs{POE@regNodes}, but must be +% called separately in some cases (e.g. \cs{fiberbox}). +% \begin{macrocode} +\def\POE@regNodes@{% + \POE@Verb{% + /@xref [\POE@key@extnode@xrefs] def + /@yref [\POE@key@extnode@yrefs] def + /@@ang + \ifx\POE@key@innercompalign\POE@str@absolute + /N@\POE@refnodeA\space /N@\POE@refnodeB\space SlopeAngle + \else + 0 + \fi def + }% + \ifx\POE@key@extnodealign\POE@str@absolute + \POE@Verb{% + /N@\POE@refnodeA\space @GetCenter /N@\POE@refnodeB\space @GetCenter + @ABVect exch + dup 0 gt 3 1 roll 0 eq exch 0 lt and or + { /RefFac -1 def } if + }% + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@pnode@shiftedrot} +% Define a new node \#3 shifted by (\#1) relative to existing node \#2. +% Aditionally rotate the new node by \#4 degree around existing node as origin. +% \begin{macrocode} +\def\POE@pnode@shiftedrot(#1)#2#3#4{% + \pst@getcoor{#1}\POE@temp% + \pnode(! \POE@dict{ + /N@#2 @GetCenter \POE@temp + #4 \POE@key@labelrefangle\space add matrix rotate dtransform + VecAdd \tx@UserCoor }){#3}% + \psset[optexp]{ref@angle=0} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@nlput} +% We cannot use \cs{nlput} from \opt{pst-node}, because that does not work +% correctly for negative distances together with \opt{nrot=:U}, which happens +% for \opt{position=start}. +% \begin{macrocode} +\def\POE@nlput{\pst@object{POE@nlput}} +\def\POE@nlput@i(#1)(#2)#3#4{% + \begin@SpecialObj + \POE@LDNode(#1)(#2){#3} + \pcline[linestyle=none,fillstyle=none, arrows=-, ArrowInside=-](temp@nlputA)(temp@nlputB)% + \ncput[npos=0.5]{#4}% + \end@SpecialObj} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@LDNode} +% \begin{macrocode} +\def\POE@LDNode(#1)(#2)#3{% + \pst@getcoor{#1}\pst@tempA% + \pst@getcoor{#2}\pst@tempB% + \pnode(! + \pst@tempA \tx@UserCoor /YA ED /XA ED + \pst@tempB \tx@UserCoor /YB ED /XB ED + /dx XB XA sub def + /dy YB YA sub def + /angle dy dx Atan def + XA #3 1 sub angle cos mul add + YA #3 1 sub angle sin mul add ){temp@nlputA}% + \pnode(! + \pst@tempA \tx@UserCoor /YA ED /XA ED + \pst@tempB \tx@UserCoor /YB ED /XB ED + /dx XB XA sub def + /dy YB YA sub def + /angle dy dx Atan def + XA #3 1 add angle cos mul add + YA #3 1 add angle sin mul add ){temp@nlputB}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@putlabelrelative} +% Used to put the label for labelref=relative +% \begin{macrocode} +\def\POE@putlabelrelative#1{% + \nput[labelsep=0]{\POE@key@labelangle}% + {\oenodeLabel{}}% + {\rput[\POE@key@labelalign](0,0){\POE@key@labelstyle #1}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@putcomp} +% Place the component in argument \#1 and define a new node +% \oenodeLabel{} for positioning of the label. +% \begin{macrocode} +\def\POE@putcomp#1{% + \rput(! \POE@key@comp@Xshift\space\POE@key@comp@Yshift){% + \pnode(! \POE@dict{ + \POE@key@rotate@xref\space + \POE@key@rotate@yref\space + DefineExtNode}){\oenodeRotref{}}% + \psrotate(\oenodeRotref{}){!\POE@key@angle}{% + #1% + \POE@pnode@shiftedrot(0,\POE@key@labeloffset)% + {\oenodeCenter{}}% + {\oenodeLabel{}}% + {\POE@key@labelangle}% + }% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@putlabel} +% Positioning of the label depending on the reference coordinates. +% Needs possibly a previously defined node \cs{oenodeLabel} which +% marks exactly the position of the label relative to the component. +% This is defined by calling \cs{poe@putcomp}. +% \begin{macrocode} +\def\POE@putlabel#1{% + \def\POE@temp{#1}% +% \end{macrocode} +% Put the label only if it's not empty. +% \begin{macrocode} + \ifx\POE@temp\@empty +% \end{macrocode} +% Place the correct 'global' label node when the label is empty. +% \begin{macrocode} + \ifx\POE@key@labelref\POE@str@global + \nput[labelsep=\POE@key@labeloffset]% + {\POE@key@labelangle}% + {\oenodeCenter{}}% + {\pnode(0,0){\oenodeLabel{}}}% + \fi + \else +% \end{macrocode} +% For \opt{global} positioning, the label is placed in global coordinate system +% with respect to the center node. +% \begin{macrocode} + \ifx\POE@key@labelref\POE@str@global + \nput[labelsep=\POE@key@labeloffset]% + {\POE@key@labelangle}% + {\oenodeCenter{}}% + {\pnode(0,0){\oenodeLabel{}}% + \rput[\POE@key@labelalign](0,0){\POE@key@labelstyle\oelabel{#1}}}% +% \end{macrocode} +% Rotate the label node together with the component, but do not rotate the label +% text itself. +% \begin{macrocode} + \else\ifx\POE@key@labelref\POE@str@relgrav + \rput[\POE@key@labelalign](\oenodeLabel{}){% + \POE@key@labelstyle\oelabel{#1}}% +% \end{macrocode} +% Rotate label node and label text with the component. +% \begin{macrocode} + \else\ifx\POE@key@labelref\POE@str@relative + \begingroup +% \end{macrocode} +% Redefine InitNC only for positioning of the label with labelref=relative +% \begin{macrocode} + \pst@def{InitNC}< % kindly contributed by Herbert Voss + /b ED /a ED + /NodeSepTypeB ED /NodeSepTypeA ED + /NodeSepB ED /NodeSepA ED + /OffsetB ED /OffsetA ED + tx@NodeDict a known tx@NodeDict b known and dup { + /NodeA a load def /NodeB b load def + NodeA GetCenter NodeB GetCenter + 4 copy exch 4 -1 roll 2 copy gt + { pop pop pop pop /yB ED /xB ED /yA ED /xA ED } + { eq 3 1 roll lt and + { /yB ED /xB ED /yA ED /xA ED} + { /yA ED /xA ED /yB ED /xB ED} ifelse + } ifelse + } if >% + \ncline[linestyle=none,fillstyle=none, npos=, arrows=-, ArrowInside=-]% + {\POE@trefnodeA}{\POE@trefnodeB}% + \ifx\POE@key@position\@empty + \ifx\POE@key@abspos\@empty + \ncput[nrot=:U,npos=]{\POE@putlabelrelative{\oelabel{#1}}}% + \else + \POE@nlput[nrot=:U](\POE@trefnodeA)(\POE@trefnodeB)% + {\POE@key@abspos}{\POE@putlabelrelative{\oelabel{#1}}}% + \fi + \else + \ncput[nrot=:U, npos=\POE@key@position]% + {\POE@putlabelrelative{\oelabel{#1}}}% + \fi + \endgroup + \fi\fi\fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Free-ray components} +% +% Define all free-ray dipoles +% \begin{macrocode} +\newOptexpDipole{lens} +\newOptexpDipole{asphericlens} +\newOptexpDipole{pinhole} +\newOptexpDipole{crystal} +\newOptexpDipole{polarization} +\newOptexpDipole{optbox} +\newOptexpDipole{optsource}{position=start} +\newOptexpDipole{optplate} +\newOptexpDipole{optretplate} +\newOptexpDipole{optdetector}{position=end} +\newOptexpDipole{optdiode}{allowbeaminside=false} +\newOptexpDipole{doveprism} +\newOptexpDipole{glanthompson} +\newOptexpDipole{parabolicmirror}{position=end, ref@angle=-90} +\newOptexpDipole{axicon} +\newOptexpDipole{optwedge} +% \end{macrocode} +% +% Define all free-ray tripoles +% \begin{macrocode} +\newOptexpTripole{mirror} +\newOptexpTripole[ref@angle=45]{beamsplitter} +\newOptexpTripole{optgrating} +\newOptexpTripole[ref@angle=90]{transmissiongrating} +\def\optgrid{% + \PackageWarning{pst-optexp}{% + \string\optgrid\space is deprecated,\MessageBreak + use \string\optgrating\space instead.}% + \optgrating% +}% +\newOptexpTripole[ref@angle=45]{pentaprism} +\newOptexpTripole[ref@angle=45]{rightangleprism} +\newOptexpTripole[ref@angle=45]{optprism} +\newOptexpTripole{oapmirror} +% \end{macrocode} +% +% \begin{macro}{\optdipole} +% \begin{macrocode} +\def\optdipole{\pst@object{optdipole}} +\def\optdipole@i(#1)(#2){% + \@ifnextchar\bgroup% + {\optdipole@iii(#1)(#2)}% + {\optdipole@ii(#1)(#2)}% +}% +\def\optdipole@ii(#1)(#2){% + \optdipole@v(#1)(#2){}{}% +}% +\def\optdipole@iii(#1)(#2)#3{% + \@ifnextchar\bgroup% + {\optdipole@iv(#1)(#2){#3}}% + {\optdipole@v(#1)(#2){#3}}% +}% +\def\optdipole@iv(#1)(#2)#3#4{% + \addbefore@par{innercompalign=relative}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{#1}{#2}% + \fi + \def\optdipole@comp{\psrotate(0,0){!\POE@dict{@@ang}}{#3}}% + \POE@drawcomponent{optdipole}{#4}% + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpObj +}% +% \end{macrocode} +% Only one argument given, decide if this is supposed to be the label, +% or the component. +% \begin{macrocode} +\def\optdipole@v(#1)(#2)#3{% + \addbefore@par{innercompalign=relative}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{#1}{#2} + \fi + \ifx\POE@key@optdipolecomp\@empty + \def\optdipole@comp{\psrotate(0,0){!\POE@dict{@@ang}}{#3}}% + \POE@drawcomponent{optdipole}{} + \else + \def\optdipole@comp{\psrotate(0,0){!\POE@dict{@@ang}}{\POE@key@optdipolecomp}}% + \POE@drawcomponent{optdipole}{#3} + \fi + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpObj +}% +\def\optdipole@nodes{\POE@dipole@nodes} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optdipole@ref} +% \begin{macrocode} +\def\optdipole@ref{% + \POE@setref{% + /@@x \POE@key@optdipolewidth\space 0.5 mul def + /@@y \POE@key@optdipoleheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\opttripole} +% \begin{macrocode} +\def\opttripole{\pst@object{opttripole}} +\def\opttripole@i(#1)(#2)(#3){% + \@ifnextchar\bgroup + {\opttripole@iii(#1)(#2)(#3)}% + {\opttripole@ii(#1)(#2)(#3)}% +}% +\def\opttripole@ii(#1)(#2)(#3){% + \opttripole@v(#1)(#2)(#3){}{}% +}% +\def\opttripole@iii(#1)(#2)(#3)#4{% + \@ifnextchar\bgroup + {\opttripole@iv(#1)(#2)(#3){#4}}% + {\opttripole@v(#1)(#2)(#3){#4}}% +}% +\def\opttripole@iv(#1)(#2)(#3)#4#5{% + \addafter@par{ref@angle=0} + \begin@OptexpTripole + \ifPOE@backlayer + \POE@calcNodes{#1}{#2}{#3}% + \POE@regNodes{#1}{#3}% + \fi + \def\opttripole@comp{#4}% + \POE@drawcomponent{opttripole}{#5} + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpTripole +}% +% \end{macrocode} +% Only one argument given, decide if this is supposed to be the label, or the component +% \begin{macrocode} +\def\opttripole@v(#1)(#2)(#3)#4{% + \addafter@par{ref@angle=0} + \begin@OptexpTripole + \ifPOE@backlayer + \POE@calcNodes{#1}{#2}{#3}% + \POE@regNodes{#1}{#3}% + \fi + \ifx\POE@key@opttripolecomp\@empty + \def\opttripole@comp{#3}% + \POE@drawcomponent{opttripole}{}% + \else + \def\opttripole@comp{\POE@key@opttripolecomp}% + \POE@drawcomponent{opttripole}{#4}% + \fi + \ifPOE@backlayer + \POE@InternalConn + \fi + \end@OptexpTripole +}% +\def\opttripole@nodes{\POE@tripole@nodes} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fibercollimator} +% \begin{macrocode} +\def\fibercollimator{\pst@object{fibercollimator}} +\def\fibercollimator@i(#1)(#2){% + \def\POE@tempa{#1}% + \def\POE@tempb{#2}% + \def\POE@tempc{}% + \def\POE@tempd{}% + \@ifnextchar(%) + {\fibercollimator@ii}{\fibercollimator@iv}% +}% +\def\fibercollimator@ii(#1){% + \def\POE@tempc{#1}% + \@ifnextchar(%) + {\fibercollimator@iii}{\fibercollimator@iv}% +}% +\def\fibercollimator@iii(#1){% + \def\POE@tempd{#1}% + \fibercollimator@iv +}% +\def\fibercollimator@iv{% + \@ifnextchar\bgroup{\fibercollimator@v}{\fibercollimator@v{}}% +}% +\def\fibercollimator@v#1{% + \addbefore@par{allowbeaminside=false}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{\POE@tempa}{\POE@tempb}% + \fi + \POE@drawcomponent{fibercollimator}{#1} + \ifPOE@backlayer + \ifPOE@beam + \drawbeam(\oenodeRefA{}){} + \fi + \ifPOE@fiberpresetout@ + \ifx\@empty\POE@tempc + \drawfiber{}(\oenodeRefB{}) + \else\ifx\@empty\POE@tempd + \psbezier[style=FiberOut](\oenodeOut{})(\POE@tempb)% + (\POE@tempb)(\POE@tempc)% + \else + \psbezier[style=FiberOut](\oenodeOut{})(\POE@tempb)% + (\POE@tempc)(\POE@tempd)% + \fi\fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% Define all fiber dipoles +% \begin{macrocode} +\newOptexpFiberDipole{optfiber}{newOptComp={}} +\newOptexpFiberDipole{optamp} +\newOptexpFiberDipole{optmzm} +\newOptexpFiberDipole{optfilter}{allowbeaminside=false} +\newOptexpFiberDipole{polcontrol} +\newOptexpFiberDipole{optisolator} +\newOptexpFiberDipole{optfiberpolarizer} +\newOptexpFiberDipole{optswitch} +\newOptexpFiberDipole{fiberdelayline} +% \end{macrocode} +% +% \begin{macro}{\POE@drawcomponent} +% This macro is called by every unit +% The first parameter contains the label, the second one the drawing code +% \begin{macrocode} +\def\POE@drawcomponent#1#2{% + \def\POE@comp{% + \ifPOE@backlayer + \pnode(!\POE@dict{@@x0 @@y0}){\oenodeCenter{}} + \@nameuse{#1@nodes} + \fi + \ifPOE@frontlayer + \@nameuse{#1@comp} + \fi + \ifx\POE@key@extnode\@empty\else + \ifPOE@backlayer + \multido{\i=1+1}{\POE@key@extnode@cnt}{% + \pnode(! \POE@dict{ + @xref \i\space 1 sub get + @yref \i\space 1 sub get + DefineExtNode}){\oenode{Ext\i}{}}% + \pnode(\oenode{Ext1}{}){\oenodeExt{}}% + }% + \POE@Verb{% + tx@NodeDict begin /N@\oenodeExt{} load + \ifnum9<1\POE@key@compname + /N@ExtNode + \else + /N@\POE@key@compname ExtNode + \fi + ED end + }% + \fi + \fi + }% + \@ifundefined{#1@ref}{}{\@nameuse{#1@ref}}% + \begingroup + \ifPOE@endbox + \psset[optexp]{abspos={% + \POE@dict{% + /N@\POE@refnodeA\space @GetCenter \tx@UserCoor + /N@\POE@refnodeB\space @GetCenter \tx@UserCoor + @ABDist @@x0 @@x add add + }% + }}% + \else\ifPOE@startbox + \psset[optexp]{abspos={\POE@dict{ @@x0 neg @@x sub }}}% + \fi\fi + \POE@disablepos + \ncline[linestyle=none,fillstyle=none,npos=,arrows=-,ArrowInside=-]% + {\POE@refnodeA}{\POE@refnodeB}% +% \end{macrocode} +% Positioning of the component +% \begin{macrocode} + \psset{style=OptComp}% +% \end{macrocode} +% linestyle to use, if component should be marked as optional +% \begin{macrocode} + \ifPOE@component@optional + \psset{style=OptionalStyle}% + \fi +% \end{macrocode} +% If parameter \opt{position} is given, use it for \opt{npos}. +% \begin{macrocode} + \ifx\POE@key@abspos\@empty +% \end{macrocode} +% Then check if absolute positioning with \opt{abspos} is wanted. +% \begin{macrocode} + \ifx\POE@key@position\@empty + \ncput[nrot=:U,npos=]{\POE@putcomp{\POE@comp}}% + \else + \ncput[nrot=:U,npos=\POE@key@position]{\POE@putcomp{\POE@comp}}% + \fi + \else + \POE@nlput[nrot=:U](\POE@refnodeA)(\POE@refnodeB)% + {\POE@key@abspos}{\POE@putcomp{\POE@comp}}% + \fi + \endgroup + \ifPOE@backlayer + \POE@transformnodes + \fi + \ifPOE@frontlayer + \POE@putlabel{#2}% + \fi +% \end{macrocode} +% Show some special dots for debugging +% \begin{macrocode} + \ifPOE@debug@showoptdots + \ifPOE@frontlayer + \psdot[linecolor=red](\oenodeCenter{}) + \psdot[linecolor=red, dotstyle=x, dotscale=1.5](\oenodeLabel{}) + \psdot[linecolor=black](\oenodeRefA{}) + \psdot[linecolor=black](\oenodeRefB{}) + \psdot[linecolor=black, dotstyle=x, + dotscale=1.5](\oenodeTrefA{}) + \psdot[linecolor=black, dotstyle=x, + dotscale=1.5](\oenodeTrefB{}) + \fi + \fi + \ifPOE@debug@showinterfaces + \ifPOE@frontlayer + \POE@drawinterfaces[style=IfcStyle] + \fi + \fi + \ifPOE@debug@showifcnodes + \ifPOE@frontlayer + \POE@ifcnodes[style=IfcNodeStyle] + \fi + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{POE@setref} +% \begin{macrocode} +\let\POE@setref\POE@Verb +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{POE@transformnode} +% Transform node \opt{\#1} according to the positioning parameters +% (\opt{compshift}, \opt{position}, and \opt{abspos}) with respect to the +% rotation reference node and define it as \opt{\#2}. +% \begin{macrocode} +\def\POE@transformnode#1#2{% + \pnode(! + \POE@dict{% + /N@\oenodeRotref{} @GetCenter 2 copy + /N@#1 @GetCenter + \POE@key@comp@Xshift\space\POE@key@comp@Yshift\space + \tx@ScreenCoor VecAdd 4 2 roll @ABVect + \POE@key@angle\space matrix rotate dtransform VecAdd + \tx@UserCoor + }){#2}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@ifcnodes} +% \begin{macrocode} +\def\POE@ifcnodes{\pst@object{POE@ifcnodes}} +\def\POE@ifcnodes@i{% + \begin@SpecialObj% + \solid@star% + \addto@pscode{ + \psk@dotsize + \@nameuse{psds@\psk@dotstyle} + \POE@dict{[ (\oenode{}{}) false GetInternalBeamNodes %] + counttomark 2 idiv { Dot } repeat + pop} + }% + \end@SpecialObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@drawinterfaces} +% \begin{macrocode} +\def\POE@drawinterfaces{\pst@object{POE@drawinterfaces}} +\def\POE@drawinterfaces@i{% + \begin@OpenObj% + \addto@pscode{% + \psk@dotsize + \@nameuse{psds@\psk@dotstyle} + \pst@optexpdict + /\oenode{}{} load begin + 1 1 N { + IfcName load begin + X Y + CompMtrx transform CM itransform 2 copy + currentdict /RX known { 0 0 }{ DX DY } ifelse + CompMtrx dtransform CM idtransform 2 copy + NAlow 0 eq NAup 0 eq and { + -0.5 VecScale 4 2 roll 0.5 VecScale + } { + \tx@UserCoor NAlow VecScale 4 2 roll \tx@UserCoor NAup VecScale + } ifelse + end + 8 -2 roll VecAdd moveto VecAdd lineto + } for + end end }% + \pst@stroke + \use@pscode + \end@OpenObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{POE@extnodes} +% \begin{macrocode} +\def\POE@extnodes{\pst@object{POE@extnodes}} +\def\POE@extnodes@i#1{% + \begin@SpecialObj + \let\POE@setref\addto@pscode + \addto@pscode{\pst@optexpdict InitOptexpComp } + \@ifundefined{#1@ref}{}{\@nameuse{#1@ref}}% + \solid@star% + \addto@pscode{ + \psk@dotsize + \@nameuse{psds@\psk@dotstyle} + @@x 0 eq { [0] }{ [ @@x neg 0 @@x ] } ifelse + { + @@y 0 eq { [0] }{ [@@y neg 0 @@y ] } ifelse + { + exch dup 3 1 roll + @@x0 add exch @@y0 add \tx@ScreenCoor + /\oenode{}{} load begin CompMtrx end transform CM itransform + Dot + } forall + pop + } forall + end + }% + \end@SpecialObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@tripole@nodes} +% \begin{macrocode} +\def\POE@tripole@nodes{% + \newOptexpComp{{0 0} {1 0} @@x neg @@x refl {PlainIfc} 1}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@dipole@nodes} +% \begin{macrocode} +\def\POE@dipole@nodes{% + \newOptexpComp{% + {@@x0 @@x sub 0} {0 1} @@y0 @@y sub @@y0 @@y add trans {PlainIfc} + @@x 0 eq not { + {@@x0 @@x add 0} {0 1} @@y0 @@y sub @@y0 @@y add trans {PlainIfc} + } if \POE@key@n }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{POE@fiberdipole@nodes} +% \begin{macrocode} +\def\POE@fiberdipole@nodes{% + \newOptexpFiberComp{% + {@@x0 @@x sub 0} + @@x 0 eq not { + {@@x0 @@x add 0} + } if }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\POE@elecdipole@nodes\POE@fiberdipole@nodes +% \end{macrocode} +% +% \begin{macro}{POE@comp@rectangle} +% \begin{macrocode} +\def\POE@comp@rectangle{% + \psframe[dimen=outer](!\POE@dict{@@x neg @@y0 @@y sub})% + (!\POE@dict{@@x @@y0 @@y add})% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Free-ray components} +% +% \subsubsection{mirror} +% +% \begin{macro}{\mirror@ref} +% \begin{macrocode} +\def\mirror@ref{% + \ifdim\POE@key@mirrorradius pt=0pt + \ifx\POE@key@mirrortype\POE@str@piezo + \POE@setref{/@@y0 \pst@number\psyunit def}% + \bgroup + \psset{style=PiezoMirror}% + \POE@setref{% + \pst@number\psyunit @@y0 div + \POE@key@mirrorwidth\space 0.5 mul mul 2.5 div /@@y0 ED + }% + \egroup + \else + \POE@setref{/@@x \POE@key@mirrorwidth\space 0.5 mul def}% + \ifx\POE@key@mirrortype\POE@str@plain\else + \POE@setref{\POE@key@mirrordepth\space 0.5 mul dup /@@y0 ED /@@y ED}% + \fi + \fi + \else + \POE@setref{/@@x \POE@key@mirrorwidth\space 0.5 mul def}% + \ifx\POE@key@mirrortype\POE@str@plain\else + \POE@setref{\POE@key@mirrordepth\space 0.5 mul dup /@@y0 ED /@@y ED}% + \fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mirror@nodes} +% \begin{macrocode} +\def\mirror@nodes{% + \begin@CompIfc +% \end{macrocode} +% Add this one reflective interface in any case +% \begin{macrocode} + \ifdim\POE@key@mirrorradius pt=0pt + \addto@pscode{% + {0 0} {1 0} + \POE@key@mirrorwidth\space -0.5 mul dup neg + refl {PlainIfc} }% + \else + \addto@pscode{% + {0 0} {0 \POE@key@mirrorradius\space neg} + \POE@key@mirrorwidth\space -0.5 mul dup neg + refl {CurvedIfc} }% + \fi +% \end{macrocode} +% A second interface exists only for semitrans mirrors +% \begin{macrocode} + \ifx\POE@key@mirrortype\POE@str@semitrans +% \end{macrocode} +% if no second mirror radius was specified, use the same curvature of the first interface. +% \begin{macrocode} + \ifx\POE@key@mirrorradiusB\@empty + \ifdim\POE@key@mirrorradius pt=0pt + \addto@pscode{% + {0 \POE@key@mirrordepth} {1 0} + @@x neg @@x trans {PlainIfc} }% + \else + \addto@pscode{% + {0 \POE@key@mirrordepth} + {0 \POE@key@mirrorradius\space neg} + \POE@key@mirrorwidth\space -0.5 mul dup neg + trans {CurvedIfc} }% + \fi + \else +% \end{macrocode} +% the second interface is plain if it should not have the curvature of the first interface. +% \begin{macrocode} + \addto@pscode{% + {0 \POE@key@mirrordepth + dup \POE@key@mirrorradius\space mul 0 lt { + dup sign \POE@key@mirrorradius\space @@x capHeight mul add + } if} + {1 0} @@x neg @@x trans {PlainIfc} }% + \fi +% \end{macrocode} +% Rearrange the two interfaces depending on the sign of mirrordepth +% \begin{macrocode} + \addto@pscode{% + \ifdim\POE@key@mirrordepth pt<-0.0001pt + 12 6 roll 2 + \else + \ifdim\POE@key@mirrordepth pt< 0.0001pt + 6 {pop} repeat + \fi + 1 + \fi + \POE@key@n + }% + \end@AmbCompIfc + \else + \addto@pscode{1 }% + \end@CompIfc + \fi + \pnode(0,0){\oenodeCenter{}} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mirror@comp} +% \begin{macrocode} +\def\mirror@comp{% + \edef\@ht{% + \POE@key@mirrorwidth\space\pst@number\psyunit mul 0.5 mul % + }% + \edef\@dp{\POE@key@mirrordepth\space\pst@number\psxunit mul }% + \edef\@r{\POE@key@mirrorradius\space\pst@number\psxunit mul }% + \edef\@postcode{% + neg 5 -1 roll exch 5 2 roll 90 add exch 90 add exch ArcR % + }% + \edef\@extpostcode{% + neg \@dp add 5 -1 roll exch 5 2 roll 90 add exch 90 add % + }% + \ifdim\POE@key@mirrorradius pt=0pt +% \end{macrocode} +% plain mirror +% \begin{macrocode} + \edef\@ht{\POE@key@mirrorwidth\space 0.5 mul }% + \ifx\POE@key@mirrortype\POE@str@piezo + \psframe[style=PiezoMirror, + dimen=outer](! \@ht 4 div 0)% + (! \@ht -4 div \@ht 2.5 div) + \ifx\POE@key@extnode\@empty + \psbezier[fillstyle=none](! 0 \@ht 2.5 div)% + (! 0 \@ht 1.5 div)% + (! \@ht 2 div \@ht 2 div)% + (! \@ht 4 div \@ht) + \fi + \else\ifx\POE@key@mirrortype\POE@str@extended + \psframe[style=ExtendedMirror]% + (! \@ht neg \POE@key@mirrordepth\space )% + (! \@ht 0) + \else\ifx\POE@key@mirrortype\POE@str@semitrans + \psframe[style=SemitransMirror]% + (! \@ht neg \POE@key@mirrordepth\space )% + (! \@ht 0) + \fi\fi\fi + \ifx\POE@key@mirrortype\POE@str@semitrans + \psline[linewidth=\POE@key@mirrorlinewidth]% + (! \@ht neg 0)(! \@ht 0) + \else + \psline[linewidth=\POE@key@mirrorlinewidth]% + (! \@ht neg \POE@clwh)(! \@ht \POE@clwh) + \fi + \else +% \end{macrocode} +% concave/convex mirror +% \begin{macrocode} + \ifdim\POE@key@mirrorradius pt<0pt + \def\POE@temparc{arc } + \else + \def\POE@temparc{arcn } + \fi + \ifodd + \ifx\POE@key@mirrortype\POE@str@extended 1 + \else\ifx\POE@key@mirrortype\POE@str@semitrans 1 + \else 0 + \fi\fi +% \end{macrocode} +% extended or semitrans mirrortype +% \begin{macrocode} + \bgroup + \ifx\POE@key@mirrortype\POE@str@extended + \psset{style=ExtendedMirror} + \else\ifx\POE@key@mirrortype\POE@str@semitrans + \psset{style=SemitransMirror} + \fi\fi + \begin@ClosedObj + \addto@pscode{% + \pst@optexpdict \@ht \@r rightCurvedIfc \@postcode + \ifx\POE@key@mirrorradiusB\@empty + \@ht \@r rightCurvedIfc \@extpostcode \POE@temparc + \else + 0 \@dp +% \end{macrocode} +% For positive mirrorradius and positive mirror depth, add the cap +% height so that mirrordepth is the minimum mirror depth. For both +% negative radius and depth, subtract the cap height. +% \begin{macrocode} + \POE@key@mirrordepth\space\POE@key@mirrorradius\space + mul 0 gt { + dup sign \@r \@ht capHeight mul add + } if + rlineto 2 \@ht mul 0 rlineto + \fi + closepath end}% + \end@ClosedObj + \egroup + \fi +% \end{macrocode} +% draw the reflective interface +% \begin{macrocode} + \bgroup + \psset{linewidth=\POE@key@mirrorlinewidth, fillstyle=none} + \begin@OpenObj + \addto@pscode{\POE@dict{ \@ht \@r rightCurvedIfc \@postcode }}% + \end@OpenObj + \egroup + \fi + \ifPOE@variable + \psarc[style=VariableStyle]% + (! \POE@key@mirrorwidth\space 0.5 mul 0.4 sub + \ifdim\POE@key@mirrorradius pt=0pt + 0 + \else + \POE@key@mirrorradius\space dup \POE@dict{sign} neg exch + \POE@key@mirrorwidth\space 0.5 mul \POE@dict{capHeight} mul + \fi){0.6}{-20}{20} + \psarc[style=VariableStyle]% + (! 0.4 \POE@key@mirrorwidth\space 0.5 mul sub + \ifdim\POE@key@mirrorradius pt=0pt + 0 + \else + \POE@key@mirrorradius\space dup \POE@dict{sign} neg exch + \POE@key@mirrorwidth\space 0.5 mul \POE@dict{capHeight} mul + \fi){0.6}{160}{200} + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{parabolicmirror} +% +% \begin{macro}{\parabolicmirror@nodes} +% \begin{macrocode} +\def\parabolicmirror@nodes{% + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{A}}{% + \parametricplot[algebraic, VarStep, VarStepEpsilon=1e-7, plotstyle=cspline]% + {0}{\POE@key@parmirrorheight\space 0.5 mul}% + {-\POE@key@parmirrorwidth/(0.25*\POE@key@parmirrorheight^2)*t^2|-t}} + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{B}}{% + \parametricplot[algebraic, VarStep, VarStepEpsilon=1e-7, plotstyle=cspline]% + {0}{\POE@key@parmirrorheight\space 0.5 mul}% + {-\POE@key@parmirrorwidth/(0.25*\POE@key@parmirrorheight^2)*t^2|t}} + \newOptexpComp{% + {-\POE@key@parmirrorwidth\space 0.16 mul \POE@key@parmirrorheight\space -0.2 mul} + tx@IntersectDict /\PIT@name{\oenode@Path{A}} get 0 0 refl {PathIfc} + {0 0} {1 0} 0 0 trans {PlainIfc} + {-\POE@key@parmirrorwidth\space 0.16 mul \POE@key@parmirrorheight\space 0.2 mul} + tx@IntersectDict /\PIT@name{\oenode@Path{B}} get 0 0 refl {PathIfc} + 1 }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parabolicmirror@comp} +% \begin{macrocode} +\def\parabolicmirror@comp{% + \pstracecurve{\oenode@Path{A}} + \pstracecurve{\oenode@Path{B}} +\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{lens} +% +% \begin{macro}{\lens@ref} +% \begin{macrocode} +\def\lens@ref{% + \ifdim\POE@key@lensradiusleft pt=0pt + \edef\@th{0 }% + \else + \edef\@th{% + \ifPOE@thicklens + \POE@key@lenswidth\space 0.5 mul + \else + \ifdim\POE@key@lensradiusleft pt<0pt + \POE@key@lensheight\space 0.075 mul + \else + \POE@key@lensradiusleft + \POE@key@lensheight\space 0.5 mul capHeight + \fi + \fi + \space}% + \fi + \ifdim\POE@key@lensradiusright pt=0pt\else + \edef\@th{% + \@th\space + \ifPOE@thicklens + \POE@key@lenswidth\space 0.5 mul + \else + \ifdim\POE@key@lensradiusright pt<0pt + \POE@key@lensheight\space 0.075 mul + \else + \POE@key@lensradiusright + \POE@key@lensheight\space 0.5 mul capHeight + \fi + \fi + \space add + \space}% + \fi + \POE@setref{% + /@@y \POE@key@lensheight\space 0.5 mul def + /@@x \@th 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lens@nodes} +% \begin{macrocode} +\def\lens@nodes{% + \newOptexpComp{% + {@@x neg 0} + \ifdim\POE@key@lensradiusleft pt=0pt + {0 1} + \POE@key@lensheight\space -0.5 mul dup neg + trans {PlainIfc} + \else + {\POE@key@lensradiusleft\space 0} + \POE@key@lensheight\space -0.5 mul dup neg + trans {CurvedIfc} + \fi + {@@x 0} + \ifdim\POE@key@lensradiusright pt=0pt + {0 1} + \POE@key@lensheight\space -0.5 mul dup neg + trans {PlainIfc} + \else + {\POE@key@lensradiusright\space neg 0} + \POE@key@lensheight\space -0.5 mul dup neg + trans {CurvedIfc} + \fi + \POE@key@n + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lens@comp} +% \begin{macrocode} +\def\lens@comp{% + \addbefore@par{linejoin=1}% + \begin@ClosedObj + \addto@pscode{\pst@optexpdict }% + \def\@th{0}% + \def\@wd{\POE@key@lenswidth\space\pst@number\psxunit mul 2 div }% + \def\@ht{\POE@key@lensheight\space\pst@number\psyunit mul 2 div }% + \def\@rL{\POE@key@lensradiusleft\space\pst@number\psrunit mul }% + \def\@rR{\POE@key@lensradiusright\space\pst@number\psrunit mul }% + \ifdim\POE@key@lensradiusleft pt=0pt\else + \addto@pscode{ \@ht \@rL leftCurvedIfc }% + \fi + \ifdim\POE@key@lensradiusright pt=0pt\else + \addto@pscode{ \@ht \@rR rightCurvedIfc }% + \fi + \def\@@x{@@x \pst@number\psxunit mul }% +% \end{macrocode} +% Check some special cases: +% +% 1) Left is plain - right concave / convex +% \begin{macrocode} + \ifdim\POE@key@lensradiusleft pt=0pt + \ifdim\POE@key@lensradiusright pt=0pt\else + \addto@pscode{% + \@@x sub neg 5 1 roll + \@@x neg \@ht neg moveto ArcR + \@@x neg \@ht lineto + }% + \fi + \fi +% \end{macrocode} +% 2) Right is plain - left concave / convex +% \begin{macrocode} + \ifdim\POE@key@lensradiusright pt=0pt + \ifdim\POE@key@lensradiusleft pt=0pt\else + \addto@pscode{% + \@@x sub 5 1 roll + \@@x \@ht moveto ArcL + \@@x \@ht neg lineto + }% + \fi + \fi +% \end{macrocode} +% 3) right and left are both curved +% \begin{macrocode} + \ifdim\POE@key@lensradiusright pt=0pt\else + \ifdim\POE@key@lensradiusleft pt=0pt\else + \addto@pscode{% + \@@x dup + 7 1 roll sub neg 5 1 roll + ArcR sub 5 1 roll ArcL + }% + \fi + \fi + \addto@pscode{closepath 1 setlinejoin end }% + \end@ClosedObj +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Aspheric lens} +% +% \begin{macro}{\asphericlens@nodes} +% \begin{macrocode} +\def\asphericlens@nodes{% + \def\POE@asphere##1{% + (##1)^2*(1/(\POE@key@asphereradiusleft*(1+sqrt(1-(1+\POE@key@asphereconstant)*(##1)^2/\POE@key@asphereradiusleft^2)))+% + (##1)^2*(\POE@key@asphereAfour % + + (##1)^2*(\POE@key@asphereAsix % + + ((##1)^2*(\POE@key@asphereAeight % + + \POE@key@asphereAten*(##1)^2)))))}% + \def\POE@arcright##1{% + (##1)^2/(\POE@key@asphereradiusright*sqrt(1-(##1)^2/\POE@key@asphereradiusright^2))}% + \POE@Verb{% + tx@Dict begin + /POEasphereleftx0 (\POE@asphere{0.5*\POE@key@asphereheight}) AlgParser cvx exec def + /POEasphererightx0 + \ifdim\POE@key@asphereradiusright pt>0pt + (\POE@arcright{0.5*\POE@key@asphereheight}) AlgParser cvx exec + \else + 0 + \fi + def + \POE@key@aspherewidth\space POEasphereleftx0 POEasphererightx0 add sub dup 0 gt { + POEasphererightx0 add /POEasphererightx0 exch def + } { + pop + } ifelse + end + }% + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{A}}{% + \psparametricplot[algebraic, plotstyle=cspline]% + {\POE@key@asphereheight\space -0.5 mul}% + {\POE@key@asphereheight\space 0.5 mul}% + {\POE@asphere{t}-POEasphereleftx0|t}}% + \ifdim\POE@key@asphereradiusright pt>0pt + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{B}}{% + \psparametricplot[algebraic, plotstyle=cspline]% + {\POE@key@asphereheight\space 0.5 mul}% + {\POE@key@asphereheight\space -0.5 mul}% + {-\POE@arcright{t}+POEasphererightx0|t}}% + \fi + \newOptexpComp{% + {POEasphereleftx0 neg 0} tx@IntersectDict /\PIT@name{\oenode@Path{A}} get 0 0 trans {PathIfc} + {POEasphererightx0 0} + \ifdim\POE@key@asphereradiusright pt>0pt + tx@IntersectDict /\PIT@name{\oenode@Path{B}} get 0 0 trans {PathIfc} + \else + {0 1} 0 0 trans {PlainIfc} + \fi + \POE@key@n }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\asphericlens@comp} +% \begin{macrocode} +\def\asphericlens@comp{% + \pscustom[arrows=-]{% + \pstracecurve{\oenode@Path{A}}% + \ifdim\POE@key@asphereradiusright pt>0pt + \pstracecurve{\oenode@Path{B}} + \else + \lineto(!POEasphererightx0 \POE@key@asphereheight\space 0.5 mul) + \lineto(!POEasphererightx0 \POE@key@asphereheight\space -0.5 mul) + \fi + \closepath}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{pinhole} +% +% \begin{macro}{\pinhole@ref} +% \begin{macrocode} +\def\pinhole@ref{% + \POE@setref{/@@y \POE@key@outerheight\space 0.5 mul def}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pinhole@nodes} +% \begin{macrocode} +\def\pinhole@nodes{% + \newOptexpComp{% + {-1e-4 0} {0 1} @@y0 @@y sub @@y0 @@y add trans {PlainIfc} + {0 0} {0 1} \POE@key@innerheight\space -0.5 mul dup neg + trans {PlainIfc} + {1e-4 0} {0 1} @@y0 @@y sub @@y0 @@y add trans {PlainIfc} + \POE@key@n }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pinhole@comp} +% \begin{macrocode} +\def\pinhole@comp{% + \ifdim\POE@key@phwidth pt=0pt + \psline[linewidth=\POE@key@phlinewidth]% + (! 0 \POE@key@outerheight\space 2 div)% + (! 0 \POE@key@innerheight\space 2 div)% + \psline[linewidth=\POE@key@phlinewidth]% + (! 0 \POE@key@outerheight\space -2 div)% + (! 0 \POE@key@innerheight\space -2 div)% + \else + \pspolygon*[linestyle=none]% + (! 0 \POE@key@innerheight\space 2 div)% + (! 0 \POE@key@outerheight\space 2 div)% + (! \POE@key@phwidth\space\POE@key@outerheight\space 2 div)% + (! \POE@key@phwidth\space\POE@key@innerheight\space dup neg + \POE@key@outerheight\space add 2 div add 2 div)% + \pspolygon*[linestyle=none]% + (! 0 \POE@key@innerheight\space -2 div)% + (! 0 \POE@key@outerheight\space -2 div)% + (! \POE@key@phwidth\space\POE@key@outerheight\space -2 div)% + (! \POE@key@phwidth\space\POE@key@innerheight\space dup neg + \POE@key@outerheight\space add 2 div add -2 div)% + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{beamsplitter} +% +% \begin{macro}{\beamsplitter@ref} +% \begin{macrocode} +\def\beamsplitter@ref{% + \POE@setref{/@@x \POE@key@bssize\space 0.5 sqrt mul def }% +}% +% \begin{macro}{\beamsplitter@nodes} +% \begin{macrocode} +\def\beamsplitter@nodes{% + \edef\@bs@wd{\POE@key@bssize\space 0.5 mul }% + \ifx\POE@key@bsstyle\POE@str@cube + \newOptexpCompAmb{% + {\@bs@wd 2 sqrt div neg dup} {-1 1} \@bs@wd neg \@bs@wd + trans {PlainIfc} + {\@bs@wd 2 sqrt div dup neg} {1 1} \@bs@wd neg \@bs@wd + trans {PlainIfc} + {0 0} {1 0} \@bs@wd 2 sqrt mul dup neg exch + trans {PlainIfc} + {\@bs@wd 2 sqrt div dup} {-1 1} \@bs@wd neg \@bs@wd + trans {PlainIfc} + {\@bs@wd 2 sqrt div neg dup neg} {1 1} \@bs@wd neg \@bs@wd + trans {PlainIfc} + 3 \POE@key@n + }% + \else\ifx\POE@key@bsstyle\POE@str@plate + \newOptexpCompAmb{% + {0 0} {1 0} \@bs@wd neg \@bs@wd trans {PlainIfc} 1 1 }% + \fi\fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\beamsplitter@comp} +% \begin{macrocode} +\def\beamsplitter@comp{% + \edef\@bs@wd{\POE@key@bssize\space 2.0 div }% + \ifx\POE@key@bsstyle\POE@str@cube + \psline[arrows=cc-cc](! \@bs@wd neg 2 sqrt mul 0) + (! \@bs@wd 2 sqrt mul 0) + \rput[c]{45}(0,0){% + \psframe(! \@bs@wd neg \@bs@wd neg)(! \@bs@wd \@bs@wd) + } + \else\ifx\POE@key@bsstyle\POE@str@plate + \psline(! \@bs@wd neg 2 sqrt mul 0)(! \@bs@wd 2 sqrt mul 0) + \fi\fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{crystal} +% +% \begin{macro}{\crystal@ref} +% \begin{macrocode} +\def\crystal@ref{% + \let\POE@key@optboxwidth\POE@key@crystalwidth + \let\POE@key@optboxheight\POE@key@crystalheight + \optbox@ref +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\crystal@comp} +% \begin{macrocode} +\def\crystal@comp{% + \edef\@wd{\POE@key@crystalwidth\space 0.5 mul } + \edef\@ht{\POE@key@crystalheight\space 0.5 mul } + \psframe(! \@wd neg \@ht neg)(! \@wd \@ht) + \ifPOE@voltage% + \psline(!\@wd 4 div 3 mul neg \@ht)% + (! \@wd 4 div 3 mul neg \@ht 0.2 add) + \pscircle[fillstyle=solid, fillcolor=white]% + (! \@wd 4 div 3 mul neg \@ht 0.2 add){0.04} + \psline(! \@wd 4 div 3 mul neg \@ht neg)% + (! \@wd 4 div 3 mul neg \@ht neg 0.2 sub)% + \psline(! \@wd 4 div 3 mul neg 0.15 sub \@ht neg 0.2 sub)% + (! \@wd 4 div 3 mul neg 0.15 add \@ht neg 0.2 sub)% + \fi + \ifPOE@lamp + \rput(! \@wd \@ht){% + \psset{style=CrystalLamp}% + \rput(0, 0.4){\crystal@lamp}% + }% + \fi + \ifdim\POE@key@caxislength pt=0pt\else + \def\@cl{% + \POE@key@caxislength\space + \ifPOE@caxisinv -1 mul\space\fi + }% + \psline[style=CrystalCaxis](! 0 \@cl \POE@dict{sign} \@ht mul)% + (! 0 \@cl \POE@dict{sign} neg \@ht mul \@cl sub)% + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\crystal@lamp} +% \begin{macrocode} +\def\crystal@lamp{% + \pscurve[fillstyle=none](-0.015, 0)(-0.03, -0.045)(-0.06, -0.075)% + (-0.075, -0.15)(0, -0.21)(0.075, -0.15)(0.06, -0.075)% + (0.03, -0.045)(0.015, 0) + \multido{\i=-30+40}{7}{% + \rput{\i}(0, -0.135){% + \psline(-0.105, 0)(-0.18, 0) + }% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{polarization} +% +% \begin{macro}{\polarization@comp} +% \begin{macrocode} +\def\polarization@comp{% + \edef\@sz{\POE@key@polsize\space 0.5 mul }% + \psset{style=Polarization}% + \ifx\POE@key@poltype\POE@str@parallel + \psline[arrows=<->](! 0 \@sz neg)(! 0 \@sz) + \fi + \ifx\POE@key@poltype\POE@str@perp + \psdot(0,0) + \pscircle[fillstyle=none](0,0){0.12} + \fi + \ifx\POE@key@poltype\POE@str@misc + \psline[arrows=<->](! 0 \@sz neg)(! 0 \@sz) + \psdot(0,0) + \pscircle[fillstyle=none](0,0){0.12} + \fi + \ifx\POE@key@poltype\POE@str@rcirc + \psellipticarc[fillstyle=none, arrows=->]% + (0,0)(! \@sz 2 div \@sz){20}{-20} + \fi + \ifx\POE@key@poltype\POE@str@lcirc + \psellipticarc[fillstyle=none, arrows=<-]% + (0,0)(! \@sz 2 div \@sz){20}{-20} + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optgrating} +% +% \begin{macro}{\optgrating@ref} +% \begin{macrocode} +\def\optgrating@ref{% + \POE@setref{/@@x \POE@key@gratingwidth\space 0.5 mul def}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optgrating@comp} +% \begin{macrocode} +\def\optgrating@comp{% + \edef\@cnt{\POE@key@gratingcount\space}% + \edef\@wd{\POE@key@gratingwidth\space 0.5 mul }% + \ifdim\POE@key@gratingheight pt<\POE@key@gratingdepth pt + \edef\@ht{\POE@key@gratingdepth\space}% + \else + \edef\@ht{\POE@key@gratingheight\space}% + \fi +% \end{macrocode} +% Shift the grating by its depth if gratingalign is set to 'center'. +% \begin{macrocode} + \ifx\POE@key@gratingalign\POE@str@top + \edef\@dp{\POE@key@gratingdepth\space}% + \edef\@bl{0 }% + \else + \edef\@dp{0 }% + \edef\@bl{\POE@key@gratingdepth\space neg }% + \edef\@ht{\@ht \POE@key@gratingdepth\space sub }% + \fi + \edef\@step{\POE@key@gratingwidth\space\@cnt div }% + \ifx\POE@key@gratingtype\POE@str@blazed + \pscustom[linewidth=\POE@key@gratinglinewidth, linejoin=1]{% + \psline[liftpen=1](! \@wd \@dp)(! \@wd \@ht)% + (! \@wd neg \@ht)(! \@wd neg \@dp)% + \multido{\i=0+1}{\POE@key@gratingcount}{% + \psline[liftpen=1]% + (! \@wd neg \i\space \@step mul add \@dp)% + (! \@wd neg \i\space + \ifPOE@reverse\else 1 add \fi \@step mul add \@bl)% + (! \@wd neg \i\space 1 add \@step mul add \@dp)% + }% + \closepath + }% + \else\ifx\POE@key@gratingtype\POE@str@binary + \pscustom[linewidth=\POE@key@gratinglinewidth, linejoin=1]{% + \psline[liftpen=1](! \@wd \@dp)(! \@wd \@ht)% + (! \@wd neg \@ht)(! \@wd neg \@dp)% + \multido{\i=0+1}{\POE@key@gratingcount}{% + \psline[liftpen=1]% + (! \@wd neg \i\space \@step mul add \@dp)% + (! \@wd neg \i\space \@step mul add \@bl)% + (! \@wd neg \i\space 0.5 add \@step mul add \@bl)% + (! \@wd neg \i\space 0.5 add \@step mul add \@dp)% + (! \@wd neg \i\space 1 add \@step mul add \@dp)% + }% + \closepath + }% + \fi\fi + \ifPOE@variable + \psarc[style=VariableStyle]% + (! \POE@key@gratingwidth\space 0.5 mul 0.4 sub + \POE@key@gratingheight\space 0.5 mul){0.6}{-20}{20} + \psarc[style=VariableStyle]% + (! 0.4 \POE@key@gratingwidth\space 0.5 mul sub + \POE@key@gratingheight\space 0.5 mul){0.6}{160}{200} + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{transmissiongrating} +% +% \begin{macro}{\transmissiongrating@ref} +% \begin{macrocode} +\def\transmissiongrating@ref{% + \POE@calcAngle + \POE@setref{/@@x \POE@key@gratingwidth\space 0.5 mul def}% + \edef\POE@key@angle{% + \POE@dict{ exch@ref@\oenode{}{} { -90 }{ 90 } ifelse } + \POE@key@angle\space add + }% + \POE@Verb{% + @xref @yref + exch@ref@\oenode{}{} { + [ exch { neg } forall ] + } if + /@xref ED + exch@ref@\oenode{}{} { + [ exch { neg } forall ] + } if + /@yref ED + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\transmissiongrating@nodes} +% \begin{macrocode} +\def\transmissiongrating@nodes{% + \newOptexpComp{% + {0 0} {1 0} \POE@key@gratingwidth\space -0.5 mul dup neg + refltrans {PlainIfc} 1}% +}% +\let\transmissiongrating@comp\optgrating@comp +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optbox} +% +% \begin{macro}{\optbox@ref} +% \begin{macrocode} +\def\optbox@ref{% + \POE@setref{% + /@@x \POE@key@optboxwidth\space 0.5 mul def + /@@y \POE@key@optboxheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optbox@comp} +% \begin{macrocode} +\let\optbox@comp\POE@comp@rectangle +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optsource} +% +% \begin{macro}{\optsource@ref} +% \begin{macrocode} +\def\optsource@ref{% + \let\POE@key@optboxwidth\POE@key@sourcewidth + \let\POE@key@optboxheight\POE@key@sourceheight + \optbox@ref +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optsource@nodes} +% \begin{macrocode} +\def\optsource@nodes{% + \POE@dipole@nodes + \POE@Verb{% + \oenode{}{} begin + 4 dict dup /source exch def begin + \if\POE@key@sourcebeamangle\relax\else + /beamangle \POE@key@sourcebeamangle\space def + \fi + \if\POE@key@sourcebeamdiv\relax\else + /beamdiv \POE@key@sourcebeamdiv\space def + \fi + \if\POE@key@sourcebeamwidth\relax\else + /beamwidth \POE@key@sourcebeamwidth\space def + \fi + \if\POE@key@sourcebeamalign\relax\else + /beamalign \POE@key@sourcebeamalign\space def + \fi + end + source length 0 eq { currentdict /source undef } if + end }% +}% +% +% \begin{macro}{\optsource@comp} +% \begin{macrocode} +\let\optsource@comp\POE@comp@rectangle +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optplate} +% +% \begin{macro}{\optplate@ref} +% \begin{macrocode} +\def\optplate@ref{% + \POE@setref{/@@y \POE@key@plateheight\space 0.5 mul def }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optplate@comp} +% \begin{macrocode} +\def\optplate@comp{% + \psline[linewidth=\POE@key@platelinewidth]% + (! \POE@dict{0 @@y neg})(! \POE@dict{0 @@y}) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optdetector} +% +% \begin{macro}{\optdetector@ref} +% \begin{macrocode} +\def\optdetector@ref{% + \ifx\POE@key@detsize\@empty + \POE@setref{% + /@@y \POE@key@detheight\space 0.5 mul def + /@@x \POE@key@detwidth\space 0.5 mul def + }% + \else + \POE@setref{% + /@@y \POE@key@detsize\space 0.5 mul def + /@@x \POE@key@detsize\space 0.5 mul + \ifx\POE@key@dettype\POE@str@round 0.5 mul\fi + \space def + }% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optdetector@nodes} +% \begin{macrocode} +\def\optdetector@nodes{% + \POE@dipole@nodes + \ifx\POE@key@dettype\POE@str@round + \pnode(! \POE@dict{@@x0 @@x -0.2 mul add} 0){\oenodeCenter{}}% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optdetector@comp} +% \begin{macrocode} +\def\optdetector@comp{% + \ifx\POE@key@dettype\POE@str@round + \psellipticwedge(!\POE@dict{@@x0 @@x sub @@y0})% + (!\POE@dict{@@x 2 mul @@y}){-90}{90}% + \else\ifx\POE@key@dettype\POE@str@diode + \ifx\POE@key@detsize\@empty + \ifdim\POE@key@detwidth pt<\POE@key@detheight pt + \def\@sz{\POE@key@detwidth\space 0.5 mul }% + \else + \def\@sz{\POE@key@detheight\space 0.5 mul }% + \fi + \else + \def\@sz{\POE@key@detsize\space 0.5 mul }% + \fi + \POE@comp@rectangle + \bgroup + \psset{style=DetectorStyle} + \pspolygon(! \@sz -0.2 mul \@sz -0.4 mul)% + (! \@sz 0.6 mul \@sz -0.4 mul)% + (! \@sz 0.2 mul \@sz 0.4 mul)% + \psline(! \@sz -0.2 mul \@sz 0.4 mul \POE@clwh add)% + (! \@sz 0.6 mul \@sz 0.4 mul \POE@clwh add) + \psset{arrows=->, arrowinset=0, arrowscale=0.8}% + \psline(! \@sz -0.8 mul \@sz 0.3 mul)% + (! \@sz -0.3 mul \@sz 0.15 mul)% + \psline(! \@sz -0.8 mul 0)(! \@sz -0.3 mul \@sz -0.15 mul)% + \egroup + \fi\fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optdetector@conn} +% \begin{macrocode} +\def\optdetector@conn{% + \ifPOE@startbox\else + \ifPOE@beam + \drawbeam[raytrace=false](\oenodeRefA{}){} + \else\ifPOE@fiberin@ + \drawfiber@{FiberIn}(\oenodeRefA{}){} + \else\ifPOE@wirein@ + \drawwire@{WireIn}(\oenodeRefA{}){} + \fi\fi\fi + \fi + \ifPOE@endbox\else + \ifPOE@wirepresetout@ + \drawwire@{WireOut}{}(\oenodeRefB{}) + \else\ifPOE@fiberout@ + \drawfiber@{FiberOut}{}(\oenodeRefB{}) + \fi\fi + \fi +}% +% \end{macrocode} +% \end{macro} +% \subsubsection{optretplate} +% +% \begin{macro}{\optretplate@ref} +% \begin{macrocode} +\def\optretplate@ref{% + \POE@setref{% + /@@y \POE@key@plateheight\space 0.5 mul def + /@@x \POE@key@platewidth\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optretplate@comp} +% \begin{macrocode} +\def\optretplate@comp{% + \edef\@ht{\POE@key@plateheight\space 0.5 mul }% + \edef\@wd{\POE@key@platewidth\space 0.5 mul }% + \psframe(! \@wd neg \@ht neg)(! \@wd \@ht) + \psline{cc-cc}(! \@wd neg \@ht)(! \@wd \@ht neg) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optdiode} +% +% \begin{macro}{\optdiode@ref} +% \begin{macrocode} +\def\optdiode@ref{% + \POE@setref{% + \POE@key@optdiodesize\space 0.5 mul dup dup /@@y ED /@@x ED + 0.4 mul /@@sz ED + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optdiode@comp} +% \begin{macrocode} +\def\optdiode@comp{% + \POE@comp@rectangle + \pspolygon(!\POE@dict{@@sz neg dup}) + (!\POE@dict{@@sz neg @@sz}) + (!\POE@dict{@@sz 0}) + \psline(!\POE@dict{@@sz \POE@clwh add @@sz})% + (!\POE@dict{@@sz \POE@clwh add @@sz neg}) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{doveprism} +% +% \begin{macro}{doveprism@ref} +% \begin{macrocode} +\def\doveprism@ref{% + \POE@setref{/@@x \POE@key@doveprismwidth\space 0.5 mul def + /@@y \POE@key@doveprismheight\space 0.5 mul def}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\doveprism@nodes} +% \begin{macrocode} +\def\doveprism@nodes{% + \newOptexpComp{% + /@htsq @@y 2 sqrt mul def + {@@x neg @@y add 0} {1 1} + @htsq neg @htsq trans {PlainIfc} + {0 @@y neg} {1 0} + @@x neg dup neg + refl {PlainIfc} + {@@x @@y sub 0} {-1 1} + @htsq neg @htsq trans {PlainIfc} + \POE@key@n true + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doveprism@comp} +% \begin{macrocode} +\def\doveprism@comp{% + \pspolygon(!\POE@dict{@@x neg @@y neg})% + (!\POE@dict{@@x @@y neg})% + (!\POE@dict{@@x @@y 2 mul sub @@y})% + (!\POE@dict{@@y 2 mul @@x sub @@y}) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{glanthompson} +% +% \begin{macro}{\glanthompson@ref} +% \begin{macrocode} +\def\glanthompson@ref{% + \POE@setref{% + /@@x \POE@key@glanthompsonwidth\space 0.5 mul def + /@@y \POE@key@glanthompsonheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\glanthompson@nodes} +% \begin{macrocode} +\def\glanthompson@nodes{% + \newOptexpCompAmb{% + {@@x neg 0} {0 1} @@x neg @@x trans {PlainIfc} + {@@x 0} {0 1} @@x neg @@x trans {PlainIfc} + {\POE@key@glanthompsongap\space -0.5 mul 0} {@@x neg @@y} 0 0 trans {PlainIfc} + {0 @@y neg} {1 0} @@y neg @@y trans {PlainIfc} + {0 @@y} {1 0} @@y neg @@y trans {PlainIfc} + 3 \POE@key@n + } +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\glanthompson@comp} +% \begin{macrocode} +\def\glanthompson@comp{% + \ifdim\POE@key@glanthompsongap pt>0pt + \pspolygon(!\POE@dict{@@x neg @@y})% + (!\POE@dict{@@x neg @@y neg})% + (!\POE@dict{@@x \POE@key@glanthompsongap\space sub @@y neg}) + \pspolygon(!\POE@dict{@@x neg \POE@key@glanthompsongap\space add @@y})% + (!\POE@dict{@@x @@y})% + (!\POE@dict{@@x @@y neg})% + \else + \psframe(!\POE@dict{@@x neg @@y neg})(!\POE@dict{@@x @@y}) + \psline[arrows=cc-cc](!\POE@dict{@@x neg @@y})(!\POE@dict{@@x @@y neg}) + \fi +}% +% \end{macrocode} +% \end{macro} +% \subsubsection{pentaprism} +% +% \begin{macro}{\pentaprism@nodes} +% \begin{macrocode} +\def\pentaprism@nodes{% + \edef\@sz{\POE@key@pentaprismsize\space}% + \newOptexpComp{% + {\@sz 2 sqrt -2 mul div dup } {-1 1} + \@sz -0.5 mul dup neg trans {PlainIfc} + {\@sz 2 sqrt div 67.5 cos \@sz mul + 67.5 sin 2 mul div sub \@sz 2 div} + {67.5 cos \@sz mul 67.5 sin div neg \@sz} + \@sz 22.5 cos div -0.5 mul dup neg refl {PlainIfc} + {\@sz 2 sqrt div neg 67.5 cos \@sz mul + 67.5 sin 2 mul div add \@sz 2 div} + {67.5 cos \@sz mul 67.5 sin div \@sz} + \@sz 22.5 cos div -0.5 mul dup neg refl {PlainIfc} + {\@sz 2 sqrt 2 mul div dup neg} {1 1} + \@sz -0.5 mul dup neg trans {PlainIfc} + \POE@key@n + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pentaprism@comp} +% \begin{macrocode} +\def\pentaprism@comp{% + \edef\@sz{\POE@key@pentaprismsize\space}% + \pscustom{% + \psline(! \@sz 2 sqrt div 0)% + (! \@sz 2 sqrt div 67.5 cos \@sz mul + 67.5 sin div sub \@sz)% + (! 67.5 cos \@sz mul 67.5 sin div \@sz + 2 sqrt div sub \@sz)% + (! \@sz 2 sqrt div neg 0)% + (! 0 \@sz 2 sqrt div neg)% + \closepath + }% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optprism} +% +% \begin{macro}{\optprism@ref} +% \begin{macrocode} +\def\optprism@ref{% + \POE@calcAngle + \ifx\POE@key@prismtype\POE@str@reflective + \edef\POE@key@labelrefangle{180}% + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optprism@nodes} +% \begin{macrocode} +\def\optprism@nodes{% + \edef\@sz{\POE@key@prismsize\space}% + \edef\@ang{\POE@key@prismangle\space 0.5 mul\space}% + \edef\@hshift{% + \ifx\POE@key@prismalign\POE@str@auto + \POE@dict{OEangle} 1e-5 lt { + 0 + } { + \@sz 0.6 mul \@ang tan mul \POE@dict{OEangle} 0.5 mul tan div + } ifelse + \else + 0 + \fi + }% + \begingroup + \edef\POE@temp{\ifx\POE@key@prismtype\POE@str@reflective neg \fi}% + \pnode(! 0 \@hshift neg){\oenodeCenter{}}% + \newOptexpComp{% + {\@sz -0.6 mul \@ang tan mul \@hshift neg} + {90 \@ang sub dup cos exch sin \POE@temp} + \@sz \@ang cos div dup -0.4 mul exch 0.6 mul trans {PlainIfc} + {\@sz 0.6 mul \@ang tan mul \@hshift neg} + {90 \@ang add dup cos exch sin \POE@temp} + \@sz \@ang cos div dup -0.4 mul exch 0.6 mul trans {PlainIfc} +% \end{macrocode} +% Need to change the order of the two interfaces on the stack and add an +% additional interface. +% \begin{macrocode} + \ifx\POE@key@prismtype\POE@str@reflective + 12 6 roll + {0 \@sz 0.4 mul \@hshift sub } + {1 0} \@ang tan \@sz mul dup neg exch refl {PlainIfc} + 12 6 roll + \fi + \POE@key@n true }% + \endgroup +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optprism@comp} +% \begin{macrocode} +\def\optprism@comp{% + \edef\@sz{\POE@key@prismsize\space}% + \edef\@altan{\POE@key@prismangle\space 0.5 mul tan }% + \edef\@hshift{% + \ifx\POE@key@prismalign\POE@str@auto + \POE@dict{OEangle} 1e-5 lt { + 0 + } { + \@sz 0.6 mul \@altan mul \POE@dict{OEangle} 0.5 mul tan div + } ifelse + \else + 0 + \fi + }% + \edef\POE@temp{\ifx\POE@key@prismtype\POE@str@reflective -1 mul \fi}% + \pspolygon(! \@sz neg \@altan mul \@sz -0.4 mul \POE@temp \@hshift sub) + (! \@sz \@altan mul \@sz -0.4 mul \POE@temp \@hshift sub) + (! 0 \@sz 0.6 mul \POE@temp \@hshift sub) +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{rightangleprism} +% +% \begin{macro}{\rightangleprism@ref} +% All tripole components are aligned such, that the x-axis is normal +% to the angle bisector (Winkelhalbierende), but for the right angle +% prism the x-axis must be oriented normal to the bisector +% (Seitenhalbierende). So we must correct for the difference in both +% orientations, which is stored in dOEangle. +% \begin{macrocode} +\def\rightangleprism@ref{% + \POE@calcAngle + \POE@Verb{% + /@htA @myht def + /@OEtrafo {dOEangle matrix rotate dtransform } bind def + }% +% \end{macrocode} +% Correct also the label reference angle for nonsymmetric reference nodes. +% \begin{macrocode} + \let\POE@temp\POE@key@labelrefangle + \edef\POE@key@labelrefangle{\POE@temp \POE@dict{dOEangle add} }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rightangleprism@nodes} +% \begin{macrocode} +\def\rightangleprism@nodes{% + \edef\@sz{\POE@key@raprismsize\space 0.5 mul }% + \POE@Verb{% + \ifx\POE@key@raprismalign\POE@str@auto + /@corrshift {} bind def + \else + /@corrshift {@htA sub \@sz 0.5 mul add } bind def% + \fi + }% + \newOptexpComp{% + {@htA neg @htA \@sz sub @corrshift @OEtrafo} {1 0 @OEtrafo} + @htA \@sz sub @htA trans {PlainIfc} + {@htA neg 0 @corrshift @OEtrafo} {1 1 @OEtrafo} + @htA 2 sqrt mul dup \@sz 0.5 sqrt div sub exch refl {PlainIfc} + {@htA 0 @corrshift @OEtrafo} {-1 1 @OEtrafo} + @htA 2 sqrt mul dup \@sz 0.5 sqrt div sub exch refl {PlainIfc} + {@htA dup \@sz sub @corrshift @OEtrafo} {1 0 @OEtrafo} + @htA neg \@sz @htA sub trans {PlainIfc} + \POE@key@n + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\rightangleprism@comp} +% \begin{macrocode} +\def\rightangleprism@comp{% + \edef\@sz{\POE@key@raprismsize\space 0.5 mul }% + \ifx\POE@key@raprismalign\POE@str@auto + \pspolygon(!\POE@dict{\@sz neg @htA \@sz sub @OEtrafo}) + (!\POE@dict{\@sz @htA \@sz sub @OEtrafo}) + (! 0 \POE@dict{@htA @OEtrafo})% + \else + \pspolygon(!\POE@dict{\@sz \@sz -0.5 mul @OEtrafo})% + (!\POE@dict{\@sz neg \@sz -0.5 mul @OEtrafo})% + (!\POE@dict{0 \@sz 0.5 mul @OEtrafo}) + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optaom} +% +% \begin{macro}{\optaom@ref} +% \begin{macrocode} +\def\optaom@ref{% + \POE@setref{/@@x \POE@key@aomwidth\space 0.5 mul def }% + \POE@setref{/@@y \POE@key@aomheight\space 0.5 mul def }% + \POE@calcAngle + \ifx\POE@key@aomalign\POE@str@symmetric\else + \edef\POE@key@angle{\POE@key@angle\space 180 \POE@dict{OEangle} sub 0.5 mul sub }% + \fi + \edef\POE@key@angle{\POE@key@angle\space 180 add }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optaom@nodes} +% \begin{macrocode} +\def\optaom@nodes{% + \ifodd + \ifx\POE@key@aomalign\POE@str@symmetric + \ifx\POE@key@aomreflalign\POE@str@parallel 1\else 0\fi + \else 0\fi +% \end{macrocode} +% +% A 'parallel' reflection interface is possible only, if the aomalign is +% symmetric, because otherwise it is probable, that the incoming beam is +% parallel to that interface. +% \begin{macrocode} + \newOptexpCompAmb{% + {@@x neg 0} {0 1} @@y neg @@y + trans {PlainIfc} + {0 0} + \ifx\POE@key@aomalign\POE@str@symmetric + {1 0} + \else + {1 0 180 OEangle sub 0.5 mul matrix rotate dtransform} + \fi + 0 0 trans {PlainIfc} + {@@x @@y} {0 1} @@y -2 mul 0 + trans {PlainIfc} + {@@x @@y neg} {0 1} 0 @@y 2 mul + trans {PlainIfc} + 2 1 + }% + \else + \newOptexpCompAmb{% + {@@x neg 0} {0 1} @@y neg @@y trans {PlainIfc} + {0 0} + \ifx\POE@key@aomalign\POE@str@symmetric + {0 1} + \else + {0 1 180 OEangle sub 0.5 mul matrix rotate dtransform} + \fi + 0 0 refltrans {PlainIfc} + {@@x @@y} {0 1} @@y -2 mul 0 + trans {PlainIfc} + {@@x @@y neg} {0 1} 0 @@y 2 mul + trans {PlainIfc} + 2 1 + }% + \fi + \POE@Verb{% + gsave + tx@Dict begin + STV {CP T} stopped pop + end + (C) (\oenode{}{}) GetPlaneVec 2 copy + /N@\oenodeRefA{} @GetCenter + /N@\oenodeCenter{} @GetCenter + @ABVect 90 matrix rotate dtransform + NormalVec ReflectVec ToVec dup + \oenode{}{} begin + {0 0} exch 0 0 refltrans name (C-1) {PlainIfc} {sc} NewCompIfc + (C) (C1) IfcAlias + 2 1 \POE@key@diffractionorders\space {% vec i + 2 copy neg dup 5 string cvs (C) exch strcat % vec i vec -i (C-i) + 3 -1 roll exec 4 -1 roll % vec i (C-i) X Y -i + 1 add 180 OEangle sub 0.5 mul mul + matrix rotate dtransform ToVec % vec i (C-i) {X' Y'} + {0 0} exch 0 0 refltrans name 7 -1 roll {PlainIfc} {sc} NewCompIfc + 2 copy 3 -1 roll 5 string cvs (C) exch strcat % vec i vec i (C-i) + 3 -1 roll exec 4 -1 roll % vec i (Ci) X Y i + 1 add 180 OEangle sub 0.5 mul mul + matrix rotate dtransform ToVec % vec i (Ci) {X' Y'} + {0 0} exch 0 0 refltrans name 7 -1 roll {PlainIfc} {sc} NewCompIfc + } for pop + /grating true def + end + grestore + }% + \POE@saveDiffractionNodes +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optaom@comp} +% \begin{macrocode} +\def\optaom@comp{% + \POE@comp@rectangle + \ifx\POE@key@aomcomp\POE@str@default + \multido{\i=0+1}{\POE@key@aomgratingcount}{% + \psrline(!\POE@dict{@@x -0.7 mul \POE@key@aomgratingcount\space 2 div dup 1.5 add + @@y exch div exch 0.5 sub \i\space sub mul})% + (!\POE@dict{@@x 1.4 mul 0})% + }% + \else + \POE@key@aomcomp + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{off-axis parabolic mirror} +% +% \begin{macro}{\oapmirror@nodes} +% \begin{macrocode} +\def\oapmirror@nodes{% + \POE@calcAngle + \POE@Verb{% + gsave + STV CP T + /N@\oenodeRefA{} @GetCenter + /N@\oenodeCenter{} @GetCenter + @ABVect NormalizeVec 2 copy + 90 matrix rotate dtransform + /N@\oenodeRefB{} @GetCenter + /N@\oenodeCenter{} @GetCenter @ABVect + \tx@UserCoor 2 copy 6 2 roll + grestore + DotProd tx@Dict begin /POEzonalradius ED end + DotProd + % y = ax^2, a = 1/(2x_0^2) (-h + sqrt(h^2 + x_0^2)), x_0 = @zonalradius. + tx@Dict begin + dup /POEoapheight ED neg dup dup mul POEzonalradius dup mul add sqrt add 0.5 POEzonalradius dup mul div mul + dup /POEoappar ED + /POEangle 180 OEangle sub 0.5 mul POEzonalradius 0 gt { 90 add } if DegToRad def + end + }% + \def\POE@tempX{((POEoappar*(t^2))-(0.25/POEoappar)+POEoapheight)}% + \def\POE@tempY{(-t+POEzonalradius)}% + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{A}}{% + \psparametricplot[algebraic]% + {POEzonalradius dup 0 gt {\POE@key@oapmirroraperture@outer}{\POE@key@oapmirroraperture@inner} ifelse add}% + {POEzonalradius dup 0 gt {\POE@key@oapmirroraperture@inner}{\POE@key@oapmirroraperture@outer} ifelse sub}% + {(cos(POEangle)*\POE@tempX+sin(POEangle)*\POE@tempY)|(cos(POEangle)*\POE@tempY-sin(POEangle)*\POE@tempX)}}% + \newOptexpComp{% + {0 0} tx@IntersectDict /\PIT@name{\oenode@Path{A}} get 0 0 refl {PathIfc} + 1 }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oapmirror@comp} +% \begin{macrocode} +\def\oapmirror@comp{% + \pstracecurve{\oenode@Path{A}}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Axicon} +% +% \begin{macro}{axicon@nodes} +% \begin{macrocode} +\def\axicon@nodes{% + \POE@setref{% + /@@right \POE@key@axiconheight\space 0.5 mul \POE@key@axiconangle\space dup sin exch cos div mul def + @@right \POE@key@axiconwidth\space max 0.5 mul /@@x exch def + /@@y \POE@key@axiconheight\space 0.5 mul def + /@@right + }% + \pssavepath[linestyle=none, arrows=-,ArrowInside=-]{\oenode@Path{A}}{% + \psline(!\POE@dict{@@x @@right sub @@y}) + (!\POE@dict{@@x 0}) + (!\POE@dict{@@x @@right sub @@y neg}) + }% + \newOptexpComp{% + {@@x neg 0} {0 1} @@y neg @@y trans {PlainIfc} + {@@x 0} + tx@IntersectDict /\PIT@name{\oenode@Path{A}} get 0 0 trans {PathIfc} + \POE@key@n }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{axicon@comp} +% \begin{macrocode} +\def\axicon@comp{% + \pspolygon[arrows=-]% + (!\POE@dict{@@x neg @@y})(!\POE@dict{@@x @@right sub @@y}) + (!\POE@dict{@@x 0})(!\POE@dict{@@x @@right sub @@y neg}) + (!\POE@dict{@@x neg @@y neg}) + %(!\POE@key@axiconwidth\space neg \POE@key@axiconheight\space -0.5 mul) + %(!\POE@key@axiconwidth\space neg \POE@key@axiconheight\space 0.5 mul) + %(! 0 \POE@key@axiconheight\space 0.5 mul) + %(! \POE@key@axiconheight\space 0.5 mul \POE@key@axiconangle\space tan mul 0) + %(! 0 \POE@key@axiconheight\space -0.5 mul) +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optwedge} +% +% \begin{macro}{optwedge@nodes} +% \begin{macrocode} +\def\optwedge@nodes{% + \POE@Verb{% + /@@xl \POE@key@wedgeheight\space \POE@key@wedgeangleleft\space tan mul def + /@@xr \POE@key@wedgeheight\space \POE@key@wedgeangleright\space tan mul def + /@@xa \POE@key@wedgewidth\space @@xl @@xr add sub dup 0 gt {0.5 mul}{pop 0} ifelse def + }% + \newOptexpComp{% + {@@xl @@xa add -0.5 mul 0} {\POE@key@wedgeangleleft\space tan 1} 0 0 trans {PlainIfc} + {@@xr @@xa add 0.5 mul 0} {\POE@key@wedgeangleright\space tan -1} 0 0 trans {PlainIfc} + \POE@key@n }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{optwedge@comp} +% \begin{macrocode} +\def\optwedge@comp{% + \pspolygon[arrows=-](!\POE@dict{@@xa} \POE@key@wedgeheight\space 0.5 mul) + (!\POE@dict{@@xa @@xr} add \POE@key@wedgeheight\space -0.5 mul) + (!\POE@dict{@@xa @@xl} add neg \POE@key@wedgeheight\space -0.5 mul) + (!\POE@dict{@@xa} neg \POE@key@wedgeheight\space 0.5 mul) +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Fiber components} +% +% \subsubsection{optfiber} +% +% \begin{macro}{optfiber@ref} +% \begin{macrocode} +\def\optfiber@ref{% + \POE@setref{% + /@@x \POE@key@fiberloopsep\space\POE@key@fiberloops\space + 1 sub mul 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\optfiber@nodes} +% \begin{macrocode} +\def\optfiber@nodes{% + \newOptexpFiberComp{{@@x neg 0} {@@x 0}}% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optfiber@comp} +% \begin{macrocode} +\def\optfiber@comp{% + \pscustom[style=Fiber, arrows=-]{% + \multido{\i=0+1}{\POE@key@fiberloops}{% + \parametricplot[liftpen=1, plotpoints=100]{0}{1}{% + t 360 mul sin 1 t 360 mul cos sub + \POE@key@fiberloopradius\space dup 3 1 roll mul 3 1 roll mul + \POE@key@fiberloops\space 1 sub -2 div \i\space add + \POE@key@fiberloopsep\space mul add exch + }% + }% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optmzm} +% +% \begin{macro}{\optmzm@ref} +% \begin{macrocode} +\def\optmzm@ref{% + \POE@setref{% + /@@x \POE@key@optmzmwidth\space 0.5 mul def + /@@y \POE@key@optmzmheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optmzm@comp} +% \begin{macrocode} +\def\optmzm@comp{% + \POE@comp@rectangle + \begingroup + \POE@usefiberorwirestyle + \psline(! \POE@dict{@@x} neg 0)(! \POE@dict{@@x} -0.7 mul 0)% + (! \POE@dict{@@x} -0.4 mul \POE@dict{@@y} 0.6 mul)% + (! \POE@dict{@@x 0.4 mul @@y 0.6 mul})% + (! \POE@dict{@@x} 0.7 mul 0)(! \POE@dict{@@x} 0)% + (! \POE@dict{@@x} 0.7 mul 0)% + (! \POE@dict{@@x 0.4 mul @@y -0.6 mul})% + (! \POE@dict{@@x -0.4 mul @@y -0.6 mul})% + (! \POE@dict{@@x} -0.7 mul 0)% + \endgroup +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optfilter} +% +% \begin{macro}{\optfilter@ref} +% \begin{macrocode} +\def\optfilter@ref{% + \POE@setref{% + \POE@key@filtersize\space 0.5 mul dup /@@y ED /@@x ED + \ifx\POE@key@innercompalign\POE@str@absolute\else + /@@ang \POE@key@filterangle\space def + \fi + }% +}% +\let\optfilter@nodes\POE@dipole@nodes +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optfilter@comp} +% \begin{macrocode} +\def\optfilter@comp{% + \def\POE@filter@curve{% + \parametricplot[plotstyle=curve,arrows=-]{-1}{1}{% + \POE@dict{@@x} dup t mul 0.7 mul exch t Pi mul RadtoDeg + 90 add cos 0.2 mul mul}% + }% + \def\POE@strike@line{% + \psline(!\POE@dict{@@x -0.3 mul @@y -0.15 mul})% + (!\POE@dict{@@x 0.3 mul @@y 0.15 mul}) + }% + \POE@comp@rectangle + \psrotate(\oenodeCenter{}){!\POE@dict{@@ang}}{% + \psset{style=FilterStyle}% + \ifx\POE@key@filtertype\POE@str@bandpass + \rput(!\POE@dict{0 @@x -0.5 mul}){\POE@strike@line\POE@filter@curve} + \rput(0, 0){% + \POE@usefiberorwirestyle + \POE@filter@curve} + \rput(!\POE@dict{0 @@x 0.5 mul}){\POE@strike@line\POE@filter@curve} + \else\ifx\POE@key@filtertype\POE@str@bandstop + \begingroup + \POE@usefiberorwirestyle + \rput(!\POE@dict{0 @@x -0.5 mul}){\POE@filter@curve} + \rput(!\POE@dict{0 @@x 0.5 mul}){\POE@filter@curve} + \endgroup + \rput(0,0){\POE@strike@line\POE@filter@curve} + \else\ifx\POE@key@filtertype\POE@str@lowpass + \rput(!\POE@dict{0 @@x -0.5 mul}){% + \POE@usefiberorwirestyle + \POE@filter@curve} + \rput(0, 0){\POE@strike@line\POE@filter@curve} + \rput(!\POE@dict{0 @@x 0.5 mul}){\POE@strike@line\POE@filter@curve} + \else\ifx\POE@key@filtertype\POE@str@highpass + \rput(!\POE@dict{0 @@x 0.5 mul}){% + \POE@usefiberorwirestyle + \POE@filter@curve} + \rput(0, 0){\POE@strike@line\POE@filter@curve} + \rput(!\POE@dict{0 @@x -0.5 mul}){\POE@strike@line\POE@filter@curve} + \fi\fi\fi\fi + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +%\subsubsection{optamp} +% +% \begin{macro}{optamp@ref} +% \begin{macrocode} +\def\optamp@ref{% + \POE@setref{% + /@@x \POE@key@optampwidth\space 0.5 mul def + /@@y \POE@key@optampheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\optamp@nodes} +% \begin{macrocode} +\def\optamp@nodes{% + \newOptexpFiberComp{{@@x neg 0} {@@x 0}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optamp@comp} +% \begin{macrocode} +\def\optamp@comp{% + \pspolygon(!\POE@dict{@@x 0})% + (!\POE@dict{@@x neg @@y})% + (!\POE@dict{@@x neg @@y neg}) +}% +% \end{macrocode} +% \end{macro} +% +%\subsubsection{polcontrol} +% +% \begin{macro}{polcontrol@ref} +% \begin{macrocode} +\def\polcontrol@ref{% + \ifx\POE@key@polcontroltype\POE@str@linear + \POE@setref{/@@x \POE@key@polcontrolsize\space 2 mul def}% + \else + \POE@setref{/@@x \POE@key@polcontrolsize\space 1.5 mul def}% + \fi +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\polcontrol@nodes} +% \begin{macrocode} +\def\polcontrol@nodes{% + \newOptexpFiberComp{{@@x neg 0} {@@x 0}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\polcontrol@comp} +% \begin{macrocode} +\def\polcontrol@comp{% + \edef\@sz{\POE@key@polcontrolsize\space}% + \ifPOE@optexpenv + \psline[style=Fiber, arrows=-, ArrowInside=-](\oenodeIn{})(\oenodeOut{}) + \fi + \bgroup + \POE@usefiberorwirestyle + \ifx\POE@key@polcontroltype\POE@str@linear + \multips(! -2 \@sz mul \@sz)(! 2 \@sz mul 0){3}{% + \pscircle(0,0){\POE@key@polcontrolsize}% + }% + \else + \pscircle(! -1.5 \@sz mul \@sz neg){\POE@key@polcontrolsize} + \pscircle(! 0 \@sz){\POE@key@polcontrolsize}% + \pscircle(! 1.5 \@sz mul \@sz neg){\POE@key@polcontrolsize} + \fi + \egroup + \ifPOE@optexpenv\else + \psline[style=Fiber, arrows=-, ArrowInside=-](\oenodeIn{})(\oenodeOut{}) + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optisolator} +% +% \begin{macro}{\optisolator@ref} +% \begin{macrocode} +\def\optisolator@ref{% + \POE@setref{% + /@@x \POE@key@isolatorwidth\space 0.5 mul def + /@@y \POE@key@isolatorheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optisolator@comp} +% \begin{macrocode} +\def\optisolator@comp{% + \POE@comp@rectangle + \psline[style=IsolatorArrow, arrows=->]% + (!\POE@dict{@@x neg 0.6 mul 0})% + (!\POE@dict{@@x 0.6 mul 0}) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optfiberpolarizer} +% \begin{macro}{\optfiberpolarizer@ref} +% \begin{macrocode} +\def\optfiberpolarizer@ref{% + \POE@setref{% + /@@x \POE@key@fiberpolwidth\space 0.5 mul def + /@@y \POE@key@fiberpolheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optfiberpolarizer@comp} +% \begin{macrocode} +\def\optfiberpolarizer@comp{% + \POE@comp@rectangle + \psline(!\POE@dict{@@x -0.2 mul @@y neg})(!\POE@dict{@@x 0.2 mul @@y}) +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optswitch} +% +% \begin{macro}{\optswitch@ref} +% \begin{macrocode} +\def\optswitch@ref{% + \POE@setref{% + /@@x \POE@key@switchwidth\space 0.5 mul def + /@@y \POE@key@switchheight\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optswitch@comp} +% \begin{macrocode} +\def\optswitch@comp{% + \POE@comp@rectangle +% \end{macrocode} +% storing the linewidth of the object allows for some aesthetic fine tuning +% \begin{macrocode} + \pstVerb{tx@Dict begin /@lw \POE@clw def end}% + \bgroup + \POE@usefiberorwirestyle + \psset{arrows=-, ArrowInside=-}% + \psline(! \POE@dict{@@x} neg 0)(! \POE@dict{@@x} -0.6 mul @lw sub 0)% + \psline(! \POE@dict{@@x} 0.6 mul 0)(! \POE@dict{@@x} 0)% + \egroup + \ifx\POE@key@switchstyle\POE@str@closed% + \bgroup + \POE@usefiberorwirestyle + \psdot[dotsize=3\pslinewidth](! \POE@dict{@@x} 0.6 mul 0)% + \psdot[dotsize=3\pslinewidth](! \POE@dict{@@x} -0.6 mul 0)% + \psline[arrows=-, ArrowInside=-, linewidth=1.5\pslinewidth]% + (! \POE@dict{@@x} -0.6 mul @lw)(! \POE@dict{@@x} 0.6 mul @lw)% + \egroup + \else + \psline[arrows=-, ArrowInside=-, linewidth=1.5\pslinewidth]% + (! \POE@dict{@@x} -0.6 mul @lw add @lw 0.5 mul)% + (! \POE@dict{@@x 0.45 mul @@y 0.6 mul})% + \pscircle(! \POE@dict{@@x} -0.6 mul 0){\pslinewidth}% + \psdot[dotsize=3\pslinewidth](! \POE@dict{@@x} 0.6 mul 0)% + \fi +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{fiberdelayline} +% +% \begin{macro}{\fiberdelayline@ref} +% \begin{macrocode} +\def\fiberdelayline@ref{% + \POE@setref{% + /@@y \POE@key@fdlheight\space 0.5 mul def + /@@x \POE@key@fdlwidth\space 0.5 mul def + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\POE@get@yarrowscale#1 #2 #3 #4\@nil{% + \def\POE@tempA{#3\space}% +}% +% \end{macrocode} +% \begin{macro}{\fiberdelayline@comp} +% \begin{macrocode} +\def\fiberdelayline@comp{% + \POE@comp@rectangle + \begingroup + \psset{style=FdlArrow} + \use@par + \pst@expandafter\POE@get@yarrowscale{\psk@arrowscale}\@nil + \def\@arrowshift{% + \psk@arrowlength\space \psk@arrowsize\space + \pst@number\pslinewidth\space mul add mul + \POE@tempA mul + @@y 2.9 mul @@x 0.6 mul atan 2 copy cos mul 3 1 roll sin mul + \tx@UserCoor abs exch abs exch\space + }% + \psline(! \POE@dict{@@x -0.4 mul @@y -1.6 mul})% + (! \POE@dict{@@x 0.2 mul @@y 1.3 mul \@arrowshift VecAdd}) + \endgroup +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\newOptexpDipole{optarrowcomp}{} +\def\optarrowcomp@ref{% + \POE@setref{% + \ifx\POE@key@arrowcompshape\POE@str@rectangle + /@@x \POE@key@arrowcompwidth\space 0.5 mul def + /@@y \POE@key@arrowcompheight\space 0.5 mul def + \else + \POE@key@arrowcompwidth\space\POE@key@arrowcompheight\space + min 0.5 mul dup /@@x ED /@@y ED + \fi + \POE@key@arrowcompangle\space dup 0 gt { + { dup 180 ge { 180 sub } { exit } ifelse } loop + } { + { dup 0 lt { 180 add } { exit } ifelse } loop + } ifelse dup /@arrowangle ED dup dup + @@y @@x atan gt exch @@y @@x neg atan lt and { + /@@dy @@y def + tan @@y exch div /@@dx ED + }{ + /@@dx @@x def + tan @@x mul /@@dy ED + } ifelse + }% +}% +\def\optarrowcomp@comp{% + \ifx\POE@key@arrowcompshape\POE@str@rectangle + \POE@comp@rectangle + \else + \pscircle(!\POE@dict{@@x0 @@y0}){!\POE@dict{@@x}} + \fi + \begingroup +% \end{macrocode} +% Set the style and execute the options directly, so we can use the correct +% arrowscale and linewidth for the calculations. +% \begin{macrocode} + \psset{style=ArrowCompStyle} + \use@par + \pst@expandafter\POE@get@yarrowscale{\psk@arrowscale}\@nil + \def\@arrowshift{% + \psk@arrowlength\space \psk@arrowsize\space + \pst@number\pslinewidth\space mul add mul + \POE@tempA mul + @arrowangle 2 copy cos mul 3 1 roll sin mul + \tx@UserCoor\space + }% + \ifx\POE@key@arrowcompshape\POE@str@rectangle + \psline(!\POE@dict{@@dx -1.5 mul @@dy -1.5 mul})% + (!\POE@dict{@@dx 1.3 mul @@dy 1.3 mul \@arrowshift VecAdd}) + \else + \psline(!\POE@dict{@arrowangle dup cos @@x -1.5 mul mul exch sin @@x -1.5 mul mul}) + (!\POE@dict{@arrowangle dup cos @@x 1.3 mul mul exch sin @@x 1.3 mul mul \@arrowshift VecAdd}) + \fi + \endgroup +\ignorespaces}% +% \end{macrocode} +% +% \begin{macrocode} +\newOptexpDipole{optbarcomp}{} +\def\optbarcomp@ref{% + \POE@setref{% + \ifx\POE@key@barcompshape\POE@str@rectangle + /@@x \POE@key@barcompwidth\space 0.5 mul def + /@@y \POE@key@barcompheight\space 0.5 mul def + \else + \POE@key@barcompwidth\space\POE@key@barcompheight\space + min 0.5 mul dup /@@x ED /@@y ED + \fi + \POE@key@barcompangle\space dup 0 gt { + { dup 180 ge { 180 sub } { exit } ifelse } loop + } { + { dup 0 lt { 180 add } { exit } ifelse } loop + } ifelse dup /@barangle ED dup dup + @@y @@x atan gt exch @@y @@x neg atan lt and { + /@@dy @@y def + tan @@y exch div /@@dx ED + }{ + /@@dx @@x def + tan @@x mul /@@dy ED + } ifelse + }% +}% +\def\optbarcomp@comp{% + \ifx\POE@key@barcompshape\POE@str@rectangle + \POE@comp@rectangle + \psline[style=BarCompStyle](!\POE@dict{ @@dx neg @@dy neg })% + (!\POE@dict{@@dx @@dy}) + \else + \pscircle(!\POE@dict{@@x0 @@y0}){!\POE@dict{@@x}} + \psline[style=BarCompStyle]% + (!\POE@dict{@barangle dup cos @@x neg mul exch sin @@x neg mul}) + (!\POE@dict{@barangle dup cos @@x mul exch sin @@x mul}) + \fi +\ignorespaces}% +% \end{macrocode} +% +% +% \subsubsection{fiberbox} +% \begin{macro}{fiberbox@ref} +% \begin{macrocode} +\def\fiberbox@ref{% + \POE@setref{% + /@@x \POE@key@fiberboxwidth\space 0.5 mul def + @@inht 0 eq @@outht 0 eq and { + /@@inht \POE@key@fiberboxcountin\space\POE@key@fiberboxsepin\space mul def + /@@outht \POE@key@fiberboxcountout\space\POE@key@fiberboxsepout\space mul def + } if + @@inht \POE@key@fiberboxcountin\space dup 1 add 3 1 roll div mul + @@outht \POE@key@fiberboxcountout\space dup 1 add 3 1 roll div mul + max + \POE@key@fiberboxheight\space dup @@inht @@outht max gt { + exch + } if pop 0.5 mul /@@y exch def + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fiberbox@nodes} +% \begin{macrocode} +\def\fiberbox@nodes{% + \newOptexpFiberComp{% + 0 1 \POE@key@fiberboxcountin\space 1 sub { + \POE@key@fiberboxcountin\space 1 sub 0.5 mul dup 3 -1 roll sub exch + 0 gt { + @@inht \POE@key@fiberboxcountin\space 1 sub div mul + } if + @@x neg exch ToVec + } for + 0 1 \POE@key@fiberboxcountout\space 1 sub { + \POE@key@fiberboxcountout\space 1 sub 0.5 mul dup 3 -1 roll sub exch + 0 gt { + @@outht \POE@key@fiberboxcountout\space 1 sub div mul + } if + @@x exch ToVec + } for + } +}% +\let\fiberbox@comp\POE@comp@rectangle +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{optcoupler} +% \begin{macro}{\optcoupler@nodes} +% \begin{macrocode} +\def\optcoupler@nodes{% + \newOptexpFiberComp{% + {@@x neg @@y0 @@sep add} + {@@x neg @@y0 @@sep sub} + {@@x @@y0 @@sep add} + {@@x @@y0 @@sep sub} }% + \pnode(0,0){\oenodeCenter{}} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@coupler@ref} +% \begin{macrocode} +\def\POE@coupler@ref{% + \POE@setref{% + /@@x \POE@key@couplerwidth\space 0.5 mul def + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@couplersep\@empty + /@@y \POE@key@couplerheight\space 0.5 mul 0.05 0.2 0.8 mul div mul def + \else + /@@y \POE@key@couplersep\space 0.5 mul def + \fi + /@@sep @@y def + \else + /@@y \POE@key@couplerheight\space 0.5 mul def + \ifx\POE@key@couplersep\@empty + \ifx\POE@key@couplertype\POE@str@ellipse + /@@sep @@y 0.05 0.2 0.8 mul div mul def + \else + /@@sep @@y 0.5 mul def + \fi + \else + /@@sep \POE@key@couplersep\space 0.5 mul def + \fi + \fi + /@@y0 @@sep + \ifx\POE@key@coupleralign\POE@str@bottom + \else\ifx\POE@key@coupleralign\POE@str@top + neg + \else + pop 0 + \fi\fi + def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\optcoupler@ref\POE@coupler@ref +% \end{macrocode} +% +% \begin{macro}{\wdmcoupler@ref} +% The \cs{wdmcoupler} and \cs{wdmsplitter} need a little correction for centered alignment and \opt{couplertype} set to \opt{none}. +% \begin{macrocode} +\def\wdmcoupler@ref{% + \POE@coupler@ref + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@coupleralign\POE@str@center + \POE@setref{/@@y 0 def }% + \fi + \fi +}% +\let\wdmsplitter@ref\wdmcoupler@ref +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optcoupler@comp} +% \begin{macrocode} +\def\optcoupler@comp{% + \ifx\POE@key@couplertype\POE@str@none + \psline[style=Fiber](\oenode{1}{})(\oenode{3}{}) + \psline[style=Fiber](\oenode{2}{})(\oenode{N}{}) + \fi + \POE@coupler@comp +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@coupler@comp} +% \begin{macrocode} +\def\POE@coupler@comp{% + \ifx\POE@key@couplertype\POE@str@none + \else\ifx\POE@key@couplertype\POE@str@ellipse + \psellipse(! 0 \POE@dict{@@y0})(! \POE@dict{@@x @@y}) + \else + \POE@comp@rectangle + \ifx\POE@key@couplertype\POE@str@cross + \psline(! \POE@dict{@@x -0.5 mul @@y0 @@y 0.5 mul sub})% + (! \POE@dict{@@x 0.5 mul @@y0 @@y 0.5 mul add})% + \psline(! \POE@dict{@@x -0.5 mul @@y0 @@y 0.5 mul add})% + (! \POE@dict{@@x 0.5 mul @@y0 @@y 0.5 mul sub})% + \fi + \fi\fi + \ifx\POE@key@couplertype\POE@str@cross\else + \ifPOE@variable + \begingroup +% \end{macrocode} +% we set the style this way to be able to access the arrow and line parameters +% already before the psline command +% \begin{macrocode} + \psset{style=VariableCoupler} + \use@par + \pst@expandafter\POE@get@yarrowscale{\psk@arrowscale}\@nil + \def\@arrowshift{% + \psk@arrowlength\space\psk@arrowsize\space + \pst@number\pslinewidth\space mul add mul + \POE@tempA mul + 1.6 0.8 atan 2 copy cos mul 3 1 roll sin mul + \tx@UserCoor abs exch abs exch\space + }% + \psline(!\POE@dict{@@x -0.4 mul @@y0 @@x sub})% + (!\POE@dict{@@x 0.4 mul @@x 0.7 mul @@y0 add + \@arrowshift VecAdd}) + \endgroup + \fi + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{wdmcoupler} +% \begin{macro}{\wdmcoupler@nodes} +% \begin{macrocode} +\def\wdmcoupler@nodes{% + \edef\@sep{\POE@key@couplersep\space 0.5 mul }% + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@coupleralign\POE@str@center + \edef\@sep{0 }% + \fi + \fi + \newOptexpFiberComp{% + {@@x neg @@y0 \@sep add} + {@@x neg @@y0 \@sep sub} + {@@x 0}}% + \pnode(0,0){\oenodeCenter{}} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\wdmcoupler@comp} +% \begin{macrocode} +\def\wdmcoupler@comp{% + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@coupleralign\POE@str@top + \psline[style=Fiber](\oenode{1}{})(\oenodeOut{}) + \psline[style=Fiber]% + (!/N@\oenodeOut{} \POE@dict{@GetCenter} + \tx@UserCoor \POE@key@couplersep\space sub)(\oenode{2}{}) + \else + \psline[style=Fiber](\oenode{2}{})(\oenodeOut{}) + \ifx\POE@key@coupleralign\POE@str@bottom + \psline[style=Fiber]% + (!/N@\oenodeOut{} \POE@dict{@GetCenter} + \tx@UserCoor \POE@key@couplersep\space add)(\oenode{1}{}) + \fi + \fi + \fi + \POE@coupler@comp +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{wdmsplitter} +% \begin{macro}{\wdmsplitter@nodes} +% \begin{macrocode} +\def\wdmsplitter@nodes{% + \edef\@sep{\POE@key@couplersep\space 0.5 mul }% + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@coupleralign\POE@str@center + \edef\@sep{0 }% + \fi + \fi + \newOptexpFiberComp{% + {@@x neg 0} + {@@x @@y0 \@sep add} + {@@x @@y0 \@sep sub}} + \pnode(0,0){\oenodeCenter{}} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\wdmsplitter@comp} +% \begin{macrocode} +\def\wdmsplitter@comp{% + \ifx\POE@key@couplertype\POE@str@none + \ifx\POE@key@coupleralign\POE@str@top + \psline[style=Fiber](\oenodeIn{})(\oenode{2}{}) + \psline[style=Fiber](! \POE@dict{/N@\oenodeIn{} @GetCenter} + \tx@UserCoor \POE@key@couplersep\space sub)(\oenode{N}{}) + \else + \psline[style=Fiber](\oenodeIn{})(\oenode{N}{}) + \ifx\POE@key@coupleralign\POE@str@bottom + \psline[style=Fiber](! \POE@dict{/N@\oenodeIn{} @GetCenter} + \tx@UserCoor \POE@key@couplersep\space add)(\oenode{2}{}) + \fi + \fi + \fi + \POE@coupler@comp +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{optcirculator} +% +% \begin{macro}{optcirculator@ref} +% \begin{macrocode} +\def\optcirculator@ref{% + \POE@setref{\POE@key@optcircsize\space 0.5 mul dup /@@x ED /@@y ED }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\optcirculator@nodes} +% \begin{macrocode} +\def\optcirculator@nodes{% + \newOptexpFiberComp{{@@x neg 0} {0 @@y neg} {@@x 0}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\optcirculator@comp} +% \begin{macrocode} +\def\optcirculator@comp{% + \edef\@sz{\POE@key@optcircsize\space 0.5 mul }% + \pscircle(0,0){! \@sz} + \psarc[style=OptCircArrow](0,0)% + {! \POE@key@optcircsize\space 0.5 mul}% + {\POE@key@optcircangleA}% + {\POE@key@optcircangleB} +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{fibercollimator} +% +% \begin{macro}{fibercollimator@ref} +% \begin{macrocode} +\def\fibercollimator@ref{% + \POE@setref{% + /@@x \POE@key@fibercolwidth\space 0.5 mul def + /@@y \POE@key@fibercolheight\space 0.5 mul def}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\fibercollimator@nodes} +% \begin{macrocode} +\def\fibercollimator@nodes{% + \pnode(!\POE@dict{@@x neg} 0){\oenodeIn{}} + \newOptexpComp{{@@x neg 0} {0 1} @@y neg @@y trans {PlainIfc} + {@@x 0} {0 1} 0 0 trans {PlainIfc} 1 }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fibercollimator@comp} +% \begin{macrocode} +\def\fibercollimator@comp{% + \pspolygon(!\POE@dict{@@x neg \POE@clwh add @@y neg})% + (!\POE@dict{@@x 0})% + (!\POE@dict{@@x neg \POE@clwh add @@y}) +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Electrical components} +% +% \subsubsection{elecsynthesizer} +% +% \subsubsection{elecmixer} +% +% \begin{macro}{\elecmixer} +% \begin{macrocode} +\def\elecmixer{\pst@object{elecmixer}}% +\def\elecmixer@i(#1)(#2)(#3){% + \@ifnextchar\bgroup% + {\elecmixer@ii(#1)(#2)(#3)}% + {\elecmixer@ii(#1)(#2)(#3){}}% +}% +\def\elecmixer@ii(#1)(#2)(#3)#4{% + \addafter@par{ref@angle=0}% + \begin@OptexpObj + \POE@calcCircRefNodes{#1}{#2}{#3}% + \POE@drawcomponent{elecmixer}{#4} + \ifPOE@backlayer + \ifPOE@wirepresetin@top + \drawwire@{WireIn}[stopnode=1](#1){} + \else\ifPOE@fiberin@top + \drawfiber@{FiberIn}[stopnode=1](#1){} + \fi\fi + \ifPOE@wirepresetout@top + \drawwire@{WireOut1}[startnode=N]{}(#2) + \else\ifPOE@fiberout@top + \drawfiber@{FiberOut1}[startnode=N]{}(#2) + \fi\fi + \ifPOE@wirepresetout@bottom + \drawwire@{WireOut2}[startnode=2, wirealign=center]{}(#3) + \else\ifPOE@fiberout@bottom + \drawfiber@{FiberOut2}[starnode=2, fiberalign=center]{}(#3) + \fi\fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{elecmixer@ref} +% \begin{macrocode} +\def\elecmixer@ref{% + \POE@setref{\POE@key@elecmixersize\space 0.5 mul dup /@@x ED /@@y ED }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\elecmixer@nodes} +% \begin{macrocode} +\def\elecmixer@nodes{% + \newOptexpElecComp{{@@x neg 0} {0 @@y neg} {@@x 0}}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\elecmixer@comp} +% \begin{macrocode} +\def\elecmixer@comp{% + \edef\@sz{\POE@key@elecmixersize\space 0.5 mul }% + \pscircle(0,0){! \@sz} + \psline(!\@sz 2 sqrt div neg dup)(!\@sz 2 sqrt div dup) + \psline(!\@sz 2 sqrt div dup neg exch)(!\@sz 2 sqrt div dup neg) +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Electrical coupler} +% +% \begin{macro}{\eleccoupler} +% \begin{macrocode} +\def\eleccoupler{\pst@object{eleccoupler}}% +\def\eleccoupler@i(#1)(#2){% + \@ifnextchar(%) + {\eleccoupler@ii(#1)(#2)}% + {\eleccoupler@ii(#1)(#1)(#2)(#2)}% +}% +\def\eleccoupler@ii(#1)(#2)(#3)(#4){% + \@ifnextchar\bgroup% + {\eleccoupler@iii(#1)(#2)(#3)(#4)}% + {\eleccoupler@iii(#1)(#2)(#3)(#4){}}% +}% +\def\eleccoupler@iii(#1)(#2)(#3)(#4)#5{% + \begin@OptexpObj + \ifPOE@backlayer + \ifx\POE@key@eleccoupleralign\POE@str@top + \pnode(#1){\oenodeRefA{}} + \pnode(#3){\oenodeRefB{}} + \else\ifx\POE@key@eleccoupleralign\POE@str@bottom + \pnode(#2){\oenodeRefA{}} + \pnode(#4){\oenodeRefB{}} + \else + \pst@getcoor{#1}\POE@tempa% + \pst@getcoor{#2}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefA{}} + \pst@getcoor{#3}\POE@tempa% + \pst@getcoor{#4}\POE@tempb% + \pnode(!\POE@tempa \POE@tempb + \POE@dict{VecAdd 0.5 VecScale} + \tx@UserCoor){\oenodeRefB{}} + \fi\fi + \fi + \POE@drawcomponent{eleccoupler}{#5} + \ifPOE@backlayer + \POE@Verb{% + (1) (3) (\oenode{}{}) CorrectDipoleIfc + (2) (4) (\oenode{}{}) CorrectDipoleIfc + }% + \ifPOE@wirepresetin@top + \drawwire@{WireIn1}[stopnode=1](#1){} + \else\ifPOE@fiberin@top + \drawfiber@{FiberIn1}[stopnode=1](#1){} + \fi\fi + \ifPOE@wirepresetout@top + \drawwire@{WireOut1}[startnode=3](#3){} + \else\ifPOE@fiberout@top + \drawfiber@{FiberOut1}[startnode=3](#3){} + \fi\fi + \ifx\POE@key@eleccouplertype\POE@str@directional + \ifx\POE@key@eleccouplerinput\POE@str@left + \ifPOE@wirepresetout@bottom + \drawwire@{WireOut2}[startnode=N](#4){} + \else\ifPOE@fiberout@bottom + \drawfiber@{FiberOut2}[startnode=N](#4){} + \fi\fi + \else + \ifPOE@wirepresetin@bottom + \drawwire@{WireIn2}[stopnode=2](#2){} + \else\ifPOE@fiberin@bottom + \drawfiber@{FiberIn2}[stopnode=2](#2){} + \fi\fi + \fi + \else + \ifPOE@wirepresetout@bottom + \drawwire@{WireOut2}[startnode=N](#4){} + \else\ifPOE@fiberout@bottom + \drawfiber@{FiberOut2}[startnode=N](#4){} + \fi\fi + \ifPOE@wirepresetin@bottom + \drawwire@{WireIn2}[stopnode=2](#2){} + \else\ifPOE@fiberin@bottom + \drawfiber@{FiberIn2}[stopnode=2](#2){} + \fi\fi + \fi + \fi + \end@OptexpObj +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eleccoupler@ref} +% \begin{macrocode} +\def\eleccoupler@ref{% + \POE@setref{% + /@@x \POE@key@eleccouplerwidth\space 0.5 mul def + /@@y \POE@key@eleccouplerheight\space 0.5 mul def + \ifx\POE@key@eleccouplersep\@empty + /@@sep @@y 0.75 mul def + \else + /@@sep \POE@key@eleccouplersep\space 0.5 mul def + \fi + /@@y0 @@sep + \ifx\POE@key@eleccoupleralign\POE@str@bottom + \else\ifx\POE@key@eleccoupleralign\POE@str@top + neg + \else + pop 0 + \fi\fi + def + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eleccoupler@nodes} +% \begin{macrocode} +\def\eleccoupler@nodes{% + \newOptexpElecComp{% + {@@x neg @@y0 @@sep add} + {@@x neg @@y0 @@sep sub} + {@@x @@y0 @@sep add} + {@@x @@y0 @@sep sub} }% + \pnode(0,0){\oenodeCenter{}} +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eleccoupler@comp} +% \begin{macrocode} +\def\eleccoupler@comp{% + \POE@comp@rectangle + \psline(!\POE@dict{@@x -0.7 mul @@y0 @@sep sub @@y 0.15 mul add})% + (!\POE@dict{@@x 0.7 mul @@y0 @@sep add @@y 0.15 mul sub})% + \psline(!\POE@dict{@@x 0.7 mul @@y0 @@sep sub @@y 0.15 mul add})% + (!\POE@dict{@@x -0.7 mul @@y0 @@sep add @@y 0.15 mul sub})% + \psline[style=Wire, arrows=-, ArrowInside=-](\oenodeIfc{1}{})(\oenodeIfc{3}{}) + \ifx\POE@key@eleccouplertype\POE@str@directional + \ifx\POE@key@eleccouplerinput\POE@str@left + \psline[style=Wire, arrows=-, ArrowInside=-]([Xnodesep=-0.1]\oenodeIfc{2}{})(\oenodeIfc{N}{}) + \else + \psline[style=Wire, arrows=-, ArrowInside=-](\oenodeIfc{2}{})([Xnodesep=0.1]\oenodeIfc{N}{}) + \fi + \pscustom[style=OptComp]{% + \moveto(!\POE@dict{@@x 0.15 add + \ifx\POE@key@eleccouplerinput\POE@str@left neg \fi + @@y0 @@sep sub 0.14 add}) + \rlineto(0,-0.04) + \multido{\rx=0.12+-0.08}{4}{% + \rlineto(0.05,-0.02) + \rlineto(-0.1,-0.04) + \rlineto(0.05,-0.02) + }% + \rlineto(0,-0.04) + }% + \else + \psline[style=Wire, arrows=-, ArrowInside=-](\oenodeIfc{2}{})(\oenodeIfc{N}{}) + \fi +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newOptexpElecDipole} +% \begin{macrocode} +\def\newOptexpElecDipole{% + \@ifnextchar[%] + {\POE@newelecdipole}{\POE@newelecdipole[]}% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\POE@newfiberdipole} +% \begin{macrocode} +\def\POE@newelecdipole[#1]#2{% + \@ifnextchar\bgroup + {\POE@newelecdipole@i[#1]{#2}}{\POE@newelecdipole@i[#1]{#2}{}}% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\POE@newelecdipole@i} +% \begin{macrocode} +\def\POE@newelecdipole@i[#1]#2#3{% + \@ifundefined{#2@i}{% + \@namedef{#2}{\pst@object{#2}}% + \expandafter\def\csname #2@i\endcsname(##1)(##2){% + \@ifnextchar\bgroup% + {\@nameuse{#2@ii}(##1)(##2)}% + {\@nameuse{#2@ii}(##1)(##2){}}% + }% + \expandafter\def\csname #2@ii\endcsname(##1)(##2)##3{% + \addbefore@par{#3}% + \addafter@par{#1}% + \begin@OptexpObj + \ifPOE@backlayer + \POE@regNodes{##1}{##2} + \fi + \POE@drawcomponent{#2}{##3} + \ifPOE@backlayer + \POE@Verb{ (1) (N) (\oenode{}{}) CorrectDipoleIfc }% + \POE@PresetWireConn + \fi + \end@OptexpDipole + }% + \@ifundefined{#2@nodes}{\expandafter\def\csname #2@nodes\endcsname{\POE@elecdipole@nodes}}{}% + }{% + \PackageError{pst-optexp}{% + elecdipole component '#2' already defined}% + }% +\ignorespaces}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\elecsynthesizer@ref} +% \begin{macrocode} +\newOptexpElecDipole{elecsynthesizer}{position=start, innercompalign=absolute} +\def\elecsynthesizer@ref{% + \POE@setref{% + \POE@key@synthwidth\space 0.5 mul + \POE@key@synthheight\space 0.5 mul + 2 copy min /@@sz ED + \ifx\POE@key@synthshape\POE@str@circle + pop pop @@sz dup + \fi + /@@y ED /@@x ED + }% +}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\elecsynthesizer@comp} +% \begin{macrocode} +\def\elecsynthesizer@comp{% + \ifx\POE@key@synthshape\POE@str@circle + \pscircle(!\POE@dict{@@x0 @@y0}){!\POE@dict{@@x}} + \else + \POE@comp@rectangle + \fi + \psrotate(\oenodeCenter{}){!\POE@dict{@@ang}}{% + \psset{style=SynthStyle}% + \begingroup +% \end{macrocode} +% Negative units are not possible with parametric or function plots. +% \begin{macrocode} + \let\POE@tempA\@empty + \let\POE@tempB\@empty + \ifdim\psxunit<0pt + \psset{xunit=-\psxunit} + \def\POE@tempA{-1 mul\space}% + \fi + \ifdim\psyunit<0pt + \psset{yunit=-\psyunit} + \def\POE@tempB{-1 mul\space}% + \fi + \ifx\POE@key@synthtype\POE@str@sine + \parametricplot[plotpoints=100]{-1}{1}{% + \POE@dict{@@sz 0.7 mul t mul t 180 mul \POE@tempA sin @@y -0.35 mul mul \POE@tempB }}% + \else\ifx\POE@key@synthtype\POE@str@pulse + \psplot[plotpoints=100]{-0.25}{0.25}{2.7182818 x 0.04 div dup mul neg exp 0.3 mul 0.13 sub \POE@tempB}% + \fi\fi + \endgroup + \ifx\POE@key@synthtype\POE@str@rectangle + \psline(!\POE@dict{@@sz -0.7 mul @@sz -0.35 mul})% + (!\POE@dict{@@sz 0.7 mul -1 1 \POE@key@synthrectwidth\space sub 2 mul add mul @@sz -0.35 mul})% + (!\POE@dict{@@sz 0.7 mul -1 1 \POE@key@synthrectwidth\space sub 2 mul add mul @@sz 0.35 mul})% + (!\POE@dict{@@sz 0.7 mul @@sz 0.35 mul})% + (!\POE@dict{@@sz 0.7 mul @@sz -0.35 mul}) + \else\ifx\POE@key@synthtype\POE@str@sawtooth + \psline(!\POE@dict{@@sz -0.6 mul @@sz -0.4 mul})% + (!\POE@dict{@@sz 0.6 mul @@sz 0.4 mul})% + (!\POE@dict{@@sz 0.6 mul @@sz -0.4 mul}) + \else\ifx\POE@key@synthtype\POE@str@triangle + \psline(!\POE@dict{@@sz -0.6 mul @@sz -0.4 mul})% + (!\POE@dict{0 @@sz 0.4 mul})% + (!\POE@dict{@@sz 0.6 mul @@sz -0.4 mul}) + \else + \@ifundefined{elecsynthesizer@custom}{}{\elecsynthesizer@custom}% + \fi\fi\fi}% +}% +% \end{macrocode} +% \end{macro} +%</stylefile> +% +% \chapter{The Postscript header file} +% \makeatletter +%^^A Copied this definition from doc.sty and changed it not to add a +%^^A backslash to the Postscript procedure name in the index. +% \def\SpecialIndex@#1#2{% +% \@SpecialIndexHelper@#1\@nil +% \def\@tempb{ }% +% \ifcat \@tempb\@gtempa +% \special@index{\quotechar\space\actualchar +% \string\verb\quotechar*\verbatimchar +% \quotechar\space\verbatimchar#2}% +% \else +% \def\@tempb##1##2\relax{\ifx\relax##2\relax +% \def\@tempc{\special@index{\quotechar##1\actualchar +% \string\verb\quotechar*\verbatimchar +% \quotechar##1\verbatimchar#2}}% +% \else +% \def\@tempc{\special@index{##1##2\actualchar +% \string\verb\quotechar*\verbatimchar##1##2\verbatimchar#2}}% +% \fi}% +% \expandafter\@tempb\@gtempa\relax +% \@tempc +% \fi} +% \makeatother +% +%<*prolog> +% +% This is the dictionary where all components are stored in. +% \begin{macrocode} +/tx@OptexpDict 200 dict def +tx@OptexpDict begin +/DebugOE false def +/DebugDepth 0 def +/DebugBegin { + DebugOE { + /DebugProcName ED + DebugDepth 2 mul string + 0 1 DebugDepth 2 mul 1 sub { + dup 2 mod 0 eq { (|) }{( )} ifelse + 3 -1 roll dup 4 2 roll + putinterval + } for + DebugProcName strcat == + /DebugDepth DebugDepth 1 add def + }{ + pop + } ifelse +} bind def +/DebugEnd { + DebugOE { + /DebugDepth DebugDepth 1 sub def + DebugDepth 2 mul 2 add string + 0 1 DebugDepth 2 mul 1 sub { + dup 2 mod 0 eq { (|) }{ ( ) } ifelse + 3 -1 roll dup 4 2 roll + putinterval + } for + dup DebugDepth 2 mul (+-) putinterval + ( done) strcat == + } if +} bind def +/DebugMsg { + DebugOE { + DebugDepth 1 add 2 mul string + 0 1 DebugDepth 2 mul 1 add { + dup 2 mod 0 eq { (|) }{( )} ifelse + 3 -1 roll dup 4 2 roll + putinterval + } for + exch strcat == + }{ + pop + } ifelse +} bind def +% \end{macrocode} +% \begin{macro}{strcat} +% Concatenate two strings and leave the result on the stack +% \begin{pssyntax} +% \PSstring{str1} \PSstring{str2} \PSop{strcat} \PSstring{str1str2} +% \end{pssyntax} +% \begin{macrocode} +/strcat { + exch 2 copy + length exch length add + string dup dup 5 2 roll + copy length exch + putinterval +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{nametostr} +% Convert a literal name to string. This is required, because some PSTricks +% parameter like \opt{angleA} do not allow round braces in the argument, so +% some string must be passed as name and then converted to a string. +% \begin{pssyntax} +% \PSname{name} \PSop{nametostr} \PSstring{name} +% \end{pssyntax} +% \begin{macrocode} +/nametostr { + dup length string cvs +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PrintWarning} +% Print a warning about the raytracing. This is enabled or disabled via option +% \opt{pswarning}. +% \begin{macrocode} +/PrintWarning { + (Warning pst-optexp: ) exch strcat (\n) strcat print +} bind def +/CompUnknownWarning { + (Component ') exch strcat (' unknown) strcat Warning +} bind def +/OneFiberCompWarning { + (Found only one unsupported component in beam path, drawing no beam) Warning +} bind def +/FiberCompWarning { + (Found an unsupported component in beam path, stopping beam path) Warning +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{inttostr} +% Convert an integer to a string. +% \begin{pssyntax} +% \PSvar{int} \PSop{inttostr} \PSstring{int} +% \end{pssyntax} +% \begin{macrocode} +/inttostr { + dup type /integertype eq { + dup log 1 add floor cvi string cvs + } if +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{calcNodes} +% Calculate the reference node coordinates for reflective components and +% stores them as \PSvar{X@A}, \PSvar{Y@A}, \PSvar{X@B} and \PSvar{Y@B}. +% \begin{pssyntax} +% \PSvar{XA} \PSvar{YA} \PSvar{XB} \PSvar{YB} \PSvar{XG} \PSvar{YG} \PSop{calcNodes} +% \end{pssyntax} +% \begin{macrocode} +/calcNodes { + (calcNode) DebugBegin + /YG exch def /XG exch def + /by exch YG sub def + /bx exch XG sub def + /ay YG 3 -1 roll sub def + /ax XG 3 -1 roll sub def + ax ay NormalizeVec bx by NormalizeVec VecAdd + 2 copy Pyth abs 1e-4 lt { + pop pop ax ay -90 matrix rotate dtransform + } if + /cy ED /cx ED + /c ax bx add ay by add Pyth def +% \end{macrocode} +% If $c=0$, then set the coordinates of the vector manually depending whether +% \PSvar{a} and \PSvar{b} are parallel or antiparallel. +% \begin{macrocode} + c 0 eq { + ax ay bx by DotProd 0 gt { +% \end{macrocode} +% $\text{dotprod} > 0$, i.e. \PSvar{a} and \PSvar{b} are parallel. +% \begin{macrocode} + /cx ax def + /cy ay def + }{ + /cx ay def + /cy ax neg def + } ifelse + } if + cx cy NormalizeVec 2 copy + XG YG VecAdd /Y@A ED /X@A ED + XG YG 4 2 roll VecSub /Y@B ED /X@B ED +% \end{macrocode} +% Test the chirality (the order) of the input points. Input angles $> 90$\textdegree +% don't make sense, in this case we exhange the calculated reference nodes. +% \begin{macrocode} + true + ax by mul ay bx mul sub 0 le { + pop false + Y@A X@A + /X@A X@B def + /Y@A Y@B def + /X@B exch def + /Y@B exch def + } if + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{capHeight} +% Calculate the height \PSvar{a} of a pole cap, used for curved interfaces. +% \begin{pssyntax} +% \PSvar{R} \PSvar{h} \PSop{capHeight} \PSvar{a} +% \end{pssyntax} +% \PSvar{R} is the circle radius and \PSvar{h} the width of the pole cap. +% \begin{macrocode} +/capHeight { + dup mul neg exch abs dup 3 1 roll dup mul add sqrt sub +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{leftCurvedIfc} +% Calculate some parameters for the «left» interface of a lens. Defines and +% \PSname{ArcL} which is used later in the code to actually draw the interface +% curve. +% \begin{pssyntax} +% \PSvar{h R1} \PSop{leftCurvedIfc} \PSvar{y |R1| alpha\textunderscore b +% alpha\textunderscore t R1} +% \end{pssyntax} +% \begin{macrocode} +/leftCurvedIfc { + /R1 exch def /h exch def + 0 R1 abs dup R1 h capHeight exch sub R1 sign mul dup + h exch atan exch + h neg exch atan + R1 0 lt { + /ArcL /arcn load def + } { + /ArcL /arc load def + } ifelse + R1 +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{rightCurvedIfc} +% Analogous to \PSname{leftCurvedIfc} for «right» interfaces, defines +% \PSname{ArcR} for later use. +% \begin{pssyntax} +% \PSvar{h R2} \PSop{rightCurvedIfc} \PSvar{y |R2| alpha\textunderscore b +% alpha\textunderscore t R2} +% \end{pssyntax} +% \begin{macrocode} +/rightCurvedIfc { + /R2 exch def /h exch def + 0 R2 abs dup R2 h capHeight sub R2 sign mul dup + h neg exch atan exch + h exch atan + R2 0 lt { + /ArcR /arcn load def + } { + /ArcR /arc load def + } ifelse + R2 +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{SlopeAngle} +% Calculate slope angle of a line from \PSname{nodeA} to \PSname{nodeB}. +% \begin{pssyntax} +% \PSname{nodeB} \PSname{nodeA} \PSop{SlopeAngle} \PSvar{angle} +% \end{pssyntax} +% \begin{macrocode} +/SlopeAngle { + (SlopeAngle) DebugBegin + @GetCenter 3 -1 roll @GetCenter @ABVect exch atan + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DefineExtNode} +% Constructs the coordinates of an external node based on values that have +% been set beforehand. \PSvar{xref} and \PSvar{yref} are the values which are +% defined by \opt{extnode} parameter. \PSvar{RefFac} is defined by parameter +% \opt{extnodealign}, which determines it the reference of the external node +% position should be the global coordinate system, or the line between the +% reference nodes. +% \begin{pssyntax} +% \PSvar{xref yref} \PSop{DefineExtNode} \PSvar{X Y} +% \end{pssyntax} +% \begin{macrocode} +/DefineExtNode {% + (DefineExtNode) DebugBegin + @@y mul RefFac mul @@y0 add + exch @@x mul RefFac mul @@x0 add exch + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetInternalNodeNames} +% Push all internal node names of \PSstring{basicname} on the +% stack. If \PSvar{reverse} is \PSvar{true}, the names are pushed in +% reverse order. +% \begin{pssyntax} +% \PSstring{basicname} \PSvar{reverse} \PSop{GetInternalNodeNames} +% \PSname{N@basicnameN} \ldots{} \PSname{N@basicname1} (if +% \PSvar{reverse = false}) +% \end{pssyntax} +% \begin{macrocode} +/GetInternalNodeNames { + (GetInternalNodeNames) DebugBegin + /reverse ED + dup cvn load /N get dup + reverse { -1 1 } { 1 1 3 -1 roll } ifelse + { inttostr + 3 -1 roll dup 4 1 roll exch NodeName 3 1 roll + } for + pop pop + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetInternalBeamNodes} +% This is like \PSvar{GetInternalNodeNames}, but leaves the node +% coordinates on the stack +% \begin{pssyntax} +% \PSstring{basicnodename} \PSvar{reverse} \PSop{GetInternalBeamNodes} +% \PSvar{XN YN \ldots\ X1 Y1} (if \PSvar{reverse = false}) +% \end{pssyntax} +% \begin{macrocode} +/GetInternalBeamNodes { + (GetInternalBeamNodes) DebugBegin + [ 3 1 roll GetInternalNodeNames ] + { @GetCenter } forall + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{InitOptexpComp} +% Initialize some global variables for positioning of external +% nodes. This is called at the beginning of every component. +% \begin{macrocode} +/InitOptexpComp {% + /@@x 0 def + /@@y 0 def + /@@x0 0 def + /@@y0 0 def + /@xref [0] def + /@yref [0] def + /RefFac 1 def +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NewTempNodeComp} +% If \cs{draw*beam} is invoked with a node as parameter, a +% temporary \cs{optplane} is defined. The plane vector of this temporary plane +% is set such that it is perpendicular to the connection between the node and the following +% interface node. +% +% This is the only procedure which sets the \PSname{adjustRel} flag +% which indicates adjustment of the plane vector rotation depending on +% the incoming or outgoing connection direction. +% +% For an explanation of all other dictionary members, please see +% \PSvar{NewOptexpComp}. +% \begin{pssyntax} +% \PSproc{x y} \PSproc{dx dy} \PSstring{name} \PSproc{scaling} +% \PSop{NewTempNodeComp} +% \end{pssyntax} +% \begin{macrocode} +/NewTempNodeComp { + (NewTempNodeComp) DebugBegin + /sc ED + dup cvn + 6 dict dup 3 1 roll def begin + /ambiguous false def + /allowbeaminside false def + /forcebeaminside false def + /name ED + /correct false def +% \end{macrocode} +% This definition does not work like for \PSvar{NewOptexpComp}, because +% a current point may not be available. Therefore, we translate to the +% $(X, Y)$ node and define $X = Y = 0$. +% \begin{macrocode} + {0 0} exch 3 -1 roll exec + gsave + translate + /CompMtrx CM def + grestore + /N 1 def + /n bgRefIndex def + 5 dict dup dup /P@1 ED /P@N ED + begin + /mode trans def + {} 0 0 PlainIfc + end + /adjustRel true def + end + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{CurvedIfc} +% Defines a curved interface. +% \begin{pssyntax} +% \PSproc{X Y} \PSproc{DX DY} \PSproc{scl} \PSvar{NAlow NAup} \PSop{CurvedIfc} +% \end{pssyntax} +% \begin{macrocode} +/CurvedIfc { + 5 2 roll + 2 copy 5 3 roll exec 3 -1 roll exec VecAdd + 5 -1 roll exec /Y ED /X ED + exch exec 3 -1 roll 3 copy exec /RY ED /RX ED + 3 1 roll NormalizeVec 3 -1 roll exec + tx@Dict begin Pyth end dup + 3 1 roll mul 1.00001 mul /NAup ED + mul 1.00001 mul /NAlow ED +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PlainIfc} +% \begin{pssyntax} +% \PSproc{X Y} \PSproc{DX DY} \PSproc{scl} \PSvar{NAlow NAup} \PSop{PlainIfc} +% \end{pssyntax} +% \begin{macrocode} +/PlainIfc { + 5 2 roll + dup 3 -1 roll exec NormalizeVec 3 -1 roll exec 2 copy /DY ED /DX ED + tx@Dict begin Pyth end dup 4 2 roll + exch exec 3 -1 roll exec /Y ED /X ED + 3 1 roll mul 1.00001 mul /NAup ED + mul 1.00001 mul /NAlow ED +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PathIfc} +% Define an interface which is given by an arbitrary path. +% \begin{pssyntax} +% \PSproc{X Y} \PSarray{path} \PSproc{scl} \PSvar{NAlow NAup} \PSop{PathIfc} +% \end{pssyntax} +% \begin{macrocode} +/PathIfc { + pop pop /NAup 0 def /NAlow 0 def +% \end{macrocode} +% This kind of interface doesn't allow to switch off the NA-settings, +% because the interface is defined only inside the NA. +% \begin{macrocode} + 3 1 roll /Path ED + exec 3 -1 roll exec /Y ED /X ED +} bind def +% \end{macrocode} +% \end{macro} +% \begin{macro}{NewCompIfc} +% Defines a new interface of a component, must be called within \PSvar{NewOptexpComp}. +% \begin{pssyntax} +% \PSproc{x y} \PSproc{dx dy|rx ry} \PSvar{NAlow NAup mode} +% \PSstring{CompName} \PSstring{Name} \PSproc{New\ldots Ifc} \PSproc{scaling} +% \PSop{NewCompIfc} +% \end{pssyntax} +% \begin{psarglist} +% \psargitem{\PSproc{x y}} The coordinates of the interface node which lies on the optical axis.?? +% \psargitem{\PSproc{dx dy | rx ry}} For a plane interface, this is the vector that describes the plane, for a curved interface this is the +% \psargitem{\PSvar{NAlow NAup}} +% \psargitem{\PSvar{mode}} An integer which characterizes if an interface is +% reflective or transmittive. You should use the predefined variable +% \PSname{refl} and \PSname{trans} for this. +% \psargitem{\PSstring{CompName}} The name of the component we are in. +% \psargitem{\PSstring{Name}} The name of the new interface. It is prefixed by «P@». +% \psargitem{\PSproc{\ldots Ifc}} Contain the actual procedure to define the +% concrete interface type, can be \PSproc{PlainIfc}, \PSproc{CurvedIfc} or \PSproc{PathIfc}. +% \end{psarglist} +% \begin{macrocode} +/NewCompIfc { + /scl ED + /next ED + dup (P@) exch strcat cvn + 6 dict dup + 3 1 roll def + begin + 3 -1 roll + /mode ED + 6 -1 roll dup 7 -1 roll + {scl} 8 -2 roll next + end +% \end{macrocode} +% store a new node \PSname{N@NameX}, with X=1..N this node always +% represents the intersection of an untilted and unshifted incoming beam +% on the optical axis with the respective interface +% \begin{macrocode} + exec scl ToVec 3 1 roll NodeName @NewNode +} bind def +% \end{macrocode} +% \end{macro} +% +% Define some constants. +% +% These are used for checks of the \opt{beamalign} and \opt{fiberalign} parameters. +% \begin{macrocode} +/relative 0 def /absolute 1 def /center 2 def /firstcomp 3 def +% \end{macrocode} +% +% These constants are used to describe the characteristics of interfaces. +% \begin{macrocode} +/refl 0 def /trans 1 def /absorb 2 def /refltrans 3 def /auto 4 def /undefined -1 def +% \end{macrocode} +% +% These give the ordering of the internal interfaces of a component. +% \begin{macrocode} +/desc 0 def /asc 1 def /amb 2 def +% \end{macrocode} +% +% The possible status after computing the outgoing vector at an interface. +% \begin{macrocode} +/ok 0 def /tir 1 def /missed 2 def +/bgRefIndex 0 def +% \end{macrocode} +% +% \begin{macro}{NewOptexpComp} +% \PSvar{NewOptexpComp} creates a new dictionary that contains everything needed +% for an optical component. It contains the following variables: +% \begin{psarglist} +% \psargitem{\PSvar{n}} The basic refractive index which was set for the +% component. This may be overwritten with the \opt{n} option of the +% \nxLcs{drawbeam} macros. +% +% \psargitem{\PSvar{CompMtrx}} The transformation matrix at time of +% the component definition. The method is the same as for the +% \nxLPack{pst-node} nodes. +% +% \psargitem{\PSvar{name}} The name of the component. This is build of +% several components which are put together in the \TeX\ code. +% +% \psargitem{\PSvar{N}} The number of interfaces of the component. +% +% \psargitem{\PSvar{P@1\ldots P@N}} The actual +% interfaces. \PSvar{P@1} and \PSvar{P@N} are always defined, even if +% \PSvar{N = 1}. In that case the two names link to the same +% dictionary, so that changes in one of them are automatically present +% also in the second one. +% +% \psargitem{\PSproc{sc}} The scaling procedure for the coordinates to convert +% from \TeX{} to Postscript scaling. In should always be defined as +% \PSproc{\textbackslash psxunit, \textbackslash psyunit}. +% +% \psargitem{\PSvar{ambiguous}} There is a class of components, which have a central interface +% \PSvar{P@C} which can be either transmittive or reflective, +% depending on the previous and following component positions. The +% mode of the \PSvar{P@C} is determined at the time of the beam +% drawing and requires special attention. +% +% \psargitem{\PSvar{correct}} If \opt{true}, the input vectors after +% the transmittive interfaces are corrected when using +% \opt{connectifc}. +% \end{psarglist} +% +% \begin{pssyntax} +% \PSvar{[} \PSproc{x y} \PSproc{dx dy | rx ry} \PSvar{NAlow NAup} +% \PSvar{type} \PSproc{\ldots Ifc} +% \PSvar{\ldots{} [n] correct? amb? allowbeaminside? forcebeaminside?} +% \PSstring{CompName} \PSproc{scaling} \PSop{NewOptexpComp} +% \end{pssyntax} +% \begin{macrocode} +/NewOptexpComp { + (NewOptexpComp) DebugBegin + /sc ED dup cvn + gsave + 13 dict dup 3 1 roll def begin + /name ED + /forcebeaminside ED + /allowbeaminside ED + /ambiguous ED + /grating false def + dup type /booleantype eq not { false } if /correct ED + tx@Dict begin + STV {CP T} stopped pop + end + /CompMtrx CM def + grestore + counttomark dup 6 idiv dup /N ED 6 mul eq { 1 } if + cvx 1 EvalRefIndex /n ED +% \end{macrocode} +% This defines for ambiguous components, which interface coincides with the +% ambiguous interface. 0 indicates that there is no ambiguous interface. +% \begin{macrocode} + ambiguous { + /ambIfc ED + }{ + /ambIfc 0 def + } ifelse + 1 N eq { +% \end{macrocode} +% only a single plane is specified, create the aliases. +% \begin{macrocode} + name (1) 3 -1 roll {sc} NewCompIfc + (1) (2) IfcCopy + (2) (N) IfcAlias + }{ + N -1 1 { % + inttostr exch name 3 1 roll {sc} NewCompIfc + } for + N inttostr (N) IfcAlias + } ifelse + ambiguous ambIfc 0 gt and { + ambIfc inttostr (C) IfcCopy + } if + end + pop + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NewOptexpFiberComp} +% \begin{pssyntax} +% \PSvar{[} \PSvar{x y} \ldots +% \PSstring{CompName} \PSproc{scaling} \PSop{NewOptexpFiberComp} +% \end{pssyntax} +% \begin{macrocode} +/NewOptexpFiberComp { + (NewOptexpFiberComp) DebugBegin + /sc ED dup cvn + gsave + 12 dict dup 3 1 roll def begin + /name ED + tx@Dict begin + STV {CP T} stopped pop + end + /CompMtrx CM def + grestore + counttomark /N ED + 1 N eq { +% \end{macrocode} +% only a single plane is specified, create the aliases. +% \begin{macrocode} + {0 1} 0 0 trans name (1) {PlainIfc} {sc} NewCompIfc + (1) (2) IfcCopy + (2) (N) IfcAlias + }{ + N -1 1 { + inttostr + {0 1} 0 0 absorb name 6 -1 roll {PlainIfc} {sc} NewCompIfc + } for + N inttostr (N) IfcAlias + } ifelse + end + pop + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{IfcCopy} +% Copy an interface \PSvar{from} to an interface \PSvar{to}, must be called +% within the respective component dictionary. This involves also copying the +% node associated with the interface. +% \begin{pssyntax} +% \PSvar{from} \PSvar{to} \PSop{CopyIfc} +% \end{pssyntax} +% \begin{macrocode} +/IfcCopy { + 2 copy IfcName exch IfcName load dup + length dict copy def + name exch NodeName name 3 -1 roll NodeName + tx@NodeDict begin + load dup length dict copy def + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{IfcAlias} +% Create an alias of an interface. This involves creating also an +% alias for the associated node. Must be called withing +% \PSvar{NewOptexpComp}. +% +% \begin{pssyntax} +% \PSstring{OrigPN} \PSstring{AliasPN} \PSop{IfcAlias} +% \end{pssyntax} +% \begin{macrocode} +/IfcAlias { + 2 copy IfcName exch IfcName load def + tx@NodeDict begin + name exch NodeName name 3 -1 roll NodeName load def + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{CompAlias} +% Components which have a \opt{compname} assigned, must also be +% available by their component number. Here, all necessary +% informations (nodes, component dictionary) are referenced such that +% any information is accessible via number or name. +% \begin{pssyntax} +% \PSstring{NameStem} \PSstring{IDStem} \PSop{CompAlias} +% \end{pssyntax} +% \begin{macrocode} +/CompAlias { +% \end{macrocode} +% Copy the component dictionary +% \begin{macrocode} + 2 copy cvn dup currentdict exch known { + load def + } { + pop + } ifelse + tx@NodeDict begin +% \end{macrocode} +% Copy all interface nodes of the component. +% \begin{macrocode} + 1 { + 3 copy inttostr dup + 3 1 roll 2 copy NodeName + currentdict exch known { + NodeName load 3 1 roll NodeName ED + 1 add + } { + pop (N) NodeName load 3 1 roll + pop (N) NodeName ED + pop exit + } ifelse + } loop +% \end{macrocode} +% Copy all other nodes associated with the component (reference nodes, center +% node, label node etc). +% \begin{macrocode} + mark (A) (B) (@A) (@B) (Center) (Label) (Rotref) + (TrefA) (TrefB) (@TrefA) (@TrefB) (Ext) (Origin) + counttomark { + counttomark 3 add -2 roll 2 copy counttomark 1 add 2 roll + 3 -1 roll dup 4 1 roll NodeName dup + currentdict exch known { + load 3 1 roll exch NodeName ED + } { + pop pop pop + } ifelse + } repeat pop +% \end{macrocode} +% Copy additional external nodes, the maximum is 8 (all combinations of +% l, r, t, b, c). Old and new node name stems are still on the stack. +% \begin{macrocode} + exch 1 1 8 { + 3 copy + (Ext) exch 5 string cvs strcat dup 3 1 roll + NodeName 3 1 roll NodeName + dup currentdict exch known { + load def pop + } { + pop pop pop exit + } ifelse + } for + pop pop + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetPlaneVec} +% Push the coordinates of the plane vector on the stack, for curved interfaces +% this is the tangent at the interface node. +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{CompName} \PSop{GetPlaneVec} \PSvar{dX dY} +% \end{pssyntax} +% \begin{macrocode} +/GetPlaneVec { + (GetPlaneVec) DebugBegin + cvn load begin + IfcName load begin + currentdict /RX known { + RX RY CompMtrx dtransform CM idtransform + neg exch + } { + DX DY CompMtrx dtransform CM idtransform + } ifelse + end + end + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetIfcCenter} +% Get the center node of a interface, either by specifying the name of the component and the interface number +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{CompName} \PSop{GetIfcCenter} \PSvar{X Y} +% \end{pssyntax} +% or by passing an interface procedure generated by \PSvar{PushAllPlanesOnStack}. +% \begin{pssyntax} +% \PSproc{Ifc} \PSop{GetIfcCenter} \PSvar{X Y} +% \end{pssyntax} +% \begin{macrocode} +/GetIfcCenter { + (GetIfcCenter) DebugBegin + dup type /stringtype eq not { + dup xcheck not { +% \end{macrocode} +% ambiguous +% \begin{macrocode} + 0 get (C) exch + } { + exec pop pop pop + } ifelse + } if + cvn load begin + IfcName load begin + currentdict /RX known { + X RX sub Y RY sub + } { + X Y + } ifelse + CompMtrx transform CM itransform + end + end + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetIfcCenterCorr} +% Get the coordinates of an interface node. This checks if corrected +% coordinates for proper connection handling are available. +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{CompName} \PSop{GetIfcCenterCorr} \PSvar{X|XCorr Y|YCorr} +% \end{pssyntax} +% \begin{macrocode} +/GetIfcCenterCorr { + (GetIfcCenterCorr) DebugBegin + cvn load begin + IfcName load begin + currentdict /XCorr known { + XCorr YCorr + }{ + X Y + } ifelse + currentdict /RX known { + RX neg RY neg VecAdd + } if + CompMtrx transform CM itransform + end + end + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TransformInVec} +% Transform the input vector as specified with \opt{beamangle} and +% \opt{beamdiv} from coordinates relative to the connection between first and +% second components to absolute coordinates. +% \begin{pssyntax} +% \PSproc{Ifc2} \PSproc{Ifc1} \PSproc{InVec} \PSop{TransformInVec} \PSproc{InVec'} +% \end{pssyntax} +% \begin{macrocode} +/TransformInVec { + (TransformInVec) DebugBegin + 3 1 roll + GetIfcCenter 4 2 roll + GetIfcCenter 5 -2 roll + @ABVect + 3 -1 roll exec 2 copy 6 2 roll + 0 eq exch 0 eq and not { +% \end{macrocode} +% invec != (0,0) +% \begin{macrocode} + exch atan matrix rotate dtransform + } { + 4 2 roll pop pop + } ifelse + ToVec + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TransformStartPos} +% Startpos is relative to the connection between first and second components +% transform to absolute coordinates and shift by first plane center +% Plane2 Plane1 \PSproc{StartPos} -> \PSproc{StartPos'+Plane1Center} +% \begin{macrocode} +/TransformStartPos { + (TransformStartPos) DebugBegin + exec 2 copy 6 2 roll 0 eq exch 0 eq and not + 3 1 roll GetIfcCenter 4 2 roll + GetIfcCenter 5 2 roll { + 2 copy 8 2 roll + @ABVect exch atan matrix rotate dtransform + VecAdd + } { + 6 2 roll pop pop pop pop + } ifelse + ToVec + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetNearestPlane} +% \begin{pssyntax} +% \PSvar{X Y} \PSstring{CompName} \PSop{GetNearestPlane} \PSvar{PlaneNumber} +% \end{pssyntax} +% \begin{macrocode} +/GetNearestPlane { + (GetNearestPlane) DebugBegin + 3 copy 1 exch GetIfcCenter @ABDist /dist ED /nearestPlane 1 def + dup cvn load /N get 2 1 3 -1 roll { +% \end{macrocode} +% iterate through plane 2 to plane N of CompName +% \begin{macrocode} + 4 copy exch GetIfcCenter @ABDist dup dist lt { + /dist ED /nearestPlane ED + } { + pop pop + } ifelse + } for + pop pop pop nearestPlane + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PushAmbCompPlanesOnStack} +% Components which do not have an unambiguous behaviour (beamslitter, can +% transmit and reflect) like lenses (transmission only) or mirrors (reflection +% only), must be evaluated to see which mode should be used. Argument is +% [(name) draw], draw is a boolean which is true if the inner beams should be +% drawn. +% \begin{macrocode} +/PushAmbCompPlanesOnStack { + (PushAmbCompPlanesOnStack) DebugBegin + currentdict /outToPlane undef + PN IfcCnt eq not { +% \end{macrocode} +% not the last component, there should be another one on the stack +% \begin{macrocode} + exch dup 3 1 roll % nextifc ambcomp nextifc + dup xcheck not { +% \end{macrocode} +% the next component is also ambiguous, use its center point as reference. +% \begin{macrocode} + 0 get (C) exch + } { +% \end{macrocode} +% otherwise use the interface on the stack +% \begin{macrocode} + exec pop pop pop + } ifelse + [ 3 1 roll ] cvx /outToPlane ED +% \end{macrocode} +% outToPlane is \PSproc{(PN) (compName)} +% \begin{macrocode} + } if +% \end{macrocode} +% the old plane number, without counting the additional planes of the current ambcomp +% \begin{macrocode} + /IfcCntTmp IfcCnt def +% \end{macrocode} +% Load some parameters from \opt{ambcomp} +% \begin{macrocode} + aload pop /draw ED /name ED + name cvn load /N get dup /N ED +% \end{macrocode} +% If the ambiguous component has only one interface, there exists no internal beam +% \begin{macrocode} + 1 eq { /draw true def } if +% \end{macrocode} +% \PSvar{CurrTmp} is the current point of the beam on the interface +% prior to the ambiguos component, \PSvar{CurrVecTmp} its outgoing +% vector. For wide beams, the lower ray is used. These vectors will be +% changed inside this procedure. +% \begin{macrocode} + currentdict /Curr known { + /CurrTmp /Curr load def + /CurrVecTmp /CurrVec load def + } { + /CurrTmp /CurrLow load def + /CurrVecTmp /CurrVecLow load def + } ifelse + PN 1 eq { +% \end{macrocode} +% If it is the first interface, the starting point is always the (C) +% plane, the mode is set arbitrarily to transmittive. +% \begin{macrocode} + [ (C) name name GetRefIndex trans draw] cvx +% \end{macrocode} +% Now check which is the outgoing plane +% \begin{macrocode} + name /outToPlane load GetNextPlane + dup 0 eq not { +% \end{macrocode} +% If there is one, i.e. if \PSvar{GetNextPlane} leaves something not +% equal to \PSvar{0} on the stack, this is the plane. +% \begin{macrocode} + [ exch name bgRefIndex trans draw ] cvx exch + /IfcCntTmp IfcCntTmp 1 add def + } { + pop + } ifelse + }{ +% \end{macrocode} +% It is not the first component, check which interface of the component +% is the nearest one to the current beam point and save its name in +% \PSvar{firstPlane}. +% \begin{macrocode} + CurrTmp name GetNearestPlane dup /firstPlane ED + name isAmbiguousIfc not { +% \end{macrocode} +% The first interface is not the ambiguous one, put it on the stack and +% calculated the new beam vector. +% \begin{macrocode} + firstPlane name + name firstPlane GetIfcMode + connectifc { bgRefIndex }{ name GetRefIndex } ifelse + CurrTmp CurrVecTmp + 10 dict begin HandleInterface end pop + ToVec /CurrVecTmp ED ToVec /CurrTmp ED + [ firstPlane name + connectifc { + bgRefIndex + }{ + name GetRefIndex + } ifelse + name firstPlane GetIfcMode +% \end{macrocode} +% always draw to first interface +% \begin{macrocode} + true ] cvx + /IfcCntTmp IfcCntTmp 1 add def + } if + PN IfcCnt eq { +% \end{macrocode} +% Its the last comp, just put the ambiguous interface on the stack, the mode is irrelevant. +% \begin{macrocode} + [ (C) name + name GetRefIndex + trans draw ] cvx + IfcCntTmp IfcCnt gt { exch } if + }{ +% \end{macrocode} +% Otherwise put the ambiguous interface on the stack and check its mode. +% \begin{macrocode} + beamdiffractionorder null eq not name cvn load /grating get and { +% \end{macrocode} +% A grating (AOM) and a beamdiffractionorder was selected. In that case, +% \opt{beammode} has no effect, and for beamdiffractionorder=0 the +% interface is transmittive, otherwise refl or refltrans +% \begin{macrocode} + beamdiffractionorder dup 0 eq { pop () } if + (C) exch 20 string cvs strcat + dup (P@) exch strcat cvn name cvn load exch known not { +% \end{macrocode} +% The choosen beamdiffractionorder is not defined, select the closest one and issue a warning +% \begin{macrocode} + pop beamdiffractionorder dup sign neg 1 { + (C) exch 5 string cvs dup 3 1 roll strcat + dup (P@) exch strcat cvn name cvn load exch known { + 3 -1 roll pop + (Diffraction order ) beamdiffractionorder 5 string cvs strcat + ( is not defined, using ) 4 -1 roll strcat strcat Warning + exit + } { + pop + } ifelse + } for + } if + /@@centerifc ED + mark @@centerifc name name GetRefIndex + beamdiffractionorder 0 eq { + trans + }{ + name @@centerifc GetIfcMode refltrans eq { + refltrans + }{ + refl + } ifelse + } ifelse + }{ + /@@centerifc (C) def + [ @@centerifc name + name GetRefIndex + beammode auto eq { + CurrVecTmp @@centerifc name GetPlaneVec + name @@centerifc GetIfcMode refltrans eq { -90 matrix rotate dtransform } if + NormalVec outToPlane GetIfcCenter @@centerifc name GetIfcCenter @ABVect DotProd + 0 lt { + trans + }{ + name @@centerifc GetIfcMode + refltrans eq { + refltrans + }{ + refl + } ifelse + } ifelse + } { + beammode dup refl eq { +% \end{macrocode} +% in case, the ambiguous interface is refltrans +% \begin{macrocode} + pop name @@centerifc GetIfcMode dup refltrans eq not { pop refl } if + } if + } ifelse + } ifelse + dup 6 1 roll +% \end{macrocode} +% if the ambiguous interface is the first, always draw to it +% \begin{macrocode} + IfcCntTmp IfcCnt eq { true }{ draw } ifelse + ] cvx + @@centerifc name 4 -1 roll + connectifc { bgRefIndex }{ name GetRefIndex } ifelse + CurrTmp CurrVecTmp + 10 dict begin HandleInterface end pop + ToVec /CurrVecTmp ED ToVec /CurrTmp ED +% \end{macrocode} +% now check which is the outgoing plane +% \begin{macrocode} + name /outToPlane load GetNextPlane + dup dup name isAmbiguousIfc exch 0 eq or not { + [ exch name bgRefIndex trans draw ] cvx exch + firstPlane name isAmbiguousIfc not { 3 -1 roll } if + /IfcCntTmp IfcCntTmp 1 add def + } { + pop +% \end{macrocode} +% The ambiguous interface is the last one, correct it to have the bgRefIndex. +% \begin{macrocode} + exec 3 -1 roll pop bgRefIndex 3 1 roll [ 6 1 roll ] cvx + firstPlane name isAmbiguousIfc not { exch } if + } ifelse + } ifelse + } ifelse + /IfcCnt IfcCntTmp def + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetNextPlane} +% \PSstring{comp} \PSproc{outToPlane} \PSop{GetNextPlane} \PSvar{PlaneNumber} +% \begin{macrocode} +/GetNextPlane { + (GetNextPlane) DebugBegin + 2 copy (C) 3 -1 roll + GetIfcCenter 3 -1 roll + exec GetIfcCenter + 4 2 roll 4 copy @ABVect ToVec /Vec ED + @ABDist /centerDist ED + /sprod 1 def + /nextPlane 0 def + exch dup 3 1 roll + cvn load dup /ambIfc get /ambIfc ED /N get 1 1 3 -1 roll { +% \end{macrocode} +% iterate through all interfaces of CompName which do not coincide with the ambiguous interface +% \begin{macrocode} + dup ambIfc eq not { + 3 copy 3 -1 roll 2 copy + GetPlaneVec Vec 4 2 roll NormalVec + Vec DotProd dup sprod lt 5 2 roll + GetIfcCenter 3 -1 roll exec GetIfcCenter @ABDist + centerDist lt and + centerDist -1 eq { pop dup 0 gt } if + { /sprod ED /nextPlane ED } { pop pop } ifelse + } { + pop + } ifelse + } for + pop pop nextPlane + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TraceBeam} +% [ CompN ... Comp1 \PSproc{options} \PSproc{start point} \PSvar{beamangle} +% -> Yn Xn drawToN? ... Y1 X1 drawTo1? Y0 X0 +% \begin{macrocode} +/TraceBeam { + (Tracebeam) DebugBegin + AngToVec /InVec ED /StartPoint ED + /oldbeaminsidelast currentdict /beaminsidelast known { + beaminsidelast + } { + false + } ifelse def +% \end{macrocode} +% execute options +% \begin{macrocode} + exec + connectifc { + /nbeam bgRefIndex def + } if + /startinside startinside beaminsidefirst or def + /stopinside stopinside beaminsidelast or def + /PrevCorrect false def + PrearrangePlanes + PushAllPlanesOnStack + currentdict /lastVecTmp known { + lastVecTmp beamangle matrix rotate dtransform ToVec + } { + counttomark 2 ge beamalign relative eq and { + 2 copy /InVec load TransformInVec + } { + /InVec load + } ifelse + } ifelse + /CurrVec ED + currentdict /lastBeamPointTmp known { + /lastBeamPointTmp load /Curr ED + }{ + counttomark 2 ge { + 2 copy /StartPoint load TransformStartPos + } { + /StartPoint load + } ifelse + /Curr ED + } ifelse + counttomark /IfcCnt ED +% \end{macrocode} +% Init the refractive index +% \begin{macrocode} + /n1 bgRefIndex def + /PN 1 def + (start looping) DebugMsg + { + PN IfcCnt gt { + exit + } if + (checked) DebugMsg + beampathcount 0 eq { + cleartomark mark exit + } if +% \end{macrocode} +% iterate over all planes +% \begin{macrocode} + dup xcheck not { +% \end{macrocode} +% array, not executable +% \begin{macrocode} + PushAmbCompPlanesOnStack + } if + exec + /draw ED /Mode ED /n2 ED 2 copy /CompName ED /IfcNum ED + GetIfcCenter ToVec /CurrCenter ED + Curr CurrVec + connectifc PrevCorrect PN 2 gt and PN 2 eq or and { + CurrVec CurrCenter PrevCenter PrevMode + currentdict /relAngle known + { relAngle } { 0 } ifelse connectInterfaces + /relAngle ED + } if +% \end{macrocode} +% Adjust the alignment of a node interface, if it is to be aligned +% perpendicular to the beam vector (beamnodealign=vector). +% \begin{macrocode} + CompName cvn load begin + currentdict /adjustRel known aligntovector and { + IfcNum IfcName load begin + currentdict /RX known not { +% \end{macrocode} +% Only exchange the coordinates of the beam vector, the sign is not +% important for the interface vector. +% \begin{macrocode} + 2 copy neg exch CM dtransform CompMtrx idtransform + /DY ED /DX ED + } if + end + } if + end + IfcNum CompName Mode n2 8 4 roll HandleInterface + missed eq { + counttomark PN 1 sub 3 mul sub {pop} repeat + (The beam missed an interface) Warning exit + exit + } if + PN 1 eq { + pop pop + /draw beaminsidefirst oldbeaminsidelast xor def + } { + ToVec /CurrVec ED + } ifelse + 2 copy + ToVec /Curr ED + draw PN beampathskip 1 add gt and + counttomark 3 roll + /PrevCenter /CurrCenter load def + /lastBeamPointTmp /Curr load def + currentdict /lastVecTmp known { + /prevVecTmp /lastVecTmp load def + /lastVecTmp /CurrVec load def + } { + /CurrVec load dup /lastVecTmp ED /prevVecTmp ED + } ifelse + /PrevMode Mode def + CompName cvn load /correct get /PrevCorrect ED + PN IfcCnt eq { + exit + } { + CurrVec 0 eq exch 0 eq and { + IfcCnt PN sub {pop} repeat + (Total internal reflection occured, this is not supported) + Warning + exit + } if + beampathcount 1 add PN eq { + IfcCnt PN sub {pop} repeat + exit + } if + /PN PN 1 add def + } ifelse + } loop + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{sign} +% \begin{macrocode} +/sign { + 0 ge { 1 } { -1 } ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{Chirality} +% \begin{macrocode} +/Chirality { + 4 -1 roll mul 3 1 roll mul sub sign +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TraceInterfacePath} +% \begin{macrocode} +/TraceInterfacePath { + tx@IntersectDict begin + /ArrowA { {currentpoint} stopped {moveto}{pop pop pop pop} ifelse } def + {} TraceCurveOrPath + currentdict /ArrowA undef + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TraceAndFillWideBeam} +% Fill a wide beam. This has an own procedure, because each segment +% of the beam must be filled separately. +% \begin{pssyntax} +% \PSvar{[} \PSstring{CompN} \PSvar{\ldots{}} \PSstring{Comp1} +% \PSproc{options} \PSproc{start point up} \PSvar{beamangle\_up} +% \PSproc{start point low} \PSvar{beamangle\_low} \PSop{FillWideBeam} +% \end{pssyntax} +% \begin{macrocode} +/TraceAndFillWideBeam { + (TraceAndFillWideBeam) DebugBegin + AngToVec /InvecLow ED /StartLow ED + AngToVec /InvecUp ED /StartUp ED +% \end{macrocode} +% execute user options +% \begin{macrocode} + exec + connectifc { + /nbeam bgRefIndex def + } if + /startinside startinside beaminsidefirst or def + /stopinside stopinside beaminsidelast or def +% \end{macrocode} +% Number of segments already drawn +% \begin{macrocode} + /DrawnSegm 0 def +% \end{macrocode} +% whether the previous plane required correction of the input vector (used only with \opt{connectifc}) +% \begin{macrocode} + /PrevCorrect false def + PrearrangePlanes + PushAllPlanesOnStack + currentdict /lastVecTmpUp known + currentdict /lastVecTmpLow known and { + /CurrVecLow lastVecTmpLow beamangle matrix rotate dtransform ToVec def + /CurrVecUp lastVecTmpUp beamangle matrix rotate dtransform ToVec def + }{ +% \end{macrocode} +% If the \opt{beamangle} is not absolute, use the connection between the first +% two planes as reference and transform the input vectors accordingly. +% \begin{macrocode} + beamalign relative eq counttomark 2 ge and { + 2 copy /InvecLow load TransformInVec /CurrVecLow ED + 2 copy /InvecUp load TransformInVec /CurrVecUp ED + } { + /CurrVecLow /InvecLow load def + /CurrVecUp /InvecUp load def + } ifelse + } ifelse +% \end{macrocode} +% If \opt{loadbeampoints} is set, the nodes \PSname{lastBeamPointTmpLow} and +% \PSname{lastBeamPointTmpUp} are defined and used as starting points. +% \begin{macrocode} + currentdict /lastBeamPointTmpLow known + currentdict /lastBeamPointTmpUp known and { + /lastBeamPointTmpLow load /CurrLow ED + /lastBeamPointTmpUp load /CurrUp ED +% \end{macrocode} +% The lower and upper beam vectors must possibly swapped if the +% intersection points are loaded from a previous beam, but the beam +% divergence is specified manually for this beam only. We must make +% sure, that negative divergence gives a contracting beam. +% \begin{macrocode} + loadbeam not beamdiv 0 eq not and { + CurrVecLow CurrVecUp Chirality + CurrLow CurrUp @ABVect CurrVecLow CurrVecUp VecAdd Chirality 0 lt { neg } if + beamdiv sign eq not { + /CurrVecLow load /CurrVecUp load /CurrVecLow ED /CurrVecUp ED + } if + } if + } { +% \end{macrocode} +% Transform the beam vectors relative to the connection between the first two interfaces. +% \begin{macrocode} + counttomark 2 ge { + 2 copy /StartLow load TransformStartPos /CurrLow ED + 2 copy /StartUp load TransformStartPos /CurrUp ED + } { + /StartLow load /CurrLow ED + /StartUp load /CurrUp ED + } ifelse + } ifelse + /PrevVecUp /CurrVecUp load def + /PrevVecLow /CurrVecLow load def +% \end{macrocode} +% \PSvar{IfcCnt} is the number of interfaces pushed on the stack by +% \PSvar{PushAllPlanesOnStack}. This number may be corrected later if an +% ambiguous components is among them. +% \begin{macrocode} + counttomark /IfcCnt ED + /n1 bgRefIndex def + /CurrR false def + /CurrPath false def + /CurrUpT false def + /CurrLowT false def + /ret missed def + /PN 1 def + { + PN IfcCnt gt { + exit + } if + beampathcount 0 eq { + cleartomark mark exit + } if + dup xcheck not { +% \end{macrocode} +% Found an array (not executable) instead of a procedure. This is an ambiguous +% component, resolve the interfaces depending on the input vector and +% surrounding interfaces. This can change \PSvar{IfcCnt}. +% \begin{macrocode} + PushAmbCompPlanesOnStack + } if +% \end{macrocode} +% push the interface on the stack +% \begin{macrocode} + exec +% \end{macrocode} +% \PSvar{draw} indicates if the beam to the current interface should be drawn. +% \begin{macrocode} + PN beampathskip 1 add gt and /draw ED +% \end{macrocode} +% \PSvar{Mode} stores the mode (transmittive or reflective) of the current interface. +% \begin{macrocode} + /Mode ED /n2 ED 2 copy /CompName ED /IfcNum ED +% \end{macrocode} +% \PSvar{CurrPCenter} holds the coordinates of the current interface center. +% \begin{macrocode} + GetIfcCenter ToVec /CurrPCenter ED + /oldn1 n1 def +% \end{macrocode} +% Adjust the alignment of a node interface, if it is to be aligned +% perpendicular to the beam vector (beamnodealign=vector). The alignment +% is carried out with the median vector of upper and lower beam. +% \begin{macrocode} + CompName cvn load /adjustRel known aligntovector and { + connectifc PrevCorrect PN 2 gt and PN 2 eq or and { + CurrVecUp CurrVecUp CurrPCenter PrevPCenter PrevMode + currentdict /relAngleUp known { relAngleUp } { 0 } ifelse + connectInterfaces pop + CurrVecLow CurrVecLow CurrPCenter PrevPCenter PrevMode + currentdict /relAngleLow known { relAngleLow } { 0 } ifelse + connectInterfaces pop + } { + CurrVecUp CurrVecLow + } ifelse + VecAdd NormalizeVec + CompName cvn load begin + IfcNum IfcName load begin + currentdict /RX known not { + CM dtransform CompMtrx idtransform + /DX ED neg /DY ED + } { + pop pop + } ifelse + end + end + } if +% \end{macrocode} +% Calculate new upper vector and intersection point +% \begin{macrocode} + CurrUp CurrVecUp + connectifc PrevCorrect PN 2 gt and PN 2 eq or and { + CurrVecUp CurrPCenter PrevPCenter PrevMode + currentdict /relAngleUp known { relAngleUp } { 0 } ifelse + connectInterfaces /relAngleUp ED + } if + /PrevUp /CurrUp load def + /PrevUpT /CurrUpT load def + /PrevPath /CurrPath load def + IfcNum CompName Mode n2 8 4 roll HandleInterface + dup /ret ED + missed eq { + counttomark {pop} repeat + (The upper beam missed an interface) Warning exit + } if + ToVec /CurrVecUp ED + ToVec /CurrUp ED + currentdict /isectT known currentdict /isectPath known and { + /CurrUpT isectT def + /CurrPath isectPath def + } if + /n1 oldn1 def +% \end{macrocode} +% Calculate new lower vector and intersection point +% \begin{macrocode} + /PrevLow /CurrLow load def + /PrevLowT /CurrLowT load def + CurrLow CurrVecLow + connectifc PrevCorrect PN 2 gt and PN 2 eq or and { + CurrVecLow CurrPCenter PrevPCenter PrevMode + currentdict /relAngleLow known { relAngleLow } { 0 } ifelse + connectInterfaces /relAngleLow ED + } if + IfcNum CompName Mode n2 8 4 roll HandleInterface + dup missed eq { + /ret ED + (The lower beam missed an interface) Warning + counttomark {pop} repeat exit + } if + tir eq ret tir eq or { + /ret tir def + } { + /ret ok def + } ifelse + ToVec /CurrVecLow ED + ToVec /CurrLow ED +% \end{macrocode} +% lower done +% \begin{macrocode} + currentdict /isectT known { + /CurrLowT isectT def + } if + /PrevR CurrR def + PrevR type /realtype eq { + /CurrCenter load /PrevCenter ED + } if + IfcNum CompName isCurvedIfc { + IfcNum CompName LoadIfc + tx@Dict begin Pyth end /CurrR ED + ToVec /CurrCenter ED + } { + /CurrR false def + /CurrCenter false def + } ifelse + IfcNum CompName isPathIfc not { + /CurrPath false def + /CurrLowT false def + /CurrUpT false def + } if + PN 1 gt currentdict /fillBeam known and { + draw { + /DrawnSegm DrawnSegm 1 add def + PrevUp moveto CurrUp lineto + IfcNum CompName isCurvedIfc { + CurrCenter CurrUp CurrLow + 4 copy 3 -1 roll eq 3 1 roll eq and { + 6 {pop} repeat + } { + TangentCrosspoint + CurrLow CurrR arct + } ifelse + } { + IfcNum CompName isPathIfc { + CurrPath CurrUpT CurrLowT TraceInterfacePath + } { + CurrLow lineto + } ifelse + } ifelse + PrevLow lineto + PrevPath type /booleantype eq not { + PrevPath PrevLowT PrevUpT TraceInterfacePath + } { + PrevR type /booleantype eq not { + PrevCenter PrevLow PrevUp + 4 copy 3 -1 roll eq 3 1 roll eq and { + 6 {pop} repeat + } { + TangentCrosspoint + PrevUp PrevR arct + } ifelse + } { + PrevUp lineto + } ifelse + } ifelse + } if + Mode refl eq draw and + draw not DrawnSegm 0 gt and or { + fillBeam newpath + /DrawnSegm 0 def + } if + } if + PN 1 eq { +% \end{macrocode} +% At the first interface, we only determine the actual intersection +% points with the interfaces, the beam vectors are not changed and must +% be reset to the previous values. +% \begin{macrocode} + /CurrVecUp /PrevVecUp load def + /CurrVecLow /PrevVecLow load def + } if +% \end{macrocode} +% If the beam should also be stroked, push the coordinates and the 'draw' information on the stack +% \begin{macrocode} + strokeBeam { + CurrUp draw CurrLow draw counttomark 1 add 6 roll + } if + PN IfcCnt eq ret tir eq or + beampathcount 1 add PN eq or { + DrawnSegm 0 gt currentdict /fillBeam known and { + fillBeam newpath + /DrawnSegm 0 def + } if + IfcCnt PN sub {pop} repeat + ret tir eq { + (Total internal reflection occured, this is not supported) + Warning + } if + exit + } if + /PN PN 1 add def + /PrevVecUp /CurrVecUp load def + /PrevVecLow /CurrVecLow load def + /PrevPCenter /CurrPCenter load def + /PrevMode Mode def + CompName cvn load /correct get /PrevCorrect ED + } loop + DrawnSegm 0 gt currentdict /fillBeam known and { + fillBeam newpath + /DrawnSegm 0 def + } if + ret missed eq not { +% \end{macrocode} +% Check if Up and Low must be swapped for next beam. This depends both +% on the relative orientation (chirality) of the incoming beam vector +% and the vector between the two intersection points CurrUp and CurrLow, +% and the direction of the beam vector. +% +% The intersection points are swapped if the angle of the beam vector is +% between $90°+\epsilon$ and $-90°+\epsilon$ and the chirality is +% positive, or if the beam vector points to the right, positive +% half-circle and the chirality is negative. The $\epsilon$ is +% introduced to get the correct order for $\pm 90°$ despite numerical +% errors. +% \begin{macrocode} + CurrLow CurrUp @ABVect % from Low to Up + PrevVecUp PrevVecLow VecAdd + 2 copy 6 2 roll + Chirality 0 lt + 3 1 roll 2 copy pop -1e-5 lt + 3 1 roll exch 1e-5 lt exch 0 lt and or xor { +% \end{macrocode} +% swap upper and lower beam points for next beam +% \begin{macrocode} + /lastBeamPointTmpUp /CurrLow load def + /lastBeamPointTmpLow /CurrUp load def + /lastVecTmpUp /CurrVecLow load def + /lastVecTmpLow /CurrVecUp load def + } { + /lastBeamPointTmpLow /CurrLow load def + /lastBeamPointTmpUp /CurrUp load def + /lastVecTmpUp /CurrVecUp load def + /lastVecTmpLow /CurrVecLow load def + } ifelse + /lastVecTmpUp load /lastVecTmpLow load + /prevVecLow ED /prevVecUp ED + } if + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DrawbeamPrepare} +% Prepare the data points for drawing with \PSop{DrawbeamSimple} and +% \PSop{DrawbeamArrowInside}. +% \begin{macrocode} +/DrawbeamPrepare { +% \end{macrocode} +% Remove trailing empty line parts. +% \begin{macrocode} + { + counttomark 6 le { exit } if + 3 index not { pop pop pop }{ exit } ifelse + } loop +% \end{macrocode} +% Remove heading empty line parts. Note, that the first point must not have +% 'draw = true', because it is the starting point which we have to move to. +% \begin{macrocode} + { + counttomark 3 le { exit } if + counttomark 3 sub index not { + counttomark -3 roll pop pop pop + }{ + exit + } ifelse + } loop +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DrawbeamSimple} +% \begin{macrocode} +/DrawbeamSimple { + pop 5 copy 3 -1 roll pop + ArrowA pop pop pop pop + counttomark 3 idiv -1 2 { + pop { + lineto + }{ + moveto + } ifelse + } for + {CP 4 2 roll ArrowB lineto pop pop } {moveto} ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DrawbeamArrowInside} +% This is the /Line definition from \opt{pstricks-add}, adapted to the beam path +% structure which includes the boolean values to indicate if a line is drawn, or +% if we use moveto. There was no way to patch the original definition to account +% for the moveto parts and avoid duplicating the code. +% \begin{macrocode} +/DrawbeamArrowInside { + 6 copy pop + /y1 ED /x1 ED pop /y2 ED /x2 ED + /Alpha y2 y1 sub x2 x1 sub Atan def + pop 3 -1 roll 5 1 roll + ArrowA +% \end{macrocode} +% dx add, and dy add, to get the current point at the end of the arrow tip. +% \begin{macrocode} + x1 Alpha cos arrowlength mul add + y1 Alpha sin arrowlength mul add + 5 -1 roll 3 1 roll true + /N N 1 sub def + N { + 6 copy pop + /y1 ED /x1 ED pop /y2 ED /x2 ED /draw ED +% \end{macrocode} +% Check for line segment length and draw the arrow only, if the segment is long +% enough. This is in first place to avoid drawing an inside arrow for the +% pinhole which has three interfaces instead of one so that it can be used as +% real spatial filter. +% \begin{macrocode} + x1 y1 x2 y2 @ABDist dup + arrowminlength ge + exch arrowmaxlength dup 0 lt + 3 1 roll le or and { + x1 y1 + arrowpos 1 gt { + /Alpha y2 y1 sub x2 x1 sub Atan def + /dArrowPos dArrowPosStart abs def + /ArrowPos ArrowPosStart def + arrowno { + /ArrowPos ArrowPos dArrowPos add def + x1 Alpha cos ArrowPos mul add + y1 Alpha sin ArrowPos mul add + 6 index { ArrowInside } if + pop pop + } repeat + }{ + arrowno 1 gt { + 1.0 arrowno 1.0 add div + }{ + dArrowPosStart + } ifelse /dArrowPos ED + /ArrowPos ArrowPosStart def + arrowno { + /ArrowPos ArrowPos dArrowPos add def + x2 x1 sub ArrowPos mul x1 add + y2 y1 sub ArrowPos mul y1 add + 6 index { ArrowInside } if + pop pop + } repeat + } ifelse + pop pop + } if + draw {Lineto}{moveto} ifelse + } repeat + {CP 4 2 roll ArrowB lineto pop pop } {moveto} ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{isAmbiguous} +% Check if \PSvar{compname} is ambiguous, i.e. if it can have alternating beam +% paths depending on the input and output plane (e.g. beamsplitter can either +% transmit or reflect a beam). +% \begin{pssyntax} +% \PSstring{compname} \PSop{isAmbiguous} \PSvar{boolean} +% \end{pssyntax} +% \begin{macrocode} +/isAmbiguous { + cvn load dup /ambiguous known { + /ambiguous get + } { + pop false + } ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{isAmbiguousIfc} +% Check if interface \PSvar{IfcNum} is the ambiguous interface of \PSvar{compname}. +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{compname} \PSop{isAmbiguousIfc} \PSvar{boolean} +% \end{pssyntax} +% \begin{macrocode} +/isAmbiguousIfc { + cvn load dup /ambiguous known { + /ambIfc get eq + } { + pop pop false + } ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{isCurvedIfc} +% Check if interface \PSvar{IfcNum} of componente \PSvar{compname} is curved. +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{compname} \PSop{isCurvedIfc} \PSvar{bool} +% \end{pssyntax} +% \begin{macrocode} +/isCurvedIfc { + cvn load begin + IfcName load /RX known + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{isPathIfc} +% Check if interface \PSvar{IfcNum} of componente \PSvar{compname} is an arbitrary path. +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{compname} \PSop{isPathIfc} \PSvar{bool} +% \end{pssyntax} +% \begin{macrocode} +/isPathIfc { + cvn load begin + IfcName load /Path known + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{HandleInterface} +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{CompName} \PSvar{mode n2 X0 Y0 Xin Yin} +% \PSop{HandleInterface} +% \PSvar{X0' Y0' Xout Yout status} +% \end{pssyntax} +% \begin{macrocode} +/HandleInterface { + (HandleInterface) DebugBegin + /Yin ED /Xin ED /Y0 ED /X0 ED /n2 ED /mode ED + currentdict /isectT undef currentdict /isectPath undef + 2 copy 2 copy LoadIfc % IfcNum name IfcNum name path + dup type /arraytype eq { % is an path interface + dup /isectPath exch def + 3 1 roll pop pop PathInterface % IfcNum name t X0' Y0' Xout Yout status + dup missed eq not { 6 -1 roll /isectT exch def } if + } { + 6 -2 roll + isCurvedIfc { CurvedInterface }{ PlainInterface } ifelse + } ifelse +% \end{macrocode} +% IfcNum CompName X0' Y0' Xout Yout status +% +% Check if X0' Y0' are within the numerical aperture of the interface +% \begin{macrocode} + dup missed eq not useNA connectifc not and and { + 7 3 roll 2 copy 9 2 roll + 4 2 roll 2 copy + %% X0' Y0' Xout Yout status X0' Y0' IfcNum CompName IfcNum CompName + cvn load begin IfcName load dup /NAlow get exch /NAup get end + 2 copy lt { + 4 2 roll 2 copy LoadIfc NormalizeVec + 6 -2 roll isCurvedIfc { + neg exch + } if + %% ... X0' Y0' NAlow NAup X Y dXp dYp + 8 -2 roll 6 -2 roll + %% ... NAlow NAup dXp dYp X0' Y0' X Y + @ABVect DotProd + dup 4 -1 roll ge 3 1 roll ge and not + { + pop missed + } if + }{ + 6 {pop} repeat + } ifelse + } { + 7 -2 roll pop pop + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{LoadIfc} +% \begin{pssyntax} +% \PSvar{IfcNum} \PSstring{CompName} \PSop{LoadIfc} \PSvar{X Y} \PSvar{dX|RY dY|RY} +% \end{pssyntax} +% \begin{macrocode} +/LoadIfc { + (LoadIfc) DebugBegin + cvn load begin + IfcName load begin + currentdict /Path known { + Path TransformPath + } { + X Y + CompMtrx transform CM itransform + currentdict /RX known { RX RY }{ DX DY } ifelse + CompMtrx dtransform CM idtransform + } ifelse + end + end + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{isFreeray} +% Check if \PSvar{compname} is a free-ray componente by checking if there is a +% refractive index associated with it. +% \begin{pssyntax} +% \PSstring{compname} \PSop{isFreeray} \PSvar{boolean} +% \end{pssyntax} +% \begin{macrocode} +/isFreeray { + cvn load /n known +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{/compIsKnown} +% Check if a component is known. +% \begin{macrocode} +/compIsKnown { + dup type /stringtype eq { cvn } if + tx@OptexpDict exch known +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PrearrangePlanes} +% \begin{pssyntax} +% \PSvar{[} \PSstring{CompN} \PSvar{\ldots} \PSvar{Comp1} \PSop{PrearrangePlanes}\\ +% \PSvar{[} \PSvar{desc|asc} \PSstring{CompN} \PSvar{\ldots} \PSvar{desc|asc} \PSstring{Comp1} +% \end{pssyntax} +% \begin{macrocode} +/PrearrangePlanes { + (PrearrangePlanes) DebugBegin + counttomark dup 2 lt { + dup 0 eq { + (Found no component on stack, drawing no beam) PrintWarning + }{ +% \end{macrocode} +% Only one component, draw always in ascending order. We must still +% check in /PushAllPlanesOnStack if the component has only one +% interface. +% \begin{macrocode} + exch dup + compIsKnown { + dup isFreeray { + asc exch 3 -1 roll + }{ + OneFiberCompWarning + pop + } ifelse + }{ + CompUnknownWarning + } ifelse + } ifelse + /N 0 def + }{ +% \end{macrocode} +% We have a minimum of two components on stack +% \begin{macrocode} + /N ED + /CompA ED dup /CompB ED +% \end{macrocode} +% Check, if the components have been defined +% \begin{macrocode} + CompA compIsKnown CompB compIsKnown and { + CompA isFreeray { + CompA isAmbiguous { + amb dup CompA + } { + CompB isAmbiguous { + 1 CompA GetIfcCenter (C) CompB GetIfcCenter @ABDist + (N) CompA GetIfcCenter (C) CompB GetIfcCenter @ABDist + } { + 1 CompA GetIfcCenter + 1 CompB GetIfcCenter + (N) CompB GetIfcCenter + true OrderNodes exch pop + (N) CompA GetIfcCenter + 1 CompB GetIfcCenter + (N) CompB GetIfcCenter + true OrderNodes exch pop + } ifelse + le { desc } { asc } ifelse dup CompA + } ifelse + counttomark 2 roll + }{ + FiberCompWarning + counttomark 1 sub { pop } repeat + /N 0 def + } ifelse + }{ +% \end{macrocode} +% One of the first two components was not defined, do not draw any beam +% \begin{macrocode} + /N 0 def + CompA compIsKnown not {CompA}{CompB} ifelse + CompUnknownWarning + } ifelse + } ifelse + 2 1 N { + /i ED exch /CompB ED + CompB compIsKnown not { + counttomark i 1 sub 2 mul 1 add sub { pop } repeat + CompB CompUnknownWarning + exit + } if + CompB isFreeray not { + counttomark i 1 sub 2 mul 1 add sub { pop } repeat + FiberCompWarning + exit + } if + CompB isAmbiguous not { + dup desc eq { 1 } { dup amb eq { (C) }{ (N) } ifelse } ifelse + CompA GetIfcCenter + 1 CompB GetIfcCenter + (N) CompB GetIfcCenter false OrderNodes dup dup +% \end{macrocode} +% check if we have a NodeIfc +% \begin{macrocode} + 4 -1 roll CompA exch 5 -1 roll CompB exch + i 2 eq { +% \end{macrocode} +% check also the first plane +% \begin{macrocode} + 4 copy 4 2 roll AdjustRelRot + } if + AdjustRelRot + } { +% \end{macrocode} +% check if the first plane is an NodeIfc and correct its rotation, the +% node ordering in CompA is irrelevant at this point, so we use desc. +% \begin{macrocode} + i 2 eq { + CompB amb CompA desc AdjustRelRot + } if + pop amb dup + } ifelse + CompB /CompA CompB def + counttomark 2 roll + } for pop + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{AdjustRelRot} +% Adjusts the relative orientation of \PSstring{CompB} based on the +% relative connection between \PSstring{CompA} and +% \PSstring{CompB}. This is only done for ``node interfaces'', which +% are created automatically when drawing beams through nodes. +% \begin{pssyntax} +% \PSstring{CompA} \PSvar{desc|asc} \PSstring{CompB} \PSvar{desc|asc} \PSop{AdjustRelRot} +% \end{pssyntax} +% \begin{macrocode} +/AdjustRelRot { + (AdjustRelRot) DebugBegin + exch dup cvn load /adjustRel known aligntovector not and { + dup dup 4 2 roll isAmbiguous { + exch pop (C) + }{ + desc eq { (N) }{ 1 } ifelse + } ifelse + exch GetIfcCenter 5 3 roll + exch dup 3 1 roll isAmbiguous { + pop (C) + }{ + desc eq { 1 }{ (N) } ifelse + } ifelse + exch GetIfcCenter + @ABVect exch atan exch + cvn load begin + adjustRel { + matrix rotate CompMtrx matrix concatmatrix /CompMtrx ED + /adjustRel false def + } { + pop + } ifelse + end + } { + pop pop pop pop + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PushAllPlanesOnStack} +% \begin{pssyntax} +% \PSvar{[} \PSvar{desc|asc} \PSstring{CompN} \PSvar{\ldots} \PSvar{desc|asc} \PSstring{Comp1} +% \PSop{PushAllPlanesOnStack} +% \PSvar{[} \PSproc{PN \PSstring{CompName} n mode draw?} \PSvar{\ldots{}} +% \end{pssyntax} +% \begin{psarglist} +% \psargitem{PN} The number of the plane of the component \PSstring{CompNameN}, can be an integer or a string. +% \psargitem{CompName} The name of the component which the interface \PSvar{PN} belongs to. +% \psargitem{n} The refractive index after the respective interface. +% \psargitem{mode} Specifies if the interface is transmittive (\PSvar{trans}) or reflective (\PSvar{refl}). +% \psargitem{draw?} Specifies if the connection to this interface should be drawn or if the current point is only moved. +% \end{psarglist} +% \begin{macrocode} +/PushAllPlanesOnStack { + (PushAllPlanesOnStack) DebugBegin + counttomark 2 div cvi /@N ED + 1 1 @N { +% \end{macrocode} +% iterate over all components +% \begin{macrocode} + /last false def + /first false def + dup 1 eq { + /first true def pop beaminsidefirst + } { + @N eq { + beaminsidelast + /last true def + } { + beaminside + } ifelse + } ifelse + exch load dup dup + /forcebeaminside get { + 3 -1 roll pop true + } { + dup /allowbeaminside get 4 -1 roll and + } ifelse + /drawinside ED + /ambiguous get { + /name get drawinside [ 3 1 roll ] + counttomark 1 roll pop + } { + begin +% \end{macrocode} +% Start of the component dict. +% \begin{macrocode} + desc eq { + N N -1 1 1 + } { + 1 1 1 N N + } ifelse + first { + startinside not { +% \end{macrocode} +% first comp and we do not start inside +% \begin{macrocode} + 5 -2 roll + pop pop + 2 copy 5 2 roll + } { + startinsidecount 0 gt N startinsidecount sub 1 gt and { +% \end{macrocode} +% we do not use all segments of the first component +% \begin{macrocode} + 3 -1 roll dup 4 1 roll + N 1 sub startinsidecount sub mul + 6 -2 roll pop add dup 5 2 roll + } if + } ifelse + } if + last stopinsidecount 0 gt N stopinsidecount sub 1 gt and and { + % 1 1 1 N N + 3 -1 roll dup 4 1 roll stopinsidecount mul + 6 -1 roll dup 7 1 roll add 3 1 roll pop pop dup + } if + 5 1 roll + { +% \end{macrocode} +% iterate over all planes +% \begin{macrocode} + 3 1 roll 2 copy 5 -1 roll + dup 3 1 roll + eq first not and { +% \end{macrocode} +% always draw the line to the first plane of a component +% \begin{macrocode} + true + } { +% \end{macrocode} +% the other beams depend on some options +% \begin{macrocode} + drawinside + } ifelse + exch dup 4 -1 roll eq { +% \end{macrocode} +% after the last component plane we have always air +% \begin{macrocode} + bgRefIndex + }{ +% \end{macrocode} +% otherwise the respective refractive index of the component +% \begin{macrocode} + name GetRefIndex + } ifelse + exch inttostr exch + 3 1 roll name + 4 1 roll + dup IfcName load /mode get + 3 1 roll 5 1 roll + [ 6 1 roll ] cvx counttomark 1 roll + last { + savebeampoints 1 ge stopinside not and + savebeampoints 1 lt beaminsidelast not and or { + exit + } if + } if + } for pop pop + end + } ifelse + } for + DebugEnd + counttomark 1 eq { pop } if +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{IfcName} +% Construct the interface name from \PSvar{num}. +% \begin{pssyntax} +% \PSvar{num} \PSop{IfcName} \PSname{P@num} +% \end{pssyntax} +% \begin{macrocode} +/IfcName { + inttostr (P@) exch strcat cvn +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetIfcMode} +% \begin{pssyntax} +% \PSstring{name} \PSvar{num} \PSop{GetIfcMode} \PSvar{mode} +% \end{pssyntax} +% \begin{macrocode} +/GetIfcMode { + exch cvn load begin + IfcName load /mode get + end +} bind def +% \end{macrocode} +% \end{macro} +% \begin{macro}{NodeName} +% Construct the node name from a string or number. +% \begin{pssyntax} +% \PSstring{name} \PSvar{num} \PSop{NodeName} \PSname{N@namenum} +% \end{pssyntax} +% \begin{macrocode} +/NodeName { + dup /stringtype eq not { inttostr } if + strcat (N@) exch strcat cvn +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{OrderNodes} +% Check if node (\PSvar{XB1}, \PSvar{YB1}) or (\PSvar{XBN}, \PSvar{YBN}) is nearer to node (\PSvar{XA}, \PSvar{YA}). If it +% \PSvar{B1} is nearer, push \PSvar{asc} on the stack, otherwise +% \PSvar{desc}. If \PSvar{calcDist} is \opt{true} it leaves also the actual +% smallest distance on the stack. +% \begin{pssyntax} +% \PSvar{XA YA XB1 YB1 XBN YBN calcDist} \PSop{OrderNodes} \PSvar{desc|asc} \PSvar{distance} +% \end{pssyntax} +% \begin{macrocode} +/OrderNodes { + 7 1 roll 6 -2 roll 2 copy 8 2 roll + @ABDist 5 1 roll @ABDist 2 copy gt { + pop asc exch + } { + exch pop desc exch + } ifelse + 3 -1 roll not { + pop + } if +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NormalVec} +% Construct a normal vector $\vec{n}$ to the plane such that its +% scalar product with the incomping wave vector $\vec{v}_\text{in}$ is +% negative: $\vec{n}\cdot (-\vec{v}_\text{in}) > 0$. +% \begin{pssyntax} +% \PSvar{Xin Yin Xplane Yplane} \PSop{NormalVec} \PSvar{Xnorm Ynorm} +% \end{pssyntax} +% \begin{macrocode} +/NormalVec { + neg exch 2 copy 6 2 roll DotProd 0 gt { + -1 mul exch -1 mul exch + } if + NormalizeVec +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DotProd} +% Scalar product between two vectors. +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{DotProd} \PSvar{val} +% \end{pssyntax} +% \begin{macrocode} +/DotProd { + 3 -1 roll mul 3 1 roll mul add +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{VecAngle} +% Angle between two vectors $\cos(\alpha) = \frac{ab}{|a||b|}$ +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{VecAngle} \PSvar{angle} +% \end{pssyntax} +% \begin{macrocode} +/VecAngle { + 4 copy 4 copy DotProd 5 1 roll + tx@Dict begin + Pyth 3 1 roll Pyth + end mul + div Acos + 5 2 roll mul 4 1 roll 3 -1 roll mul 3 -1 roll sub + 0 le { -1 }{ 1 } ifelse mul +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{VecAdd} +% Addition of two vectors. +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{VecAdd} \PSvar{Xa+Xb Ya+Yb} +% \end{pssyntax} +% \begin{macrocode} +/VecAdd { + 3 -1 roll add 3 1 roll add exch +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{VecSub} +% Subtraction of two vectors. +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{VecSub} \PSvar{Xa-Xb Ya-Yb} +% \end{pssyntax} +% \begin{macrocode} +/VecSub { + neg 3 -1 roll add 3 1 roll neg add exch +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{VecScale} +% Scale a vector by a factor \PSvar{fac}. +% \begin{pssyntax} +% \PSvar{Xa Ya fac} \PSop{VecScale} \PSvar{fac}$\cdot$\PSvar{Xa} \PSvar{fac}$\cdot$\PSvar{Ya} +% \end{pssyntax} +% \begin{macrocode} +/VecScale { + dup 4 -1 roll mul 3 1 roll mul +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ToVec} +% Convert two numbers to a procedure holding the two values. This +% representation is used to save coordinate values of nodes and vectors. +% \begin{pssyntax} +% \PSvar{X Y} \PSop{ToVec} \PSproc{X Y} +% \end{pssyntax} +% \begin{macrocode} +/ToVec { + ToPnt cvx +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ToPnt} +% Convert two numbers to an array holding the two values. +% \begin{pssyntax} +% \PSvar{X Y} \PSop{ToPnt} \PSarray{X Y} +% \end{pssyntax} +% \begin{macrocode} +/ToPnt { + [ 3 1 roll ] +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{AngToVec} +% Convert an angle to the related vector representation (normalized). The +% angle is with respect to the positive $x$-axis. +% \begin{pssyntax} +% \PSvar{angle} \PSop{AngToVec} \PSproc{X Y} +% \end{pssyntax} +% \begin{macrocode} +/AngToVec { + dup cos exch sin ToVec +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NormalizeVec} +% Normalize a vector ($X'^2 + Y'^2 = 1$) +% \begin{pssyntax} +% \PSvar{X Y} \PSop{NormalizeVec} \PSvar{X' Y'} +% \end{pssyntax} +% \begin{macrocode} +/NormalizeVec { + 2 copy + tx@Dict begin + Pyth + end + dup 3 1 roll div 3 1 roll div exch +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@ABVect} +% Vector from (Xb,Yb) to (Xa,Ya) +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{@ABVect} \PSvar{(Ya - Yb) (Xa - Xb)} +% \end{pssyntax} +% \begin{macrocode} +/@ABVect { + 3 -1 roll exch sub 3 1 roll sub exch +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@ABDist} +% \begin{pssyntax} +% \PSvar{Xa Ya Xb Yb} \PSop{@ABDist} \PSvar{dist} +% \end{pssyntax} +% \begin{macrocode} +/@ABDist { + 3 -1 roll sub dup mul 3 1 roll sub dup mul add sqrt +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@InterLines} +% Shorthand definition for \PSvar{InterLines} procedure of the +% \nxLPack{pst-eucl} package. Takes care of a bug in the +% \nxLPack{pst-eucl} package, that too many items are popped off the +% stack if no intersection point exists. +% \begin{pssyntax} +% \PSvar{X1 Y1 X2 Y2 X3 Y3 X4 Y4} \PSop{@InterLines} \PSvar{X Y ret} +% \end{pssyntax} +% \begin{macrocode} +/@InterLines { + tx@EcldDict begin + EqDr /D1c exch def /D1b exch def /D1a exch def + EqDr /D2c exch def /D2b exch def /D2a exch def + D1a D2b mul D1b D2a mul sub dup + ZeroEq { % parallel lines + pop 0 0 missed + }{ + /Det exch def + D1b D2c mul D1c D2b mul sub Det div + D1a D2c mul D2a D1c mul sub Det div + ok + } ifelse + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@GetCenter} +% Shorthand definition for the \PSvar{GetCenter} procedure of the +% \nxLPack{pst-node} package. Takes either a string or a literal name +% for the node name \PSvar{name}. +% \begin{pssyntax} +% \PSname{name} \PSop{@GetCenter} \PSvar{X Y} +% \end{pssyntax} +% \begin{macrocode} +/@GetCenter { + tx@NodeDict begin load GetCenter end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{@NewNode} +% Shorthand definition for creating a new pnode. +% \begin{macrocode} +/@NewNode { + tx@NodeDict begin + false exch 10 {InitPnode } NewNode + end +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{RefractVec} +% Calculate the refracted vector, the normal plane vector must be +% constructed with \PSvar{NormalVec}, see +% \url{http://en.wikipedia.org/wiki/Snell%27s_law#Vector_form} for the +% formulas. +% \begin{pssyntax} +% \PSvar{Xin Yin Xnorm Ynorm n1 n2} \PSop{RefractVec} \PSvar{Xout Yout} +% \end{pssyntax} +% If it would be total internal reflection, the output vector is (0, 0). +% \begin{macrocode} +/RefractVec { + (RefractVec) DebugBegin + TransformRefIndex exch TransformRefIndex exch div /n ED + /Ynorm ED /Xnorm ED + NormalizeVec /Yin ED /Xin ED + n abs 1 eq { + Xin Yin + }{ + /costheta1 Xnorm Ynorm Xin neg Yin neg DotProd def + 1 n dup mul 1 costheta1 dup mul sub mul sub + dup 0 lt { +% \end{macrocode} +% would be total internal reflection, stop +% \begin{macrocode} + pop 0 0 + } { + sqrt /costheta2 ED + n Xin mul n Yin mul + n costheta1 mul costheta2 sub dup + Xnorm mul exch Ynorm mul VecAdd + } ifelse + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ReflectVec} +% Calculate the reflected vector, the normal plane vector must have been +% constructed with \PSvar{NormalVec}. +% \begin{pssyntax} +% \PSvar{Xin Yin Xnorm Ynorm} \PSop{ReflectVec} \PSvar{Xout Yout} +% \end{pssyntax} +% \begin{macrocode} +/ReflectVec { + (ReflectVec) DebugBegin + /Ynorm ED /Xnorm ED NormalizeVec /Yin ED /Xin ED + /costheta1 Xnorm Ynorm Xin neg Yin neg DotProd def + Xin Yin 2 costheta1 mul dup Xnorm mul exch Ynorm mul VecAdd + DebugEnd +} bind def +/ReflectGratVec { + (ReflectGratVec) DebugBegin + /Ynorm ED /Xnorm ED NormalizeVec /Yin ED /Xin ED + /costheta1 Xnorm Ynorm Xin neg Yin neg DotProd def + Xin Yin -2 costheta1 mul dup Xnorm mul exch Ynorm mul VecAdd + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{CurvedInterface} +% \begin{pssyntax} +% \PSvar{Xp Yp Xr Yr} \PSop{CurvedInterface} \PSvar{X0' Y0' Xout Yout status} +% \end{pssyntax} +% \begin{macrocode} +/CurvedInterface { + (CurvedInterface) DebugBegin + 2 copy /Yr ED /Xr ED + tx@Dict begin Pyth end /radius ED /Yp ED /Xp ED + /X0n X0 Xp sub def /Y0n Y0 Yp sub def + tx@EcldDict begin + X0n Y0n 2 copy 2 copy Xin 3 -1 roll add Yin 3 -1 roll add + 2 copy 6 2 roll EqDr radius InterLineCircle + end + 4 copy + 0 eq 3 {exch 0 eq and} repeat { +% \end{macrocode} +% if all coordinates are zero we missed the circle, stop +% \begin{macrocode} + missed + } { + 4 copy +% \end{macrocode} +% Chose which of the two intersection points to take. +% \begin{macrocode} + Xr neg Yr neg 2 copy + 8 -2 roll @ABDist + 5 1 roll @ABDist + gt { +% \end{macrocode} +% «dist from first point» $>$ «dist from second point», take second point. +% \begin{macrocode} + 4 2 roll + } if pop pop + Xp Yp VecAdd + 2 copy Xp Yp 4 2 roll @ABVect exch neg Xin Yin 4 2 roll NormalVec + Xin Yin 4 2 roll +% \end{macrocode} +% on stack: crossing point, in vector, and normal vector +% \begin{macrocode} + mode trans eq { + n1 n2 RefractVec + 2 copy 0 eq exch 0 eq and { tir } { ok } ifelse + } { + ReflectVec ok + } ifelse /n1 n2 def + 5 -2 roll 2 copy 7 2 roll X0 Y0 @ABVect Xin Yin DotProd 0 lt + PN 1 gt and { + pop missed + } if + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PlainInterface} +% \begin{pssyntax} +% \PSvar{Xp Yp dXp dYp} \PSop{PlainInterface} \PSvar{X0' Y0' Xout Yout status} +% \end{pssyntax} +% \begin{macrocode} +/PlainInterface {% + (PlainInterface) DebugBegin + /dYp ED /dXp ED /Yp ED /Xp ED + Xp Yp Xp dXp add Yp dYp add X0 Y0 X0 Xin add Y0 Yin add + @InterLines missed eq { + 0 0 missed + } { + Xin Yin Xin Yin dXp dYp + mode refltrans eq { + neg exch NormalVec ReflectVec ok + } { + NormalVec + mode trans eq { + n1 n2 RefractVec + 2 copy 0 eq exch 0 eq and { tir } { ok } ifelse + } { + ReflectVec ok + } ifelse + } ifelse + /n1 n2 def + 5 -2 roll 2 copy 7 2 roll X0 Y0 @ABVect Xin Yin DotProd 0 lt + PN 1 gt and { + pop missed + } if + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{PathInterface} +% \begin{pssyntax} +% \PSarray{path} \PSop{PathInterface} \PSvar{X0' Y0' Xout Yout status} +% \end{pssyntax} +% \begin{macrocode} +/PathInterface { + (PathInterface) DebugBegin + [ [X0 Y0] [X0 Xin add Y0 Yin add] ] exch + tx@IntersectDict begin IntersectLinePath end % [pathseg] t [isect] + dup length 0 eq { + pop pop pop 0 0 missed + } { + aload pop + Xin Yin Xin Yin + 8 -2 roll exch % I.x I.y Xin Yin Xin Yin t [pathseg] + exch dup 9 1 roll exch % t I.x I.y Xin Yin Xin Yin t [pathseg] + dup length 2 eq { % a line + exch pop + aload pop aload pop 3 -1 roll aload pop VecSub % t I.x I.y Xin Yin Xin Yin dXp dYp + } { + exch dup cvi sub DeriveCurve + } ifelse + % the following part is copied from /PlainInterface + NormalVec + mode trans eq { + n1 n2 RefractVec + 2 copy 0 eq exch 0 eq and { tir } { ok } ifelse + } { + ReflectVec ok + } ifelse + /n1 n2 def + 5 -2 roll 2 copy 7 2 roll X0 Y0 @ABVect Xin Yin DotProd 0 lt + PN 1 gt and { + pop missed + } if + % t X0' Y0' Xout Yout status + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TransformRefIndex} +% If the refractive index on the stack is for the background (has value +% \opt{bgRefIndex}, which is \opt{0}), we replace it here with its actual +% value (\opt{1}). This is necessary to distinguish between background index +% and components having an index of \opt{1}, which can be changed with option +% \opt{n}. +% \begin{pssyntax} +% \PSvar{n} \PSop{TransformRefIndex} \PSvar{n|1} +% \end{pssyntax} +% \begin{macrocode} +/TransformRefIndex { + dup bgRefIndex eq { pop 1 } if +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetRefIndex} +% Evaluate the refractive index of component \opt{name}. +% \begin{pssyntax} +% \PSstring{name} \PSop{GetRefIndex} \PSvar{neval} +% \end{pssyntax} +% \begin{macrocode} +/GetRefIndex { + cvn load /n get /nbeam load exch + EvalRefIndex +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{EvalRefIndex} +% Evaluate the expression in \opt{nbeam} after setting refractive index to +% \opt{n}. +% \begin{pssyntax} +% \PSproc{nbeam} \PSvar{n} \PSop{GetRefIndex} \PSvar{neval} +% \end{pssyntax} +% \begin{macrocode} +/EvalRefIndex { + dup bgRefIndex eq not { + 1 dict begin +% \end{macrocode} +% Store \opt{n} locally for evaluation of the mathematical expression in +% \opt{nbeam}. +% \begin{macrocode} + /n ED + exec + end + } if +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{Sellmaier} +% Calculate the refractive index for BK7 glass with the Sellmaier +% equation. The wavelength must be given in nanometre. The coefficients are +% taken from \href{http://en.wikipedia.org/wiki/Sellmeier_equation}. +% \begin{pssyntax} +% \PSvar{lambda} \PSop{Sellmaier} \PSvar{n} +% \end{pssyntax} +% \begin{macrocode} +/Sellmaier { + dup mul + dup dup 1.03961212 mul exch 6000.69867 sub div + exch dup dup 0.231792344 mul exch 20017.9144 sub div + exch dup 1.01046945 mul exch 103.560653e6 sub div + add add 1 add sqrt +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TangentCrosspoint} +% Xp Yp Xt1 Yt1 Xt2 Yt2 +% \begin{macrocode} +/TangentCrosspoint { + 4 copy 4 copy 14 -2 roll 2 copy + 6 2 roll @ABVect neg exch + 6 2 roll @ABVect neg exch + 8 -2 roll VecAdd 10 2 roll VecAdd + @InterLines pop +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NearestNodeTmp} +% {NodeB} CompA -> shortest distance, planenum +% \begin{macrocode} +/NearestNodeTmp { + exch /NodeB ED + /dist -1 def + dup cvn load /N get dup 1 eq { + [ exch (N) ] + } { + [ exch 1 1 3 -1 roll { } for ] + } ifelse + { + 2 copy pop + GetIfcCenterCorr 2 copy + NodeB @ABDist + dist 0 lt { + /dist ED + ToVec /node ED + } { + dup dist lt { + /dist ED + ToVec /node ED + } { + pop pop pop + } ifelse + } ifelse + } forall + pop dist /node load +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{NearestNode} +% Get the coordinates of the node of \PSvar{CompA} which is nearest to +% \PSvar{CompB}/\PSvar{NodeB}, or push the coordinates of +% \PSvar{NodeA} on stack if it is already a node. +% \begin{pssyntax} +% \PSvar{CompA/NodeA} \PSvar{CompB/NodeB} \PSop{NearestNode} \PSvar{X Y} +% \end{pssyntax} +% \begin{macrocode} +/NearestNode { + (NearestNode) DebugBegin + dup xcheck not { nametostr } if /CompB ED + dup xcheck not { +% \end{macrocode} +% CompA is a component +% \begin{macrocode} + nametostr /CompA ED + /CompB load dup xcheck not { +% \end{macrocode} +% CompB is a component +% \begin{macrocode} + /mindist -1 def + [ exch false GetInternalNodeNames ] + { @GetCenter ToVec + CompA NearestNodeTmp + exch dup mindist ge mindist 0 ge and { + pop pop + }{ + /mindist ED /minnodeA ED + } ifelse + } forall + minnodeA + } { + CompA NearestNodeTmp exch pop exec + } ifelse + } { +% \end{macrocode} +% else, it is a node and we already have the appropriate coordinates on the +% stack +% \begin{macrocode} + exec + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{RelConnAngle} +% Calculate start angle of \cs{nccurve} from CompA to CompB +% +% \begin{pssyntax} +% \PSvar{Xb Yb Xa Ya A B} \PSvar{fiberalign} \PSop{RelConnAngle} \PSvar{angle} +% \end{pssyntax} +% \begin{macrocode} +/RelConnAngle { + (RelConnAngle) DebugBegin + /fiberalign ED + dup xcheck not { nametostr } if /CompB ED + dup xcheck not { nametostr } if /CompA ED + /CompA load xcheck { + /CompB load xcheck { +% \end{macrocode} +% both parameters are nodes, so the angle is that of the direct connection line. +% \begin{macrocode} + @ABVect exch atan + } { +% \end{macrocode} +% B is a component, and A is a node: the angle at node A is calculated through component B +% \begin{macrocode} + 4 copy @ABVect 6 2 roll pop pop 2 copy +% \end{macrocode} +% on stack: Xb-Xa Yb-Ya Xb Yb Xb Yb +% \begin{macrocode} + CompB (Center) NodeName @GetCenter +% \end{macrocode} +% on stack: Xb-Xa Yb-Ya Xb Yb Xb Yb Xbc Ybc +% \begin{macrocode} + 4 2 roll @ABVect 4 2 roll + CompB + fiberalign center eq { + RelConnAngle@center + }{ + 3 1 roll pop pop + RelConnAngle@ref + } ifelse + 2 copy exch atan + 7 3 roll 2 copy 9 -2 roll + DotProd 0 gt 5 1 roll DotProd 0 gt xor { 180 add } if + } ifelse + } { +% \end{macrocode} +% A is a component, B is insignificant +% +% discard coordinates of B +% \begin{macrocode} + 4 2 roll pop pop 2 copy + CompA (Center) NodeName @GetCenter + 4 2 roll @ABVect 4 2 roll +% \end{macrocode} +% on stack: Xac-Xa Yac-Xa Xa Ya +% \begin{macrocode} + CompA fiberalign center eq { + RelConnAngle@center + }{ + 3 1 roll pop pop + RelConnAngle@tref + } ifelse + 2 copy exch atan +% \end{macrocode} +% Xac-Xa Yac-Ya XaB-XaA YaB-YaA angleTrefline +% \begin{macrocode} + 5 1 roll DotProd 0 gt { 180 add } if + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{/RelConnAngle@ref} +% Calculate the vector of the reference line of \PSvar{CompA}. +% \begin{pssyntax} +% \PSstring{CompA} \PSop{RelConnAngle@ref} \PSvar{dX dY} +% \end{pssyntax} +% \begin{macrocode} +/RelConnAngle@ref { + dup (A) NodeName exch (B) NodeName + @GetCenter 3 -1 roll @GetCenter @ABVect +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{/RelConnAngle@tref} +% Same as \PSname{RelConnAngle@ref} but uses the transformed reference nodes. +% \begin{pssyntax} +% \PSvar{CompA} \PSop{RelConnAngle@ref} \PSvar{dX dY} +% \end{pssyntax} +% \begin{macrocode} +/RelConnAngle@tref { + dup (TrefA) NodeName exch (TrefB) NodeName + @GetCenter 3 -1 roll @GetCenter @ABVect +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{/RelConnAngle@center} +% Calculate the vector from the center node of \PSvar{CompA} to the +% node \PSstring{Xa, Ya}. +% \begin{pssyntax} +% \PSvar{Xa Ya CompA} \PSop{RelConnAngle@center} \PSvar{dX dY} +% \end{pssyntax} +% \begin{macrocode} +/RelConnAngle@center { + (Center) NodeName @GetCenter 4 2 roll @ABVect +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetIfcOrNodeCoord} +% \begin{pssyntax} +% \PSstring{IfcNum} \PSstring{CompName}/\PSproc{node} \PSop{GetIfcOrNodeCoord} \PSvar{x y} +% \end{pssyntax} +% \begin{macrocode} +/GetIfcOrNodeCoord { + dup xcheck { + exch pop exec + } { + nametostr exch nametostr exch GetIfcCenter + } ifelse +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{connectInterfaces} +% \begin{pssyntax} +% \PSproc{vec} +% \end{pssyntax} +% InVec Center CenterTmp PrevMode relangle +% \begin{macrocode} +/connectInterfaces { + /relAngleTmp ED + PN 2 eq { +% \end{macrocode} +% initialize relAngle, the angle between plane connection and input vector +% \begin{macrocode} + pop @ABVect NormalizeVec 4 2 roll VecAngle /relAngleTmp ED + } if + PN 3 ge { + trans eq { +% \end{macrocode} +% previous plane was transmittive, recalculate the input vector +% \begin{macrocode} + @ABVect NormalizeVec 4 2 roll pop pop % remove Vec from stack + relAngleTmp matrix rotate dtransform + 4 2 roll pop pop + } { +% \end{macrocode} +% else, the previous plane was reflective, recalculate relAngle +% \begin{macrocode} + @ABVect NormalizeVec 4 2 roll VecAngle /relAngleTmp ED + } ifelse + } if + relAngleTmp +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetCompRange} +% \PSstring{basename} \PSvar{start stop} +% \PSop{GetCompRange} \PSstring{basenamestart} \ldots\ \PSstring{basenamestop} +% \begin{macrocode} +/GetCompRange { + 2 copy gt { 1 }{ -1 } ifelse 3 -1 roll + { exch dup 3 -1 roll inttostr strcat exch} for + pop +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{CorrectDipoleIfc} +% For a dipole which has two interface nodes (1) and (N) which are very close +% together ($\text{dist} < 10^{-7}$) or which coincide, the automatic angle +% estimation of the fiber connections does not work properly. So these +% interfaces are separated as less as possible so that the NearestNode +% procedure estimates two different distances. The changed nodes are saved +% only in the interface dictionary as XCorr and YCorr. You must use these for +% the fiber connections. +% \begin{pssyntax} +% \PSstring{node1} \PSstring{node2} \PSstring{basename} \PSop{CorrectDipoleIfc} +% \end{pssyntax} +% \begin{macrocode} +/CorrectDipoleIfc { + (CorrectDipoleIfc) DebugBegin + dup dup 3 copy + 8 -1 roll dup 9 1 roll NodeName exch 7 -1 roll dup 7 1 roll NodeName + gsave + tx@Dict begin + STV CP T + exch @GetCenter 3 -1 roll @GetCenter + end + grestore + 4 copy @ABDist 1e-7 lt { +% \end{macrocode} +% The two nodes are closer together than $10^{-7}$, correct that to avoid +% problems with the angle direction when drawing fibers. +% \begin{macrocode} + 6 -1 roll + gsave + tx@Dict begin + STV CP T + (TrefA) NodeName @GetCenter 7 -1 roll + (TrefB) NodeName @GetCenter + end + grestore + @ABVect NormalizeVec 2 copy +% \end{macrocode} +% The floating-point precision of the Postscript interpreter is +% approximately 8 digits, so in order to have an effect, the nodes must +% be separated by $10^{-7}$ times the maximum coordinate value. +% \begin{macrocode} + 8 -2 roll abs exch abs mymax -1e-6 mul VecScale + 8 -2 roll cvn load begin + IfcName load begin + X Y VecAdd /YCorr exch def /XCorr exch def + end + end + 4 2 roll abs exch abs mymax 1e-6 mul VecScale + 4 2 roll cvn load begin + IfcName load begin + X Y VecAdd /YCorr exch def /XCorr exch def + end + end + } { + 10 { pop } repeat + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ClipFadeValue} +% Clip a number to the range [0:1]. +% \begin{pssyntax} +% \PSvar{value} \PSop{ClipFadeValue} \PSvar{clippedvalue} +% \end{pssyntax} +% \begin{macrocode} +/ClipFadeValue { + dup 0 lt { pop 0 }{ dup 1 gt { pop 1 } if } ifelse +} bind def +% \end{macrocode} +% \end{macro} +% \begin{macro}{fadeto@} +% The different fadeto modes. +% \begin{macrocode} +/fadeto@white { + FadeFunc ClipFadeValue @S mul @H exch @B sethsbcolor +} bind def +/fadeto@black { + FadeFunc ClipFadeValue @B mul @H exch @S exch sethsbcolor +} bind def +/fadeto@transparency { + FadeFunc ClipFadeValue @T mul .setopacityalpha +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{fadefunc@} +% The default fade functions, which are selected with the parameter +% 'fadefuncname'. The clipping is done afterwards. +% \begin{macrocode} +/fadefunc@linear { + neg 1 add +} bind def +/fadefunc@squared { + dup mul neg 1 add +} bind def +/fadefunc@gauss { + 0.4 div dup mul neg Euler exch exp +} bind def +/fadefunc@exp { + -6 mul Euler exch exp +} bind def +% \end{macrocode} +% \end{macro} +% \begin{macro}{FadeStroke} +% Implement the 'fade' linestyle. +% \begin{macrocode} +/FadeStroke { + /FadeFunc ED /FadeToColor ED /@T ED + PathLength dup /@L ED exch div /@dl ED + mark + { false counttomark 3 roll } + { true counttomark 3 roll } + {} {} pathforall + currenthsbcolor /@B ED /@S ED /@H ED + newpath /currL 0 def + counttomark 3 idiv 1 1 3 -1 roll { + pop + { % lineto + /y2 ED /x2 ED x2 x1 sub y2 y1 sub 2 copy + dup mul exch dup mul add sqrt dup @L div exch + @dl div 1 add floor dup dup + 4 2 roll div 5 1 roll + 1 1 3 -1 roll { + 5 copy 4 copy 2 copy eq not { fadecorrect add } if exch div VecScale + 6 2 roll 1 sub dup 0 eq not { fadecorrect sub } if exch div VecScale + x1 y1 VecAdd moveto x1 y1 VecAdd lineto + mul currL add FadeToColor + stroke + } for + 4 1 roll pop pop mul currL add /currL ED + /y1 y2 def /x1 x2 def + } { % moveto + /y1 ED /x1 ED + } ifelse + } for + pop +} def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{TransformPath} +% Transforms a path (as defined by \cs{pssavepath} from +% \nxLPack{pst-intersect}) using the \opt{currentmatrix} and the +% \opt{CompMtrx} of the component. That is used only by \opt{LoadIfc}. +% \begin{pssyntax} +% \PSarray{path} \PSop{TransformPath} \PSarray{path'} +% \end{pssyntax} +% \begin{macrocode} +/TransformPath { + mark [ 3 -1 roll aload pop + counttomark 1 add counttomark 1 add exch 1 roll + { + counttomark 1 eq { cleartomark exit } if + dup /curvetype eq { + 7 1 roll + 3 { CompMtrx transform CM itransform 7 2 roll } repeat + counttomark -1 roll dup counttomark 1 roll + 7 roll + } { + 3 1 roll CompMtrx transform CM itransform 3 -1 roll + counttomark -1 roll dup counttomark 1 roll + 3 roll + } ifelse + } loop + ] +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{DeriveCurve} +% Calculate the derivative of a curve at its parameter \PSvar{t}. This +% works only for the special case of third-order Bezier curves. +% +% \begin{align*} +% B(t) & = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t)t^2 P_2 + t^3 P_3\\ +% B'(t) & = -3(1-t)^2 P_0 + 3(3t^2–4t+1) P_1 + 3(2t–3t^2) P_2 + 3t^2 P_3 +% \end{align*} +% \begin{pssyntax} +% \PSarray{curve} \PSvar{t} \PSop{DeriveCurve} \PSvar{dX dY} +% \end{pssyntax} +% \begin{macrocode} +/DeriveCurve { + (DeriveCurve) DebugBegin + exch dup length 4 eq not { + pop pop 0 0 + } { + aload pop 5 -1 roll + dup 1 exch sub dup mul -3 mul exch % P0 P1 P2 P3 C0=(-3(1-t)^2) t + dup dup -4 mul 1 add exch dup mul 3 mul add 3 mul exch % P0 P1 P2 P3 C0 C1=(3(3t^2-4t+1)) t + dup dup 2 mul exch dup mul -3 mul add 3 mul exch % P0 P1 P2 P3 C0 C1 C2=(3(2t-3t^2)) t + dup mul 3 mul % P0 P1 P2 P3 C0 C1 C2 C3=3t^2 + 8 copy + 0 6 -1 3 { -1 roll 0 get 3 -1 roll mul add } for + 9 1 roll + 0 6 -1 3 { -1 roll 1 get 3 -1 roll mul add } for + } ifelse + DebugEnd +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{GetBezierDeriv} +% Calculate the derivative of the bezier curve at the coordinate +% \PSvar{t}. +% \begin{equation} +% C(t) = \sum_{i=0}^n B_{i,n}(t)P_i\quad\text{with}\quad B_{i,n}(t) = (n over i) t^i(1-t)^{n-i} +% \end{equation} +% \begin{equation} +% C'(t) = \sum_{i=0}^n B'_{i,n}(t)P_i\quad\text{with}\quad B'_{i,n}(t) = (n over i)(i t^{i-1}(1-t)^{n-i} - (n-i)t^i(1-t)^{n-i-1}) +% \end{equation} +% \begin{pssyntax} +% \PSarray{[P0]\ldots[P\_n]} \PSvar{t} \PSop{DeriveBezier} \PSvar{x y} +% \end{pssyntax} +% \begin{macrocode} +/GetBezierDeriv { % t on stack + 10 dict begin % hold all local + /t ED + /t1 1 t sub def % t1=1-t + dup length /BezierOrder exch def + /Points exch def + /Coeff tx@FuncDict begin Pascal end BezierOrder get def % get the coefficients + 0 0 % initial values for x y + BezierOrder -1 0 { % BezierOrder,...,2,1,0 + /I ED % I=BezierOrder,...,2,1,0 + /J BezierOrder I sub def % J=0,1,2,...,BezierOrder + I 0 eq { + 0 + }{ + I t I 1 sub exp mul t1 J exp mul % i*t^{i-1}*(1-t)^{n-i} + } ifelse + J 0 eq { + 0 + } { + J t I exp mul t1 J 1 sub exp mul % -(n-i)t^i(1-t)^{n-i-1} + } ifelse + sub Coeff J get mul + Points I get aload pop 3 -1 roll VecScale VecAdd + } for % x y on stack + end +} bind def +% \end{macrocode} +% \end{macro} +% +% This fixes a problem in pst-intersect.pro v0.4 +% \begin{macrocode} +tx@IntersectDict begin +/IntersectLinePath { + 3 dict begin + PreparePath dup length /n exch def + 2 copy ElongateLine exch 3 -1 roll pop + /isect [] def + /t -1 def + { + /n n 1 sub def + 2 copy IntersectBeziers + dup 5 1 roll LoadIntersectionPoints + dup length 0 gt { + /isect exch def + 0 get dup type /arraytype eq { + aload pop add 0.5 mul + } if n add /t exch def + exch pop + exit + } { + pop pop pop + } ifelse + } forall + t isect + end +} bind def +end +% \end{macrocode} +% +% \begin{macro}{mymax} +% For some reason Adobe Distiller crashes if 'max' operator is used +% with two floats which are very close (4e-5 in one case) +% \begin{macrocode} +/mymax { + 2 copy lt { exch } if pop +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{debug} +% Print out the last \opt{N} elements from the stack, checks for +% stackunderflow. I \opt{N} is negative, the complete stack is +% printed. Compared to the \PSvar{stack} operand, it prints the content of +% procedures and array, which we use a lot. +% \begin{pssyntax} +% \PSvar{N} \PSop{debug} +% \end{pssyntax} +% \begin{macrocode} +/debug { + /@N ED count dup @N gt @N 0 ge and { pop @N } if + copy @N { == } repeat +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{debugComp} +% Print out all parameters and planes of the component \opt{compname}. +% \begin{pssyntax} +% \PSstring{compname} \PSop{debugComp} +% \end{pssyntax} +% \begin{macrocode} +/debugComp { + dup (debug comp ") exch strcat ("===============) strcat == + cvn load { + dup type /dicttype eq { + (plane----------------) == + { == == } forall + (-----------done) == + } { == } ifelse + == + } forall + (================== done) == +} bind def +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +end % tx@OptexpDict +% \end{macrocode} +%</prolog> +% \Finale +% \endinput +% +%<*indexstyle>font-size +headings_flag 1 +heading_prefix "\\textbf{" +heading_suffix "}\n" +quote '"' +level '!' +actual '=' +preamble + "\\begin{theindex}\n" +item_1 + "\\par\\leavevmode\\hangindent10pt\\makebox[25pt][r]{ -- }" +item_01 + "\\par\\leavevmode\\hangindent10pt\\makebox[25pt][r]{ -- }" +item_x1 + "\\par\\leavevmode\\hangindent10pt\\makebox[25pt][r]{ -- }" +item_2 + "\\par\\leavevmode\\hangindent20pt\\makebox[50pt][r]{ -- -- }" +item_12 + "\\par\\leavevmode\\hangindent20pt\\makebox[50pt][r]{ -- -- }" +item_x2 + "\\par\\leavevmode\\hangindent20pt\\makebox[50pt][r]{ -- -- }" +%</indexstyle> diff --git a/graphics/pstricks/contrib/pst-optexp/pst-optexp.ins b/graphics/pstricks/contrib/pst-optexp/pst-optexp.ins new file mode 100644 index 0000000000..ec283f3eff --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/pst-optexp.ins @@ -0,0 +1,101 @@ +%% +%% Copyright (C) 2007-2014 by Christoph Bersch <usenet@bersch.net> +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2008/05/04 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The current maintainer of this work is Christoph Bersch. +%% +%% This work consists of the files pst-optexp.dtx and pst-optexp.ins +%% and the derived files +%% pst-optexp.sty, pst-optexp.pro. +%% +%% Distribution: +%% CTAN:graphics/pstricks/contrib/pst-optexp/README +%% CTAN:graphics/pstricks/contrib/pst-optexp/Changes +%% CTAN:graphics/pstricks/contrib/pst-optexp/pst-optexp.ins +%% CTAN:graphics/pstricks/contrib/pst-optexp/pst-optexp.dtx +%% CTAN:graphics/pstricks/contrib/pst-optexp/pst-optexp.pdf +%% CTAN:graphics/pstricks/contrib/pst-optexp/pst-optexp-DE.pdf +%% CTAN:graphics/pstricks/contrib/pst-optexp/pst-optexp-quickref.pdf +%% +%% Unpacking: +%% tex pst-optexp.ins +%% +%% Documentation: +%% make doc +%% make doc-DE +%% make quickref +%% +%% Installation: +%% TDS:tex/latex/pst-optexp/pst-optexp.sty +%% TDS:dvips/pst-optexp/pst-optexp.pro +%% TDS:doc/latex/pst-optexp/README +%% TDS:doc/latex/pst-optexp/Changes +%% TDS:doc/latex/pst-optexp/pst-optexp.pdf +%% TDS:doc/latex/pst-optexp/pst-optexp-DE.pdf +%% TDS:doc/latex/pst-optexp/pst-optexp-quickref.pdf +%% TDS:source/latex/pst-optexp/pst-optexp.ins +%% TDS:source/latex/pst-optexp/pst-optexp.dtx +%% +\input docstrip.tex +\keepsilent + +\preamble + +This is a generated file. + +Project: pst-optexp +Version: 5.2 (2014/11/26) + +Copyright (C) 2007-2014 by Christoph Bersch <usenet@bersch.net> + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2008/05/04 or later. + +This work has the LPPL maintenance status "maintained". + +The current maintainer of this work is Christoph Bersch. + +This work consists of the files pst-optexp.dtx and pst-optexp.ins +and the derived files + pst-optexp.sty, pst-optexp.pro. + +\endpreamble + +\askforoverwritefalse + +\generate{\file{pst-optexp.sty}{\from{pst-optexp.dtx}{stylefile}} + \file{pst-optexp.ist}{\from{pst-optexp.dtx}{indexstyle}} + \usepostamble\empty% + \file{pst-optexp.pro}{\from{pst-optexp.dtx}{prolog}}} + +\obeyspaces +\Msg{*************************************************************} +\Msg{* *} +\Msg{* To finish the installation you have to move the following *} +\Msg{* file into a directory searched by TeX: *} +\Msg{* *} +\Msg{* pst-optexp.sty *} +\Msg{* pst-optexp.pro *} +\Msg{* *} +\Msg{* To produce the documentation run the file pst-optexp.dtx *} +\Msg{* through LaTeX, preferably using the Makefile. *} +\Msg{* *} +\Msg{* Happy TeXing! *} +\Msg{* *} +\Msg{*************************************************************} + +\endbatchfile diff --git a/graphics/pstricks/contrib/pst-optexp/pst-optexp.pdf b/graphics/pstricks/contrib/pst-optexp/pst-optexp.pdf Binary files differnew file mode 100644 index 0000000000..299355e4eb --- /dev/null +++ b/graphics/pstricks/contrib/pst-optexp/pst-optexp.pdf |