X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetSpecialChar.cpp;h=ff4c7208a60c2abaa05fdd89e015b6cc7b4689b0;hb=33fa147fcab25bbc0649d620e9df229736870bfc;hp=e4fd180370faf13945eb920af9016775c90074eb;hpb=322da78299e364aaf9bf977ac51347942d28141a;p=lyx.git diff --git a/src/insets/InsetSpecialChar.cpp b/src/insets/InsetSpecialChar.cpp index e4fd180370..ff4c7208a6 100644 --- a/src/insets/InsetSpecialChar.cpp +++ b/src/insets/InsetSpecialChar.cpp @@ -20,6 +20,7 @@ #include "Lexer.h" #include "MetricsInfo.h" #include "output_xhtml.h" +#include "texstream.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" @@ -47,30 +48,32 @@ namespace { 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; } @@ -126,49 +129,81 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const } if (dim.wid == 0) dim.wid = fm.width(s); - - setDimCache(mi, dim); } 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) +{ + FontInfo font = pi.base.font; + font.setPaintColor(pi.textColor(font.realColor())); + pi.pain.text(x, y, ch, font); + x += theFontMetrics(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: @@ -244,82 +279,80 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const case PHRASE_TEX: case PHRASE_LATEX2E: case PHRASE_LATEX: - drawLogo(pi, kind_, x, y); + drawLogo(pi, x, y, kind_); break; } } -// In lyxf3 this will be just LaTeX void InsetSpecialChar::write(ostream & os) const { 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"; } -// This function will not be necessary when lyx3 void InsetSpecialChar::read(Lexer & lex) { 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'"); @@ -334,22 +367,23 @@ void InsetSpecialChar::latex(otexstream & os, os << "\\-"; break; case LIGATURE_BREAK: - os << "\\textcompwordmark{}"; + os << "\\textcompwordmark" << termcmd; break; case END_OF_SENTENCE: os << "\\@."; break; case LDOTS: - os << "\\ldots{}"; + os << "\\ldots" << termcmd; break; case MENU_SEPARATOR: if (rp.local_font->isRightToLeft()) - os << "\\lyxarrow*{}"; + os << "\\lyxarrow*"; else - os << "\\lyxarrow{}"; + os << "\\lyxarrow"; + os << termcmd; break; case SLASH: - os << "\\slash{}"; + os << "\\slash" << termcmd; break; case NOBREAKDASH: if (rp.moving_arg) @@ -359,22 +393,22 @@ void InsetSpecialChar::latex(otexstream & os, case PHRASE_LYX: if (rp.moving_arg) os << "\\protect"; - os << "\\LyX{}"; + os << "\\LyX" << termcmd; break; case PHRASE_TEX: if (rp.moving_arg) os << "\\protect"; - os << "\\TeX{}"; + os << "\\TeX" << termcmd; break; case PHRASE_LATEX2E: if (rp.moving_arg) os << "\\protect"; - os << "\\LaTeX2e{}"; + os << "\\LaTeXe" << termcmd; break; case PHRASE_LATEX: if (rp.moving_arg) os << "\\protect"; - os << "\\LaTeX{}"; + os << "\\LaTeX" << termcmd; break; } } @@ -517,7 +551,8 @@ void InsetSpecialChar::toString(odocstream & os) const } -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)); @@ -536,6 +571,12 @@ void InsetSpecialChar::validate(LaTeXFeatures & features) const } +bool InsetSpecialChar::isChar() const +{ + return kind_ != HYPHENATION || kind_ != LIGATURE_BREAK; +} + + bool InsetSpecialChar::isLetter() const { return kind_ == HYPHENATION || kind_ == LIGATURE_BREAK