]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
ar.po: updates from Hatim
[lyx.git] / src / BufferParams.cpp
index 029e5b524c27cbb1c2c900b99c57f76b5e7f8f64..3f0f44aeff5956fe659c638593017700bf5008a2 100644 (file)
@@ -304,6 +304,35 @@ SpaceTranslator const & spacetranslator()
        return translator;
 }
 
+
+bool inSystemDir(FileName const & document_dir, string & system_dir)
+{
+       // A document is assumed to be in a system LyX directory (not
+       // necessarily the system directory of the running instance)
+       // if both "configure.py" and "chkconfig.ltx" are found in
+       // either document_dir/../ or document_dir/../../.
+       // If true, the system directory path is returned in system_dir
+       // with a trailing path separator.
+
+       string const msg = "Checking whether document is in a system dir...";
+
+       string dir = document_dir.absFileName();
+
+       for (int i = 0; i < 2; ++i) {
+               dir = addPath(dir, "..");
+               if (!fileSearch(dir, "configure.py").empty() &&
+                   !fileSearch(dir, "chkconfig.ltx").empty()) {
+                       LYXERR(Debug::FILES, msg << " yes");
+                       system_dir = addPath(FileName(dir).realPath(), "");
+                       return true;
+               }
+       }
+
+       LYXERR(Debug::FILES, msg << " no");
+       system_dir = string();
+       return false;
+}
+
 } // anon namespace
 
 
@@ -369,6 +398,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;
@@ -673,13 +703,19 @@ 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();
                string const sysdirprefix = "/systemlyxdir/";
                if (prefixIs(origin, sysdirprefix)) {
-                       origin.replace(0, sysdirprefix.length() - 1,
-                               package().system_support().absFileName());
+                       string docsys;
+                       if (inSystemDir(filepath, docsys))
+                               origin.replace(0, sysdirprefix.length() - 1, docsys);
+                       else
+                               origin.replace(0, sysdirprefix.length() - 1,
+                                       package().system_support().absFileName());
                }
        } else if (token == "\\begin_preamble") {
                readPreamble(lex);
@@ -1015,12 +1051,21 @@ 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 docsys;
+       string filepath = addPath(buf->fileName().onlyPath().realPath(), "");
+       string const sysdir = inSystemDir(FileName(filepath), docsys) ? docsys
+                       : 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';
 
@@ -1269,9 +1314,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';
 
@@ -1390,11 +1441,8 @@ 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");
@@ -1569,7 +1617,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                os << from_ascii(ams);
 
        if (useNonTeXFonts) {
-               os << "\\usepackage{fontspec}\n";
+               if (!features.isProvided("fontspec"))
+                       os << "\\usepackage{fontspec}\n";
                if (features.mustProvide("unicode-math")
                    && features.isAvailable("unicode-math"))
                        os << "\\usepackage{unicode-math}\n";
@@ -2034,7 +2083,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        // koma's own caption commands are used instead of caption. We
        // use \PassOptionsToPackage here because the user could have
        // already loaded subfig in the preamble.
-       if (features.isRequired("subfig")) {
+       if (features.mustProvide("subfig")) {
                atlyxpreamble += "\\@ifundefined{showcaptionsetup}{}{%\n"
                        " \\PassOptionsToPackage{caption=false}{subfig}}\n"
                        "\\usepackage{subfig}\n";
@@ -2095,7 +2144,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
        }
        if (features.isRequired("bicaption"))
                lyxpreamble += "\\usepackage{bicaption}\n";
-       if (!listings_params.empty() || features.isRequired("listings"))
+       if (!listings_params.empty() || features.mustProvide("listings"))
                lyxpreamble += "\\usepackage{listings}\n";
        if (!listings_params.empty()) {
                lyxpreamble += "\\lstset{";
@@ -2109,6 +2158,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
 
        // xunicode needs to be loaded at least after amsmath, amssymb,
        // esint and the other packages that provide special glyphs
+       // The package only supports XeTeX currently.
        if (features.runparams().flavor == OutputParams::XETEX
            && useNonTeXFonts)
                lyxpreamble += "\\usepackage{xunicode}\n";
@@ -2123,14 +2173,17 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
                        lyxpreamble += "[" + from_ascii(language->polyglossiaOpts()) + "]";
                lyxpreamble += "{" + from_ascii(language->polyglossia()) + "}\n";
                // now setup the other languages
-               std::map<std::string, std::string> const polylangs =
+               set<string> const polylangs =
                        features.getPolyglossiaLanguages();
-               for (std::map<std::string, std::string>::const_iterator mit = polylangs.begin();
+               for (set<string>::const_iterator mit = polylangs.begin();
                     mit != polylangs.end() ; ++mit) {
+                       // We do not output the options here; they are output in
+                       // the language switch commands. This is safer if multiple
+                       // varieties are used.
+                       if (*mit == language->polyglossia())
+                               continue;
                        lyxpreamble += "\\setotherlanguage";
-                       if (!mit->second.empty())
-                               lyxpreamble += "[" + from_ascii(mit->second) + "]";
-                       lyxpreamble += "{" + from_ascii(mit->first) + "}\n";
+                       lyxpreamble += "{" + from_ascii(*mit) + "}\n";
                }
        }
 
@@ -2330,7 +2383,10 @@ string BufferParams::bufferFormat() const
        string format = documentClass().outputFormat();
        if (format == "latex") {
                if (useNonTeXFonts)
-                       return "xetex"; // actually "xetex or luatex"
+                       // FIXME: In this context, this means "xetex or luatex"
+                       // with fontspec. We cannot differentiate further here.
+                       // But maybe use a more appropriate string.
+                       return "xetex";
                if (encoding().package() == Encoding::japanese)
                        return "platex";
        }
@@ -2400,11 +2456,8 @@ vector<string> BufferParams::backends() const
                v.push_back("xetex");
        } else if (buffmt == "xetex") {
                v.push_back("xetex");
-               // FIXME: need to test all languages (bug 8205)
-               if (!language || !language->isPolyglossiaExclusive()) {
-                       v.push_back("luatex");
-                       v.push_back("dviluatex");
-               }
+               v.push_back("luatex");
+               v.push_back("dviluatex");
        } else
                v.push_back(buffmt);
 
@@ -2953,8 +3006,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;