X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=370b7a0842e75d010b10d11e9c9358e9831e165b;hb=0c7bd9a57f2a308bb9659200eda3b7e45f8d5d3c;hp=feb51a00395ff10cd1b4f9f9eff13a82b22add28;hpb=afed7d06fa6c932a1a1578b76371189a7e17825e;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index feb51a0039..370b7a0842 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -23,6 +23,7 @@ #include "OutputParams.h" #include "Paragraph.h" #include "ParagraphParameters.h" +#include "texstream.h" #include "TextClass.h" #include "insets/InsetBibitem.h" @@ -60,7 +61,7 @@ struct OutputState prev_env_language_(0), open_polyglossia_lang_("") { } - int open_encoding_; + OpenEncoding open_encoding_; int cjk_inherited_; Language const * prev_env_language_; string open_polyglossia_lang_; @@ -235,6 +236,7 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams, TeXEnvironmentData const & data) { OutputState * state = getOutputState(); + // BufferParams const & bparams = buf.params(); // FIXME: for speedup shortcut below, would require passing of "buf" as argument if (state->open_encoding_ == CJK && data.cjk_nested) { // We need to close the encoding even if it does not change // to do correct environment nesting @@ -248,8 +250,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()) - os << setEncoding(data.prev_encoding->iconvName()); + os << setEncoding(data.prev_encoding->iconvName()); } } @@ -258,8 +259,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()) - os << setEncoding(data.prev_encoding->iconvName()); + os << setEncoding(data.prev_encoding->iconvName()); } } @@ -471,9 +471,9 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi // get the first paragraph in sequence with this layout and depth pit_type offset = 0; while (true) { - if (prev(pit, offset) == pars.begin()) + if (lyx::prev(pit, offset) == pars.begin()) break; - ParagraphList::const_iterator priorpit = prev(pit, offset + 1); + ParagraphList::const_iterator priorpit = lyx::prev(pit, offset + 1); if (priorpit->layout() == current_layout && priorpit->params().depth() == current_depth) ++offset; @@ -481,7 +481,7 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi break; } - ParagraphList::const_iterator spit = prev(pit, offset); + ParagraphList::const_iterator spit = lyx::prev(pit, offset); for (; spit != pars.end(); ++spit) { if (spit->layout() != current_layout || spit->params().depth() < current_depth) @@ -637,6 +637,8 @@ void TeXOnePar(Buffer const & buf, // This paragraph's language Language const * const par_language = par.getParLanguage(bparams); + Language const * const nextpar_language = nextpar ? + nextpar->getParLanguage(bparams) : 0; // The document's language Language const * const doc_language = bparams.language; // The language that was in effect when the environment this paragraph is @@ -672,6 +674,9 @@ void TeXOnePar(Buffer const & buf, getPolyglossiaEnvName(prev_language) : prev_language->babel(); string const outer_lang = use_polyglossia ? getPolyglossiaEnvName(outer_language) : outer_language->babel(); + string const nextpar_lang = nextpar_language ? (use_polyglossia ? + getPolyglossiaEnvName(nextpar_language) : + nextpar_language->babel()) : string(); string lang_begin_command = use_polyglossia ? "\\begin{$$lang}$$opts" : lyxrc.language_command_begin; string lang_end_command = use_polyglossia ? @@ -703,6 +708,8 @@ void TeXOnePar(Buffer const & buf, "$$lang", prev_lang)) << lang_command_termination; + if (prev_lang == state->open_polyglossia_lang_) + state->open_polyglossia_lang_ = ""; } // We need to open a new language if we couldn't close the previous @@ -764,6 +771,7 @@ void TeXOnePar(Buffer const & buf, // encoding, since this only affects the position of the outputted // \inputencoding command; the encoding switch will occur when necessary if (bparams.inputenc == "auto" + && !runparams.isFullUnicode() // Xe/LuaTeX use one document-wide encoding (see also switchEncoding()) && runparams.encoding->package() != Encoding::none) { // Look ahead for future encoding changes. // We try to output them at the beginning of the paragraph, @@ -876,8 +884,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()) - os << setEncoding(prev_encoding->iconvName()); + os << setEncoding(prev_encoding->iconvName()); } } @@ -932,13 +939,12 @@ void TeXOnePar(Buffer const & buf, && runparams.local_font != 0 && runparams.local_font->isRightToLeft() != par_language->rightToLeft() // are we about to close the language? - &&((nextpar && par_language->babel() != (nextpar->getParLanguage(bparams))->babel()) - || (runparams.isLastPar && par_language->babel() != outer_language->babel())); + &&((nextpar && par_lang != nextpar_lang) + || (runparams.isLastPar && par_lang != outer_lang)); if (closing_rtl_ltr_environment || (runparams.isLastPar - && ((!use_polyglossia && par_language->babel() != outer_language->babel()) - || (use_polyglossia && par_language->polyglossia() != outer_language->polyglossia())))) { + && par_lang != outer_lang)) { // Since \selectlanguage write the language to the aux file, // we need to reset the language at the end of footnote or // float. @@ -998,7 +1004,7 @@ void TeXOnePar(Buffer const & buf, // also if the next paragraph is a multilingual environment (because of nesting) if (nextpar && state->open_encoding_ == CJK - && (nextpar->getParLanguage(bparams)->encoding()->package() != Encoding::CJK + && (nextpar_language->encoding()->package() != Encoding::CJK || (nextpar->layout().isEnvironment() && nextpar->isMultiLingual(bparams))) // inbetween environments, CJK has to be closed later (nesting!) && (!style.isEnvironment() || !nextpar->layout().isEnvironment())) { @@ -1036,14 +1042,14 @@ 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 + // the inset, and we're using "auto" or "default" encoding, and not + // compiling with XeTeX or LuaTeX, 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. 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() + ) { runparams_in.encoding = runparams_in.local_font->language()->encoding(); os << setEncoding(runparams_in.encoding->iconvName()); } @@ -1240,7 +1246,7 @@ void latexParagraphs(Buffer const & buf, } // if "auto end" is switched off, explicitly close the language at the end - // but only if the last par is in a babel language + // but only if the last par is in a babel or polyglossia language string const lang_end_command = runparams.use_polyglossia ? "\\end{$$lang}" : lyxrc.language_command_end; if (maintext && !lyxrc.language_auto_end && !mainlang.empty() && @@ -1249,6 +1255,8 @@ void latexParagraphs(Buffer const & buf, "$$lang", mainlang)) << '\n'; + if (state->open_polyglossia_lang_ == mainlang) + state->open_polyglossia_lang_ = ""; } // If the last paragraph is an environment, we'll have to close @@ -1259,7 +1267,10 @@ void latexParagraphs(Buffer const & buf, } // Likewise for polyglossia if (maintext && !is_child && state->open_polyglossia_lang_ != "") { - os << "\\end{" << state->open_polyglossia_lang_ << "}\n"; + os << from_utf8(subst(lang_end_command, + "$$lang", + state->open_polyglossia_lang_)) + << '\n'; state->open_polyglossia_lang_ = ""; } @@ -1276,6 +1287,13 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, OutputParams const & runparams, Encoding const & newEnc, bool force) { + // XeTeX/LuaTeX use only one encoding per document: + // * with useNonTeXFonts: "utf8plain", + // * with XeTeX and TeX fonts: "ascii" (inputenc fails), + // * with LuaTeX and TeX fonts: only one encoding accepted by luainputenc. + if (runparams.isFullUnicode()) + return make_pair(false, 0); + Encoding const & oldEnc = *runparams.encoding; bool moving_arg = runparams.moving_arg; // If we switch from/to CJK, we need to switch anyway, despite custom inputenc