int logoWidth(FontInfo const & font, InsetSpecialChar::Kind kind) {
frontend::FontMetrics const & fm = theFontMetrics(font);
- double const em = fm.width('M');
+ int const em = fm.em();
int width = 0;
+ // See drawlogo() below to understand what this does.
switch (kind) {
case InsetSpecialChar::PHRASE_LYX:
- width = fm.width(from_ascii("L")) - 0.16667 * em
- + fm.width(from_ascii("Y")) - 0.125 * em
+ width = fm.width(from_ascii("L")) - em / 6
+ + fm.width(from_ascii("Y")) - em / 8
+ fm.width(from_ascii("X"));
break;
case InsetSpecialChar::PHRASE_TEX:
- width = fm.width(from_ascii("T")) - 0.16667 * em
- + fm.width(from_ascii("E")) - 0.125 * em
+ width = fm.width(from_ascii("T")) - em / 6
+ + fm.width(from_ascii("E")) - em / 8
+ fm.width(from_ascii("X"));
break;
case InsetSpecialChar::PHRASE_LATEX2E:
width = logoWidth(font, InsetSpecialChar::PHRASE_LATEX)
+ + 3 * em / 20
+ fm.width(from_ascii("2") + char_type(0x03b5));
break;
case InsetSpecialChar::PHRASE_LATEX: {
FontInfo smaller = font;
smaller.decSize().decSize();
- width = fm.width(from_ascii("L")) - 0.36 * em
- + theFontMetrics(smaller).width(from_ascii("A")) - 0.15 * em
+ width = fm.width(from_ascii("L")) - 9 * em / 25
+ + theFontMetrics(smaller).width(from_ascii("A")) - 3 * em / 20
+ logoWidth(font, InsetSpecialChar::PHRASE_TEX);
break;
}
namespace {
-void drawLogo(PainterInfo & pi, InsetSpecialChar::Kind kind, int & x, int & y) {
+// helper function: draw text and update x.
+void drawChar(PainterInfo & pi, int & x, int const y, char_type ch)
+{
+ pi.pain.text(x, y, ch, pi.base.font);
+ x += theFontMetrics(pi.base.font).width(ch);
+}
+
+
+void drawLogo(PainterInfo & pi, int & x, int const y, InsetSpecialChar::Kind kind)
+{
FontInfo const & font = pi.base.font;
- // FIXME: this definition of em is bogus, but there is a need
- // for a big refactoring of the code around this issue anyway.
- double const em = theFontMetrics(font).width('M');
+ int const em = theFontMetrics(font).em();
switch (kind) {
case InsetSpecialChar::PHRASE_LYX:
- x += pi.pain.text(x, y, from_ascii("L"), font);
- x -= 0.16667 * em;
- x += pi.pain.text(x, y + 0.25 * em, from_ascii("Y"), font);
- x -= 0.125 * em;
- x += pi.pain.text(x, y, from_ascii("X"), font);
- break;
-
- case InsetSpecialChar::PHRASE_TEX:
- x += pi.pain.text(x, y, from_ascii("T"), font);
- x -= 0.16667 * em;
- x += pi.pain.text(x, y + 0.25 * em, from_ascii("E"), font);
- x -= 0.125 * em;
- x += pi.pain.text(x, y, from_ascii("X"), font);
+ /** Reference macro:
+ * \providecommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\\@};
+ */
+ drawChar(pi, x, y, 'L');
+ x -= em / 6;
+ drawChar(pi, x, y + em / 4, 'Y');
+ x -= em / 8;
+ drawChar(pi, x, y, 'X');
+ break;
+
+ case InsetSpecialChar::PHRASE_TEX: {
+ /** Reference macro:
+ * \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
+ */
+ int const ex = theFontMetrics(font).ascent('x');
+ drawChar(pi, x, y, 'T');
+ x -= em / 6;
+ drawChar(pi, x, y + ex / 2, 'E');
+ x -= em / 8;
+ drawChar(pi, x, y, 'X');
break;
-
+ }
case InsetSpecialChar::PHRASE_LATEX2E:
- drawLogo(pi, InsetSpecialChar::PHRASE_LATEX, x, y);
- x += pi.pain.text(x, y, from_ascii("2"), font);
- x += pi.pain.text(x, y + 0.25 * em, char_type(0x03b5), font);
+ /** Reference macro:
+ * \DeclareRobustCommand{\LaTeXe}{\mbox{\m@th
+ * \if b\expandafter\@car\f@series\@nil\boldmath\fi
+ * \LaTeX\kern.15em2$_{\textstyle\varepsilon}$}}
+ */
+ drawLogo(pi, x, y, InsetSpecialChar::PHRASE_LATEX);
+ x += 3 * em / 20;
+ drawChar(pi, x, y, '2');
+ drawChar(pi, x, y + em / 4, char_type(0x03b5));
break;
case InsetSpecialChar::PHRASE_LATEX: {
- x += pi.pain.text(x, y, from_ascii("L"), font);
- x -= 0.36 * em;
- FontInfo smaller = font;
- smaller.decSize().decSize();
- x += pi.pain.text(x, y - 0.2 * em, from_ascii("A"), smaller);
- x -= 0.15 * em;
- drawLogo(pi, InsetSpecialChar::PHRASE_TEX, x, y);
+ /** Reference macro:
+ * \DeclareRobustCommand{\LaTeX}{L\kern-.36em%
+ * {\sbox\z@ T%
+ * \vbox to\ht\z@{\hbox{\check@mathfonts
+ * \fontsize\sf@size\z@
+ * \math@fontsfalse\selectfont
+ * A}%
+ * \vss}%
+ * }%
+ * \kern-.15em%
+ * \TeX}
+ */
+ drawChar(pi, x, y, 'L');
+ x -= 9 * em / 25;
+ PainterInfo pi2 = pi;
+ pi2.base.font.decSize().decSize();
+ drawChar(pi2, x, y - em / 5, 'A');
+ x -= 3 * em / 20;
+ drawLogo(pi, x, y, InsetSpecialChar::PHRASE_TEX);
break;
}
default:
case PHRASE_TEX:
case PHRASE_LATEX2E:
case PHRASE_LATEX:
- drawLogo(pi, kind_, x, y);
+ drawLogo(pi, x, y, kind_);
break;
}
}
string command;
switch (kind_) {
case HYPHENATION:
- command = "\\-";
+ command = "softhyphen";
break;
case LIGATURE_BREAK:
- command = "\\textcompwordmark{}";
+ command = "ligaturebreak";
break;
case END_OF_SENTENCE:
- command = "\\@.";
+ command = "endofsentence";
break;
case LDOTS:
- command = "\\ldots{}";
+ command = "ldots";
break;
case MENU_SEPARATOR:
- command = "\\menuseparator";
+ command = "menuseparator";
break;
case SLASH:
- command = "\\slash{}";
+ command = "breakableslash";
break;
case NOBREAKDASH:
- command = "\\nobreakdash-";
+ command = "nobreakdash";
break;
case PHRASE_LYX:
- command = "\\LyX";
+ command = "LyX";
break;
case PHRASE_TEX:
- command = "\\TeX";
+ command = "TeX";
break;
case PHRASE_LATEX2E:
- command = "\\LaTeX2e";
+ command = "LaTeX2e";
break;
case PHRASE_LATEX:
- command = "\\LaTeX";
+ command = "LaTeX";
break;
}
os << "\\SpecialChar " << command << "\n";
lex.next();
string const command = lex.getString();
- if (command == "\\-")
+ if (command == "softhyphen")
kind_ = HYPHENATION;
- else if (command == "\\textcompwordmark{}")
+ else if (command == "ligaturebreak")
kind_ = LIGATURE_BREAK;
- else if (command == "\\@.")
+ else if (command == "endofsentence")
kind_ = END_OF_SENTENCE;
- else if (command == "\\ldots{}")
+ else if (command == "ldots")
kind_ = LDOTS;
- else if (command == "\\menuseparator")
+ else if (command == "menuseparator")
kind_ = MENU_SEPARATOR;
- else if (command == "\\slash{}")
+ else if (command == "breakableslash")
kind_ = SLASH;
- else if (command == "\\nobreakdash-")
+ else if (command == "nobreakdash")
kind_ = NOBREAKDASH;
- else if (command == "\\LyX")
+ else if (command == "LyX")
kind_ = PHRASE_LYX;
- else if (command == "\\TeX")
+ else if (command == "TeX")
kind_ = PHRASE_TEX;
- else if (command == "\\LaTeX2e")
+ else if (command == "LaTeX2e")
kind_ = PHRASE_LATEX2E;
- else if (command == "\\LaTeX")
+ else if (command == "LaTeX")
kind_ = PHRASE_LATEX;
else
lex.printError("InsetSpecialChar: Unknown kind: `$$Token'");
case PHRASE_LATEX2E:
if (rp.moving_arg)
os << "\\protect";
- os << "\\LaTeX2e{}";
+ os << "\\LaTeXe{}";
break;
case PHRASE_LATEX:
if (rp.moving_arg)
}
-void InsetSpecialChar::forOutliner(docstring & os, size_t) const
+void InsetSpecialChar::forOutliner(docstring & os, size_t const,
+ bool const) const
{
odocstringstream ods;
plaintext(ods, OutputParams(0));