]> git.lyx.org Git - lyx.git/blobdiff - src/buffer.C
more changes, read the Changelog
[lyx.git] / src / buffer.C
index eef8cdb79995dfb5ddffbe1e1ea693aa97728fed..55785a6b3c94e9ceadd4116e746167723ab4d025 100644 (file)
 #include "insets/insetert.h"
 #include "insets/insetgraphics.h"
 #include "insets/insetfoot.h"
+#include "insets/insetmarginal.h"
+#include "insets/insetminipage.h"
+#include "insets/insetfloat.h"
+#include "insets/insetlist.h"
 #include "insets/insettabular.h"
+#include "insets/insettheorem.h"
 #include "support/filetools.h"
 #include "support/path.h"
 #include "LaTeX.h"
@@ -115,8 +120,6 @@ Buffer::Buffer(string const & file, bool ronly)
        paragraph = 0;
        lyx_clean = true;
        bak_clean = true;
-       dvi_clean_orgd = false;  // Heinrich Bauer, 23/03/98
-       dvi_clean_tmpd = false;  // Heinrich Bauer, 23/03/98
        dep_clean = 0;
        read_only = ronly;
        users = 0;
@@ -306,16 +309,13 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
        if (token[0] != '\\') {
                for (string::const_iterator cit = token.begin();
                     cit != token.end(); ++cit) {
-                       par->InsertChar(pos, (*cit));
-                       par->SetFont(pos, font);
+                       par->InsertChar(pos, (*cit), font);
                        ++pos;
                }
        } else if (token == "\\i") {
                Inset * inset = new InsetLatexAccent;
                inset->Read(this, lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET); 
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
+               par->InsertInset(pos, inset, font);
                ++pos;
        } else if (token == "\\layout") {
                if (!return_par) 
@@ -350,6 +350,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                font = LyXFont(LyXFont::ALL_INHERIT, params.language_info);
                if (format < 2.16 && params.language == "hebrew")
                        font.setLanguage(default_language);
+#ifndef NEW_INSETS
        } else if (token == "\\end_float") {
                if (!return_par) 
                        return_par = par;
@@ -375,6 +376,47 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        footnoteflag = LyXParagraph::CLOSED_FOOTNOTE;
                else 
                        footnoteflag = LyXParagraph::OPEN_FOOTNOTE;
+#else
+       } else if (token == "\\begin_float") {
+               // This is the compability reader, unfinished but tested.
+               // (Lgb)
+               lex.next();
+               string tmptok = lex.GetString();
+               //lyxerr << "old float: " << tmptok << endl;
+               
+               Inset * inset = 0;
+               
+               if (tmptok == "footnote") {
+                       inset = new InsetFoot;
+               } else if (tmptok == "margin") {
+                       inset = new InsetMarginal;
+               } else if (tmptok == "fig") {
+                       //inset = new InsetFigure;
+               } else if (tmptok == "tab") {
+                       //inset = new InsetTable;
+               } else if (tmptok == "alg") {
+                       //inset = new InsetAlgorithm;
+               } else if (tmptok == "wide-fig") {
+                       //inset = new InsetFigure(true);
+               } else if (tmptok == "wide-tab") {
+                       //inset = new InsetTable(true);
+               }
+
+               if (!inset) return false; // no end read yet
+               
+               string old_float = "\ncollapsed true\n";
+               old_float += lex.getLongString("\\end_float");
+               old_float += "\n\\end_inset\n";
+               lyxerr << "float body: " << old_float << endl;
+               
+               istrstream istr(old_float.c_str());
+               LyXLex nylex(0, 0);
+               nylex.setStream(istr);
+               
+               inset->Read(this, nylex);
+               par->InsertInset(pos, inset, font);
+               ++pos;
+#endif
        } else if (token == "\\begin_deeper") {
                ++depth;
        } else if (token == "\\end_deeper") {
@@ -651,11 +693,6 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
        } else if (token == "\\float_placement") {
                lex.nextToken();
                params.float_placement = lex.GetString();
-#if 0
-       } else if (token == "\\cursor") { // obsolete
-               // this is obsolete, so we just skip it.
-               lex.nextToken();
-#endif
        } else if (token == "\\family") { 
                lex.next();
                font.setLyXFamily(lex.GetString());
@@ -763,95 +800,87 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                if (tmptok == "Quotes") {
                        Inset * inset = new InsetQuotes;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
-                       ++pos;
-#if 0
-               } else if (tmptok == "\\i") {
-                       Inset * inset = new InsetLatexAccent;
-                       inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
-#endif
                } else if (tmptok == "External") {
                        Inset * inset = new InsetExternal;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "FormulaMacro") {
                        Inset * inset = new InsetFormulaMacro;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Formula") {
                        Inset * inset = new InsetFormula;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Figure") {
                        Inset * inset = new InsetFig(100, 100, this);
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Info") {
                        Inset * inset = new InsetInfo;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Include") {
                        Inset * inset = new InsetInclude(string(), this);
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "ERT") {
-                       Inset * inset = new InsetERT();
+                       Inset * inset = new InsetERT;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Tabular") {
                        Inset * inset = new InsetTabular(this);
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Text") {
-                       Inset * inset = new InsetText();
+                       Inset * inset = new InsetText;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "Foot") {
-                       Inset * inset = new InsetFoot();
+                       Inset * inset = new InsetFoot;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               } else if (tmptok == "Marginal") {
+                       Inset * inset = new InsetMarginal;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               } else if (tmptok == "Minipage") {
+                       Inset * inset = new InsetMinipage;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               } else if (tmptok == "Float") {
+                       Inset * inset = new InsetFloat;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               } else if (tmptok == "List") {
+                       Inset * inset = new InsetList;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
+                       ++pos;
+               } else if (tmptok == "Theorem") {
+                       Inset * inset = new InsetList;
+                       inset->Read(this, lex);
+                       par->InsertInset(pos, inset, font);
                        ++pos;
                } else if (tmptok == "GRAPHICS") {
                        Inset * inset = new InsetGraphics;
                                //inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                } else if (tmptok == "LatexCommand") {
                        InsetCommand inscmd;
                        inscmd.Read(this, lex);
@@ -895,9 +924,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        }
                               
                        if (inset) {
-                               par->InsertChar(pos, LyXParagraph::META_INSET);
-                               par->InsertInset(pos, inset);
-                               par->SetFont(pos, font);
+                               par->InsertInset(pos, inset, font);
                                ++pos;
                        }
                }
@@ -913,12 +940,10 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                lex.next();
                                next_token = lex.GetString();
                                if (next_token == "\\-") {
-                                       par->InsertChar(pos, '-');
-                                       par->SetFont(pos, font);
+                                       par->InsertChar(pos, '-', font);
                                } else if (next_token == "\\protected_separator"
                                        || next_token == "~") {
-                                       par->InsertChar(pos, ' ');
-                                       par->SetFont(pos, font);
+                                       par->InsertChar(pos, ' ', font);
                                } else {
                                        lex.printError("Token `$$Token' "
                                                       "is in free space "
@@ -929,29 +954,23 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                } else {
                        Inset * inset = new InsetSpecialChar;
                        inset->Read(this, lex);
-                       par->InsertChar(pos, LyXParagraph::META_INSET); 
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                }
                ++pos;
        } else if (token == "\\newline") {
-               par->InsertChar(pos, LyXParagraph::META_NEWLINE);
-               par->SetFont(pos, font);
+               par->InsertChar(pos, LyXParagraph::META_NEWLINE, font);
                ++pos;
        } else if (token == "\\LyXTable") {
 #ifdef USE_TABULAR_INSETS
                Inset * inset = new InsetTabular(this);
                inset->Read(this, lex);
-               par->InsertChar(pos, LyXParagraph::META_INSET);
-               par->InsertInset(pos, inset);
-               par->SetFont(pos, font);
+               par->InsertInset(pos, inset, font);
                ++pos;
 #else
                par->table = new LyXTable(lex);
 #endif
        } else if (token == "\\hfill") {
-               par->InsertChar(pos, LyXParagraph::META_HFILL);
-               par->SetFont(pos, font);
+               par->InsertChar(pos, LyXParagraph::META_HFILL, font);
                ++pos;
        } else if (token == "\\protected_separator") { // obsolete
                // This is a backward compability thingie. (Lgb)
@@ -962,13 +981,10 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                                            par->GetLayout());
 
                if (layout.free_spacing) {
-                       par->InsertChar(pos, ' ');
-                       par->SetFont(pos, font);
+                       par->InsertChar(pos, ' ', font);
                } else {
                        Inset * inset = new InsetSpecialChar(InsetSpecialChar::PROTECTED_SEPARATOR);
-                       par->InsertChar(pos, LyXParagraph::META_INSET);
-                       par->InsertInset(pos, inset);
-                       par->SetFont(pos, font);
+                       par->InsertInset(pos, inset, font);
                }
                ++pos;
        } else if (token == "\\bibitem") {  // ale970302
@@ -976,8 +992,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                        par->bibkey = new InsetBibKey;
                par->bibkey->Read(this, lex);                   
        }else if (token == "\\backslash") {
-               par->InsertChar(pos, '\\');
-               par->SetFont(pos, font);
+               par->InsertChar(pos, '\\', font);
                ++pos;
        }else if (token == "\\the_end") {
                the_end_read = true;
@@ -987,8 +1002,7 @@ Buffer::parseSingleLyXformat2Token(LyXLex & lex, LyXParagraph *& par,
                               "Inserting as text.");
                for(string::const_iterator cit = token.begin();
                    cit != token.end(); ++cit) {
-                       par->InsertChar(pos, (*cit));
-                       par->SetFont(pos, font);
+                       par->InsertChar(pos, (*cit), font);
                        ++pos;
                }
        }
@@ -1313,14 +1327,6 @@ void Buffer::writeFileAscii(string const & fname, int linelen)
 #ifndef NEW_TABULAR
                /* It might be a table */ 
                if (par->table){
-#if 0
-                       if (!lyxrc.ascii_roff_command.empty() &&
-                            lyxrc.ascii_roff_command != "none") {
-                               RoffAsciiTable(ofs, par);
-                               par = par->next;
-                               continue;
-                       }
-#endif
                        cell = 1;
                         actcell = 0;
                        cells = par->table->columns;
@@ -1613,7 +1619,8 @@ void Buffer::makeLaTeXFile(string const & fname,
                
                string options; // the document class options.
                
-               if (tokenPos(tclass.opt_fontsize(), '|', params.fontsize) >= 0) {
+               if (tokenPos(tclass.opt_fontsize(),
+                            '|', params.fontsize) >= 0) {
                        // only write if existing in list (and not default)
                        options += params.fontsize;
                        options += "pt,";
@@ -1825,7 +1832,8 @@ void Buffer::makeLaTeXFile(string const & fname,
                        texrow.newline();
                }
 
-               if (tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) >= 0) {
+               if (tokenPos(tclass.opt_pagestyle(),
+                            '|', params.pagestyle) >= 0) {
                        if (params.pagestyle == "fancy") {
                                ofs << "\\usepackage{fancyhdr}\n";
                                texrow.newline();
@@ -1881,16 +1889,15 @@ void Buffer::makeLaTeXFile(string const & fname,
                }
 
                // Now insert the LyX specific LaTeX commands...
-               string preamble, tmppreamble;
 
                // The optional packages;
-               preamble = features.getPackages();
+               string preamble(features.getPackages());
 
                // this might be useful...
-               preamble += "\n\\makeatletter\n\n";
+               preamble += "\n\\makeatletter\n";
 
                // Some macros LyX will need
-               tmppreamble = features.getMacros();
+               string tmppreamble(features.getMacros());
 
                if (!tmppreamble.empty()) {
                        preamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
@@ -1913,7 +1920,7 @@ void Buffer::makeLaTeXFile(string const & fname,
                                + params.preamble + '\n';
                }
 
-               preamble += "\\makeatother\n\n";
+               preamble += "\\makeatother\n";
 
                // Itemize bullet settings need to be last in case the user
                // defines their own bullets that use a package included
@@ -1957,8 +1964,7 @@ void Buffer::makeLaTeXFile(string const & fname,
                ofs << preamble;
 
                // make the body.
-               ofs << "\\begin{document}\n\n";
-               texrow.newline();
+               ofs << "\\begin{document}\n";
                texrow.newline();
        } // only_body
        lyxerr.debug() << "preamble finished, now the body." << endl;
@@ -2009,11 +2015,12 @@ void Buffer::makeLaTeXFile(string const & fname,
        lyxerr.debug() << "Finished making latex file." << endl;
 }
 
+
 //
 // LaTeX all paragraphs from par to endpar, if endpar == 0 then to the end
 //
-void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
-                            LyXParagraph *endpar, TexRow & texrow) const
+void Buffer::latexParagraphs(ostream & ofs, LyXParagraph * par,
+                            LyXParagraph * endpar, TexRow & texrow) const
 {
        bool was_title = false;
        bool already_title = false;
@@ -2104,6 +2111,7 @@ void Buffer::latexParagraphs(ostream & ofs, LyXParagraph *par,
        }
 }
 
+
 bool Buffer::isLatex() const
 {
        return textclasslist.TextClass(params.textclass).outputType() == LATEX;
@@ -2149,10 +2157,12 @@ void Buffer::sgmlCloseTag(ostream & os, int depth,
 }
 
 
-void Buffer::makeLinuxDocFile(string const & fname, int column)
+void Buffer::makeLinuxDocFile(string const & fname, bool nice, bool body_only)
 {
        LyXParagraph * par = paragraph;
 
+       niceFile = nice; // this will be used by Insetincludes.
+
        string top_element = textclasslist.LatexnameOfClass(params.textclass);
        string environment_stack[10];
         string item_name;
@@ -2165,35 +2175,48 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
                WriteAlert(_("LYX_ERROR:"), _("Cannot write file"), fname);
                return;
        }
-   
-       tex_code_break_column = column; 
+
+        LyXTextClass const & tclass =
+               textclasslist.TextClass(params.textclass);
+
+       LaTeXFeatures features(params, tclass.numLayouts());
+       validate(features);
+
+       //if(nice)
+       tex_code_break_column = lyxrc.ascii_linelen;
+       //else
+       //tex_code_break_column = 0;
+
        texrow.reset();
-   
-       if (params.preamble.empty()) {
-               ofs << "<!doctype linuxdoc system>\n\n";
-       }
-       else {
-               ofs << "<!doctype linuxdoc system \n [ "
-                   << params.preamble << " \n]>\n\n";
+
+       if (!body_only) {
+               string sgml_includedfiles=features.getIncludedFiles();
+
+               if (params.preamble.empty() && sgml_includedfiles.empty()) {
+                       ofs << "<!doctype linuxdoc system>\n\n";
+               } else {
+                       ofs << "<!doctype linuxdoc system [ "
+                           << params.preamble << sgml_includedfiles << " \n]>\n\n";
+               }
+
+               if(params.options.empty())
+                       sgmlOpenTag(ofs, 0, top_element);
+               else {
+                       string top = top_element;
+                       top += " ";
+                       top += params.options;
+                       sgmlOpenTag(ofs, 0, top);
+               }
        }
 
        ofs << "<!-- "  << LYX_DOCVERSION 
            << " created this file. For more info see http://www.lyx.org/"
            << " -->\n";
 
-       if(params.options.empty())
-               sgmlOpenTag(ofs, 0, top_element);
-       else {
-               string top = top_element;
-               top += " ";
-               top += params.options;
-               sgmlOpenTag(ofs, 0, top);
-       }
-
        while (par) {
                int desc_on = 0; // description mode
                LyXLayout const & style =
-                       textclasslist.Style(users->buffer()->params.textclass,
+                       textclasslist.Style(params.textclass,
                                            par->layout);
 
                // treat <toc> as a special case for compatibility with old code
@@ -2314,8 +2337,10 @@ void Buffer::makeLinuxDocFile(string const & fname, int column)
        if(!environment_stack[depth].empty())
                sgmlCloseTag(ofs, depth, environment_stack[depth]);
 
-       ofs << "\n\n";
-       sgmlCloseTag(ofs, 0, top_element);
+       if (!body_only) {
+               ofs << "\n\n";
+               sgmlCloseTag(ofs, 0, top_element);
+       }
 
        ofs.close();
        // How to check for successful close
@@ -2572,31 +2597,29 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                        case 0:
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
                                        push_tag(os, "tt", stack_num, stack);
-                                       family_type= 1;
+                                       family_type = 1;
                                }
                                else if (font2.family() == LyXFont::SANS_FAMILY) {
                                        push_tag(os, "sf", stack_num, stack);
-                                       family_type= 2;
+                                       family_type = 2;
                                }
                                break;
                        case 1:
                                pop_tag(os, "tt", stack_num, stack);
                                if (font2.family() == LyXFont::SANS_FAMILY) {
                                        push_tag(os, "sf", stack_num, stack);
-                                       family_type= 2;
-                               }
-                               else {
-                                       family_type= 0;
+                                       family_type = 2;
+                               } else {
+                                       family_type = 0;
                                }
                                break;
                        case 2:
                                pop_tag(os, "sf", stack_num, stack);
                                if (font2.family() == LyXFont::TYPEWRITER_FAMILY) {
                                        push_tag(os, "tt", stack_num, stack);
-                                       family_type= 1;
-                               }
-                               else {
-                                       family_type= 0;
+                                       family_type = 1;
+                               } else {
+                                       family_type = 0;
                                }
                        }
                }
@@ -2606,8 +2629,7 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                        if (font2.series() == LyXFont::BOLD_SERIES) {
                                push_tag(os, "bf", stack_num, stack);
                                is_bold = true;
-                       }
-                       else if (is_bold) {
+                       } else if (is_bold) {
                                pop_tag(os, "bf", stack_num, stack);
                                is_bold = false;
                        }
@@ -2619,31 +2641,28 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                        case 0:
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
                                        push_tag(os, "it", stack_num, stack);
-                                       shape_type= 1;
-                               }
-                               else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
+                                       shape_type = 1;
+                               } else if (font2.shape() == LyXFont::SLANTED_SHAPE) {
                                        push_tag(os, "sl", stack_num, stack);
-                                       shape_type= 2;
+                                       shape_type = 2;
                                }
                                break;
                        case 1:
                                pop_tag(os, "it", stack_num, stack);
                                if (font2.shape() == LyXFont::SLANTED_SHAPE) {
                                        push_tag(os, "sl", stack_num, stack);
-                                       shape_type= 2;
-                               }
-                               else {
-                                       shape_type= 0;
+                                       shape_type = 2;
+                               } else {
+                                       shape_type = 0;
                                }
                                break;
                        case 2:
                                pop_tag(os, "sl", stack_num, stack);
                                if (font2.shape() == LyXFont::ITALIC_SHAPE) {
                                        push_tag(os, "it", stack_num, stack);
-                                       shape_type= 1;
-                               }
-                               else {
-                                       shape_type= 0;
+                                       shape_type = 1;
+                               } else {
+                                       shape_type = 0;
                                }
                        }
                }
@@ -2659,15 +2678,17 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                }
 
                c = par->GetChar(i);
-      
+
+               if (c == LyXParagraph::META_INSET) {
+                       inset = par->GetInset(i);
+                       inset->Linuxdoc(this, os);
+               }
+
                if (font2.latex() == LyXFont::ON) {
                        // "TeX"-Mode on == > SGML-Mode on.
                        if (c != '\0')
                                os << c; // see LaTeX-Generation...
                        ++char_line_count;
-               } else if (c == LyXParagraph::META_INSET) {
-                       inset = par->GetInset(i);
-                       inset->Linuxdoc(this, os);
                } else {
                        string sgml_string;
                        if (par->linuxDocConvertChar(c, sgml_string)
@@ -2680,13 +2701,11 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
                                        linux_doc_line_break(os, char_line_count, 6);
                                        os << "</tag>";
                                        desc_on = 2;
-                               }
-                               else  {
+                               } else  {
                                        linux_doc_line_break(os, char_line_count, 1);
                                        os << c;
                                }
-                       }
-                       else {
+                       } else {
                                os << sgml_string;
                                char_line_count += sgml_string.length();
                        }
@@ -2725,11 +2744,8 @@ void Buffer::SimpleLinuxDocOnePar(ostream & os, LyXParagraph * par,
 void Buffer::LinuxDocError(LyXParagraph * par, int pos,
                           char const * message) 
 {
-       InsetError * new_inset;
-
        // insert an error marker in text
-       new_inset = new InsetError(message);
-       par->InsertChar(pos, LyXParagraph::META_INSET);
+       InsetError * new_inset = new InsetError(message);
        par->InsertInset(pos, new_inset);
 }
 
@@ -2741,10 +2757,12 @@ void Buffer::LinuxDocError(LyXParagraph * par, int pos,
 
 enum { MAX_NEST_LEVEL = 25};
 
-void Buffer::makeDocBookFile(string const & fname, int column)
+void Buffer::makeDocBookFile(string const & fname, bool nice, bool only_body)
 {
        LyXParagraph * par = paragraph;
 
+       niceFile = nice; // this will be used by Insetincludes.
+
        string top_element= textclasslist.LatexnameOfClass(params.textclass);
        // Please use a real stack.
        string environment_stack[MAX_NEST_LEVEL];
@@ -2758,8 +2776,16 @@ void Buffer::makeDocBookFile(string const & fname, int column)
        string c_depth, c_params, tmps;
 
        int depth = 0; // paragraph depth
+        LyXTextClass const & tclass =
+               textclasslist.TextClass(params.textclass);
+
+       LaTeXFeatures features(params, tclass.numLayouts());
+       validate(features);
 
-       tex_code_break_column = column; 
+       //if(nice)
+       tex_code_break_column = lyxrc.ascii_linelen;
+       //else
+       //tex_code_break_column = 0;
 
        ofstream ofs(fname.c_str());
        if (!ofs) {
@@ -2769,30 +2795,35 @@ void Buffer::makeDocBookFile(string const & fname, int column)
    
        texrow.reset();
 
-       ofs << "<!doctype " << top_element
-           << " public \"-//OASIS//DTD DocBook V3.1//EN\"";
+       if(!only_body) {
+               string sgml_includedfiles=features.getIncludedFiles();
 
-       if (params.preamble.empty())
-               ofs << ">\n\n";
-       else
-               ofs << "\n [ " << params.preamble << " \n]>\n\n";
+               ofs << "<!doctype " << top_element
+                   << " public \"-//OASIS//DTD DocBook V3.1//EN\"";
 
-       ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION 
-           << "\n  See http://www.lyx.org/ for more information -->\n";
+               if (params.preamble.empty() && sgml_includedfiles.empty())
+                       ofs << ">\n\n";
+               else
+                       ofs << "\n [ " << params.preamble 
+                           << sgml_includedfiles << " \n]>\n\n";
 
-       if(params.options.empty())
-               sgmlOpenTag(ofs, 0, top_element);
-       else {
-               string top = top_element;
-               top += " ";
-               top += params.options;
-               sgmlOpenTag(ofs, 0, top);
+               if(params.options.empty())
+                       sgmlOpenTag(ofs, 0, top_element);
+               else {
+                       string top = top_element;
+                       top += " ";
+                       top += params.options;
+                       sgmlOpenTag(ofs, 0, top);
+               }
        }
 
+       ofs << "<!-- DocBook file was created by " << LYX_DOCVERSION 
+           << "\n  See http://www.lyx.org/ for more information -->\n";
+
        while (par) {
                int desc_on = 0; // description mode
                LyXLayout const & style =
-                       textclasslist.Style(users->buffer()->params.textclass,
+                       textclasslist.Style(params.textclass,
                                            par->layout);
 
                // environment tag closing
@@ -2859,19 +2890,16 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                                                if(!command_stack[j].empty())
                                                        sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= command_base= cmd_depth;
-                               }
-                               else if(cmd_depth <= command_depth) {
+                               } else if(cmd_depth <= command_depth) {
                                        for(int j = command_depth;
                                            j >= cmd_depth; --j)
 
                                                if(!command_stack[j].empty())
                                                        sgmlCloseTag(ofs, j, command_stack[j]);
                                        command_depth= cmd_depth;
-                               }
-                               else
+                               } else
                                        command_depth= cmd_depth;
-                       }
-                       else {
+                       } else {
                                command_depth = command_base = cmd_depth;
                                command_flag = true;
                        }
@@ -2941,8 +2969,7 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                                item_name= "term";
                                sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
-                       }
-                       else {
+                       } else {
                                item_name= "para";
                                sgmlOpenTag(ofs, depth + 1 + command_depth,
                                            item_name);
@@ -3014,8 +3041,10 @@ void Buffer::makeDocBookFile(string const & fname, int column)
                if(!command_stack[j].empty())
                        sgmlCloseTag(ofs, j, command_stack[j]);
 
-       ofs << "\n\n";
-       sgmlCloseTag(ofs, 0, top_element);
+       if (!only_body) {
+               ofs << "\n\n";
+               sgmlCloseTag(ofs, 0, top_element);
+       }
 
        ofs.close();
        // How to check for successful close
@@ -3174,7 +3203,6 @@ int Buffer::runLaTeX()
 
        // Always generate the LaTeX file
        makeLaTeXFile(name, org_path, false);
-       markDviDirty();
 
        // do the LaTex run(s)
        TeXErrors terr;
@@ -3199,7 +3227,6 @@ int Buffer::runLaTeX()
        } else {
                //no errors or any other things to think about so:
                users->owner()->getMiniBuffer()->Set(_("Done"));
-               markDviClean();
        }
 
        // if we removed error insets before we ran LaTeX or if we inserted
@@ -3241,10 +3268,7 @@ int Buffer::runLiterate()
        bool a = users->removeAutoInsets();
 
        // generate the Literate file if necessary
-       if (!isDviClean() || a) {
-               makeLaTeXFile(lit_name, org_path, false);
-               markDviDirty();
-       }
+       makeLaTeXFile(lit_name, org_path, false);
 
        string latex_command = lyxrc.pdf_mode ?
                lyxrc.pdflatex_command : lyxrc.latex_command;
@@ -3270,7 +3294,6 @@ int Buffer::runLiterate()
        } else {
                //no errors or any other things to think about so:
                users->owner()->getMiniBuffer()->Set(_("Done"));
-               markDviClean();
        }
 
        // if we removed error insets before we ran LaTeX or if we inserted
@@ -3379,13 +3402,10 @@ int Buffer::runChktex()
        users->owner()->getMiniBuffer()->Set(_("Running chktex..."));
 
        // Remove all error insets
-       bool a = users->removeAutoInsets();
+       bool removedErrorInsets = users->removeAutoInsets();
 
        // Generate the LaTeX file if neccessary
-       if (!isDviClean() || a) {
-               makeLaTeXFile(name, org_path, false);
-               markDviDirty();
-       }
+       makeLaTeXFile(name, org_path, false);
 
        TeXErrors terr;
        Chktex chktex(lyxrc.chktex_command, name, filepath);
@@ -3401,7 +3421,7 @@ int Buffer::runChktex()
 
        // if we removed error insets before we ran chktex or if we inserted
        // error insets after we ran chktex, this must be run:
-       if (a || res){
+       if (removedErrorInsets || res){
                users->redraw();
                users->fitCursor();
                //users->updateScrollbar();
@@ -3412,160 +3432,6 @@ int Buffer::runChktex()
 }
 
 
-#if 0
-void Buffer::RoffAsciiTable(ostream & os, LyXParagraph * par)
-{
-       LyXFont font1(LyXFont::ALL_INHERIT,params.language_info);
-       LyXFont font2;
-       Inset * inset;
-       LyXParagraph::size_type i;
-       int j, cell = 0;
-       char c;
-       
-       string fname1 = TmpFileName(string(), "RAT1");
-       string fname2 = TmpFileName(string(), "RAT2");
-
-       ofstream ofs(fname1.c_str());
-       if (!ofs) {
-               WriteAlert(_("LYX_ERROR:"),
-                          _("Cannot open temporary file:"), fname1);
-               return;
-       }
-       par->table->RoffEndOfCell(ofs, -1);
-       for (i = 0; i < par->size(); ++i) {
-               c = par->GetChar(i);
-               if (par->table->IsContRow(cell)) {
-                       if (c == LyXParagraph::META_NEWLINE)
-                               ++cell;
-                       continue;
-               }
-               font2 = par->GetFontSettings(i);
-               if (font1.latex() != font2.latex()) {
-                       if (font2.latex() != LyXFont::OFF)
-                               continue;
-               }
-               switch (c) {
-               case LyXParagraph::META_INSET:
-                       if ((inset = par->GetInset(i))) {
-#ifdef HAVE_SSTREAM
-                               stringstresm ss(ios::in | ios::out);
-                               inset->Ascii(this, ss);
-                               ss.seekp(0);
-                               ss.get(c);
-                               while (!ss) {
-                                       if (c == '\\')
-                                               ofs << "\\\\";
-                                       else
-                                               ofs << c;
-                                       ss.get(c);
-                               }
-#else
-                               strstream ss;
-                               inset->Ascii(this, ss);
-                               ss.seekp(0);
-                               ss.get(c);
-                               while (!ss) {
-                                       if (c == '\\')
-                                               ofs << "\\\\";
-                                       else
-                                               ofs << c;
-                                       ss.get(c);
-                               }
-                               delete [] ss.str();
-#endif
-                       }
-                       break;
-               case LyXParagraph::META_NEWLINE:
-                       if (par->table->CellHasContRow(cell)>= 0)
-                               par->RoffContTableRows(ofs, i+1, cell);
-                       par->table->RoffEndOfCell(ofs, cell);
-                       ++cell;
-                       break;
-               case LyXParagraph::META_HFILL: 
-                       break;
-               case '\\': 
-                       ofs << "\\\\";
-                       break;
-               default:
-                       if (c != '\0')
-                               ofs << c;
-                       else if (c == '\0')
-                               lyxerr.debug()
-                                       << "RoffAsciiTable:"
-                                       " NULL char in structure." << endl;
-                       break;
-               }
-       }
-       par->table->RoffEndOfCell(ofs, cell);
-       ofs.close();
-       string cmd = lyxrc.ascii_roff_command + " >" + fname2;
-       cmd = subst(cmd, "$$FName", fname1);
-       Systemcalls one(Systemcalls::System, cmd);
-       if (!(lyxerr.debugging(Debug::ROFF))) {
-               remove(fname1.c_str());
-       }
-       ifstream ifs(fname2.c_str());
-       if (!ifs) {
-               WriteFSAlert(_("Error! Can't open temporary file:"), fname2);
-               return;
-       }
-       // now output the produced file
-       os << "\n\n";
-       ifs.get(c);
-       if (!ifs)
-               WriteAlert(_("Error!"),
-                          _("Error executing *roff command on table"));
-       // overread leading blank lines
-       while(!ifs && (c == '\n'))
-               ifs.get(c);
-       while(!ifs) {
-               for(j = 0; j < par->depth; ++j)
-                       os << "  ";
-               while(!ifs && (c != '\n')) {
-                       os << c;
-                       ifs.get(c);
-               }
-               os << '\n';
-               // overread trailing blank lines
-               while(!ifs && (c == '\n'))
-                       ifs.get(c);
-       }
-       ifs.close();
-       remove(fname2.c_str());
-}
-#endif
-
-       
-/// changed Heinrich Bauer, 23/03/98
-bool Buffer::isDviClean() const
-{
-  if (lyxrc.use_tempdir)
-    return dvi_clean_tmpd;
-  else
-    return dvi_clean_orgd;
-}
-
-/// changed Heinrich Bauer, 23/03/98
-void Buffer::markDviClean()
-{
-  if (lyxrc.use_tempdir)
-    dvi_clean_tmpd = true;
-  else
-    dvi_clean_orgd = true;
-}
-
-
-/// changed Heinrich Bauer, 23/03/98
-void Buffer::markDviDirty()
-{
-  if (lyxrc.use_tempdir)
-    dvi_clean_tmpd = false;
-  else
-    dvi_clean_orgd = false;
-}
-
-
 void Buffer::validate(LaTeXFeatures & features) const
 {
        LyXParagraph * par = paragraph;
@@ -3842,6 +3708,20 @@ bool Buffer::Dispatch(int action, string const & argument)
 }
 
 
+void Buffer::resize()
+{
+       /// first resize the BufferViews!
+       if (users) {
+               users->resize();
+       }
+       /// then remove all LyXText in text-insets
+       LyXParagraph * par = paragraph;
+       for(;par;par = par->next) {
+               par->deleteInsetsLyXText(users);
+       }
+}
+
+
 void Buffer::ChangeLanguage(Language const * from, Language const * to)
 {