]> git.lyx.org Git - features.git/commitdiff
Refined fix for #9633
authorEnrico Forestieri <forenr@lyx.org>
Fri, 10 May 2019 06:09:26 +0000 (08:09 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:28 +0000 (15:48 +0200)
A branch inset modifies the layout of the internal structures in
which the text is organized. When a branch is active, it is as if it
was not there, but its only presence makes a paragraph which would not
be the last one to actually be the last one, or the check for the
language of the previous paragraph to fail because there is no
previous paragraph before the first one in a branch inset.
Oney way I found to tackle it, is tracking whether the typesetted
paragraphs are actually part of an active branch inset and acting
accordingly.

src/OutputParams.cpp
src/OutputParams.h
src/insets/InsetBranch.cpp
src/output_latex.cpp

index 36816c2f7f825060b00f12b8f79040f26b825c89..5efe7445eba87384e36b5e427eb4b7da54e94417 100644 (file)
@@ -20,8 +20,8 @@ namespace lyx {
 
 OutputParams::OutputParams(Encoding const * enc)
        : flavor(LATEX), math_flavor(NotApplicable), nice(false), is_child(false),
-         moving_arg(false), intitle(false), inulemcmd(0), local_font(0), 
-         master_language(0), encoding(enc), free_spacing(false),
+         moving_arg(false), intitle(false), inbranch(false), inulemcmd(0),
+         local_font(0),master_language(0), encoding(enc), free_spacing(false),
          use_babel(false), use_polyglossia(false), use_CJK(false),
          use_indices(false), use_japanese(false), linelen(0), depth(0),
          exportdata(new ExportData), postpone_fragile_stuff(false), inDisplayMath(false),
index 52ab2925a5f5fe3cda53673a330eb4b6450b53b5..3ec4eddf226afe2e198561e4ca620ce7abb132ee 100644 (file)
@@ -102,6 +102,11 @@ public:
        */
        bool intitle;
 
+       /** inbranch == true means that the environment being typeset
+           is inside an active branch inset.
+       */
+       bool inbranch;
+
        /** inulemcmd > 0 means that the environment in which the
            inset is typeset is part of a ulem or soul command (e.g., \uline,
            \uuline, \uwave, \sout or \xout). Insets that output latex commands
index d30e348da571f9ecc60a1e6163ad878cf93bc81b..88d00e641e486a7b76507d0ae40ee652badf9844 100644 (file)
@@ -292,8 +292,11 @@ bool InsetBranch::producesOutput() const
 
 void InsetBranch::latex(otexstream & os, OutputParams const & runparams) const
 {
-       if (producesOutput())
-               InsetText::latex(os, runparams);
+       if (producesOutput()) {
+               OutputParams rp = runparams;
+               rp.inbranch = true;
+               InsetText::latex(os, rp);
+       }
 }
 
 
index 60bc9f3d5970ee92f41b37622e15faf17bee25ce..23e6d3f3feacf97c3434d6f3bf75457c7ed641cb 100644 (file)
@@ -1194,7 +1194,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)))) {
@@ -1610,14 +1610,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