From 207eaeee9071cb828a2ab7f4680f8ff92e379af8 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Sun, 12 May 2024 07:52:16 +0200 Subject: [PATCH] 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) { -- 2.39.2