]> git.lyx.org Git - lyx.git/commitdiff
move some functions around
authorLars Gullik Bjønnes <larsbj@gullik.org>
Mon, 3 Mar 2003 21:15:49 +0000 (21:15 +0000)
committerLars Gullik Bjønnes <larsbj@gullik.org>
Mon, 3 Mar 2003 21:15:49 +0000 (21:15 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6328 a592a061-630c-0410-9148-cb99ea01b6c8

src/ChangeLog
src/buffer.C
src/paragraph.C
src/paragraph.h
src/paragraph_funcs.C
src/paragraph_funcs.h
src/paragraph_pimpl.C
src/paragraph_pimpl.h

index b6ce6b8764e2eb09529a327375037043597c38bc..9296813fa881e51793969e92e52037e980969b3d 100644 (file)
@@ -1,5 +1,13 @@
 2003-03-03  Lars Gullik Bjønnes  <larsbj@gullik.net>
 
+       * buffer.C (latexParagraphs): adjust
+
+       * paragraph.C (TeXOnePar): move function...
+       (optArgInset): move function...
+       (TeXEnvironment): move function...
+       * paragraph_pimpl.C (TeXDeeper): move function...
+       * paragraph_funcs.C: ...here
+
        * tabular.C (UseParbox): rewrite to use ParagraphList iterators.
 
 2003-03-02  Lars Gullik Bjønnes  <larsbj@gullik.net>
index b5f9f8561e51aeb751481c1b19eb0920af927fbb..369bfa888750fd1b7fa8d6e79e82c24b1178d652 100644 (file)
@@ -1865,12 +1865,12 @@ void Buffer::latexParagraphs(ostream & ofs, Paragraph * par,
                        if (layout->isEnvironment() ||
                                !par->params().leftIndent().zero())
                        {
-                               par = par->TeXEnvironment(this, params, ofs, texrow);
+                               par = TeXEnvironment(this, params, par, ofs, texrow);
                        } else {
-                               par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
+                               par = TeXOnePar(this, params, par, ofs, texrow, moving_arg);
                        }
                } else {
-                       par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
+                       par = TeXOnePar(this, params, par, ofs, texrow, moving_arg);
                }
        }
        // It might be that we only have a title in this document
index 0f848a48df03eca04438be6f9784c0a615a93b1b..75824ab36bd62913c49e5a3cdd1275b9be698210 100644 (file)
@@ -50,10 +50,6 @@ using std::upper_bound;
 
 using lyx::pos_type;
 
-// this is a bad idea, but how can Paragraph find its buffer to get
-// parameters? (JMarc)
-
-extern string bibitemWidest(Buffer const *);
 
 // this is a minibuffer
 
@@ -225,7 +221,7 @@ void Paragraph::write(Buffer const * buf, ostream & os,
 
        Change running_change = Change(Change::UNCHANGED);
        lyx::time_type const curtime(lyx::current_time());
+
        int column = 0;
        for (pos_type i = 0; i < size(); ++i) {
                if (!i) {
@@ -236,7 +232,7 @@ void Paragraph::write(Buffer const * buf, ostream & os,
                Change change = pimpl_->lookupChangeFull(i);
                Changes::lyxMarkChange(os, column, curtime, running_change, change);
                running_change = change;
+
                // Write font changes
                LyXFont font2 = getFontSettings(bparams, i);
                if (font2 != font1) {
@@ -308,7 +304,7 @@ void Paragraph::write(Buffer const * buf, ostream & os,
                        Change(Change::UNCHANGED), running_change);
        }
        Changes::lyxMarkChange(os, column, curtime,
-               running_change, Change(Change::UNCHANGED)); 
+               running_change, Change(Change::UNCHANGED));
 }
 
 
@@ -391,7 +387,7 @@ bool Paragraph::erase(pos_type start, pos_type end)
        return pimpl_->erase(start, end);
 }
 
+
 bool Paragraph::checkInsertChar(LyXFont & font)
 {
        if (pimpl_->inset_owner)
@@ -936,7 +932,7 @@ int Paragraph::getPositionOfInset(Inset const * inset) const
        InsetList::iterator it = insetlist.begin();
        InsetList::iterator end = insetlist.end();
        for (; it != end; ++it)
-               if (it.getInset() == inset) 
+               if (it.getInset() == inset)
                        return it.getPos();
        return -1;
 }
@@ -946,254 +942,10 @@ InsetBibitem * Paragraph::bibitem()
 {
        InsetList::iterator it = insetlist.begin();
        if (it != insetlist.end() && it.getInset()->lyxCode() == Inset::BIBTEX_CODE)
-               return static_cast<InsetBibitem *>(it.getInset()); 
-       return 0;
-}
-
-namespace {
-
-InsetOptArg * optArgInset(Paragraph const & par)
-{
-       // Find the entry.
-       InsetList::iterator it = par.insetlist.begin();
-       InsetList::iterator end = par.insetlist.end();
-       for (; it != end; ++it) {
-               Inset * ins = it.getInset();
-               if (ins->lyxCode() == Inset::OPTARG_CODE) {
-                       return static_cast<InsetOptArg *>(ins);
-               }
-       }
+               return static_cast<InsetBibitem *>(it.getInset());
        return 0;
 }
 
-} // end namespace
-
-Paragraph * Paragraph::TeXOnePar(Buffer const * buf,
-                                BufferParams const & bparams,
-                                ostream & os, TexRow & texrow,
-                                bool moving_arg)
-{
-       lyxerr[Debug::LATEX] << "TeXOnePar...     " << this << endl;
-       Inset const * in = inInset();
-       bool further_blank_line = false;
-       LyXLayout_ptr style;
-
-       // well we have to check if we are in an inset with unlimited
-       // lenght (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 ((in == 0) || !in->forceDefaultParagraphs(in)) {
-               style = layout();
-
-               if (params().startOfAppendix()) {
-                       os << "\\appendix\n";
-                       texrow.newline();
-               }
-
-               if (!params().spacing().isDefault()
-                       && (!previous() || !previous()->hasSameLayout(this))) {
-                       os << params().spacing().writeEnvirBegin() << '\n';
-                       texrow.newline();
-               }
-
-               if (style->isCommand()) {
-                       os << '\n';
-                       texrow.newline();
-               }
-
-               if (params().pagebreakTop()) {
-                       os << "\\newpage";
-                       further_blank_line = true;
-               }
-               if (params().spaceTop().kind() != VSpace::NONE) {
-                       os << params().spaceTop().asLatexCommand(bparams);
-                       further_blank_line = true;
-               }
-
-               if (params().lineTop()) {
-                       os << "\\lyxline{\\" << getFont(bparams, 0).latexSize() << '}'
-                          << "\\vspace{-1\\parskip}";
-                       further_blank_line = true;
-               }
-
-               if (further_blank_line) {
-                       os << '\n';
-                       texrow.newline();
-               }
-       } else {
-               style = bparams.getLyXTextClass().defaultLayout();
-       }
-
-       Language const * language = getParLanguage(bparams);
-       Language const * doc_language = bparams.language;
-       Language const * previous_language = previous()
-               ? previous()->getParLanguage(bparams) : doc_language;
-
-       if (language->babel() != previous_language->babel()
-           // check if we already put language command in TeXEnvironment()
-           && !(style->isEnvironment()
-                && (!previous() ||
-                    (previous()->layout() != layout() &&
-                     previous()->getDepth() <= getDepth())
-                    || previous()->getDepth() < getDepth())))
-       {
-               if (!lyxrc.language_command_end.empty() &&
-                   previous_language->babel() != doc_language->babel())
-               {
-                       os << subst(lyxrc.language_command_end, "$$lang",
-                                   previous_language->babel())
-                          << endl;
-                       texrow.newline();
-               }
-
-               if (lyxrc.language_command_end.empty() ||
-                   language->babel() != doc_language->babel())
-               {
-                       os << subst(lyxrc.language_command_begin, "$$lang",
-                                   language->babel())
-                          << endl;
-                       texrow.newline();
-               }
-       }
-
-       if (bparams.inputenc == "auto" &&
-           language->encoding() != previous_language->encoding()) {
-               os << "\\inputencoding{"
-                  << language->encoding()->LatexName()
-                  << "}\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(*this);
-                       if (it)
-                               it->latexOptional(buf, os, false, false);
-               }
-               else
-                       os << style->latexparam();
-               break;
-       case LATEX_ITEM_ENVIRONMENT:
-       case LATEX_LIST_ENVIRONMENT:
-               os << "\\item ";
-               break;
-       case LATEX_BIB_ENVIRONMENT:
-               // ignore this, the inset will write itself
-               break;
-       default:
-               break;
-       }
-
-       bool need_par = simpleTeXOnePar(buf, bparams, os, texrow, moving_arg);
-
-       // Make sure that \\par is done with the font of the last
-       // character if this has another size as the default.
-       // This is necessary because LaTeX (and LyX on the screen)
-       // calculates the space between the baselines according
-       // to this font. (Matthias)
-       //
-       // Is this really needed ? (Dekel)
-       // We do not need to use to change the font for the last paragraph
-       // or for a command.
-       LyXFont const font =
-               (empty()
-                ? getLayoutFont(bparams) : getFont(bparams, size() - 1));
-
-       bool is_command = style->isCommand();
-
-       if (style->resfont.size() != font.size() && next_ && !is_command) {
-               if (!need_par)
-                       os << '{';
-               os << "\\" << font.latexSize() << " \\par}";
-       } else if (need_par) {
-               os << "\\par}";
-       } else if (is_command)
-               os << '}';
-
-       switch (style->latextype) {
-       case LATEX_ITEM_ENVIRONMENT:
-       case LATEX_LIST_ENVIRONMENT:
-               if (next_ && (params().depth() < next_->params().depth())) {
-                       os << '\n';
-                       texrow.newline();
-               }
-               break;
-       case LATEX_ENVIRONMENT:
-               // if its the last paragraph of the current environment
-               // skip it otherwise fall through
-               if (next_
-                   && (next_->layout() != layout()
-                       || next_->params().depth() != params().depth()))
-                       break;
-               // fall through possible
-       default:
-               // we don't need it for the last paragraph!!!
-               if (next_) {
-                       os << '\n';
-                       texrow.newline();
-               }
-       }
-
-       if ((in == 0) || !in->forceDefaultParagraphs(in)) {
-               further_blank_line = false;
-               if (params().lineBottom()) {
-                       os << "\\lyxline{\\" << font.latexSize() << '}';
-                       further_blank_line = true;
-               }
-
-               if (params().spaceBottom().kind() != VSpace::NONE) {
-                       os << params().spaceBottom().asLatexCommand(bparams);
-                       further_blank_line = true;
-               }
-
-               if (params().pagebreakBottom()) {
-                       os << "\\newpage";
-                       further_blank_line = true;
-               }
-
-               if (further_blank_line) {
-                       os << '\n';
-                       texrow.newline();
-               }
-
-               if (!params().spacing().isDefault()
-                       && (!next_ || !next_->hasSameLayout(this))) {
-                       os << params().spacing().writeEnvirEnd() << '\n';
-                       texrow.newline();
-               }
-       }
-
-       // we don't need it for the last paragraph!!!
-       if (next_) {
-               os << '\n';
-               texrow.newline();
-       } else {
-               // Since \selectlanguage write the language to the aux file,
-               // we need to reset the language at the end of footnote or
-               // float.
-
-               if (language->babel() != doc_language->babel()) {
-                       if (lyxrc.language_command_end.empty())
-                               os << subst(lyxrc.language_command_begin,
-                                           "$$lang",
-                                           doc_language->babel())
-                                  << endl;
-                       else
-                               os << subst(lyxrc.language_command_end,
-                                           "$$lang",
-                                           language->babel())
-                                  << endl;
-                       texrow.newline();
-               }
-       }
-
-       lyxerr[Debug::LATEX] << "TeXOnePar...done " << next_ << endl;
-       return next_;
-}
 
 
 // This could go to ParagraphParameters if we want to
@@ -1368,7 +1120,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
        bool open_font = false;
 
        Change::Type running_change = Change::UNCHANGED;
+
        texrow.start(this, 0);
 
        // if the paragraph is empty, the loop will not be entered at all
@@ -1455,12 +1207,12 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
                        running_font = font;
                        open_font = true;
                }
+
                Change::Type change = pimpl_->lookupChange(i);
+
                column += Changes::latexMarkChange(os, running_change, change);
                running_change = change;
+
                if (c == Paragraph::META_NEWLINE) {
                        // newlines are handled differently here than
                        // the default in SimpleTeXSpecialChars().
@@ -1497,7 +1249,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
 
        column += Changes::latexMarkChange(os,
                        running_change, Change::UNCHANGED);
+
        // If we have an open font definition, we have to close it
        if (open_font) {
 #ifdef FIXED_LANGUAGE_END_DETECTION
@@ -1535,106 +1287,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const * buf,
 }
 
 
-Paragraph * Paragraph::TeXEnvironment(Buffer const * buf,
-                                           BufferParams const & bparams,
-                                           ostream & os, TexRow & texrow)
-{
-       lyxerr[Debug::LATEX] << "TeXEnvironment...     " << this << endl;
-
-       LyXLayout_ptr const & style = layout();
-
-       Language const * language = getParLanguage(bparams);
-       Language const * doc_language = bparams.language;
-       Language const * previous_language = previous_
-               ? previous_->getParLanguage(bparams) : doc_language;
-       if (language->babel() != previous_language->babel()) {
-
-               if (!lyxrc.language_command_end.empty() &&
-                   previous_language->babel() != doc_language->babel()) {
-                       os << subst(lyxrc.language_command_end, "$$lang",
-                                   previous_language->babel())
-                          << endl;
-                       texrow.newline();
-               }
-
-               if (lyxrc.language_command_end.empty() ||
-                   language->babel() != doc_language->babel()) {
-                       os << subst(lyxrc.language_command_begin, "$$lang",
-                                   language->babel())
-                          << endl;
-                       texrow.newline();
-               }
-       }
-
-       bool leftindent_open = false;
-       if (!params().leftIndent().zero()) {
-               os << "\\begin{LyXParagraphLeftIndent}{" <<
-                       params().leftIndent().asLatexString() << "}\n";
-               texrow.newline();
-               leftindent_open = true;
-       }
-
-       if (style->isEnvironment()) {
-               if (style->latextype == LATEX_LIST_ENVIRONMENT) {
-                       os << "\\begin{" << style->latexname() << "}{"
-                          << params().labelWidthString() << "}\n";
-               } else if (style->labeltype == LABEL_BIBLIO) {
-                       // ale970405
-                       os << "\\begin{" << style->latexname() << "}{"
-                          <<  bibitemWidest(buf)
-                          << "}\n";
-               } else if (style->latextype == LATEX_ITEM_ENVIRONMENT) {
-                       os << "\\begin{" << style->latexname() << '}'
-                          << style->latexparam() << '\n';
-               } else
-                       os << "\\begin{" << style->latexname() << '}'
-                          << style->latexparam() << '\n';
-               texrow.newline();
-       }
-       Paragraph * par = this;
-       do {
-               par = par->TeXOnePar(buf, bparams, os, texrow, false);
-
-               if (par && par->params().depth() > params().depth()) {
-                           if (par->layout()->isParagraph()) {
-
-                           // Thinko!
-                           // How to handle this? (Lgb)
-                           //&& !suffixIs(os, "\n\n")
-                                   //) {
-                               // There should be at least one '\n' already
-                               // but we need there to be two for Standard
-                               // paragraphs that are depth-increment'ed to be
-                               // output correctly.  However, tables can
-                               // also be paragraphs so don't adjust them.
-                               // ARRae
-                               // Thinkee:
-                               // Will it ever harm to have one '\n' too
-                               // many? i.e. that we sometimes will have
-                               // three in a row. (Lgb)
-                               os << '\n';
-                               texrow.newline();
-                       }
-                       par = par->pimpl_->TeXDeeper(buf, bparams, os, texrow);
-               }
-       } while (par
-                && par->layout() == layout()
-                && par->params().depth() == params().depth()
-                && par->params().leftIndent() == params().leftIndent());
-
-       if (style->isEnvironment()) {
-               os << "\\end{" << style->latexname() << "}\n";
-               texrow.newline();
-       }
-
-       if (leftindent_open) {
-               os << "\\end{LyXParagraphLeftIndent}\n";
-               texrow.newline();
-       }
-
-       lyxerr[Debug::LATEX] << "TeXEnvironment...done " << par << endl;
-       return par;  // ale970302
-}
 
 
 bool Paragraph::isHfill(pos_type pos) const
@@ -1831,7 +1483,7 @@ void Paragraph::trackChanges(Change::Type type)
        pimpl_->trackChanges(type);
 }
 
+
 void Paragraph::untrackChanges()
 {
        pimpl_->untrackChanges();
@@ -1843,21 +1495,21 @@ void Paragraph::cleanChanges()
        pimpl_->cleanChanges();
 }
 
+
 Change::Type Paragraph::lookupChange(lyx::pos_type pos) const
 {
        lyx::Assert(!size() || pos < size());
        return pimpl_->lookupChange(pos);
 }
 
+
 Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const
 {
        lyx::Assert(!size() || pos < size());
        return pimpl_->lookupChangeFull(pos);
 }
 
+
 bool Paragraph::isChanged(pos_type start, pos_type end) const
 {
        return pimpl_->isChanged(start, end);
@@ -1869,25 +1521,25 @@ bool Paragraph::isChangeEdited(pos_type start, pos_type end) const
        return pimpl_->isChangeEdited(start, end);
 }
 
+
 void Paragraph::markErased()
 {
        pimpl_->markErased();
 }
 
+
 void Paragraph::acceptChange(pos_type start, pos_type end)
 {
        return pimpl_->acceptChange(start, end);
 }
 
+
 void Paragraph::rejectChange(pos_type start, pos_type end)
 {
        return pimpl_->rejectChange(start, end);
 }
 
+
 lyx::pos_type Paragraph::size() const
 {
        return pimpl_->size();
index 8ed4536de316262df28372991ebeece95871b68d..caedbaf9faac92a879ba5d93d329934878d624d4 100644 (file)
@@ -90,11 +90,6 @@ public:
        ///
        void read();
 
-       ///
-       Paragraph * TeXOnePar(Buffer const *, BufferParams const &,
-                                std::ostream &, TexRow & texrow,
-                                bool moving_arg);
-
        ///
        int startTeXParParams(BufferParams const &, std::ostream &, bool) const;
 
@@ -107,9 +102,6 @@ public:
                             std::ostream &, TexRow & texrow, bool moving_arg);
 
        ///
-       Paragraph * TeXEnvironment(Buffer const *, BufferParams const &,
-                                     std::ostream &, TexRow & texrow);
-       ///
        bool hasSameLayout(Paragraph const * par) const;
 
        ///
@@ -164,34 +156,34 @@ public:
 
        /// initialise tracking for this par
        void trackChanges(Change::Type = Change::UNCHANGED);
+
        /// stop tracking
        void untrackChanges();
+
        /// set entire paragraph to new text for change tracking
        void cleanChanges();
+
        /// look up change type at given pos
        Change::Type lookupChange(lyx::pos_type pos) const;
+
        /// look up change at given pos
        Change const lookupChangeFull(lyx::pos_type pos) const;
+
        /// is there a change within the given range ?
        bool isChanged(lyx::pos_type start, lyx::pos_type end) const;
 
        /// is there a non-addition in this range ?
        bool isChangeEdited(lyx::pos_type start, lyx::pos_type end) const;
+
        /// accept change
        void acceptChange(lyx::pos_type start, lyx::pos_type end);
 
        /// reject change
        void rejectChange(lyx::pos_type start, lyx::pos_type end);
+
        /// mark whole par as erased
        void markErased();
+
        ///
        void previous(Paragraph *);
        ///
@@ -224,12 +216,12 @@ public:
        depth_type getMaxDepthAfter() const;
        ///
        void applyLayout(LyXLayout_ptr const & new_layout);
+
        /// erase the char at the given position
        void erase(lyx::pos_type pos);
        /// erase the given range. Returns true if actually erased.
        bool erase(lyx::pos_type start, lyx::pos_type end);
+
        /** Get uninstantiated font setting. Returns the difference
            between the characters font and the layoutfont.
            This is what is stored in the fonttable
@@ -323,8 +315,8 @@ public:
        //Counters & counters();
 
        friend void breakParagraph(BufferParams const & bparams,
-                    Paragraph * par, lyx::pos_type pos, int flag);
+                   Paragraph * par, lyx::pos_type pos, int flag);
+
 private:
        ///
        LyXLayout_ptr layout_;
@@ -343,16 +335,16 @@ private:
        Pimpl * pimpl_;
 };
 
+
 inline bool isInsertedText(Paragraph const & par, lyx::pos_type pos)
 {
        return par.lookupChange(pos) == Change::INSERTED;
 }
+
+
 inline bool isDeletedText(Paragraph const & par, lyx::pos_type pos)
 {
        return par.lookupChange(pos) == Change::DELETED;
 }
+
 #endif // PARAGRAPH_H
index d9a2a41835d304f0d44c774281ce2e3e313135dc..ea8cf627ddb15e453295935464e131e33b54da6f 100644 (file)
 #include "ParagraphParameters.h"
 #include "lyxtextclasslist.h"
 #include "debug.h"
+#include "language.h"
+#include "encoding.h"
+#include "lyxrc.h"
+#include "support/lstrings.h"
+#include "insets/insetoptarg.h"
+
+extern string bibitemWidest(Buffer const *);
 
 using lyx::pos_type;
 //using lyx::layout_type;
 using std::endl;
-
+using std::ostream;
 
 void breakParagraph(BufferParams const & bparams,
                    Paragraph * par,
@@ -37,7 +44,7 @@ void breakParagraph(BufferParams const & bparams,
 
        if (bparams.tracking_changes)
                tmp->trackChanges();
+
        // this is an idea for a more userfriendly layout handling, I will
        // see what the users say
 
@@ -238,3 +245,377 @@ int getEndLabel(Paragraph * para, BufferParams const & bparams)
        return END_LABEL_NO_LABEL;
 }
 #endif
+
+
+Paragraph * TeXDeeper(Buffer const * buf,
+                     BufferParams const & bparams,
+                     Paragraph * pit,
+                     ostream & os, TexRow & texrow)
+{
+       lyxerr[Debug::LATEX] << "TeXDeeper...     " << pit << endl;
+       Paragraph * par = pit;
+
+       while (par && par->params().depth() == pit->params().depth()) {
+               if (par->layout()->isEnvironment()) {
+                       par = TeXEnvironment(buf, bparams, par,
+                                                 os, texrow);
+               } else {
+                       par = TeXOnePar(buf, bparams, par,
+                                            os, texrow, false);
+               }
+       }
+       lyxerr[Debug::LATEX] << "TeXDeeper...done " << par << endl;
+
+       return par;
+}
+
+
+Paragraph * TeXEnvironment(Buffer const * buf,
+                          BufferParams const & bparams,
+                          Paragraph * pit,
+                          ostream & os, TexRow & texrow)
+{
+       lyxerr[Debug::LATEX] << "TeXEnvironment...     " << pit << endl;
+
+       LyXLayout_ptr const & style = pit->layout();
+
+       Language const * language = pit->getParLanguage(bparams);
+       Language const * doc_language = bparams.language;
+       Language const * previous_language = pit->previous()
+               ? pit->previous()->getParLanguage(bparams) : doc_language;
+       if (language->babel() != previous_language->babel()) {
+
+               if (!lyxrc.language_command_end.empty() &&
+                   previous_language->babel() != doc_language->babel()) {
+                       os << subst(lyxrc.language_command_end, "$$lang",
+                                   previous_language->babel())
+                          << endl;
+                       texrow.newline();
+               }
+
+               if (lyxrc.language_command_end.empty() ||
+                   language->babel() != doc_language->babel()) {
+                       os << subst(lyxrc.language_command_begin, "$$lang",
+                                   language->babel())
+                          << endl;
+                       texrow.newline();
+               }
+       }
+
+       bool leftindent_open = false;
+       if (!pit->params().leftIndent().zero()) {
+               os << "\\begin{LyXParagraphLeftIndent}{" <<
+                       pit->params().leftIndent().asLatexString() << "}\n";
+               texrow.newline();
+               leftindent_open = true;
+       }
+
+       if (style->isEnvironment()) {
+               if (style->latextype == LATEX_LIST_ENVIRONMENT) {
+                       os << "\\begin{" << style->latexname() << "}{"
+                          << pit->params().labelWidthString() << "}\n";
+               } else if (style->labeltype == LABEL_BIBLIO) {
+                       // ale970405
+                       os << "\\begin{" << style->latexname() << "}{"
+                          <<  bibitemWidest(buf)
+                          << "}\n";
+               } else if (style->latextype == LATEX_ITEM_ENVIRONMENT) {
+                       os << "\\begin{" << style->latexname() << '}'
+                          << style->latexparam() << '\n';
+               } else
+                       os << "\\begin{" << style->latexname() << '}'
+                          << style->latexparam() << '\n';
+               texrow.newline();
+       }
+       Paragraph * par = pit;
+       do {
+               par = TeXOnePar(buf, bparams, par, os, texrow, false);
+
+               if (par && par->params().depth() > pit->params().depth()) {
+                           if (par->layout()->isParagraph()) {
+
+                           // Thinko!
+                           // How to handle this? (Lgb)
+                           //&& !suffixIs(os, "\n\n")
+                                   //) {
+                               // There should be at least one '\n' already
+                               // but we need there to be two for Standard
+                               // paragraphs that are depth-increment'ed to be
+                               // output correctly.  However, tables can
+                               // also be paragraphs so don't adjust them.
+                               // ARRae
+                               // Thinkee:
+                               // Will it ever harm to have one '\n' too
+                               // many? i.e. that we sometimes will have
+                               // three in a row. (Lgb)
+                               os << '\n';
+                               texrow.newline();
+                       }
+                       par = TeXDeeper(buf, bparams, par, os, texrow);
+               }
+       } while (par
+                && par->layout() == pit->layout()
+                && par->params().depth() == pit->params().depth()
+                && par->params().leftIndent() == pit->params().leftIndent());
+
+       if (style->isEnvironment()) {
+               os << "\\end{" << style->latexname() << "}\n";
+               texrow.newline();
+       }
+
+       if (leftindent_open) {
+               os << "\\end{LyXParagraphLeftIndent}\n";
+               texrow.newline();
+       }
+
+       lyxerr[Debug::LATEX] << "TeXEnvironment...done " << par << endl;
+       return par;  // ale970302
+}
+
+
+namespace {
+
+InsetOptArg * optArgInset(Paragraph const & par)
+{
+       // Find the entry.
+       InsetList::iterator it = par.insetlist.begin();
+       InsetList::iterator end = par.insetlist.end();
+       for (; it != end; ++it) {
+               Inset * ins = it.getInset();
+               if (ins->lyxCode() == Inset::OPTARG_CODE) {
+                       return static_cast<InsetOptArg *>(ins);
+               }
+       }
+       return 0;
+}
+
+} // end namespace
+
+
+Paragraph * TeXOnePar(Buffer const * buf,
+                     BufferParams const & bparams,
+                     Paragraph * pit,
+                     ostream & os, TexRow & texrow,
+                     bool moving_arg)
+{
+       lyxerr[Debug::LATEX] << "TeXOnePar...     " << pit << endl;
+       Inset const * in = pit->inInset();
+       bool further_blank_line = false;
+       LyXLayout_ptr style;
+
+       // well we have to check if we are in an inset with unlimited
+       // lenght (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 ((in == 0) || !in->forceDefaultParagraphs(in)) {
+               style = pit->layout();
+
+               if (pit->params().startOfAppendix()) {
+                       os << "\\appendix\n";
+                       texrow.newline();
+               }
+
+               if (!pit->params().spacing().isDefault()
+                       && (!pit->previous() || !pit->previous()->hasSameLayout(pit))) {
+                       os << pit->params().spacing().writeEnvirBegin() << '\n';
+                       texrow.newline();
+               }
+
+               if (style->isCommand()) {
+                       os << '\n';
+                       texrow.newline();
+               }
+
+               if (pit->params().pagebreakTop()) {
+                       os << "\\newpage";
+                       further_blank_line = true;
+               }
+               if (pit->params().spaceTop().kind() != VSpace::NONE) {
+                       os << pit->params().spaceTop().asLatexCommand(bparams);
+                       further_blank_line = true;
+               }
+
+               if (pit->params().lineTop()) {
+                       os << "\\lyxline{\\" << pit->getFont(bparams, 0).latexSize() << '}'
+                          << "\\vspace{-1\\parskip}";
+                       further_blank_line = true;
+               }
+
+               if (further_blank_line) {
+                       os << '\n';
+                       texrow.newline();
+               }
+       } else {
+               style = bparams.getLyXTextClass().defaultLayout();
+       }
+
+       Language const * language = pit->getParLanguage(bparams);
+       Language const * doc_language = bparams.language;
+       Language const * previous_language = pit->previous()
+               ? pit->previous()->getParLanguage(bparams) : doc_language;
+
+       if (language->babel() != previous_language->babel()
+           // check if we already put language command in TeXEnvironment()
+           && !(style->isEnvironment()
+                && (!pit->previous() ||
+                    (pit->previous()->layout() != pit->layout() &&
+                     pit->previous()->getDepth() <= pit->getDepth())
+                    || pit->previous()->getDepth() < pit->getDepth())))
+       {
+               if (!lyxrc.language_command_end.empty() &&
+                   previous_language->babel() != doc_language->babel())
+               {
+                       os << subst(lyxrc.language_command_end, "$$lang",
+                                   previous_language->babel())
+                          << endl;
+                       texrow.newline();
+               }
+
+               if (lyxrc.language_command_end.empty() ||
+                   language->babel() != doc_language->babel())
+               {
+                       os << subst(lyxrc.language_command_begin, "$$lang",
+                                   language->babel())
+                          << endl;
+                       texrow.newline();
+               }
+       }
+
+       if (bparams.inputenc == "auto" &&
+           language->encoding() != previous_language->encoding()) {
+               os << "\\inputencoding{"
+                  << language->encoding()->LatexName()
+                  << "}\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, false, false);
+               }
+               else
+                       os << style->latexparam();
+               break;
+       case LATEX_ITEM_ENVIRONMENT:
+       case LATEX_LIST_ENVIRONMENT:
+               os << "\\item ";
+               break;
+       case LATEX_BIB_ENVIRONMENT:
+               // ignore this, the inset will write itself
+               break;
+       default:
+               break;
+       }
+
+       bool need_par = pit->simpleTeXOnePar(buf, bparams, os, texrow, moving_arg);
+
+       // Make sure that \\par is done with the font of the last
+       // character if this has another size as the default.
+       // This is necessary because LaTeX (and LyX on the screen)
+       // calculates the space between the baselines according
+       // to this font. (Matthias)
+       //
+       // Is this really needed ? (Dekel)
+       // We do not need to use to change the font for the last paragraph
+       // or for a command.
+       LyXFont const font =
+               (pit->empty()
+                ? pit->getLayoutFont(bparams) : pit->getFont(bparams, pit->size() - 1));
+
+       bool is_command = style->isCommand();
+
+       if (style->resfont.size() != font.size() && pit->next() && !is_command) {
+               if (!need_par)
+                       os << '{';
+               os << "\\" << font.latexSize() << " \\par}";
+       } else if (need_par) {
+               os << "\\par}";
+       } else if (is_command)
+               os << '}';
+
+       switch (style->latextype) {
+       case LATEX_ITEM_ENVIRONMENT:
+       case LATEX_LIST_ENVIRONMENT:
+               if (pit->next() && (pit->params().depth() < pit->next()->params().depth())) {
+                       os << '\n';
+                       texrow.newline();
+               }
+               break;
+       case LATEX_ENVIRONMENT:
+               // if its the last paragraph of the current environment
+               // skip it otherwise fall through
+               if (pit->next()
+                   && (pit->next()->layout() != pit->layout()
+                       || pit->next()->params().depth() != pit->params().depth()))
+                       break;
+               // fall through possible
+       default:
+               // we don't need it for the last paragraph!!!
+               if (pit->next()) {
+                       os << '\n';
+                       texrow.newline();
+               }
+       }
+
+       if ((in == 0) || !in->forceDefaultParagraphs(in)) {
+               further_blank_line = false;
+               if (pit->params().lineBottom()) {
+                       os << "\\lyxline{\\" << font.latexSize() << '}';
+                       further_blank_line = true;
+               }
+
+               if (pit->params().spaceBottom().kind() != VSpace::NONE) {
+                       os << pit->params().spaceBottom().asLatexCommand(bparams);
+                       further_blank_line = true;
+               }
+
+               if (pit->params().pagebreakBottom()) {
+                       os << "\\newpage";
+                       further_blank_line = true;
+               }
+
+               if (further_blank_line) {
+                       os << '\n';
+                       texrow.newline();
+               }
+
+               if (!pit->params().spacing().isDefault()
+                       && (!pit->next() || !pit->next()->hasSameLayout(pit))) {
+                       os << pit->params().spacing().writeEnvirEnd() << '\n';
+                       texrow.newline();
+               }
+       }
+
+       // we don't need it for the last paragraph!!!
+       if (pit->next()) {
+               os << '\n';
+               texrow.newline();
+       } else {
+               // Since \selectlanguage write the language to the aux file,
+               // we need to reset the language at the end of footnote or
+               // float.
+
+               if (language->babel() != doc_language->babel()) {
+                       if (lyxrc.language_command_end.empty())
+                               os << subst(lyxrc.language_command_begin,
+                                           "$$lang",
+                                           doc_language->babel())
+                                  << endl;
+                       else
+                               os << subst(lyxrc.language_command_end,
+                                           "$$lang",
+                                           language->babel())
+                                  << endl;
+                       texrow.newline();
+               }
+       }
+
+       lyxerr[Debug::LATEX] << "TeXOnePar...done " << pit->next() << endl;
+       return pit->next();
+}
index 791087fefd50e77f9060bff670827f55d38d9e61..d136d619e409a9b67a8a81a6d7a5a0b07e6914b3 100644 (file)
 
 #include "support/types.h"
 
+class Buffer;
 class BufferParams;
 class Paragraph;
+class TexRow;
 
 ///
 void breakParagraph(BufferParams const & bparams,
@@ -49,4 +51,20 @@ bool isFirstInSequence(Paragraph * par);
 int getEndLabel(Paragraph * para, BufferParams const & bparams);
 #endif
 
+Paragraph * TeXDeeper(Buffer const * buf,
+                     BufferParams const & bparams,
+                     Paragraph * pit,
+                     std::ostream & os, TexRow & texrow);
+
+Paragraph * TeXEnvironment(Buffer const * buf,
+                          BufferParams const & bparams,
+                          Paragraph * pit,
+                          std::ostream & os, TexRow & texrow);
+
+Paragraph * TeXOnePar(Buffer const * buf,
+                     BufferParams const & bparams,
+                     Paragraph * pit,
+                     std::ostream & os, TexRow & texrow,
+                     bool moving_arg);
+
 #endif // PARAGRAPH_FUNCS_H
index 285a555f8d4edbcdf359c721dc6dda4651fe9654..2e2098439908787eebe3025d7403fa716a30f440 100644 (file)
@@ -79,7 +79,7 @@ Paragraph::Pimpl::Pimpl(Pimpl const & p, Paragraph * owner, bool same_ids)
 void Paragraph::Pimpl::clear()
 {
        text.clear();
-#warning changes ? 
+#warning changes ?
 }
 
 
@@ -99,20 +99,20 @@ void Paragraph::Pimpl::trackChanges(Change::Type type)
                lyxerr[Debug::CHANGES] << "already tracking for par " << id_ << endl;
                return;
        }
+
        lyxerr[Debug::CHANGES] << "track changes for par "
                << id_ << " type " << type << endl;
        changes_.reset(new Changes(type));
        changes_->set(type, 0, size());
 }
 
+
 void Paragraph::Pimpl::untrackChanges()
 {
        changes_.reset(0);
 }
 
+
 void Paragraph::Pimpl::cleanChanges()
 {
        // if we're not tracking, we don't want to reset...
@@ -123,7 +123,7 @@ void Paragraph::Pimpl::cleanChanges()
        changes_->set(Change::INSERTED, 0, size());
 }
 
+
 bool Paragraph::Pimpl::isChanged(pos_type start, pos_type end) const
 {
        if (!tracking())
@@ -141,7 +141,7 @@ bool Paragraph::Pimpl::isChangeEdited(pos_type start, pos_type end) const
        return changes_->isChangeEdited(start, end);
 }
 
+
 void Paragraph::Pimpl::setChange(pos_type pos, Change::Type type)
 {
        if (!tracking())
@@ -150,7 +150,7 @@ void Paragraph::Pimpl::setChange(pos_type pos, Change::Type type)
        changes_->set(type, pos);
 }
 
+
 Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
 {
        if (!tracking())
@@ -158,7 +158,7 @@ Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
 
        return changes_->lookup(pos);
 }
+
 
 Change const Paragraph::Pimpl::lookupChangeFull(pos_type pos) const
 {
@@ -167,8 +167,8 @@ Change const Paragraph::Pimpl::lookupChangeFull(pos_type pos) const
 
        return changes_->lookupFull(pos);
 }
+
+
 void Paragraph::Pimpl::markErased()
 {
        lyx::Assert(tracking());
@@ -180,18 +180,18 @@ void Paragraph::Pimpl::markErased()
        changes_->reset(Change::DELETED);
 }
 
+
 void Paragraph::Pimpl::acceptChange(pos_type start, pos_type end)
 {
        if (!tracking())
                return;
+
        if (!size()) {
                changes_.reset(new Changes(Change::UNCHANGED));
                return;
        }
-       lyxerr << "acceptchange" << endl; 
+
+       lyxerr << "acceptchange" << endl;
        pos_type i = start;
 
        for (; i < end; ++i) {
@@ -212,7 +212,7 @@ void Paragraph::Pimpl::acceptChange(pos_type start, pos_type end)
                }
        }
 
-       lyxerr << "endacceptchange" << endl; 
+       lyxerr << "endacceptchange" << endl;
        changes_->reset(Change::UNCHANGED);
 }
 
@@ -221,12 +221,12 @@ void Paragraph::Pimpl::rejectChange(pos_type start, pos_type end)
 {
        if (!tracking())
                return;
+
        if (!size()) {
                changes_.reset(new Changes(Change::UNCHANGED));
                return;
        }
+
        pos_type i = start;
 
        for (; i < end; ++i) {
@@ -249,7 +249,7 @@ void Paragraph::Pimpl::rejectChange(pos_type start, pos_type end)
        changes_->reset(Change::UNCHANGED);
 }
 
+
 Paragraph::value_type Paragraph::Pimpl::getChar(pos_type pos) const
 {
        // This is in the critical path for loading!
@@ -339,7 +339,7 @@ bool Paragraph::Pimpl::erasePos(pos_type pos)
 
                // only allow the actual removal if it was /new/ text
                if (changetype != Change::INSERTED) {
-                       if (text[pos] == Paragraph::META_INSET) { 
+                       if (text[pos] == Paragraph::META_INSET) {
                                Inset * i(owner_->getInset(pos));
                                i->markErased();
                        }
@@ -351,7 +351,7 @@ bool Paragraph::Pimpl::erasePos(pos_type pos)
        return true;
 }
 
+
 void Paragraph::Pimpl::eraseIntern(pos_type pos)
 {
        // if it is an inset, delete the inset entry
@@ -401,7 +401,7 @@ void Paragraph::Pimpl::erase(pos_type pos)
        erasePos(pos);
 }
 
+
 bool Paragraph::Pimpl::erase(pos_type start, pos_type end)
 {
        pos_type i = start;
@@ -413,13 +413,13 @@ bool Paragraph::Pimpl::erase(pos_type start, pos_type end)
                        ++i;
                } else {
                        any_erased = true;
-               } 
+               }
                --count;
        }
        return any_erased;
 }
 
+
 void Paragraph::Pimpl::simpleTeXBlanks(ostream & os, TexRow & texrow,
                                       pos_type const i,
                                       unsigned int & column,
@@ -480,7 +480,7 @@ bool Paragraph::Pimpl::isTextAt(string const & str, pos_type pos) const
        return true;
 }
 
+
 void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                                             BufferParams const & bparams,
                                             ostream & os,
@@ -510,13 +510,13 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
                // FIXME: remove this check
                if (!inset)
                        break;
+
                if (inset->isTextInset()) {
                        column += Changes::latexMarkChange(os, running_change,
                                Change::UNCHANGED);
                        running_change = Change::UNCHANGED;
                }
+
                bool close = false;
                int const len = os.tellp();
                //ostream::pos_type const len = os.tellp();
@@ -742,29 +742,6 @@ void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
 }
 
 
-
-Paragraph * Paragraph::Pimpl::TeXDeeper(Buffer const * buf,
-                                       BufferParams const & bparams,
-                                       ostream & os, TexRow & texrow)
-{
-       lyxerr[Debug::LATEX] << "TeXDeeper...     " << this << endl;
-       Paragraph * par = owner_;
-
-       while (par && par->params().depth() == owner_->params().depth()) {
-               if (par->layout()->isEnvironment()) {
-                       par = par->TeXEnvironment(buf, bparams,
-                                                 os, texrow);
-               } else {
-                       par = par->TeXOnePar(buf, bparams,
-                                            os, texrow, false);
-               }
-       }
-       lyxerr[Debug::LATEX] << "TeXDeeper...done " << par << endl;
-
-       return par;
-}
-
-
 void Paragraph::Pimpl::validate(LaTeXFeatures & features,
                                LyXLayout const & layout) const
 {
index 5ecd70bcf2df681072e6487eca0024b5745e6d07..db782737b69a50d068afae3afbfce000bfafbbda 100644 (file)
@@ -14,7 +14,7 @@
 #include "counters.h"
 
 #include <boost/scoped_ptr.hpp>
+
 class LyXLayout;
 
 struct Paragraph::Pimpl {
@@ -51,24 +51,24 @@ struct Paragraph::Pimpl {
        bool isChanged(lyx::pos_type start, lyx::pos_type end) const;
        /// is there a non-addition in this range ?
        bool isChangeEdited(lyx::pos_type start, lyx::pos_type end) const;
+
        /// set change at pos
        void setChange(lyx::pos_type pos, Change::Type type);
+
        /// mark as erased
        void markErased();
+
        /// accept change
        void acceptChange(lyx::pos_type start, lyx::pos_type end);
 
        /// reject change
        void rejectChange(lyx::pos_type start, lyx::pos_type end);
+
        /// are we tracking changes ?
        bool tracking() const {
                return changes_.get();
        }
+
        ///
        value_type getChar(lyx::pos_type pos) const;
        ///
@@ -147,9 +147,6 @@ struct Paragraph::Pimpl {
        ///
        FontList fontlist;
 
-       ///
-       Paragraph * TeXDeeper(Buffer const *, BufferParams const &,
-                                std::ostream &, TexRow & texrow);
        ///
        void simpleTeXBlanks(std::ostream &, TexRow & texrow,
                             lyx::pos_type const i,
@@ -187,7 +184,7 @@ private:
 
        /// for recording and looking up changes in revision tracking mode
        boost::scoped_ptr<Changes> changes_;
+
        /// Who owns us?
        Paragraph * owner_;
        ///