From: Juergen Spitzmueller Date: Sun, 12 May 2024 05:52:16 +0000 (+0200) Subject: Introduce NeedCProtect -1 layout option X-Git-Tag: 2.4.0~17 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=f05fd787548e8b3082051b7d45bb4119f97a55dc;p=lyx.git 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) --- 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 49713a8b9a..0f495f50f8 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 d65cbf9f31..121b763e2f 100644 --- a/src/insets/InsetText.cpp +++ b/src/insets/InsetText.cpp @@ -494,7 +494,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) {