]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
* de/UserGuide: some translation work.
[lyx.git] / src / Paragraph.cpp
index 50b0bcfb00dca066acc1493986449a87547d0c96..9f3fb5ec982f4b71e6a4dc6533a05c8081cb4663 100644 (file)
@@ -336,6 +336,7 @@ public:
                                   Change const & running_change,
                                   Layout const & style,
                                   pos_type & i,
+                                  pos_type end_pos,
                                   unsigned int & column);
 
        ///
@@ -354,6 +355,7 @@ public:
        bool latexSpecialPhrase(
                otexstream & os,
                pos_type & i,
+               pos_type end_pos,
                unsigned int & column,
                OutputParams const & runparams);
 
@@ -1089,7 +1091,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
        // ArabTeX, though, cannot handle this special behavior, it seems.
        bool arabtex = basefont.language()->lang() == "arabic_arabtex"
                || running_font.language()->lang() == "arabic_arabtex";
-       if (open_font && inset->noFontChange()) {
+       if (open_font && !inset->inheritFont()) {
                bool closeLanguage = arabtex
                        || basefont.isRightToLeft() == running_font.isRightToLeft();
                unsigned int count = running_font.latexWriteEndChanges(os,
@@ -1148,15 +1150,18 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
                                          Change const & running_change,
                                          Layout const & style,
                                          pos_type & i,
+                                         pos_type end_pos,
                                          unsigned int & column)
 {
        char_type const c = text_[i];
 
        if (style.pass_thru || runparams.pass_thru) {
-               if (c != '\0')
-                       // FIXME UNICODE: This can fail if c cannot
-                       // be encoded in the current encoding.
+               if (c != '\0') {
+                       Encoding const * const enc = runparams.encoding;
+                       if (enc && enc->latexChar(c, true).empty())
+                               throw EncodingException(c);
                        os.put(c);
+               }
                return;
        }
 
@@ -1237,7 +1242,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
 
        default:
                // LyX, LaTeX etc.
-               if (latexSpecialPhrase(os, i, column, runparams))
+               if (latexSpecialPhrase(os, i, end_pos, column, runparams))
                        return;
 
                if (c == '\0')
@@ -1323,7 +1328,10 @@ bool Paragraph::Private::latexSpecialTypewriter(char_type const c, otexstream &
 }
 
 
-bool Paragraph::Private::latexSpecialPhrase(otexstream & os, pos_type & i,
+/// \param end_pos
+///   If [start_pos, end_pos) does not include entirely the special phrase, then
+///   do not apply the macro transformation.
+bool Paragraph::Private::latexSpecialPhrase(otexstream & os, pos_type & i, pos_type end_pos,
        unsigned int & column, OutputParams const & runparams)
 {
        // FIXME: if we have "LaTeX" with a font
@@ -1333,7 +1341,8 @@ bool Paragraph::Private::latexSpecialPhrase(otexstream & os, pos_type & i,
        // "words" for some definition of word
 
        for (size_t pnr = 0; pnr < phrases_nr; ++pnr) {
-               if (!isTextAt(special_phrases[pnr].phrase, i))
+               if (!isTextAt(special_phrases[pnr].phrase, i)
+                   || (end_pos != -1 && i + int(special_phrases[pnr].phrase.size()) > end_pos))
                        continue;
                if (runparams.moving_arg)
                        os << "\\protect";
@@ -2499,7 +2508,7 @@ void Paragraph::latex(BufferParams const & bparams,
                        if (i >= start_pos && (end_pos == -1 || i < end_pos)) {
                                try {
                                        d->latexSpecialChar(os, rp, running_font, runningChange,
-                                               style, i, column);
+                                                           style, i, end_pos, column);
                                } catch (EncodingException & e) {
                                if (runparams.dryrun) {
                                        os << "<" << _("LyX Warning: ")