]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetSpecialChar.cpp
Minor string fixes
[lyx.git] / src / insets / InsetSpecialChar.cpp
index e4fd180370faf13945eb920af9016775c90074eb..ff4c7208a60c2abaa05fdd89e015b6cc7b4689b0 100644 (file)
@@ -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