X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_latex.C;h=bca30a65471e4667b3a210f1e9e705108d590a23;hb=e7ef29fa2d516b8593aa3cccb6548de5686e8a9a;hp=cc4a7fb921323c3d69fe26a25c56f52fa4949930;hpb=db707dab045d01f186a07c7da75d5b22de4e87c3;p=lyx.git diff --git a/src/output_latex.C b/src/output_latex.C index cc4a7fb921..bca30a6547 100644 --- a/src/output_latex.C +++ b/src/output_latex.C @@ -18,27 +18,24 @@ #include "encoding.h" #include "language.h" #include "lyxrc.h" +#include "outputparams.h" #include "paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" #include "texrow.h" #include "vspace.h" +#include "insets/insetbibitem.h" #include "insets/insetoptarg.h" #include "support/lstrings.h" -#ifdef HAVE_LOCALE -#endif - using lyx::support::subst; using std::endl; using std::ostream; using std::string; -extern string bibitemWidest(Buffer const &); - namespace { @@ -78,7 +75,7 @@ TeXDeeper(Buffer const & buf, os, texrow, runparams); } } - lyxerr[Debug::LATEX] << "TeXDeeper...done " << &*par << endl; + lyxerr[Debug::LATEX] << "TeXDeeper...done " << endl; return par; } @@ -189,23 +186,28 @@ TeXEnvironment(Buffer const & buf, texrow.newline(); } - lyxerr[Debug::LATEX] << "TeXEnvironment...done " << &*par << endl; - return par; // ale970302 + if (par != paragraphs.end() && lyxerr.debugging(Debug::LATEX)) + lyxerr << "TeXEnvironment...done " << &*par << endl; + return par; } -InsetOptArg * optArgInset(Paragraph const & par) +int latexOptArgInsets(Buffer const & buf, Paragraph const & par, + ostream & os, OutputParams const & runparams, int number) { - // Find the entry. + int lines = 0; + InsetList::const_iterator it = par.insetlist.begin(); InsetList::const_iterator end = par.insetlist.end(); - for (; it != end; ++it) { - InsetBase * ins = it->inset; - if (ins->lyxCode() == InsetBase::OPTARG_CODE) { - return static_cast(ins); + for (; it != end && number > 0 ; ++it) { + if (it->inset->lyxCode() == InsetBase::OPTARG_CODE) { + InsetOptArg * ins = + static_cast(it->inset); + lines += ins->latexOptional(buf, os, runparams); + --number; } } - return 0; + return lines; } @@ -214,7 +216,7 @@ TeXOnePar(Buffer const & buf, ParagraphList const & paragraphs, ParagraphList::const_iterator pit, ostream & os, TexRow & texrow, - OutputParams const & runparams, + OutputParams const & runparams_in, string const & everypar) { lyxerr[Debug::LATEX] << "TeXOnePar... " << &*pit << " '" @@ -223,38 +225,15 @@ TeXOnePar(Buffer const & buf, bool further_blank_line = false; LyXLayout_ptr style; - // 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 then "Standard" to be valid! - if (!pit->forceDefaultParagraphs()) { + // In an an inset with unlimited length (all in one row), + // force layout to default + if (!pit->forceDefaultParagraphs()) style = pit->layout(); - - if (pit->params().startOfAppendix()) { - os << "\\appendix\n"; - texrow.newline(); - } - - if (!pit->params().spacing().isDefault() - && (pit == paragraphs.begin() - || !boost::prior(pit)->hasSameLayout(*pit))) - { - os << pit->params().spacing().writeEnvirBegin() << '\n'; - texrow.newline(); - } - - if (style->isCommand()) { - os << '\n'; - texrow.newline(); - } - - if (further_blank_line) { - os << '\n'; - texrow.newline(); - } - } else { + else style = bparams.getLyXTextClass().defaultLayout(); - } + + OutputParams runparams = runparams_in; + runparams.moving_arg |= style->needprotect; Language const * language = pit->getParLanguage(bparams); Language const * doc_language = bparams.language; @@ -298,15 +277,45 @@ TeXOnePar(Buffer const & buf, texrow.newline(); } + // In an an inset with unlimited length (all in one row), + // don't allow any special options in the paragraph + if (!pit->forceDefaultParagraphs()) { + if (pit->params().startOfAppendix()) { + os << "\\appendix\n"; + texrow.newline(); + } + + if (!pit->params().spacing().isDefault() + && (pit == paragraphs.begin() + || !boost::prior(pit)->hasSameLayout(*pit))) + { + os << pit->params().spacing().writeEnvirBegin() << '\n'; + texrow.newline(); + } + + if (style->isCommand()) { + os << '\n'; + texrow.newline(); + } + + if (further_blank_line) { + os << '\n'; + texrow.newline(); + } + } + switch (style->latextype) { case LATEX_COMMAND: os << '\\' << style->latexname(); // Separate handling of optional argument inset. - if (style->optionalargs == 1) { - InsetOptArg * it = optArgInset(*pit); - if (it) - it->latexOptional(buf, os, runparams); + if (style->optionalargs > 0) { + int ret = latexOptArgInsets(buf, *pit, os, runparams, + style->optionalargs); + while (ret > 0) { + texrow.newline(); + --ret; + } } else os << style->latexparam(); @@ -387,7 +396,24 @@ paragraphs); } } - if (boost::next(pit) == const_cast(paragraphs).end() + if (!pit->forceDefaultParagraphs()) { + further_blank_line = false; + + if (further_blank_line) { + os << '\n'; + texrow.newline(); + } + + if (!pit->params().spacing().isDefault() + && (boost::next(pit) == paragraphs.end() + || !boost::next(pit)->hasSameLayout(*pit))) + { + os << pit->params().spacing().writeEnvirEnd() << '\n'; + texrow.newline(); + } + } + + if (boost::next(pit) == paragraphs.end() && language->babel() != doc_language->babel()) { // Since \selectlanguage write the language to the aux file, // we need to reset the language at the end of footnote or @@ -406,23 +432,6 @@ paragraphs); texrow.newline(); } - if (!pit->forceDefaultParagraphs()) { - further_blank_line = false; - - if (further_blank_line) { - os << '\n'; - texrow.newline(); - } - - if (!pit->params().spacing().isDefault() - && (boost::next(pit) == paragraphs.end() - || !boost::next(pit)->hasSameLayout(*pit))) - { - os << pit->params().spacing().writeEnvirEnd() << '\n'; - texrow.newline(); - } - } - // we don't need it for the last paragraph!!! // Note from JMarc: we will re-add a \n explicitely in // TeXEnvironment, because it is needed in this case @@ -431,7 +440,9 @@ paragraphs); texrow.newline(); } - lyxerr[Debug::LATEX] << "TeXOnePar...done " << &*boost::next(pit) << endl; + if (boost::next(pit) != paragraphs.end() && + lyxerr.debugging(Debug::LATEX)) + lyxerr << "TeXOnePar...done " << &*boost::next(pit) << endl; return ++pit; }