diff --git a/src/output_latex.cpp b/src/output_latex.cpp index a6abd25aee..fed63b566d 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -52,6 +52,7 @@ enum OpenEncoding { static int open_encoding_ = none; static int cjk_inherited_ = 0; +Language const * prev_env_language_ = 0; ParagraphList::const_iterator @@ -119,12 +120,20 @@ TeXEnvironment(Buffer const & buf, bparams.documentClass().plainLayout() : pit->layout(); ParagraphList const & paragraphs = text.paragraphs(); + ParagraphList::const_iterator const priorpit = + pit == paragraphs.begin() ? pit : boost::prior(pit); + + bool const use_prev_env_language = priorpit->layout().isEnvironment() + && (priorpit->getDepth() > pit->getDepth() + || (priorpit->getDepth() == pit->getDepth() + && priorpit->layout() != pit->layout())); Language const * const par_language = pit->getParLanguage(bparams); Language const * const doc_language = bparams.language; Language const * const prev_par_language = (pit != paragraphs.begin()) - ? boost::prior(pit)->getParLanguage(bparams) + ? (use_prev_env_language ? prev_env_language_ + : priorpit->getParLanguage(bparams)) : doc_language; if (par_language->babel() != prev_par_language->babel()) { @@ -244,6 +253,7 @@ TeXEnvironment(Buffer const & buf, if (style.isEnvironment()) { os << "\\end{" << from_ascii(style.latexname()) << "}\n"; texrow.newline(); + prev_env_language_ = par_language; } if (leftindent_open) { @@ -342,36 +352,23 @@ TeXOnePar(Buffer const & buf, Language const * const outer_language = (runparams.local_font != 0) ? runparams.local_font->language() : doc_language; - // The previous language that was in effect is either the language of - // the previous paragraph, if there is one, or else the outer language - // if there is no previous paragraph - Language const * prev_language = - (pit != paragraphs.begin()) ? - priorpit->getParLanguage(bparams) : outer_language; - // When the language is changed at the very start of a LyX environment, - // the language switch in the LaTeX code occurs just before switching to - // the corresponding LaTeX environment. So, when the environment ends, - // we have to restore the language that was in effect. - bool env_lang_switch = false; - if (!priorpit->hasSameLayout(*pit)) { - ParagraphList::const_iterator outpit = priorpit; - while (outpit != paragraphs.begin() - && (outpit->hasSameLayout(*priorpit) - || outpit->getDepth() > priorpit->getDepth())) - outpit = boost::prior(outpit); - ParagraphList::const_iterator const inpit = boost::next(outpit); - Language const * const outenv_language - = outpit->getParLanguage(bparams); - Language const * const inenv_language - = inpit->getParLanguage(bparams); - if (outenv_language->babel() != inenv_language->babel()) - env_lang_switch = true; - if (outenv_language->babel() != par_language->babel()) - prev_language = outenv_language; - } + // The previous language that was in effect is the language of the + // previous paragraph, unless the previous paragraph is inside an + // environment with nesting depth greater than (or equal to, but with + // a different layout) the current one. If there is no previous + // paragraph, the previous language is the outer language. + bool const use_prev_env_language = priorpit->layout().isEnvironment() + && (priorpit->getDepth() > pit->getDepth() + || (priorpit->getDepth() == pit->getDepth() + && priorpit->layout() != pit->layout())); + Language const * const prev_language = + (pit != paragraphs.begin()) + ? (use_prev_env_language ? prev_env_language_ + : priorpit->getParLanguage(bparams)) + : outer_language; - if ((par_language->babel() != prev_language->babel() || env_lang_switch) + if (par_language->babel() != prev_language->babel() // check if we already put language command in TeXEnvironment() && !(style.isEnvironment() && (pit == paragraphs.begin() ||