]> git.lyx.org Git - lyx.git/blobdiff - src/Font.cpp
MathML: more consistency between DocBook and XHTML.
[lyx.git] / src / Font.cpp
index 74ff2de4ed3be20b206b8700fb11b7f10752bcac..26218eeeac280dde50a82bba5400b1f2f8cfd30e 100644 (file)
@@ -114,18 +114,18 @@ void Font::setLanguage(Language const * l)
 
 /// Updates font settings according to request
 void Font::update(Font const & newfont,
-                    Language const * document_language,
+                    Language const * default_lang,
                     bool toggleall)
 {
        bits_.update(newfont.fontInfo(), toggleall);
 
        if (newfont.language() == language() && toggleall)
-               if (language() == document_language)
+               if (language() == default_lang)
                        setLanguage(default_language);
                else
-                       setLanguage(document_language);
+                       setLanguage(default_lang);
        else if (newfont.language() == reset_language)
-               setLanguage(document_language);
+               setLanguage(default_lang);
        else if (newfont.language() != ignore_language)
                setLanguage(newfont.language());
 }
@@ -228,7 +228,8 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                                    OutputParams const & runparams,
                                    Font const & base,
                                    Font const & prev,
-                                   bool const & non_inherit_inset) const
+                                   bool non_inherit_inset,
+                                   bool needs_cprotection) const
 {
        int count = 0;
 
@@ -237,13 +238,20 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
            && language()->lang() != base.language()->lang()
            && language() != prev.language()) {
                if (!language()->polyglossia().empty()) {
-                       string tmp = "\\text" + language()->polyglossia();
+                       string tmp;
+                       if (needs_cprotection)
+                               tmp += "\\cprotect";
+                       tmp += "\\text" + language()->polyglossia();
                        if (!language()->polyglossiaOpts().empty()) {
                                tmp += "[" + language()->polyglossiaOpts() + "]";
-                               if (runparams.use_hyperref && runparams.moving_arg)
+                               if (runparams.use_hyperref && runparams.moving_arg) {
                                        // We need to strip the command for
                                        // the pdf string, see #11813
-                                       tmp = "\\texorpdfstring{" + tmp + "}{}";
+                                       string tmpp;
+                                       if (needs_cprotection)
+                                               tmpp = "\\cprotect";
+                                       tmp = tmpp + "\\texorpdfstring{" + tmp + "}{}";
+                               }
                        }
                        tmp += "{";
                        os << from_ascii(tmp);
@@ -256,21 +264,41 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
        } else if (language()->babel() != base.language()->babel() &&
            language() != prev.language()) {
                if (language()->lang() == "farsi") {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << "\\textFR{";
                        count += 8;
                } else if (!isRightToLeft() &&
                            base.language()->lang() == "farsi") {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << "\\textLR{";
                        count += 8;
                } else if (language()->lang() == "arabic_arabi") {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << "\\textAR{";
                        count += 8;
                } else if (!isRightToLeft() &&
                                base.language()->lang() == "arabic_arabi") {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << "\\textLR{";
                        count += 8;
                // currently the remaining RTL languages are arabic_arabtex and hebrew
                } else if (isRightToLeft() != prev.isRightToLeft()) {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        if (isRightToLeft()) {
                                os << "\\R{";
                                count += 3;
@@ -321,6 +349,10 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                        os << '\\' << LaTeXFamilySwitchNames[f.family()] << termcmd;
                        count += strlen(LaTeXFamilySwitchNames[f.family()]) + 1;
                } else {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << '\\'
                           << LaTeXFamilyCommandNames[f.family()]
                           << '{';
@@ -334,6 +366,10 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                        os << '\\' << LaTeXSeriesSwitchNames[f.series()] << termcmd;
                        count += strlen(LaTeXSeriesSwitchNames[f.series()]) + 1;
                } else {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << '\\'
                           << LaTeXSeriesCommandNames[f.series()]
                           << '{';
@@ -347,6 +383,10 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                        os << '\\' << LaTeXShapeSwitchNames[f.shape()] << termcmd;
                        count += strlen(LaTeXShapeSwitchNames[f.shape()]) + 1;
                } else {
+                       if (needs_cprotection) {
+                               os << "\\cprotect";
+                               count += 9;
+                       }
                        os << '\\'
                           << LaTeXShapeCommandNames[f.shape()]
                           << '{';
@@ -396,11 +436,19 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                }
        }
        if (f.emph() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\emph{";
                count += 6;
        }
        // \noun{} is a LyX special macro
        if (f.noun() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\noun{";
                count += 6;
        }
@@ -408,23 +456,39 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
        // because ulem puts every nested group or macro in a box,
        // which prevents linebreaks (#8424, #8733)
        if (f.underbar() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\uline{";
-               count += 10;
+               count += 7;
                ++runparams.inulemcmd;
        }
        if (f.uuline() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\uuline{";
-               count += 11;
+               count += 8;
                ++runparams.inulemcmd;
        }
        if (f.strikeout() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\sout{";
-               count += 9;
+               count += 6;
                ++runparams.inulemcmd;
        }
        if (f.xout() == FONT_ON) {
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\xout{";
-               count += 9;
+               count += 6;
                ++runparams.inulemcmd;
        }
        if (f.uwave() == FONT_ON) {
@@ -434,8 +498,12 @@ int Font::latexWriteStartChanges(otexstream & os, BufferParams const & bparams,
                        os << "\\ULdepth=1000pt";
                        count += 15;
                }
+               if (needs_cprotection) {
+                       os << "\\cprotect";
+                       count += 9;
+               }
                os << "\\uwave{";
-               count += 10;
+               count += 7;
                ++runparams.inulemcmd;
        }
        return count;
@@ -450,7 +518,7 @@ int Font::latexWriteEndChanges(otexstream & os, BufferParams const & bparams,
                                  Font const & base,
                                  Font const & next,
                                  bool & needPar,
-                                 bool const & closeLanguage) const
+                                 bool closeLanguage) const
 {
        int count = 0;
 
@@ -792,7 +860,7 @@ ostream & operator<<(ostream & os, FontInfo const & f)
 ostream & operator<<(ostream & os, Font const & font)
 {
        return os << font.bits_
-               << " lang: " << (font.lang_ ? font.lang_->lang() : nullptr);
+               << " lang: " << (font.lang_ ? font.lang_->lang() : "");
 }