X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=cdd42aaf4325222dffc0f18efff4d343bca6e20c;hb=5678dc566f8873b489c66ffa5772a74c387a6396;hp=2a896ab7518c88df6988436ccd3594fa2cc16cae;hpb=4209cbc631e92edd02f4558e75d085eeea210d17;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 2a896ab751..cdd42aaf43 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -21,7 +21,6 @@ #include "LyXRC.h" #include "OutputParams.h" #include "Paragraph.h" -#include "paragraph_funcs.h" #include "ParagraphParameters.h" #include "TextClass.h" #include "TexRow.h" @@ -52,6 +51,7 @@ enum OpenEncoding { static int open_encoding_ = none; static int cjk_inherited_ = 0; +Language const * prev_env_language_ = 0; ParagraphList::const_iterator @@ -74,12 +74,13 @@ TeXDeeper(Buffer const & buf, ParagraphList const & paragraphs = text.paragraphs(); + bool const force_plain_layout = text.inset().forcePlainLayout(); while (par != paragraphs.end() && par->params().depth() == pit->params().depth()) { // FIXME This test should not be necessary. // We should perhaps issue an error if it is. - Layout const & style = par->forcePlainLayout() ? - buf.params().documentClass().plainLayout() : par->layout(); + Layout const & style = force_plain_layout + ? buf.params().documentClass().plainLayout() : par->layout(); if (style.isEnvironment()) { par = TeXEnvironment(buf, text, par, os, texrow, runparams); @@ -107,16 +108,26 @@ TeXEnvironment(Buffer const & buf, // FIXME This test should not be necessary. // We should perhaps issue an error if it is. - Layout const & style = pit->forcePlainLayout() ? + Layout const & style = text.inset().forcePlainLayout() ? bparams.documentClass().plainLayout() : pit->layout(); ParagraphList const & paragraphs = text.paragraphs(); + ParagraphList::const_iterator const priorpit = + pit == paragraphs.begin() ? pit : boost::prior(pit); + + bool const use_prev_env_language = prev_env_language_ != 0 + && priorpit->layout().isEnvironment() + && (priorpit->getDepth() > pit->getDepth() + || (priorpit->getDepth() == pit->getDepth() + && priorpit->layout() != pit->layout())); + Encoding const * const prev_encoding = runparams.encoding; Language const * const par_language = pit->getParLanguage(bparams); Language const * const doc_language = bparams.language; Language const * const prev_par_language = (pit != paragraphs.begin()) - ? boost::prior(pit)->getParLanguage(bparams) + ? (use_prev_env_language ? prev_env_language_ + : priorpit->getParLanguage(bparams)) : doc_language; if (par_language->babel() != prev_par_language->babel()) { @@ -169,8 +180,12 @@ TeXEnvironment(Buffer const & buf, << pit->params().labelWidthString() << "}\n"; } else if (style.labeltype == LABEL_BIBLIO) { - // ale970405 - os << '{' << bibitemWidest(buf) << "}\n"; + if (pit->params().labelWidthString().empty()) + os << '{' << bibitemWidest(buf, runparams) << "}\n"; + else + os << '{' + << pit->params().labelWidthString() + << "}\n"; } else os << from_ascii(style.latexparam()) << '\n'; texrow.newline(); @@ -180,8 +195,9 @@ TeXEnvironment(Buffer const & buf, bool cjk_nested = false; if (par_language->encoding()->package() == Encoding::CJK && open_encoding_ != CJK && pit->isMultiLingual(bparams)) { - os << "\\begin{CJK}{" << from_ascii(par_language->encoding()->latexName()) - << "}{" << from_ascii(bparams.fontsCJK) << "}%\n"; + if (prev_par_language->encoding()->package() == Encoding::CJK) + os << "\\begin{CJK}{" << from_ascii(par_language->encoding()->latexName()) + << "}{" << from_ascii(bparams.fontsCJK) << "}%\n"; open_encoding_ = CJK; cjk_nested = true; texrow.newline(); @@ -235,11 +251,23 @@ TeXEnvironment(Buffer const & buf, if (style.isEnvironment()) { os << "\\end{" << from_ascii(style.latexname()) << "}\n"; texrow.newline(); + prev_env_language_ = par_language; + if (runparams.encoding != prev_encoding) { + runparams.encoding = prev_encoding; + if (!bparams.useXetex) + os << setEncoding(prev_encoding->iconvName()); + } } if (leftindent_open) { os << "\\end{LyXParagraphLeftIndent}\n"; texrow.newline(); + prev_env_language_ = par_language; + if (runparams.encoding != prev_encoding) { + runparams.encoding = prev_encoding; + if (!bparams.useXetex) + os << setEncoding(prev_encoding->iconvName()); + } } if (par != paragraphs.end()) @@ -291,9 +319,18 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, OutputParams runparams = runparams_in; runparams.isLastPar = nextpit == paragraphs.end(); + bool const maintext = text.isMainText(); + // we are at the beginning of an inset and CJK is already open; + // we count inheritation levels to get the inset nesting right. + if (pit == paragraphs.begin() && !maintext + && (cjk_inherited_ > 0 || open_encoding_ == CJK)) { + cjk_inherited_ += 1; + open_encoding_ = none; + } + if (runparams.verbatim) { int const dist = distance(paragraphs.begin(), pit); - Font const outerfont = outerFont(dist, paragraphs); + Font const outerfont = text.outerFont(dist); // No newline if only one paragraph in this lyxtext if (dist > 0) { @@ -308,20 +345,9 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // FIXME This check should not really be needed. // Perhaps we should issue an error if it is. - Layout const style = pit->forcePlainLayout() ? + Layout const style = text.inset().forcePlainLayout() ? bparams.documentClass().plainLayout() : pit->layout(); - runparams.moving_arg |= style.needprotect; - - bool const maintext = text.isMainText(buf); - // we are at the beginning of an inset and CJK is already open; - // we count inheritation levels to get the inset nesting right. - if (pit == paragraphs.begin() && !maintext - && (cjk_inherited_ > 0 || open_encoding_ == CJK)) { - cjk_inherited_ += 1; - open_encoding_ = none; - } - // This paragraph's language Language const * const par_language = pit->getParLanguage(bparams); // The document's language @@ -331,12 +357,22 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, Language const * const outer_language = (runparams.local_font != 0) ? runparams.local_font->language() : doc_language; - // The previous language that was in effect is either the language of - // the previous paragraph, if there is one, or else the outer language - // if there is no previous paragraph + + // The previous language that was in effect is the language of the + // previous paragraph, unless the previous paragraph is inside an + // environment with nesting depth greater than (or equal to, but with + // a different layout) the current one. If there is no previous + // paragraph, the previous language is the outer language. + bool const use_prev_env_language = prev_env_language_ != 0 + && priorpit->layout().isEnvironment() + && (priorpit->getDepth() > pit->getDepth() + || (priorpit->getDepth() == pit->getDepth() + && priorpit->layout() != pit->layout())); Language const * const prev_language = - (pit != paragraphs.begin()) ? - priorpit->getParLanguage(bparams) : outer_language; + (pit != paragraphs.begin()) + ? (use_prev_env_language ? prev_env_language_ + : priorpit->getParLanguage(bparams)) + : outer_language; if (par_language->babel() != prev_language->babel() // check if we already put language command in TeXEnvironment() @@ -424,7 +460,9 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // Look ahead for future encoding changes. // We try to output them at the beginning of the paragraph, // since the \inputencoding command is not allowed e.g. in - // sections. + // sections. For this reason we only set runparams.moving_arg + // after checking for the encoding change, otherwise the + // change would be always avoided by switchEncoding(). for (pos_type i = 0; i < pit->size(); ++i) { char_type const c = pit->getChar(i); Encoding const * const encoding = @@ -441,11 +479,8 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // With CJK, only add switch if we have CJK content at the beginning // of the paragraph if (encoding->package() != Encoding::CJK || i == 0) { - OutputParams tmp_rp = runparams; - runparams.moving_arg = false; pair enc_switch = switchEncoding(os, bparams, runparams, *encoding); - runparams = tmp_rp; // the following is necessary after a CJK environment in a multilingual // context (nesting issue). if (par_language->encoding()->package() == Encoding::CJK && @@ -478,6 +513,9 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, } } + runparams.moving_arg |= style.needprotect; + Encoding const * const prev_encoding = runparams.encoding; + bool const useSetSpace = bparams.documentClass().provides("SetSpace"); if (pit->allowParagraphCustomization()) { if (pit->params().startOfAppendix()) { @@ -527,8 +565,7 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, break; } - Font const outerfont = outerFont(distance(paragraphs.begin(), pit), - paragraphs); + Font const outerfont = text.outerFont(distance(paragraphs.begin(), pit)); // FIXME UNICODE os << from_utf8(everypar); @@ -559,8 +596,14 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, os << "\\" << from_ascii(font.latexSize()) << " \\par}"; } else if (need_par) { os << "\\par}"; - } else if (is_command) + } else if (is_command) { os << '}'; + if (runparams.encoding != prev_encoding) { + runparams.encoding = prev_encoding; + if (!bparams.useXetex) + os << setEncoding(prev_encoding->iconvName()); + } + } bool pending_newline = false; switch (style.latextype) { @@ -579,7 +622,7 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, break; } - // fall through possible + // fall through possible default: // we don't need it for the last paragraph!!! if (nextpit != paragraphs.end()) @@ -629,11 +672,18 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // when the paragraph uses CJK, the language has to be closed earlier if (font.language()->encoding()->package() != Encoding::CJK) { if (lyxrc.language_command_end.empty()) { - if (!prev_language->babel().empty()) { + // If this is a child, we should restore the + // master language after the last paragraph. + Language const * const current_language = + (nextpit == paragraphs.end() + && runparams.master_language) + ? runparams.master_language + : outer_language; + if (!current_language->babel().empty()) { os << from_ascii(subst( lyxrc.language_command_begin, "$$lang", - prev_language->babel())); + current_language->babel())); pending_newline = true; } } else if (!par_language->babel().empty()) { @@ -657,9 +707,9 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // also if the next paragraph is a multilingual environment (because of nesting) if (nextpit != paragraphs.end() && open_encoding_ == CJK && (nextpit->getParLanguage(bparams)->encoding()->package() != Encoding::CJK || - nextpit->layout().isEnvironment() && nextpit->isMultiLingual(bparams)) - // in environments, CJK has to be closed later (nesting!) - && !style.isEnvironment()) { + (nextpit->layout().isEnvironment() && nextpit->isMultiLingual(bparams))) + // inbetween environments, CJK has to be closed later (nesting!) + && (!style.isEnvironment() || !nextpit->layout().isEnvironment())) { os << "\\end{CJK}\n"; open_encoding_ = none; } @@ -699,9 +749,11 @@ ParagraphList::const_iterator TeXOnePar(Buffer const & buf, // If this is the last paragraph, and a local_font was set upon entering // the inset, and we're using "auto" or "default" encoding, the encoding // should be set back to that local_font's encoding. + // However, do not change the encoding when XeTeX is used. if (nextpit == paragraphs.end() && runparams_in.local_font != 0 && runparams_in.encoding != runparams_in.local_font->language()->encoding() - && (bparams.inputenc == "auto" || bparams.inputenc == "default")) { + && (bparams.inputenc == "auto" || bparams.inputenc == "default") + && (!bparams.useXetex)) { runparams_in.encoding = runparams_in.local_font->language()->encoding(); os << setEncoding(runparams_in.encoding->iconvName()); } @@ -765,7 +817,7 @@ void latexParagraphs(Buffer const & buf, const_cast(runparams).par_end = 0; } - bool const maintext = text.isMainText(buf); + bool const maintext = text.isMainText(); bool const is_child = buf.masterBuffer() != &buf; // Open a CJK environment at the beginning of the main buffer @@ -778,7 +830,7 @@ void latexParagraphs(Buffer const & buf, texrow.newline(); open_encoding_ = CJK; } - // if "auto begin" is switched off, explicitely switch the + // if "auto begin" is switched off, explicitly switch the // language on at start if (maintext && !lyxrc.language_auto_begin && !bparams.language->babel().empty()) { @@ -796,9 +848,8 @@ void latexParagraphs(Buffer const & buf, lastpar = par; // FIXME This check should not be needed. We should // perhaps issue an error if it is. - Layout const & layout = par->forcePlainLayout() ? - tclass.plainLayout() : - par->layout(); + Layout const & layout = text.inset().forcePlainLayout() ? + tclass.plainLayout() : par->layout(); if (layout.intitle) { if (already_title) { @@ -853,7 +904,7 @@ void latexParagraphs(Buffer const & buf, texrow.newline(); } - // if "auto end" is switched off, explicitely close the language at the end + // if "auto end" is switched off, explicitly close the language at the end // but only if the last par is in a babel language if (maintext && !lyxrc.language_auto_end && !bparams.language->babel().empty() && lastpar->getParLanguage(bparams)->encoding()->package() != Encoding::CJK) {