mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-29 07:23:51 +00:00
Use switches where possible around non-inheriting insets
Fixes rest of #8384
This commit is contained in:
parent
d031edc587
commit
50b2120438
72
src/Font.cpp
72
src/Font.cpp
@ -56,18 +56,29 @@ namespace {
|
||||
//
|
||||
// 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",
|
||||
"error5", "error6", "error7", "error8", "error9", "error10", "error11",
|
||||
"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" };
|
||||
|
||||
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" };
|
||||
|
||||
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",
|
||||
"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
|
||||
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
|
||||
// Returns number of chars written.
|
||||
int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
|
||||
int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
|
||||
OutputParams const & runparams,
|
||||
Font const & base,
|
||||
Font const & prev) const
|
||||
Font const & prev,
|
||||
bool const & non_inherit_inset) const
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
@ -281,7 +293,7 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
|
||||
}
|
||||
|
||||
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()));
|
||||
if (c.first) {
|
||||
open_encoding_ = true;
|
||||
@ -299,27 +311,47 @@ int Font::latexWriteStartChanges(odocstream & os, BufferParams const & bparams,
|
||||
os << '{';
|
||||
++count;
|
||||
os << '\\'
|
||||
<< LaTeXSizeNames[f.size()]
|
||||
<< "{}";
|
||||
count += strlen(LaTeXSizeNames[f.size()]) + 3;
|
||||
<< LaTeXSizeSwitchNames[f.size()] << termcmd;
|
||||
count += strlen(LaTeXSizeSwitchNames[f.size()]) + 1;
|
||||
}
|
||||
if (f.family() != INHERIT_FAMILY) {
|
||||
if (non_inherit_inset) {
|
||||
os << '{';
|
||||
++count;
|
||||
os << '\\' << LaTeXFamilySwitchNames[f.family()] << termcmd;
|
||||
count += strlen(LaTeXFamilySwitchNames[f.family()]) + 1;
|
||||
} else {
|
||||
os << '\\'
|
||||
<< LaTeXFamilyNames[f.family()]
|
||||
<< LaTeXFamilyCommandNames[f.family()]
|
||||
<< '{';
|
||||
count += strlen(LaTeXFamilyNames[f.family()]) + 2;
|
||||
count += strlen(LaTeXFamilyCommandNames[f.family()]) + 2;
|
||||
}
|
||||
}
|
||||
if (f.series() != INHERIT_SERIES) {
|
||||
if (non_inherit_inset) {
|
||||
os << '{';
|
||||
++count;
|
||||
os << '\\' << LaTeXSeriesSwitchNames[f.series()] << termcmd;
|
||||
count += strlen(LaTeXSeriesSwitchNames[f.series()]) + 1;
|
||||
} else {
|
||||
os << '\\'
|
||||
<< LaTeXSeriesNames[f.series()]
|
||||
<< LaTeXSeriesCommandNames[f.series()]
|
||||
<< '{';
|
||||
count += strlen(LaTeXSeriesNames[f.series()]) + 2;
|
||||
count += strlen(LaTeXSeriesCommandNames[f.series()]) + 2;
|
||||
}
|
||||
}
|
||||
if (f.shape() != INHERIT_SHAPE) {
|
||||
if (non_inherit_inset) {
|
||||
os << '{';
|
||||
++count;
|
||||
os << '\\' << LaTeXShapeSwitchNames[f.shape()] << termcmd;
|
||||
count += strlen(LaTeXShapeSwitchNames[f.shape()]) + 1;
|
||||
} else {
|
||||
os << '\\'
|
||||
<< LaTeXShapeNames[f.shape()]
|
||||
<< LaTeXShapeCommandNames[f.shape()]
|
||||
<< '{';
|
||||
count += strlen(LaTeXShapeNames[f.shape()]) + 2;
|
||||
count += strlen(LaTeXShapeCommandNames[f.shape()]) + 2;
|
||||
}
|
||||
}
|
||||
if (f.color() != Color_inherit && f.color() != Color_ignore) {
|
||||
if (f.color() == Color_none && p.color() != Color_none) {
|
||||
@ -429,15 +461,15 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams,
|
||||
FontInfo f = bits_;
|
||||
f.reduce(base.bits_);
|
||||
|
||||
if (f.family() != INHERIT_FAMILY) {
|
||||
if (f.family() != INHERIT_FAMILY && !non_inherit_inset) {
|
||||
os << '}';
|
||||
++count;
|
||||
}
|
||||
if (f.series() != INHERIT_SERIES) {
|
||||
if (f.series() != INHERIT_SERIES && !non_inherit_inset) {
|
||||
os << '}';
|
||||
++count;
|
||||
}
|
||||
if (f.shape() != INHERIT_SHAPE) {
|
||||
if (f.shape() != INHERIT_SHAPE && !non_inherit_inset) {
|
||||
os << '}';
|
||||
++count;
|
||||
}
|
||||
|
@ -72,10 +72,11 @@ public:
|
||||
to this font. Returns number of chars written. Base is the
|
||||
font state active now.
|
||||
*/
|
||||
int latexWriteStartChanges(odocstream &, BufferParams const & bparams,
|
||||
int latexWriteStartChanges(otexstream &, BufferParams const & bparams,
|
||||
OutputParams const & runparams,
|
||||
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.
|
||||
Returns number of chars written. Base is the font state we want
|
||||
|
@ -1069,10 +1069,15 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
|
||||
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());
|
||||
// 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()
|
||||
|| 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)
|
||||
runparams.local_font = &basefont;
|
||||
}
|
||||
@ -2659,10 +2664,11 @@ void Paragraph::latex(BufferParams const & bparams,
|
||||
os << '}';
|
||||
column += 1;
|
||||
}
|
||||
odocstringstream ods;
|
||||
column += current_font.latexWriteStartChanges(ods, bparams,
|
||||
otexstringstream ots;
|
||||
bool const non_inherit_inset = (c == META_INSET && getInset(i) && !getInset(i)->inheritFont());
|
||||
column += current_font.latexWriteStartChanges(ots, bparams,
|
||||
runparams, basefont,
|
||||
last_font);
|
||||
last_font, non_inherit_inset);
|
||||
// Check again for display math in ulem commands as a
|
||||
// font change may also occur just before a math inset.
|
||||
if (runparams.inDisplayMath && !deleted_display_math
|
||||
@ -2674,19 +2680,17 @@ void Paragraph::latex(BufferParams const & bparams,
|
||||
}
|
||||
running_font = current_font;
|
||||
open_font = true;
|
||||
docstring fontchange = ods.str();
|
||||
docstring fontchange = ots.str();
|
||||
os << fontchange;
|
||||
// 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, '\\');
|
||||
if (prefixIs(last_modifier, from_ascii("textcolor")) && c == ' ')
|
||||
os << fontchange << from_ascii("{}");
|
||||
// check if the fontchange ends with a trailing blank
|
||||
// (like "\small " (see bug 3382)
|
||||
else if (suffixIs(fontchange, ' ') && c == ' ')
|
||||
os << fontchange.substr(0, fontchange.size() - 1)
|
||||
<< from_ascii("{}");
|
||||
else
|
||||
os << fontchange;
|
||||
os << from_ascii("{}");
|
||||
else if (ots.terminateCommand())
|
||||
os << termcmd;
|
||||
if (in_ct_deletion) {
|
||||
// We have to close and then reopen \lyxdeleted,
|
||||
// as strikeout needs to be on lowest level.
|
||||
|
Loading…
Reference in New Issue
Block a user