#include "version.h"
#include "LaTeX.h"
#include "Chktex.h"
-#include "LyXView.h"
+#include "frontends/LyXView.h"
#include "debug.h"
#include "LaTeXFeatures.h"
#include "lyxtext.h"
#ifndef NO_COMPABILITY
struct ErtComp
{
- ErtComp() : active(false), in_tabular(false) {
+ ErtComp() : active(false), fromlayout(false), in_tabular(false) {
}
string contents;
bool active;
+ bool fromlayout;
bool in_tabular;
LyXFont font;
};
#ifndef NO_COMPABILITY
ert_comp.contents.erase();
ert_comp.active = false;
+ ert_comp.fromlayout = false;
ert_comp.in_tabular = false;
#endif
int pos = 0;
Paragraph * first_par = 0;
LyXFont font(LyXFont::ALL_INHERIT, params.language);
+
+#if 0
if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
+#endif
if (!par) {
par = new Paragraph;
#ifndef NO_COMPABILITY
+
+Inset * Buffer::isErtInset(Paragraph * par, int pos) const
+{
+ Inset * inset;
+ if ((par->getChar(pos) == Paragraph::META_INSET) &&
+ (inset = par->getInset(pos)) &&
+ (inset->lyxCode() == Inset::ERT_CODE))
+ {
+ return inset;
+ }
+ return 0;
+}
+
void Buffer::insertErtContents(Paragraph * par, int & pos, bool set_inactive)
{
- if (!ert_comp.contents.empty()) {
+ if (ert_comp.contents.find_first_not_of(' ') != string::npos) {
+ // we only skip completely empty ERT (only spaces) otherwise
+ // we have to insert it as is.
+ string str(ert_comp.contents);
lyxerr[Debug::INSETS] << "ERT contents:\n'"
- << ert_comp.contents << "'" << endl;
- Inset * inset = new InsetERT(params, params.language,
- ert_comp.contents, true);
- par->insertInset(pos++, inset, ert_comp.font);
- ert_comp.contents.erase();
+ << str << "'" << endl;
+ // check if we have already an ert inset a position earlier
+ // if this is the case then we should insert the contents
+ // inside the other ertinset as it is stupid to have various
+ // ert in a row.
+ Inset * inset;
+ if ((pos > 0) && (inset=isErtInset(par, pos-1))) {
+ // get the last paragraph from the inset before
+ Paragraph * last = inset->firstParagraph();
+ while(last->next())
+ last = last->next();
+ // create the new paragraph after the last one
+ Paragraph * par = new Paragraph(last);
+ par->layout(textclasslist[params.textclass].defaultLayoutName());
+ par->setInsetOwner(last->inInset());
+ // set the contents
+ LyXFont font(LyXFont::ALL_INHERIT, params.language);
+ string::const_iterator cit = str.begin();
+ string::const_iterator end = str.end();
+ pos_type pos = 0;
+ for (; cit != end; ++cit) {
+ par->insertChar(pos++, *cit, font);
+ }
+ } else {
+ Inset * inset =
+ new InsetERT(params, params.language, str, true);
+ par->insertInset(pos++, inset, ert_comp.font);
+ }
}
+ ert_comp.contents.erase();
+ ert_comp.fromlayout = false;
if (set_inactive) {
ert_comp.active = false;
}
++pos;
} else if (token == "\\layout") {
#ifndef NO_COMPABILITY
+ bool old_fromlayout = ert_comp.fromlayout;
+ bool create_new_par = true;
ert_comp.in_tabular = false;
// Do the insetert.
- insertErtContents(par, pos);
+ if (!par->size() && par->previous() &&
+ (par->previous()->size() == 1) &&
+ isErtInset(par->previous(), par->previous()->size()-1))
+ {
+ int p = par->previous()->size();
+ insertErtContents(par->previous(), p);
+ create_new_par = false;
+ } else {
+ insertErtContents(par, pos);
+ }
+#endif
+ // reset the font as we start a new layout and if the font is
+ // not ALL_INHERIT,document_language then it will be set to the
+ // right values after this tag (Jug 20020420)
+ font = LyXFont(LyXFont::ALL_INHERIT, params.language);
+
+#if 0
+ if (file_format < 216 && params.language->lang() == "hebrew")
+ font.setLanguage(default_language);
#endif
+
lex.eatLine();
string layoutname = lex.getString();
if (layoutname.empty()) {
layoutname = tclass.defaultLayoutName();
}
-
+#ifndef NO_COMPABILITY
+ if (compare_no_case(layoutname, "latex") == 0) {
+ ert_comp.active = true;
+ ert_comp.fromlayout = true;
+ ert_comp.font = font;
+ if (old_fromlayout)
+ create_new_par = false;
+ }
+#endif
bool hasLayout = tclass.hasLayout(layoutname);
if (!hasLayout) {
lyxerr << "Layout '" << layoutname << "' does not"
layoutname = tclass.defaultLayoutName();
}
- // reset the font as we start a new layout and if the font is
- // not ALL_INHERIT,document_language then it will be set to the
- // right values after this tag (Jug 20020420)
- font = LyXFont(LyXFont::ALL_INHERIT, params.language);
- if (file_format < 216 && params.language->lang() == "hebrew")
- font.setLanguage(default_language);
-
-#ifndef NO_COMPABILITY
- if (compare_no_case(layoutname, "latex") == 0) {
- ert_comp.active = true;
- ert_comp.font = font;
- }
-#endif
#ifdef USE_CAPTION
// The is the compability reading of layout caption.
// It can be removed in LyX version 1.3.0. (Lgb)
par->InsertInset(pos, inset, font);
++pos;
} else {
+#endif
+#ifndef NO_COMPABILITY
+ if (create_new_par) {
#endif
if (!first_par)
first_par = par;
if (!layout.obsoleted_by().empty())
par->layout(layout.obsoleted_by());
par->params().depth(depth);
+#ifndef NO_COMPABILITY
+ } else {
+ // we duplicate code here because it's easier to remove
+ // the code then of NO_COMPATIBILITY
+ par->layout(layoutname);
+ // Test whether the layout is obsolete.
+ LyXLayout const & layout =
+ textclasslist[params.textclass][par->layout()];
+ if (!layout.obsoleted_by().empty())
+ par->layout(layout.obsoleted_by());
+ par->params().depth(depth);
+ }
+#endif
#if USE_CAPTION
}
#endif
LyXLex nylex(0, 0);
nylex.setStream(istr);
inset->read(this, nylex);
-
par->insertInset(pos, inset, font);
++pos;
insertErtContents(par, pos);
params.fonts = lex.getString();
} else if (token == "\\noindent") {
par->params().noindent(true);
+ } else if (token == "\\leftindent") {
+ lex.nextToken();
+ LyXLength value(lex.getString());
+ par->params().leftIndent(value);
} else if (token == "\\fill_top") {
par->params().spaceTop(VSpace(VSpace::VFILL));
} else if (token == "\\fill_bottom") {
font.setLanguage(params.language);
lex.printError("Unknown language `$$Token'");
}
+#ifndef NO_COMPABILITY
+ // if the contents is still empty we're just behind the
+ // latex font change and so this inset should also be
+ // inserted with that language tag!
+ if (ert_comp.active && ert_comp.contents.empty()) {
+ ert_comp.font.setLanguage(font.language());
+ }
+#endif
} else if (token == "\\numeric") {
lex.next();
font.setNumber(font.setLyXMisc(lex.getString()));
#ifndef NO_COMPABILITY
ert_comp = ert_stack.top();
ert_stack.pop();
- insertErtContents(par, pos);
#endif
} else if (token == "\\SpecialChar") {
LyXLayout const & layout =
}
parBeforeMinipage->insertInset
(parBeforeMinipage->size(), mini, font);
+ } else if (par->params().pextraType() == Paragraph::PEXTRA_INDENT) {
+ par->params().leftIndent(LyXLength(par->params().pextraWidth()));
+ if (!par->params().pextraWidthp().empty()) {
+ par->params().leftIndent(LyXLength((par->params().pextraWidthp())+"col%"));
+ }
}
}
// End of pextra_minipage compability
_("Old LyX file format found. "
"Use LyX 0.10.x to read this!"));
return false;
+ } else if (file_format < 220) {
+ Alert::alert(_("ERROR!"),
+ _("Old LyX file format found. "
+ "User LyX 1.2.x to read this!"));
+ return false;
}
}
bool the_end = readLyXformat2(lex, par);
params.setPaperStuff();
+
+#if 0
// the_end was added in 213
if (file_format < 213)
the_end = true;
+#endif
if (!the_end) {
Alert::alert(_("Warning!"),
*/
// Should probably have some more error checking here.
- // Should be cleaned up in 0.13, at least a bit.
// Doing it this way, also makes the inodes stay the same.
// This is still not a very good solution, in particular we
// might loose the owner of the backup.
+ params.preamble + '\n';
}
- preamble += "\\makeatother\n";
-
// Itemize bullet settings need to be last in case the user
// defines their own bullets that use a package included
// in the user-defined preamble -- ARRae
texrow.newline();
}
- ofs << preamble;
-
// We try to load babel late, in case it interferes
// with other packages.
if (use_babel) {
tmp = string("\\usepackage[") +
language_options.str().c_str() +
"]{babel}";
- ofs << tmp << "\n";
- texrow.newline();
+ preamble += tmp + "\n";
+ preamble += features.getBabelOptions();
}
+ preamble += "\\makeatother\n";
+
+ ofs << preamble;
+
// make the body.
ofs << "\\begin{document}\n";
texrow.newline();
// LaTeX all paragraphs from par to endpar, if endpar == 0 then to the end
//
void Buffer::latexParagraphs(ostream & ofs, Paragraph * par,
- Paragraph * endpar, TexRow & texrow) const
+ Paragraph * endpar, TexRow & texrow,
+ bool moving_arg) const
{
bool was_title = false;
bool already_title = false;
was_title = false;
}
- if (layout.isEnvironment()) {
+ if (layout.isEnvironment() ||
+ !par->params().leftIndent().zero())
+ {
par = par->TeXEnvironment(this, params, ofs, texrow);
} else {
- par = par->TeXOnePar(this, params, ofs, texrow, false);
+ par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
}
} else {
- par = par->TeXOnePar(this, params, ofs, texrow, false);
+ par = par->TeXOnePar(this, params, ofs, texrow, moving_arg);
}
}
// It might be that we only have a title in this document
if (command_flag) {
if (cmd_depth < command_base) {
- for (Paragraph::depth_type j = command_depth; j >= command_base; --j)
+ for (Paragraph::depth_type j = command_depth;
+ j >= command_base; --j) {
sgmlCloseTag(ofs, j, command_stack[j]);
+ ofs << endl;
+ }
command_depth = command_base = cmd_depth;
} else if (cmd_depth <= command_depth) {
- for (int j = command_depth; j >= int(cmd_depth); --j)
+ for (int j = command_depth;
+ j >= int(cmd_depth); --j) {
sgmlCloseTag(ofs, j, command_stack[j]);
+ ofs << endl;
+ }
command_depth = cmd_depth;
} else
command_depth = cmd_depth;
}
for (int j = command_depth; j >= 0 ; --j)
- if (!command_stack[j].empty())
+ if (!command_stack[j].empty()) {
sgmlCloseTag(ofs, j, command_stack[j]);
+ ofs << endl;
+ }
ofs << "\n\n";
sgmlCloseTag(ofs, 0, top_element);
// handle <emphasis> tag
if (font_old.emph() != font.emph()) {
if (font.emph() == LyXFont::ON) {
+ if(style.latexparam() == "CDATA")
+ os << "]]>";
os << "<emphasis>";
+ if(style.latexparam() == "CDATA")
+ os << "<![CDATA[";
emph_flag = true;
} else if (i) {
+ if(style.latexparam() == "CDATA")
+ os << "]]>";
os << "</emphasis>";
+ if(style.latexparam() == "CDATA")
+ os << "<![CDATA[";
emph_flag = false;
}
}
}
if (emph_flag) {
+ if(style.latexparam() == "CDATA")
+ os << "]]>";
os << "</emphasis>";
+ if(style.latexparam() == "CDATA")
+ os << "<![CDATA[";
}
// resets description flag correctly
}
-// This should be enabled when the Chktex class is implemented. (Asger)
// chktex should be run with these flags disabled: 3, 22, 25, 30, 38(?)
// Other flags: -wall -v0 -x
int Buffer::runChktex()