Refined fix for #9633

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.
This commit is contained in:
Enrico Forestieri 2019-05-10 08:09:26 +02:00
parent 6319b0c303
commit 56a14c3fde
4 changed files with 23 additions and 6 deletions

View 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),

View 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

View 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);
}
}

View 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