% -------------------------------------------------------------------------------------------------- % 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\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