]> git.lyx.org Git - lyx.git/blobdiff - src/output_latex.cpp
Correctly set language after intitle paragraphs
[lyx.git] / src / output_latex.cpp
index d320e0efe694f606f5bb2b5a9168889cb7cb316f..4124d2dd1c92fde9f5cf08cb62ca29808ed1277f 100644 (file)
@@ -780,7 +780,7 @@ void TeXOnePar(Buffer const & buf,
        Paragraph const * nextpar = runparams.isLastPar
                ? nullptr : &paragraphs.at(pit + 1);
 
-       bool const intitle_command = style.intitle && style.latextype == LATEX_COMMAND;
+       bool const intitle_command = style.intitle && style.isCommand();
 
        if (style.pass_thru) {
                Font const outerfont = text.outerFont(pit);
@@ -847,14 +847,31 @@ void TeXOnePar(Buffer const & buf,
                        && priorpar->layout().isEnvironment()
                        && (priorpar->getDepth() > par.getDepth()
                            || (priorpar->getDepth() == par.getDepth()
-                                   && priorpar->layout() != par.layout()));
+                               && priorpar->layout() != par.layout()));
+
+       // We need to ignore previous intitle commands since languages
+       // are switched locally there (# 11514)
+       // There might be paragraphs before the title, so we check this.
+       Paragraph * prior_nontitle_par = nullptr;
+       if (!intitle_command) {
+               pit_type ppit = pit;
+               while (ppit > 0) {
+                       --ppit;
+                       Paragraph const * tmppar = &paragraphs.at(ppit);
+                       if (tmppar->layout().intitle && tmppar->layout().isCommand())
+                               continue;
+                       prior_nontitle_par = const_cast<Paragraph*>(tmppar);
+                       break;
+               }
+       }
        Language const * const prev_language =
-               runparams_in.for_search ?
-                       languages.getLanguage("ignore")
-               :(priorpar && !priorpar->isPassThru())
-                       ? (use_prev_env_language ? state->prev_env_language_
-                                               : priorpar->getParLanguage(bparams))
-                       : outer_language;
+               runparams_in.for_search 
+                       ? languages.getLanguage("ignore")
+                       : (prior_nontitle_par && !prior_nontitle_par->isPassThru())
+                               ? (use_prev_env_language 
+                                       ? state->prev_env_language_
+                                       : prior_nontitle_par->getParLanguage(bparams))
+                               : outer_language;
 
        bool const use_polyglossia = runparams.use_polyglossia;
        string const par_lang = use_polyglossia ?
@@ -979,7 +996,7 @@ void TeXOnePar(Buffer const & buf,
                        if ((runparams.encoding->package() != Encoding::CJK
                                 || bparams.useNonTeXFonts
                                 || runparams.for_search)
-                           && (par_lang != openLanguageName(state) || localswitch)
+                           && (par_lang != openLanguageName(state) || localswitch || intitle_command)
                            && !par_lang.empty()) {
                                string bc = use_polyglossia ?
                                          getPolyglossiaBegin(lang_begin_command, par_lang,
@@ -1282,23 +1299,21 @@ void TeXOnePar(Buffer const & buf,
 
        // InTitle commands need to be closed after the language has been closed.
        if (intitle_command) {
-               if (is_command) {
-                       os << '}';
-                       if (!style.postcommandargs().empty())
-                               latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
-                       if (!runparams.post_macro.empty()) {
-                               // Output the stored fragile commands (labels, indices etc.)
-                               // that need to be output after the command with moving argument.
-                               os << runparams.post_macro;
-                               runparams.post_macro.clear();
-                       }
-                       if (par.needsCProtection(runparams.moving_arg)
-                           && contains(runparams.active_chars, '^'))
-                               os << "\\endgroup";
-                       if (runparams.encoding != prev_encoding) {
-                               runparams.encoding = prev_encoding;
-                               os << setEncoding(prev_encoding->iconvName());
-                       }
+               os << '}';
+               if (!style.postcommandargs().empty())
+                       latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
+               if (!runparams.post_macro.empty()) {
+                       // Output the stored fragile commands (labels, indices etc.)
+                       // that need to be output after the command with moving argument.
+                       os << runparams.post_macro;
+                       runparams.post_macro.clear();
+               }
+               if (par.needsCProtection(runparams.moving_arg)
+                   && contains(runparams.active_chars, '^'))
+                       os << "\\endgroup";
+               if (runparams.encoding != prev_encoding) {
+                       runparams.encoding = prev_encoding;
+                       os << setEncoding(prev_encoding->iconvName());
                }
        }