From 047dee5a3b934a115db0d5497eda4cbf4865400d Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 25 Aug 2024 09:46:29 +0200 Subject: [PATCH] Basic support for \babelprovide This is the new(er) babel mechanism to load languages via babel *.ini files. Some languages (or varieties) are only supported this way, some work better with unicode engines this way (for the latter case, we have BabelProvide 2) --- lib/languages | 4 ++++ src/BufferParams.cpp | 16 +++++++++++++--- src/LaTeXFeatures.cpp | 2 +- src/Language.cpp | 5 +++++ src/Language.h | 7 ++++++- src/tex2lyx/Preamble.cpp | 8 ++++---- 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/lib/languages b/lib/languages index efd83a6666..7fc89b1d41 100644 --- a/lib/languages +++ b/lib/languages @@ -8,6 +8,7 @@ # GuiName "" # HasGuiSupport # BabelName +# BabelProvide <0|1|2> # BabelOpts "" # BabelOptFormat # PolyglossiaName @@ -130,6 +131,9 @@ # be de-activated in some contexts (such as - or =). # * XindyName holds the value to the (te)xindy -L option. We only give it # if a corresponding language module exists. +# * BabelProvide determines if and when a language should be loaded from +# babel *.ini files with babel. Possible values: +# 0 (= never, default), 1 (always), 2 (with Unicode engines/non-TeX fonts) # * BabelOpts are comma separated, no matter how they shall be represented # in the output. # * BabelOptFormat specifies how the language-specific options shall be diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 3644acf13f..e8f302537c 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -3503,6 +3503,7 @@ string BufferParams::babelCall(LaTeXFeatures const & features, string lang_opts, std::set langs = features.getLanguages(); // add main language langs.insert(language); + ostringstream os; for (auto const & l : langs) { string blang = l->babel(); bool use_opt = langoptions; @@ -3522,7 +3523,16 @@ string BufferParams::babelCall(LaTeXFeatures const & features, string lang_opts, use_opt = true; } } - if (use_opt) + if (l->useBabelProvide() == 1 || (l->useBabelProvide() == 2 && useNonTeXFonts)) { + os << "\n\\babelprovide[import"; + if (l == language) + os << ", main"; + if (!babelLangOptions(l->lang()).empty()) + os << ", " << babelLangOptions(l->lang()); + os << "]{" << blang << "}"; + have_mods = true; + } + else if (use_opt) blangs.push_back(blang); } if (have_mods) @@ -3530,8 +3540,8 @@ string BufferParams::babelCall(LaTeXFeatures const & features, string lang_opts, // The prefs may require the languages to // be submitted to babel itself (not the class). if (langoptions || have_mods) - return "\\usepackage[" + lang_opts + "]{babel}"; - return "\\usepackage{babel}"; + return "\\usepackage[" + lang_opts + "]{babel}" + os.str(); + return "\\usepackage{babel}" + os.str(); } diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 3737938338..f1319facb5 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -1822,7 +1822,7 @@ docstring const LaTeXFeatures::getBabelPostsettings() const for (auto const & lang : langs) { if (!lang->babel_postsettings().empty()) tmp << lang->babel_postsettings() << '\n'; - if (lang->babelOptFormat() != "modifier") { + if (lang->babelOptFormat() != "modifier" && lang->useBabelProvide() == 0) { // user-set options string const opts = bufferParams().babelLangOptions(lang->lang()); if (!opts.empty()) diff --git a/src/Language.cpp b/src/Language.cpp index bd2dd589fb..f178f9abd9 100644 --- a/src/Language.cpp +++ b/src/Language.cpp @@ -133,6 +133,7 @@ bool Language::readLanguage(Lexer & lex) LA_BABELNAME = 1, LA_BABELOPTFORMAT, LA_BABELOPTS, + LA_BABELPROVIDE, LA_DATEFORMATS, LA_ENCODING, LA_END, @@ -161,6 +162,7 @@ bool Language::readLanguage(Lexer & lex) { "babelname", LA_BABELNAME }, { "babeloptformat", LA_BABELOPTFORMAT }, { "babelopts", LA_BABELOPTS }, + { "babelprovide", LA_BABELPROVIDE }, { "dateformats", LA_DATEFORMATS }, { "encoding", LA_ENCODING }, { "end", LA_END }, @@ -214,6 +216,9 @@ bool Language::readLanguage(Lexer & lex) case LA_BABELOPTS: lex >> babel_opts_; break; + case LA_BABELPROVIDE: + lex >> use_babel_provide_; + break; case LA_POLYGLOSSIANAME: lex >> polyglossia_name_; break; diff --git a/src/Language.h b/src/Language.h index db06a79c1b..4465809805 100644 --- a/src/Language.h +++ b/src/Language.h @@ -38,7 +38,8 @@ class Language { public: /// Language() : rightToLeft_(false), encoding_(0), internal_enc_(false), - has_gui_support_(false), word_wrap_(true) {} + has_gui_support_(false), word_wrap_(true), + use_babel_provide_(0){} /// LyX language name std::string const lang() const { return lang_; } /// Babel language name @@ -47,6 +48,8 @@ public: std::string const babelOpts() const { return babel_opts_; } /// Babel option format std::string const babelOptFormat() const { return babeloptformat_; } + /// Use \babelprovide with babel? + int useBabelProvide() const { return use_babel_provide_; } /// polyglossia language name std::string const polyglossia() const { return polyglossia_name_; } /// polyglossia language options @@ -165,6 +168,8 @@ private: bool word_wrap_; /// TranslationMap layoutTranslations_; + /// + int use_babel_provide_; }; diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 7802eae0b5..05a80ef025 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -50,7 +50,7 @@ namespace { * please keep this in sync with known_coded_languages line by line! */ const char * const known_languages[] = {"acadian", "afrikaans", "albanian", -"american", "arabic", "arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasai", +"american", "ancientgreek", "arabic", "arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasai", "bahasam", "basque", "belarusian", "bosnian", "brazil", "brazilian", "breton", "british", "bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "francais", @@ -58,7 +58,7 @@ const char * const known_languages[] = {"acadian", "afrikaans", "albanian", "georgian", "greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian", "interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin", "latvian", "lithuanian", "lowersorbian", "lsorbian", "macedonian", "magyar", "malay", "meyalu", -"mongolian", "naustrian", "newzealand", "ngerman", "ngermanb", "norsk", "nswissgerman", +"mexican", "mongolian", "naustrian", "newzealand", "ngerman", "ngermanb", "norsk", "nswissgerman", "nynorsk", "piedmontese", "polutonikogreek", "polish", "portuges", "portuguese", "romanian", "romansh", "russian", "russianb", "samin", "scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish", "swedish", "swissgerman", "thai", "turkish", "turkmen", @@ -71,7 +71,7 @@ const char * const known_languages[] = {"acadian", "afrikaans", "albanian", * please keep this in sync with known_languages line by line! */ const char * const known_coded_languages[] = {"french", "afrikaans", "albanian", -"american", "arabic_arabi", "arabic_arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasa", +"american", "ancientgreek", "arabic_arabi", "arabic_arabtex", "australian", "austrian", "azerbaijani", "bahasa", "bahasa", "bahasam", "basque", "belarusian", "bosnian", "brazilian", "brazilian", "breton", "british", "bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "french", @@ -79,7 +79,7 @@ const char * const known_coded_languages[] = {"french", "afrikaans", "albanian", "georgian", "greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa", "interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin", "latvian", "lithuanian", "lowersorbian", "lowersorbian", "macedonian", "magyar", "bahasam", "bahasam", -"mongolian", "naustrian", "newzealand", "ngerman", "ngerman", "norsk", "german-ch", +"spanish-mexico", "mongolian", "naustrian", "newzealand", "ngerman", "ngerman", "norsk", "german-ch", "nynorsk", "piedmontese", "polutonikogreek", "polish", "portuguese", "portuguese", "romanian", "romansh", "russian", "russian", "samin", "scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish", "swedish", "german-ch-old", "thai", "turkish", "turkmen", -- 2.39.5