%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % --------------------------------------------------------------------------- % % - the CHEMMACROS bundle - % % - ghsystem.sty - % % - macros and commands for chemists - % % --------------------------------------------------------------------------- % % - Clemens Niederberger - % % --------------------------------------------------------------------------- % % - https://bitbucket.org/cgnieder/chemmacros/ - % % - contact@mychemistry.eu - % % --------------------------------------------------------------------------- % % - If you have any ideas, questions, suggestions or bugs to report, please - % % - feel free to contact me. - % % --------------------------------------------------------------------------- % % - Copyright 2011-2013 Clemens Niederberger - % % - - % % - This work may be distributed and/or modified under the - % % - conditions of the LaTeX Project Public License, either version 1.3 - % % - of this license or (at your option) any later version. - % % - The latest version of this license is in - % % - http://www.latex-project.org/lppl.txt - % % - and version 1.3 or later is part of all distributions of LaTeX - % % - version 2005/12/01 or later. - % % - - % % - This work has the LPPL maintenance status `maintained'. - % % - - % % - The Current Maintainer of this work is Clemens Niederberger. - % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \RequirePackage{ chemmacros } \ProvidesExplPackage {ghsystem} {\chemmacros@date} {\chemmacros@version} {globally harmonised system} % --------------------------------------------------------------------------- % % error and warning messages: \msg_set:nnnn { ghsystem } { explicit } { It~seems~you've~loaded~`ghsystem'~explicitly. } { It~seems~you've~loaded~`ghsystem'~explicitly.~This~should~work~but~the~ recommended~way~is~to~load~it~via~the~bundle,~i.e.~by~using~ \token_to_str:N \usepackage \{ chemmacros \}. } \msg_set:nnnn { ghsystem } { statements } { You've~tried~to~call~statement~#1#2~ \msg_line_context: \c_space_tl but~it~ it~is~not~defined~in~ghsystem.sty . } { You've~tried~to~call~statement~#1#2~ \msg_line_context: \c_space_tl but~it~ it~is~not~defined~in~ghsystem.sty . ~ Are~you~sure~it~exists? ~ If~so~please ~send~a~message~to~the~author.~Thanks. } \msg_set:nnnn { ghsystem } { booktabs } { Package~`booktabs'~missing~\msg_line_context: . } { Option~#1~of~the~\token_to_str:N \ghslistall \c_space_tl command~ \msg_line_context: \c_space_tl needs~the~`booktabs'~package . ~Please~make~ sure~to~load~it~in~your~preamble. } % --------------------------------------------------------------------------- % % scratch variables \tl_new:N \l__ghsystem_tmpa_tl \tl_new:N \l__ghsystem_tmpb_tl \int_new:N \l__ghsystem_tmpa_int \int_new:N \l__ghsystem_tmpb_int % --------------------------------------------------------------------------- % % gobble options \DeclareOption* { } \ProcessOptions \scan_stop: % load required packages: \RequirePackage{ graphicx , tabu , longtable , ifpdf } % --------------------------------------------------------------------------- % % define variables: \prop_new:N \l__ghsystem_h_prop \prop_new:N \l__ghsystem_euh_prop \prop_new:N \l__ghsystem_p_prop \cs_new:Npn \ghsystem_exposure: {} \cs_new:Npn \ghsystem_effect: {} \cs_new:Npn \ghsystem_organs: {} \cs_new:Npn \ghsystem_substance: {} \cs_new:Npn \ghsystem_text: {} \bool_new:N \l__ghsystem_fill_in_bool \bool_new:N \l__ghsystem_show_number_bool \bool_new:N \l__ghsystem_substance_bool \bool_new:N \l__ghsystem_organs_bool \bool_new:N \l__ghsystem_hide_statement_bool \bool_new:N \l__ghsystem_engine_pdftex_bool \bool_new:N \l__ghsystem_engine_xetex_bool \bool_new:N \l__ghsystem_engine_luatex_bool \tl_new:N \l__ghsystem_number_space_tl \tl_new:N \l__ghsystem_celsius_temperature_tl \tl_new:N \l__ghsystem_fahrenheit_temperature_tl \tl_new:N \l__ghsystem_kg_mass_tl \tl_new:N \l__ghsystem_lbs_mass_tl \tl_new:N \l__ghsystem_dots_tl \tl_set:Nn \l__ghsystem_dots_tl { \ldots } \tl_new:N \l__ghsystem_picture_scale_default_tl \tl_set:Nn \l__ghsystem_picture_scale_default_tl { .05 } \tl_new:N \l__ghsystem_picture_scale_tl \tl_set_eq:NN \l__ghsystem_picture_scale_tl \l__ghsystem_picture_scale_default_tl \tl_new:N \l__ghsystem_picture_includegraphics_tl \tl_new:N \l__ghsystem_picture_type_tl \tl_new:N \l__ghsystem_identifier_tl \tl_new:N \l__ghsystem_table_text_tl \tl_new:N \l__ghsystem_table_next_page_tl \tl_new:N \l__ghsystem_table_head_rule_tl \tl_set:Nn \l__ghsystem_table_head_rule_tl { \hline } \tl_new:N \l__ghsystem_table_top_head_rule_tl \tl_set:Nn \l__ghsystem_table_top_head_rule_tl { \hline } \tl_new:N \l__ghsystem_table_foot_rule_tl \tl_set:Nn \l__ghsystem_table_foot_rule_tl { \hline } \tl_new:N \l__ghsystem_table_last_foot_rule_tl \tl_set:Nn \l__ghsystem_table_last_foot_rule_tl { \hline } \tl_new:N \l__ghsystem_table_caption_tl \tl_new:N \l__ghsystem_table_caption_short_tl \tl_new:N \l__ghsystem_table_label_tl \tl_set:Nn \l__ghsystem_table_label_tl { tab : ghs-hp-statements } \dim_new:N \l__ghsystem_table_line_sep_dim \dim_set:Nn \l__ghsystem_table_line_sep_dim { 3pt } \fp_new:N \l__ghsystem_picture_scale_fp \fp_set:Nn \l__ghsystem_picture_scale_fp { \l__ghsystem_picture_scale_tl } \DeclareSIUnit { \GHSfahrenheit } { \SIUnitSymbolDegree F } \DeclareSIUnit { \GHScelsius } { \SIUnitSymbolDegree C } \DeclareSIUnit { \GHSkilogram } { kg } \DeclareSIUnit { \GHSpounds } { lbs } % language settings \bool_new:N \l__ghsystem_language_file_loaded_bool \bool_new:N \l__ghsystem_language_directory_bool \file_if_exist:nTF { language / ghsystem_english_def } { \bool_set_true:N \l__ghsystem_language_directory_bool } { \bool_set_false:N \l__ghsystem_language_directory_bool } \bool_if:NTF \l__ghsystem_language_directory_bool { \prop_map_inline:Nn \l__chemmacros_language_prop { \bool_if:cT { l__chemmacros_#1_bool } { \file_if_exist:nTF { language / ghsystem_#2.def } { \bool_set_true:N \l__ghsystem_language_file_loaded_bool \input { language / ghsystem_#2.def } \ExplSyntaxOn } { \input { language / ghsystem_english.def } \ExplSyntaxOn } } } } { \prop_map_inline:Nn \l__chemmacros_language_prop { \bool_if:cT { l__chemmacros_#1_bool } { \file_if_exist:nTF { ghsystem_#2.def } { \bool_set_true:N \l__ghsystem_language_file_loaded_bool \input { ghsystem_#2.def } \ExplSyntaxOn } { \input { ghsystem_english.def } \ExplSyntaxOn } } } } \bool_if:NF \l__ghsystem_language_file_loaded_bool { \bool_if:NTF \l__ghsystem_language_directory_bool { \input { language / ghsystem_english.def } \ExplSyntaxOn } { \input { ghsystem_english.def } \ExplSyntaxOn } } \cs_new_nopar:Nn \ghsystem_booktabs:n { \cs_if_exist:cF { ver@booktabs.sty } { \msg_error:nnx { ghsystem } { booktabs } { #1 } } } % --------------------------------------------------------------------------- % % define options: \keys_define:nn { chemmacros / ghsystem } { % general options: language .code:n = \bool_set_true:c { l__ghsystem_#1_bool } \bool_if:NTF \l__ghsystem_language_directory_bool { \input { language / ghsystem_#1.def } } { \input { ghsystem_#1.def } } , % \ghs options: hide .bool_set:N = \l__ghsystem_hide_statement_bool , hide .default:n = true , fill-in .bool_set:N = \l__ghsystem_fill_in_bool , fill-in .default:n = true , exposure .code:n = \cs_set:Npn \ghsystem_exposure: { ~ #1 } , effect .code:n = \cs_set:Npn \ghsystem_effect: { ~ #1 } , organs .code:n = \bool_set_true:N \l__ghsystem_organs_bool \cs_set:Npn \ghsystem_organs: { ~ #1 } , substance .code:n = \bool_set_true:N \l__ghsystem_substance_bool \cs_set:Npn \ghsystem_substance: { ~ #1 } , text .code:n = \cs_set:Npn \ghsystem_text: { ~ #1 } , space .tl_set:N = \l__ghsystem_number_space_tl , C-temperature .tl_set:N = \l__ghsystem_celsius_temperature_tl , F-temperature .tl_set:N = \l__ghsystem_fahrenheit_temperature_tl , kg-mass .tl_set:N = \l__ghsystem_kg_mass_tl , lbs-mass .tl_set:N = \l__ghsystem_lbs_mass_tl , dots .tl_set:N = \l__ghsystem_dots_tl , % \ghspic options: scale .code:n = \fp_mul:Nn \l__ghsystem_picture_scale_fp { #1 } , includegraphics .code:n = \tl_set:Nn \l__ghsystem_picture_includegraphics_tl { , #1 } , pic-type .choices:nn = { eps , jpg , png , pdf } { \tl_set_eq:NN \l__ghsystem_picture_type_tl \l_keys_choice_tl } , % \ghslistall options: table-head-number .tl_set:N = \l__ghsystem_identifier_tl , table-head-text .tl_set:N = \l__ghsystem_table_text_tl , table-next-page .tl_set:N = \l__ghsystem_table_next_page_tl , table-row-sep .dim_set:N = \l__ghsystem_table_line_sep_dim , table-head-rule .choice: , table-head-rule / default .code:n = \tl_set:Nn \l__ghsystem_table_head_rule_tl { \hline } , table-head-rule / booktabs .code:n = \ghsystem_booktabs:n { table-head-rule } \tl_set:Nn \l__ghsystem_table_head_rule_tl { \midrule } , table-head-rule / none .code:n = \tl_clear:N \l__ghsystem_table_head_rule_tl , table-top-head-rule .choice: , table-top-head-rule / default .code:n = \tl_set:Nn \l__ghsystem_table_top_head_rule_tl { \hline } , table-top-head-rule / booktabs .code:n = \ghsystem_booktabs:n { table-top-head-rule } \tl_set:Nn \l__ghsystem_table_top_head_rule_tl { \toprule } , table-top-head-rule / none .code:n = \tl_clear:N \l__ghsystem_table_top_head_rule_tl , table-foot-rule .choice: , table-foot-rule / default .code:n = \tl_set:Nn \l__ghsystem_table_foot_rule_tl { \hline } , table-foot-rule / booktabs .code:n = \ghsystem_booktabs:n { table-foot-rule } \tl_set:Nn \l__ghsystem_table_foot_rule_tl { \midrule } , table-foot-rule / none .code:n = \tl_clear:N \l__ghsystem_table_foot_rule_tl , table-last-foot-rule .choice: , table-last-foot-rule / default .code:n = \tl_set:Nn \l__ghsystem_table_last_foot_rule_tl { \hline } , table-last-foot-rule / booktabs .code:n = \ghsystem_booktabs:n { table-last-foot-rule } \tl_set:Nn \l__ghsystem_table_last_foot_rule_tl { \bottomrule } , table-last-foot-rule / none .code:n = \tl_clear:N \l__ghsystem_table_last_foot_rule_tl , table-rules .choice: , table-rules / default .code:n = \tl_set:Nn \l__ghsystem_table_head_rule_tl { \hline } \tl_set:Nn \l__ghsystem_table_top_head_rule_tl { \hline } \tl_set:Nn \l__ghsystem_table_foot_rule_tl { \hline } \tl_set:Nn \l__ghsystem_table_last_foot_rule_tl { \hline } , table-rules / booktabs .code:n = \ghsystem_booktabs:n { table-rules } \tl_set:Nn \l__ghsystem_table_head_rule_tl { \midrule } \tl_set:Nn \l__ghsystem_table_top_head_rule_tl { \toprule } \tl_set:Nn \l__ghsystem_table_foot_rule_tl { \midrule } \tl_set:Nn \l__ghsystem_table_last_foot_rule_tl { \bottomrule } , table-rules / none .code:n = \tl_clear:N \l__ghsystem_table_head_rule_tl \tl_clear:N \l__ghsystem_table_top_head_rule_tl \tl_clear:N \l__ghsystem_table_foot_rule_tl \tl_clear:N \l__ghsystem_table_last_foot_rule_tl , table-caption .tl_set:N = \l__ghsystem_table_caption_tl , table-caption-short .tl_set:N = \l__ghsystem_table_caption_short_tl , table-label .tl_set:N = \l__ghsystem_table_label_tl } % --------------------------------------------------------------------------- % % the main command for getting the H/EUH/P statements % \ghs{}{} % \ghs*{}{} : type without number % \NewDocumentCommand \ghs { somm } { \group_begin: \IfBooleanF { #1 } { \bool_set_true:N \l__ghsystem_show_number_bool } \IfNoValueF { #2 } { \keys_set:nn { chemmacros / ghsystem } { #2 } } \ghsystem_read_args:nn { #3 } { #4 } \group_end: } \cs_new:Nn \ghsystem_read_args:nn { \ghsystem_get_type:nN { #1 } \l__ghsystem_tmpa_tl \prop_get:cnNTF { l__ghsystem_ \l__ghsystem_tmpa_tl _prop } { #2 } \l__ghsystem_tmpb_tl { \ghsystem_is_combination:nn { #1 } { #2 } \bool_if:NF \l__ghsystem_hide_statement_bool { \tl_use:N \l__ghsystem_tmpb_tl } } { \chemmacros_msg:nnxx { ghsystem } { statements } { #1 } { #2 } } } \cs_new:Nn \ghsystem_get_type:nN { \tl_if_eq:nnT { #1 } { h } { \tl_set:Nn #2 { h } } \tl_if_eq:nnT { #1 } { H } { \tl_set:Nn #2 { h } } \tl_if_eq:nnT { #1 } { euh } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { Euh } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { euH } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { eUh } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { EUh } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { EuH } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { eUH } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { EUH } { \tl_set:Nn #2 { euh } } \tl_if_eq:nnT { #1 } { p } { \tl_set:Nn #2 { p } } \tl_if_eq:nnT { #1 } { P } { \tl_set:Nn #2 { p } } } \cs_new:Nn \ghsystem_is_combination:nn { \tl_if_in:nnTF { #2 } { + } { \ghsystem_is_combination_aux_i:w #1,#2 \q_stop } { \ghsystem_is_combination_aux_ii:w #1,#2 \q_stop } } \cs_new:Npn \ghsystem_is_combination_aux_i:w #1,#2+#3 \q_stop { \bool_if:NT \l__ghsystem_show_number_bool { \tl_to_uppercase:n { #1 } \tl_use:N \l__ghsystem_number_space_tl #2 ~ + ~ \tl_if_in:nnTF { #3 } { + } { \ghsystem_is_combination_aux_iii:w #1,#3 \q_stop } { \tl_to_uppercase:n { #1 } \tl_use:N \l__ghsystem_number_space_tl #3 \bool_if:NF \l__ghsystem_hide_statement_bool { : ~ } } } } \cs_new:Npn \ghsystem_is_combination_aux_ii:w #1,#2 \q_stop { \bool_if:NT \l__ghsystem_show_number_bool { \tl_to_uppercase:n { #1 } \tl_use:N \l__ghsystem_number_space_tl #2 \bool_if:NF \l__ghsystem_hide_statement_bool { : ~ } } } \cs_new:Npn \ghsystem_is_combination_aux_iii:w #1,#2+#3 \q_stop { \bool_if:NT \l__ghsystem_show_number_bool { \tl_to_uppercase:n { #1 } \tl_use:N \l__ghsystem_number_space_tl #2 ~ + ~ \tl_to_uppercase:n { #1 } \tl_use:N \l__ghsystem_number_space_tl #3 \bool_if:NF \l__ghsystem_hide_statement_bool { : ~ } } } % --------------------------------------------------------------------------- % % list all statements in a table % \NewDocumentCommand \ghslistall { o } { \group_begin: \IfNoValueF { #1 } { \keys_set:nn { chemmacros / ghsystem } { #1 } } \int_zero:N \l__ghsystem_tmpa_int \int_zero:N \l__ghsystem_tmpb_int \prop_map_inline:Nn \l__ghsystem_p_prop { \int_incr:N \l__ghsystem_tmpa_int } \dim_set_eq:NN \tabulinesep \l__ghsystem_table_line_sep_dim \begin { longtabu } { X[3]X[7,L] } \caption [ \l__ghsystem_table_caption_short_tl ] { \l__ghsystem_table_caption_tl \exp_args:No \label { \l__ghsystem_table_label_tl } } \\ \l__ghsystem_table_top_head_rule_tl \textbf { \l__ghsystem_identifier_tl } & \textbf { \l__ghsystem_table_text_tl } \\ \l__ghsystem_table_head_rule_tl \endfirsthead \l__ghsystem_table_top_head_rule_tl \textbf { \l__ghsystem_identifier_tl } & \textbf { \l__ghsystem_table_text_tl } \\ \l__ghsystem_table_head_rule_tl \endhead \l__ghsystem_table_last_foot_rule_tl \multicolumn{2}{r} { \textit { \l__ghsystem_table_next_page_tl } } \endfoot \l__ghsystem_table_foot_rule_tl \multicolumn{2}{r} { } \endlastfoot \prop_map_inline:Nn \l__ghsystem_h_prop { \ghsystem_read_number:nn { H } { ##1 } & ##2 \\ } \prop_map_inline:Nn \l__ghsystem_euh_prop { \ghsystem_read_number:nn { EUH } { ##1 } & ##2 \\ } \int_zero:N \l__ghsystem_tmpa_int \prop_map_inline:Nn \l__ghsystem_p_prop { \int_gincr:N \l__ghsystem_tmpa_int } \int_zero:N \l__ghsystem_tmpb_int \prop_map_inline:Nn \l__ghsystem_p_prop { \int_gincr:N \l__ghsystem_tmpb_int \ghsystem_read_number:nn { P } { ##1 } & ##2 \int_compare:nNnT { \l__ghsystem_tmpb_int } < { \l__ghsystem_tmpa_int } { \\ } } \end { longtabu } \group_end: } \cs_new:Nn \ghsystem_read_number:nn { \tl_if_in:nnTF { #2 } { + } { \ghsystem_read_number_aux_i:w #1 , #2 \q_stop } { #1 \tl_use:N \l__ghsystem_number_space_tl #2 } } \cs_new:Npn \ghsystem_read_number_aux_i:w #1,#2+#3\q_stop { #1 \tl_use:N \l__ghsystem_number_space_tl #2 ~+~ \tl_if_in:nnTF { #3 } { + } { \ghsystem_read_number_aux_ii:w #1,#3 \q_stop } { #1#3 } } \cs_new:Npn \ghsystem_read_number_aux_ii:w #1,#2+#3\q_stop { #1#2 ~+~ #1#3 } % --------------------------------------------------------------------------- % % the picture command % \ghspic[]{} % % test for compilation engine/mode: \pdftex_if_engine:T { \bool_set_true:N \l__ghsystem_engine_pdftex_bool } \xetex_if_engine:T { \bool_set_true:N \l__ghsystem_engine_xetex_bool } \luatex_if_engine:T { \bool_set_true:N \l__ghsystem_engine_luatex_bool } \bool_new:N \l__ghsystem_picture_directory_bool \bool_if:NT \l__ghsystem_engine_pdftex_bool { \ifpdf \tl_set:Nn \l__ghsystem_picture_type_tl { pdf } \else \tl_set:Nn \l__ghsystem_picture_type_tl { eps } \fi } \bool_if:NT \l__ghsystem_engine_xetex_bool { \tl_set:Nn \l__ghsystem_picture_type_tl { pdf } } \bool_if:NT \l__ghsystem_engine_luatex_bool { \tl_set:Nn \l__ghsystem_picture_type_tl { pdf } } % the command: \NewDocumentCommand \ghspic { om } { \file_if_exist:nTF { pictures / ghsystem_ #2 . \l__ghsystem_picture_type_tl } { \bool_set_true:N \l__ghsystem_picture_directory_bool } { \bool_set_false:N \l__ghsystem_picture_directory_bool } \group_begin: \IfNoValueF { #1 } { \keys_set:nn { chemmacros / ghsystem } { #1 } } \bool_if:NTF \l__ghsystem_picture_directory_bool { \ghsystem_includegraphics:xn { scale = \fp_to_tl:N \l__ghsystem_picture_scale_fp \l__ghsystem_picture_includegraphics_tl } { pictures / ghsystem_ #2 . \l__ghsystem_picture_type_tl } } { \ghsystem_includegraphics:xn { scale = \fp_to_tl:N \l__ghsystem_picture_scale_fp \l__ghsystem_picture_includegraphics_tl } { ghsystem_ #2 . \l__ghsystem_picture_type_tl } } \group_end: } \cs_new:Nn \ghsystem_includegraphics:nn { \includegraphics[#1]{#2} } \cs_generate_variant:Nn \ghsystem_includegraphics:nn { xn } \tex_endinput:D %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% VERSION HISTORY see the chemmacros.sty file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % TODO: - add option to switch between `longtable` and `supertabular` for \ghslistall ?