+
+void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+ frontend::FontMetrics const & fm = theFontMetrics(mi.base.font);
+ dim.asc = fm.maxAscent();
+ dim.des = 0;
+ dim.wid = 0;
+
+ docstring s;
+ switch (kind_) {
+ case ALLOWBREAK:
+ dim.asc = fm.xHeight();
+ dim.des = fm.descent('g');
+ dim.wid = fm.em() / 8;
+ break;
+ case LIGATURE_BREAK:
+ s = from_ascii("|");
+ break;
+ case END_OF_SENTENCE:
+ s = from_ascii(".");
+ break;
+ case LDOTS: {
+ // see comment in draw().
+ auto const fam = mi.base.font.family();
+ // Multiplication by 3 is done here to limit rounding effects.
+ int const spc3 = fam == TYPEWRITER_FAMILY ? 0 : 3 * fm.width(char_type(' ')) / 2;
+ dim.wid = 3 * fm.width(char_type('.')) + spc3;
+ break;
+ }
+ case MENU_SEPARATOR:
+ // ▹ U+25B9 WHITE RIGHT-POINTING SMALL TRIANGLE
+ // There is a \thinspace on each side of the triangle
+ dim.wid = 2 * fm.em() / 6 + fm.width(char_type(0x25B9));
+ break;
+ case HYPHENATION:
+ dim.wid = fm.width(from_ascii("-"));
+ if (dim.wid > 5)
+ dim.wid -= 2; // to make it look shorter
+ break;
+ case SLASH:
+ s = from_ascii("/");
+ dim.des = fm.descent(s[0]);
+ break;
+ case NOBREAKDASH:
+ s = from_ascii("-");
+ break;
+ case PHRASE_LYX:
+ case PHRASE_TEX:
+ case PHRASE_LATEX2E:
+ case PHRASE_LATEX:
+ dim.asc = fm.maxAscent();
+ dim.des = fm.maxDescent();
+ frontend::NullPainter np;
+ PainterInfo pi(mi.base.bv, np);
+ pi.base.font = mi.base.font;
+ drawLogo(pi, dim.wid, 0, kind_);
+ break;
+ }
+ if (dim.wid == 0)
+ dim.wid = fm.width(s);
+}
+
+