]> git.lyx.org Git - features.git/blobdiff - src/LaTeXFeatures.cpp
\textcyr -> \textcyrillic
[features.git] / src / LaTeXFeatures.cpp
index 3f9eb6776267ab6fb3b0c00efb21a1c53d4d9898..e8d138707008b0586646517b05560a21990429dc 100644 (file)
@@ -250,8 +250,7 @@ static docstring const textgreek_LGR_def = from_ascii(
 static docstring const textgreek_def = from_ascii(
        "\\DeclareRobustCommand{\\greektext}{%\n"
        "  \\fontencoding{LGR}\\selectfont\\def\\encodingdefault{LGR}}\n"
-       "\\DeclareRobustCommand{\\textgreek}[1]{\\leavevmode{\\greektext #1}}\n"
-        "\\ProvideTextCommand{\\~}{LGR}[1]{\\char126#1}\n");
+       "\\DeclareRobustCommand{\\textgreek}[1]{\\leavevmode{\\greektext #1}}\n");
 
 static docstring const textcyr_T2A_def = from_ascii(
        "\\InputIfFileExists{t2aenc.def}{}{%\n"
@@ -259,7 +258,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"
@@ -545,6 +544,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);
@@ -610,6 +615,15 @@ bool LaTeXFeatures::isRequired(string const & name) const
 
 bool LaTeXFeatures::isProvided(string const & name) const
 {
+       // Currently, this is only features provided by babel languages
+       // (such as textgreek)
+       if (provides_.find(name) != provides_.end())
+               return true;
+
+       // FIXME: the "textbaltic" definitions are only needed if the context
+       //        font encoding of the respective char is not l7x.
+       //        We cannot check this here as we have no context information.
+
        if (params_.useNonTeXFonts)
                return params_.documentClass().provides(name);
 
@@ -635,9 +649,6 @@ bool LaTeXFeatures::isProvided(string const & name) const
                        from_ascii(params_.fontsMath())).provides(name, ot1,
                                                                       complete,
                                                                       nomath);
-       // TODO: "textbaltic" provided, if the font-encoding is "L7x"
-       //       "textgreek" provided, if a language with font-encoding LGR is used in the document
-       //       "textcyr" provided, if a language with font-encoding T2A is used in the document
 }
 
 
@@ -738,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)
@@ -832,7 +846,7 @@ vector<string> LaTeXFeatures::getBabelExclusiveLanguages() const
 
 string LaTeXFeatures::getBabelLanguages() const
 {
-       ostringstream languages;
+       ostringstream langs;
 
        bool first = true;
        LanguageList::const_iterator const begin = UsedLanguages_.begin();
@@ -842,27 +856,27 @@ string LaTeXFeatures::getBabelLanguages() const
                if ((*cit)->babel().empty())
                        continue;
                if (!first)
-                       languages << ',';
+                       langs << ',';
                else
                        first = false;
-               languages << (*cit)->babel();
+               langs << (*cit)->babel();
        }
-       return languages.str();
+       return langs.str();
 }
 
 
 set<string> LaTeXFeatures::getPolyglossiaLanguages() const
 {
-       set<string> languages;
+       set<string> langs;
 
        LanguageList::const_iterator const begin = UsedLanguages_.begin();
        for (LanguageList::const_iterator cit = begin;
             cit != UsedLanguages_.end();
             ++cit) {
                // We do not need the variants here
-               languages.insert((*cit)->polyglossia());
+               langs.insert((*cit)->polyglossia());
        }
-       return languages;
+       return langs;
 }
 
 
@@ -871,39 +885,36 @@ set<string> LaTeXFeatures::getEncodingSet(string const & doc_encoding) const
        // This does only find encodings of languages supported by babel, but
        // that does not matter since we don't have a language with an
        // encoding supported by inputenc but without babel support.
-       set<string> encodings;
-       LanguageList::const_iterator it  = UsedLanguages_.begin();
-       LanguageList::const_iterator end = UsedLanguages_.end();
-       for (; it != end; ++it)
-               if ((*it)->encoding()->latexName() != doc_encoding &&
-                   ((*it)->encoding()->package() == Encoding::inputenc
-                    || (*it)->encoding()->package() == Encoding::japanese))
-                       encodings.insert((*it)->encoding()->latexName());
-       return encodings;
+       set<string> encs;
+       for (auto const & lang : UsedLanguages_)
+               if (lang->encoding()->latexName() != doc_encoding &&
+                   (lang->encoding()->package() == Encoding::inputenc
+                    || lang->encoding()->package() == Encoding::japanese))
+                       encs.insert(lang->encoding()->latexName());
+       return encs;
 }
 
 
-void LaTeXFeatures::getFontEncodings(vector<string> & encodings) const
+void LaTeXFeatures::getFontEncodings(vector<string> & encs, bool const onlylangs) const
 {
-       // these must be loaded if glyphs of this script are used
-       // unless a language providing them is used in the document
-       if (mustProvide("textgreek")
-           && find(encodings.begin(), encodings.end(), "LGR") == encodings.end())
-               encodings.insert(encodings.begin(), "LGR");
-       if (mustProvide("textcyr")
-           && find(encodings.begin(), encodings.end(), "T2A") == encodings.end())
-               encodings.insert(encodings.begin(), "T2A");
+       if (!onlylangs) {
+               // these must be loaded if glyphs of this script are used
+               // unless a language providing them is used in the document
+               if (mustProvide("textgreek")
+                   && find(encs.begin(), encs.end(), "LGR") == encs.end())
+                       encs.insert(encs.begin(), "LGR");
+               if (mustProvide("textcyrillic")
+                   && find(encs.begin(), encs.end(), "T2A") == encs.end())
+                       encs.insert(encs.begin(), "T2A");
+       }
 
-       LanguageList::const_iterator it  = UsedLanguages_.begin();
-       LanguageList::const_iterator end = UsedLanguages_.end();
-       for (; it != end; ++it)
-               if (!(*it)->fontenc().empty()
-                   && ascii_lowercase((*it)->fontenc()) != "none") {
-                       vector<string> extraencs = getVectorFromString((*it)->fontenc());
-                       vector<string>::const_iterator fit = extraencs.begin();
-                       for (; fit != extraencs.end(); ++fit) {
-                               if (find(encodings.begin(), encodings.end(), *fit) == encodings.end())
-                                       encodings.insert(encodings.begin(), *fit);
+       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);
                        }
                }
 }
@@ -914,6 +925,7 @@ char const * simplefeatures[] = {
 // note that the package order here will be the same in the LaTeX-output
        "array",
        "verbatim",
+       "cprotect",
        "longtable",
        "rotating",
        "latexsym",
@@ -976,6 +988,7 @@ char const * simplefeatures[] = {
        "varwidth",
        "footnote",
        "tablefootnote",
+       "afterpage",
 };
 
 char const * bibliofeatures[] = {
@@ -1098,6 +1111,15 @@ string const LaTeXFeatures::getPackages() const
        // The rest of these packages are somewhat more complicated
        // than those above.
 
+       // [pdf]lscape is used to rotate longtables
+       if (mustProvide("lscape")) {
+               if (runparams_.flavor == OutputParams::LATEX
+                   || runparams_.flavor == OutputParams::DVILUATEX)
+                       packages << "\\usepackage{lscape}\n";
+               else
+                       packages << "\\usepackage{pdflscape}\n";
+       }
+
        // The tipa package and its extensions (tipx, tone) must not
        // be loaded with non-TeX fonts, since fontspec includes the
        // respective macros
@@ -1232,7 +1254,11 @@ string const LaTeXFeatures::getPackages() const
        // Some classes load natbib themselves, but still allow (or even require)
        // plain numeric citations (ReVTeX is such a case, see bug 5182).
        // This special case is indicated by the "natbib-internal" key.
-       if (mustProvide("natbib") && !isProvided("natbib-internal")) {
+       if (mustProvide("natbib")
+           && !isProvided("natbib-internal")
+           && !isProvided("biblatex")
+           && !isProvided("biblatex-natbib")
+           && !isProvided("jurabib")) {
                packages << "\\usepackage[";
                if (params_.citeEngineType() == ENGINE_TYPE_NUMERICAL)
                        packages << "numbers";
@@ -1251,7 +1277,11 @@ string const LaTeXFeatures::getPackages() const
        }
 
        // jurabib -- we need version 0.6 at least.
-       if (mustProvide("jurabib")) {
+       if (mustProvide("jurabib")
+           && !isProvided("natbib-internal")
+           && !isProvided("natbib")
+           && !isProvided("biblatex")
+           && !isProvided("biblatex-natbib")) {
                packages << "\\usepackage";
                if (!params_.biblio_opts.empty())
                        packages << '[' << params_.biblio_opts << ']';
@@ -1318,6 +1348,9 @@ TexString LaTeXFeatures::getMacros() const
                macros << getPreambleSnippets();
        }
 
+       if (mustProvide("xetexdashbreakstate"))
+               macros << "\\XeTeXdashbreakstate 0" << '\n';
+
        if (mustProvide("papersize")) {
                if (runparams_.flavor == OutputParams::LATEX
                    || runparams_.flavor == OutputParams::DVILUATEX)
@@ -1351,7 +1384,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;