]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Fix part of bug #6127: Roundtrip Lyx->Latex->Lyx fails.
[lyx.git] / src / BufferParams.cpp
index d2192067d1cb47ce187db9df5fa2f888c71c0717..96aaf7af2826eb6a1b1811e80f3ad1fbb54b5a1f 100644 (file)
@@ -25,6 +25,7 @@
 #include "Color.h"
 #include "ColorSet.h"
 #include "Encoding.h"
+#include "HSpace.h"
 #include "IndicesList.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
@@ -289,6 +290,7 @@ public:
        /** This is the amount of space used for paragraph_separation "skip",
         * and for detached paragraphs in "indented" documents.
         */
+       HSpace indentation;
        VSpace defskip;
        PDFOptions pdfoptions;
        LayoutFileIndex baseClass_;
@@ -468,6 +470,18 @@ PDFOptions const & BufferParams::pdfoptions() const
 }
 
 
+HSpace const & BufferParams::getIndentation() const
+{
+       return pimpl_->indentation;
+}
+
+
+void BufferParams::setIndentation(HSpace const & indent)
+{
+       pimpl_->indentation = indent;
+}
+
+
 VSpace const & BufferParams::getDefSkip() const
 {
        return pimpl_->defskip;
@@ -566,6 +580,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                string parsep;
                lex >> parsep;
                paragraph_separation = parseptranslator().find(parsep);
+       } else if (token == "\\paragraph_indentation") {
+               lex.next();
+               string indentation = lex.getString();
+               pimpl_->indentation = HSpace(indentation);
        } else if (token == "\\defskip") {
                lex.next();
                string defskip = lex.getString();
@@ -618,6 +636,11 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                                if (branch_ptr)
                                        branch_ptr->setSelected(lex.getInteger());
                        }
+                       if (tok == "\\filename_suffix") {
+                               lex.next();
+                               if (branch_ptr)
+                                       branch_ptr->setFilenameSuffix(lex.getInteger());
+                       }
                        // not yet operational
                        if (tok == "\\color") {
                                lex.eatLine();
@@ -664,7 +687,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                istringstream ss(lex.getString());
                Author a;
                ss >> a;
-               author_map.push_back(pimpl_->authorlist.record(a));
+               author_map[a.buffer_id()] = pimpl_->authorlist.record(a);
        } else if (token == "\\paperorientation") {
                string orient;
                lex >> orient;
@@ -849,6 +872,7 @@ void BufferParams::writeFile(ostream & os) const
        for (; it != end; ++it) {
                os << "\\branch " << to_utf8(it->branch())
                   << "\n\\selected " << it->isSelected()
+                  << "\n\\filename_suffix " << it->hasFilenameSuffix()
                   << "\n\\color " << lyx::X11hexname(it->color())
                   << "\n\\end_branch"
                   << "\n";
@@ -897,9 +921,12 @@ void BufferParams::writeFile(ostream & os) const
        os << "\\secnumdepth " << secnumdepth
           << "\n\\tocdepth " << tocdepth
           << "\n\\paragraph_separation "
-          << string_paragraph_separation[paragraph_separation]
-          << "\n\\defskip " << getDefSkip().asLyXCommand()
-          << "\n\\quotes_language "
+          << string_paragraph_separation[paragraph_separation];
+       if (!paragraph_separation)
+               os << "\n\\paragraph_indentation " << getIndentation().asLyXCommand();
+       else
+               os << "\n\\defskip " << getDefSkip().asLyXCommand();
+       os << "\n\\quotes_language "
           << string_quotes_language[quotes_language]
           << "\n\\papercolumns " << columns
           << "\n\\papersides " << sides
@@ -927,14 +954,7 @@ void BufferParams::writeFile(ostream & os) const
        os << "\\tracking_changes " << convert<string>(trackChanges) << "\n";
        os << "\\output_changes " << convert<string>(outputChanges) << "\n";
 
-       AuthorList::Authors::const_iterator a_it = pimpl_->authorlist.begin();
-       AuthorList::Authors::const_iterator a_end = pimpl_->authorlist.end();
-       for (; a_it != a_end; ++a_it) {
-               if (a_it->second.used())
-                       os << "\\author " << a_it->second << "\n";
-               else
-                       os << "\\author " << Author() << "\n";
-       }
+       os << pimpl_->authorlist;
 }
 
 
@@ -1364,6 +1384,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        }
 
        if (paragraph_separation) {
+               // when skip separation
                switch (getDefSkip().kind()) {
                case VSpace::SMALLSKIP:
                        os << "\\setlength{\\parskip}{\\smallskipamount}\n";
@@ -1384,9 +1405,17 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        break;
                }
                texrow.newline();
-
                os << "\\setlength{\\parindent}{0pt}\n";
                texrow.newline();
+       } else {
+               // when separation by indentation
+               // only output something when a width is given
+               if (getIndentation().asLyXCommand() != "default") {
+                       os << "\\setlength{\\parindent}{"
+                               << from_utf8(getIndentation().asLatexCommand())
+                          << "}\n";
+                       texrow.newline();
+               }
        }
 
        // Now insert the LyX specific LaTeX commands...
@@ -1445,11 +1474,11 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                lyxpreamble += oss.str();
        }
        
-       // Will be surrounded by \makeatletter and \makeatother when needed
+       // Will be surrounded by \makeatletter and \makeatother when not empty
        docstring atlyxpreamble;
 
        // Some macros LyX will need
-       docstring tmppreamble(from_ascii(features.getMacros()));
+       docstring tmppreamble(features.getMacros());
 
        if (!tmppreamble.empty())
                atlyxpreamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
@@ -1464,9 +1493,11 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        + tmppreamble + '\n';
 
        /* the user-defined preamble */
-       if (!preamble.empty())
+       if (!containsOnly(preamble, " \n\t"))
                // FIXME UNICODE
-               atlyxpreamble += from_utf8(preamble);
+               atlyxpreamble += "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
+                       "User specified LaTeX commands.\n"
+                       + from_utf8(preamble) + '\n';
 
        // subfig loads internally the LaTeX package "caption". As
        // caption is a very popular package, users will load it in
@@ -1519,19 +1550,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        if (!bullets_def.empty())
                atlyxpreamble += bullets_def + "}\n\n";
 
-       lyxpreamble += "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "
-                       "User specified LaTeX commands.\n";
-
-       // Check whether we should change the catcode of '@' in the preamble.
-       // We do it when '@' explicitly appears and, as a safety measure, also
-       // when an external file is included.
-       if (atlyxpreamble.find(from_ascii("@")) != docstring::npos
-           || atlyxpreamble.find(from_ascii("\\input")) != docstring::npos
-           || atlyxpreamble.find(from_ascii("\\include")) != docstring::npos)
-               lyxpreamble += "\\makeatletter\n"
+       if (!atlyxpreamble.empty())
+               lyxpreamble += "\n\\makeatletter\n"
                        + atlyxpreamble + "\\makeatother\n\n";
-       else
-               lyxpreamble += atlyxpreamble + '\n';
 
        // We try to load babel late, in case it interferes with other packages.
        // Jurabib and Hyperref have to be called after babel, though.