X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=1061f3d28f07f659b2b15181282d13eede4467ec;hb=4e50da3e655b9f8d26f7d5e439d72b219d32279d;hp=04d1e1789f04201c006a3ecaa541b1a1d3e2e6e6;hpb=861c6167ca5f1329e16dd788489a7c03772e2332;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 04d1e1789f..1061f3d28f 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -19,8 +19,6 @@ #include "Font.h" #include "InsetList.h" #include "Language.h" -#include "LaTeXFeatures.h" -#include "Layout.h" #include "LyXRC.h" #include "OutputParams.h" #include "Paragraph.h" @@ -37,7 +35,6 @@ #include "support/convert.h" #include "support/debug.h" #include "support/lstrings.h" -#include "support/lyxalgo.h" #include "support/textutils.h" #include "support/gettext.h" @@ -63,16 +60,16 @@ enum OpenEncoding { struct OutputState { - OutputState() : open_encoding_(none), cjk_inherited_(0), - prev_env_language_(nullptr), nest_level_(0) + OutputState() : prev_env_language_(nullptr), open_encoding_(none), + cjk_inherited_(0), nest_level_(0) { } - OpenEncoding open_encoding_; - int cjk_inherited_; Language const * prev_env_language_; - int nest_level_; stack lang_switch_depth_; // Both are always empty when stack open_polyglossia_lang_; // not using polyglossia + OpenEncoding open_encoding_; + int cjk_inherited_; + int nest_level_; }; @@ -109,7 +106,7 @@ bool atSameLastLangSwitchDepth(OutputState const * state) // commands. Instead, return always true when using babel with // only a begin command. - return state->lang_switch_depth_.size() == 0 + return state->lang_switch_depth_.empty() ? true : abs(state->lang_switch_depth_.top()) == state->nest_level_; } @@ -119,7 +116,7 @@ bool isLocalSwitch(OutputState const * state) { // Return true if the language was opened by a local command switch. - return state->lang_switch_depth_.size() + return !state->lang_switch_depth_.empty() && state->lang_switch_depth_.top() < 0; } @@ -128,7 +125,7 @@ bool langOpenedAtThisLevel(OutputState const * state) { // Return true if the language was opened at the current nesting level. - return state->lang_switch_depth_.size() + return !state->lang_switch_depth_.empty() && abs(state->lang_switch_depth_.top()) == state->nest_level_; } @@ -164,10 +161,10 @@ string const getPolyglossiaBegin(string const & lang_begin_command, struct TeXEnvironmentData { - bool cjk_nested; Layout const * style; Language const * par_language; Encoding const * prev_encoding; + bool cjk_nested; bool leftindent_open; }; @@ -188,8 +185,9 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf, bparams.documentClass().plainLayout() : pit->layout(); ParagraphList const & paragraphs = text.paragraphs(); + bool const firstpar = pit == paragraphs.begin(); ParagraphList::const_iterator const priorpit = - pit == paragraphs.begin() ? pit : prev(pit, 1); + firstpar ? pit : prev(pit, 1); OutputState * state = getOutputState(); bool const use_prev_env_language = state->prev_env_language_ != nullptr @@ -202,10 +200,13 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf, data.par_language = pit->getParLanguage(bparams); Language const * const doc_language = bparams.language; Language const * const prev_par_language = - (pit != paragraphs.begin()) - ? (use_prev_env_language ? state->prev_env_language_ - : priorpit->getParLanguage(bparams)) - : doc_language; + // use font at inset or document language in first paragraph + firstpar ? (runparams.local_font ? + runparams.local_font->language() + : doc_language) + : (use_prev_env_language ? + state->prev_env_language_ + : priorpit->getParLanguage(bparams)); bool const use_polyglossia = runparams.use_polyglossia; string const par_lang = use_polyglossia ? @@ -222,11 +223,14 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf, !lang_end_command.empty(); // For polyglossia, switch language outside of environment, if possible. + // However, if we are at the start of an inset, do not close languages + // opened outside. if (par_lang != prev_par_lang) { - if ((!using_begin_end || langOpenedAtThisLevel(state)) && - !lang_end_command.empty() && - prev_par_lang != doc_lang && - !prev_par_lang.empty()) { + if (!firstpar + && (!using_begin_end || langOpenedAtThisLevel(state)) + && !lang_end_command.empty() + && prev_par_lang != doc_lang + && !prev_par_lang.empty()) { os << from_ascii(subst( lang_end_command, "$$lang", @@ -241,7 +245,7 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf, // polyglossia or begin/end commands, then the current // language is the document language. string const & cur_lang = using_begin_end - && state->lang_switch_depth_.size() + && !state->lang_switch_depth_.empty() ? openLanguageName(state) : doc_lang; @@ -323,10 +327,12 @@ static TeXEnvironmentData prepareEnvironment(Buffer const & buf, static void finishEnvironment(otexstream & os, OutputParams const & runparams, - TeXEnvironmentData const & data) + TeXEnvironmentData const & data, bool const maintext, + bool const lastpar) { OutputState * state = getOutputState(); - // BufferParams const & bparams = buf.params(); // FIXME: for speedup shortcut below, would require passing of "buf" as argument + // BufferParams const & bparams = buf.params(); + // FIXME: for speedup shortcut below, would require passing of "buf" as argument if (state->open_encoding_ == CJK && data.cjk_nested) { // We need to close the encoding even if it does not change // to do correct environment nesting @@ -352,6 +358,11 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams, popLanguageName(); } } + if (data.style->latextype == LATEX_BIB_ENVIRONMENT) + // bibliography needs a blank line after + // each item for backref to function properly + // (see #12041) + os << '\n'; state->nest_level_ -= 1; string const & name = data.style->latexname(); if (!name.empty()) @@ -361,6 +372,20 @@ static void finishEnvironment(otexstream & os, OutputParams const & runparams, runparams.encoding = data.prev_encoding; os << setEncoding(data.prev_encoding->iconvName()); } + // If this is the last par of an inset, the language needs + // to be closed after the environment + if (lastpar && !maintext) { + if (using_begin_end && langOpenedAtThisLevel(state)) { + if (isLocalSwitch(state)) { + os << "}"; + } else { + os << "\\end{" + << openLanguageName(state) + << "}%\n"; + } + popLanguageName(); + } + } } if (data.leftindent_open) { @@ -383,8 +408,8 @@ void TeXEnvironment(Buffer const & buf, Text const & text, pit_type & pit, otexstream & os) { ParagraphList const & paragraphs = text.paragraphs(); - ParagraphList::const_iterator ipar = paragraphs.constIterator(pit); - LYXERR(Debug::LATEX, "TeXEnvironment for paragraph " << pit); + ParagraphList::const_iterator ipar = paragraphs.iterator_at(pit); + LYXERR(Debug::OUTFILE, "TeXEnvironment for paragraph " << pit); Layout const & current_layout = ipar->layout(); depth_type const current_depth = ipar->params().depth(); @@ -393,7 +418,7 @@ void TeXEnvironment(Buffer const & buf, Text const & text, // This is for debugging purpose at the end. pit_type const par_begin = pit; for (; pit < runparams.par_end; ++pit) { - ParagraphList::const_iterator par = paragraphs.constIterator(pit); + ParagraphList::const_iterator par = paragraphs.iterator_at(pit); // check first if this is an higher depth paragraph. bool go_out = (par->params().depth() < current_depth); @@ -436,15 +461,20 @@ void TeXEnvironment(Buffer const & buf, Text const & text, // Do not output empty environments if the whole paragraph has // been deleted with ct and changes are not output. + bool output_changes; + if (!runparams.find_effective()) + output_changes = buf.params().output_changes; + else + output_changes = runparams.find_with_deleted(); if (size_t(pit + 1) < paragraphs.size()) { - ParagraphList::const_iterator nextpar = paragraphs.constIterator(pit + 1); + ParagraphList::const_iterator nextpar = paragraphs.iterator_at(pit + 1); Paragraph const & cpar = paragraphs.at(pit); if ((par->layout() != nextpar->layout() || par->params().depth() == nextpar->params().depth() || par->params().leftIndent() == nextpar->params().leftIndent()) - && !runparams.for_search && cpar.size() > 0 - && cpar.isDeleted(0, cpar.size()) && !buf.params().output_changes) { - if (!buf.params().output_changes && !cpar.parEndChange().deleted()) + && !cpar.empty() + && cpar.isDeleted(0, cpar.size()) && !output_changes) { + if (!output_changes && !cpar.parEndChange().deleted()) os << '\n' << '\n'; continue; } @@ -455,18 +485,19 @@ void TeXEnvironment(Buffer const & buf, Text const & text, prepareEnvironment(buf, text, par, os, runparams); // Recursive call to TeXEnvironment! TeXEnvironment(buf, text, runparams, pit, os); - finishEnvironment(os, runparams, data); + bool const lastpar = size_t(pit + 1) >= paragraphs.size(); + finishEnvironment(os, runparams, data, text.isMainText(), lastpar); } if (pit != runparams.par_end) - LYXERR(Debug::LATEX, "TeXEnvironment for paragraph " << par_begin << " done."); + LYXERR(Debug::OUTFILE, "TeXEnvironment for paragraph " << par_begin << " done."); } void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, - map ilist, vector required, string const & prefix) + map ilist, vector required, string const & prefix) { - unsigned int const argnr = latexargs.size(); + size_t const argnr = latexargs.size(); if (argnr == 0) return; @@ -474,22 +505,22 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX // other arguments, consider this. for (auto const & larg : latexargs) { Layout::latexarg const & arg = larg.second; - if ((!arg.presetarg.empty() || !arg.defaultarg.empty()) && !arg.requires.empty()) { - vector req = getVectorFromString(arg.requires); + if ((!arg.presetarg.empty() || !arg.defaultarg.empty()) && !arg.required.empty()) { + vector req = getVectorFromString(arg.required); required.insert(required.end(), req.begin(), req.end()); } } - for (unsigned int i = 1; i <= argnr; ++i) { - map::const_iterator lit = ilist.find(i); + for (size_t i = 1; i <= argnr; ++i) { + map::const_iterator lit = ilist.find(i); bool inserted = false; if (lit != ilist.end()) { - InsetArgument const * ins = (*lit).second; + InsetArgument const * ins = lit->second; if (ins) { Layout::LaTeXArgMap::const_iterator const lait = latexargs.find(ins->name()); if (lait != latexargs.end()) { - Layout::latexarg arg = (*lait).second; + Layout::latexarg arg = lait->second; docstring ldelim; docstring rdelim; if (!arg.nodelims) { @@ -547,7 +578,7 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX } } } - if (runparams.for_search) { + if (runparams.find_effective() && argnr > 1) { // Mark end of arguments for findadv() only os << "\\endarguments{}"; } @@ -576,6 +607,14 @@ void popLanguageName() } +bool languageStackEmpty() +{ + OutputState * state = getOutputState(); + + return state->lang_switch_depth_.empty(); +} + + string const & openLanguageName() { OutputState * state = getOutputState(); @@ -588,7 +627,7 @@ namespace { void addArgInsets(Paragraph const & par, string const & prefix, Layout::LaTeXArgMap const & latexargs, - map & ilist, + map & ilist, vector & required) { for (auto const & table : par.insetList()) { @@ -601,15 +640,13 @@ void addArgInsets(Paragraph const & par, string const & prefix, } string const name = prefix.empty() ? arg->name() : split(arg->name(), ':'); - // why converting into an integer? - unsigned int const nr = convert(name); - if (ilist.find(nr) == ilist.end()) - ilist[nr] = arg; + size_t const nr = convert(name); + ilist.insert({nr, arg}); Layout::LaTeXArgMap::const_iterator const lit = latexargs.find(arg->name()); if (lit != latexargs.end()) { Layout::latexarg const & larg = lit->second; - vector req = getVectorFromString(larg.requires); + vector req = getVectorFromString(larg.required); move(req.begin(), req.end(), back_inserter(required)); } } @@ -623,7 +660,7 @@ void latexArgInsets(Paragraph const & par, otexstream & os, Layout::LaTeXArgMap const & latexargs, string const & prefix) { - map ilist; + map ilist; vector required; addArgInsets(par, prefix, latexargs, ilist, required); getArgInsets(os, runparams, latexargs, ilist, required, prefix); @@ -636,18 +673,18 @@ void latexArgInsets(ParagraphList const & pars, Layout::LaTeXArgMap const & latexargs, string const & prefix) { - map ilist; + map ilist; vector required; depth_type const current_depth = pit->params().depth(); Layout const current_layout = pit->layout(); // get the first paragraph in sequence with this layout and depth - pit_type offset = 0; + ptrdiff_t offset = 0; while (true) { - if (lyx::prev(pit, offset) == pars.begin()) + if (prev(pit, offset) == pars.begin()) break; - ParagraphList::const_iterator priorpit = lyx::prev(pit, offset + 1); + ParagraphList::const_iterator priorpit = prev(pit, offset + 1); if (priorpit->layout() == current_layout && priorpit->params().depth() == current_depth) ++offset; @@ -655,8 +692,7 @@ void latexArgInsets(ParagraphList const & pars, break; } - ParagraphList::const_iterator spit = lyx::prev(pit, offset); - + ParagraphList::const_iterator spit = prev(pit, offset); for (; spit != pars.end(); ++spit) { if (spit->layout() != current_layout || spit->params().depth() < current_depth) @@ -674,7 +710,7 @@ void latexArgInsetsForParent(ParagraphList const & pars, otexstream & os, Layout::LaTeXArgMap const & latexargs, string const & prefix) { - map ilist; + map ilist; vector required; for (Paragraph const & par : pars) { @@ -710,7 +746,7 @@ void parStartCommand(Paragraph const & par, otexstream & os, break; case LATEX_ITEM_ENVIRONMENT: case LATEX_LIST_ENVIRONMENT: - if (runparams.for_search) { + if (runparams.find_effective()) { os << "\\" + style.itemcommand() << "{" << style.latexname() << "}"; } else { @@ -722,7 +758,7 @@ void parStartCommand(Paragraph const & par, otexstream & os, } break; case LATEX_ENVIRONMENT: - if (runparams.for_search) { + if (runparams.find_effective()) { os << "\\latexenvironment{" << style.latexname() << "}{"; } break; @@ -760,12 +796,12 @@ void TeXOnePar(Buffer const & buf, // Do not output empty commands if the whole paragraph has // been deleted with ct and changes are not output. - if (!runparams_in.for_search && style.latextype != LATEX_ENVIRONMENT - && par.size() > 0 && par.isDeleted(0, par.size()) && !bparams.output_changes) + if (!runparams_in.find_with_deleted() && style.latextype != LATEX_ENVIRONMENT + && !par.empty() && par.isDeleted(0, par.size()) && !bparams.output_changes) return; - LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " ptr " << &par << " '" - << everypar << "'"); + LYXERR(Debug::OUTFILE, "TeXOnePar for paragraph " << pit << " ptr " << &par << " '" + << everypar << "'"); OutputParams runparams = runparams_in; runparams.isLastPar = (pit == pit_type(paragraphs.size() - 1)); @@ -897,10 +933,12 @@ void TeXOnePar(Buffer const & buf, break; } } + bool const have_prior_nptpar = + prior_nontitle_par && !prior_nontitle_par->isPassThru(); Language const * const prev_language = - runparams_in.for_search + runparams_in.find_effective() ? languages.getLanguage("ignore") - : (prior_nontitle_par && !prior_nontitle_par->isPassThru()) + : (have_prior_nptpar) ? (use_prev_env_language ? state->prev_env_language_ : prior_nontitle_par->getParLanguage(bparams)) @@ -946,9 +984,11 @@ void TeXOnePar(Buffer const & buf, use_polyglossia && runparams.local_font != nullptr && outer_language->rightToLeft() - && !par_language->rightToLeft(); + && !par_language->rightToLeft() + && !(have_prior_nptpar + && (prev_language->rightToLeft() != par_language->rightToLeft())); bool const localswitch = - (runparams_in.for_search + (runparams_in.find_effective() || text.inset().forceLocalFontSwitch() || (using_begin_end && text.inset().forcePlainLayout()) || in_polyglossia_rtl_env) @@ -963,7 +1003,7 @@ void TeXOnePar(Buffer const & buf, bool const localswitch_needed = localswitch && par_lang != outer_lang; // localswitches need to be closed and reopened at each par - if (runparams_in.for_search || ((par_lang != prev_lang || localswitch_needed) + if (runparams_in.find_effective() || ((par_lang != prev_lang || localswitch_needed) // check if we already put language command in TeXEnvironment() && !(style.isEnvironment() && (pit == 0 || (priorpar->layout() != par.layout() @@ -1031,7 +1071,7 @@ void TeXOnePar(Buffer const & buf, // With CJK, the CJK tag has to be closed first (see below) if ((runparams.encoding->package() != Encoding::CJK || bparams.useNonTeXFonts - || runparams.for_search) + || runparams.find_effective()) && (par_lang != openLanguageName(state) || localswitch || intitle_command) && !par_lang.empty()) { string bc = use_polyglossia ? @@ -1272,7 +1312,7 @@ void TeXOnePar(Buffer const & buf, // when the paragraph uses CJK, the language has to be closed earlier if ((font.language()->encoding()->package() != Encoding::CJK) || bparams.useNonTeXFonts - || runparams_in.for_search) { + || runparams_in.find_effective()) { if (lang_end_command.empty()) { // If this is a child, we should restore the // master language after the last paragraph. @@ -1312,7 +1352,7 @@ void TeXOnePar(Buffer const & buf, && nextpar && style != nextpar->layout()))) || (atSameLastLangSwitchDepth(state) - && state->lang_switch_depth_.size() + && !state->lang_switch_depth_.empty() && cur_lang != par_lang) || in_polyglossia_rtl_env) { @@ -1355,7 +1395,7 @@ void TeXOnePar(Buffer const & buf, } bool const last_was_separator = - par.size() > 0 && par.isEnvSeparator(par.size() - 1); + !par.empty() && par.isEnvSeparator(par.size() - 1); // Signify added/deleted par break in output if show changes in output if (nextpar && !os.afterParbreak() && !last_was_separator @@ -1442,18 +1482,21 @@ void TeXOnePar(Buffer const & buf, // Also pass the post_macros upstream runparams_in.post_macro = runparams.post_macro; + // 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 // TeXEnvironment, because it is needed in this case if (nextpar && !os.afterParbreak() && !last_was_separator) { - Layout const & next_layout = nextpar->layout(); if (!text.inset().getLayout().parbreakIgnored() && !merged_par) // Make sure to start a new line os << breakln; // A newline '\n' is always output before a command, // so avoid doubling it. + Layout const & next_layout = nextpar->layout(); if (!next_layout.isCommand()) { // Here we now try to avoid spurious empty lines by // outputting a paragraph break only if: (case 1) the @@ -1495,8 +1538,15 @@ void TeXOnePar(Buffer const & buf, && tclass.isDefaultLayout(next_layout))) { // and omit paragraph break if it has been deleted with ct // and changes are not shown in output - if (!merged_par) - os << '\n'; + if (!merged_par) { + if (runparams.isNonLong) + // This is to allow parbreak in multirow + // It could also be used for other non-long + // contexts + os << "\\endgraf\n"; + else + os << '\n'; + } } } } @@ -1505,8 +1555,8 @@ void TeXOnePar(Buffer const & buf, if (intitle_command) state->nest_level_ -= 1; - LYXERR(Debug::LATEX, "TeXOnePar for paragraph " << pit << " done; ptr " - << &par << " next " << nextpar); + LYXERR(Debug::OUTFILE, "TeXOnePar for paragraph " << pit << " done; ptr " + << &par << " next " << nextpar); return; } @@ -1586,18 +1636,19 @@ void latexParagraphs(Buffer const & buf, // The full doc will be exported but it is easier to just rely on // runparams range parameters that will be passed TeXEnvironment. runparams.par_begin = 0; - runparams.par_end = paragraphs.size(); + runparams.par_end = static_cast(paragraphs.size()); } pit_type pit = runparams.par_begin; // lastpit is for the language check after the loop. pit_type lastpit = pit; - // variables used in the loop: DocumentClass const & tclass = bparams.documentClass(); + // Did we already warn about inTitle layout mixing? (we only warn once) + bool gave_layout_warning = false; for (; pit < runparams.par_end; ++pit) { lastpit = pit; - ParagraphList::const_iterator par = paragraphs.constIterator(pit); + ParagraphList::const_iterator par = paragraphs.iterator_at(pit); // FIXME This check should not be needed. We should // perhaps issue an error if it is. @@ -1605,9 +1656,9 @@ void latexParagraphs(Buffer const & buf, tclass.plainLayout() : par->layout(); if (layout.intitle) { - if (runparams.already_title) { - if (!runparams.gave_layout_warning && !runparams.dryrun) { - runparams.gave_layout_warning = true; + if (runparams.have_maketitle) { + if (!gave_layout_warning && !runparams.dryrun) { + gave_layout_warning = true; frontend::Alert::warning(_("Error in latexParagraphs"), bformat(_("You are using at least one " "layout (%1$s) intended for the title, " @@ -1615,16 +1666,16 @@ void latexParagraphs(Buffer const & buf, "could lead to missing or incorrect output." ), layout.name())); } - } else if (!runparams.issued_title_cmd) { - runparams.issued_title_cmd = true; + } else if (!runparams.need_maketitle) { + runparams.need_maketitle = true; if (tclass.titletype() == TITLE_ENVIRONMENT) { os << "\\begin{" << from_ascii(tclass.titlename()) << "}\n"; } } - } else if (runparams.issued_title_cmd && - !runparams.already_title && !layout.inpreamble) { + } else if (runparams.need_maketitle && !runparams.have_maketitle + && !layout.inpreamble && !text.inset().isInTitle()) { if (tclass.titletype() == TITLE_ENVIRONMENT) { os << "\\end{" << from_ascii(tclass.titlename()) << "}\n"; @@ -1633,8 +1684,8 @@ void latexParagraphs(Buffer const & buf, os << "\\" << from_ascii(tclass.titlename()) << "\n"; } - runparams.already_title = true; - runparams.issued_title_cmd = false; + runparams.have_maketitle = true; + runparams.need_maketitle = false; } if (layout.isCommand() && !layout.latexname().empty() @@ -1656,15 +1707,30 @@ void latexParagraphs(Buffer const & buf, // Do not output empty environments if the whole paragraph has // been deleted with ct and changes are not output. - if (size_t(pit + 1) < paragraphs.size()) { - ParagraphList::const_iterator nextpar = paragraphs.constIterator(pit + 1); + bool output_changes; + if (!runparams.find_effective()) + output_changes = bparams.output_changes; + else + output_changes = runparams.find_with_deleted(); + bool const lastpar = size_t(pit + 1) >= paragraphs.size(); + if (!lastpar) { + ParagraphList::const_iterator nextpar = paragraphs.iterator_at(pit + 1); Paragraph const & cpar = paragraphs.at(pit); if ((par->layout() != nextpar->layout() || par->params().depth() == nextpar->params().depth() || par->params().leftIndent() == nextpar->params().leftIndent()) - && !runparams.for_search && cpar.size() > 0 - && cpar.isDeleted(0, cpar.size()) && !bparams.output_changes) { - if (!bparams.output_changes && !cpar.parEndChange().deleted()) + && !cpar.empty() + && cpar.isDeleted(0, cpar.size()) && !output_changes) { + if (!cpar.parEndChange().deleted()) + os << '\n' << '\n'; + continue; + } + } else { + // This is the last par + Paragraph const & cpar = paragraphs.at(pit); + if ( !cpar.empty() + && cpar.isDeleted(0, cpar.size()) && !output_changes) { + if (!cpar.parEndChange().deleted()) os << '\n' << '\n'; continue; } @@ -1674,7 +1740,7 @@ void latexParagraphs(Buffer const & buf, prepareEnvironment(buf, text, par, os, runparams); // pit can be changed in TeXEnvironment. TeXEnvironment(buf, text, runparams, pit, os); - finishEnvironment(os, runparams, data); + finishEnvironment(os, runparams, data, maintext, lastpar); } // FIXME: uncomment the content or remove this block @@ -1686,20 +1752,17 @@ 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 (runparams.issued_title_cmd && - !runparams.already_title && !runparams.inbranch) { + if (runparams.need_maketitle && !runparams.have_maketitle && maintext) { if (tclass.titletype() == TITLE_ENVIRONMENT) { os << "\\end{" << from_ascii(tclass.titlename()) << "}\n"; - runparams.issued_title_cmd = false; } else { os << "\\" << from_ascii(tclass.titlename()) << "\n"; } - runparams.already_title = true; } if (maintext && !is_child && runparams.openbtUnit) @@ -1717,7 +1780,7 @@ void latexParagraphs(Buffer const & buf, << '\n'; // If we have language_auto_begin, the stack will // already be empty, nothing to pop() - if (using_begin_end && !lyxrc.language_auto_begin) + if (using_begin_end && langOpenedAtThisLevel(state)) popLanguageName(); } @@ -1791,7 +1854,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, || oldEnc.package() == Encoding::japanese || oldEnc.package() == Encoding::none || newEnc.package() == Encoding::none - || runparams.for_search) + || runparams.find_effective()) return make_pair(false, 0); // FIXME We ignore encoding switches from/to encodings that do // neither support the inputenc package nor the CJK package here. @@ -1800,7 +1863,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, // but it is the best we can do. // change encoding - LYXERR(Debug::LATEX, "Changing LaTeX encoding from " + LYXERR(Debug::OUTFILE, "Changing LaTeX encoding from " << oldEnc.name() << " to " << newEnc.name()); os << setEncoding(newEnc.iconvName()); if (bparams.inputenc == "auto-legacy-plain") @@ -1814,7 +1877,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, // shouldn't ever reach here (see above) but avoids warning. return make_pair(true, 0); case Encoding::inputenc: { - int count = inputenc_arg.length(); + size_t count = inputenc_arg.length(); if (oldEnc.package() == Encoding::CJK && state->open_encoding_ == CJK) { os << "\\end{CJK}"; @@ -1842,7 +1905,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, return make_pair(true, count + 16); } case Encoding::CJK: { - int count = inputenc_arg.length(); + size_t count = inputenc_arg.length(); if (oldEnc.package() == Encoding::CJK && state->open_encoding_ == CJK) { os << "\\end{CJK}";