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>
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
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
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) {
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) {
Change(Change::UNCHANGED), running_change);
}
Changes::lyxMarkChange(os, column, curtime,
- running_change, Change(Change::UNCHANGED));
+ running_change, Change(Change::UNCHANGED));
}
return pimpl_->erase(start, end);
}
-
+
bool Paragraph::checkInsertChar(LyXFont & font)
{
if (pimpl_->inset_owner)
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;
}
{
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
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
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().
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
}
-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
pimpl_->trackChanges(type);
}
-
+
void Paragraph::untrackChanges()
{
pimpl_->untrackChanges();
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);
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();
///
void read();
- ///
- Paragraph * TeXOnePar(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow,
- bool moving_arg);
-
///
int startTeXParParams(BufferParams const &, std::ostream &, bool) const;
std::ostream &, TexRow & texrow, bool moving_arg);
///
- Paragraph * TeXEnvironment(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow);
- ///
bool hasSameLayout(Paragraph const * par) const;
///
/// 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 *);
///
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
//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_;
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
#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,
if (bparams.tracking_changes)
tmp->trackChanges();
-
+
// this is an idea for a more userfriendly layout handling, I will
// see what the users say
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();
+}
#include "support/types.h"
+class Buffer;
class BufferParams;
class Paragraph;
+class TexRow;
///
void breakParagraph(BufferParams const & bparams,
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
void Paragraph::Pimpl::clear()
{
text.clear();
-#warning changes ?
+#warning changes ?
}
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...
changes_->set(Change::INSERTED, 0, size());
}
-
+
bool Paragraph::Pimpl::isChanged(pos_type start, pos_type end) const
{
if (!tracking())
return changes_->isChangeEdited(start, end);
}
-
+
void Paragraph::Pimpl::setChange(pos_type pos, Change::Type type)
{
if (!tracking())
changes_->set(type, pos);
}
-
+
Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
{
if (!tracking())
return changes_->lookup(pos);
}
-
+
Change const Paragraph::Pimpl::lookupChangeFull(pos_type pos) const
{
return changes_->lookupFull(pos);
}
-
-
+
+
void Paragraph::Pimpl::markErased()
{
lyx::Assert(tracking());
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) {
}
}
- lyxerr << "endacceptchange" << endl;
+ lyxerr << "endacceptchange" << endl;
changes_->reset(Change::UNCHANGED);
}
{
if (!tracking())
return;
-
+
if (!size()) {
changes_.reset(new Changes(Change::UNCHANGED));
return;
}
-
+
pos_type i = start;
for (; i < end; ++i) {
changes_->reset(Change::UNCHANGED);
}
-
+
Paragraph::value_type Paragraph::Pimpl::getChar(pos_type pos) const
{
// This is in the critical path for loading!
// 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();
}
return true;
}
-
+
void Paragraph::Pimpl::eraseIntern(pos_type pos)
{
// if it is an inset, delete the inset entry
erasePos(pos);
}
-
+
bool Paragraph::Pimpl::erase(pos_type start, pos_type end)
{
pos_type i = start;
++i;
} else {
any_erased = true;
- }
+ }
--count;
}
return any_erased;
}
-
+
void Paragraph::Pimpl::simpleTeXBlanks(ostream & os, TexRow & texrow,
pos_type const i,
unsigned int & column,
return true;
}
-
+
void Paragraph::Pimpl::simpleTeXSpecialChars(Buffer const * buf,
BufferParams const & bparams,
ostream & os,
// 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();
}
-
-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
{
#include "counters.h"
#include <boost/scoped_ptr.hpp>
-
+
class LyXLayout;
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;
///
///
FontList fontlist;
- ///
- Paragraph * TeXDeeper(Buffer const *, BufferParams const &,
- std::ostream &, TexRow & texrow);
///
void simpleTeXBlanks(std::ostream &, TexRow & texrow,
lyx::pos_type const i,
/// for recording and looking up changes in revision tracking mode
boost::scoped_ptr<Changes> changes_;
-
+
/// Who owns us?
Paragraph * owner_;
///