%% %% This is file `projlib-language.sty', %% generated with the docstrip utility. %% %% Copyright (C) 2021-2022 by Jinwen XU %% %% This is part of the ProjLib Toolkit. %% %% This work may be distributed and/or modified under the conditions of the %% LaTeX Project Public License, either version 1.3c 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.3c or later is part of all distributions of LaTeX version %% 2005/12/01 or later. %% \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage {projlib-language} {2022/08/05} {} {Multi-language configuration} \clist_const:Nn \c__projlib_language_supported_clist { english , french , ngerman , italian , portuguese , brazilian , spanish , schinese , tchinese , japanese , russian , } \clist_new:N \g__projlib_language_babel_option_clist \str_new:N \g__projlib_language_main_str \bool_new:N \g__projlib_language_enabled_all_bool \bool_gset_true:N \g__projlib_language_enabled_all_bool \clist_map_inline:Nn \c__projlib_language_supported_clist { \bool_new:c { g__projlib_language_enabled_ #1 _bool } \bool_gset_false:c { g__projlib_language_enabled_ #1 _bool } } \cs_new:Nn \projlib_language_set_option_no_babel:n { \bool_gset_false:N \g__projlib_language_enabled_all_bool \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool } \str_if_empty:NT \g__projlib_language_main_str { \str_gset:Nn \g__projlib_language_main_str { #1 } } } \cs_new:Nn \projlib_language_set_option:n { \projlib_language_set_option_no_babel:n { #1 } \clist_gput_left:Nn \g__projlib_language_babel_option_clist { #1 } } \keys_define:nn { projlib-language } { , EN .meta:n = { english } , english .code:n = { \projlib_language_set_option:n { english } } , English .meta:n = { english } , FR .meta:n = { french } , french .code:n = { \projlib_language_set_option:n { french } } , French .meta:n = { french } , DE .meta:n = { ngerman } , german .meta:n = { ngerman } , ngerman .code:n = { \projlib_language_set_option:n { ngerman } } , German .meta:n = { ngerman } , IT .meta:n = { italian } , italian .code:n = { \projlib_language_set_option:n { italian } } , Italian .meta:n = { italian } , PT .meta:n = { portuguese } , portuguese .code:n = { \projlib_language_set_option:n { portuguese } } , Portuguese .meta:n = { portuguese } , BR .meta:n = { brazilian } , brazilian .code:n = { \projlib_language_set_option:n { brazilian } } , Brazilian .meta:n = { brazilian } , ES .meta:n = { spanish } , spanish .code:n = { \clist_gput_left:Nn \g__projlib_language_babel_option_clist { es-notilde, es-noquoting } \projlib_language_set_option:n { spanish } } , Spanish .meta:n = { spanish } , CN .meta:n = { schinese } , SC .meta:n = { schinese } , chinese .meta:n = { schinese } , schinese .code:n = { \projlib_language_set_option_no_babel:n { schinese } } , simplified-chinese .meta:n = { schinese } , simplified~chinese .meta:n = { schinese } , simplified chinese .meta:n = { schinese } , Chinese .meta:n = { schinese } , SChinese .meta:n = { schinese } , Simplified-Chinese .meta:n = { schinese } , Simplified~Chinese .meta:n = { schinese } , Simplified Chinese .meta:n = { schinese } , TC .meta:n = { tchinese } , tchinese .code:n = { \projlib_language_set_option_no_babel:n { tchinese } } , traditional-chinese .meta:n = { tchinese } , traditional~chinese .meta:n = { tchinese } , traditional chinese .meta:n = { tchinese } , TChinese .meta:n = { tchinese } , Traditional-Chinese .meta:n = { tchinese } , Traditional~Chinese .meta:n = { tchinese } , Traditional Chinese .meta:n = { tchinese } , JP .meta:n = { japanese } , japanese .code:n = { \projlib_language_set_option:n { japanese } } , Japanese .meta:n = { japanese } , RU .meta:n = { russian } , russian .code:n = { \projlib_language_set_option:n { russian } } , Russian .meta:n = { russian } , unknown .code:n = {} } \ProcessKeyOptions [ projlib-language ] \cs_new_protected:Nn \projlib_language_clear_global_option:n { \clist_remove_all:cn { @classoptionslist } { #1 } } \projlib_language_clear_global_option:n { chinese } \projlib_language_clear_global_option:n { Chinese } \clist_gput_right:Nn \g__projlib_language_babel_option_clist { shorthands = off } \str_if_empty:NT \g__projlib_language_main_str { \str_gset:Nn \g__projlib_language_main_str { english } } \bool_if:NT \g__projlib_language_enabled_all_bool { \clist_map_inline:Nn \c__projlib_language_supported_clist { \bool_gset_true:c { g__projlib_language_enabled_ #1 _bool } } } \cs_new:Nn \projlib_language_str_to_languagename:n { \str_case_e:nnF { \exp_args:Ne \str_foldcase:n { \tl_trim_spaces:n { #1 } } } { { all } { common } { common } { common } { cn } { schinese } { sc } { schinese } { chinese } { schinese } { schinese } { schinese } { simplifiedchinese } { schinese } { simplified-chinese } { schinese } { tc } { tchinese } { tchinese } { tchinese } { traditionalchinese } { tchinese } { traditional-chinese} { tchinese } { jp } { japanese } { japanese } { japanese } { en } { english } { english } { english } { fr } { french } { french } { french } { de } { ngerman } { german } { ngerman } { ngerman } { ngerman } { it } { italian } { italian } { italian } { pt } { portuguese } { portuguese } { portuguese } { br } { brazilian } { brazilian } { brazilian } { es } { spanish } { spanish } { spanish } { ru } { russian } { russian } { russian } } { #1 } } \cs_new:Nn \projlib_language_str_to_languagetype:n { \str_case_e:nnF { \exp_args:Ne \str_foldcase:n { \tl_trim_spaces:n { #1 } } } { { cn } { cjk } { sc } { cjk } { chinese } { cjk } { schinese } { cjk } { simplifiedchinese } { cjk } { simplified-chinese } { cjk } { tc } { cjk } { tchinese } { cjk } { traditionalchinese } { cjk } { traditional-chinese} { cjk } { jp } { cjk } { japanese } { cjk } { en } { latin } { english } { latin } { fr } { latin } { french } { latin } { de } { latin } { german } { latin } { ngerman } { latin } { it } { latin } { italian } { latin } { pt } { latin } { portuguese } { latin } { br } { latin } { brazilian } { latin } { es } { latin } { spanish } { latin } { ru } { latin } { russian } { latin } } { latin } } \sys_if_engine_pdftex:T { \RequirePackage [T1] { fontenc } } \bool_if:NTF \g__projlib_language_enabled_all_bool { \sys_if_engine_pdftex:F { \PassOptionsToPackage { japanese, russian } { babel } } \PassOptionsToPackage { italian, portuguese, brazilian, spanish, es-notilde, es-noquoting, ngerman, french, english, shorthands = off } { babel } } { \PassOptionsToPackage { \g__projlib_language_babel_option_clist } { babel } } \PassOptionsToPackage { italian, brazilian, spanish, ngerman, french, english } { cleveref } \RequirePackage { babel } \RequirePackage { silence } \WarningFilter { biblatex } { Language } \bool_if:NT \g__projlib_language_enabled_french_bool { \frenchsetup { PartNameFull = false } } \bool_if:NT \g__projlib_language_enabled_portuguese_bool { \NewCommandCopy \__projlib_language_babel_ord: \ord \cs_undefine:N \ord \hook_gput_code:nnn { begindocument } { projlib-language } { \cs_if_exist:NT \ord { \NewCommandCopy \__projlib_language_user_ord: \ord \cs_set_protected:Npn \ord { \mode_if_math:TF { \__projlib_language_user_ord: } { \__projlib_language_babel_ord: } } } } } \babelprovide { schinese } \babelprovide { tchinese } \NewCommandCopy \projlib_language_backup_today:n \today \tl_new:N \g_projlib_language_settings_common_tl \clist_map_inline:Nn \c__projlib_language_supported_clist { \tl_new:c { g_projlib_language_settings_ #1 _tl } } \tl_gput_right:Nn \g_projlib_language_settings_common_tl { \cs_if_exist:NT \ProjLibToday { \RenewCommandCopy \today \ProjLibToday } } \tl_gput_right:Nn \g_projlib_language_settings_schinese_tl { \tl_set:Nn \languagename { schinese } \tl_set:cn { abstractname } { 摘要 } \tl_set:cn { proofname } { 证明 } \tl_set:cn { contentsname } { 目录 } \tl_set:cn { listfigurename } { 插图 } \tl_set:cn { listtablename } { 表格 } \tl_set:cn { figurename } { 图 } \tl_set:cn { tablename } { 表 } \tl_set:cn { indexname } { 索引 } \tl_set:cn { appendixname } { 附录 } \tl_set:cn { refname } { 参考文献 } \tl_set:cn { bibname } { 参考文献 } } \cs_new_protected:Nn \projlib_language_apply_settings_globally_schinese: { \g_projlib_language_settings_common_tl \g_projlib_language_settings_schinese_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_schinese:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_schinese_tl #1 \group_end: } \tl_gput_right:Nn \g_projlib_language_settings_tchinese_tl { \tl_set:Nn \languagename { tchinese } \tl_set:cn { abstractname } { 摘要 } \tl_set:cn { proofname } { 證明 } \tl_set:cn { contentsname } { 目錄 } \tl_set:cn { listfigurename } { 插圖 } \tl_set:cn { listtablename } { 表格 } \tl_set:cn { figurename } { 圖 } \tl_set:cn { tablename } { 表 } \tl_set:cn { indexname } { 索引 } \tl_set:cn { appendixname } { 附錄 } \tl_set:cn { refname } { 參考文獻 } \tl_set:cn { bibname } { 參考文獻 } } \cs_new_protected:Nn \projlib_language_apply_settings_globally_tchinese: { \g_projlib_language_settings_common_tl \g_projlib_language_settings_tchinese_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_tchinese:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_tchinese_tl #1 \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_japanese: { \selectlanguage { japanese } \g_projlib_language_settings_common_tl \g_projlib_language_settings_japanese_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_japanese:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_japanese_tl \foreignlanguage { japanese } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_english: { \selectlanguage { english } \g_projlib_language_settings_common_tl \g_projlib_language_settings_english_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_english:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_english_tl \foreignlanguage { english } { #1 } \group_end: } \tl_gput_right:Nn \g_projlib_language_settings_french_tl { \tl_gset:cn { frenchpartname } { Partie } } \cs_new_protected:Nn \projlib_language_apply_settings_globally_french: { \selectlanguage { french } \g_projlib_language_settings_common_tl \g_projlib_language_settings_french_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_french:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_french_tl \foreignlanguage { french } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_ngerman: { \selectlanguage { ngerman } \g_projlib_language_settings_common_tl \g_projlib_language_settings_ngerman_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_ngerman:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_ngerman_tl \foreignlanguage { ngerman } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_italian: { \selectlanguage { italian } \g_projlib_language_settings_common_tl \g_projlib_language_settings_italian_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_italian:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_italian_tl \foreignlanguage { italian } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_portuguese: { \selectlanguage { portuguese } \g_projlib_language_settings_common_tl \g_projlib_language_settings_portuguese_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_portuguese:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_portuguese_tl \foreignlanguage { portuguese } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_brazilian: { \selectlanguage { brazilian } \g_projlib_language_settings_common_tl \g_projlib_language_settings_brazilian_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_brazilian:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_brazilian_tl \foreignlanguage { brazilian } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_spanish: { \selectlanguage { spanish } \g_projlib_language_settings_common_tl \g_projlib_language_settings_spanish_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_spanish:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_spanish_tl \foreignlanguage { spanish } { #1 } \group_end: } \cs_new_protected:Nn \projlib_language_apply_settings_globally_russian: { \selectlanguage { russian } \g_projlib_language_settings_common_tl \g_projlib_language_settings_russian_tl } \cs_new_protected:Nn \projlib_language_apply_settings_locally_russian:n { \group_begin: \g_projlib_language_settings_common_tl \g_projlib_language_settings_russian_tl \foreignlanguage { russian } { #1 } \group_end: } \NewDocumentCommand \AddLanguageSetting { O{} m } { \tl_if_empty:nTF { #1 } { \tl_gput_right:Nn \g_projlib_language_settings_common_tl { #2 } } { \tl_gput_right:cn { g_projlib_language_settings_ \projlib_language_str_to_languagename:n { #1 } _tl } { #2 } } } \RequirePackage { setspace } \tl_new:N \g_projlib_language_linespacing_latin_tl \tl_new:N \g_projlib_language_linespacing_cjk_tl \tl_gset:Nn \g_projlib_language_linespacing_latin_tl { \setstretch { 1.00 } } \tl_gset:Nn \g_projlib_language_linespacing_cjk_tl { \onehalfspacing } \cs_new:Nn \projlib_language_set_linespacing_latin:n { \tl_gset:Nn \g_projlib_language_linespacing_latin_tl { #1 } } \cs_new:Nn \projlib_language_set_linespacing_cjk:n { \tl_gset:Nn \g_projlib_language_linespacing_cjk_tl { #1 } } \tl_new:N \g_projlib_language_parindent_latin_tl \tl_new:N \g_projlib_language_parindent_cjk_tl \@ifclassloaded { beamer } { \tl_gset:Nn \g_projlib_language_parindent_latin_tl { \dim_set:Nn \parindent { 0em } } \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { \dim_set:Nn \parindent { 0em } } } { \tl_gset:Nn \g_projlib_language_parindent_latin_tl { \dim_set:Nn \parindent { 1.5em } } \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { \dim_set:Nn \parindent { 2em } } } \hook_gput_code:nnn { begindocument } { projlib-language } { \IfPackageLoadedTF { parskip } { \tl_gset:Nn \g_projlib_language_parindent_latin_tl { \dim_set:Nn \parindent { 0em } } \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { \dim_set:Nn \parindent { 0em } } } {} } \cs_new:Nn \projlib_language_set_parindent_latin:n { \tl_gset:Nn \g_projlib_language_parindent_latin_tl { #1 } } \cs_new:Nn \projlib_language_set_parindent_cjk:n { \tl_gset:Nn \g_projlib_language_parindent_cjk_tl { #1 } } \NewDocumentCommand \ProjLibLanguageSet { m m m } % #1 = the thing to set % #2 = language or type % #3 = the setting { \use:c { projlib_language_set_ #1 _ #2 :n } { #3 } } \msg_new:nnn { projlib-language } { language-not-support } { The~language~"#1"~is~not~supported. } \cs_new:Nn \projlib_language_use_language_locally:nn { \cs_if_exist_use:cF { projlib_language_apply_settings_locally_ \projlib_language_str_to_languagename:n { #1 } :n } { \msg_warning:nnn { projlib-language } { language-not-support } { #1 } } { #2 } } \cs_generate_variant:Nn \projlib_language_use_language_locally:nn { e } \cs_new:Nn \projlib_language_use_language:n { \cs_if_exist_use:cF { projlib_language_apply_settings_globally_ \projlib_language_str_to_languagename:n { #1 } : } { \msg_warning:nnn { projlib-language } { language-not-support } { #1 } } \cs_if_exist_use:c { g_projlib_language_linespacing_ \projlib_language_str_to_languagetype:n { #1 } _tl } \cs_if_exist_use:c { g_projlib_language_parindent_ \projlib_language_str_to_languagetype:n { #1 } _tl } } \cs_generate_variant:Nn \projlib_language_use_language:n { e } \NewDocumentCommand \UseLanguage { m } { \hook_gput_code:nnn { begindocument/end } { projlib-language } { \projlib_language_use_language:e { #1 } } } \NewDocumentCommand \UseOtherLanguage { m m } { \group_begin: \projlib_language_use_language_locally:en { #1 } { #2 } \group_end: } \UseLanguage { \g__projlib_language_main_str } \cs_new:Nn \projlib_langauge_define_multilingual_text:Nn { % #1 = command name (with backslash) % #2 = key-value name configuration \keyval_parse:nnn { \use_none:n } { \__projlib_langauge_define_multilingual_text_do:nnn { \cs_to_str:N #1 } } { #2 } \tl_gset:Nn #1 { \tl_use:c { \cs_to_str:N #1 _projlib_language_text_ \languagename } } } \cs_generate_variant:Nn \projlib_langauge_define_multilingual_text:Nn { cn } \cs_new:Nn \__projlib_langauge_define_multilingual_text_do:nnn { % #1 = command name % #2 = language name % #3 = the text \exp_args:Ne \tl_gset:cn { #1 _projlib_language_text_ \projlib_language_str_to_languagename:n { #2 } } { #3 } } \NewDocumentCommand \DefineMultilingualText { m m } % #1 = command name % #2 = key-value name configuration { \projlib_langauge_define_multilingual_text:Nn #1 { #2 } } \PassOptionsToPackage { autostyle } { csquotes } \RequirePackage { csquotes } \DeclareQuoteStyle { schinese } {“} {”} {‘} {’} \DeclareQuoteStyle { tchinese } {“} {”} {‘} {’} \DeclareQuoteStyle { japanese } {「} {」} {『} {』} \endinput %% %% End of file `projlib-language.sty'.