]> git.lyx.org Git - lyx.git/commitdiff
Basic support for \babelprovide
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 25 Aug 2024 07:46:29 +0000 (09:46 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 25 Aug 2024 07:46:29 +0000 (09:46 +0200)
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
src/BufferParams.cpp
src/LaTeXFeatures.cpp
src/Language.cpp
src/Language.h
src/tex2lyx/Preamble.cpp

index efd83a6666b69ca2f43082a7fb55ee49dd0f1cfc..7fc89b1d41b562b09151f6fd3fbcb10b1328c878 100644 (file)
@@ -8,6 +8,7 @@
 #      GuiName            "<Gui Name>"
 #      HasGuiSupport      <true|false>
 #      BabelName          <babelname>
+#      BabelProvide       <0|1|2>
 #      BabelOpts          "<language-specific options>"
 #       BabelOptFormat     <format of option specification>
 #      PolyglossiaName    <polyglossianame>
 #   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
index 3644acf13f7aa41603b573aa2b0422f2a7c437a9..e8f302537c03ca5c5c471ef38053ebe03c31fde8 100644 (file)
@@ -3503,6 +3503,7 @@ string BufferParams::babelCall(LaTeXFeatures const & features, string lang_opts,
        std::set<Language const *> 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();
 }
 
 
index 373793833826262ff1a150fb9fb8bff12925f3a9..f1319facb52507b7b07b2407bb7e59fb37939951 100644 (file)
@@ -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())
index bd2dd589fb9e8570031cb670ea37faba0ced2273..f178f9abd94cc7f31af9d43b5b56f93c8e0a7709 100644 (file)
@@ -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;
index db06a79c1b4aeec3c28b75f472df91b4c7abdd32..44658098051f11abd42a88511bf8936576b96e91 100644 (file)
@@ -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_;
 };
 
 
index 7802eae0b560c4621dc89579b5ef7f4582321957..05a80ef0258cd9d745f6fa4c1d900bef4f008d17 100644 (file)
@@ -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",