X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=3f0f44aeff5956fe659c638593017700bf5008a2;hb=5a8e91d1c5381d8c152b12269707b547d5241624;hp=ff45e34ddb19264ba79583b21550457e5b616b72;hpb=5198fdfc0b8638f3764c88843ea8863ec8b48656;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index ff45e34ddb..3f0f44aeff 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -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 @@ -681,8 +710,12 @@ string BufferParams::readToken(Lexer & lex, string const & token, 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); @@ -1024,8 +1057,10 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const // 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 = addPath(package().system_support().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)) @@ -2123,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"; @@ -2137,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 const polylangs = + set const polylangs = features.getPolyglossiaLanguages(); - for (std::map::const_iterator mit = polylangs.begin(); + for (set::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"; } } @@ -2344,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"; } @@ -2414,11 +2456,8 @@ vector 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);