]> git.lyx.org Git - lyx.git/blobdiff - src/output_latex.cpp
Fix MSVC warning
[lyx.git] / src / output_latex.cpp
index de11bc9b9652da0a74413566f8bca7ca6d403cf6..e62e2d77dbdc4a58b5543c6d4ae85833c591d2f6 100644 (file)
@@ -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
@@ -111,12 +112,21 @@ 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 = prev_env_language_ != 0
+                       && 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()) {
 
@@ -240,6 +250,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) {
@@ -336,36 +347,24 @@ ParagraphList::const_iterator 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;
-       }
-
-       if ((par_language->babel() != prev_language->babel() || env_lang_switch)
+
+       // 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 = prev_env_language_ != 0
+                       && 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()
            // check if we already put language command in TeXEnvironment()
            && !(style.isEnvironment()
                 && (pit == paragraphs.begin() ||