X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.cpp;h=ac906835ed7537055843e34e089c00f0bc65b98f;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=94338898d9097521375dfce93acfe5875b3aa2cc;hpb=3d8828fa1420ca155df167dd9b61d9fe3aabcd37;p=lyx.git diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 94338898d9..ac906835ed 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -14,7 +14,6 @@ #include "Buffer.h" #include "BufferParams.h" -#include "support/debug.h" #include "Encoding.h" #include "InsetList.h" #include "Language.h" @@ -31,6 +30,7 @@ #include "insets/InsetBibitem.h" #include "insets/InsetOptArg.h" +#include "support/debug.h" #include "support/lstrings.h" #include @@ -55,14 +55,14 @@ static bool cjk_inherited_ = false; ParagraphList::const_iterator TeXEnvironment(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, ParagraphList::const_iterator pit, odocstream & os, TexRow & texrow, OutputParams const & runparams); ParagraphList::const_iterator TeXOnePar(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, ParagraphList::const_iterator pit, odocstream & os, TexRow & texrow, OutputParams const & runparams, @@ -71,7 +71,7 @@ TeXOnePar(Buffer const & buf, ParagraphList::const_iterator TeXDeeper(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, ParagraphList::const_iterator pit, odocstream & os, TexRow & texrow, OutputParams const & runparams) @@ -79,13 +79,15 @@ TeXDeeper(Buffer const & buf, LYXERR(Debug::LATEX, "TeXDeeper... " << &*pit); ParagraphList::const_iterator par = pit; + ParagraphList const & paragraphs = text.paragraphs(); + while (par != paragraphs.end() && par->params().depth() == pit->params().depth()) { if (par->layout()->isEnvironment()) { - par = TeXEnvironment(buf, paragraphs, par, + par = TeXEnvironment(buf, text, par, os, texrow, runparams); } else { - par = TeXOnePar(buf, paragraphs, par, + par = TeXOnePar(buf, text, par, os, texrow, runparams); } } @@ -97,7 +99,7 @@ TeXDeeper(Buffer const & buf, ParagraphList::const_iterator TeXEnvironment(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, ParagraphList::const_iterator pit, odocstream & os, TexRow & texrow, OutputParams const & runparams) @@ -106,7 +108,11 @@ TeXEnvironment(Buffer const & buf, BufferParams const & bparams = buf.params(); - LayoutPtr const & style = pit->layout(); + LayoutPtr const & style = pit->forceEmptyLayout() ? + bparams.textClass().emptyLayout() : + pit->layout(); + + ParagraphList const & paragraphs = text.paragraphs(); Language const * const par_language = pit->getParLanguage(bparams); Language const * const doc_language = bparams.language; @@ -185,7 +191,7 @@ TeXEnvironment(Buffer const & buf, ParagraphList::const_iterator par = pit; do { - par = TeXOnePar(buf, paragraphs, par, os, texrow, runparams); + par = TeXOnePar(buf, text, par, os, texrow, runparams); if (par == paragraphs.end()) { // Make sure that the last paragraph is @@ -213,7 +219,7 @@ TeXEnvironment(Buffer const & buf, os << '\n'; texrow.newline(); } - par = TeXDeeper(buf, paragraphs, par, os, texrow, + par = TeXDeeper(buf, text, par, os, texrow, runparams); } } while (par != paragraphs.end() @@ -271,7 +277,7 @@ namespace { ParagraphList::const_iterator TeXOnePar(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, ParagraphList::const_iterator pit, odocstream & os, TexRow & texrow, OutputParams const & runparams_in, @@ -280,7 +286,7 @@ TeXOnePar(Buffer const & buf, LYXERR(Debug::LATEX, "TeXOnePar... " << &*pit << " '" << everypar << "'"); BufferParams const & bparams = buf.params(); - LayoutPtr style; + ParagraphList const & paragraphs = text.paragraphs(); if (runparams_in.verbatim) { int const dist = distance(paragraphs.begin(), pit); @@ -298,42 +304,25 @@ TeXOnePar(Buffer const & buf, return ++pit; } + // FIXME This comment doesn't make sense. What's the + // length got to do with forceEmptyLayout()? I.e., what + // was forceDefaultParagraphs()? // In an inset with unlimited length (all in one row), // force layout to default - if (!pit->forceDefaultParagraphs()) - style = pit->layout(); - else - style = bparams.getTextClass().defaultLayout(); + LayoutPtr const style = pit->forceEmptyLayout() ? + bparams.textClass().emptyLayout() : + pit->layout(); OutputParams runparams = runparams_in; runparams.moving_arg |= style->needprotect; + bool const maintext = text.isMainText(buf); // we are at the beginning of an inset and CJK is already open. - if (pit == paragraphs.begin() && runparams.local_font != 0 && - open_encoding_ == CJK) { + if (pit == paragraphs.begin() && !maintext && open_encoding_ == CJK) { cjk_inherited_ = true; open_encoding_ = none; } - if (pit == paragraphs.begin() && runparams.local_font == 0) { - // Open a CJK environment at the beginning of the main buffer - // if the document's language is a CJK language - if (bparams.encoding().package() == Encoding::CJK) { - os << "\\begin{CJK}{" << from_ascii(bparams.encoding().latexName()) - << "}{}%\n"; - texrow.newline(); - open_encoding_ = CJK; - } - if (!lyxrc.language_auto_begin && !bparams.language->babel().empty()) { - // FIXME UNICODE - os << from_utf8(subst(lyxrc.language_command_begin, - "$$lang", - bparams.language->babel())) - << '\n'; - texrow.newline(); - } - } - // This paragraph's language Language const * const par_language = pit->getParLanguage(bparams); // The document's language @@ -439,17 +428,18 @@ TeXOnePar(Buffer const & buf, // sections. for (pos_type i = 0; i < pit->size(); ++i) { char_type const c = pit->getChar(i); - if (runparams.encoding->package() == Encoding::inputenc && c < 0x80) + Encoding const * const encoding = + pit->getFontSettings(bparams, i).language()->encoding(); + if (encoding->package() != Encoding::CJK && + runparams.encoding->package() == Encoding::inputenc && + c < 0x80) continue; if (pit->isInset(i)) break; // All characters before c are in the ASCII range, and // c is non-ASCII (but no inset), so change the // encoding to that required by the language of c. - Encoding const * const encoding = - pit->getFontSettings(bparams, i).language()->encoding(); - - // with CJK, only add switch if we have CJK content at the beginning + // 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; @@ -489,10 +479,8 @@ TeXOnePar(Buffer const & buf, } } - // In an inset with unlimited length (all in one row), - // don't allow any special options in the paragraph - bool const useSetSpace = bparams.getTextClass().provides("SetSpace"); - if (!pit->forceDefaultParagraphs()) { + bool const useSetSpace = bparams.textClass().provides("SetSpace"); + if (pit->allowParagraphCustomization()) { if (pit->params().startOfAppendix()) { os << "\\appendix\n"; texrow.newline(); @@ -603,7 +591,7 @@ TeXOnePar(Buffer const & buf, pending_newline = true; } - if (!pit->forceDefaultParagraphs()) { + if (pit->allowParagraphCustomization()) { if (!pit->params().spacing().isDefault() && (boost::next(pit) == paragraphs.end() || !boost::next(pit)->hasSameLayout(*pit))) @@ -688,7 +676,7 @@ TeXOnePar(Buffer const & buf, switch (open_encoding_) { case CJK: { // end of main text - if (runparams.local_font == 0) { + if (maintext) { os << '\n'; texrow.newline(); os << "\\end{CJK}\n"; @@ -709,16 +697,6 @@ TeXOnePar(Buffer const & buf, // do nothing break; } - // auto_end tag only if the last par is in a babel language - if (runparams.local_font == 0 && !lyxrc.language_auto_end && - !bparams.language->babel().empty() && - font.language()->encoding()->package() != Encoding::CJK) { - os << from_utf8(subst(lyxrc.language_command_end, - "$$lang", - bparams.language->babel())) - << '\n'; - texrow.newline(); - } } // If this is the last paragraph, and a local_font was set upon entering @@ -758,7 +736,7 @@ TeXOnePar(Buffer const & buf, // LaTeX all paragraphs void latexParagraphs(Buffer const & buf, - ParagraphList const & paragraphs, + Text const & text, odocstream & os, TexRow & texrow, OutputParams const & runparams, @@ -766,7 +744,9 @@ void latexParagraphs(Buffer const & buf, { bool was_title = false; bool already_title = false; - TextClass const & tclass = buf.params().getTextClass(); + BufferParams const & bparams = buf.params(); + TextClass const & tclass = bparams.textClass(); + ParagraphList const & paragraphs = text.paragraphs(); ParagraphList::const_iterator par = paragraphs.begin(); ParagraphList::const_iterator endpar = paragraphs.end(); @@ -781,16 +761,41 @@ void latexParagraphs(Buffer const & buf, const_cast(runparams).par_end = 0; } + bool const maintext = text.isMainText(buf); + + // Open a CJK environment at the beginning of the main buffer + // if the document's language is a CJK language + if (maintext && bparams.encoding().package() == Encoding::CJK) { + os << "\\begin{CJK}{" << from_ascii(bparams.encoding().latexName()) + << "}{}%\n"; + texrow.newline(); + open_encoding_ = CJK; + } + // if "auto begin" is switched off, explicitely switch the + // language on at start + if (maintext && !lyxrc.language_auto_begin && + !bparams.language->babel().empty()) { + // FIXME UNICODE + os << from_utf8(subst(lyxrc.language_command_begin, + "$$lang", + bparams.language->babel())) + << '\n'; + texrow.newline(); + } + + ParagraphList::const_iterator lastpar; // if only_body while (par != endpar) { - ParagraphList::const_iterator lastpar = par; + lastpar = par; // well we have to check if we are in an inset with unlimited // length (all in one row) if that is true then we don't allow // any special options in the paragraph and also we don't allow // any environment other than the default layout of the // text class to be valid! - if (!par->forceDefaultParagraphs()) { - LayoutPtr const & layout = par->layout(); + if (par->allowParagraphCustomization()) { + LayoutPtr const & layout = par->forceEmptyLayout() ? + tclass.emptyLayout() : + par->layout(); if (layout->intitle) { if (already_title) { @@ -821,18 +826,18 @@ void latexParagraphs(Buffer const & buf, } if (layout->is_environment) { - par = TeXOnePar(buf, paragraphs, par, os, texrow, + par = TeXOnePar(buf, text, par, os, texrow, runparams, everypar); } else if (layout->isEnvironment() || !par->params().leftIndent().zero()) { - par = TeXEnvironment(buf, paragraphs, par, os, + par = TeXEnvironment(buf, text, par, os, texrow, runparams); } else { - par = TeXOnePar(buf, paragraphs, par, os, texrow, + par = TeXOnePar(buf, text, par, os, texrow, runparams, everypar); } } else { - par = TeXOnePar(buf, paragraphs, par, os, texrow, + par = TeXOnePar(buf, text, par, os, texrow, runparams, everypar); } if (distance(lastpar, par) >= distance(lastpar, endpar)) @@ -850,9 +855,19 @@ void latexParagraphs(Buffer const & buf, } texrow.newline(); } + // if "auto end" is switched off, explicitely 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) { + os << from_utf8(subst(lyxrc.language_command_end, + "$$lang", + bparams.language->babel())) + << '\n'; + texrow.newline(); + } // If the last paragraph is an environment, we'll have to close // CJK at the very end to do proper nesting. - if (open_encoding_ == CJK) { + if (maintext && open_encoding_ == CJK) { os << "\\end{CJK}\n"; texrow.newline(); open_encoding_ = none;