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
84
src/Font.cpp
84
src/Font.cpp
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user