% -------------------------------------------------------------------------- % the GHSYSTEM package % % globally harmonised system % % -------------------------------------------------------------------------- % Clemens Niederberger % -------------------------------------------------------------------------- % https://github.org/cgnieder/ghsystem/ % contact@mychemistry.eu % -------------------------------------------------------------------------- % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % -------------------------------------------------------------------------- % Copyright 2011--2020 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{ expl3, xparse, chemmacros } \ExplSyntaxOn \tl_const:Nn \c_ghsystem_version_tl {4.8c} \tl_const:Nn \c_ghsystem_date_tl {2020/02/17} \tl_const:Nn \c_ghsystem_info_tl {globally~ harmonised~ system} \ProvidesExplPackage {ghsystem} {\c_ghsystem_date_tl} {\c_ghsystem_version_tl} {\c_ghsystem_info_tl} % --------------------------------------------------------------------------- % % error and warning messages: \msg_new:nnn {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 . } \msg_new:nnn {ghsystem} {language-file} { You've~ tried~ to~ load~ the~ language~ file~ `#1'~ \msg_line_context: .~ However,~ you~ can~ only~ load~ language~ files~ in~ the~ preamble! } \msg_new:nnn {ghsystem} {booktabs} { 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. } \msg_new:nnn {ghsystem} {unknown-type} { The~ statement~ type~ `#1'~ \msg_line_context: \c_space_tl is~ unkown.~ Valid~ types~ are~ `H',~ `EUH',~ and~ `P'. } % -------------------------------------------------------------------------- % package options: \keys_define:nn {ghsystem} { % TODO % strict .bool_set:N = \l__ghsystem_strict_bool , % strict .default:n = true , language .code:n = \ghsystem_load_languages:n {#1} } % --------------------------------------------------------------------------- % % variants of kernel functions: \cs_generate_variant:Nn \file_if_exist:nTF {x} \cs_generate_variant:Nn \prop_put:Nnn {cx} \cs_generate_variant:Nn \prop_get:NnNTF {cx} \cs_generate_variant:Nn \str_case:nnF {V} % --------------------------------------------------------------------------- % % 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 % load required packages: \RequirePackage { translations , siunitx , graphicx , 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: {} \cs_new:Npn \ghsystem_dash: { \tex_penalty:D 10000 \scan_stop: - \skip_horizontal:N \c_zero_skip } \cs_new:Npn \ghsystem_slash: { \tex_penalty:D 10000 \scan_stop: / \skip_horizontal:N \c_zero_skip } \cs_new_protected:Npn \ghsystem_filler:n #1 { \emph { $\langle$ #1 $\rangle$ } } \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 \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 % TODO: implement usage: \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 } \tl_new:N \l__ghsystem_list_all_column_format_tl \dim_new:N \l__ghsystem_list_all_column_width_dim \AtBeginDocument{ \dim_set:Nn \l__ghsystem_list_all_column_width_dim { .7\linewidth } } \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 \tl_const:Nn \c__ghsystem_definition_file_prefix_tl {ghsystem} \tl_const:Nn \c__ghsystem_definition_file_extension_tl {def} \tl_new:N \l_ghsystem_current_language_file_tl \str_new:N \l_ghsystem_current_language_str \seq_new:N \g__ghsystem_loadad_languages_seq \cs_new_protected:Npn \__ghsystem_language_file:nn #1#2 { \ProvidesFile { \c__ghsystem_definition_file_prefix_tl _ #1 . \c__ghsystem_definition_file_extension_tl } [#2] \ExplSyntaxOn \tl_set:Nn \l_ghsystem_current_language_file_tl {#1} } \NewDocumentCommand \ghsystemlanguagefile {mm} { \__ghsystem_language_file:nn {#1} {#2} } % prop % number % statement \cs_new_protected:Npn \ghsystem_add_statement:nnn #1#2#3 { \prop_put:cxn {l__ghsystem_ \str_lowercase:n {#1} _prop} {\l_ghsystem_current_language_file_tl-#2} {#3} } \cs_new_protected:Npn \__ghsystem_load_language:n #1 { \seq_gput_right:Nn \g__ghsystem_loadad_languages_seq {#1} \str_set:Nn \l_ghsystem_current_language_str {#1} \@onefilewithoptions {\c__ghsystem_definition_file_prefix_tl _ #1} [][] \c__ghsystem_definition_file_extension_tl } \cs_generate_variant:Nn \__ghsystem_load_language:n {V} \cs_generate_variant:Nn \file_if_exist:nTF {V} \cs_new_protected:Npn \__ghsystem_load_language_file:n #1 { \tl_set:Nx \l__ghsystem_tmpa_tl { \@trnslt@language {#1} } \file_if_exist:nTF { \c__ghsystem_definition_file_prefix_tl _ \l__ghsystem_tmpa_tl . \c__ghsystem_definition_file_extension_tl } { \__ghsystem_load_language:V \l__ghsystem_tmpa_tl } { \tl_set:Nx \l__ghsystem_tmpa_tl { \baselanguage {#1} } \file_if_exist:nTF { \c__ghsystem_definition_file_prefix_tl _ \l__ghsystem_tmpa_tl . \c__ghsystem_definition_file_extension_tl } { \__ghsystem_load_language:V \l__ghsystem_tmpa_tl } { \errorTODO } } } \cs_new_protected:Npn \ghsystem_load_language_file:n #1 { \ghsystem_if_language_file_loaded:nF {#1} { \cs_if_eq:NNTF \@onefilewithoptions\@notprerr { \msg_error:nnn {ghsystem} {language-file} {#1} } { \__ghsystem_load_language_file:n {#1} } } } \cs_generate_variant:Nn \ghsystem_load_language_file:n { V } \prg_new_protected_conditional:Npnn \ghsystem_if_language_file_loaded:n #1 {T,F,TF} { \seq_if_in:NxTF \g__ghsystem_loadad_languages_seq { \@trnslt@language {#1} } { \prg_return_true: } { \seq_if_in:NxTF \g__ghsystem_loadad_languages_seq { \baselanguage {#1} } { \prg_return_true: } { \prg_return_false: } } } % TODO: an neuen Mechanismus anpassen: \cs_new_protected:Npn \ghsystem_load_language:n #1 { \ghsystem_if_language_file_loaded:nF {#1} { \ghsystem_load_language_file:n {#1} } \bool_set_true:N \l__ghsystem_language_file_loaded_bool } \cs_generate_variant:Nn \ghsystem_load_language:n { V } \cs_new_protected:Npn \ghsystem_load_languages:n #1 { \clist_map_inline:nn {#1} { \ghsystem_load_language:n {##1} } } % \NewDocumentCommand \loadghsystemlanguage {m} % { \ghsystem_load_language:n {#1} } % \NewDocumentCommand \loadghsystemlanguages {m} % { \ghsystem_load_languages:n {#1} } \AtBeginDocument{ \bool_if:NF \l__ghsystem_language_file_loaded_bool { \cs_if_exist:NTF \l_chemmacros_language_tl { \ghsystem_load_language:V \l_chemmacros_language_tl } { \ghsystem_load_language:n { \@trnslt@language {\@trnslt@current@language} } } } } \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 {ghsystem} { % \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_set:Nn \l__ghsystem_picture_scale_fp { #1 * \l__ghsystem_picture_scale_fp } , 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 , table-column-format .tl_set:N = \l__ghsystem_list_all_column_format_tl , table-column-width .dim_set:N = \l__ghsystem_list_all_column_width_dim } % --------------------------------------------------------------------------- % % 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 {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:cxNTF { l__ghsystem_ \l__ghsystem_tmpa_tl _prop } {\l_ghsystem_current_language_str - #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 } } { \msg_error:nnnn {ghsystem} {statements} {#1} {#2} } } \cs_new_protected:Nn \__ghsystem_get_type:nN { \tl_set:Nx #2 { \str_lowercase:n {#1} } \str_case:VnF #2 { {h} {} {p} {} {euh} {} } { \msg_error:nnn {ghsystem} {unknown-type} {#2} } } \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 { \text_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 } { \text_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 { \text_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 { \text_uppercase:n {#1} \tl_use:N \l__ghsystem_number_space_tl #2 ~ + ~ \text_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 {ghsystem} {#1} } \ghsystem_list_all: \group_end: } % TODO: an neue Sprachauswahl anpassen: \cs_new_protected:Npn \ghsystem_list_all: { \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 \extrarowheight \l__ghsystem_table_line_sep_dim \begin {longtable} { @{} p{ \dim_eval:n { \linewidth -\tabcolsep -\LTpre - \LTpost -\l__ghsystem_list_all_column_width_dim } } >{ \l__ghsystem_list_all_column_format_tl } p{ \l__ghsystem_list_all_column_width_dim } @{} } \caption [ \l_ghsystem_table_caption_short_tl ] { \l_ghsystem_table_caption_tl \exp_args:NV \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_if_statement_in_current_language:nT {##1} { \__ghsystem_read_number:nn {H} {##1} & ##2 \\ } } \prop_map_inline:Nn \l__ghsystem_euh_prop { \ghsystem_if_statement_in_current_language:nT {##1} { \__ghsystem_read_number:nn {EUH} {##1} & ##2 \\ } } \int_zero:N \l__ghsystem_tmpa_int \prop_map_inline:Nn \l__ghsystem_p_prop { \ghsystem_if_statement_in_current_language:nT {##1} { \int_gincr:N \l__ghsystem_tmpa_int } } \int_zero:N \l__ghsystem_tmpb_int \prop_map_inline:Nn \l__ghsystem_p_prop { \ghsystem_if_statement_in_current_language:nT {##1} { \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 {longtable} } \prg_new_protected_conditional:Npnn \ghsystem_if_statement_in_current_language:n #1 {T,F,TF} { % is it safe to check str with \tl_ functions? interface3 seems to % implicate it… \tl_if_in:nVTF {#1} \l_ghsystem_current_language_str { \prg_return_true: } { \prg_return_false: } } \cs_generate_variant:Nn \tl_if_in:nnTF {nV} \cs_new_protected: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 \__ghsystem_extract_number:n {#2} } } \cs_new_protected:Npn \__ghsystem_read_number_aux_i:w #1,#2+#3\q_stop { #1 \tl_use:N \l__ghsystem_number_space_tl \__ghsystem_extract_number:n {#2} \c_space_tl + \c_space_tl \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 } \cs_new_protected:Npn \__ghsystem_extract_number:n #1 { \exp_after:wN \cs_set:Npn \exp_after:wN \__ghsystem_extract_number_aux:w \l_ghsystem_current_language_str - ##1 \q_stop {##1} \__ghsystem_extract_number_aux:w #1 \q_stop } % --------------------------------------------------------------------------- % % the picture command % \ghspic[]{} % % test for compilation engine/mode: \sys_if_engine_pdftex:T { \ifpdf \tl_set:Nn \l__ghsystem_picture_type_tl {pdf} \else \tl_set:Nn \l__ghsystem_picture_type_tl {eps} \fi } \sys_if_engine_xetex:T { \tl_set:Nn \l__ghsystem_picture_type_tl {pdf} } \sys_if_engine_luatex:T { \tl_set:Nn \l__ghsystem_picture_type_tl {pdf} } % the command: \NewDocumentCommand \ghspic {om} { \group_begin: \IfNoValueF {#1} { \keys_set:nn {ghsystem} {#1} } \ghsystem_pic:n {#2} \group_end: } \cs_new_protected:Npn \ghsystem_pic:n #1 { \__ghsystem_includegraphics:xn { scale = \fp_to_tl:N \l__ghsystem_picture_scale_fp \exp_not:V \l__ghsystem_picture_includegraphics_tl } { ghsystem_ #1 . \l__ghsystem_picture_type_tl } } \cs_new:Nn \__ghsystem_includegraphics:nn { \includegraphics[#1]{#2} } \cs_generate_variant:Nn \__ghsystem_includegraphics:nn { xn } % -------------------------------------------------------------------------- % options and setup \cs_new_protected:Npn \ghsystem_setup:n #1 { \keys_set:nn {ghsystem} {#1} } \NewDocumentCommand \ghssetup {m} { \ghsystem_setup:n {#1} } \chemmacros_load_module:n {nomenclature} \cs_generate_variant:Nn \chemmacros_integrate_package:nnn {nnV} \chemmacros_integrate_package:nnV {} {ghsystem} \c_ghsystem_date_tl \file_input_stop: % -------------------------------------------------------------------------- VERSION HISTORY 2012/01/30 - version 3.0a - renamed ghs => ghsystem to make the names unique (following a request by Karl Berry for TeXlive) 2012/02/05 - version 3.0c - renamed pictogram files (following a request by Karl Berry for TeXlive) 2012/05/13 - version 3.3a - Italian translations of the H, EUH and P statements, thanks to Jonas Rivetti 2012/05/18 - version 3.3b - compatibility with MiKTeX 2012/05/18 - version 3.3c - fix in the `ghsystem/language' option 2012/07/24 - version 3.3d - additional picture file type `pdf' 2013/02/19 - version 3.5a - bug fix: `ghsystem' recognizes language again 2013/07/06 - version 4.0 - dropped requirement of `tabu' package. - new options `table-column-width' and `table-column-format' - adapted to changed language setting mechanism in `chemmacros' - new command: \loadghsystemlanguage - the package can be used independently from `chemmacros' 2013/12/13 - version 4.0a - small changes to `ghsystem_german.def' - added \ghsystem_dash: and \ghsystem_slash: 2014/01/09 - version 4.2e - bug fix: namespace after language file loading properly restored 2014/04/08 - version 4.5 - small changes in `ghsystem_italian.def' 2014/04/13 - version 4.5a - added Spanish translations, thanks to Ignacio Fernández Galván 2014/06/30 - version 4.5b - adapt to deprecated expl3 function 2014/08/08 - version 4.6 - split from `chemmacros' bundle as independent package 2016/01/15 - version 4.7 - adapt to changes in expl3 - adapt to v5 of chemmacros - small changes to table preamble in \ghslistall - set table column width of \ghslistall at begin document when we can be sure \linewidth has a proper value 2016/07/16 - version 4.8 - French translations, thanks to Bréal Frédéric and Beaude Aurélien 2019/09/30 - version 4.8a - add \l_ghsystem_table_next_page_tl to the template and the French translations 2020/01/16 - version 4.8b - adapt to renaming of case changing functions 2020/02/17 - version 4.8c - resolve bug with French and Lua- or XeLaTeX