commit ef359f58b506c26255d8c992e7af0f9f2c6c3058
Author: Juergen Spitzmueller <[email protected]>
Date:   Sat Apr 14 12:57:23 2018 +0200

    Add cprotection support for paragraph layouts.
---
 lib/doc/Customization.lyx  |   70 ++++++++++++++++++++++++++++++++++++++++++++
 lib/layouts/stdlayouts.inc |    3 +-
 src/Layout.cpp             |    8 +++++
 src/Layout.h               |    3 ++
 src/Paragraph.cpp          |   19 ++++++++++++
 5 files changed, 102 insertions(+), 1 deletions(-)

diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx
index ab1092e..66d7533 100644
--- a/lib/doc/Customization.lyx
+++ b/lib/doc/Customization.lyx
@@ -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
diff --git a/lib/layouts/stdlayouts.inc b/lib/layouts/stdlayouts.inc
index e35ee08..3d627e2 100644
--- a/lib/layouts/stdlayouts.inc
+++ b/lib/layouts/stdlayouts.inc
@@ -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
diff --git a/src/Layout.cpp b/src/Layout.cpp
index 005acb2..7801e8f 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -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);
diff --git a/src/Layout.h b/src/Layout.h
index 04f184f..fc98071 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -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
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index b7ce543..50971e3 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -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))

Reply via email to