]> git.lyx.org Git - lyx.git/commitdiff
Introduce NeedCProtect -1 layout option
authorJuergen Spitzmueller <spitz@lyx.org>
Sun, 12 May 2024 05:52:16 +0000 (07:52 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Sun, 12 May 2024 05:52:16 +0000 (07:52 +0200)
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
src/Layout.cpp
src/Layout.h
src/OutputParams.h
src/Paragraph.cpp
src/insets/InsetText.cpp
src/output_latex.cpp

index e9d9c5d9043427d1a8b81ee71470af053f7363a4..9649aeb531f462dedcbd25b2a255cd86fa9a0dd5 100644 (file)
@@ -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
index 50a4d05ac6b72b259071f82edc6c99f5edcd032a..16d530361d046efd7b2230a6ccfd2d0940f69e3b 100644 (file)
@@ -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;
index 0c0b4ae0ef89f29a88c3ffafa16b6474077ecb9d..c8e3181cc1cfb035377ed2b10343c684117305cf 100644 (file)
@@ -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;
index 9d9a7ae8f83248bb449bb18fd1b7c421cb10fce6..2e7d84e9c79b06476e4015adc2e44172983280ce 100644 (file)
@@ -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.
index 4282defa4a8fc5fed58bd71507138b012a8a6537..ec92fa21cfbc4236c135dcb8bc7a4e3793aedc40 100644 (file)
@@ -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,
index 084e41802707ce2e779ed9272235c435eb8d6948..3e80312928d1890ce7bf85be3e2e796b724f604c 100644 (file)
@@ -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";
index 5ec6a535a4bda7360beb1bf72d28ecc43ba01bb6..1c1faf7435f1554e3d76d4fd1919c2dfc38dbce9 100644 (file)
@@ -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) {