#include "encoding.h"
#include "exporter.h"
#include "Lsstream.h"
+#include "converter.h"
using std::ostream;
using std::ofstream;
using std::setw;
using std::endl;
using std::pair;
+using std::make_pair;
using std::vector;
using std::max;
using std::set;
extern LyXAction lyxaction;
-static const float LYX_FORMAT = 2.17;
+static const int LYX_FORMAT = 218;
extern int tex_code_break_column;
LyXParagraph * par = paragraph;
LyXParagraph * tmppar;
+#ifndef NEW_INSETS
+ while (par) {
+ tmppar = par->next_;
+ delete par;
+ par = tmppar;
+ }
+#else
while (par) {
- tmppar = par->next;
+ tmppar = par->next();
delete par;
par = tmppar;
}
+#endif
paragraph = 0;
}
".tex");
}
+pair<Buffer::LogType, string> const Buffer::getLogName(void) const
+{
+ string filename, fname, bname, path;
+
+ filename = getLatexName(false);
+
+ if (filename.empty())
+ return make_pair(Buffer::latexlog, string());
+
+ path = OnlyPath(filename);
+
+ if (lyxrc.use_tempdir || (IsDirWriteable(path) < 1))
+ path = tmppath;
+
+ fname = AddName(path, OnlyFilename(ChangeExtension(filename, ".log")));
+ bname = AddName(path, OnlyFilename(ChangeExtension(filename,
+ formats.Extension("literate") + ".out")));
+
+ // If no Latex log or Build log is newer, show Build log
+
+ FileInfo f_fi(fname), b_fi(bname);
+
+ if (b_fi.exist() &&
+ (!f_fi.exist() || f_fi.getModificationTime() < b_fi.getModificationTime())) {
+ lyxerr[Debug::FILES] << "Log name calculated as : " << bname << endl;
+ return make_pair(Buffer::buildlog, bname);
+ }
+ lyxerr[Debug::FILES] << "Log name calculated as : " << fname << endl;
+ return make_pair(Buffer::latexlog, fname);
+}
void Buffer::setReadonly(bool flag)
{
LyXParagraph * return_par = 0;
LyXFont font(LyXFont::ALL_INHERIT, params.language);
- if (format < 2.16 && params.language->lang() == "hebrew")
+ if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
-
// If we are inserting, we cheat and get a token in advance
bool has_token = false;
string pretoken;
par->InsertInset(pos, inset, font);
++pos;
} else if (token == "\\layout") {
+#ifndef NEW_INSETS
if (!return_par)
return_par = par;
else {
par->layout =
textclasslist.NumberOfLayout(params.textclass,
layout.obsoleted_by()).second;
-#ifndef NEW_INSETS
par->footnoteflag = footnoteflag;
par->footnotekind = footnotekind;
-#endif
- par->depth = depth;
+ par->params.depth(depth);
font = LyXFont(LyXFont::ALL_INHERIT, params.language);
- if (format < 2.16 && params.language->lang() == "hebrew")
+ if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
+#else
+ lex.EatLine();
+ string const layoutname = lex.GetString();
+ pair<bool, LyXTextClass::LayoutList::size_type> pp
+ = textclasslist.NumberOfLayout(params.textclass,
+ layoutname);
+
+#ifdef USE_CAPTION
+ // The is the compability reading of layout caption.
+ // It can be removed in LyX version 1.3.0. (Lgb)
+ if (compare_no_case(layoutname, "caption") == 0) {
+ // We expect that the par we are now working on is
+ // really inside a InsetText inside a InsetFloat.
+ // We also know that captions can only be
+ // one paragraph. (Lgb)
+
+ // We should now read until the next "\layout"
+ // is reached.
+ // This is probably not good enough, what if the
+ // caption is the last par in the document (Lgb)
+ istream & ist = lex.getStream();
+ stringstream ss;
+ string line;
+ int begin = 0;
+ while (true) {
+ getline(ist, line);
+ if (prefixIs(line, "\\layout")) {
+ lex.pushToken(line);
+ break;
+ }
+ if (prefixIs(line, "\\begin_inset"))
+ ++begin;
+ if (prefixIs(line, "\\end_inset")) {
+ if (begin)
+ --begin;
+ else {
+ lex.pushToken(line);
+ break;
+ }
+ }
+
+ ss << line << '\n';
+ }
+ // Now we should have the whole layout in ss
+ // we should now be able to give this to the
+ // caption inset.
+ ss << "\\end_inset\n";
+
+ // This seems like a bug in stringstream.
+ // We really should be able to use ss
+ // directly. (Lgb)
+ istringstream is(ss.str());
+ LyXLex tmplex(0, 0);
+ tmplex.setStream(is);
+ Inset * inset = new InsetCaption;
+ inset->Read(this, tmplex);
+ par->InsertInset(pos, inset, font);
+ ++pos;
+ } else {
+#endif
+ // BEGIN pextra_minipage compability
+ // This should be removed in 1.3.x (Lgb)
+
+ // This compability code is not perfect. In a couple
+ // of rand cases it fails. When the minipage par is
+ // the first par in the document, and when there are
+ // none or only one regular paragraphs after the
+ // minipage. Currently I am not investing any effort
+ // in fixing those cases.
+ static LyXParagraph * minipar = 0;
+
+ if (minipar
+ && par->params.pextraType() == LyXParagraph::PEXTRA_MINIPAGE) {
+ lyxerr << "minipages in a row" << endl;
+ if (par->params.pextraStartMinipage()) {
+ lyxerr << "start new minipage" << endl;
+ // minipages in a row
+ minipar->previous()->next(par);
+ par->previous()->next(0);
+ par->previous(minipar->previous());
+ InsetMinipage * mini = new InsetMinipage;
+ // Before we insert the list of
+ // minipages into the inset we have
+ // to clean up a bit.
+ // This is not quite correct yet since
+ // we do want to use some of these
+ // parameters to set options in the
+ // minipage isnet.
+ LyXParagraph * tmp = minipar;
+ while (tmp) {
+ tmp->params.pextraType(0);
+ tmp->params.pextraWidth(string());
+ tmp->params.pextraWidthp(string());
+ tmp->params.pextraAlignment(0);
+ tmp->params.pextraHfill(false);
+ tmp->params.pextraStartMinipage(false);
+ tmp = tmp->next();
+ }
+
+ mini->inset->par = minipar;
+ par->previous()->InsertInset(par->previous()->size(), mini);
+ minipar = par;
+ } else {
+ lyxerr << "new minipage par" << endl;
+ //nothing to do just continue reading
+ }
+
+ } else if (minipar) {
+ lyxerr << "last minipage par read" << endl;
+ // The last paragraph read was not part of a
+ // minipage but the par linked list is...
+ // So we need to remove the last par from the
+ // rest, insert the rest of the paragraphs into
+ // a InsetMinipage, insert this minipage into
+ // prevpar, append the current par to prevpar
+ // and continue...
+ par->previous()->next(0);
+ par->previous(minipar->previous());
+ minipar->previous()->next(par);
+ minipar->previous(0);
+ InsetMinipage * mini = new InsetMinipage;
+
+ // Before we insert the list of
+ // minipages into the inset we have
+ // to clean up a bit.
+ // This is not quite correct yet since we
+ // do want to use some of these parameters
+ // to set options in the minipage isnet.
+ LyXParagraph * tmp = minipar;
+ while (tmp) {
+ tmp->params.pextraType(0);
+ tmp->params.pextraWidth(string());
+ tmp->params.pextraWidthp(string());
+ tmp->params.pextraAlignment(0);
+ tmp->params.pextraHfill(false);
+ tmp->params.pextraStartMinipage(false);
+ tmp = tmp->next();
+ }
+
+ mini->inset->par = minipar;
+ par->previous()->InsertInset(par->previous()->size(), mini);
+ minipar = 0;
+ } else if (par->params.pextraType() == LyXParagraph::PEXTRA_MINIPAGE) {
+
+ // par is the first paragraph in a minipage
+ lyxerr << "begin minipage" << endl;
+ minipar = par;
+
+ }
+ // End of pextra_minipage compability
+
+ if (!return_par)
+ return_par = par;
+ else {
+ par->fitToSize();
+ par = new LyXParagraph(par);
+ }
+ pos = 0;
+ if (pp.first) {
+ par->layout = pp.second;
+ } else {
+ // layout not found
+ // use default layout "Standard" (0)
+ par->layout = 0;
+ }
+ // Test whether the layout is obsolete.
+ LyXLayout const & layout =
+ textclasslist.Style(params.textclass,
+ par->layout);
+ if (!layout.obsoleted_by().empty())
+ par->layout = textclasslist
+ .NumberOfLayout(params.textclass,
+ layout.obsoleted_by())
+ .second;
+ par->params.depth(depth);
+ font = LyXFont(LyXFont::ALL_INHERIT, params.language);
+ if (file_format < 216
+ && params.language->lang() == "hebrew")
+ font.setLanguage(default_language);
+#ifdef USE_CAPTION
+ }
+#endif
+#endif
#ifndef NEW_INSETS
} else if (token == "\\end_float") {
if (!return_par)
lex.EatLine();
par->layout = LYX_DUMMY_LAYOUT;
font = LyXFont(LyXFont::ALL_INHERIT, params.language);
- if (format < 2.16 && params.language->lang() == "hebrew")
+ if (file_format < 216 && params.language->lang() == "hebrew")
font.setLanguage(default_language);
} else if (token == "\\begin_float") {
int tmpret = lex.FindToken(string_footnotekinds);
footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
#else
} else if (token == "\\begin_float") {
- // This is the compability reader, unfinished but tested.
- // (Lgb)
+ // This is the compability reader. It can be removed in
+ // LyX version 1.3.0. (Lgb)
lex.next();
string const tmptok = lex.GetString();
//lyxerr << "old float: " << tmptok << endl;
Inset * inset = 0;
- string old_float;
+ stringstream old_float;
if (tmptok == "footnote") {
inset = new InsetFoot;
inset = new InsetMarginal;
} else if (tmptok == "fig") {
inset = new InsetFloat("figure");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "tab") {
inset = new InsetFloat("table");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "alg") {
inset = new InsetFloat("algorithm");
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "wide-fig") {
InsetFloat * tmp = new InsetFloat("figure");
tmp->wide(true);
inset = tmp;
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
} else if (tmptok == "wide-tab") {
InsetFloat * tmp = new InsetFloat("table");
tmp->wide(true);
inset = tmp;
- old_float += "placement htbp\n";
+ old_float << "placement htbp\n";
}
if (!inset) return false; // no end read yet
- old_float += "collapsed true\n";
+ old_float << "collapsed true\n";
// Here we need to check for \end_deeper and handle that
// before we do the footnote parsing.
// This _is_ a hack! (Lgb)
- while(true) {
+ while (true) {
lex.next();
string const tmp = lex.GetString();
if (tmp == "\\end_deeper") {
- lyxerr << "\\end_deeper caught!" << endl;
+ //lyxerr << "\\end_deeper caught!" << endl;
if (!depth) {
lex.printError("\\end_deeper: "
"depth is already null");
--depth;
} else {
- old_float += tmp;
- old_float += ' ';
+ old_float << tmp << ' ';
break;
}
}
- old_float += lex.getLongString("\\end_float");
- old_float += "\n\\end_inset\n";
- //lyxerr << "float body: " << old_float << endl;
-
- istringstream istr(old_float);
-
+ old_float << lex.getLongString("\\end_float")
+ << "\n\\end_inset\n";
+ //lyxerr << "Float Body:\n" << old_float.str() << endl;
+ // That this does not work seems like a bug
+ // in stringstream. (Lgb)
+ istringstream istr(old_float.str());
LyXLex nylex(0, 0);
nylex.setStream(istr);
-
inset->Read(this, nylex);
par->InsertInset(pos, inset, font);
++pos;
if (pp.first) {
params.textclass = pp.second;
} else {
- lex.printError("Unknown textclass `$$Token'");
+ WriteAlert(string(_("Textclass error")),
+ string(_("The document uses an unknown textclass \"")) +
+ lex.GetString() + string("\"."),
+ string(_("LyX will not be able to produce output correctly.")));
params.textclass = 0;
}
if (!textclasslist.Load(params.textclass)) {
lex.EatLine();
params.fonts = lex.GetString();
} else if (token == "\\noindent") {
- par->noindent = true;
+ par->params.noindent(true);
} else if (token == "\\fill_top") {
- par->added_space_top = VSpace(VSpace::VFILL);
+ par->params.spaceTop(VSpace(VSpace::VFILL));
} else if (token == "\\fill_bottom") {
- par->added_space_bottom = VSpace(VSpace::VFILL);
+ par->params.spaceBottom(VSpace(VSpace::VFILL));
} else if (token == "\\line_top") {
- par->line_top = true;
+ par->params.lineTop(true);
} else if (token == "\\line_bottom") {
- par->line_bottom = true;
+ par->params.lineBottom(true);
} else if (token == "\\pagebreak_top") {
- par->pagebreak_top = true;
+ par->params.pagebreakTop(true);
} else if (token == "\\pagebreak_bottom") {
- par->pagebreak_bottom = true;
+ par->params.pagebreakBottom(true);
} else if (token == "\\start_of_appendix") {
- par->start_of_appendix = true;
+ par->params.startOfAppendix(true);
} else if (token == "\\paragraph_separation") {
int tmpret = lex.FindToken(string_paragraph_separation);
if (tmpret == -1) ++tmpret;
// Small hack so that files written with klyx will be
// parsed correctly.
if (return_par) {
- par->spacing.set(tmp_space, tmp_val);
+ par->params.spacing(Spacing(tmp_space, tmp_val));
} else {
params.spacing.set(tmp_space, tmp_val);
}
lex.next();
string const tmp = strip(lex.GetString());
if (tmp == "single") {
- par->spacing.set(Spacing::Single);
+ par->params.spacing(Spacing(Spacing::Single));
} else if (tmp == "onehalf") {
- par->spacing.set(Spacing::Onehalf);
+ par->params.spacing(Spacing(Spacing::Onehalf));
} else if (tmp == "double") {
- par->spacing.set(Spacing::Double);
+ par->params.spacing(Spacing(Spacing::Double));
} else if (tmp == "other") {
lex.next();
- par->spacing.set(Spacing::Other,
- lex.GetFloat());
+ par->params.spacing(Spacing(Spacing::Other,
+ lex.GetFloat()));
} else {
lex.printError("Unknown spacing token: '$$Token'");
}
int tmpret = lex.FindToken(string_align);
if (tmpret == -1) ++tmpret;
if (tmpret != LYX_LAYOUT_DEFAULT) { // tmpret != 99 ???
-#if 0
- int tmpret2 = 1;
- for (; tmpret > 0; --tmpret)
- tmpret2 = tmpret2 * 2;
-#else
int const tmpret2 = int(pow(2.0, tmpret));
-#endif
- lyxerr << "Tmpret2 = " << tmpret2 << endl;
- par->align = LyXAlignment(tmpret2);
+ //lyxerr << "Tmpret2 = " << tmpret2 << endl;
+ par->params.align(LyXAlignment(tmpret2));
}
} else if (token == "\\added_space_top") {
lex.nextToken();
- par->added_space_top = VSpace(lex.GetString());
+ par->params.spaceTop(VSpace(lex.GetString()));
} else if (token == "\\added_space_bottom") {
lex.nextToken();
- par->added_space_bottom = VSpace(lex.GetString());
+ par->params.spaceBottom(VSpace(lex.GetString()));
} else if (token == "\\pextra_type") {
lex.nextToken();
- par->pextra_type = lex.GetInteger();
+ par->params.pextraType(lex.GetInteger());
} else if (token == "\\pextra_width") {
lex.nextToken();
- par->pextra_width = lex.GetString();
+ par->params.pextraWidth(lex.GetString());
} else if (token == "\\pextra_widthp") {
lex.nextToken();
- par->pextra_widthp = lex.GetString();
+ par->params.pextraWidthp(lex.GetString());
} else if (token == "\\pextra_alignment") {
lex.nextToken();
- par->pextra_alignment = lex.GetInteger();
+ par->params.pextraAlignment(lex.GetInteger());
} else if (token == "\\pextra_hfill") {
lex.nextToken();
- par->pextra_hfill = lex.GetInteger();
+ par->params.pextraHfill(lex.GetInteger());
} else if (token == "\\pextra_start_minipage") {
lex.nextToken();
- par->pextra_start_minipage = lex.GetInteger();
+ par->params.pextraStartMinipage(lex.GetInteger());
} else if (token == "\\labelwidthstring") {
lex.EatLine();
- par->labelwidthstring = lex.GetString();
+ par->params.labelWidthString(lex.GetString());
// do not delete this token, it is still needed!
} else if (token == "\\end_inset") {
lyxerr << "Solitary \\end_inset. Missing \\begin_inset?.\n"
++pos;
} else if (token == "\\bibitem") { // ale970302
if (!par->bibkey) {
- InsetCommandParams p( "bibitem" );
+ InsetCommandParams p("bibitem", "dummy");
par->bibkey = new InsetBibKey(p);
}
par->bibkey->Read(this, lex);
string const token(lex.GetString());
if (token == "\\lyxformat") { // the first token _must_ be...
lex.EatLine();
- format = lex.GetFloat();
- if (format > 1.0) {
- if (LYX_FORMAT - format > 0.05) {
- lyxerr << fmt(_("Warning: need lyxformat %.2f but found %.2f"),
- LYX_FORMAT, format) << endl;
- }
- if (format - LYX_FORMAT > 0.05) {
- lyxerr << fmt(_("ERROR: need lyxformat %.2f but found %.2f"),
- LYX_FORMAT, format) << endl;
+ string tmp_format = lex.GetString();
+ //lyxerr << "LyX Format: `" << tmp_format << "'" << endl;
+ // if present remove ".," from string.
+ string::size_type dot = tmp_format.find_first_of(".,");
+ //lyxerr << " dot found at " << dot << endl;
+ if (dot != string::npos)
+ tmp_format.erase(dot, 1);
+ file_format = strToInt(tmp_format);
+ if (file_format == LYX_FORMAT) {
+ // current format
+ } else if (file_format > LYX_FORMAT) {
+ // future format
+ WriteAlert(_("Warning!"),
+ _("LyX file format is newer that what"),
+ _("is supported in this LyX version. Expect some problems."));
+
+ } else if (file_format < LYX_FORMAT) {
+ // old formats
+ if (file_format < 200) {
+ WriteAlert(_("ERROR!"),
+ _("Old LyX file format found. "
+ "Use LyX 0.10.x to read this!"));
+ return false;
}
- bool the_end = readLyXformat2(lex, par);
- // Formats >= 2.13 support "\the_end" marker
- if (format < 2.13)
- the_end = true;
-
- setPaperStuff();
-
- if (!the_end)
- WriteAlert(_("Warning!"),
- _("Reading of document is not complete"),
- _("Maybe the document is truncated"));
- // We simulate a safe reading anyways to allow
- // users to take the chance... (Asger)
- return true;
- } // format < 1.0
- else {
- WriteAlert(_("ERROR!"),
- _("Old LyX file format found. "
- "Use LyX 0.10.x to read this!"));
- return false;
}
-
+ bool the_end = readLyXformat2(lex, par);
+ setPaperStuff();
+ // the_end was added in 213
+ if (file_format < 213)
+ the_end = true;
+
+ if (!the_end)
+ WriteAlert(_("Warning!"),
+ _("Reading of document is not complete"),
+ _("Maybe the document is truncated"));
+ return true;
} else { // "\\lyxformat" not found
WriteAlert(_("ERROR!"), _("Not a LyX file!"));
}
// write out a comment in the top of the file
ofs << '#' << LYX_DOCVERSION
- << " created this file. For more info see http://www.lyx.org/\n";
- ofs.setf(ios::showpoint|ios::fixed);
- ofs.precision(2);
-#ifndef HAVE_LOCALE
- char dummy_format[512];
- sprintf(dummy_format, "%.2f", LYX_FORMAT);
- ofs << "\\lyxformat " << dummy_format << "\n";
-#else
- ofs << "\\lyxformat " << setw(4) << LYX_FORMAT << "\n";
-#endif
+ << " created this file. For more info see http://www.lyx.org/\n"
+ << "\\lyxformat " << LYX_FORMAT << "\n";
+
// now write out the buffer paramters.
params.writeFile(ofs);
LyXFont font2;
Inset const * inset;
char c;
+#ifndef NEW_INSETS
LyXParagraph::footnote_flag footnoteflag = LyXParagraph::NO_FOOTNOTE;
+#endif
char depth = 0;
int ltype = 0;
int ltype_depth = 0;
int noparbreak = 0;
int islatex = 0;
- if (
-#ifndef NEW_INSETS
- par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
-#endif
- !par->previous
-#ifndef NEW_INSETS
- || par->previous->footnoteflag == LyXParagraph::NO_FOOTNOTE
-#endif
- ){
#ifndef NEW_INSETS
+ if (par->footnoteflag != LyXParagraph::NO_FOOTNOTE ||
+ !par->previous_
+ || par->previous()->footnoteflag == LyXParagraph::NO_FOOTNOTE) {
/* begins a footnote environment ? */
if (footnoteflag != par->footnoteflag) {
footnoteflag = par->footnoteflag;
currlinelen += j;
}
}
+#else
+ if (!par->previous()) {
#endif
/* begins or ends a deeper area ?*/
- if (depth != par->depth) {
- if (par->depth > depth) {
- while (par->depth > depth) {
+ if (depth != par->params.depth()) {
+ if (par->params.depth() > depth) {
+ while (par->params.depth() > depth) {
++depth;
}
- }
- else {
- while (par->depth < depth) {
+ } else {
+ while (par->params.depth() < depth) {
--depth;
}
}
string const tmp = textclasslist.NameOfLayout(params.textclass, par->layout);
if (tmp == "Itemize") {
ltype = 1;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Enumerate") {
ltype = 2;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (strstr(tmp.c_str(), "ection")) {
ltype = 3;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (strstr(tmp.c_str(), "aragraph")) {
ltype = 4;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Description") {
ltype = 5;
- ltype_depth = depth+1;
+ ltype_depth = depth + 1;
} else if (tmp == "Abstract") {
ltype = 6;
ltype_depth = 0;
font1 = LyXFont(LyXFont::ALL_INHERIT, params.language);
for (LyXParagraph::size_type i = 0; i < par->size(); ++i) {
- if (!i && !footnoteflag && !noparbreak){
+ if (!i &&
+#ifndef NEW_INSETS
+ !footnoteflag &&
+#endif
+ !noparbreak) {
if (linelen > 0)
buffer << "\n\n";
for (char j = 0; j < depth; ++j)
}
break;
default:
- buffer << par->labelstring << " ";
+ buffer << par->params.labelString() << " ";
break;
}
if (ltype_depth > depth) {
} else {
islatex = 0;
}
- c = par->GetChar(i);
+ c = par->GetUChar(params, i);
if (islatex)
continue;
switch (c) {
LyXParagraph * par = paragraph;
while (par) {
ofs << asciiParagraph(par, linelen);
- par = par->next;
+ par = par->next();
}
ofs << "\n";
}
+bool use_babel;
void Buffer::makeLaTeXFile(string const & fname,
string const & original_path,
options += "landscape,";
// language should be a parameter to \documentclass
- bool use_babel = false;
- if (params.language->babel() == "hebrew") // This seems necessary
+ use_babel = false;
+ string language_options;
+ if (params.language->babel() == "hebrew"
+ && default_language->babel() != "hebrew")
+ // This seems necessary
features.UsedLanguages.insert(default_language);
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (params.language->lang() != "default" ||
+
+ if (lyxrc.language_use_babel ||
+ params.language->lang() != lyxrc.default_language ||
!features.UsedLanguages.empty()) {
-#endif
use_babel = true;
for (LaTeXFeatures::LanguageList::const_iterator cit =
features.UsedLanguages.begin();
cit != features.UsedLanguages.end(); ++cit)
- options += (*cit)->babel() + ",";
- options += params.language->babel() + ',';
-#ifdef DO_USE_DEFAULT_LANGUAGE
+ language_options += (*cit)->babel() + ',';
+ language_options += params.language->babel();
+ if (lyxrc.language_global_options)
+ options += language_options + ',';
}
-#endif
// the user-defined options
if (!params.options.empty()) {
// end of \documentclass defs
// font selection must be done before loading fontenc.sty
- if (params.fonts != "default") {
+ // The ae package is not needed when using OT1 font encoding.
+ if (params.fonts != "default" &&
+ (params.fonts != "ae" || lyxrc.fontenc != "default")) {
ofs << "\\usepackage{" << params.fonts << "}\n";
texrow.newline();
+ if (params.fonts == "ae") {
+ ofs << "\\usepackage{aecompl}\n";
+ texrow.newline();
+ }
}
// this one is not per buffer
if (lyxrc.fontenc != "default") {
ofs << "}\n";
texrow.newline();
}
- if (params.use_amsmath
+ if (features.amsstyle
&& !tclass.provides(LyXTextClass::amsmath)) {
ofs << "\\usepackage{amsmath}\n";
texrow.newline();
// We try to load babel late, in case it interferes
// with other packages.
if (use_babel) {
- ofs << lyxrc.language_package << endl;
+ string tmp = lyxrc.language_package;
+ if (!lyxrc.language_global_options
+ && tmp == "\\usepackage{babel}")
+ tmp = "\\usepackage[" +
+ language_options + "]{babel}";
+ ofs << tmp << "\n";
texrow.newline();
}
texrow.newline();
} // only_body
lyxerr.debug() << "preamble finished, now the body." << endl;
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (!lyxrc.language_auto_begin && params.language->lang() != "default") {
-#else
+
if (!lyxrc.language_auto_begin) {
-#endif
ofs << subst(lyxrc.language_command_begin, "$$lang",
params.language->babel())
<< endl;
ofs << endl;
texrow.newline();
-#ifdef DO_USE_DEFAULT_LANGUAGE
- if (!lyxrc.language_auto_end && params.language->lang() != "default") {
-#else
- if (!lyxrc.language_auto_end) {
-#endif
+ if (!lyxrc.language_auto_end) {
ofs << subst(lyxrc.language_command_end, "$$lang",
params.language->babel())
<< endl;
// flag this with ftcount
ftcount = -1;
if (layout.isEnvironment()
- || par->pextra_type != LyXParagraph::PEXTRA_NONE) {
+ || par->params.pextraType() != LyXParagraph::PEXTRA_NONE) {
par = par->TeXEnvironment(this, params, ofs, texrow
#ifndef NEW_INSETS
,ftnote, ft_texrow, ftcount
string const temp = "toc";
sgmlOpenTag(ofs, depth, temp);
- par = par->next;
#ifndef NEW_INSETS
+ par = par->next_;
linuxDocHandleFootnote(ofs, par, depth);
+#else
+ par = par->next();
#endif
continue;
}
}
// environment tag closing
- for (; depth > par->depth; --depth) {
+ for (; depth > par->params.depth(); --depth) {
sgmlCloseTag(ofs, depth, environment_stack[depth]);
environment_stack[depth].erase();
}
// write opening SGML tags
switch (style.latextype) {
case LATEX_PARAGRAPH:
- if (depth == par->depth
+ if (depth == par->params.depth()
&& !environment_stack[depth].empty()) {
sgmlCloseTag(ofs, depth, environment_stack[depth]);
environment_stack[depth].erase();
case LATEX_ENVIRONMENT:
case LATEX_ITEM_ENVIRONMENT:
- if (depth == par->depth
+ if (depth == par->params.depth()
&& environment_stack[depth] != style.latexname()
&& !environment_stack[depth].empty()) {
environment_stack[depth]);
environment_stack[depth].erase();
}
- if (depth < par->depth) {
- depth = par->depth;
+ if (depth < par->params.depth()) {
+ depth = par->params.depth();
environment_stack[depth].erase();
}
if (environment_stack[depth] != style.latexname()) {
#ifndef NEW_INSETS
do {
-#endif
SimpleLinuxDocOnePar(ofs, par, desc_on, depth);
-
- par = par->next;
-#ifndef NEW_INSETS
+
+ par = par->next_;
linuxDocHandleFootnote(ofs, par, depth);
}
while(par && par->IsDummy());
+#else
+ SimpleLinuxDocOnePar(ofs, par, desc_on, depth);
+
+ par = par->next();
#endif
ofs << "\n";
sgmlOpenTag(os, depth + 1, tag);
SimpleLinuxDocOnePar(os, par, 0, depth + 1);
sgmlCloseTag(os, depth + 1, tag);
- par = par->next;
+ par = par->next_;
}
}
#endif
LyXParagraph * & par)
{
LyXParagraph * tpar = par;
- while (tpar
#ifndef NEW_INSETS
+ while (tpar
&& (tpar->footnoteflag != LyXParagraph::NO_FOOTNOTE)
-#endif
&& (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
"Caption").second))
- tpar = tpar->next;
+ tpar = tpar->next_;
+#else
+ while (tpar
+ && (tpar->layout != textclasslist.NumberOfLayout(params.textclass,
+ "Caption").second))
+ tpar = tpar->next();
+#endif
if (tpar &&
tpar->layout == textclasslist.NumberOfLayout(params.textclass,
"Caption").second) {
tmp_par = frontStrip(strip(tmp_par));
last = present;
- par = par->next;
+ par = par->next_;
}
os << tmp_par;
if (!inner_tag.empty()) sgmlCloseTag(os, depth + 1, inner_tag);
int j;
// pop all tags till specified one
- for (j = pos; (j >= 0) && (strcmp(stack[j], tag.c_str())); --j)
+ for (j = pos; (j >= 0) && tag != stack[j]; --j)
os << "</" << stack[j] << ">";
// closes the tag
#else
// pop all tags till specified one
int j = pos;
- for (int j = pos; (j >= 0) && (strcmp(stack[j], tag.c_str())); --j)
+ for (int j = pos; (j >= 0) && tag != stack[j]; --j)
os << "</" << stack[j] << ">";
// closes the tag
<< sgml_includedfiles << " \n]>\n\n";
}
- if (params.options.empty())
- sgmlOpenTag(ofs, 0, top_element);
- else {
- string top = top_element;
+ string top = top_element;
+ top += " lang=\"";
+ top += params.language->code();
+ top += "\"";
+
+ if (!params.options.empty()) {
top += " ";
top += params.options;
- sgmlOpenTag(ofs, 0, top);
}
+ sgmlOpenTag(ofs, 0, top);
ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION
<< "\n See http://www.lyx.org/ for more information -->\n";
par->layout);
// environment tag closing
- for (; depth > par->depth; --depth) {
+ for (; depth > par->params.depth(); --depth) {
if (environment_inner[depth] != "!-- --") {
item_name= "listitem";
sgmlCloseTag(ofs, command_depth + depth,
environment_inner[depth].erase();
}
- if (depth == par->depth
+ if (depth == par->params.depth()
&& environment_stack[depth] != style.latexname()
&& !environment_stack[depth].empty()) {
if (environment_inner[depth] != "!-- --") {
}
sgmlOpenTag(ofs, depth + command_depth, command_name);
- item_name = "title";
- if (command_name != "!-- --")
- sgmlOpenTag(ofs, depth + 1 + command_depth, item_name);
+ if (c_params.empty())
+ item_name = "title";
+ else
+ item_name = c_params;
+ sgmlOpenTag(ofs, depth + 1 + command_depth, item_name);
break;
case LATEX_ENVIRONMENT:
case LATEX_ITEM_ENVIRONMENT:
- if (depth < par->depth) {
- depth = par->depth;
+ if (depth < par->params.depth()) {
+ depth = par->params.depth();
environment_stack[depth].erase();
}
}
if (style.latextype == LATEX_ENVIRONMENT) {
- if (!style.latexparam().empty())
- sgmlOpenTag(ofs, depth + command_depth,
- style.latexparam());
+ if (!style.latexparam().empty()) {
+ if(style.latexparam() == "CDATA")
+ ofs << "<![ CDATA [";
+ else
+ sgmlOpenTag(ofs, depth + command_depth,
+ style.latexparam());
+ }
break;
}
#ifndef NEW_INSETS
do {
-#endif
string extra_par;
SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
depth + 1 + command_depth);
- par = par->next;
-#ifndef NEW_INSETS
+ par = par->next_;
DocBookHandleFootnote(ofs, par,
depth + 1 + command_depth);
- }
- while(par && par->IsDummy());
+ } while(par && par->IsDummy());
+#else
+ string extra_par;
+ SimpleDocBookOnePar(ofs, extra_par, par, desc_on,
+ depth + 1 + command_depth);
+ par = par->next();
#endif
string end_tag;
// write closing SGML tags
switch (style.latextype) {
case LATEX_COMMAND:
- end_tag = "title";
- if (command_name != "!-- --")
- sgmlCloseTag(ofs, depth + command_depth, end_tag);
+ if (c_params.empty())
+ end_tag = "title";
+ else
+ end_tag = c_params;
+ sgmlCloseTag(ofs, depth + command_depth, end_tag);
break;
case LATEX_ENVIRONMENT:
- if (!style.latexparam().empty())
- sgmlCloseTag(ofs, depth + command_depth,
- style.latexparam());
+ if (!style.latexparam().empty()) {
+ if(style.latexparam() == "CDATA")
+ ofs << "]]>";
+ else
+ sgmlCloseTag(ofs, depth + command_depth,
+ style.latexparam());
+ }
break;
case LATEX_ITEM_ENVIRONMENT:
if (desc_on == 1) break;
par->validate(features);
// and then the next paragraph
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
}
// the bullet shapes are buffer level not paragraph level
}
-vector<vector<Buffer::TocItem> > const Buffer::getTocList()
+vector<vector<Buffer::TocItem> > const Buffer::getTocList() const
{
+#ifndef NEW_INSETS
int figs = 0;
int tables = 0;
int algs = 0;
+#endif
vector<vector<TocItem> > l(4);
LyXParagraph * par = paragraph;
while (par) {
}
#ifndef NEW_INSETS
}
+ par = par->next_;
+#else
+ par = par->next();
#endif
- par = par->next;
}
return l;
}
if (par->bibkey)
keys.push_back(pair<string, string>(par->bibkey->getContents(),
par->String(this, false)));
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
}
// Might be either using bibtex or a child has bibliography
{
/// then remove all LyXText in text-insets
LyXParagraph * par = paragraph;
- for (; par; par = par->next) {
+#ifndef NEW_INSETS
+ for (; par; par = par->next_) {
par->resizeInsetsLyXText(bv);
}
+#else
+ for (; par; par = par->next()) {
+ par->resizeInsetsLyXText(bv);
+ }
+#endif
}
+
void Buffer::ChangeLanguage(Language const * from, Language const * to)
{
LyXParagraph * par = paragraph;
while (par) {
par->ChangeLanguage(params, from, to);
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
}
}
while (par) {
if (par->isMultiLingual(params))
return true;
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
}
return false;
}
{
it = par->InsetIterator(pos);
if (it == par->inset_iterator_end()) {
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
SetParagraph();
}
}
it = par->inset_iterator_begin();
if (it != par->inset_iterator_end())
return;
- par = par->next;
+#ifndef NEW_INSETS
+ par = par->next_;
+#else
+ par = par->next();
+#endif
}
//it = 0;
// We maintain an invariant that whenever par = 0 then it = 0