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))