]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
tex2lyx: improve module support
[lyx.git] / src / BufferParams.cpp
index 60bfa3ab2226ad9d241c23776bea5ac5157c16bb..5704940ecd30413daf0a78b3a04c54668100a0ca 100644 (file)
@@ -102,9 +102,20 @@ static char const * const tex_graphics[] = {
 };
 
 
-
 namespace lyx {
 
+// XeTeX with TeX fonts:
+// run in 8-bit emulation mode and trick `inputenc` into working with XeTeX
+static docstring const xetex_pre_inputenc = from_ascii(
+       "\\XeTeXinputencoding \"bytes\" % current file\n"
+       "\\XeTeXdefaultencoding \"bytes\" % included files\n"
+       "\\makeatletter\n"
+       "\\let\\origUmathchar\\Umathchar\n"
+       "\\let\\Umathchar\\@undefined\n");
+static docstring const xetex_post_inputenc = from_ascii(
+       "\\let\\Umathchar\\origUmathchar\n"
+       "\\makeatother\n");
+
 // Local translators
 namespace {
 
@@ -308,7 +319,7 @@ bool inSystemDir(FileName const & document_dir, string & system_dir)
 
        string dir = document_dir.absFileName();
 
-       for (int i = 0; i < 2; ++i) {
+       for (int i = 0; i < 3; ++i) {
                dir = addPath(dir, "..");
                if (!fileSearch(dir, "configure.py").empty() &&
                    !fileSearch(dir, "chkconfig.ltx").empty()) {
@@ -435,6 +446,7 @@ BufferParams::BufferParams()
        columns = 1;
        listings_params = string();
        pagestyle = "default";
+       tablestyle = "default";
        suppress_date = false;
        justification = true;
        // no color is the default (white)
@@ -1052,6 +1064,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                sides = sidestranslator().find(psides);
        } else if (token == "\\paperpagestyle") {
                lex >> pagestyle;
+       } else if (token == "\\tablestyle") {
+               lex >> tablestyle;
        } else if (token == "\\bullet") {
                readBullets(lex);
        } else if (token == "\\bulletLaTeX") {
@@ -1396,7 +1410,8 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
           << "\n\\dynamic_quotes " << dynamic_quotes
           << "\n\\papercolumns " << columns
           << "\n\\papersides " << sides
-          << "\n\\paperpagestyle " << pagestyle << '\n';
+          << "\n\\paperpagestyle " << pagestyle
+          << "\n\\tablestyle " << tablestyle << '\n';
        if (!listings_params.empty())
                os << "\\listings_params \"" <<
                        InsetListingsParams(listings_params).encodedString() << "\"\n";
@@ -1765,7 +1780,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                   << from_ascii(fonts_default_family) << "}\n";
 
        // set font encoding
-       // XeTeX and LuaTeX (with OS fonts) do not need fontenc
+       // non-TeX fonts use font encoding TU (set by fontspec)
        if (!useNonTeXFonts && !features.isProvided("fontenc")
            && main_font_encoding() != "default") {
                // get main font encodings
@@ -2310,8 +2325,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        // esint and the other packages that provide special glyphs
        if (features.mustProvide("tipa") && useNonTeXFonts
            && !features.isProvided("xunicode")) {
-               // The package officially only supports XeTeX, but also works
-               // with LuaTeX. Thus we work around its XeTeX test.
+               // The `xunicode` package officially only supports XeTeX,
+               //  but also works with LuaTeX. We work around its XeTeX test.
                if (features.runparams().flavor != OutputParams::XETEX) {
                        os << "% Pretend to xunicode that we are XeTeX\n"
                           << "\\def\\XeTeXpicfile{}\n";
@@ -2436,6 +2451,7 @@ void BufferParams::useClassDefaults()
        sides = tclass.sides();
        columns = tclass.columns();
        pagestyle = tclass.pagestyle();
+       tablestyle = tclass.tablestyle();
        use_default_options = true;
        // Only if class has a ToC hierarchy
        if (tclass.hasTocLevels()) {
@@ -2452,6 +2468,7 @@ bool BufferParams::hasClassDefaults() const
        return sides == tclass.sides()
                && columns == tclass.columns()
                && pagestyle == tclass.pagestyle()
+               && tablestyle == tclass.tablestyle()
                && use_default_options
                && secnumdepth == tclass.secnumdepth()
                && tocdepth == tclass.tocdepth();
@@ -2625,13 +2642,17 @@ FormatList const & BufferParams::exportableFormats(bool only_viewable) const
        if (useNonTeXFonts) {
                excludes.insert("latex");
                excludes.insert("pdflatex");
-       }
-       FormatList result =
-               theConverters().getReachable(backs[0], only_viewable, true, excludes);
+       } else if (inputenc != "ascii" && inputenc != "utf8"
+                          && inputenc != "utf8x" && inputenc != "utf8-plain")
+                 // XeTeX with TeX fonts requires input encoding ascii or utf8
+                 // (https://www.tug.org/pipermail/xetex/2010-April/016452.html).
+                 excludes.insert("xetex");
+       FormatList result = theConverters().getReachable(backs[0], only_viewable,
+                                                                                                        true, excludes);
        for (vector<string>::const_iterator it = backs.begin() + 1;
             it != backs.end(); ++it) {
                FormatList r = theConverters().getReachable(*it, only_viewable,
-                               false, excludes);
+                                                                                                       false, excludes);
                result.insert(result.end(), r.begin(), r.end());
        }
        sort(result.begin(), result.end(), Format::formatSorter);
@@ -2655,7 +2676,9 @@ vector<string> BufferParams::backends() const
                                v.push_back("pdflatex");
                                v.push_back("latex");
                        }
-                       v.push_back("xetex");
+                       if (useNonTeXFonts || inputenc == "ascii" || inputenc == "utf8"
+                           || inputenc == "utf8x" || inputenc == "utf8-plain")
+                               v.push_back("xetex");
                        v.push_back("luatex");
                        v.push_back("dviluatex");
                }
@@ -3218,12 +3241,8 @@ docstring BufferParams::getGraphicsDriver(string const & package) const
 void BufferParams::writeEncodingPreamble(otexstream & os,
                                         LaTeXFeatures & features) const
 {
-       // XeTeX/LuaTeX: (see also #9740)
-       // With Unicode fonts we use utf8-plain without encoding package.
-       // With TeX fonts, we cannot use utf8-plain, but "inputenc" fails.
-       // XeTeX must use ASCII encoding (see Buffer.cpp),
-       //  for LuaTeX, we load "luainputenc" (see below).
-       if (useNonTeXFonts || features.runparams().flavor == OutputParams::XETEX)
+       // With no-TeX fonts we use utf8-plain without encoding package.
+       if (useNonTeXFonts)
                return;
 
        if (inputenc == "auto") {
@@ -3235,7 +3254,8 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                // Create list of inputenc options:
                set<string> encoding_set;
                // luainputenc fails with more than one encoding
-               if (!features.runparams().isFullUnicode()) // if we reach this point, this means LuaTeX with TeX fonts
+               if (features.runparams().flavor != OutputParams::LUATEX
+                       && features.runparams().flavor != OutputParams::DVILUATEX)
                        // list all input encodings used in the document
                        encoding_set = features.getEncodingSet(doc_encoding);
 
@@ -3270,7 +3290,8 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                case Encoding::none:
                case Encoding::CJK:
                case Encoding::japanese:
-                       if (encoding().iconvName() != "UTF-8")
+                       if (encoding().iconvName() != "UTF-8"
+                               && !features.runparams().isFullUnicode())
                          // don't default to [utf8]{inputenc} with TeXLive >= 18
                          os << "\\ifdefined\\UseRawInputEncoding\n"
                                 << "  \\UseRawInputEncoding\\fi\n";
@@ -3281,16 +3302,20 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                        if (features.isRequired("japanese")
                            || features.isProvided("inputenc"))
                                break;
+                       if (features.runparams().flavor == OutputParams::XETEX)
+                               os << xetex_pre_inputenc;
                        os << "\\usepackage[" << from_ascii(encoding().latexName());
                        if (features.runparams().flavor == OutputParams::LUATEX
                            || features.runparams().flavor == OutputParams::DVILUATEX)
                                os << "]{luainputenc}\n";
                        else
                                os << "]{inputenc}\n";
+                       if (features.runparams().flavor == OutputParams::XETEX)
+                               os << xetex_post_inputenc;
                        break;
                }
        }
-       if (inputenc == "default" or features.isRequired("japanese")) {
+       if (inputenc == "default" || features.isRequired("japanese")) {
                // don't default to [utf8]{inputenc} with TeXLive >= 18
                os << "\\ifdefined\\UseRawInputEncoding\n";
                os << "  \\UseRawInputEncoding\\fi\n";
@@ -3406,12 +3431,6 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
 Encoding const & BufferParams::encoding() const
 {
        // Main encoding for LaTeX output.
-       //
-       // Exception: XeTeX with 8-bit TeX fonts requires ASCII (see #9740).
-       // As the "flavor" is only known once export started, this
-       // cannot be handled here. Instead, runparams.encoding is set
-       // to ASCII in Buffer::makeLaTeXFile (for export)
-       // and Buffer::writeLaTeXSource (for preview).
        if (useNonTeXFonts)
                return *(encodings.fromLyXName("utf8-plain"));
        if (inputenc == "auto" || inputenc == "default")
@@ -3544,4 +3563,20 @@ void BufferParams::copyForAdvFR(const BufferParams & bp)
        setBaseClass(doc_class);
 }
 
+
+void BufferParams::setBibFileEncoding(string const & file, string const & enc)
+{
+       bib_encodings[file] = enc;
+}
+
+
+string const BufferParams::bibFileEncoding(string const & file) const
+{
+       if (bib_encodings.find(file) == bib_encodings.end())
+               return string();
+       return bib_encodings.find(file)->second;
+}
+
+
+
 } // namespace lyx