]> git.lyx.org Git - lyx.git/blobdiff - src/output_latex.C
The speed patch: redraw only rows that have changed
[lyx.git] / src / output_latex.C
index cc4a7fb921323c3d69fe26a25c56f52fa4949930..bca30a65471e4667b3a210f1e9e705108d590a23 100644 (file)
 #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<InsetOptArg *>(ins);
+       for (; it != end && number > 0 ; ++it) {
+               if (it->inset->lyxCode() == InsetBase::OPTARG_CODE) {
+                       InsetOptArg * ins =
+                               static_cast<InsetOptArg *>(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<ParagraphList&>(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;
 }