X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=31211d1c8554cc01c6897cfe9bc2aaadc1a30e72;hb=d4ac337f0bd89c279b2133e2475a662a3ada641b;hp=3f6b44ec3daa3e01f48cf8e933ad50b222e89f40;hpb=3934f4a36f0402612206cfc0abe0b0b62166214b;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 3f6b44ec3d..31211d1c85 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -33,6 +33,7 @@ #include "support/convert.h" #include "support/debug.h" #include "support/lstrings.h" +#include "support/textutils.h" #include #include @@ -314,7 +315,7 @@ void TeXEnvironment(Buffer const & buf, Text const & text, void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, - map ilist, vector required, bool item) + map ilist, vector required, string const & prefix) { unsigned int const argnr = latexargs.size(); if (argnr == 0) @@ -347,25 +348,27 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX Layout::LaTeXArgMap::const_iterator lait = latexargs.begin(); Layout::LaTeXArgMap::const_iterator const laend = latexargs.end(); for (; lait != laend; ++lait) { - string const name = item ? "item:" + convert(i) : convert(i); + string const name = prefix + convert(i); if ((*lait).first == name) { Layout::latexarg arg = (*lait).second; + docstring preset = arg.presetarg; + if (!arg.defaultarg.empty()) { + if (!preset.empty()) + preset += ","; + preset += arg.defaultarg; + } if (arg.mandatory) { docstring ldelim = arg.ldelim.empty() ? from_ascii("{") : arg.ldelim; docstring rdelim = arg.rdelim.empty() ? from_ascii("}") : arg.rdelim; - os << ldelim << arg.presetarg << rdelim; - } else if (!arg.presetarg.empty()) { - docstring ldelim = arg.mandatory ? - from_ascii("{") : from_ascii("["); - docstring rdelim = arg.mandatory ? - from_ascii("}") : from_ascii("]"); - if (!arg.ldelim.empty()) - ldelim = arg.ldelim; - if (!arg.rdelim.empty()) - rdelim = arg.rdelim; - os << ldelim << arg.presetarg << rdelim; + os << ldelim << preset << rdelim; + } else if (!preset.empty()) { + docstring ldelim = arg.ldelim.empty() ? + from_ascii("[") : arg.ldelim; + docstring rdelim = arg.rdelim.empty() ? + from_ascii("]") : arg.rdelim; + os << ldelim << preset << rdelim; } else if (find(required.begin(), required.end(), (*lait).first) != required.end()) { docstring ldelim = arg.ldelim.empty() ? @@ -386,7 +389,7 @@ void getArgInsets(otexstream & os, OutputParams const & runparams, Layout::LaTeX void latexArgInsets(Paragraph const & par, otexstream & os, - OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, bool item) + OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, string const & prefix) { map ilist; vector required; @@ -400,7 +403,7 @@ void latexArgInsets(Paragraph const & par, otexstream & os, if (ins->name().empty()) LYXERR0("Error: Unnamed argument inset!"); else { - string const name = item ? split(ins->name(), ':') : ins->name(); + string const name = prefix.empty() ? ins->name() : split(ins->name(), ':'); unsigned int const nr = convert(name); ilist[nr] = ins; Layout::LaTeXArgMap::const_iterator const lit = @@ -415,12 +418,13 @@ void latexArgInsets(Paragraph const & par, otexstream & os, } } } - getArgInsets(os, runparams, latexargs, ilist, required, item); + getArgInsets(os, runparams, latexargs, ilist, required, prefix); } void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pit, - otexstream & os, OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs) + otexstream & os, OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, + string const & prefix) { map ilist; vector required; @@ -444,8 +448,10 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi ParagraphList::const_iterator spit = boost::prior(pit, offset); for (; spit != pars.end(); ++spit) { - if (spit->layout() != current_layout) + if (spit->layout() != current_layout || spit->params().depth() < current_depth) break; + if (spit->params().depth() > current_depth) + continue; InsetList::const_iterator it = spit->insetList().begin(); InsetList::const_iterator end = spit->insetList().end(); for (; it != end; ++it) { @@ -455,7 +461,7 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi if (ins->name().empty()) LYXERR0("Error: Unnamed argument inset!"); else { - string const name = ins->name(); + string const name = prefix.empty() ? ins->name() : split(ins->name(), ':'); unsigned int const nr = convert(name); if (ilist.find(nr) == ilist.end()) ilist[nr] = ins; @@ -472,7 +478,7 @@ void latexArgInsets(ParagraphList const & pars, ParagraphList::const_iterator pi } } } - getArgInsets(os, runparams, latexargs, ilist, required, false); + getArgInsets(os, runparams, latexargs, ilist, required, prefix); } namespace { @@ -495,7 +501,7 @@ void parStartCommand(Paragraph const & par, otexstream & os, os << "\\" + style.itemcommand(); // Item arguments if (!style.itemargs().empty()) - latexArgInsets(par, os, runparams, style.itemargs(), true); + latexArgInsets(par, os, runparams, style.itemargs(), "item:"); os << " "; break; case LATEX_BIB_ENVIRONMENT: @@ -517,7 +523,8 @@ void TeXOnePar(Buffer const & buf, string const & everypar, int start_pos, int end_pos) { - BufferParams const & bparams = buf.params(); + BufferParams const & bparams = runparams_in.is_child + ? buf.masterParams() : buf.params(); ParagraphList const & paragraphs = text.paragraphs(); Paragraph const & par = paragraphs.at(pit); // FIXME This check should not really be needed. @@ -567,7 +574,6 @@ void TeXOnePar(Buffer const & buf, if (style.pass_thru) { Font const outerfont = text.outerFont(pit); - runparams.local_font = &par.getFirstFontSettings(bparams); parStartCommand(par, os, runparams, style); par.latex(bparams, outerfont, os, runparams, start_pos, end_pos); @@ -581,7 +587,7 @@ void TeXOnePar(Buffer const & buf, os << '\n'; if (!style.parbreak_is_newline) { os << '\n'; - } else if (nextpar) { + } else if (nextpar && !style.isEnvironment()) { Layout const nextstyle = text.inset().forcePlainLayout() ? bparams.documentClass().plainLayout() : nextpar->layout(); @@ -741,7 +747,7 @@ void TeXOnePar(Buffer const & buf, par.getFontSettings(bparams, i).language()->encoding(); if (encoding->package() != Encoding::CJK && runparams.encoding->package() == Encoding::inputenc - && c < 0x80) + && isASCII(c)) continue; if (par.isInset(i)) break; @@ -804,7 +810,6 @@ void TeXOnePar(Buffer const & buf, } } - runparams.local_font = &par.getFirstFontSettings(bparams); parStartCommand(par, os, runparams, style); Font const outerfont = text.outerFont(pit); @@ -835,6 +840,8 @@ void TeXOnePar(Buffer const & buf, os << "\\" << from_ascii(font.latexSize()) << " \\par}"; } else if (is_command) { os << '}'; + if (!style.postcommandargs().empty()) + latexArgInsets(par, os, runparams, style.postcommandargs(), "post:"); if (runparams.encoding != prev_encoding) { runparams.encoding = prev_encoding; if (!runparams.isFullUnicode()) @@ -883,7 +890,7 @@ void TeXOnePar(Buffer const & buf, // not for ArabTeX && (par_language->lang() != "arabic_arabtex" && outer_language->lang() != "arabic_arabtex") - // have we opened and \L or \R environment? + // have we opened an \L or \R environment? && runparams.local_font != 0 && runparams.local_font->isRightToLeft() != par_language->rightToLeft() // are we about to close the language? @@ -1033,6 +1040,9 @@ void latexParagraphs(Buffer const & buf, OutputParams const & runparams, string const & everypar) { + LASSERT(runparams.par_begin <= runparams.par_end, + { os << "% LaTeX Output Error\n"; return; } ); + BufferParams const & bparams = buf.params(); bool const maintext = text.isMainText(); @@ -1070,7 +1080,6 @@ void latexParagraphs(Buffer const & buf, } ParagraphList const & paragraphs = text.paragraphs(); - LASSERT(runparams.par_begin <= runparams.par_end, /**/); if (runparams.par_begin == runparams.par_end) { // The full doc will be exported but it is easier to just rely on @@ -1188,8 +1197,12 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, { Encoding const & oldEnc = *runparams.encoding; bool moving_arg = runparams.moving_arg; - if (!force && ((bparams.inputenc != "auto" && bparams.inputenc != "default") - || moving_arg)) + // If we switch from/to CJK, we need to switch anyway, despite custom inputenc + bool const from_to_cjk = + (oldEnc.package() == Encoding::CJK && newEnc.package() != Encoding::CJK) + || (oldEnc.package() != Encoding::CJK && newEnc.package() == Encoding::CJK); + if (!force && !from_to_cjk + && ((bparams.inputenc != "auto" && bparams.inputenc != "default") || moving_arg)) return make_pair(false, 0); // Do nothing if the encoding is unchanged.