close = true;
}
- // FIXME: Bug: we can have an empty font change here!
- // if there has just been a font change, we are going to close it
- // right now, which means stupid latex code like \textsf{}. AFAIK,
- // this does not harm dvi output. A minor bug, thus (JMarc)
-
- // 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()) {
- bool closeLanguage = arabtex
- || basefont.isRightToLeft() == running_font.isRightToLeft();
- unsigned int count = running_font.latexWriteStartChanges(os, bparams,
- runparams, basefont,
- running_font, true);
- 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;
+ 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
+ // (= differing isRightToLeft()).
+ // ArabTeX, though, doesn't seem to handle this special behavior.
+ bool const inRLSwitch =
+ basefont.isRightToLeft() != running_font.isRightToLeft()
+ && basefont.language()->lang() != "arabic_arabtex"
+ && running_font.language()->lang() != "arabic_arabtex";
+ // Having said that, PassThru insets must be inside a font change command,
+ // as we do not re-open the font inside. So:
+ bool const closeLanguage = !inset->isPassThru() && !inRLSwitch;
+ 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 count2 = running_font.latexWriteStartChanges(os, bparams,
+ runparams, basefont,
+ running_font, true,
+ cprotect);
+ 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();
&& runningChange == change
&& change.type == Change::DELETED
&& !os.afterParbreak());
- bool const non_inherit_inset =
- (c == META_INSET && getInset(i) && !getInset(i)->inheritFont());
+ bool const multipar_inset =
+ (c == META_INSET && getInset(i) && getInset(i)->allowMultiPar());
// Do we need to close the previous font?
if (open_font &&
((current_font != running_font
|| current_font.language() != running_font.language())
- || (non_inherit_inset
+ || (multipar_inset
&& (current_font == prev_font
|| current_font.language() == prev_font.language()))))
{
column += 1;
}
otexstringstream ots;
- if (!non_inherit_inset) {
+ if (!multipar_inset) {
+ InsetText const * textinset = inInset().asInsetText();
+ bool const cprotect = textinset
+ ? textinset->hasCProtectContent(runparams.moving_arg)
+ && !textinset->text().isMainText()
+ : false;
column += current_font.latexWriteStartChanges(ots, bparams,
- runparams, basefont, last_font);
+ runparams, basefont, last_font, false,
+ cprotect);
}
// Check again for display math in ulem commands as a
// font change may also occur just before a math inset.
}
}
// We need to restore these after insets with
- // inheritFont() false
+ // allowMultiPar() true
Font const save_running_font = running_font;
Font const save_basefont = basefont;
d->latexInset(bparams, os, rp, running_font,
basefont, real_outerfont, open_font,
runningChange, style, i, column);
- if (non_inherit_inset) {
+ if (multipar_inset) {
running_font = save_running_font;
basefont = save_basefont;
}