% --------------------------------------------------------------------------------------------------
% 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\
[email protected] 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@
[email protected]##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@
[email protected]#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