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