]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeXFeatures.cpp
InsetInfo: enable inset dissolve
[lyx.git] / src / LaTeXFeatures.cpp
index 204c3ec4cca0d48539101f40b3cfce1621cc2c9a..c78e73573001bfbf36e48b33a808733e0e17e2a4 100644 (file)
@@ -65,6 +65,10 @@ namespace lyx {
 static docstring const lyx_def = from_ascii(
        "\\providecommand{\\LyX}{L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}");
 
+static docstring const lyx_rtl_def = from_ascii(
+       "\\let\\@@LyX\\LyX\n"
+       "\\def\\LyX{\\@ensure@LTR{\\@@LyX}}");
+
 static docstring const lyx_hyperref_def = from_ascii(
        "\\providecommand{\\LyX}{\\texorpdfstring%\n"
        "  {L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}\n"
@@ -258,7 +262,7 @@ static docstring const textcyr_T2A_def = from_ascii(
 static docstring const textcyr_def = from_ascii(
        "\\DeclareRobustCommand{\\cyrtext}{%\n"
        "  \\fontencoding{T2A}\\selectfont\\def\\encodingdefault{T2A}}\n"
-       "\\DeclareRobustCommand{\\textcyr}[1]{\\leavevmode{\\cyrtext #1}}\n");
+       "\\DeclareRobustCommand{\\textcyrillic}[1]{\\leavevmode{\\cyrtext #1}}\n");
 
 static docstring const lyxmathsym_def = from_ascii(
        "\\newcommand{\\lyxmathsym}[1]{\\ifmmode\\begingroup\\def\\b@ld{bold}\n"
@@ -544,6 +548,12 @@ void LaTeXFeatures::require(set<string> const & names)
 }
 
 
+void LaTeXFeatures::provide(string const & name)
+{
+       provides_.insert(name);
+}
+
+
 void LaTeXFeatures::useLayout(docstring const & layoutname)
 {
        useLayout(layoutname, 0);
@@ -609,27 +619,10 @@ bool LaTeXFeatures::isRequired(string const & name) const
 
 bool LaTeXFeatures::isProvided(string const & name) const
 {
-       // \textgreek is provided by babel globally if a Greek language/variety
-       // is used in the document
-       if (useBabel() && name == "textgreek"
-           && params_.main_font_encoding() != "default") {
-               // get main font encodings
-               vector<string> fontencs = params_.font_encodings();
-               // get font encodings of secondary languages
-               getFontEncodings(fontencs, true);
-               for (auto & fe : fontencs) {
-                       if (!Encodings::needsScriptWrapper(name, fe))
-                               return true;
-               }
-       }
-       // FIXME: Analoguously, babel provides a command \textcyrillic, but
-       //        for some reason, we roll our own \textcyr definition
-       //        We should use \textcyrillic instead and only define it
-       //        if we do not use a respective language that features it (i.e.,
-       //        add "textcyrillic" to the test above.
-       // FIXME: the "textbaltic" definitions are only needed if the context
-       //        font-encoding where the respective char is is not l7x.
-       //        We cannot check this here as we have no context information.
+       // Currently, this is only features provided by babel languages
+       // (such as textgreek)
+       if (provides_.find(name) != provides_.end())
+               return true;
 
        if (params_.useNonTeXFonts)
                return params_.documentClass().provides(name);
@@ -756,6 +749,9 @@ void LaTeXFeatures::useLanguage(Language const * lang)
                UsedLanguages_.insert(lang);
        if (!lang->requires().empty())
                require(lang->requires());
+       // currently only supported for Babel
+       if (!lang->provides().empty() && useBabel())
+               provide(lang->provides());
        // CJK languages do not have a babel name.
        // They use the CJK package
        if (lang->encoding()->package() == Encoding::CJK)
@@ -907,20 +903,30 @@ void LaTeXFeatures::getFontEncodings(vector<string> & encs, bool const onlylangs
                if (mustProvide("textgreek")
                    && find(encs.begin(), encs.end(), "LGR") == encs.end())
                        encs.insert(encs.begin(), "LGR");
-               if (mustProvide("textcyr")
+               if (mustProvide("textcyrillic")
                    && find(encs.begin(), encs.end(), "T2A") == encs.end())
                        encs.insert(encs.begin(), "T2A");
        }
 
-       for (auto const & lang : UsedLanguages_)
-               if (!lang->fontenc().empty()
-                   && ascii_lowercase(lang->fontenc()) != "none") {
-                       vector<string> extraencs = getVectorFromString(lang->fontenc());
-                       for (auto const & extra : extraencs) {
-                               if (find(encs.begin(), encs.end(), extra) == encs.end())
-                                       encs.insert(encs.begin(), extra);
-                       }
+       for (auto const & lang : UsedLanguages_) {
+               vector<string> extraencs =
+                       getVectorFromString(lang->fontenc(buffer().masterParams()));
+               for (auto const & extra : extraencs) {
+                       if (extra != "none" && find(encs.begin(), encs.end(), extra) == encs.end())
+                               encs.insert(encs.begin(), extra);
                }
+       }
+}
+
+
+bool LaTeXFeatures::hasRTLLanguage() const
+{
+       if (params_.language->rightToLeft())
+               return true;
+       for (auto const & lang : UsedLanguages_)
+               if (lang->rightToLeft())
+                       return true;
+       return false;
 }
 
 namespace {
@@ -990,9 +996,10 @@ char const * simplefeatures[] = {
        "todonotes",
        "forest",
        "varwidth",
-       "footnote",
        "tablefootnote",
        "afterpage",
+       "tabularx",
+       "xltabular"
 };
 
 char const * bibliofeatures[] = {
@@ -1115,6 +1122,13 @@ string const LaTeXFeatures::getPackages() const
        // The rest of these packages are somewhat more complicated
        // than those above.
 
+       if (mustProvide("footnote")) {
+               if (isRequired("hyperref"))
+                       packages << "\\usepackage{footnotehyper}\n";
+               else
+                       packages << "\\usepackage{footnote}\n";
+       }
+
        // [pdf]lscape is used to rotate longtables
        if (mustProvide("lscape")) {
                if (runparams_.flavor == OutputParams::LATEX
@@ -1370,6 +1384,8 @@ TexString LaTeXFeatures::getMacros() const
                        macros << lyx_hyperref_def << '\n';
                else
                        macros << lyx_def << '\n';
+               if (runparams_.use_polyglossia && hasRTLLanguage())
+                       macros << lyx_rtl_def << '\n';
        }
 
        if (mustProvide("noun"))
@@ -1388,7 +1404,7 @@ TexString LaTeXFeatures::getMacros() const
                macros << textgreek_def << '\n';
        }
 
-       if (!usePolyglossia() && mustProvide("textcyr")) {
+       if (!usePolyglossia() && mustProvide("textcyrillic")) {
                // ensure T2A font encoding is set up also if fontenc is not loaded by LyX
                if (params_.main_font_encoding() == "default")
                        macros << textcyr_T2A_def;