Properly fix handling of title layouts within insets (#11787)

(cherry picked from commit e4ef8ddc0f)
This commit is contained in:
Juergen Spitzmueller 2020-07-03 16:18:53 +02:00
parent 83d76a66f6
commit b86b80d74e
7 changed files with 34 additions and 16 deletions

View File

@ -20,9 +20,9 @@ namespace lyx {
OutputParams::OutputParams(Encoding const * enc) OutputParams::OutputParams(Encoding const * enc)
: flavor(LATEX), math_flavor(NotApplicable), nice(false), is_child(false), : flavor(LATEX), math_flavor(NotApplicable), nice(false), is_child(false),
moving_arg(false), intitle(false), inbranch(false), inulemcmd(0), moving_arg(false), intitle(false), need_maketitle(false), have_maketitle(false),
local_font(0), master_language(0), encoding(enc), free_spacing(false), inbranch(false), inulemcmd(0), local_font(0), master_language(0), encoding(enc),
use_babel(false), use_polyglossia(false), use_hyperref(false), free_spacing(false), use_babel(false), use_polyglossia(false), use_hyperref(false),
use_indices(false), use_japanese(false), linelen(0), depth(0), use_indices(false), use_japanese(false), linelen(0), depth(0),
exportdata(new ExportData), inDisplayMath(false), wasDisplayMath(false), exportdata(new ExportData), inDisplayMath(false), wasDisplayMath(false),
inComment(false), openbtUnit(false), only_childbibs(false), inComment(false), openbtUnit(false), only_childbibs(false),

View File

@ -102,6 +102,15 @@ public:
*/ */
bool intitle; 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 /** inbranch == true means that the environment being typeset
is inside an active branch inset. is inside an active branch inset.
*/ */

View File

@ -2784,6 +2784,10 @@ void Paragraph::latex(BufferParams const & bparams,
// such as Note that do not produce any output, so that no // such as Note that do not produce any output, so that no
// command is ever executed but its opening was recorded. // command is ever executed but its opening was recorded.
runparams.inulemcmd = rp.inulemcmd; 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 // If we have an open font definition, we have to close it

View File

@ -297,6 +297,9 @@ void InsetBranch::latex(otexstream & os, OutputParams const & runparams) const
OutputParams rp = runparams; OutputParams rp = runparams;
rp.inbranch = true; rp.inbranch = true;
InsetText::latex(os, rp); InsetText::latex(os, rp);
// These need to be passed upstream
runparams.need_maketitle = rp.need_maketitle;
runparams.have_maketitle = rp.have_maketitle;
} }
} }

View File

@ -501,6 +501,9 @@ void InsetText::latex(otexstream & os, OutputParams const & runparams) const
// Output the contents of the inset // Output the contents of the inset
latexParagraphs(buffer(), text_, os, rp); latexParagraphs(buffer(), text_, os, rp);
runparams.encoding = rp.encoding; 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()) if (!il.rightdelim().empty())
os << il.rightdelim(); os << il.rightdelim();

View File

@ -1318,6 +1318,9 @@ void TeXOnePar(Buffer const & buf,
else else
runparams_in.encoding = runparams.encoding; 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!!! // we don't need a newline for the last paragraph!!!
// Note from JMarc: we will re-add a \n explicitly in // 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; pit_type pit = runparams.par_begin;
// lastpit is for the language check after the loop. // lastpit is for the language check after the loop.
pit_type lastpit = pit; pit_type lastpit = pit;
// variables used in the loop:
bool was_title = false;
bool already_title = false;
DocumentClass const & tclass = bparams.documentClass(); DocumentClass const & tclass = bparams.documentClass();
// Did we already warn about inTitle layout mixing? (we only warn once) // 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(); tclass.plainLayout() : par->layout();
if (layout.intitle) { if (layout.intitle) {
if (already_title) { if (runparams.have_maketitle) {
if (!gave_layout_warning && !runparams.dryrun) { if (!gave_layout_warning && !runparams.dryrun) {
gave_layout_warning = true; gave_layout_warning = true;
frontend::Alert::warning(_("Error in latexParagraphs"), frontend::Alert::warning(_("Error in latexParagraphs"),
@ -1488,15 +1488,15 @@ void latexParagraphs(Buffer const & buf,
"could lead to missing or incorrect output." "could lead to missing or incorrect output."
), layout.name())); ), layout.name()));
} }
} else if (!was_title) { } else if (!runparams.need_maketitle) {
was_title = true; runparams.need_maketitle = true;
if (tclass.titletype() == TITLE_ENVIRONMENT) { if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\begin{" os << "\\begin{"
<< from_ascii(tclass.titlename()) << from_ascii(tclass.titlename())
<< "}\n"; << "}\n";
} }
} }
} else if (was_title && !already_title && !layout.inpreamble) { } else if (runparams.need_maketitle && !runparams.have_maketitle && !layout.inpreamble) {
if (tclass.titletype() == TITLE_ENVIRONMENT) { if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\end{" << from_ascii(tclass.titlename()) os << "\\end{" << from_ascii(tclass.titlename())
<< "}\n"; << "}\n";
@ -1505,8 +1505,8 @@ void latexParagraphs(Buffer const & buf,
os << "\\" << from_ascii(tclass.titlename()) os << "\\" << from_ascii(tclass.titlename())
<< "\n"; << "\n";
} }
already_title = true; runparams.have_maketitle = true;
was_title = false; runparams.need_maketitle = false;
} }
if (layout.isCommand() && !layout.latexname().empty() 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. // 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 // the document. (There may be some other checks of this
// kind that are needed.) // kind that are needed.)
if (was_title && !already_title && !runparams.inbranch) { if (runparams.need_maketitle && !runparams.have_maketitle && maintext) {
if (tclass.titletype() == TITLE_ENVIRONMENT) { if (tclass.titletype() == TITLE_ENVIRONMENT) {
os << "\\end{" << from_ascii(tclass.titlename()) os << "\\end{" << from_ascii(tclass.titlename())
<< "}\n"; << "}\n";

View File

@ -45,8 +45,7 @@ What's new
* DOCUMENT INPUT/OUTPUT * DOCUMENT INPUT/OUTPUT
- Fix wrong output of quotation marks in headings and captions with hyperref - Fix output of titles in branches and other insets (follow-up to bug 11787).
enabled (bug 11889).
* USER INTERFACE * USER INTERFACE