commit 0af725902578cf9b820008c85e7b36eb7fea7eed
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.
    
    (cherry picked from commit 207eaeee9071cb828a2ab7f4680f8ff92e379af8)
    (cherry picked from commit f05fd787548e8b3082051b7d45bb4119f97a55dc)
---
 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 8e54891fb9..d7b9cb2e9c 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 6581155007..144603f06c 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -399,6 +399,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 b8e65709a1..9a60f4d855 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