X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=4589b3795b1368a10c90d8f92e4b8abf0e90fcae;hb=33b7088719c3c72e81483e3a82a321971403f505;hp=b8243c17f0faf099268052b1439b5592707611c5;hpb=28ae543a2a22f187628c5135c4f1d402eb65afa5;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index b8243c17f0..4589b3795b 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" @@ -352,6 +349,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()) @@ -436,15 +438,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.for_searchAdv == OutputParams::NoSearch) + output_changes = buf.params().output_changes; + else + output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted); if (size_t(pit + 1) < paragraphs.size()) { 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.empty() - && 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; } @@ -547,7 +554,7 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX } } } - if (runparams.for_search) { + if ((runparams.for_searchAdv != OutputParams::NoSearch) && argnr > 1) { // Mark end of arguments for findadv() only os << "\\endarguments{}"; } @@ -588,7 +595,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()) { @@ -602,8 +609,7 @@ void addArgInsets(Paragraph const & par, string const & prefix, string const name = prefix.empty() ? arg->name() : split(arg->name(), ':'); size_t const nr = convert(name); - if (ilist.find(nr) == ilist.end()) - ilist[nr] = arg; + ilist.insert({nr, arg}); Layout::LaTeXArgMap::const_iterator const lit = latexargs.find(arg->name()); if (lit != latexargs.end()) { @@ -708,7 +714,7 @@ void parStartCommand(Paragraph const & par, otexstream & os, break; case LATEX_ITEM_ENVIRONMENT: case LATEX_LIST_ENVIRONMENT: - if (runparams.for_search) { + if (runparams.for_searchAdv != OutputParams::NoSearch) { os << "\\" + style.itemcommand() << "{" << style.latexname() << "}"; } else { @@ -720,7 +726,7 @@ void parStartCommand(Paragraph const & par, otexstream & os, } break; case LATEX_ENVIRONMENT: - if (runparams.for_search) { + if (runparams.for_searchAdv != OutputParams::NoSearch) { os << "\\latexenvironment{" << style.latexname() << "}{"; } break; @@ -758,7 +764,7 @@ 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 + if ((runparams_in.for_searchAdv != OutputParams::SearchWithDeleted) && style.latextype != LATEX_ENVIRONMENT && !par.empty() && par.isDeleted(0, par.size()) && !bparams.output_changes) return; @@ -896,7 +902,7 @@ void TeXOnePar(Buffer const & buf, } } Language const * const prev_language = - runparams_in.for_search + runparams_in.for_searchAdv != OutputParams::NoSearch ? languages.getLanguage("ignore") : (prior_nontitle_par && !prior_nontitle_par->isPassThru()) ? (use_prev_env_language @@ -946,7 +952,7 @@ void TeXOnePar(Buffer const & buf, && outer_language->rightToLeft() && !par_language->rightToLeft(); bool const localswitch = - (runparams_in.for_search + (runparams_in.for_searchAdv != OutputParams::NoSearch || text.inset().forceLocalFontSwitch() || (using_begin_end && text.inset().forcePlainLayout()) || in_polyglossia_rtl_env) @@ -961,7 +967,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.for_searchAdv != OutputParams::NoSearch) || ((par_lang != prev_lang || localswitch_needed) // check if we already put language command in TeXEnvironment() && !(style.isEnvironment() && (pit == 0 || (priorpar->layout() != par.layout() @@ -1029,7 +1035,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.for_searchAdv != OutputParams::NoSearch)) && (par_lang != openLanguageName(state) || localswitch || intitle_command) && !par_lang.empty()) { string bc = use_polyglossia ? @@ -1270,7 +1276,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.for_searchAdv != OutputParams::NoSearch)) { if (lang_end_command.empty()) { // If this is a child, we should restore the // master language after the last paragraph. @@ -1449,12 +1455,12 @@ void TeXOnePar(Buffer const & buf, // 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 @@ -1496,8 +1502,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'; + } } } } @@ -1658,14 +1671,28 @@ void latexParagraphs(Buffer const & buf, // Do not output empty environments if the whole paragraph has // been deleted with ct and changes are not output. + bool output_changes; + if (runparams.for_searchAdv == OutputParams::NoSearch) + output_changes = bparams.output_changes; + else + output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted); if (size_t(pit + 1) < paragraphs.size()) { 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.empty() - && cpar.isDeleted(0, cpar.size()) && !bparams.output_changes) { + && !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; @@ -1790,7 +1817,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, || oldEnc.package() == Encoding::japanese || oldEnc.package() == Encoding::none || newEnc.package() == Encoding::none - || runparams.for_search) + || (runparams.for_searchAdv != OutputParams::NoSearch)) 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.