]> git.lyx.org Git - lyx.git/blobdiff - src/output_latex.cpp
de.po
[lyx.git] / src / output_latex.cpp
index 3816e657181ac5c551a0f11fdee49ec8263b74bd..517ef13d22d17da0ca5927c680a7c37d6349b7ba 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "output_latex.h"
 
+#include "BiblioInfo.h"
 #include "Buffer.h"
 #include "BufferParams.h"
 #include "Encoding.h"
@@ -304,8 +305,11 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf,
 
        // in multilingual environments, the CJK tags have to be nested properly
        data.cjk_nested = false;
-       if (data.par_language->encoding()->package() == Encoding::CJK &&
-           state->open_encoding_ != CJK && pit->isMultiLingual(bparams)) {
+       if (!bparams.useNonTeXFonts
+           && (bparams.inputenc == "auto-legacy"
+               || bparams.inputenc == "auto-legacy-plain")
+           && data.par_language->encoding()->package() == Encoding::CJK
+           && state->open_encoding_ != CJK && pit->isMultiLingual(bparams)) {
                if (prev_par_language->encoding()->package() == Encoding::CJK) {
                        os << "\\begin{CJK}{"
                           << from_ascii(data.par_language->encoding()->latexName())
@@ -979,11 +983,12 @@ void TeXOnePar(Buffer const & buf,
                }
        }
 
-       // Switch file encoding if necessary; no need to do this for "default"
+       // Switch file encoding if necessary; no need to do this for "auto-legacy-plain"
        // encoding, since this only affects the position of the outputted
        // \inputencoding command; the encoding switch will occur when necessary
-       if (bparams.inputenc == "auto"
+       if (bparams.inputenc == "auto-legacy"
                && !runparams.isFullUnicode() // Xe/LuaTeX use one document-wide encoding  (see also switchEncoding())
+               && runparams.encoding->package() != Encoding::japanese
                && runparams.encoding->package() != Encoding::none) {
                // Look ahead for future encoding changes.
                // We try to output them at the beginning of the paragraph,
@@ -1136,7 +1141,7 @@ void TeXOnePar(Buffer const & buf,
                        pending_newline = true;
                break;
        case LATEX_ENVIRONMENT: {
-               // if its the last paragraph of the current environment
+               // if it's the last paragraph of the current environment
                // skip it otherwise fall through
                if (nextpar
                    && ((nextpar->layout() != par.layout()
@@ -1190,7 +1195,7 @@ void TeXOnePar(Buffer const & buf,
        if (localswitch_needed
            || (intitle_command && using_begin_end)
            || closing_rtl_ltr_environment
-           || ((runparams.isLastPar || close_lang_switch)
+           || (((runparams.isLastPar && !runparams.inbranch) || close_lang_switch)
                && (par_lang != outer_lang || (using_begin_end
                                                && style.isEnvironment()
                                                && par_lang != nextpar_lang)))) {
@@ -1338,11 +1343,11 @@ void TeXOnePar(Buffer const & buf,
 
        // Information about local language is stored as a font feature.
        // If this is the last paragraph of the inset and a local_font was set upon entering
-       // and we are mixing encodings ("auto" or "default" and no XeTeX or LuaTeX),
+       // and we are mixing encodings ("auto-legacy" or "auto-legacy-plain" and no XeTeX or LuaTeX),
        // ensure the encoding is set back to the default encoding of the local language.
        if (runparams.isLastPar && runparams_in.local_font != 0
            && runparams_in.encoding != runparams_in.local_font->language()->encoding()
-           && (bparams.inputenc == "auto" || bparams.inputenc == "default")
+           && (bparams.inputenc == "auto-legacy" || bparams.inputenc == "auto-legacy-plain")
                && !runparams.isFullUnicode()
           ) {
                runparams_in.encoding = runparams_in.local_font->language()->encoding();
@@ -1435,7 +1440,8 @@ void latexParagraphs(Buffer const & buf,
 
        if (multibib_child && mparams.useBiblatex())
                os << "\\newrefsection";
-       else if (multibib_child && mparams.useBibtopic()) {
+       else if (multibib_child && mparams.useBibtopic()
+                && !buf.masterBibInfo().empty()) {
                os << "\\begin{btUnit}\n";
                runparams.openbtUnit = true;
        }
@@ -1545,7 +1551,8 @@ void latexParagraphs(Buffer const & buf,
                    && layout.latexname() == bparams.multibib) {
                        if (runparams.openbtUnit)
                                os << "\\end{btUnit}\n";
-                       if (!bparams.useBiblatex()) {
+                       if (!bparams.useBiblatex()
+                           && !buf.masterBibInfo().empty()) {
                                os << '\n' << "\\begin{btUnit}\n";
                                runparams.openbtUnit = true;
                        }
@@ -1604,14 +1611,23 @@ void latexParagraphs(Buffer const & buf,
                state->open_encoding_ = none;
        }
        // Likewise for polyglossia or when using begin/end commands
+       // or after an active branch inset with a language switch
+       Language const * const outer_language = (runparams.local_font != 0)
+                       ? runparams.local_font->language() : bparams.language;
+       string const & prev_lang = runparams.use_polyglossia
+                       ? getPolyglossiaEnvName(outer_language)
+                       : outer_language->babel();
        string const & cur_lang = openLanguageName(state);
-       if (maintext && !is_child && !cur_lang.empty()) {
+       if (((runparams.inbranch && langOpenedAtThisLevel(state) && prev_lang != cur_lang)
+            || (maintext && !is_child)) && !cur_lang.empty()) {
                os << from_utf8(subst(lang_end_command,
                                        "$$lang",
                                        cur_lang))
                   << '\n';
                if (using_begin_end)
                        popLanguageName();
+       } else if (runparams.inbranch && !using_begin_end && prev_lang != cur_lang) {
+               os << subst(lang_begin_command, "$$lang", prev_lang) << '\n';
        }
 
        // reset inherited encoding
@@ -1627,45 +1643,48 @@ void latexParagraphs(Buffer const & buf,
        }
 }
 
-
+// Switch the input encoding for some part(s) of the document.
 pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
                   OutputParams const & runparams, Encoding const & newEnc,
                   bool force, bool noswitchmacro)
 {
-       // Never switch encoding with non-TeX fonts (always "utf8plain") or
-       // with LuaTeX and TeX fonts (only one encoding accepted by luainputenc).
+       // Never switch encoding with non-TeX fonts (always "utf8plain"),
+       // with LuaTeX and TeX fonts (only one encoding accepted by luainputenc),
+       // or if we're in a moving argument or inherit the outer encoding.
        if (bparams.useNonTeXFonts
                || runparams.flavor == OutputParams::LUATEX
                || runparams.flavor == OutputParams::DVILUATEX
                || newEnc.name() == "inherit")
          return make_pair(false, 0);
 
-       Encoding const & oldEnc = *runparams.encoding;
-       bool moving_arg = runparams.moving_arg;
-       if (!force
-           && ((bparams.inputenc != "auto" && bparams.inputenc != "default") || moving_arg))
+       // Only switch for auto-selected legacy encodings (inputenc setting
+       // "auto-legacy" or "auto-legacy-plain").
+       // The "listings" environment can force a switch also with other
+       // encoding settings (it does not support variable width encodings
+       // (utf8, jis, ...) under 8-bit latex engines).
+       if (!force && ((bparams.inputenc != "auto-legacy" && bparams.inputenc != "auto-legacy-plain")
+                                  || runparams.moving_arg))
                return make_pair(false, 0);
 
-       // Do nothing if the encoding is unchanged.
-       if (oldEnc.name() == newEnc.name())
+       Encoding const & oldEnc = *runparams.encoding;
+       // Do not switch, if the encoding is unchanged or switching is not supported.
+       if (oldEnc.name() == newEnc.name()
+               || oldEnc.package() == Encoding::japanese
+               || oldEnc.package() == Encoding::none
+               || newEnc.package() == Encoding::none
+               || runparams.for_search)
                return make_pair(false, 0);
-
        // FIXME We ignore encoding switches from/to encodings that do
        // neither support the inputenc package nor the CJK package here.
-       // This does of course only work in special cases (e.g. switch from
-       // tis620-0 to latin1, but the text in latin1 contains ASCII only),
-       // but it is the best we can do
-       //
-       // 2019-01-08 Possibly no longer required since tis620-0 is supported
-       // by inputenc (but check special encodings "utf8-plain" and "default").
-       if (oldEnc.package() == Encoding::none || newEnc.package() == Encoding::none)
-               return make_pair(false, 0);
+       // This may fail for characters not supported by "unicodesymbols"
+       // or for non-ASCII characters in "listings"
+       // but it is the best we can do.
 
        // change encoding
        LYXERR(Debug::LATEX, "Changing LaTeX encoding from "
                   << oldEnc.name() << " to " << newEnc.name());
        os << setEncoding(newEnc.iconvName());
-       if (bparams.inputenc == "default")
+       if (bparams.inputenc == "auto-legacy-plain")
          return make_pair(true, 0);
 
        docstring const inputenc_arg(from_ascii(newEnc.latexName()));
@@ -1673,7 +1692,7 @@ pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
        switch (newEnc.package()) {
                case Encoding::none:
                case Encoding::japanese:
-                       // shouldn't ever reach here, see above
+                       // shouldn't ever reach here (see above) but avoids warning.
                        return make_pair(true, 0);
                case Encoding::inputenc: {
                        int count = inputenc_arg.length();
@@ -1698,8 +1717,7 @@ pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
                                count += 7;
                                state->open_encoding_ = inputenc;
                        }
-                       // with the japanese option, inputenc is omitted.
-                       if (runparams.use_japanese || noswitchmacro)
+                       if (noswitchmacro)
                                return make_pair(true, count);
                        os << "\\inputencoding{" << inputenc_arg << '}';
                        return make_pair(true, count + 16);