From: Lars Gullik Bjønnes Date: Mon, 3 Mar 2003 21:15:49 +0000 (+0000) Subject: move some functions around X-Git-Tag: 1.6.10~17378 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=60322bc9d78704180ddfd2e4bf83ffa65143761c;p=features.git move some functions around git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6328 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/ChangeLog b/src/ChangeLog index b6ce6b8764..9296813fa8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2003-03-03 Lars Gullik Bjønnes + * 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 diff --git a/src/buffer.C b/src/buffer.C index b5f9f8561e..369bfa8887 100644 --- a/src/buffer.C +++ b/src/buffer.C @@ -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 diff --git a/src/paragraph.C b/src/paragraph.C index 0f848a48df..75824ab36b 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -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(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(ins); - } - } + return static_cast(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(); diff --git a/src/paragraph.h b/src/paragraph.h index 8ed4536de3..caedbaf9fa 100644 --- a/src/paragraph.h +++ b/src/paragraph.h @@ -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 diff --git a/src/paragraph_funcs.C b/src/paragraph_funcs.C index d9a2a41835..ea8cf627dd 100644 --- a/src/paragraph_funcs.C +++ b/src/paragraph_funcs.C @@ -16,11 +16,18 @@ #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(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(); +} diff --git a/src/paragraph_funcs.h b/src/paragraph_funcs.h index 791087fefd..d136d619e4 100644 --- a/src/paragraph_funcs.h +++ b/src/paragraph_funcs.h @@ -14,8 +14,10 @@ #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 diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index 285a555f8d..2e20984399 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -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 { diff --git a/src/paragraph_pimpl.h b/src/paragraph_pimpl.h index 5ecd70bcf2..db782737b6 100644 --- a/src/paragraph_pimpl.h +++ b/src/paragraph_pimpl.h @@ -14,7 +14,7 @@ #include "counters.h" #include - + 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_; - + /// Who owns us? Paragraph * owner_; ///