Use switches where possible around non-inheriting insets

Fixes rest of #8384
This commit is contained in:
Juergen Spitzmueller 2020-07-29 16:25:19 +02:00
parent d031edc587
commit 50b2120438
3 changed files with 80 additions and 43 deletions

View File

@ -56,18 +56,29 @@ namespace {
// //
// Strings used to write LaTeX files // Strings used to write LaTeX files
// //
char const * LaTeXFamilyNames[NUM_FAMILIES + 2] = char const * LaTeXFamilyCommandNames[NUM_FAMILIES + 2] =
{ "textrm", "textsf", "texttt", "error1", "error2", "error3", "error4", { "textrm", "textsf", "texttt", "error1", "error2", "error3", "error4",
"error5", "error6", "error7", "error8", "error9", "error10", "error11", "error5", "error6", "error7", "error8", "error9", "error10", "error11",
"error12", "error13", "error14" }; "error12", "error13", "error14" };
char const * LaTeXSeriesNames[NUM_SERIES + 2] = char const * LaTeXFamilySwitchNames[NUM_FAMILIES + 2] =
{ "rmfamily", "sffamily", "ttfamily", "error1", "error2", "error3", "error4",
"error5", "error6", "error7", "error8", "error9", "error10", "error11",
"error12", "error13", "error14" };
char const * LaTeXSeriesCommandNames[NUM_SERIES + 2] =
{ "textmd", "textbf", "error4", "error5" }; { "textmd", "textbf", "error4", "error5" };
char const * LaTeXShapeNames[NUM_SHAPE + 2] = char const * LaTeXSeriesSwitchNames[NUM_SERIES + 2] =
{ "mdseries", "bfseries", "error4", "error5" };
char const * LaTeXShapeCommandNames[NUM_SHAPE + 2] =
{ "textup", "textit", "textsl", "textsc", "error6", "error7" }; { "textup", "textit", "textsl", "textsc", "error6", "error7" };
char const * LaTeXSizeNames[NUM_SIZE + 4] = char const * LaTeXShapeSwitchNames[NUM_SHAPE + 2] =
{ "upshape", "itshape", "slshape", "scshape", "error6", "error7" };
char const * LaTeXSizeSwitchNames[NUM_SIZE + 4] =
{ "tiny", "scriptsize", "footnotesize", "small", "normalsize", "large", { "tiny", "scriptsize", "footnotesize", "small", "normalsize", "large",
"Large", "LARGE", "huge", "Huge", "error8", "error9", "error10", "error11" }; "Large", "LARGE", "huge", "Huge", "error8", "error9", "error10", "error11" };
@ -141,7 +152,7 @@ docstring const Font::stateText(BufferParams * params, bool const terse) const
// Returns size in latex format // Returns size in latex format
string const Font::latexSize() const string const Font::latexSize() const
{ {
return LaTeXSizeNames[bits_.size()]; return LaTeXSizeSwitchNames[bits_.size()];
} }
@ -213,10 +224,11 @@ void Font::lyxWriteChanges(Font const & orgfont,
/// Writes the head of the LaTeX needed to impose this font /// Writes the head of the LaTeX needed to impose this font
// Returns number of chars written. // Returns number of chars written.
int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams, int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
OutputParams const & runparams, OutputParams const & runparams,
Font const & base, Font const & base,
Font const & prev) const Font const & prev,
bool const & non_inherit_inset) const
{ {
int count = 0; int count = 0;
@ -281,7 +293,7 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
} }
if (language()->encoding()->package() == Encoding::CJK) { if (language()->encoding()->package() == Encoding::CJK) {
pair<bool, int> const c = switchEncoding(os, bparams, pair<bool, int> const c = switchEncoding(os.os(), bparams,
runparams, *(language()->encoding())); runparams, *(language()->encoding()));
if (c.first) { if (c.first) {
open_encoding_ = true; open_encoding_ = true;
@ -299,27 +311,47 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
os << '{'; os << '{';
++count; ++count;
os << '\\' os << '\\'
<< LaTeXSizeNames[f.size()] << LaTeXSizeSwitchNames[f.size()] << termcmd;
<< "{}"; count += strlen(LaTeXSizeSwitchNames[f.size()]) + 1;
count += strlen(LaTeXSizeNames[f.size()]) + 3;
} }
if (f.family() != INHERIT_FAMILY) { if (f.family() != INHERIT_FAMILY) {
os << '\\' if (non_inherit_inset) {
<< LaTeXFamilyNames[f.family()] os << '{';
<< '{'; ++count;
count += strlen(LaTeXFamilyNames[f.family()]) + 2; os << '\\' << LaTeXFamilySwitchNames[f.family()] << termcmd;
count += strlen(LaTeXFamilySwitchNames[f.family()]) + 1;
} else {
os << '\\'
<< LaTeXFamilyCommandNames[f.family()]
<< '{';
count += strlen(LaTeXFamilyCommandNames[f.family()]) + 2;
}
} }
if (f.series() != INHERIT_SERIES) { if (f.series() != INHERIT_SERIES) {
os << '\\' if (non_inherit_inset) {
<< LaTeXSeriesNames[f.series()] os << '{';
<< '{'; ++count;
count += strlen(LaTeXSeriesNames[f.series()]) + 2; os << '\\' << LaTeXSeriesSwitchNames[f.series()] << termcmd;
count += strlen(LaTeXSeriesSwitchNames[f.series()]) + 1;
} else {
os << '\\'
<< LaTeXSeriesCommandNames[f.series()]
<< '{';
count += strlen(LaTeXSeriesCommandNames[f.series()]) + 2;
}
} }
if (f.shape() != INHERIT_SHAPE) { if (f.shape() != INHERIT_SHAPE) {
os << '\\' if (non_inherit_inset) {
<< LaTeXShapeNames[f.shape()] os << '{';
<< '{'; ++count;
count += strlen(LaTeXShapeNames[f.shape()]) + 2; os << '\\' << LaTeXShapeSwitchNames[f.shape()] << termcmd;
count += strlen(LaTeXShapeSwitchNames[f.shape()]) + 1;
} else {
os << '\\'
<< LaTeXShapeCommandNames[f.shape()]
<< '{';
count += strlen(LaTeXShapeCommandNames[f.shape()]) + 2;
}
} }
if (f.color() != Color_inherit && f.color() != Color_ignore) { if (f.color() != Color_inherit && f.color() != Color_ignore) {
if (f.color() == Color_none && p.color() != Color_none) { if (f.color() == Color_none && p.color() != Color_none) {
@ -429,15 +461,15 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams,
FontInfo f = bits_; FontInfo f = bits_;
f.reduce(base.bits_); f.reduce(base.bits_);
if (f.family() != INHERIT_FAMILY) { if (f.family() != INHERIT_FAMILY && !non_inherit_inset) {
os << '}'; os << '}';
++count; ++count;
} }
if (f.series() != INHERIT_SERIES) { if (f.series() != INHERIT_SERIES && !non_inherit_inset) {
os << '}'; os << '}';
++count; ++count;
} }
if (f.shape() != INHERIT_SHAPE) { if (f.shape() != INHERIT_SHAPE && !non_inherit_inset) {
os << '}'; os << '}';
++count; ++count;
} }

View File

@ -72,10 +72,11 @@ public:
to this font. Returns number of chars written. Base is the to this font. Returns number of chars written. Base is the
font state active now. font state active now.
*/ */
int latexWriteStartChanges(odocstream &, BufferParams const & bparams, int latexWriteStartChanges(otexstream &, BufferParams const & bparams,
OutputParams const & runparams, OutputParams const & runparams,
Font const & base, Font const & base,
Font const & prev) const; Font const & prev,
bool const & non_inherit_inset = false) const;
/** Writes the tail of the LaTeX needed to change to this font. /** Writes the tail of the LaTeX needed to change to this font.
Returns number of chars written. Base is the font state we want Returns number of chars written. Base is the font state we want

View File

@ -1069,10 +1069,15 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
running_font = basefont; running_font = basefont;
if (!closeLanguage) if (!closeLanguage)
running_font.setLanguage(copy_font.language()); 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().setSize(copy_font.fontInfo().size());
// leave font open if language is still open basefont.fontInfo().setFamily(copy_font.fontInfo().family());
basefont.fontInfo().setSeries(copy_font.fontInfo().series());
// leave font open if language or any of the switches is still open
open_font = (running_font.language() == basefont.language() open_font = (running_font.language() == basefont.language()
|| running_font.fontInfo().size() == basefont.fontInfo().size()); || running_font.fontInfo().size() == basefont.fontInfo().size()
|| running_font.fontInfo().family() == basefont.fontInfo().family()
|| running_font.fontInfo().series() == basefont.fontInfo().series());
if (closeLanguage) if (closeLanguage)
runparams.local_font = &basefont; runparams.local_font = &basefont;
} }
@ -2659,10 +2664,11 @@ void Paragraph::latex(BufferParams const & bparams,
os << '}'; os << '}';
column += 1; column += 1;
} }
odocstringstream ods; otexstringstream ots;
column += current_font.latexWriteStartChanges(ods, bparams, bool const non_inherit_inset = (c == META_INSET && getInset(i) && !getInset(i)->inheritFont());
column += current_font.latexWriteStartChanges(ots, bparams,
runparams, basefont, runparams, basefont,
last_font); last_font, non_inherit_inset);
// Check again for display math in ulem commands as a // Check again for display math in ulem commands as a
// font change may also occur just before a math inset. // font change may also occur just before a math inset.
if (runparams.inDisplayMath && !deleted_display_math if (runparams.inDisplayMath && !deleted_display_math
@ -2674,19 +2680,17 @@ void Paragraph::latex(BufferParams const & bparams,
} }
running_font = current_font; running_font = current_font;
open_font = true; open_font = true;
docstring fontchange = ods.str(); docstring fontchange = ots.str();
os << fontchange;
// check whether the fontchange ends with a \\textcolor // check whether the fontchange ends with a \\textcolor
// modifier and the text starts with a space (bug 4473) // modifier and the text starts with a space. If so we
// need to add } in order to prevent \\textcolor from gobbling
// the space (bug 4473).
docstring const last_modifier = rsplit(fontchange, '\\'); docstring const last_modifier = rsplit(fontchange, '\\');
if (prefixIs(last_modifier, from_ascii("textcolor")) && c == ' ') if (prefixIs(last_modifier, from_ascii("textcolor")) && c == ' ')
os << fontchange << from_ascii("{}"); os << from_ascii("{}");
// check if the fontchange ends with a trailing blank else if (ots.terminateCommand())
// (like "\small " (see bug 3382) os << termcmd;
else if (suffixIs(fontchange, ' ') && c == ' ')
os << fontchange.substr(0, fontchange.size() - 1)
<< from_ascii("{}");
else
os << fontchange;
if (in_ct_deletion) { if (in_ct_deletion) {
// We have to close and then reopen \lyxdeleted, // We have to close and then reopen \lyxdeleted,
// as strikeout needs to be on lowest level. // as strikeout needs to be on lowest level.