]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Merge branch 'master' of git.lyx.org:lyx
[lyx.git] / src / BufferParams.cpp
index fa2f97bb87869c41ffa336834b4c8634e47ccbb0..373eee5dd0d0d98359ab47944e18cb75d341a46d 100644 (file)
@@ -369,6 +369,7 @@ BufferParams::BufferParams()
        biblio_style = "plain";
        use_bibtopic = false;
        use_indices = false;
+       save_transient_properties = true;
        track_changes = false;
        output_changes = false;
        use_default_options = true;
@@ -387,6 +388,7 @@ BufferParams::BufferParams()
        fonts_math[1] = "auto";
        fonts_default_family = "default";
        useNonTeXFonts = false;
+       use_microtype = false;
        fonts_expert_sc = false;
        fonts_old_figures = false;
        fonts_sans_scale[0] = 100;
@@ -429,6 +431,9 @@ BufferParams::BufferParams()
 
        output_sync = false;
        use_refstyle = true;
+
+       // map current author
+       author_map_[pimpl_->authorlist.get(0).bufferId()] = 0;
 }
 
 
@@ -504,6 +509,12 @@ AuthorList const & BufferParams::authors() const
 }
 
 
+void BufferParams::addAuthor(Author a)
+{
+       author_map_[a.bufferId()] = pimpl_->authorlist.record(a);
+}
+
+
 BranchList & BufferParams::branchlist()
 {
        return pimpl_->branchlist;
@@ -664,6 +675,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                        frontend::Alert::warning(_("Document class not available"),
                                       msg, true);
                }
+       } else if (token == "\\save_transient_properties") {
+               lex >> save_transient_properties;
        } else if (token == "\\origin") {
                lex.eatLine();
                origin = lex.getString();
@@ -759,6 +772,8 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                lex >> fonts_typewriter_scale[1];
        } else if (token == "\\font_cjk") {
                lex >> fonts_cjk;
+       } else if (token == "\\use_microtype") {
+               lex >> use_microtype;
        } else if (token == "\\paragraph_separation") {
                string parsep;
                lex >> parsep;
@@ -876,7 +891,7 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                istringstream ss(lex.getString());
                Author a;
                ss >> a;
-               author_map[a.bufferId()] = pimpl_->authorlist.record(a);
+               addAuthor(a);
        } else if (token == "\\paperorientation") {
                string orient;
                lex >> orient;
@@ -1006,12 +1021,19 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
        // The top of the file is written by the buffer.
        // Prints out the buffer info into the .lyx file given by file
 
-       // the document directory
-       string filepath = buf->filePath();
-       string const sysdir = package().system_support().absFileName();
-       if (prefixIs(filepath, sysdir))
-               filepath.replace(0, sysdir.length(), "/systemlyxdir/");
-       else if (!lyxrc.save_origin)
+       os << "\\save_transient_properties "
+          << convert<string>(save_transient_properties) << '\n';
+
+       // the document directory (must end with a path separator)
+       // realPath() is used to resolve symlinks, while addPath(..., "")
+       // ensures a trailing path separator.
+       string filepath = addPath(buf->fileName().onlyPath().realPath(), "");
+       string const sysdir = addPath(package().system_support().realPath(), "");
+       string const relpath =
+               to_utf8(makeRelPath(from_utf8(filepath), from_utf8(sysdir)));
+       if (!prefixIs(relpath, "../") && !FileName::isAbsolute(relpath))
+               filepath = addPath("/systemlyxdir", relpath);
+       else if (!save_transient_properties || !lyxrc.save_origin)
                filepath = "unavailable";
        os << "\\origin " << quoteIfNeeded(filepath) << '\n';
 
@@ -1120,6 +1142,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
        if (!fonts_cjk.empty()) {
                os << "\\font_cjk " << fonts_cjk << '\n';
        }
+       os << "\\use_microtype " << convert<string>(use_microtype) << '\n';
        os << "\\graphics " << graphics_driver << '\n';
        os << "\\default_output_format " << default_output_format << '\n';
        os << "\\output_sync " << output_sync << '\n';
@@ -1260,9 +1283,15 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
                }
        }
 
-       os << "\\tracking_changes " << convert<string>(track_changes) << '\n'
-          << "\\output_changes " << convert<string>(output_changes) << '\n'
-          << "\\html_math_output " << html_math_output << '\n'
+       os << "\\tracking_changes "
+          << (save_transient_properties ? convert<string>(track_changes) : "false")
+          << '\n';
+
+       os << "\\output_changes "
+          << (save_transient_properties ? convert<string>(output_changes) : "false")
+          << '\n';
+
+       os << "\\html_math_output " << html_math_output << '\n'
           << "\\html_css_as_file " << html_css_as_file << '\n'
           << "\\html_be_strict " << convert<string>(html_be_strict) << '\n';
 
@@ -1381,14 +1410,14 @@ void BufferParams::validate(LaTeXFeatures & features) const
        }
 
        // some languages are only available via polyglossia
-       if ((features.runparams().flavor == OutputParams::XETEX
-            || features.runparams().flavor == OutputParams::LUATEX)
-           && (features.hasPolyglossiaExclusiveLanguages()
-               || useNonTeXFonts))
-               features.require("polyglossia");
+       if (features.hasPolyglossiaExclusiveLanguages())
+          features.require("polyglossia");
 
        if (useNonTeXFonts && fontsMath() != "auto")
                features.require("unicode-math");
+       
+       if (use_microtype)
+               features.require("microtype");
 
        if (!language->requires().empty())
                features.require(language->requires());
@@ -2176,7 +2205,7 @@ bool BufferParams::hasClassDefaults() const
 
 DocumentClass const & BufferParams::documentClass() const
 {
-       return *doc_class_.get();
+       return *doc_class_;
 }
 
 
@@ -2944,8 +2973,8 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
        // XeTeX/LuaTeX: (see also #9740)
        // With Unicode fonts we use utf8-plain without encoding package.
        // With TeX fonts, we cannot use utf8-plain, but "inputenc" fails.
-       // XeTeX must use ASCII encoding, for LuaTeX, we load
-       // "luainputenc" (see below).
+       // XeTeX must use ASCII encoding (see Buffer.cpp),
+       //  for LuaTeX, we load "luainputenc" (see below).
        if (useNonTeXFonts || features.runparams().flavor == OutputParams::XETEX)
                return;
 
@@ -3141,14 +3170,13 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
 
 Encoding const & BufferParams::encoding() const
 {
-       // FIXME: For export with XeTeX and TeX fonts,
-       //   this function returns the wrong value.
-       //   The combination of XeTeX and TeX-fonts requires ASCII (see #9740).
-       //   However, the flavor is no buffer parameter but only known once export started.
-       //   Currently, we set runparams.encoding to ASCII in Buffer::makeLaTeXFile
-       //   (for export) and Buffer::writeLaTeXSource (for preview)
-       //   and prevent overwriting it with another encoding in Paragraph::latex
-       //   and at four places in output_latex.cpp.
+       // Main encoding for LaTeX output.
+       // 
+       // Exception: XeTeX with 8-bit TeX fonts requires ASCII (see #9740).
+       // As the "flavor" is only known once export started, this
+       // cannot be handled here. Instead, runparams.encoding is set
+       // to ASCII in Buffer::makeLaTeXFile (for export)
+       // and Buffer::writeLaTeXSource (for preview).
        if (useNonTeXFonts)
                return *(encodings.fromLyXName("utf8-plain"));
        if (inputenc == "auto" || inputenc == "default")