From 75a08df529c2745a7d5facf740e8f1d4a205bc1f Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Thu, 2 Nov 2023 17:54:02 +0100 Subject: [PATCH] Inherit outer font in text-in-math environments Some text-in-math environments such as \text, \mbox, \fbox, and \makebox, inherit the outer text font. This commit reflects this in the on-screen representation. Fixes #12950. --- src/MetricsInfo.cpp | 2 +- src/MetricsInfo.h | 2 ++ src/RowPainter.cpp | 1 + src/TextMetrics.cpp | 1 + src/mathed/InsetMathBox.cpp | 12 ++++++------ 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/MetricsInfo.cpp b/src/MetricsInfo.cpp index 8fe03ba441..ab55bb524d 100644 --- a/src/MetricsInfo.cpp +++ b/src/MetricsInfo.cpp @@ -61,7 +61,7 @@ Changer MetricsBase::changeFontSet(string const & name) string const oldname = fontname; fontname = name; if (isMathFont(name) || isMathFont(oldname)) - font = sane_font; + font = isTextFont(name) ? outer_font : sane_font; augmentFont(font, name); font.setSize(rc->old.font.size()); font.setStyle(rc->old.font.style()); diff --git a/src/MetricsInfo.h b/src/MetricsInfo.h index 09c5b6331b..29000034db 100644 --- a/src/MetricsInfo.h +++ b/src/MetricsInfo.h @@ -47,6 +47,8 @@ public: BufferView * bv; /// current font FontInfo font; + /// font of the containing inset + FontInfo outer_font; /// name of current font - mathed specific std::string fontname; /// This is the width available in pixels diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp index 6798d917ec..d893fd01eb 100644 --- a/src/RowPainter.cpp +++ b/src/RowPainter.cpp @@ -104,6 +104,7 @@ void RowPainter::paintInset(Row::Element const & e) const pi_.base.font = e.inset->inheritFont() ? e.font.fontInfo() : pi_.base.bv->buffer().params().getFont().fontInfo(); + pi_.base.outer_font = e.font.fontInfo(); pi_.ltr_pos = !e.font.isVisibleRightToLeft(); pi_.change = pi_.change.changed() ? pi_.change : e.change; pi_.do_spellcheck &= e.inset->allowSpellCheck(); diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index eb99de066b..ba05519c67 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -520,6 +520,7 @@ bool TextMetrics::redoParagraph(pit_type const pit, bool const align_rows) displayFont(pit, e.pos) : bufferfont; MacroContext mc(&buffer, parPos); MetricsInfo mi(bv_, font.fontInfo(), w, mc, e.pos == 0, tight_); + mi.base.outer_font = displayFont(pit, e.pos).fontInfo(); e.inset->metrics(mi, dim); /* FIXME: This is a kind of hack. This allows InsetMathHull to * state that it needs some elbow room beyond its width, in diff --git a/src/mathed/InsetMathBox.cpp b/src/mathed/InsetMathBox.cpp index afaadeb83a..6feddf9cdd 100644 --- a/src/mathed/InsetMathBox.cpp +++ b/src/mathed/InsetMathBox.cpp @@ -146,14 +146,14 @@ void InsetMathBox::htmlize(HtmlStream & ms) const void InsetMathBox::metrics(MetricsInfo & mi, Dimension & dim) const { - Changer dummy = mi.base.changeFontSet("textnormal"); + Changer dummy = mi.base.changeFontSet("text"); cell(0).metrics(mi, dim); } void InsetMathBox::draw(PainterInfo & pi, int x, int y) const { - Changer dummy = pi.base.changeFontSet("textnormal"); + Changer dummy = pi.base.changeFontSet("text"); cell(0).draw(pi, x, y); } @@ -196,7 +196,7 @@ InsetMathFBox::InsetMathFBox(Buffer * buf) void InsetMathFBox::metrics(MetricsInfo & mi, Dimension & dim) const { - Changer dummy = mi.base.changeFontSet("textnormal"); + Changer dummy = mi.base.changeFontSet("text"); cell(0).metrics(mi, dim); // 1 pixel space, 1 frame, 1 space dim.wid += 2 * 3; @@ -210,7 +210,7 @@ void InsetMathFBox::draw(PainterInfo & pi, int x, int y) const Dimension const dim = dimension(*pi.base.bv); pi.pain.rectangle(x + 1, y - dim.ascent() + 1, dim.width() - 2, dim.height() - 2, Color_foreground); - Changer dummy = pi.base.changeFontSet("textnormal"); + Changer dummy = pi.base.changeFontSet("text"); cell(0).draw(pi, x + 3, y); } @@ -281,7 +281,7 @@ InsetMathMakebox::InsetMathMakebox(Buffer * buf, bool framebox) void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const { - Changer dummy = mi.base.changeFontSet("textnormal"); + Changer dummy = mi.base.changeFontSet("text"); Dimension wdim; static docstring bracket = from_ascii("["); @@ -312,7 +312,7 @@ void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const void InsetMathMakebox::draw(PainterInfo & pi, int x, int y) const { - Changer dummy = pi.base.changeFontSet("textnormal"); + Changer dummy = pi.base.changeFontSet("text"); BufferView const & bv = *pi.base.bv; int w = mathed_char_width(pi.base.font, '[');