commit 207eaeee9071cb828a2ab7f4680f8ff92e379af8
Author: Juergen Spitzmueller <sp...@lyx.org>
Date:   Sun May 12 07:52:16 2024 +0200

    Introduce NeedCProtect -1 layout option
    
    It turns out beamer frame does not allow \cprotect and errors if it is
    used. Hence we need to prevent it in this context entirely.
---
 lib/layouts/beamer.layout |  1 +
 src/Layout.cpp            | 13 +++++++++++--
 src/Layout.h              |  3 +++
 src/OutputParams.h        |  5 +++++
 src/Paragraph.cpp         |  2 ++
 src/insets/InsetText.cpp  |  2 +-
 src/output_latex.cpp      | 13 ++++++++-----
 7 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/lib/layouts/beamer.layout b/lib/layouts/beamer.layout
index e9d9c5d904..9649aeb531 100644
--- a/lib/layouts/beamer.layout
+++ b/lib/layouts/beamer.layout
@@ -553,6 +553,7 @@ Style Frame
        
ExampleBlock,AlertBlock,Bibliography,Quotation,Quote,Verse,Corollary,Definition,Definitions,
        Example,Examples,Fact,Lemma,Proof,Theorem,LyX-Code
   EndAutoNests
+  NeedCProtect    -1
 End
 
 Style PlainFrame
diff --git a/src/Layout.cpp b/src/Layout.cpp
index 50a4d05ac6..16d530361d 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -162,6 +162,7 @@ Layout::Layout()
        inpreamble = false;
        needprotect = false;
        needcprotect = false;
+       nocprotect = false;
        needmboxprotect = false;
        keepempty = false;
        font = inherit_font;
@@ -465,9 +466,17 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass 
const & tclass,
                        lex >> needprotect;
                        break;
 
-               case LT_NEED_CPROTECT:
-                       lex >> needcprotect;
+               case LT_NEED_CPROTECT: {
+                       int i;
+                       lex >> i;
+                       nocprotect = false;
+                       needcprotect = false;
+                       if (i == -1)
+                               nocprotect = true;
+                       else if (i == 1)
+                               needcprotect = true;
                        break;
+               }
 
                case LT_NEED_MBOXPROTECT:
                        lex >> needmboxprotect;
diff --git a/src/Layout.h b/src/Layout.h
index 0c0b4ae0ef..c8e3181cc1 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -400,6 +400,9 @@ public:
        /** true when the verbatim stuff of this layout needs to be
            \cprotect'ed. */
        bool needcprotect;
+       /** true when the verbatim stuff of this layout never should be
+           \cprotect'ed. */
+       bool nocprotect;
        /** true when specific commands in this paragraph need to be
            protected in an \mbox. */
        bool needmboxprotect;
diff --git a/src/OutputParams.h b/src/OutputParams.h
index 9d9a7ae8f8..2e7d84e9c7 100644
--- a/src/OutputParams.h
+++ b/src/OutputParams.h
@@ -108,6 +108,11 @@ public:
        */
        bool moving_arg = false;
 
+       /** no_cprotect == true means that the layout in which this is
+        *  does not allow \cprotect'ing.
+       */
+       bool no_cprotect = false;
+
        /** intitle == true means that the environment in which the
            inset is typeset is part of a title (before a \\maketitle).
            Footnotes in such environments have moving arguments.
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index 4282defa4a..ec92fa21cf 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -1172,6 +1172,7 @@ void Paragraph::Private::latexInset(BufferParams const & 
bparams,
                        ? textinset->hasCProtectContent(runparams.moving_arg)
                          && !textinset->text().isMainText()
                          && inset->lyxCode() != BRANCH_CODE
+                         && !runparams.no_cprotect
                        : false;
                unsigned int count2 = basefont.latexWriteStartChanges(os, 
bparams,
                                                      rp, running_font,
@@ -3014,6 +3015,7 @@ void Paragraph::latex(BufferParams const & bparams,
                                        ? 
textinset->hasCProtectContent(runparams.moving_arg)
                                          && !textinset->text().isMainText()
                                          && inInset().lyxCode() != BRANCH_CODE
+                                         && !runparams.no_cprotect
                                        : false;
                                column += 
current_font.latexWriteStartChanges(ots, bparams,
                                                                              
runparams, basefont, last_font, false,
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index 084e418027..3e80312928 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -500,7 +500,7 @@ void InsetText::latex(otexstream & os, OutputParams const & 
runparams) const
                        // FIXME UNICODE
                        // FIXME \protect should only be used for fragile
                        //    commands, but we do not provide this information 
yet.
-                       if (hasCProtectContent(runparams.moving_arg)) {
+                       if (!runparams.no_cprotect && 
hasCProtectContent(runparams.moving_arg)) {
                                if (contains(runparams.active_chars, '^')) {
                                        // cprotect relies on ^ being on 
catcode 7
                                        os << "\\begingroup\\catcode`\\^=7";
diff --git a/src/output_latex.cpp b/src/output_latex.cpp
index 5ec6a535a4..1c1faf7435 100644
--- a/src/output_latex.cpp
+++ b/src/output_latex.cpp
@@ -404,7 +404,7 @@ static void finishEnvironment(otexstream & os, OutputParams 
const & runparams,
 
 
 void TeXEnvironment(Buffer const & buf, Text const & text,
-                   OutputParams const & runparams,
+                   OutputParams const & runparams_in,
                    pit_type & pit, otexstream & os)
 {
        ParagraphList const & paragraphs = text.paragraphs();
@@ -415,6 +415,9 @@ void TeXEnvironment(Buffer const & buf, Text const & text,
        depth_type const current_depth = ipar->params().depth();
        Length const & current_left_indent = ipar->params().leftIndent();
 
+       OutputParams runparams = runparams_in;
+       runparams.no_cprotect = current_layout.nocprotect;
+
        // This is for debugging purpose at the end.
        pit_type const par_begin = pit;
        for (; pit < runparams.par_end; ++pit) {
@@ -736,7 +739,7 @@ void parStartCommand(Paragraph const & par, otexstream & os,
 {
        switch (style.latextype) {
        case LATEX_COMMAND:
-               if (par.needsCProtection(runparams.moving_arg)) {
+               if (!runparams.no_cprotect && 
par.needsCProtection(runparams.moving_arg)) {
                        if (contains(runparams.active_chars, '^'))
                                // cprotect relies on ^ being on catcode 7
                                os << "\\begingroup\\catcode`\\^=7";
@@ -871,7 +874,7 @@ void TeXOnePar(Buffer const & buf,
                // the code is different (JMarc)
                if (style.isCommand()) {
                        os << "}";
-                       if (par.needsCProtection(runparams.moving_arg)
+                       if (!runparams.no_cprotect && 
par.needsCProtection(runparams.moving_arg)
                            && contains(runparams.active_chars, '^'))
                                os << "\\endgroup";
                        if (merged_par)
@@ -1234,7 +1237,7 @@ void TeXOnePar(Buffer const & buf,
                                os << runparams.post_macro;
                                runparams.post_macro.clear();
                        }
-                       if (par.needsCProtection(runparams.moving_arg)
+                       if (!runparams.no_cprotect && 
par.needsCProtection(runparams.moving_arg)
                            && contains(runparams.active_chars, '^'))
                                os << "\\endgroup";
                        if (runparams.encoding != prev_encoding) {
@@ -1405,7 +1408,7 @@ void TeXOnePar(Buffer const & buf,
                        os << runparams.post_macro;
                        runparams.post_macro.clear();
                }
-               if (par.needsCProtection(runparams.moving_arg)
+               if (!runparams.no_cprotect && 
par.needsCProtection(runparams.moving_arg)
                    && contains(runparams.active_chars, '^'))
                        os << "\\endgroup";
                if (runparams.encoding != prev_encoding) {
-- 
lyx-cvs mailing list
lyx-cvs@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to