[LyX/master] Assure language is properly closed before non-inheriting inset.
Juergen Spitzmueller
spitz at lyx.org
Fri Aug 14 06:43:35 UTC 2020
commit ef11fdc77dc617ec8059216f745fd51ad4c527f2
Author: Juergen Spitzmueller <spitz at lyx.org>
Date: Fri Aug 14 09:08:46 2020 +0200
Assure language is properly closed before non-inheriting inset.
---
src/Paragraph.cpp | 75 ++++++++++++++++++++++++++++++++++------------------
1 files changed, 49 insertions(+), 26 deletions(-)
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index 62265bb..e066d2b 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -1027,43 +1027,66 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
close = true;
}
- // Some insets cannot be inside a font change command.
- // However, even such insets *can* be placed in \L or \R
- // or their equivalents (for RTL language switches), so we don't
- // close the language in those cases.
- // ArabTeX, though, cannot handle this special behavior, it seems.
- bool arabtex = basefont.language()->lang() == "arabic_arabtex"
- || running_font.language()->lang() == "arabic_arabtex";
if (open_font && (!inset->inheritFont() || inset->allowMultiPar())) {
+ // Some insets cannot be inside a font change command.
+ // However, even such insets *can* be placed in \L or \R
+ // or their equivalents (for RTL language switches), so we don't
+ // close the language in those cases.
+ // ArabTeX, though, cannot handle this special behavior, it seems.
+ bool arabtex = basefont.language()->lang() == "arabic_arabtex"
+ || running_font.language()->lang() == "arabic_arabtex";
bool closeLanguage = arabtex
|| basefont.isRightToLeft() == running_font.isRightToLeft();
+ bool lang_closed = false;
+ bool lang_switched_at_inset = false;
+ // Close language if needed
+ if (closeLanguage) {
+ // We need prev_font here as language changes directly at inset
+ // will only be started inside the inset.
+ Font const prev_font = (i > 0) ?
+ owner_->getFont(bparams, i - 1, outerfont)
+ : running_font;
+ Font tmpfont(basefont);
+ tmpfont.setLanguage(prev_font.language());
+ bool needPar = false;
+ unsigned int count = tmpfont.latexWriteEndChanges(os, bparams, runparams,
+ basefont, basefont,
+ needPar, closeLanguage);
+ column += count;
+ lang_closed = count > 0;
+ lang_switched_at_inset = prev_font.language() != running_font.language();
+ }
+ // Now re-do font changes in a way needed here
+ // (using switches with multi-par insets)
InsetText const * textinset = inset->asInsetText();
bool const cprotect = textinset
? textinset->hasCProtectContent(runparams.moving_arg)
&& !textinset->text().isMainText()
: false;
- unsigned int count = running_font.latexWriteStartChanges(os, bparams,
+ unsigned int count2 = running_font.latexWriteStartChanges(os, bparams,
runparams, basefont,
running_font, true,
cprotect);
- column += count;
- // if any font properties were closed, update the running_font,
- // making sure, however, to leave the language as it was
- if (count > 0) {
- // FIXME: probably a better way to keep track of the old
- // language, than copying the entire font?
- Font const copy_font(running_font);
- basefont = owner_->getLayoutFont(bparams, outerfont);
- running_font = basefont;
- if (!closeLanguage)
- running_font.setLanguage(copy_font.language());
- // For these, we use switches, so no need to close
- basefont.fontInfo().setSize(copy_font.fontInfo().size());
- basefont.fontInfo().setFamily(copy_font.fontInfo().family());
- basefont.fontInfo().setSeries(copy_font.fontInfo().series());
- if (closeLanguage)
- runparams.local_font = &basefont;
- }
+ column += count2;
+ // Update the running_font, making sure, however,
+ // to leave the language as it was.
+ // FIXME: probably a better way to keep track of the old
+ // language, than copying the entire font?
+ Font const copy_font(running_font);
+ basefont = owner_->getLayoutFont(bparams, outerfont);
+ running_font = basefont;
+ if (!closeLanguage)
+ running_font.setLanguage(copy_font.language());
+ // For these, we use switches, so they should be taken as
+ // base inside the inset.
+ basefont.fontInfo().setSize(copy_font.fontInfo().size());
+ basefont.fontInfo().setFamily(copy_font.fontInfo().family());
+ basefont.fontInfo().setSeries(copy_font.fontInfo().series());
+ if (count2 == 0 && (lang_closed || lang_switched_at_inset))
+ // All fonts closed
+ open_font = false;
+ if (closeLanguage)
+ runparams.local_font = &basefont;
}
size_t const previous_row_count = os.texrow().rows();
More information about the lyx-cvs
mailing list