[LyX/2.3.x] Properly fix handling of title layouts within insets (#11787)

Juergen Spitzmueller spitz at lyx.org
Sat Jul 4 07:32:47 UTC 2020


commit b86b80d74e767d332ff6f860e0931a15884ebd48
Author: Juergen Spitzmueller <spitz at lyx.org>
Date:   Fri Jul 3 16:18:53 2020 +0200

    Properly fix handling of title layouts within insets (#11787)
    
    (cherry picked from commit e4ef8ddc0f820290a2fead1149e1e950bd947832)
---
 src/OutputParams.cpp       |    6 +++---
 src/OutputParams.h         |    9 +++++++++
 src/Paragraph.cpp          |    4 ++++
 src/insets/InsetBranch.cpp |    3 +++
 src/insets/InsetText.cpp   |    3 +++
 src/output_latex.cpp       |   22 +++++++++++-----------
 status.23x                 |    3 +--
 7 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/src/OutputParams.cpp b/src/OutputParams.cpp
index d203761..a1bedbc 100644
--- a/src/OutputParams.cpp
+++ b/src/OutputParams.cpp
@@ -20,9 +20,9 @@ namespace lyx {
 
 OutputParams::OutputParams(Encoding const * enc)
 	: flavor(LATEX), math_flavor(NotApplicable), nice(false), is_child(false),
-	  moving_arg(false), intitle(false), inbranch(false), inulemcmd(0),
-	  local_font(0), master_language(0), encoding(enc), free_spacing(false),
-	  use_babel(false), use_polyglossia(false), use_hyperref(false),
+	  moving_arg(false), intitle(false), need_maketitle(false), have_maketitle(false),
+	  inbranch(false), inulemcmd(0), local_font(0), master_language(0), encoding(enc),
+	  free_spacing(false), use_babel(false), use_polyglossia(false), use_hyperref(false),
 	  use_indices(false), use_japanese(false), linelen(0), depth(0),
 	  exportdata(new ExportData), inDisplayMath(false), wasDisplayMath(false),
 	  inComment(false), openbtUnit(false), only_childbibs(false),
diff --git a/src/OutputParams.h b/src/OutputParams.h
index 6366422..56e698c 100644
--- a/src/OutputParams.h
+++ b/src/OutputParams.h
@@ -102,6 +102,15 @@ public:
 	*/
 	bool intitle;
 
+	/** need_maketitle == true means that the last layout was a title layout
+	 * this is to track when \maketitle needs to be output.
+	*/
+	mutable bool need_maketitle;
+
+	/** have_maketitle == true means that \maketitle already hase been output.
+	*/
+	mutable bool have_maketitle;
+
 	/** inbranch == true means that the environment being typeset
 	    is inside an active branch inset.
 	*/
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index e66474e..5b5a944 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -2784,6 +2784,10 @@ void Paragraph::latex(BufferParams const & bparams,
 		// such as Note that do not produce any output, so that no
 		// command is ever executed but its opening was recorded.
 		runparams.inulemcmd = rp.inulemcmd;
+
+		// These need to be passed upstream as well
+		runparams.need_maketitle = rp.need_maketitle;
+		runparams.have_maketitle = rp.have_maketitle;
 	}
 
 	// If we have an open font definition, we have to close it
diff --git a/src/insets/InsetBranch.cpp b/src/insets/InsetBranch.cpp
index 4330504..460240f 100644
--- a/src/insets/InsetBranch.cpp
+++ b/src/insets/InsetBranch.cpp
@@ -297,6 +297,9 @@ void InsetBranch::latex(otexstream & os, OutputParams const & runparams) const
 		OutputParams rp = runparams;
 		rp.inbranch = true;
 		InsetText::latex(os, rp);
+		// These need to be passed upstream
+		runparams.need_maketitle = rp.need_maketitle;
+		runparams.have_maketitle = rp.have_maketitle;
 	}
 }
 
diff --git a/src/insets/InsetText.cpp b/src/insets/InsetText.cpp
index da195b0..d0a37d6 100644
--- a/src/insets/InsetText.cpp
+++ b/src/insets/InsetText.cpp
@@ -501,6 +501,9 @@ void InsetText::latex(otexstream & os, OutputParams const & runparams) const
 	// Output the contents of the inset
 	latexParagraphs(buffer(), text_, os, rp);
 	runparams.encoding = rp.encoding;
+	// These need to be passed upstream as well
+	runparams.need_maketitle = rp.need_maketitle;
+	runparams.have_maketitle = rp.have_maketitle;
 
 	if (!il.rightdelim().empty())
 		os << il.rightdelim();
diff --git a/src/output_latex.cpp b/src/output_latex.cpp
index 08958aa..c382050 100644
--- a/src/output_latex.cpp
+++ b/src/output_latex.cpp
@@ -1318,6 +1318,9 @@ void TeXOnePar(Buffer const & buf,
 	else
 		runparams_in.encoding = runparams.encoding;
 
+	// These need to be passed upstream as well
+	runparams_in.need_maketitle = runparams.need_maketitle;
+	runparams_in.have_maketitle = runparams.have_maketitle;
 
 	// we don't need a newline for the last paragraph!!!
 	// Note from JMarc: we will re-add a \n explicitly in
@@ -1461,9 +1464,6 @@ void latexParagraphs(Buffer const & buf,
 	pit_type pit = runparams.par_begin;
 	// lastpit is for the language check after the loop.
 	pit_type lastpit = pit;
-	// variables used in the loop:
-	bool was_title = false;
-	bool already_title = false;
 	DocumentClass const & tclass = bparams.documentClass();
 
 	// Did we already warn about inTitle layout mixing? (we only warn once)
@@ -1478,7 +1478,7 @@ void latexParagraphs(Buffer const & buf,
 				tclass.plainLayout() : par->layout();
 
 		if (layout.intitle) {
-			if (already_title) {
+			if (runparams.have_maketitle) {
 				if (!gave_layout_warning && !runparams.dryrun) {
 					gave_layout_warning = true;
 					frontend::Alert::warning(_("Error in latexParagraphs"),
@@ -1488,15 +1488,15 @@ void latexParagraphs(Buffer const & buf,
 							  "could lead to missing or incorrect output."
 							  ), layout.name()));
 				}
-			} else if (!was_title) {
-				was_title = true;
+			} else if (!runparams.need_maketitle) {
+				runparams.need_maketitle = true;
 				if (tclass.titletype() == TITLE_ENVIRONMENT) {
 					os << "\\begin{"
 							<< from_ascii(tclass.titlename())
 							<< "}\n";
 				}
 			}
-		} else if (was_title && !already_title && !layout.inpreamble) {
+		} else if (runparams.need_maketitle && !runparams.have_maketitle && !layout.inpreamble) {
 			if (tclass.titletype() == TITLE_ENVIRONMENT) {
 				os << "\\end{" << from_ascii(tclass.titlename())
 						<< "}\n";
@@ -1505,8 +1505,8 @@ void latexParagraphs(Buffer const & buf,
 				os << "\\" << from_ascii(tclass.titlename())
 						<< "\n";
 			}
-			already_title = true;
-			was_title = false;
+			runparams.have_maketitle = true;
+			runparams.need_maketitle = false;
 		}
 
 		if (layout.isCommand() && !layout.latexname().empty()
@@ -1541,10 +1541,10 @@ void latexParagraphs(Buffer const & buf,
 	}
 
 	// It might be that we only have a title in this document.
-	// But if we're in a branch, this is not the end of
+	// But if we're in an inset, this is not the end of
 	// the document. (There may be some other checks of this
 	// kind that are needed.)
-	if (was_title && !already_title && !runparams.inbranch) {
+	if (runparams.need_maketitle && !runparams.have_maketitle && maintext) {
 		if (tclass.titletype() == TITLE_ENVIRONMENT) {
 			os << "\\end{" << from_ascii(tclass.titlename())
 			   << "}\n";
diff --git a/status.23x b/status.23x
index 92a3fe6..1bf9d58 100644
--- a/status.23x
+++ b/status.23x
@@ -45,8 +45,7 @@ What's new
 
 * DOCUMENT INPUT/OUTPUT
 
-- Fix wrong output of quotation marks in headings and captions with hyperref
-  enabled (bug 11889).
+- Fix output of titles in branches and other insets (follow-up to bug 11787).
 
 
 * USER INTERFACE


More information about the lyx-cvs mailing list