]> git.lyx.org Git - features.git/commitdiff
Partial fix for #9740 "XeTeX/LuaTeX with TeX fonts problems".
authorGünter Milde <milde@lyx.org>
Tue, 20 Oct 2015 17:14:39 +0000 (19:14 +0200)
committerGünter Milde <milde@lyx.org>
Tue, 20 Oct 2015 17:16:25 +0000 (19:16 +0200)
Fixes output for 3 of the 4 test lyx-files.

Includes "FIXME"s at places where further action is required to get the XeTeX
export right but I don't know how.

src/Buffer.cpp
src/BufferParams.cpp
src/PDFOptions.cpp
src/Paragraph.cpp
src/output_latex.cpp

index f7f12c812727bd84f6d2ec790d98603e5123ef4b..829616a20548208a5f6d8bfd47a58317303461be 100644 (file)
@@ -1586,10 +1586,10 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
 {
        OutputParams runparams = runparams_in;
 
-       // This is necessary for LuaTeX/XeTeX with tex fonts.
-       // See FIXME in BufferParams::encoding()
-       if (runparams.isFullUnicode())
-               runparams.encoding = encodings.fromLyXName("utf8-plain");
+       // XeTeX with TeX fonts is only safe with ASCII encoding,
+       // See #9740 and FIXME in BufferParams::encoding()
+       if (params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+               runparams.encoding = encodings.fromLyXName("ascii");
 
        string const encoding = runparams.encoding->iconvName();
        LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << ", fname=" << fname.realPath());
@@ -1673,10 +1673,10 @@ void Buffer::writeLaTeXSource(otexstream & os,
 
        OutputParams runparams = runparams_in;
 
-       // This is necessary for LuaTeX/XeTeX with tex fonts.
-       // See FIXME in BufferParams::encoding()
-       if (runparams.isFullUnicode())
-               runparams.encoding = encodings.fromLyXName("utf8-plain");
+       // XeTeX with TeX fonts is only safe with ASCII encoding,
+       // See #9740 and FIXME in BufferParams::encoding()
+       if (params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+               runparams.encoding = encodings.fromLyXName("ascii");
 
        // If we are compiling a file standalone, even if this is the
        // child of some other buffer, let's cut the link here, so the
index dddbf78e4ef376adc6764d2724b63418a1e902d5..537178e2fa5e446ca70ede4652d287eb99868b07 100644 (file)
@@ -2307,7 +2307,7 @@ string BufferParams::bufferFormat() const
        string format = documentClass().outputFormat();
        if (format == "latex") {
                if (useNonTeXFonts)
-                       return "xetex";
+                       return "xetex"; // FIXME: why not "luatex"?
                if (encoding().package() == Encoding::japanese)
                        return "platex";
        }
@@ -2927,20 +2927,16 @@ docstring BufferParams::getGraphicsDriver(string const & package) const
 void BufferParams::writeEncodingPreamble(otexstream & os,
                                         LaTeXFeatures & features) const
 {
-       // XeTeX does not need this
-       if (features.runparams().flavor == OutputParams::XETEX)
+       // "inputenc" package not required with non-TeX fonts.
+       if (useNonTeXFonts)
                return;
-       // LuaTeX neither, but with tex fonts, we need to load
-       // the luainputenc package.
-       if (features.runparams().flavor == OutputParams::LUATEX
-               || features.runparams().flavor == OutputParams::DVILUATEX) {
-               if (!useNonTeXFonts && inputenc != "default"
-                   && ((inputenc == "auto" && language->encoding()->package() == Encoding::inputenc)
-                       || (inputenc != "auto" && encoding().package() == Encoding::inputenc))) {
-                       os << "\\usepackage[utf8]{luainputenc}\n";
-               }
+       // "inputenc"  fails with XeTeX (even in 8-bit compatiblitly mode) and with TeX fonts,
+       // (this is a bug in the "inputenc" package see #9740).
+       if (features.runparams().flavor == OutputParams::XETEX)
                return;
-       }
+       // For LuaTeX with TeX fonts, we can load
+       // the "luainputenc" package with the specified encoding(s) (see below).
+
        if (inputenc == "auto") {
                string const doc_encoding =
                        language->encoding()->latexName();
@@ -2972,7 +2968,11 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                                        os << ',';
                                os << from_ascii(doc_encoding);
                        }
-                       os << "]{inputenc}\n";
+                       if (features.runparams().flavor == OutputParams::LUATEX
+                           || features.runparams().flavor == OutputParams::DVILUATEX)
+                               os << "]{luainputenc}\n";
+                       else
+                               os << "]{inputenc}\n";
                }
                if (package == Encoding::CJK || features.mustProvide("CJK")) {
                        if (language->encoding()->name() == "utf8-cjk"
@@ -2992,8 +2992,12 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
                        if (features.isRequired("japanese")
                            || features.isProvided("inputenc"))
                                break;
-                       os << "\\usepackage[" << from_ascii(encoding().latexName())
-                          << "]{inputenc}\n";
+                       os << "\\usepackage[" << from_ascii(encoding().latexName());
+                       if (features.runparams().flavor == OutputParams::LUATEX
+                           || features.runparams().flavor == OutputParams::DVILUATEX)
+                               os << "]{luainputenc}\n";
+                       else
+                               os << "]{inputenc}\n";
                        break;
                case Encoding::CJK:
                        if (encoding().name() == "utf8-cjk"
@@ -3123,10 +3127,10 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
 
 Encoding const & BufferParams::encoding() const
 {
-       // FIXME: actually, we should check for the flavor
-       // or runparams.isFullyUnicode() here:
-       // This check will not work with XeTeX/LuaTeX and tex fonts.
-       // Thus we have to reset the encoding in Buffer::makeLaTeXFile
+       // FIXME: additionally, we must check for runparams().flavor == XeTeX
+       // or runparams.isFullUnicode() to care for the combination
+       // of XeTeX and TeX-fonts (see #9740).
+       // Currently, we reset the encoding in Buffer::makeLaTeXFile
        // (for export) and Buffer::writeLaTeXSource (for preview).
        if (useNonTeXFonts)
                return *(encodings.fromLyXName("utf8-plain"));
index 408fa9cc9df85ce12ec1f1a783d4f17fd66b4de3..afbd5e5f6423256f1fe2c2daaa39edefdf7b4553 100644 (file)
@@ -176,7 +176,7 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os,
 
        // hyperref expects utf8!
        if (need_unicode && enc && enc->iconvName() != "UTF-8"
-           &&!runparams.isFullUnicode()) {
+           &&!runparams.isFullUnicode()) { // FIXME: check must be done for useNonTeXFonts!
                os << "\\inputencoding{utf8}\n"
                   << setEncoding("UTF-8");
        }
@@ -196,7 +196,7 @@ void PDFOptions::writeLaTeX(OutputParams & runparams, otexstream & os,
                os << from_utf8(opt);
 
        if (need_unicode && enc && enc->iconvName() != "UTF-8"
-           &&!runparams.isFullUnicode()) {
+           &&!runparams.isFullUnicode()) { // FIXME: check for useNonTeXFonts!
                os << setEncoding(enc->iconvName())
                   << "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n";
        }
index 5cea164d63ded34e5511c87809d5746319cb65e9..60668124b6c6b92e6b9424fb087a9be2b93ea6a0 100644 (file)
@@ -2567,7 +2567,7 @@ void Paragraph::latex(BufferParams const & bparams,
        if (allowcust && d->endTeXParParams(bparams, os, runparams)
            && runparams.encoding != prev_encoding) {
                runparams.encoding = prev_encoding;
-               if (!runparams.isFullUnicode())
+               if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
                        os << setEncoding(prev_encoding->iconvName());
        }
 
index cca533bab4586123daf2a15b18f00cda32c9c89f..7b633810d25864cccb881d64b53413eb7800be94 100644 (file)
@@ -248,7 +248,7 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams,
                state->prev_env_language_ = data.par_language;
                if (runparams.encoding != data.prev_encoding) {
                        runparams.encoding = data.prev_encoding;
-                       if (!runparams.isFullUnicode())
+                       if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
                                os << setEncoding(data.prev_encoding->iconvName());
                }
        }
@@ -258,7 +258,7 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams,
                state->prev_env_language_ = data.par_language;
                if (runparams.encoding != data.prev_encoding) {
                        runparams.encoding = data.prev_encoding;
-                       if (!runparams.isFullUnicode())
+                       if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
                                os << setEncoding(data.prev_encoding->iconvName());
                }
        }
@@ -878,7 +878,7 @@ void TeXOnePar(Buffer const & buf,
                        latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
                if (runparams.encoding != prev_encoding) {
                        runparams.encoding = prev_encoding;
-                       if (!runparams.isFullUnicode())
+                       if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
                                os << setEncoding(prev_encoding->iconvName());
                }
        }
@@ -1040,12 +1040,11 @@ void TeXOnePar(Buffer const & buf,
        // If this is the last paragraph, and a local_font was set upon entering
        // the inset, and we're using "auto" or "default" encoding, the encoding
        // should be set back to that local_font's encoding.
-       // However, do not change the encoding when a fully unicode aware backend
-       // such as XeTeX is used.
+       // However, do not change the encoding when non-TeX fonts are used.
        if (runparams.isLastPar && runparams_in.local_font != 0
            && runparams_in.encoding != runparams_in.local_font->language()->encoding()
            && (bparams.inputenc == "auto" || bparams.inputenc == "default")
-           && (!runparams.isFullUnicode())) {
+           && (!runparams.isFullUnicode())) { // FIXME: test for UseTeXFonts
                runparams_in.encoding = runparams_in.local_font->language()->encoding();
                os << setEncoding(runparams_in.encoding->iconvName());
        }