]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Micro-optimization.
[lyx.git] / src / BufferParams.cpp
index ba261ec7989d42a35ea5688af18c78b96a9b5e64..9a64ec6cf5e6a859de99c7e8eddcb7056eaab53b 100644 (file)
@@ -343,6 +343,7 @@ BufferParams::BufferParams()
        trackChanges = false;
        outputChanges = false;
        use_default_options = true;
+       maintain_unincluded_children = false;
        secnumdepth = 3;
        tocdepth = 3;
        language = default_language;
@@ -536,6 +537,10 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                readModules(lex);
        } else if (token == "\\begin_removed_modules") {
                readRemovedModules(lex);
+       } else if (token == "\\begin_includeonly") {
+               readIncludeonly(lex);
+       } else if (token == "\\maintain_unincluded_children") {
+               lex >> maintain_unincluded_children;
        } else if (token == "\\options") {
                lex.eatLine();
                options = lex.getString();
@@ -834,7 +839,19 @@ void BufferParams::writeFile(ostream & os) const
                        os << *it << '\n';
                os << "\\end_modules" << '\n';
        }
-       
+
+       // includeonly
+       if (!includedChildren_.empty()) {
+               os << "\\begin_includeonly" << '\n';
+               list<string>::const_iterator it = includedChildren_.begin();
+               list<string>::const_iterator en = includedChildren_.end();
+               for (; it != en; it++)
+                       os << *it << '\n';
+               os << "\\end_includeonly" << '\n';
+       }
+       os << "\\maintain_unincluded_children "
+          << convert<string>(maintain_unincluded_children) << '\n';
+
        // local layout information
        if (!local_layout.empty()) {
                // remove '\n' from the end 
@@ -1080,7 +1097,7 @@ void BufferParams::validate(LaTeXFeatures & features) const
 
 
 bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
-                             TexRow & texrow) const
+                             TexRow & texrow, FileName const & filepath) const
 {
        os << "\\documentclass";
 
@@ -1249,6 +1266,31 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        // handle inputenc etc.
        writeEncodingPreamble(os, features, texrow);
 
+       // includeonly
+       if (!features.runparams().includeall && !includedChildren_.empty()) {
+               os << "\\includeonly{";
+               list<string>::const_iterator it = includedChildren_.begin();
+               bool first = true;
+               for (; it != includedChildren_.end() ; ++it) {
+                       string incfile = *it;
+                       FileName inc = makeAbsPath(incfile, filepath.absFilename());
+                       string mangled = DocFileName(changeExtension(inc.absFilename(), ".tex")).
+                       mangledFilename();
+                       if (!features.runparams().nice)
+                               incfile = mangled;
+                       // \includeonly doesn't want an extension 
+                       incfile = changeExtension(incfile, string());
+                       incfile = support::latex_path(incfile);
+                       if (!incfile.empty()) {
+                               if (!first)
+                                       os << ",";
+                               os << from_utf8(incfile);
+                       }
+                       first = false;
+               }
+               os << "}\n";
+       }
+
        if (!listings_params.empty() || features.isRequired("listings")) {
                os << "\\usepackage{listings}\n";
                texrow.newline();
@@ -1492,13 +1534,23 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        //   before hyperref. Then hyperref has a chance to detect babel.
        // * Has to be loaded before the "LyX specific LaTeX commands" to
        //   avoid errors with algorithm floats.
-       // use hyperref explicitely when it is required
+       // use hyperref explicitly if it is required
        if (features.isRequired("hyperref")) {
-               odocstringstream oss;
-               pdfoptions().writeLaTeX(oss, documentClass().provides("hyperref"));
-               lyxpreamble += oss.str();
+               // pass what we have to stream here, since we need 
+               // to access the stream itself in PDFOptions.
+               os << lyxpreamble;
+
+               int lines =
+                       int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
+
+               OutputParams tmp_params = features.runparams();
+               lines += pdfoptions().writeLaTeX(tmp_params, os,
+                                       documentClass().provides("hyperref"));
+               texrow.newlines(lines);
+               // set back for the rest
+               lyxpreamble.clear();
        }
-       
+
        // Will be surrounded by \makeatletter and \makeatother when not empty
        docstring atlyxpreamble;
 
@@ -1602,9 +1654,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
 
        int const nlines =
                int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
-       for (int j = 0; j != nlines; ++j) {
-               texrow.newline();
-       }
+       texrow.newlines(nlines);
 
        os << lyxpreamble;
 
@@ -1903,6 +1953,23 @@ void BufferParams::readRemovedModules(Lexer & lex)
 }
 
 
+void BufferParams::readIncludeonly(Lexer & lex)
+{
+       if (!lex.eatLine()) {
+               lyxerr << "Error (BufferParams::readIncludeonly):"
+                               "Unexpected end of input." << endl;
+               return;
+       }
+       while (true) {
+               string child = lex.getString();
+               if (child == "\\end_includeonly")
+                       break;
+               includedChildren_.push_back(child);
+               lex.eatLine();
+       }
+}
+
+
 string BufferParams::paperSizeName(PapersizePurpose purpose) const
 {
        char real_papersize = papersize;
@@ -2202,7 +2269,7 @@ string const BufferParams::loadFonts(string const & rm,
        }
 
        // ROMAN FONTS
-       // Computer Modern (must be explicitely selectable -- there might be classes
+       // Computer Modern (must be explicitly selectable -- there might be classes
        // that define a different default font!
        if (rm == "cmr") {
                os << "\\renewcommand{\\rmdefault}{cmr}\n";