]> git.lyx.org Git - lyx.git/commitdiff
Add cprotection support for paragraph layouts.
authorJuergen Spitzmueller <spitz@lyx.org>
Sat, 14 Apr 2018 10:57:23 +0000 (12:57 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sat, 14 Apr 2018 10:57:23 +0000 (12:57 +0200)
lib/doc/Customization.lyx
lib/layouts/stdlayouts.inc
src/Layout.cpp
src/Layout.h
src/Paragraph.cpp

index ab1092e8cb120d14edf5af46d4deb2afccba20ec..66d753354fd195ff298e68e2a8b16837d252429a 100644 (file)
@@ -14762,6 +14762,76 @@ protect
 not
 \emph default
  whether this command should itself be protected.)
+\change_inserted -712698321 1523696949
+
+\end_layout
+
+\begin_layout Description
+
+\change_inserted -712698321 1523696969
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1523696950
+NeedCProtect
+\end_layout
+
+\end_inset
+
+ [
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1523696950
+
+\emph on
+0
+\end_layout
+
+\end_inset
+
+,
+\begin_inset space \thinspace{}
+\end_inset
+
+
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1523696950
+1
+\end_layout
+
+\end_inset
+
+] This causes macros that contain this layout to be protected with 
+\begin_inset Flex Code
+status collapsed
+
+\begin_layout Plain Layout
+
+\change_inserted -712698321 1523696950
+
+\backslash
+cprotect
+\end_layout
+
+\end_inset
+
+ (cf.
+ package 
+\family sans
+cprotect
+\family default
+) if necessary and thus allows (some) verbatim stuff in macros.
+\change_unchanged
+
 \end_layout
 
 \begin_layout Description
index e35ee0838df3a4ad585ffc10cc3923ab9738ba41..3d627e2ea32c9a01f6da2b22904bdc6d4e166af0 100644 (file)
@@ -78,9 +78,10 @@ Style Verbatim
        LatexType             Environment
        LatexName             verbatim
        NextNoIndent          1
-       ParbreakIsNewline         1
+       ParbreakIsNewline     1
        FreeSpacing           1
        PassThru              1
+       NeedCProtect          1
        KeepEmpty             1
        NewLine               0
        TopSep                0.7
index 005acb22581fddc7a122312216e812cfdc023c23..7801e8fcb27f96c4f4b0dba7799e55c171290650 100644 (file)
@@ -74,6 +74,7 @@ enum LayoutTags {
        LT_LATEXTYPE,
        LT_LEFTDELIM,
        LT_LEFTMARGIN,
+       LT_NEED_CPROTECT,
        LT_NEED_PROTECT,
        LT_NEWLINE,
        LT_NEXTNOINDENT,
@@ -130,6 +131,7 @@ Layout::Layout()
        intitle = false;
        inpreamble = false;
        needprotect = false;
+       needcprotect = false;
        keepempty = false;
        font = inherit_font;
        labelfont = inherit_font;
@@ -242,6 +244,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                { "leftdelim",      LT_LEFTDELIM },
                { "leftmargin",     LT_LEFTMARGIN },
                { "margin",         LT_MARGIN },
+               { "needcprotect",    LT_NEED_CPROTECT },
                { "needprotect",    LT_NEED_PROTECT },
                { "newline",        LT_NEWLINE },
                { "nextnoindent",   LT_NEXTNOINDENT },
@@ -393,6 +396,10 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        lex >> needprotect;
                        break;
 
+               case LT_NEED_CPROTECT:
+                       lex >> needcprotect;
+                       break;
+
                case LT_KEEPEMPTY:
                        lex >> keepempty;
                        break;
@@ -1212,6 +1219,7 @@ void Layout::write(ostream & os) const
             it != postcommandargs_.end(); ++it)
                writeArgument(os, it->first, it->second);
        os << "\tNeedProtect " << needprotect << "\n"
+             "\tNeedCProtect " << needcprotect << "\n"
              "\tKeepEmpty " << keepempty << '\n';
        if (labelfont == font)
                lyxWrite(os, font, "Font", 1);
index 04f184f3a4d7d263824b39935c8aa25f2d88dd0d..fc980719a92a12e9d9c39f8d095645bfba4e6526 100644 (file)
@@ -311,6 +311,9 @@ public:
        /** true when the fragile commands in the paragraph need to be
            \protect'ed. */
        bool needprotect;
+       /** true when the verbatim stuff of this layout needs to ce
+           \cprotect'ed. */
+       bool needcprotect;
        /// true when empty paragraphs should be kept.
        bool keepempty;
        /// Type of LaTeX object
index b7ce543cafc3f2e41211350a5a23c960a12de1e1..50971e3170c408b91e04abd6d0b3f39c02bed5c9 100644 (file)
@@ -3380,6 +3380,25 @@ bool Paragraph::isHardHyphenOrApostrophe(pos_type pos) const
 
 bool Paragraph::needsCProtection() const
 {
+       // first check the layout of the paragraph
+       if (layout().needcprotect) {
+               // Environments need cprotection regardless the content
+               if (layout().latextype == LATEX_ENVIRONMENT)
+                       return true;
+
+               // Commands need cprotection if they contain specific chars
+               int const nchars_escape = 9;
+               static char_type const chars_escape[nchars_escape] = {
+                       '&', '_', '$', '%', '#', '^', '{', '}', '\\'};
+
+               docstring const pars = asString();
+               for (int k = 0; k < nchars_escape; k++) {
+                       if (contains(pars, chars_escape[k]))
+                               return true;
+               }
+       }
+
+       // now check whether we have insets that need cprotection
        pos_type size = d->text_.size();
        for (pos_type i = 0; i < size; ++i)
                if (isInset(i))