summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex')
-rw-r--r--graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex563
1 files changed, 563 insertions, 0 deletions
diff --git a/graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex b/graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex
new file mode 100644
index 0000000000..b290427298
--- /dev/null
+++ b/graphics/pgf/contrib/pgf-spectra/pgf-spectra.library.data.tex
@@ -0,0 +1,563 @@
+% --------------------------------------------------------------------------------------------------
+% subfile of pgf-spectra package -----------------------------------------------------------------
+% --------------------------------------------------------------------------------------------------
+\def\pgfspectra@library@data@loaded{}%
+\message{pgf-spectra data library loaded!}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% provide the macros
+% \pgfspectradata[name of data set]{keys}
+% \pgfspectratable[table options](name(s) of data set(s))
+% \pgfspectrawrite[filename](name(s) of data set(s))
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter%
+\newdimen\pgfspectra@dima%
+\newdimen\pgfspectra@dimb%
+\newdimen\pgfspectra@dimc%
+\newcount\pgfspectra@elt@count%
+\edef\@pgfspectra@hash{\string#}%
+% ----------------------------------------------------------------------------------------------------------
+% \pgfspectradata[name of data set]{keys}
+%
+% keys with effect: charge,Imin,redshift,begin,end,precision,unit,element
+% ----------------------------------------------------------------------------------------------------------
+\def\pgfspectradata{\@ifnextchar[\pgfspectra@data{\pgfspectra@data[]}}%
+\def\pgfspectra@data[#1]#2{\ignorespaces%
+% setting default values or user style
+\ifpgfspectra@StyleIsDef\pgfspectraStyleReset\pgfspectra@DoStyle\pgfspectra@StyleIsDeftrue\relax\else\pgfspectraStyleReset\relax\fi% NEW v2.0.0
+% process options (key values)
+\pgfkeys{/pgfspectra/.cd,#2}%
+% ----------------------------------------------------------------------------------------------------------
+% ----------------------------------------------------------------------------------------------------------
+% check if at least one element was provided...
+\ifx\pgfspectra@element\pgfspectra@wlN@NE\relax%
+NO ELEMENT(S) PROVIDED!\\ %
+\else% to the data list...
+% ----------------------------------------------------------------------------------------------------------
+% check limits... % NEW v2.0.0
+\ifnum\pgfspectra@end<10\relax\def\wldez{10}\let\pgfspectra@end\wldez\fi%
+\ifnum\pgfspectra@end>4000\relax\def\wlquatromil{4000}\let\pgfspectra@end\wlquatromil\fi%
+\ifnum\pgfspectra@begin<10\relax\def\wldez{10}\let\pgfspectra@begin\wldez\fi%
+\ifnum\pgfspectra@begin>4000\relax\def\wlquatromil{4000}\let\pgfspectra@begin\wlquatromil\fi%
+% ----------------------------------------------------------------------------------------------------------
+% setting limits...
+\pgfmathsetlength{\pgfspectra@dimb}{\pgfspectra@begin}%
+\pgfmathsetlength{\pgfspectra@dimc}{\pgfspectra@end}%
+% ----------------------------------------------------------------------------------------------------------
+% verifying redshift key
+\ifx\pgfspectra@redshift\@empty\relax%
+\pgfspectra@redshiftfalse%
+\else%
+\pgfspectra@processredshiftkey\pgfspectra@redshift\relax%
+\fi%
+% ----------------------------------------------------------------------------------------------------------
+% check if is only in visible range... or in UV... or in IV % NEW v2.2.0
+\pgfspectra@visibleRangeOnlyfalse%
+\pgfspectra@UVRangeOnlyfalse%
+\pgfspectra@IRRangeOnlyfalse%
+\ifnum\pgfspectra@end>\pgfspectra@begin\relax%
+ \ifnum\pgfspectra@end<380\relax% UV
+ \pgfspectra@UVRangeOnlytrue%
+ \else% VIS or IV
+ \ifnum\pgfspectra@end<781\relax%
+ \ifnum\pgfspectra@begin>379\relax\pgfspectra@visibleRangeOnlytrue\fi% VIS
+ \else%
+ \ifnum\pgfspectra@begin>780\relax\pgfspectra@IRRangeOnlytrue\fi% IR
+ \fi%
+ \fi%
+\else%
+ \ifnum\pgfspectra@begin<380\relax% UV
+ \pgfspectra@UVRangeOnlytrue%
+ \else% VIS or IV
+ \ifnum\pgfspectra@begin<781\relax%
+ \ifnum\pgfspectra@end>379\relax\pgfspectra@visibleRangeOnlytrue\fi% VIS
+ \else%
+ \ifnum\pgfspectra@end>780\relax\pgfspectra@IRRangeOnlytrue\fi% IR
+ \fi%
+ \fi%
+\fi%
+% ----------------------------------------------------------------------------------------------------------
+% do the data list for the elements provided with the corresponding options
+ \def\pgfspectra@decompose##1/##2\relax{\edef\pgfspectra@wl@value{##1}\edef\pgfspectra@wl@int{##2}}%
+ \pgfspectra@countc=0%
+ \pgfspectra@elt@count=0%
+ \pgfkeys{/pgf/number format/.cd,fixed,fixed zerofill,precision=\pgfspectra@precision,assume math mode=true}%
+ \@for\@myarg:=\pgfspectra@element\do{\advance\pgfspectra@countc by1}%count number of elements
+ \edef\pgfspectra@data@list{}%
+ \@for\@myarg:=\pgfspectra@element\do{%
+ \pgfspectra@addt@list{}{}%
+ \pgfspectra@cur@elem@existtrue%
+ \def\pgfspectra@elt@chemsym{NOT FOUND!}%
+ \def\@search@result@err{NOT FOUND!}%
+ \pgfspectra@elt@data{\@myarg}\relax%
+ % check if element provided exists
+ \ifx\@search@result@err\pgfspectra@elt@chemsym Element\ ``\@myarg'' with charge ``\pgfspectra@charge'' not found!\pgfspectra@cur@elem@existfalse\else%
+ % if exists, set the wavelength's list
+ % CHANGED IN v2.2.0 to better accommodate relative intensities (also considering charges...) ---->
+ \ifpgfspectra@UVRangeOnly%
+ \expandafter\pgfspectra@getmaxint\pgfspectra@elt@Imax@UV\relax%
+ \pgfspectra@setmaxint{UV}%
+ \else\ifpgfspectra@visibleRangeOnly%
+ \expandafter\pgfspectra@getmaxint\pgfspectra@elt@Imax@VIS\relax%
+ \pgfspectra@setmaxint{VIS}%
+ \else\ifpgfspectra@IRRangeOnly%
+ \expandafter\pgfspectra@getmaxint\pgfspectra@elt@Imax@IR\relax%
+ \pgfspectra@setmaxint{IR}%
+ \else%
+ \expandafter\pgfspectra@getmaxint\pgfspectra@elt@Imax@ALL\relax%
+ \pgfspectra@setmaxint{ALL}%
+ \fi\fi\fi%
+ % <----- v2.0.0
+ \pgfspectra@set@element@list{\pgfspectra@elt@elemdata}{\pgfspectra@elt@Imax}%
+ \fi%\@search@result@err\pgfspectra@elt@chemsym
+ % set the \pgfspectra@data@list to the interval [\pgfspectra@begin,\pgfspectra@end]
+ \edef\@pgfspectra@list@@{BEGIN}%
+ \@for\@myargi:=\pgfspectra@list@@\do{%
+ \ifpgfspectra@intensity%
+ \expandafter\pgfspectra@decompose\@myargi\relax%
+ \pgfmathsetlength{\pgfspectra@dima}{\pgfspectra@wl@value}%
+ \else%
+ \edef\pgfspectra@wl@value{\@myargi}%
+ \pgfmathsetlength{\pgfspectra@dima}{\@myargi}%
+ \fi%
+ \ifdim\pgfspectra@dima<\pgfspectra@dimb\relax%lambda<begin
+ \else\ifdim\pgfspectra@dima>\pgfspectra@dimc\relax%lambda>end
+ \else%begin<=lambda<=end
+ \ifpgfspectra@intensity%
+ \pgfmathprintnumberto{\pgfspectra@wl@value}{\pgfspectra@wlformatted}%
+ \pgfmathprintnumberto[fixed,fixed zerofill,precision=2,assume math mode=true]{\pgfspectra@wl@int}{\pgfspectra@intformatted}%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@,\pgfspectra@wlformatted/\pgfspectra@intformatted}%
+ \else%
+ \pgfmathprintnumberto{\pgfspectra@wl@value}{\pgfspectra@wlformatted}%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@,\pgfspectra@wlformatted}%
+ \fi%
+ \fi\fi%
+ }%end do
+ \ifnum\pgfspectra@charge=0\relax\edef\pgfspectra@elt@charge{0}\else%
+ \ifnum\pgfspectra@charge=1\relax\edef\pgfspectra@elt@charge{1}\else%
+ \ifnum\pgfspectra@charge=2\relax\edef\pgfspectra@elt@charge{2}\else%
+ \ifnum\pgfspectra@charge=3\relax\edef\pgfspectra@elt@charge{3}\else%
+ \ifnum\pgfspectra@charge=4\relax\edef\pgfspectra@elt@charge{4}\else%
+ \edef\pgfspectra@elt@charge{all}\fi\fi\fi\fi\fi%
+ \edef\pgfspectra@BEGIN{BEGIN}%
+ \ifx\@pgfspectra@list@@\pgfspectra@BEGIN\relax%
+ \edef\pgfspectra@data@list{\pgfspectra@data@list\pgfspectra@elt@chemsym(+\pgfspectra@elt@charge):no lines!;}%
+ \else%
+ \ifpgfspectra@cur@elem@exist%
+ \expandafter\@pgfspectra@list@purge \@pgfspectra@list@@[@pgfspectra@list@@]\relax%
+ \ifpgfspectra@intensity\relax\else%
+ \expandafter\@pgfspectra@removeduplicates\@pgfspectra@list@@\relax%
+ \fi%
+ % processing redshift
+ \ifpgfspectra@redshift%
+ \edef\pgfspectra@list@@{\@pgfspectra@list@@}\pgfspectra@utils@redshift%
+ \edef\@pgfspectra@list@@{BEGIN}%
+ \@for\@myargi:=\pgfspectra@list@@\do{%
+ \ifpgfspectra@intensity%
+ \expandafter\pgfspectra@decompose\@myargi\relax%
+ \pgfmathprintnumberto{\pgfspectra@wl@value}{\pgfspectra@wlformatted}%
+ \pgfmathprintnumberto[fixed,fixed zerofill,precision=2,assume math mode=true]{\pgfspectra@wl@int}{\pgfspectra@intformatted}%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@,\pgfspectra@wlformatted/\pgfspectra@intformatted}%
+ \else%
+ \edef\pgfspectra@wl@value{\@myargi}%
+ \pgfmathprintnumberto{\pgfspectra@wl@value}{\pgfspectra@wlformatted}%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@,\pgfspectra@wlformatted}%
+ \fi%
+ }%end do
+ \expandafter\@pgfspectra@list@purge \@pgfspectra@list@@[@pgfspectra@list@@]\relax%
+ \else%
+ \edef\pgfspectra@write@redshiftinfo{}\edef\pgfspectra@redshiftinfo{}%
+ \fi%
+ % processing the unit of wl and setting its value with the \pgfspectra@precision
+ \edef\pgfspectra@testa{}\edef\pgfspectra@testb{\pgfspectra@unit}%
+ \ifx\pgfspectra@testa\pgfspectra@testb\relax\edef\pgfspectra@unit{\pgfspectra@axisunit}\fi%
+ % setting info to write
+ \edef\pgfspectra@write@begin{\pgfspectra@begin}%
+ \edef\pgfspectra@write@end{\pgfspectra@end}%
+ \edef\pgfspectra@write@unit{nanometers}%
+ %
+ \ifx\pgfspectra@unit\pgfspectra@axisunit@um\relax%
+ \pgfspectra@countd=\pgfspectra@precision\advance\pgfspectra@countd by3\relax%
+ \pgfkeys{/pgf/number format/.cd,fixed zerofill,assume math mode=true,precision=\pgfspectra@countd}%
+ % overriding info to write
+ \pgfmathparse{\pgfspectra@begin/1000}\pgfmathprintnumberto{\pgfmathresult}{\pgfspectra@write@begin}%
+ \pgfmathparse{\pgfspectra@end/1000}\pgfmathprintnumberto{\pgfmathresult}{\pgfspectra@write@end}%
+ \edef\pgfspectra@write@unit{micrometers}%
+ %
+ \edef\@pgfspectra@list@@temp{BEGIN}%
+ \@for\@myarg:=\@pgfspectra@list@@\do{%
+ \ifpgfspectra@intensity%
+ \expandafter\pgfspectra@decompose\@myarg\relax%
+ \pgfmathparse{\pgfspectra@wl@value/1000}%
+ \pgfmathprintnumberto{\pgfmathresult}{\pgfspectra@wlformatted}%
+ \edef\@pgfspectra@list@@temp{\@pgfspectra@list@@temp,\pgfspectra@wlformatted/\pgfspectra@wl@int}%
+ \else%
+ \pgfmathparse{\@myarg/1000}%
+ \pgfmathprintnumberto{\pgfmathresult}{\pgfspectra@wlformatted}%
+ \edef\@pgfspectra@list@@temp{\@pgfspectra@list@@temp,\pgfspectra@wlformatted}%
+ \fi%
+ }%end do
+ \expandafter\@pgfspectra@list@purge \@pgfspectra@list@@temp[@pgfspectra@list@@temp]\relax%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@temp}%
+ \else\ifx\pgfspectra@unit\pgfspectra@axisunit@A\relax%
+ % overriding info to write
+ \expandafter\@pgfspectra@nmToA\pgfspectra@begin\relax\edef\pgfspectra@write@begin{\pgfspectra@wlformatted}%
+ \expandafter\@pgfspectra@nmToA\pgfspectra@end\relax\edef\pgfspectra@write@end{\pgfspectra@wlformatted}%
+ \edef\pgfspectra@write@unit{angstroms}%
+ %
+ \edef\@pgfspectra@list@@temp{BEGIN}%
+ \@for\@myarg:=\@pgfspectra@list@@\do{%
+ \ifpgfspectra@intensity%
+ \expandafter\pgfspectra@decompose\@myarg\relax%
+ \expandafter\@pgfspectra@nmToA\pgfspectra@wl@value\relax%
+ \edef\@pgfspectra@list@@temp{\@pgfspectra@list@@temp,\pgfspectra@wlformatted/\pgfspectra@wl@int}%
+ \else%
+ \expandafter\@pgfspectra@nmToA\@myarg\relax%
+ \edef\@pgfspectra@list@@temp{\@pgfspectra@list@@temp,\pgfspectra@wlformatted}%
+ \fi%
+ }%end do
+ \expandafter\@pgfspectra@list@purge \@pgfspectra@list@@temp[@pgfspectra@list@@temp]\relax%
+ \edef\@pgfspectra@list@@{\@pgfspectra@list@@temp}%
+ \fi\fi% UNITS
+ \edef\pgfspectra@data@list{\pgfspectra@data@list\pgfspectra@elt@chemsym(+\pgfspectra@elt@charge):\@pgfspectra@list@@;}%
+ \fi% \ifpgfspectra@cur@elem@exist
+ \advance\pgfspectra@elt@count by1%
+ \fi% \ifx\@pgfspectra@list@@\pgfspectra@BEGIN
+ }%end do
+ % setting element count:
+ \edef\pgfspectra@data@elementcount{\the\pgfspectra@elt@count}%
+% ----------------------------------------------------------------------------------------------------------
+% data info format: unit,begin,end,int,RS,RSinfo/RSinfowrite
+% append relative intensities text to table/write
+\ifpgfspectra@intensity\edef\pgfspectra@write@int{/relative intensity}\else\edef\pgfspectra@write@int{}\fi%
+% append RS tesxt to table/write
+\ifpgfspectra@redshift\edef\pgfspectra@write@RS{REDSHIFTED }\else\edef\pgfspectra@write@RS{}\fi%
+% do the list and info
+\edef\pgfspectra@data@list{\pgfspectra@data@list}%
+\edef\pgfspectra@data@list@info{\pgfspectra@write@unit,\pgfspectra@write@begin,\pgfspectra@write@end,\pgfspectra@write@int,\pgfspectra@write@RS,\pgfspectra@redshiftinfo/\pgfspectra@write@redshiftinfo}%
+% do the named data list and info
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#1}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax% no user name
+ \edef\pgfspectra@last@dataset{\pgfspectra@data@list}%
+ \edef\pgfspectra@last@dataset@info{\pgfspectra@data@list@info}%
+ \edef\pgfspectra@datanoname@elementcount{\pgfspectra@data@elementcount}%
+\else% user name
+ \expandafter\edef\csname #1\endcsname{\pgfspectra@data@list}%
+ \expandafter\edef\csname #1@info\endcsname{\pgfspectra@data@list@info}%
+\fi%
+% ----------------------------------------------------------------------------------------------------------
+\fi%\ifx\pgfspectra@element\pgfspectra@wlN@NE
+}% END \pgfspectradata
+% ----------------------------------------------------------------------------------------------------------
+%
+% ----------------------------------------------------------------------------------------------------------
+% \pgfspectratable keys
+% title, back color, data back color, text color, width, elements column width
+\pgfkeys{/pgfspectratable/.cd,%
+title/.get=\pgfspectra@table@title,%
+title/.store in=\pgfspectra@table@title,%
+title/.default={\pgfspectra@table@title@firstline\\ wavelength in \pgfspectra@table@unit\pgfspectra@table@info@int},%
+back color/.get=\pgfspectra@table@backcolor,%
+back color/.store in=\pgfspectra@table@backcolor,%
+back color/.default=black!10,%
+data back color/.get=\pgfspectra@table@databackcolor,%
+data back color/.store in=\pgfspectra@table@databackcolor,%
+data back color/.default=white,%
+text color/.get=\pgfspectra@table@textcolor,%
+text color/.store in=\pgfspectra@table@textcolor,%
+text color/.default=black,%
+width/.get=\pgfspectra@table@width,%
+width/.store in=\pgfspectra@table@width,%
+width/.default=\linewidth,%
+elements column width/.get=\pgfspectra@table@elementscolumnwidth,%
+elements column width/.store in=\pgfspectra@table@elementscolumnwidth,%
+elements column width/.default=2.5em%
+}%
+% setting keys with default values
+\pgfkeys{/pgfspectratable/.cd,title,back color,data back color,text color,width,elements column width}%
+% ----------------------------------------------------------------------------------------------------------
+%
+% ----------------------------------------------------------------------------------------------------------
+% \pgfspectratable[table options](name(s) of data set(s))
+% USAGE:
+% \pgfspectratable
+% or
+% \pgfspectratable[keys]
+% or
+% \pgfspectratable{mydataH,mydataHe,...}
+% or
+% \pgfspectratable[keys]{mydataH,mydataHe,...}
+% ----------------------------------------------------------------------------------------------------------
+\newif\ifpgspectra@datah@snames%
+\def\pgfspectratable{\@ifnextchar[{\pgfspectra@table}{\pgfspectra@table[]}}%
+\def\pgfspectra@table[#1]{\@ifnextchar\bgroup{\@pgfspectra@table@two[#1]}{\@pgfspectra@table@one[#1]}}%
+\def\@pgfspectra@table@one[#1]{\@pgfspectra@table@two[#1]{}}%
+\def\@pgfspectra@table@two[#1]#2{\ignorespaces%
+% setting keys with default values
+\pgfkeys{/pgfspectratable/.cd,title,back color,data back color,text color,width,elements column width}%
+% process options (key values)
+\pgfkeys{/pgfspectratable/.cd,#1}%
+% check if there are data names
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#2}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\pgspectra@datah@snamesfalse\else\pgspectra@datah@snamestrue\fi%
+% set ELEMENT or ELEMENTS and redshift info in default title
+\ifpgspectra@datah@snames%
+ % get data info
+ \def\pgfsectratable@data@firstname##1,##2\relax{\edef\pgfsectratable@thefirstname{##1}}%
+ \expandafter\pgfsectratable@data@firstname#2,\relax%
+ \edef\pgfsectratable@data@info{\csname\pgfsectratable@thefirstname @info\endcsname}%
+ \expandafter\pgfsectra@data@info\pgfsectratable@data@info\relax%
+ \ifnum\pgfspectra@data@elementcount>1\relax%
+ \def\pgfspectra@table@title@firstline{\pgfspectra@table@info@RS SPECTRAL LINES OF ELEMENTS\pgfspectra@table@info@RSinfo}%
+ \else%
+ \def\pgfspectra@table@title@firstline{\pgfspectra@table@info@RS SPECTRAL LINES OF ELEMENT\pgfspectra@table@info@RSinfo}%
+ \fi%
+\else%
+ \expandafter\pgfsectra@data@info\pgfspectra@last@dataset@info\relax%
+ \ifnum\pgfspectra@datanoname@elementcount>1\relax%
+ \def\pgfspectra@table@title@firstline{\pgfspectra@table@info@RS SPECTRAL LINES OF ELEMENTS\pgfspectra@table@info@RSinfo}%
+ \else%
+ \def\pgfspectra@table@title@firstline{\pgfspectra@table@info@RS SPECTRAL LINES OF ELEMENT\pgfspectra@table@info@RSinfo}%
+ \fi%
+\fi%
+% get and set the unit for default title
+\edef\pgfspectra@testb{\pgfspectra@table@info@unit}%
+\edef\pgfspectra@testc{micrometers}%
+%\ifx\pgfspectra@testa\pgfspectra@testb\relax\edef\pgfspectra@unit{\pgfspectra@axisunit}\fi%
+\ifx\pgfspectra@testb\pgfspectra@testc\relax%
+ \def\pgfspectra@table@unit{$\mu m$}%
+\else\edef\pgfspectra@testc{angstroms}%
+\ifx\pgfspectra@testb\pgfspectra@testc\relax%
+ \def\pgfspectra@table@unit{{\AA}}%
+\else%
+ \def\pgfspectra@table@unit{$nm$}%
+\fi\fi%
+% append relative intensities for default title
+\edef\pgfspectra@table@rel@int{\pgfspectra@table@info@int}%
+% do tthe table
+\begin{tikzpicture}
+ \node[text width={\pgfspectra@table@width-2pt},text centered,below right,inner xsep=0pt,draw=\pgfspectra@table@backcolor,%
+ fill=\pgfspectra@table@backcolor,line width=2pt,text=\pgfspectra@table@textcolor]%
+ (title) at (0,0) {\pgfspectra@table@title};%
+ \pgfspectra@countc=0\relax%
+ \ifpgspectra@datah@snames%
+ \@for\@names:=#2\do{%
+ \edef\pgfspectra@current@dataset{\csname\@names\endcsname}%
+ \expandafter\pgfspectra@table@get@data\pgfspectra@current@dataset\relax%
+ }%end do
+ \else%
+ \relax\expandafter\pgfspectra@table@get@data\pgfspectra@last@dataset\relax%
+ \fi%
+ \coordinate (L0) at ([xshift=\pgfspectra@table@elementscolumnwidth]title.south west);
+ \pgfspectra@countb=0\relax%
+ \foreach \x in {1,...,\pgfspectra@countc}{%
+ \pgfmathparse{-\pgfspectra@table@elementscolumnwidth*\x}\edef\y{\pgfmathresult pt}%
+ \node[text width={\pgfspectra@table@width-\pgfspectra@table@elementscolumnwidth-18pt},align=left,below right,%
+ inner xsep=8pt,inner ysep=5pt,minimum height=24pt,draw=\pgfspectra@table@backcolor,line width=2pt,%
+ fill=\pgfspectra@table@databackcolor,text=\pgfspectra@table@textcolor]%
+ (L\x) at ([yshift=2pt]L\the\pgfspectra@countb.south west)%
+ {%
+ \edef\pgfspectra@data@to@node{\csname pgfspectra@table@data@lines@\@roman\x\endcsname}%
+ \@for\@myarg:=\pgfspectra@data@to@node\do{\@myarg\ }%
+ };%
+ \edef\pgfspectra@table@element@charge{\csname pgfspectra@table@data@elementcharge@\@roman\x\endcsname}%
+ \pgfmathsetlength{\pgfspectra@dima}{.75*\f@size}%
+ \pgfmathsetlength{\pgfspectra@dimb}{.5*\f@size}%
+ \ifnum\pgfspectra@table@element@charge=0\relax\edef\pgfspectra@the@charge{}\else%
+ \ifnum\pgfspectra@table@element@charge=1\relax\def\pgfspectra@the@charge{\fontsize{\pgfspectra@dima}{\pgfspectra@dima}\selectfont\raisebox{1.1\pgfspectra@dimb}{\fontsize{\pgfspectra@dimb}{\pgfspectra@dimb}\selectfont\raisebox{.5ex}{+}}}\else%
+ \ifnum\pgfspectra@table@element@charge=2\relax\def\pgfspectra@the@charge{\fontsize{\pgfspectra@dima}{\pgfspectra@dima}\selectfont\raisebox{1.1\pgfspectra@dimb}{2\fontsize{\pgfspectra@dimb}{\pgfspectra@dimb}\selectfont\raisebox{.5ex}{+}}}\else%
+ \ifnum\pgfspectra@table@element@charge=3\relax\def\pgfspectra@the@charge{\fontsize{\pgfspectra@dima}{\pgfspectra@dima}\selectfont\raisebox{1.1\pgfspectra@dimb}{3\fontsize{\pgfspectra@dimb}{\pgfspectra@dimb}\selectfont\raisebox{.5ex}{+}}}\else%
+ \ifnum\pgfspectra@table@element@charge=4\relax\def\pgfspectra@the@charge{\fontsize{\pgfspectra@dima}{\pgfspectra@dima}\selectfont\raisebox{1.1\pgfspectra@dimb}{4\fontsize{\pgfspectra@dimb}{\pgfspectra@dimb}\selectfont\raisebox{.5ex}{+}}}\else%
+ \edef\pgfspectra@the@charge{-1}\fi\fi\fi\fi\fi%
+ \fill[\pgfspectra@table@backcolor] (L\x.north west) rectangle ([xshift=-\pgfspectra@table@elementscolumnwidth]L\x.south west)%
+ node[midway,fill=\pgfspectra@table@backcolor,text=\pgfspectra@table@textcolor]%
+ {\ifnum\pgfspectra@table@element@charge>0\relax\raisebox{.75\pgfspectra@dimb}{\csname pgfspectra@table@data@element@\@roman\x\endcsname\pgfspectra@the@charge}\else\csname pgfspectra@table@data@element@\@roman\x\endcsname\fi};%
+ \global\advance\pgfspectra@countb by1\relax%
+ }%
+\end{tikzpicture}
+}% END \pgfspectratable
+% ----------------------------------------------------------------------------------------------------------
+%
+% ----------------------------------------------------------------------------------------------------------
+% \pgfspectrawrite[filename](name(s) of data set(s))
+% USAGE:
+% \pgfspectrawrite
+% or
+% \pgfspectrawrite[filename]
+% or
+% \pgfspectrawrite{mydataH,mydataHe,...}
+% or
+% \pgfspectrawrite[filename]{mydataH,mydataHe,...}
+% ----------------------------------------------------------------------------------------------------------
+\def\pgfspectrawrite{\@ifnextchar[{\pgfspectra@write}{\pgfspectra@write[]}}%
+\def\pgfspectra@write[#1]{\@ifnextchar\bgroup{\@pgfspectra@write@two[#1]}{\@pgfspectra@write@one[#1]}}%
+\def\@pgfspectra@write@one[#1]{\@pgfspectra@write@two[#1]{}}%
+\def\@pgfspectra@write@two[#1]#2{\ignorespaces%
+% check if there are data names
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#2}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\pgspectra@datah@snamesfalse\else\pgspectra@datah@snamestrue\fi%
+% get data info
+\ifpgspectra@datah@snames
+ \def\pgfsectratable@data@firstname##1,##2\relax{\edef\pgfsectratable@thefirstname{##1}}%
+ \expandafter\pgfsectratable@data@firstname#2,\relax%
+ \edef\pgfsectratable@data@info{\csname\pgfsectratable@thefirstname @info\endcsname}%
+ \expandafter\pgfsectra@data@info\pgfsectratable@data@info\relax%
+\else%
+ \expandafter\pgfsectra@data@info\pgfspectra@last@dataset@info\relax%
+\fi%
+% verifying redshift
+\pgfspectra@redshiftfalse%
+\edef\pgfspectra@test@RS{REDSHIFTED }%
+\ifx\pgfspectra@test@RS\pgfspectra@table@info@RS\relax\pgfspectra@redshifttrue\fi%
+% check if the filename is provided and defining it
+\edef\pgfspectra@testb{#1}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\edef\pgfspectra@filename{spectradata.tex}\else%
+ \def\pgfspectra@ext@error##1.\relax{\edef\pgfspectra@check@file@ext{##1}}%
+ \def\pgfspectra@check@file.ext##1.##2\relax{\edef\pgfspectra@check@file@ext{##2}%
+ \ifx\pgfspectra@testa\pgfspectra@check@file@ext\relax\edef\pgfspectra@filename{##1.tex}\edef\pgfspectra@file@ext{tex}%
+ \else\edef\pgfspectra@check@file@ext@list{tex,csv,txt,dat}\edef\pgfspectra@file@ext{}%
+ \@for\@ext:=\pgfspectra@check@file@ext@list\do{%
+ \edef\pgfspectra@testb{\@ext.}\ifx\pgfspectra@testb\pgfspectra@check@file@ext\relax\edef\pgfspectra@file@ext{\@ext}\fi%
+ }%
+ \ifx\pgfspectra@testa\pgfspectra@file@ext\relax%
+ \edef\pgfspectra@file@ext{tex}%
+ \expandafter\pgfspectra@ext@error\pgfspectra@check@file@ext\relax%
+ \PackageError{pgfspectra}{\string\pgfspectrawrite: the file extension you provided ('\pgfspectra@check@file@ext') not allowed, '.tex' will be used...}{}\relax%
+ \fi%
+ \fi%
+ \edef\pgfspectra@filename{##1.\pgfspectra@file@ext}%
+ }%
+ \expandafter\pgfspectra@check@file.ext#1.\relax%
+\fi%
+% write to file
+\immediate\newwrite\pgfspectra@datafile%
+\immediate\openout\pgfspectra@datafile=\pgfspectra@filename%
+\edef\pgfspectra@write@space{ }%
+% changing today format
+\def\pgfspectra@today{\two@digits{\the\day}\space\space\ifcase\month\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi\space\number\year}%
+\edef\pgfspectra@testa{csv}%
+\ifx\pgfspectra@testa\pgfspectra@file@ext\relax% csv
+\immediate\write\pgfspectra@datafile{\@pgfspectra@hash\pgfspectra@write@space Generated by pgf-spectra @ \pgfspectra@today}%
+\ifpgfspectra@redshift%
+\immediate\write\pgfspectra@datafile{\@pgfspectra@hash\pgfspectra@write@space Redshifted spectral lines of element(s) and/or their ion(s) from \pgfspectra@table@info@begin\pgfspectra@write@space to \pgfspectra@table@info@end\pgfspectra@write@space\pgfspectra@table@info@unit}%
+\immediate\write\pgfspectra@datafile{\@pgfspectra@hash\pgfspectra@write@space \pgfspectra@write@info@RSinfo}%
+\else%
+\immediate\write\pgfspectra@datafile{\@pgfspectra@hash\pgfspectra@write@space Spectral lines of element(s) and/or their ion(s) from \pgfspectra@table@info@begin\pgfspectra@write@space to \pgfspectra@table@info@end\pgfspectra@write@space\pgfspectra@table@info@unit}%
+\fi%
+\immediate\write\pgfspectra@datafile{\@pgfspectra@hash\pgfspectra@write@space Data structure:}%
+\immediate\write\pgfspectra@datafile{chemical symbol,charge,lines\pgfspectra@table@info@int}%
+\else% tex,txt,dat
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space Generated by pgf-spectra @ \pgfspectra@today}%
+\ifpgfspectra@redshift%
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space Redshifted spectral lines of element(s) and/or their ion(s) from \pgfspectra@table@info@begin\pgfspectra@write@space to \pgfspectra@table@info@end\pgfspectra@write@space\pgfspectra@table@info@unit}%
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space \pgfspectra@write@info@RSinfo}%
+\else%
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space Spectral lines of element(s) and/or their ion(s) from \pgfspectra@table@info@begin\pgfspectra@write@space to \pgfspectra@table@info@end\pgfspectra@write@space\pgfspectra@table@info@unit}%
+\fi%
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space Data structure:}%
+\immediate\write\pgfspectra@datafile{\@percentchar\pgfspectra@write@space chemical symbol,charge,lines\pgfspectra@table@info@int}%
+\fi% \pgfspectra@file@ext
+\ifpgspectra@datah@snames%
+ \@for\@names:=#2\do{%
+ \edef\pgfspectra@test@tmp{\expandafter\ifx\csname\@names\endcsname\relax\else\csname\@names\endcsname\fi}%
+ \edef\pgfspectra@testa{\pgfspectra@test@tmp}%
+ \edef\pgfspectra@testb{}%
+ \ifx\pgfspectra@testa\pgfspectra@testb\relax%
+ \PackageError{pgfspectra}{\string\pgfspectrawrite: the named data you provided ('\@names') doesn't exist. It will not be written to file...}{}\relax%
+ \else%
+ \edef\pgfspectra@data@contents{\csname\@names\endcsname}%
+ \pgfspectra@countc=0\relax%
+ \expandafter\pgfspectra@table@get@data\pgfspectra@data@contents\relax%
+ \foreach \x in {1,...,\pgfspectra@countc}{%
+ \edef\pgfspectra@writedata@element@CS{\csname pgfspectra@table@data@element@\@roman\x\endcsname}%
+ \edef\pgfspectra@writedata@element@charge{\csname pgfspectra@table@data@elementcharge@\@roman\x\endcsname}%
+ \ifnum\pgfspectra@writedata@element@charge>0\relax\edef\pgfspectra@writedata@element@charge{+\pgfspectra@writedata@element@charge}\fi%
+ \edef\pgfspectra@writedata@element@lines{\csname pgfspectra@table@data@lines@\@roman\x\endcsname}%
+ \immediate\write\pgfspectra@datafile{\pgfspectra@writedata@element@CS,\pgfspectra@writedata@element@charge,\pgfspectra@writedata@element@lines}%
+ }%
+ \fi%
+ }% end do
+\else% no names
+ \ifx\pgfspectra@last@dataset\undefined\relax%
+ \PackageError{pgfspectra}{\string\pgfspectrawrite: no data available! It must be first loaded with \string\pgfspectradata...}{}\relax%
+ \else%
+ \pgfspectra@countc=0\relax%
+ \expandafter\pgfspectra@table@get@data\pgfspectra@last@dataset\relax%
+ \foreach \x in {1,...,\pgfspectra@countc}{%
+ \edef\pgfspectra@writedata@element@CS{\csname pgfspectra@table@data@element@\@roman\x\endcsname}%
+ \edef\pgfspectra@writedata@element@charge{\csname pgfspectra@table@data@elementcharge@\@roman\x\endcsname}%
+ \ifnum\pgfspectra@writedata@element@charge>0\relax\edef\pgfspectra@writedata@element@charge{+\pgfspectra@writedata@element@charge}\fi%
+ \edef\pgfspectra@writedata@element@lines{\csname pgfspectra@table@data@lines@\@roman\x\endcsname}%
+ \immediate\write\pgfspectra@datafile{\pgfspectra@writedata@element@CS,\pgfspectra@writedata@element@charge,\pgfspectra@writedata@element@lines}%
+ }%
+ \fi%
+\fi%
+\immediate\closeout\pgfspectra@datafile%
+}% END \pgfspectrawrite
+% ----------------------------------------------------------------------------------------------------------
+%
+% ------------------- utils ---------------------------------------
+%
+\def\pgfspectra@table@get@data#1(+#2):#3;#4\relax{%
+\advance\pgfspectra@countc by1\relax%
+\expandafter\edef\csname pgfspectra@table@data@element@\@roman\pgfspectra@countc\endcsname{#1}%
+\expandafter\edef\csname pgfspectra@table@data@elementcharge@\@roman\pgfspectra@countc\endcsname{#2}%
+\expandafter\edef\csname pgfspectra@table@data@lines@\@roman\pgfspectra@countc\endcsname{#3}%
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#4}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\else%
+\expandafter\pgfspectra@table@get@data#4\relax%
+\fi%
+}%
+%
+\def\@pgfspectra@removeduplicates#1\relax{\ignorespaces%
+ \edef\@pgfspectra@list@@{BEGIN}%
+ \edef\@pgfspectra@lastwl{}%
+ \@for\@wlarg:=#1\do{%
+ \edef\@pgfspectra@currentwl{\@wlarg}%
+ \ifx\@pgfspectra@currentwl\@pgfspectra@lastwl\relax\else\edef\@pgfspectra@list@@{\@pgfspectra@list@@,\@wlarg}\fi%
+ \edef\@pgfspectra@lastwl{\@wlarg}%
+ }%end do
+ \expandafter\@pgfspectra@list@purge \@pgfspectra@list@@[@pgfspectra@list@@]\relax%
+}%
+\def\@pgfspectra@nmToA#1\relax{\ignorespaces% multiply by 10 using TeX trickery to overcome the maxdim (16383.99998pt)
+\expandafter\@pgfspectra@nmToA@hasDot#1.\relax%
+\ifnum\@pgfspectra@nmToA@dot=0\relax% no dot: add a zero
+ \edef\pgfspectra@wlformatted{#10}%
+\else% has dot: shift the dot 1 place to the right
+ \expandafter\@pgfspectra@nmToA@shiftDot#1\relax%
+\fi%
+}%
+\def\@pgfspectra@nmToA@hasDot#1.#2\relax{\ignorespaces%
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#2}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\edef\@pgfspectra@nmToA@dot{0}\else\edef\@pgfspectra@nmToA@dot{1}\fi%
+}%
+\def\@pgfspectra@nmToA@shiftDot#1.#2\relax{\ignorespaces%
+\expandafter\@pgfspectra@nmToA@i@ii#2\relax%
+\edef\pgfspectra@wlformatted{#1\@pgfspectra@nmToA@i\@pgfspectra@nmToA@ii}%
+}%
+\def\@pgfspectra@nmToA@i@ii#1#2\relax{\ignorespaces%
+\edef\pgfspectra@testa{}\edef\pgfspectra@testb{#2}%
+\edef\@pgfspectra@nmToA@i{#1}%
+\ifx\pgfspectra@testa\pgfspectra@testb\relax\edef\@pgfspectra@nmToA@ii{}%
+\else\edef\@pgfspectra@nmToA@ii{.#2}\fi%
+}%
+%
+\def\pgfsectra@data@info#1,#2,#3,#4,#5,#6/#7\relax{%
+%unit,begin,end,int,RS,RSinfo,RSinfowrite
+\edef\pgfspectra@table@info@unit{#1}%
+\edef\pgfspectra@table@info@begin{#2}%
+\edef\pgfspectra@table@info@end{#3}%
+\edef\pgfspectra@table@info@int{#4}%
+\edef\pgfspectra@table@info@RS{#5}%
+\edef\pgfsectra@data@info@testa{}\edef\pgfsectra@data@info@testb{#6}%
+\ifx\pgfsectra@data@info@testa\pgfsectra@data@info@testb\relax%
+\def\pgfspectra@table@info@RSinfo{}%
+\def\pgfspectra@write@info@RSinfo{}%
+\else%
+\def\pgfspectra@table@info@RSinfo{{\footnotesize\\ #6}}%
+\def\pgfspectra@write@info@RSinfo{#7}%
+\fi%
+}%
+\makeatother%
+\endinput