diff options
Diffstat (limited to 'tex/.texmf/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex')
-rw-r--r-- | tex/.texmf/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex | 1678 |
1 files changed, 1678 insertions, 0 deletions
diff --git a/tex/.texmf/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex b/tex/.texmf/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex new file mode 100644 index 0000000..611b12b --- /dev/null +++ b/tex/.texmf/tex/generic/pgfplots/libs/tikzlibrarypgfplots.smithchart.code.tex @@ -0,0 +1,1678 @@ +%-------------------------------------------- +% +% Package pgfplots, library for smith charts. +% +% Copyright 2010 by Christian Feuersänger. +% +% This program is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program. If not, see <http://www.gnu.org/licenses/>. +% +% A smithchart maps the complex halfplane +% H subset \C, +% H := [0,infty] x [-infty,infty] +% =~ \{ z = a+ j *b | a >=0, b \in \R } +% +% to the unit circle. +% +% A number z = a+jb is mapped to r(z) = (z-1) / (z+1) which is, per +% definition, in the 2d unit circle. +% +% Grid lines (i.e. a==const or b==const) are mapped on circles. +% +% In PGFPlots, the a=Re(z) is the x axis and b = Im(z) is the y axis. +% +% - CARTESIAN INPUT +% - tick/grid coordinates are from +% - input coordinates can be either from H or (perhaps preferred) from +% the unit circle. +% this "preferred" needs to be discussed. +% - the transformed data range is the unit circle (or a sequeezed variant) +% - in order to compute limits etc., I should accept data in H. this +% should simplify the logic to determine ticks etc considerably. +% problem: this transformation appears to be quite difficult (?) +% -> r(z) = (z-1)/(z+1) +% in complex arithmetics (but the G-tutorial.pdf says something +% about these circle equations!?) +% +% www.amanogawa.com/archive/docs/G-tutorial.pdf +% +% +% Idea: +% - work on H +% - transform whereever necessary +% - implement all pgfplots wrinkles in analogy to polar axes +% - provide support for normalized input coords (combined with +% untransformed limits or something like that) + +\pgfplotsdefineaxistype{smithchart}{% + \pgfplots@smithchartaxis@activate +}% + +\newif\ifpgfplotspointisinsmithchartCS +\newif\ifpgfplots@smithchart@showorigin +\newif\ifpgfplots@smithchart@mirrored + +\pgfplotsset{ + /pgfplots/xgrid each nth passes y/.initial=,% format: CSV list, each entry of the form '<at> | <at> ':' <eachnth> | <at> 'if <' <xvalue> | <at> ':' <eachnth> 'if <' <xvalue>' + /pgfplots/xgrid each nth passes y start/.initial=0, + /pgfplots/ygrid each nth passes x/.initial=, + /pgfplots/ygrid each nth passes x start/.initial=0, + % + /pgfplots/xgrid stop at y/.initial=,% individual stop map of the form '<xpos> ':' <stopaty>', separated by white space + /pgfplots/ygrid stop at x/.initial=, + % + % FIXME : this is undocumented: + /pgfplots/smithchart mirrored/.is if=pgfplots@smithchart@mirrored, + /pgfplots/smithchart mirrored/.default=true, + % + % this boolean may only be used inside of \addplot. It will be + % ignored otherwise. + /pgfplots/is smithchart cs/.is if=pgfplotspointisinsmithchartCS, + /pgfplots/is smithchart cs/.default=true, + /pgfplots/show origin/.is if=pgfplots@smithchart@showorigin, + /pgfplots/show origin/.default=true, + /pgfplots/show origin code/.code={% + \path[draw=black,fill=white] (0pt,0pt) circle (2.5pt); + \path[fill=black] (0pt,0pt) circle (0.5pt); + }, + /pgfplots/every smithchart axis/.style={ + grid=both, + xmin=0, + xmax=16000,% FIXME : more is not possible because some code uses the \pgfplots@xmin@reg registers... (ticks) + ymin=-16000,ymax=16000, + scaled ticks=false, % never draw the \cdot 10^4 labels + major tick style={draw=black}, + xtick align=center, + ytick align=center, + every axis title shift=1.2\baselineskip, + legend style={anchor=center}, + }, + /pgfplots/default smithchart xtick/.code=, + /pgfplots/default smithchart ytick/.code=, + /pgfplots/default smithchart xytick/.code=, + /pgfplots/smithchart ticks by size/.code 2 args={% + \ifdim#1<14cm + \pgfkeysalso{/pgfplots/few smithchart ticks}% + \else + \ifdim#1<20cm + \pgfkeysalso{/pgfplots/many smithchart ticks}% + \else + \pgfkeysalso{/pgfplots/dense smithchart ticks}% + \fi + \fi + }, + /pgfplots/few smithchart ticks*/.style={ + default smithchart xtick/.style={ + xtick={0.2,0.5,1,2,5}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.2, 0.5, 1, 2, 5,% + -0.2,-0.5,-1,-2,-5}, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={2}, + ygrid each nth passes x={2}, + }, + }, + /pgfplots/few smithchart ticks/.style={/pgfplots/few smithchart ticks*}, + /pgfplots/few smithchart ticks*,% use it as initial config + /pgfplots/many smithchart ticks*/.style={ + default smithchart xtick/.style={ + xtick={ + 0.1,0.2,0.3,0.4,0.5,1,1.5,2,3,4,5,10,20% + }, + minor xtick={0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.1,0.2,...,1,1.5,2,3,4,5,10,20,% + -0.1,-0.2,...,-1,-1.5,-2,-3,-4,-5,-10,-20% + }, + minor ytick={% + 1.1,1.2,1.3,1.4,1.6,1.7,1.8,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,% + -1.1,-1.2,-1.3,-1.4,-1.6,-1.7,-1.8,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50% + }, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={1,2,4,5,10,20}, + ygrid each nth passes x={1,2,3,5,10:3,20:3}, + }, + }, + /pgfplots/many smithchart ticks/.style={ + many smithchart ticks*, + every axis title shift=6pt, + yticklabel in circle, + show origin=true, + }, + /pgfplots/dense smithchart ticks*/.style={ + default smithchart xtick/.style={ + %ygrid each nth passes x start=0, + xtick={ + 0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20% + }, + minor xtick={% + 0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,% + 0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,% + 0.52,% + 0.55,0.65,0.75,0.85,0.95,% + %0.6,0.7,0.8,0.9,% + 1.1,1.3,1.5,1.7,1.9,% + 2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50}, + }, + default smithchart ytick/.style={ + ytick={% + 0,% + 0.1,0.2,...,1,1.2,1.4,1.6,1.8,2,3,4,5,10,20,% + -0.1,-0.2,...,-1,-1.2,-1.4,-1.6,-1.8,-2,-3,-4,-5,-10,-20% + }, + minor ytick={% + 0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,% + 0.22,0.24,0.26,0.28,0.32,0.34,0.36,0.38,0.42,0.44,0.46,0.48,% + 0.55,0.65,0.75,0.85,0.95,% + 1.1,1.3,1.5,1.7,1.9,2.2,2.4,2.6,2.8,3.2,3.4,3.6,3.8,4.5,6,7,8,9,50,% + -0.01,-0.02,-0.03,-0.04,-0.05,-0.06,-0.07,-0.08,-0.09,-0.11,-0.12,-0.13,-0.14,-0.15,-0.16,-0.17,-0.18,-0.19,% + -0.22,-0.24,-0.26,-0.28,-0.32,-0.34,-0.36,-0.38,-0.42,-0.44,-0.46,-0.48,% + -0.55,-0.65,-0.75,-0.85,-0.95,% + -1.1,-1.3,-1.5,-1.7,-1.9,-2.2,-2.4,-2.6,-2.8,-3.2,-3.4,-3.6,-3.8,-4.5,-6,-7,-8,-9,-50% + }, + }, + default smithchart xytick/.style={ + xgrid each nth passes y={0.2 if < 0.2001,0.5 if < 0.50001,1 if < 1.001,2,4,5,10,20}, + ygrid each nth passes x={0.2 if < 0.2001,0.52 if < 0.52001,1 if < 1.001,2,3,5,10:3,20:3}, + }, + }, + /pgfplots/dense smithchart ticks/.style={ + yticklabel in circle, + every axis title shift=6pt, + dense smithchart ticks*, + show origin=true, + every major grid/.style={black!60}, + }, + /pgfplots/yticklabel in circle/.style={ + ytick align=inside, + yticklabel style={ + rotate=90, + sloped like y axis={% + execute for upside down={\tikzset{anchor=north east}}, + %allow upside down, + reset nontranslations=false}, + anchor=south west, + %font=\tiny, + } + }, + yticklabel around circle/.style={ + ytick align=center, + yticklabel style={ + rotate=90, + sloped like y axis={% + execute for upside down={\tikzset{anchor=south west}}, + %allow upside down, + reset nontranslations=false}, + anchor=south east, + %font=\tiny, + } + }, + yticklabel around circle*/.style={ + ytick align=center, + yticklabel style={ + rotate=90, + sloped like y axis={% + execute for upside down={\tikzset{anchor=north west}}, + %allow upside down, + reset nontranslations=false}, + anchor=north east, + %font=\tiny, + } + } +} + +\pgfkeys{ + /pgfplots/warning/smithchart/no such tick/.code 2 args={% + \pgfplotsthrow@warning{There is no #1tick with index '#2'. Skipping it.}% + }, +} + +\def\pgfplots@smithchartaxis@activate{% + \def\axisdefaultwidth{207pt}% + \def\axisdefaultheight{207pt}% + \let\pgfplotsqpointxy@cart=\pgfplotsqpointxy + \let\pgfplotsqpointxy=\pgfplotsqpointxy@smithchartaxis + \let\pgfplotsqpointxy@orthogonal=\pgfplotsqpointxy + \def\pgfplotsqpointxyz##1##2##3{\pgfplotsqpointxy{##1}{##2}}% FIXME + \let\pgfplotspointouternormalvectorofaxis@=\pgfplotspointouternormalvectorofaxis@smithchartaxis + \def\pgfplotspointouternormalvectorofaxis@ifdependson@v##1##2##3{##2}% + \def\pgfplots@drawticklines@INSTALLCLIP@onorientedsurf##1{}% + \let\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf=\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis + \def\pgfplots@visphase@notify@changeofcanvaslimits##1{}% + \def\pgfplots@avoid@empty@axis@range@for##1{}% + \def\pgfplotsaxisifcontainspoint##1##2{##1}% + \let\pgfplots@set@default@size@options=\pgfplots@set@default@size@options@smithchart% + % + \def\b@pgfplots@smithchart@defaultticks@x{0}% + \def\b@pgfplots@smithchart@defaultticks@y{0}% + \let\pgfplots@assign@default@tick@foraxis=\pgfplots@assign@default@tick@foraxis@smithchart + \def\pgfplots@checkisuniformLINEARtick##1##2{% + % don't do anything here. I suppose it is useless and is a + % waste of time for many ticks. + \global\pgfplots@isuniformtickfalse + }% + \let\pgfplots@clippath@prepare@for@axistype=\pgfplots@clippath@prepare@for@axistype@smithchartaxis + % + % invalid range: do not clear plots. simply assign default limits. + \let\pgfplots@handle@invalid@range@defaultlimits=\pgfplots@handle@invalid@range@defaultlimits@smithchart% + \def\pgfplots@handle@invalid@range{\pgfplots@handle@invalid@range@defaultlimits}% + % + \let\pgfplotspointonorientedsurfaceabwithbshift=\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis + \let\pgfplots@draw@axis@is@prepared=\pgfplots@draw@axis@is@prepared@smithchartaxis + \let\pgfplots@drawgridlines@onorientedsurf@fromto=\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart + \let\pgfplots@drawaxis@innerlines@onorientedsurf=\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart + \let\pgfplots@drawaxis@outerlines@separate@onorientedsurf=\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis + \let\pgfplotspoint@initialisation@axes=\pgfplotspoint@initialisation@axes@smithchart% + \let\pgfplotspoint@initialisation@units=\pgfplotspoint@initialisation@units@smithchart + \expandafter\def\expandafter\pgfplots@create@axis@descriptions@\expandafter{% + \pgfplots@create@axis@descriptions@ + \ifpgfplots@smithchart@showorigin + \pgfkeysvalueof{/pgfplots/show origin code/.@cmd}\pgfeov% + \fi + }% + \def\axisdefaultheight{\axisdefaultwidth}% + \let\pgfplots@BB@for@plotbox@get@unit@scales@for@limits=\pgfplots@BB@for@plotbox@get@unit@scales@for@limits@smithchart + %\let\pgfplots@limits@ready=\pgfplots@limits@ready@smithchart + %\let\pgfplots@show@ticklabel@=\pgfplots@show@ticklabel@@smithchart + %\def\pgfplots@xtick@disable@last@tick{0}% + \let\pgfplots@xtick@check@tickshow=\pgfplots@xtick@check@tickshow@smithchart% + \let\pgfplots@ytick@check@tickshow=\pgfplots@ytick@check@tickshow@smithchart% + \let\pgfplots@set@options@sanitize=\relax + \let\pgfplots@set@options@sanitizemode=\relax + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart + % + \expandafter\def\expandafter\pgfplots@notify@options@are@set\expandafter{% + \pgfplots@notify@options@are@set + \pgfplotsset{% + separate axis lines,% + is smithchart cs=false,% + xtick pos=left, + ytick pos=left, + axis x line*=center, + disabledatascaling, + }% + \def\pgfplots@xtickposnum{2}% + % + \ifx\pgfplots@xtick\pgfutil@empty + \def\b@pgfplots@smithchart@defaultticks@x{1}% + \fi + \ifx\pgfplots@ytick\pgfutil@empty + \def\b@pgfplots@smithchart@defaultticks@y{1}% + \fi + \pgfplotscoordmath{default}{parsenumber}{0.002}% + \let\pgfplots@almost@zero@thresh=\pgfmathresult + }% + \def\pgfplots@xticklabel@pos{}% + \def\pgfplots@yticklabel@pos{}% + \def\pgfplots@zticklabel@pos{}% + \def\pgfplots@init@ticklabelaxisspecfor##1##2{}% + \def\pgfplots@init@ticklabelaxisspec@twodim@for##1##2{}% + \def\pgfplotspointonorientedsurfaceabmatchaxisline@warn##1{}% clear warning. It works for smith charts. + \def\pgfplots@xticklabelaxisspec{v20}% + \def\pgfplots@yticklabelaxisspec{0v0}% + \def\pgfplots@zticklabelaxisspec{00v}% + % + % cartesian cs + \tikzdeclarecoordinatesystem{cartesian}{\edef\pgfplots@loc@TMPa{##1}\expandafter\pgfplotspointcartesian@\pgfplots@loc@TMPa\pgfplots@coord@end}% + % + % + % Special treatment for + % \pgfplots@prepare@tick@coordlists@for: make sure we don't need + % to use the register arithmetics in \pgfplots@xmin@reg and its + % variants! I want an UNRESTRICTED max data range! + \def\pgfplots@prepare@tick@coordlists@for@assign##1=##2{\edef##1{##2}}% + \def\pgfplots@prepare@tick@coordlists@for@advance##1by##2{% + % THIS IS NEVER USED (at the time of this writing). + \edef\pgfplots@loc@TMPa{##2}% + \pgfplotscoordmath{default}{parsenumber}{##1}% + \pgfplotscoordmath{default}{op}{add}{{\pgfmathresult}{\pgfplots@loc@TMPa}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let##1=\pgfmathresult + }% + \def\pgfplots@prepare@tick@coordlists@for@tofixed##1{\edef\pgfmathresult{##1}}% + \def\pgfplots@prepare@tick@coordlists@for@handletolerance##1{}% does not apply to smithcharts. + \def\pgfplots@prepare@tick@coordlists@for@checktickmin##1{% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}% + \let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPa}{\pgfplots@loc@TMPb}{% + \pgfplots@tickshowfalse + }{% + }% + }% + \def\pgfplots@prepare@tick@coordlists@for@checktickmax##1{% + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tmpa}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{\csname pgfplots@##1tickmin\endcsname}% + \let\pgfplots@loc@TMPb=\pgfmathresult + \pgfplotscoordmath{default}{if less than}{\pgfplots@loc@TMPb}{\pgfplots@loc@TMPa}{% + \pgfplots@tickshowfalse + }{% + }% + }% + \def\pgfplots@prepare@tick@coordlists@for@checkdatalimits##1{}% I won't do this here. Smithcharts are somewhat special. +}% + +\def\pgfplotspointcartesian@#1,#2\pgfplots@coord@end{% + \pgfpointxy@orig{#1}{#2}% +}% +\def\pgfplotscoordmathnotifydatascalesetfor@smithchart#1{% + \def\pgfplotscoordmathnotifydatascalesetfor##1{}% + \edef\pgfplotscoordmathnotifydatascalesetfor@{#1}% + \def\pgfplotscoordmathnotifydatascalesetfor@@{x}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set params}{0}{0}% + \else + \def\pgfplotscoordmathnotifydatascalesetfor@@{y}% + \ifx\pgfplotscoordmathnotifydatascalesetfor@@\pgfplotscoordmathnotifydatascalesetfor@ + \pgfplotscoordmath{#1}{datascaletrafo set shift}{0}% + \fi + \fi + \let\pgfplotscoordmathnotifydatascalesetfor=\pgfplotscoordmathnotifydatascalesetfor@smithchart +}% + +% #1: the "a" value on the oriented surf +% #2: the "b" value. +% #3: the shift along the normal. +% +\def\pgfplotspointonorientedsurfaceabwithbshift@smithchartaxis#1#2#3{% + % implement the shift in "b" direction explicitly: + \pgfpointadd + {\pgfplotspointonorientedsurfaceab{#1}{#2}}% + {% + \pgfplotspointonorientedsurfaceabtolinespec{v}{0}% + \afterassignment\pgfplots@gobble@until@relax + \pgf@xa=-#3\relax + \edef\pgfplots@shift@no@unit{\pgf@sys@tonumber\pgf@xa}% + \pgfqpointscale + {\pgfplots@shift@no@unit} + {\expandafter\pgfplotspointouternormalvectorofaxis\expandafter{\pgfplotsretval}}% + }% +} + + +% Computes the complex division +% (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2) +% and assigns the result to \pgfmathresult and \pgfmathresultim . Here +% 'j = sqrt{-1}' is the imaginary unit. +% +% #1 : A +% #2 : B +% #3 : C +% #4 : D +% +% The arithmetics is performed in \pgfplotscoordmath{default} (which +% uses the floating point unit in the initial configuration) +% +% Numbers are expected to be already parsed (i.e. you need to invoke +% \pgfplotscoordmath{default}{parsenumber}{#1}% +% \let\A=\pgfmathresult +% before) +\def\pgfplotscoordmathcomplexdivision#1#2#3#4{% + \begingroup + \edef\pgfplots@A{#1}% + \edef\pgfplots@B{#2}% + \edef\pgfplots@C{#3}% + \edef\pgfplots@D{#4}% + % + % + % ok, compute it: + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@C}}% + \let\pgfplots@AC=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@A}{\pgfplots@D}}% + \let\pgfplots@AD=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@D}}% + \let\pgfplots@BD=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@B}{\pgfplots@C}}% + \let\pgfplots@BC=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@C}{\pgfplots@C}}% + \let\pgfplots@CC=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfplots@D}{\pgfplots@D}}% + \let\pgfplots@DD=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@CC}{\pgfplots@DD}}% + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}% + \let\pgfplots@scale=\pgfmathresult + % + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@AC}{\pgfplots@BD}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@BC}{\pgfplots@AD}}% + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@scale}}% + \let\pgfplots@y=\pgfmathresult + % + \xdef\pgfplots@glob@TMPa{% + \noexpand\def\noexpand\pgfmathresult{\pgfplots@x}% + \noexpand\def\noexpand\pgfmathresultim{\pgfplots@y}% + }% + \endgroup + \pgfplots@glob@TMPa +}% + +\def\pgfplotsqpointxy@smithchartaxis#1#2{% + \pgf@process{% + \ifpgfplotspointisinsmithchartCS + \def\pgfplots@x{#1}% + \def\pgfplots@y{#2}% + \else + % compute rx + j* ry = (#1 + j * #2 -1) / (#1 + j*#2 + 1) + % + % I write + % #1 - 1 + j * #2 = A + j * B + % 1 + #1 + j * #2 = C + j * D + % + % -> rx + j * ry = (A + j B) / (C + j D) = (A C + B D + j (B C - A D) ) / (C^2 + D^2) + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{parsenumber}{#2}% + \let\pgfplots@D=\pgfmathresult + % + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@one}{\pgfplots@x}}% + \let\pgfplots@C=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{subtract}{{\pgfplots@x}{\pgfplots@one}}% + \let\pgfplots@A=\pgfmathresult + % + \let\pgfplots@B=\pgfplots@D + % + \pgfplotscoordmathcomplexdivision\pgfplots@A\pgfplots@B\pgfplots@C\pgfplots@D + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@x=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfmathresultim}% + \let\pgfplots@y=\pgfmathresult + \fi + % + \pgfplotsqpointxy@smithchart@canvas\pgfplots@x\pgfplots@y +%\message{pgfplotsqpointxy{#1}{#2} ---> (\pgfplots@x,\pgfplots@y) ---> (\the\pgf@x,\the\pgf@y)}% + }% +}% + +\def\pgfplotsqpointxy@smithchart@canvas#1#2{% + \ifpgfplots@smithchart@mirrored + \pgfqpointxy@orig{-#1}{#2}% + \else + \pgfqpointxy@orig{#1}{#2}% + \fi +}% + +\def\pgfplots@clippath@prepare@for@axistype@smithchartaxis{% + \def\pgfplots@clippath@install##1{% + \pgfpathellipse + {\pgfplotsqpointxy@smithchart@canvas{0}{0}} + {\pgfplotsqpointxy@smithchart@canvas{1}{0}} + {\pgfplotsqpointxy@smithchart@canvas{0}{1}}% + \pgfplots@clippath@use@{##1}% + }% +}% + +\def\pgfplotspointouternormalvectorofaxis@smithchartaxis#1#2#3\relax{% + \if v#1% + \pgfqpoint{0pt}{1pt}% + \else + \if v#2% + \pgfplotspointouternormalvectorofaxisgetv{#1#2#3}% + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + \pgfpointdiff + {\pgfplotsqpointxy@smithchart@canvas{0}{0}}% + {\pgfplotsqpointxy{0}{\pgfplotsretval}}% + \pgfpointnormalised{}% + \else + \pgfqpoint{0pt}{1pt}% + \fi + \fi + \pgf@process{}% + \endgroup +}% + +\def\pgfplotspoint@initialisation@axes@smithchart{% + \begingroup + %\pgfplotsqpointxy{\pgfplots@xmin}{\pgfplots@ymin}% + \gdef\pgfplotspointminminmin{\pgfplotsqpointxy@smithchart@canvas{0}{0}}% + % + % the "x" axis is the diameter of the circle (for fixed y=0) + \pgf@x=2\pgf@xx + \pgf@y=0pt + \xdef\pgfplotspointxaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + \pgfmathveclen{\pgf@x}{\pgf@y}% + \xdef\pgfplotspointxaxislength{\pgfmathresult pt}% + % + \pgfplotsqpointxy{\pgfplots@xmax}{\pgfplots@ymax}% + \xdef\pgfplotspointyaxis{\noexpand\pgf@x=\the\pgf@x\space\noexpand\pgf@y=\the\pgf@y\space}% + % + % the length of the "y" axis is 2*pi*r (for fixed x=0, the outer + % circle). + % The radius is the length of (0,1) which is (0pt,\pgf@xx1): + \pgfmath@basic@multiply@{\pgf@sys@tonumber\pgf@xx}{1}% + \pgfmathmultiply@{\pgfmathresult}{6.28318530717959}% 2*pi * r + \xdef\pgfplotspointyaxislength{\pgfmathresult pt}% + % + \global\let\pgfplotspointzaxis=\pgfpointorigin + \gdef\pgfplotspointzaxislength{0pt}% + \endgroup + % + \edef\pgfplots@loc@TMPa{\pgf@sys@tonumber\pgf@xx}% + \pgfmathdivide@{16000}{\pgfplots@loc@TMPa}% + \let\pgfplots@smithchart@axis@max@xradius@for@ycircle=\pgfmathresult + % + \ifdim\pgf@xx=\pgf@yy + \def\pgfplots@smithchart@axis@ratioxy{1}% + \def\pgfplots@smithchart@axis@ratioyx{1}% + \let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfplots@smithchart@axis@max@xradius@for@ycircle + \else + \edef\pgfplots@loc@TMPb{\pgf@sys@tonumber\pgf@yy}% + \pgfmathdivide@\pgfplots@loc@TMPa\pgfplots@loc@TMPb + \let\pgfplots@smithchart@axis@ratioxy=\pgfmathresult + \pgfmathdivide@\pgfplots@loc@TMPb\pgfplots@loc@TMPa + \let\pgfplots@smithchart@axis@ratioyx=\pgfmathresult + % + \pgfmathdivide@{16000}{\pgfplots@loc@TMPb}% + \let\pgfplots@smithchart@axis@max@yradius@for@ycircle=\pgfmathresult + \fi +} +\let\pgfplotspoint@initialisation@units@orig=\pgfplotspoint@initialisation@units +\def\pgfplotspoint@initialisation@units@smithchart{% + \pgfplotspoint@initialisation@units@orig + \def\pgfplotspointunity{% + \pgfplotspointouternormalvectorofaxisgetv{0v0}% x=0 (outer circle) and v varies (the yticks) + \ifx\pgfplotsretval\pgfutil@empty + \def\pgfplotsretval{0}% + \fi + \pgfpointnormalised{\pgfplotsqpointxy{0}{\ifx\pgfplotsretval\pgfutil@empty 0\else\pgfplotsretval\fi}}% + \pgf@xa=-\pgf@y + \global\pgf@y=\pgf@x + \global\pgf@x=\pgf@xa + }% + \def\pgfplotsunitylength{1}% + \def\pgfplotsunityinvlength{1}% +}% + +\def\pgfplots@drawgridlines@INSTALLCLIP@onorientedsurf@smithchartaxis#1{% + %\pgfplots@clippath@install{\pgfusepath{clip}}% +}% + +% At this time, the minor/major tick lists are initialised. +\def\pgfplots@draw@axis@is@prepared@smithchartaxis{% + \pgfplots@gridlines@init@grid@stop@points@for xy% + \pgfplots@gridlines@init@grid@stop@points@for yx% + % + % and finalize x: + \def\pgfplots@finalize@constraints{1}% + \pgfplots@gridlines@init@grid@stop@points@for@computethem{x}{y}{\pgfplots@finalize@constraints}% +}% + + +% Initialises the '#1grid each nth passes #2' and '#1grid stop at #2' +% features. All it does is to prepare the +% method \pgfplots@get@current@grid@stop@point. +% +% The method is quite involved. Please refer to the manual for what it +% is supposed to do, and refer to the code comments below for +% implementational details. +% +% #1 either x or y +% #2 either x or y +\def\pgfplots@gridlines@init@grid@stop@points@for#1#2{% + % + \expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\relax + % + \pgfkeysgetvalue{/pgfplots/#1grid each nth passes #2}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + % we have no "xticknum -> xtickpos" lookup table yet. + \expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{0}% + % + \pgfplotslistnewempty\pgfplots@loc@TMPd + % normalise the argument for 'ygrid each nth passes x': each list element + % should be of the form '<xtickpos>:<n>' where <n> means that each + % <n>th arc can pass. + \expandafter\pgfplotsutilforeachcommasep\pgfplots@loc@TMPa\as\entry{% + \expandafter\pgfplots@gridlines@init@grid@stop@points@for@normalise\entry\relax#1#2% + \expandafter\pgfplotslistpushback\entry\to\pgfplots@loc@TMPd + }% + \expandafter\let\csname pgfplots@#1grid@stop@points\endcsname=\pgfplots@loc@TMPd + % + % Ok. + % + % Now, the 'ygrid each nth passes x' feature relies *crucially* on grid line + % indices (for the 'each nth' feature). + % + % I sort the arcs according to their absolute magnitude and assign + % indices into the resulting arrays to normalize that stuff. + % + % The array is of the form + % A[i] = entry of \pgfplots@prepared@tick@positions@* + % and contains *both*, major and minor grid lines. + \pgfplotsarraynewempty\pgfplots@gridlines + \pgfplotscoordmath{default}{zero}% + \edef\elem{{-1}{\pgfmathresult}}% require 0 to be zero for symmetry even if there is no such tick pos + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + \pgfplots@if{pgfplots@#1majorgrids}{% + % insert all major tick positions, using their absolute value. + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}% + \pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}% + \edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}% + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + }% + }{}% + \pgfplots@if{pgfplots@#1minorgrids}{% + % now the same for minor grid positions: + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}% + \pgfplotscoordmath{default}{op}{abs}{{\pgfmathresult}}% + \edef\elem{{\pgfplots@ticknum}{\pgfmathresult}}% + \expandafter\pgfplotsarraypushback\elem\to\pgfplots@gridlines + }% + }{}% + % sort the array! + \pgfkeysgetvalue{/pgfplots/smithchart@sortlt/.@cmd}\pgfplots@loc@TMPa + \pgfkeyslet{/pgfplots/iflessthan/.@cmd}\pgfplots@loc@TMPa + \pgfplotsarraysort\pgfplots@gridlines + % + % ok. Now it is sorted. + % + % I finally need a lookup + % \pgfplots@ticknum --> sort index. + % If the associated values have the same absolute value, the same + % sort index should be assigned. + % + % For example, the array might be associated to the following tick + % positions, sorted by absolute value: + % 0.0, 1.0, -1.0, 3.0, -3.0, 4.0, -4.0, 5.0, -5.0 + % What I want is that + % 0.0 gets sort index 0 + % 1.0 and -1.0 get sort index 1 + % 3.0 and -3.0 get sort index 2 + % 4.0 and -4.0 get sort index 3 + % and so on. The array contains only absolute values, so that's + % not too difficult to check. + % + % Since each of the tick positions can be (uniquely) identified by + % its associated \pgfplots@ticknum value, I map \pgfplots@ticknum + % to the sort index. + \countdef\c@sortindex=\c@pgf@counta + \c@sortindex=\pgfkeysvalueof{/pgfplots/#1grid each nth passes #2 start} % this is assigned to the '0.0' gridline (if any) + \def\pgfplots@lasttickpos{}% + \pgfplotsarrayforeachungrouped\pgfplots@gridlines\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \ifx\pgfplots@lasttickpos\pgfutil@empty + \else + \ifx\pgfplots@lasttickpos\pgfplots@tick + \else + \advance\c@sortindex by1 + \fi + \fi + \expandafter\edef\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname{\the\c@sortindex}% +%\message{\pgfplots@ticknum\space(abs(tickpos) = \pgfplots@tick)---> sort index \csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname^^J}% + \let\pgfplots@lasttickpos=\pgfplots@tick + }% + % + % unfortunately, I can't free the \pgfplots@gridlines array + % without extensive overhead :-( + \fi + % + \expandafter\let\csname b@pgfplots@#1gridline@stopmap\endcsname\relax + \pgfkeysgetvalue{/pgfplots/#1grid stop at #2}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \edef\pgfplots@loc@TMPa{\pgfplots@loc@TMPa,}% this inserts the final comma and handles any active ':' sign (for french babel) + \def\pgfplots@loc@TMPb{\pgfplots@gridlines@init@stop@maps #1#2}% + \expandafter\pgfplots@loc@TMPb\pgfplots@loc@TMPa\pgfplots@EOI% + \fi + % + % + % Now, compute all final stop positions. Also prepare the cross + % dependencies between x grids and y grids here (such that there + % is no grid line stopping in white space) + % + \if#1x% + \def\pgfplots@finalize@constraints{0}% we have to wait until y stop points are known. + \else + \def\pgfplots@finalize@constraints{1}% + \fi + \pgfplots@gridlines@init@grid@stop@points@for@computethem{#1}{#2}{\pgfplots@finalize@constraints}% +}% +% #1,#2,#3 the arguments for +% \pgfplots@gridlines@preparation@get@current@grid@stop@point +\def\pgfplots@gridlines@init@grid@stop@points@for@computethem#1#2#3{% + % + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult + \pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}% + \if1#3% + \pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval + \fi + }% + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#1\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@tick}\let\pgfplots@tick=\pgfmathresult + \pgfplots@gridlines@preparation@get@current@grid@stop@point{#1}{#2}{\pgfplots@tick}{#3}% + \if1#3% + \pgfplots@gridlines@let{#1}{\pgfplots@tick@prepared}=\pgfplotsretval + \fi + }% + \expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}% +} + +\def\pgfplots@gridlines@init@stop@maps#1#2{% + \pgfutil@ifnextchar\pgfplots@EOI{% + \pgfutil@gobble + }{% + \pgfutil@ifnextchar,{% + \pgfplots@gridlines@init@stop@maps@next@@#1#2% + }{% + \pgfplots@gridlines@init@stop@maps@next#1#2% + }% + }% +}% +\def\pgfplots@gridlines@init@stop@maps@next#1#2#3:#4,{% + \pgfplotscoordmath{default}{parsenumber}{#4}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfplots@gridlines@stopmap@prepare{#3}% + \pgfplots@gridlines@let{#1}{\pgfmathresult}=\pgfplots@loc@TMPa + \expandafter\def\csname b@pgfplots@#1gridline@stopmap\endcsname{1}% + % + \pgfplots@gridlines@init@stop@maps #1#2% +} +% just eat one empty comma: +\def\pgfplots@gridlines@init@stop@maps@next@@#1#2,{\pgfplots@gridlines@init@stop@maps #1#2}% +\def\pgfplots@gridlines@let#1#2=#3{% + \expandafter\let\csname pgfplots@#1gridline@stopmap@#2\endcsname=#3% + \if#1y% + % support symmetry: + % add -\pgfmathresult to the map. + % To disable this symmetry, use 'ygrid stop at x={0.2:4 -0.2:5} + % you can also use an empty value '-0.2:{}', that's also ok. + \expandafter\let\csname pgfplots@#1gridline@stopmap@-#2\endcsname=#3% + \fi +}% + +\def\pgfplots@gridlines@stopmap@prepare@digits{2}% +\def\pgfplots@gridlines@stopmap@prepare#1{% + \begingroup + \pgfmathfloatparsenumber{#1}% + \let\pgfmathfloat@round@precision=\pgfplots@gridlines@stopmap@prepare@digits% + \pgfmathfloatroundzerofill\pgfmathresult + \pgfmath@smuggleone\pgfmathresult + \endgroup +}% +\def\pgfplots@gridlines@stopmap@trunc@#1.#2#3#4\relax{% + \def\pgfmathresult{#1.#2#3}% +}% + +\pgfkeysdefargs{/pgfplots/smithchart@sortlt}{#1#2#3#4}{% + \expandafter\pgfplots@prepared@tick@pos@unpack#1% + \let\pgfplots@A=\pgfplots@tick + \expandafter\pgfplots@prepared@tick@pos@unpack#2% + \let\pgfplots@B=\pgfplots@tick + \pgfplotscoordmath{default}{if less than}{\pgfplots@A}{\pgfplots@B}{#3}{#4}% +}% + +% initialise a lookuptable from ticknumber -> tick position (sort +% of an array) +% +% This is only invoked if it is needed (if 'arc +% limits={[index]4,[index]2}' or something like that is used, see the +% manual). +% +% #1 either x or y +% #2 either x or y +\def\pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#1#2{% + \c@pgf@counta=0 + \pgfplots@if{pgfplots@#1majorgrids}{% + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@major@#2\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick + \advance\c@pgf@counta by1 + }% + }{}% + \pgfplots@if{pgfplots@#1minorgrids}{% + \expandafter + \pgfplotslistforeachungrouped\csname pgfplots@prepared@tick@positions@minor@#2\endcsname\as\elem{% + \expandafter\pgfplots@prepared@tick@pos@unpack\elem + \expandafter\let\csname pgfplots@#2tick@num@to@pos@\the\c@pgf@counta\endcsname=\pgfplots@tick + \advance\c@pgf@counta by1 + }% + }{}% + \expandafter\def\csname b@pgfplots@#2ticknum@to@pos@lookup\endcsname{1}% +}% +\def\pgfplots@gridlines@init@grid@stop@points@for@normalise#1\relax#2#3{% + \def\b@pgfplots@haslt{0}% + % + \pgfutil@in@{if <}{#1}% + \ifpgfutil@in@ + % strip the white space between 'if' and '<': + \def\pgfplots@loc@TMPa##1if <##2\relax{\edef\entry{##1if<##2}}% + \expandafter\pgfplots@loc@TMPa\entry\relax + \def\b@pgfplots@haslt{1}% + \fi + % + \pgfutil@in@{if<}{#1}% + \ifpgfutil@in@ + \def\b@pgfplots@haslt{1}% + \fi + % + \pgfutil@in@:{#1}% + \ifpgfutil@in@ + \def\b@pgfplots@hascolon{1}% + \else + \def\b@pgfplots@hascolon{0}% + \fi + % + \if1\b@pgfplots@hascolon + \edef\entry{\entry\if0\b@pgfplots@haslt if<\fi}% + \else + \if1\b@pgfplots@haslt + \expandafter\pgfplots@gridlines@stop@at@unpack@@@\entry\relax + \edef\entry{\pgfplots@grid@stop@at:2if<\pgfplots@grid@stop@at@iflt}% + \else + \edef\entry{\entry:2if<}% + \fi% + \fi% + % + \pgfutil@in@{[index]}{#1}% + \ifpgfutil@in@ + \if0\csname b@pgfplots@#3ticknum@to@pos@lookup\endcsname + \pgfplots@gridlines@init@grid@stop@points@for@init@ticknum@lookup#2#3% + \fi + \expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax + \pgfutil@ifundefined{pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at}{% + \pgfplotswarning{smithchart/no such tick}{#3}{\pgfplots@grid@stop@at}\pgfeov + \let\entry=\pgfutil@empty + }{% + \edef\entry{\csname pgfplots@#3tick@num@to@pos@\pgfplots@grid@stop@at\endcsname:\pgfplots@grid@stop@at@eachnth}% + }% + \fi + % + \expandafter\pgfplots@gridlines@stop@at@unpack\entry\relax + \pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at + \let\pgfplots@grid@stop@at=\pgfmathresult + \ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty + \else + \pgfplotscoordmath{default}{parsenumber}\pgfplots@grid@stop@at@iflt + \let\pgfplots@grid@stop@at@iflt=\pgfmathresult + \fi + \edef\entry{\pgfplots@grid@stop@at:\pgfplots@grid@stop@at@eachnth if<\pgfplots@grid@stop@at@iflt}% +}% +\def\pgfplots@gridlines@stop@at@unpack@@@#1if<#2\relax{% + \def\pgfplots@grid@stop@at{#1}% + \def\pgfplots@grid@stop@at@iflt{#2}% +}% +\def\pgfplots@gridlines@stop@at@unpack#1:#2if<#3\relax{% + \def\pgfplots@grid@stop@at{#1}% + \def\pgfplots@grid@stop@at@eachnth{#2}% + \def\pgfplots@grid@stop@at@iflt{#3}% +}% + +% Returns the xtick position which should end the current arc. +% +% This is an INTERNAL preparation method. See +% \pgfplots@get@current@grid@stop@point for the final one. +% +% Note that arcs correspond to ygrid lines. +% +% #1 either x or y +% #2 either x or y +% #3 the value of the current grid line +% #4 a boolean which expands either to 0 or to 1. +% The \pgfplots@get@current@grid@stop@point@handle@constraints method +% will be invoked if and only if #4=1 +% +% @POSTCONDITION On output, +% - \pgfplotsretval will be filled with the +% result. If the result is empty, no restriction is imposed. +% Otherwise, it contains the #2tick value at which the current #1grid shall end. +% The result is already processed with +% \pgfplotscoordmath{default}{parsenumber}{<value>} +% - \pgfplots@tick@prepared contains a rounded representation of #3. +% +% The method relies on the 'ygrid each nth passes x' feature, more specifically the +% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for +\def\pgfplots@gridlines@preparation@get@current@grid@stop@point#1#2#3#4{% + \def\pgfplotsretval{}% + % + \pgfplots@gridlines@stopmap@prepare{#3}% + \let\pgfplots@tick@prepared=\pgfmathresult + \pgfmathfloatabs@\pgfplots@tick@prepared + \let\pgfplots@tick@prepared@abs=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{abs}{{#3}}% + \let\pgfplots@tick@abs=\pgfmathresult + % + % first: check the '#1grid stop at #2': + \expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax% + % ok. there is no such thing. + \else + % ah - process it! + \pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{% + }{% + \edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}% + }% + \fi + % + \ifx\pgfplotsretval\pgfutil@empty + % the individual map failed. Ok, then check for the '#1grid each nth passes #2' + \expandafter\ifx\csname pgfplots@#1grid@stop@points\endcsname\relax + \else + % \pgfplots@ticknum is defined in this context here. + \pgfutil@ifundefined{pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum}{% + \pgfplots@warning{Sorry, I can't get the current arc limit for #1grid no \#\pgfplots@ticknum\space(value \pgfplots@tick). This seems like an internal error!?}% + }{% + % get the sort index for the current tick (which is + % uniquely identified by its \pgfplots@ticknum) + \expandafter\let\expandafter\pgfplots@k\csname pgfplots@#1tickpos@to@sortidx@\pgfplots@ticknum\endcsname + % + \expandafter\pgfplotslistforeachungrouped\csname pgfplots@#1grid@stop@points\endcsname\as\pgfplots@loc@TMPa{% + \ifx\pgfplotsretval\pgfutil@empty + % we found no final limit so far. proceed. + \expandafter\pgfplots@gridlines@stop@at@unpack\pgfplots@loc@TMPa\relax + \ifx\pgfplots@grid@stop@at@iflt\pgfutil@empty + \pgfplots@loop@CONTINUEtrue + \else + \pgfplotscoordmath{default}{if less than}{\pgfplots@tick@abs}{\pgfplots@grid@stop@at@iflt}{% + \pgfplots@loop@CONTINUEtrue + }{% + \pgfplots@loop@CONTINUEfalse + }% + \fi + % + \ifpgfplots@loop@CONTINUE + \pgfplotsmathmodint\pgfplots@k\pgfplots@grid@stop@at@eachnth + \ifnum\pgfmathresult=0 + \c@pgf@counta=\pgfplots@k + \divide\c@pgf@counta by\pgfplots@grid@stop@at@eachnth\relax + \edef\pgfplots@k{\the\c@pgf@counta}% + \else + % found the final limit. + % + % Now, check the constraints which couple + % X and Y. + \let\pgfplotsretval=\pgfplots@grid@stop@at + \if1#4% + \pgfplots@get@current@grid@stop@point@handle@constraints #1#2{#3}% + \fi + \fi + \fi + \fi + }% + }% + \fi + \fi + \ifx\pgfplotsretval\pgfutil@empty + \else + \expandafter\let\csname pgfplots@final@stop@point@for@#1tick@\pgfplots@tick@prepared\endcsname=\pgfplotsretval +%\message{#1 grid line: storing end value for '#3' END[\pgfplots@tick@prepared] = \pgfplotsretval.^^J}% + \fi +}% + +% PRECONDITION +% \pgfplotsretval contains a non-zero constraint for the ygrid at #1. +% +% POSTCONDITION +% either \pgfplotsretval is unchanged, or it is reset to +% \pgfutil@empty if constraints are violated. +% +% The constraints are ONLY effective if BOTH, incomplete x- and y grid +% lines are in effect. In that case, it should never happen that a +% single grid line ends in a dead-end somewhere in white space. +% +% I enforce two constraints which apply only to ygrid to fix this +% issue (this may be improved later). +% +% The idea is simple: +% 1. suppose the grid line 'x=1' stops at 'y=5'. +% Suppose further that the y grid line 'y=0.95' should stop at 'x=1'. +% Is that acceptable? Yes, because |y| < 5. +% Now, suppose an y grid line with |y| > 5 should stop at 'x=1'. +% Is this allowed? NO! Because it would become a dead end since +% the 'x=1' line ends at 'y=5'! +% +% So, whenever we consider ygrids and stop point candidates "x=X", +% acquire the value Q where the x (!) grid line "x=X" stops. +% If |y| > Q, the candidate "x=X" is rejected. +% +% 2. There might still be the case that x grid lines have dead-ends. +% The current solution applies the idea first to all y grid lines, +% and once the y grid lines are ready, it applies the same idea to +% x grid lines. +% +% Uncomment the routine(s) and run the test cases to see what happens. +\def\pgfplots@get@current@grid@stop@point@handle@constraints#1#2#3{% + \ifx\pgfplotsretval\pgfutil@empty + \else + \pgfplots@gridlines@stopmap@prepare{\pgfplotsretval}% + \let\pgfplots@loc@TMPa=\pgfmathresult + % +%\message{checking ending '#1=#3' at '#2=\pgfplotsretval'. '#2=\pgfplots@loc@TMPa' stops}% + \pgfutil@ifundefined{pgfplots@final@stop@point@for@#2tick@\pgfplots@loc@TMPa}{% + % no constraint. Ok. +%\message{ nowhere. No constraint.^^J}% + }{% +%\message{ at \pgfplots@loc@TMPa. Feasible: }% + % Oh, a constraint. That means + % further work. + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@final@stop@point@for@#2tick@\pgfmathresult\endcsname + \pgfplotscoordmath{default}{op}{abs}{{#3}}% + \pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@loc@TMPa}{% + % ok, we can use the found + % stop value. +%\message{YES.^^J}% + }{% +%\message{NO.^^J}% + % no, the stop value is + % invalid; it would stop in + % white space! + \let\pgfplotsretval=\pgfutil@empty + }% + }% + \fi +}% + +% Returns the xtick position which should end the current arc. +% +% Note that arcs correspond to ygrid lines. +% +% #1 either x or y +% #2 either x or y +% #3 the value of the current grid line +% +% @POSTCONDITION On output, \pgfplotsretval will be filled with the +% result. If the result is empty, no restriction is imposed. +% Otherwise, it contains the #2tick value at which the current #1grid shall end. +% The result is already processed with +% \pgfplotscoordmath{default}{parsenumber}{<value>} +% +% The method relies on the 'ygrid each nth passes x' feature, more specifically the +% stuff prepared by \pgfplots@gridlines@init@grid@stop@points@for +% +% Note that all work has already been done by +% \pgfplots@gridlines@init@grid@stop@points@for. We only need to query +% the result at this point. +% @see \pgfplots@gridlines@init@grid@stop@points@for +% @see \pgfplots@gridlines@preparation@get@current@grid@stop@point +\def\pgfplots@get@current@grid@stop@point#1#2#3{% + \def\pgfplotsretval{}% + % + % check the '#1grid stop at #2': + \expandafter\ifx\csname b@pgfplots@#1gridline@stopmap\endcsname\relax% + % ok. there is no such thing. + \else + % + \pgfplots@gridlines@stopmap@prepare{#3}% + \let\pgfplots@tick@prepared=\pgfmathresult + \pgfmathfloatabs@\pgfplots@tick@prepared + \let\pgfplots@tick@prepared@abs=\pgfmathresult + % + % ah - process it! + \pgfutil@ifundefined{pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared}{% + \let\pgfplotsretval\pgfutil@empty + }{% + \edef\pgfplotsretval{\csname pgfplots@#1gridline@stopmap@\pgfplots@tick@prepared\endcsname}% + }% + \fi + % +}% + + +\def\pgfplots@smithchart@draw@xcircle#1{% + \pgfplotscoordmath{default}{one}% + \let\pgfplots@loc@TMPa=\pgfmathresult + % + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@x=\pgfmathresult + % + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@loc@TMPa}{\pgfplots@x}}% + \let\pgfplots@radius@inverse=\pgfmathresult + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfmathresult}}% + \let\pgfplots@radius=\pgfmathresult + \pgfplotscoordmath{default}{op}{multiply}{{\pgfmathresult}{\pgfplots@x}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@center=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@radius}% + \let\pgfplots@radius=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@radius@inverse}% + \let\pgfplots@radius@inverse=\pgfmathresult + % + % This here would suffice in case 'xgrid each nth passes y={}': +% \pgfpathellipse +% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}} +% {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@radius}{0}} +% {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@radius}}% + % + % but we also check for the 'xgrid each nth passes y' feature: + \pgfplots@get@current@grid@stop@point xy{\pgfplots@x}% + \let\pgfplots@arc@ends@at@y@arc@value\pgfplotsretval% + % + \ifx\pgfplots@arc@ends@at@y@arc@value\pgfutil@empty + % Ok. There is no specific end point -- simply use the + % (1,0) point (i.e. draw the full circle). + % + \pgfmathadd@{\pgfplots@center}{\pgfplots@radius}% + \let\pgfplots@start=\pgfmathresult% + \def\pgfplots@startim{0}% + \def\pgfplots@startangle{0}% + \let\pgfplots@end=\pgfplots@start + \let\pgfplots@endim=\pgfplots@startim + \def\pgfplots@endangle{360}% + \else + % Ok. The arc should end before it reaches the (1,0) + % point. Determine the exact position and the + % corresponding arc end angle. + % + % In general, the intersection between the circle for + % fixed x=A and fixed y=B is given by + % + % p + j * q = (A + j * B -1 ) / ( A + j*B +1) + % see http://www.siart.de/lehre/tutorien.xhtml#smishort + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{-1}% + \let\pgfplots@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@mone}}% + \let\pgfplots@A@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@x}{\pgfplots@one}}% + \let\pgfplots@A@one=\pgfmathresult + % oh - we should only draw a partial arc. + % Well, then compute its end point and the + % corresponding end angle. + \pgfplotscoordmathcomplexdivision + {\pgfplots@A@mone}{\pgfplots@arc@ends@at@y@arc@value}% + {\pgfplots@A@one}{\pgfplots@arc@ends@at@y@arc@value}% + \let\pgfplots@start=\pgfmathresult + \let\pgfplots@startim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@start}% + \let\pgfplots@start=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}% + \let\pgfplots@startim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{\pgfplots@center}{\pgfplots@radius}{\pgfplots@radius@inverse}% + \let\pgfplots@startangle=\pgfmathresult + \pgfmathsubtract@{360}{\pgfplots@startangle}% + \let\pgfplots@endangle=\pgfmathresult + \let\pgfplots@end=\pgfplots@start + \edef\pgfplots@endim{-\pgfplots@startim}% + \ifdim\pgfplots@startangle pt>\pgfplots@endangle pt + \let\pgfplots@loc@TMPa=\pgfplots@startangle + \let\pgfplots@startangle=\pgfplots@endangle + \let\pgfplots@endangle=\pgfplots@loc@TMPa + \fi + \fi + % +%\message{X grid line \#\csname pgfplots@ticknum\endcsname \space at '#1': center = (\pgfplots@center,0); radius = \pgfplots@radius\space(start angle \pgfplots@startangle, end angle = \pgfplots@endangle; stops at y = \pgfplots@arc@ends@at@y@arc@value).^^J}% + % + % Now, compute the arc. + % + % first, compute the absolute x/y radii: + \pgf@xa=\pgfplots@radius\pgf@xx + \pgf@xb=\pgfplots@radius\pgf@yy + \edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}% + % note that the case startangle > endangle is + % automatically correct; patharc handles that. + %\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}% + %\expandafter\pgfpatharc\pgfplots@loc@TMPa + % + % prefer \pgfpatharctoprecomputed. It is faster and more accurate + \edef\pgfplots@loc@TMPa{% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@center}{0}}% + {\pgfplots@startangle}% + {\pgfplots@endangle}% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}% + {\pgfplots@mirror@sign\the\pgf@xa}% + {\the\pgf@xb}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}% + }% + \expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa +} + +\def\pgfplots@smithchart@draw@yarc#1{% + \pgfplotscoordmath{default}{parsenumber}{#1}% + \let\pgfplots@y\pgfmathresult + \pgfplotscoordmath{default}{op}{abs}{{\pgfplots@y}}% + \pgfplotscoordmath{default}{if less than}{\pgfmathresult}{\pgfplots@almost@zero@thresh}{% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{-1}{0}}% + \pgfpathlineto{\pgfplotsqpointxy@smithchart@canvas{1}{0}}% + }{% + \pgfplotscoordmath{default}{op}{reciprocal}{{\pgfplots@y}}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% + \let\pgfplots@signedradius=\pgfmathresult + % + \pgfplotscoordmath{default}{tofixed}{\pgfplots@y}% + \ifdim\pgfplots@signedradius pt<0pt + \def\pgfplots@radius@sign{-}% + \edef\pgfplots@radius@inverse{-\pgfmathresult}% + \edef\pgfplots@radius{-\pgfplots@signedradius}% + \else + \def\pgfplots@radius@sign{}% + \edef\pgfplots@radius@inverse{\pgfmathresult}% + \let\pgfplots@radius=\pgfplots@signedradius + \fi + % this here is the correct, complete circle -- together + % with a clip path, you get what you want: + %\pgfpathellipse + % {\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@signedradius}} + % {\pgfplotsqpointxy@smithchart@canvas{\pgfplots@signedradius}{0}} + % {\pgfplotsqpointxy@smithchart@canvas{0}{\pgfplots@signedradius}}% + % But I only want the arc (probably stopped earlier to + % improve qualtity of the chart) + % + % compute start point for the arc. + % + % To do so, we need to compute the intersection between + % the circle for fixed x=0 and the circle for y=#1. + % + % In general, the intersection between the circle for + % fixed x=A and fixed y=B is given by + % + % p + j * q = (A + j * B -1 ) / ( A + j*B +1) + % see http://www.siart.de/lehre/tutorien.xhtml#smishort + % + % inserting A = 0 and B = #1 yields the result + % p=\pgfplots@start + % q=\pgfplots@startim + % as follows: + \pgfplotscoordmath{default}{one}% + \let\pgfplots@one=\pgfmathresult + \pgfplotscoordmath{default}{parsenumber}{-1}% + \let\pgfplots@mone=\pgfmathresult + \pgfplotscoordmathcomplexdivision{\pgfplots@mone}{\pgfplots@y}{\pgfplots@one}{\pgfplots@y}% + \let\pgfplots@start=\pgfmathresult + \let\pgfplots@startim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@start}% + \let\pgfplots@start=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@startim}% + \let\pgfplots@startim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@start\pgfplots@startim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}% + \let\pgfplots@startangle=\pgfmathresult + % + % + % compute end angle. + \pgfplots@get@current@grid@stop@point yx{\pgfplots@y}% + \let\pgfplots@arc@ends@at@x@circle@value\pgfplotsretval% + % + \ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty + % Ok. There is no specific end point -- simply use the + % (1,0) point (i.e. draw the full arc). + % + % The "0 degree" angle in my circles is in the direction + % of (1,0) . + \ifdim\pgfplots@startim pt>0pt + % ok; this arc belongs to the upper hemisphere. + \def\pgfplots@endangle{270}% + \else + % ok; this arc belongs to the lower hemisphere. + \def\pgfplots@endangle{90}% + \fi + \def\pgfplots@end{1}% + \def\pgfplots@endim{0}% + \else + % Ok. The arc should end before it reaches the (1,0) + % point. Determine the exact position and the + % corresponding arc end angle. + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@mone}}% + \let\pgfplots@A@mone=\pgfmathresult + \pgfplotscoordmath{default}{op}{add}{{\pgfplots@arc@ends@at@x@circle@value}{\pgfplots@one}}% + \let\pgfplots@A@one=\pgfmathresult + % oh - we should only draw a partial arc. + % Well, then compute its end point and the + % corresponding end angle. + \pgfplotscoordmathcomplexdivision{\pgfplots@A@mone}{\pgfplots@y}{\pgfplots@A@one}{\pgfplots@y}% + \let\pgfplots@end=\pgfmathresult + \let\pgfplots@endim=\pgfmathresultim + \pgfplotscoordmath{default}{tofixed}{\pgfplots@end}% + \let\pgfplots@end=\pgfmathresult + \pgfplotscoordmath{default}{tofixed}{\pgfplots@endim}% + \let\pgfplots@endim=\pgfmathresult + % + \pgfplots@compute@angle@of@point@in@circle\pgfplots@end\pgfplots@endim{1}{\pgfplots@signedradius}{\pgfplots@radius@inverse}% + \let\pgfplots@endangle=\pgfmathresult + \fi + % + % + % + % Now, compute the arc. + % + % first, compute the absolute x/y radii: + % + % Note that for small y (like y=0.01), the arc is almost a + % straight line. Consequently, the ellipsis radius will be much larger + % than 16000, violating TeX's number range. + % + % To avoid that, I clip it to the highest allowed value. + % The final radius is + % \pgfplots@radius * \pgf@xx and \pgfplots@radius * \pgf@yy. + % the clipped value thus needs to respect the magnitude of \pgf@xx and \pgf@yy. + \ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@xradius@for@ycircle pt + \let\pgfplots@radius@x\pgfplots@radius + \else + \let\pgfplots@radius@x=\pgfplots@smithchart@axis@max@xradius@for@ycircle + \fi + \ifdim\pgfplots@radius pt<\pgfplots@smithchart@axis@max@yradius@for@ycircle pt + \let\pgfplots@radius@y\pgfplots@radius + \else + \let\pgfplots@radius@y=\pgfplots@smithchart@axis@max@yradius@for@ycircle + \fi +%\message{Y grid line \#\csname pgfplots@ticknum\endcsname\space at '#1': center = (1,\pgfplots@signedradius); signedradius = \pgfplots@signedradius\space clipped radii = \pgfplots@radius@x*\the\pgf@xx\space and \pgfplots@radius@y*\the\pgf@yy\space ( start angle \pgfplots@startangle, end angle \pgfplots@endangle, arc limit: \ifx\pgfplots@arc@ends@at@x@circle@value\pgfutil@empty NONE\else \pgfplots@arc@ends@at@x@circle@value\fi)^^J}% + \pgf@xa=\pgfplots@radius@x\pgf@xx + \pgf@xb=\pgfplots@radius@y\pgf@yy + \edef\pgfplots@mirror@sign{\ifpgfplots@smithchart@mirrored -\fi}% + \pgfpathmoveto{\pgfplotsqpointxy@smithchart@canvas{\pgfplots@start}{\pgfplots@startim}}% + % note that the case startangle > endangle is + % automatically correct; patharc handles that. + %\edef\pgfplots@loc@TMPa{{\pgfplots@startangle}{\pgfplots@endangle}{\pgfplots@mirror@sign\the\pgf@xa\space and \the\pgf@xb}}% + %\expandafter\pgfpatharc\pgfplots@loc@TMPa + % + % prefer \pgfpatharctoprecomputed. It is faster and more accurate + \ifdim\pgfplots@startangle pt>\pgfplots@endangle pt + \let\pgfplots@loc@TMPa=\pgfplots@startangle +% \let\pgfplots@startangle=\pgfplots@endangle +% \let\pgfplots@endangle=\pgfplots@loc@TMPa + \fi + \edef\pgfplots@loc@TMPa{% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{1}{\pgfplots@radius@sign\pgfplots@radius@y}}% + {\pgfplots@startangle}% + {\pgfplots@endangle}% + {\noexpand\pgfplotsqpointxy@smithchart@canvas{\pgfplots@end}{\pgfplots@endim}}% + {\pgfplots@mirror@sign\the\pgf@xa}% + {\the\pgf@xb}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioxy}% + {\pgfplots@mirror@sign\pgfplots@smithchart@axis@ratioyx}% + }% + \expandafter\pgfpatharctoprecomputed\pgfplots@loc@TMPa + }% +} + +\def\pgfplots@drawgridlines@onorientedsurf@fromto@smithchart#1{% + \if x\pgfplotspointonorientedsurfaceA + \pgfplots@smithchart@draw@xcircle{#1}% + \else + \pgfplots@smithchart@draw@yarc{#1}% + \fi +}% + +% Given a circle with center point (#3,#4), we search for the angle +% of the point (#1,#2). The point is expected to be on the circle. +% The resulting angle is returned in \pgfmathresult +% +% #1 x coordinate of the point for which an angle is searched +% #2 y coordinate of the point for which an angle is searched +% #3 x coordinate of the circle's center point +% #4 y coordinate of the circle's center point +% #5 is either empty or it is expected to contain the inverse radius, 1/r +% this information is available in my context, so I don't recompute +% it. +% +% All coordinates are expected in standard TeX precision (numbers +% without unit) +\def\pgfplots@compute@angle@of@point@in@circle#1#2#3#4#5{% + % + % 1. compute diff vector from center=(1,\pgfplots@signedradius) to start: + \pgfmathsubtract@{#1}{#3}% + \let\pgfplots@D\pgfmathresult + \pgfmathsubtract@{#2}{#4}% + \let\pgfplots@Dim\pgfmathresult + % + % 2. compute the start angle. + % It is related to the angle between the point (1,0) and + % diff, which, in turn is given by + % < (1,0), (D,Dim) > = cos(alpha) ||(D,Dim)|| + % < (1,0), (D,Dim) > = D + % + % Note that ||(D,Dim)|| = r, the radius of the involved circle + % around (#3,#4). If 1/r is already available, use it! Saves a lot + % of time. + % + \def\pgfplots@loc@TMPa{#5}% + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \pgfmathveclen\pgfplots@D\pgfplots@Dim + \let\pgfplots@veclen=\pgfmathresult + \pgfmathreciprocal@\pgfplots@veclen + \let\pgfplots@inverseveclen=\pgfmathresult + \else + % oh, good -- we already have 1/||(D,Dim)||. Use it. + \def\pgfplots@inverseveclen{#5}% +%\message{using already available inverseveclen '#5' }% + \fi + \pgfmathmultiply@{\pgfplots@D}{\pgfplots@inverseveclen}% +%\message{D= (\pgfplots@D,\pgfplots@Dim).. acos(\pgfplots@D * \pgfplots@inverseveclen) = acos(\pgfmathresult)}% + \pgfmathacos@{\pgfmathresult}% the '-' comes from D<0 . +%\message{= \pgfmathresult^^J}% + \let\pgfplots@tmpangle\pgfmathresult% + % ok. tmpangle is per definition less than 180; it is the + % smaller angle between (1,0) and (D,Dim). + % + % compute the angle relative to (1,0): + \ifdim\pgfplots@Dim pt<0pt + \pgfmathiftrigonometricusesdeg{% + \pgfmathsubtract@{360}{\pgfplots@tmpangle}% + }{% + \pgfmathsubtract@{6.28318530717959}{\pgfplots@tmpangle}% + }% + \fi +}% + +\def\pgfplots@drawaxis@innerlines@onorientedsurf@smithchart#1#2#3{% + \if2\csname pgfplots@#1axislinesnum\endcsname + \draw[/pgfplots/every inner #1 axis line,% + decorate,% + #1discont,% + decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}] + \pgfextra + \csname pgfplotspointonorientedsurfaceabsetupforset#3\endcsname{\csname pgfplots@logical@ZERO@#3\endcsname}{2}% + \if#1x% + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{0}% + \else + \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}% + \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}% + \fi + \endpgfextra + ; + \fi +}% +\def\pgfplots@drawaxis@outerlines@separate@onorientedsurf@smithchartaxis#1#2{% + \if2\csname pgfplots@#1axislinesnum\endcsname + % centered axis lines handled elsewhere. + \else + \scope[/pgfplots/every outer #1 axis line, + #1discont,decoration={pre length=\csname #1disstart\endcsname, post length=\csname #1disend\endcsname}] + \if#1x + \draw decorate { + \pgfextra + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{0}% + \endpgfextra + }; + \else + \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{0}{% + \draw decorate { + \pgfextra + % exchange roles of A <-> B axes: + \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2min\endcsname}% + \endpgfextra + }; + }{}% + %-------------------------------------------------- + % \pgfplots@ifaxisline@B@onorientedsurf@should@be@drawn{1}{% + % \draw decorate { + % \pgfextra + % % exchange roles of A <-> B axes: + % \pgfplotspointonorientedsurfaceabsetupfor{#2}{#1}{\pgfplotspointonorientedsurfaceN}% + % \pgfplots@drawgridlines@onorientedsurf@fromto{\csname pgfplots@#2max\endcsname}% + % \endpgfextra + % }; + % }{}% + %-------------------------------------------------- + \fi + \endscope + \fi +}% + +\def\pgfplots@BB@for@plotbox@get@unit@scales@for@limits@smithchart#1#2#3{% + % In a smith chart, the size of the image is unrelated to the + % involved data limits. + % + % The factor 2 is because we want to fit the DIAMETER into the + % prescribed dimensions, not just the radius. + \def\pgfmathresult{2}% + \let#1=\pgfmathresult + \let#2=\pgfmathresult + \def#3{1}% +}% + +\def\pgfplots@handle@invalid@range@defaultlimits@smithchart{% + \pgfplotscoordmath{x}{parsenumber}{0}% + \global\let\pgfplots@xmin=\pgfmathresult + \pgfplotscoordmath{x}{parsenumber}{16000}% + \global\let\pgfplots@xmax=\pgfmathresult + \global\let\pgfplots@data@xmin=\pgfplots@xmin + \global\let\pgfplots@data@xmax=\pgfplots@xmax + % + \pgfplotscoordmath{y}{parsenumber}{0}% + \global\let\pgfplots@ymin=\pgfmathresult + \pgfplotscoordmath{y}{parsenumber}{16000}% + \global\let\pgfplots@ymax=\pgfmathresult + \global\let\pgfplots@data@ymin=\pgfplots@ymin + \global\let\pgfplots@data@ymax=\pgfplots@ymax + \pgfplotsset{enlargelimits=false}% +} + +\let\pgfplots@set@default@size@options@standard=\pgfplots@set@default@size@options +\def\pgfplots@set@default@size@options@smithchart{% + \pgfplots@set@default@size@options@standard + \pgfplotsset{smithchart ticks by size={\pgfkeysvalueof{/pgfplots/width}}{\pgfkeysvalueof{/pgfplots/height}}}% + % + \if1\b@pgfplots@smithchart@defaultticks@x + \if1\b@pgfplots@smithchart@defaultticks@y + \pgfplotsset{default smithchart xytick}% + \fi + \fi +} +\def\pgfplots@assign@default@tick@foraxis@smithchart#1{% + % do nothing here. I don't know the algorithm yet... but for + % smithcharts, it may be sufficient to simply predefine several + % sets of ticks, depending on the final size. + % + % This is realized in + % \pgfplots@set@default@size@options@smithchart (which is invoked + % before the ticks are processed). + \pgfplots@determinedefaultvalues@needs@check@uniformtickfalse + \expandafter\let\csname pgfplots@tick@distance@#1\endcsname=\pgfutil@empty + % + \pgfplotsset{default smithchart #1tick}% + % ok, I expect the '#1tick' key to be set now. Process it. + % Note that the earlier processing of pgfplots has been bypassed + % at this point -- we need to preprocess the tick list *here*: + \expandafter\let\expandafter\pgfplots@loc@TMPa\csname pgfplots@#1tick\endcsname + \expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}% + \expandafter\let\csname pgfplots@#1tick\endcsname=\pgfplotsretval + % + \pgfkeysgetvalue{/pgfplots/minor #1tick}\pgfplots@loc@TMPa + \ifx\pgfplots@loc@TMPa\pgfutil@empty + \else + \expandafter\pgfplots@assign@default@tick@foraxis@smithchart@\expandafter{\pgfplots@loc@TMPa}% + \pgfkeyslet{/pgfplots/minor #1tick}\pgfplotsretval + \fi + % +}% +% #1: a \foreach list +% on output, \pgfplotsretval contains a parsed list of positions +\def\pgfplots@assign@default@tick@foraxis@smithchart@#1{% + \pgfplotsapplistXXglobalnewempty + \gdef\pgfplots@loc@TMPd{1}% + \foreach \pgfplots@loc@TMPb in {#1} {% + \ifx\pgfplots@loc@TMPb\pgfutil@empty + \else + \pgfplotscoordmath{default}{parsenumber}{\pgfplots@loc@TMPb}% + \pgfplotscoordmath{default}{tofixed}{\pgfmathresult}% per convention... + \edef\pgfmathresult{\if0\pgfplots@loc@TMPd,\fi\pgfmathresult}% + \gdef\pgfplots@loc@TMPd{0}% + \expandafter\pgfplotsapplistXXglobalpushback\expandafter{\pgfmathresult}% + \fi + }% + \pgfplotsapplistXXgloballet\pgfplotsretval + \pgfplotsapplistXXglobalclear +}% + +\let\pgfplots@show@ticklabel@@orig=\pgfplots@show@ticklabel@ +\def\pgfplots@show@ticklabel@@smithchart#1#2{% + \def\pgfmathresult{#2}% + \if#1x% + \ifdim#2pt>360pt + \pgfmath@basic@mod@{#2}{360}% + \fi + \fi + \def\pgfplots@loc@TMPa{\pgfplots@show@ticklabel@@orig{#1}}% + \expandafter\pgfplots@loc@TMPa\expandafter{\pgfmathresult}% +}% + +\def\pgfplots@xtick@check@tickshow@smithchart{% + \pgfplots@tickshowtrue +} +\def\pgfplots@ytick@check@tickshow@smithchart{% + \pgfplots@tickshowtrue +} + +\let\pgfplots@limits@ready@orig=\pgfplots@limits@ready +\def\pgfplots@limits@ready@smithchart{% + \pgfplots@limits@ready@orig + % + % Avoid tick labels at upper *and* lower angle range if both are the + % same: + \pgfmath@basic@sin@{\pgfplots@xmin}% + \let\pgfplots@loc@TMPa=\pgfmathresult + \pgfmath@basic@sin@{\pgfplots@xmax}% + \pgfplotsmath@ifapproxequal@dim + {\pgfmathresult pt}{\pgfplots@loc@TMPa pt}% + {0.002pt} + {% + \def\pgfplots@xtick@disable@last@tick{1}% + }{% + }% +}% + +\def\smithchart{\smithchartaxis} +\def\endsmithchart{\endsmithchartaxis} + +\def\startsmithchart{\smithchart}% +\def\stopsmithchart{\endsmithchart}% +\endinput |