: pimpl_(new Impl)
{
setBaseClass(defaultBaseclass());
+ cite_engine_.push_back("basic");
+ cite_engine_type_ = ENGINE_TYPE_DEFAULT;
makeDocumentClass();
paragraph_separation = ParagraphIndentSeparation;
quotes_language = InsetQuotes::EnglishQuotes;
papersize = PAPER_DEFAULT;
orientation = ORIENTATION_PORTRAIT;
use_geometry = false;
- cite_engine_.push_back("basic");
- cite_engine_type_ = ENGINE_TYPE_DEFAULT;
biblio_style = "plain";
use_bibtopic = false;
use_indices = false;
+ save_transient_properties = true;
track_changes = false;
output_changes = false;
use_default_options = true;
tocdepth = 3;
language = default_language;
fontenc = "global";
- fonts_roman = "default";
- fonts_sans = "default";
- fonts_typewriter = "default";
- fonts_math = "auto";
+ fonts_roman[0] = "default";
+ fonts_roman[1] = "default";
+ fonts_sans[0] = "default";
+ fonts_sans[1] = "default";
+ fonts_typewriter[0] = "default";
+ fonts_typewriter[1] = "default";
+ fonts_math[0] = "auto";
+ fonts_math[1] = "auto";
fonts_default_family = "default";
useNonTeXFonts = false;
fonts_expert_sc = false;
fonts_old_figures = false;
- fonts_sans_scale = 100;
- fonts_typewriter_scale = 100;
+ fonts_sans_scale[0] = 100;
+ fonts_sans_scale[1] = 100;
+ fonts_typewriter_scale[0] = 100;
+ fonts_typewriter_scale[1] = 100;
inputenc = "auto";
lang_package = "default";
graphics_driver = "default";
output_sync = false;
use_refstyle = true;
+
+ // map current author
+ author_map_[pimpl_->authorlist.get(0).bufferId()] = 0;
}
}
+void BufferParams::addAuthor(Author a)
+{
+ author_map_[a.bufferId()] = pimpl_->authorlist.record(a);
+}
+
+
BranchList & BufferParams::branchlist()
{
return pimpl_->branchlist;
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();
lex.eatLine();
fontenc = lex.getString();
} else if (token == "\\font_roman") {
- lex.eatLine();
- fonts_roman = lex.getString();
+ lex >> fonts_roman[0];
+ lex >> fonts_roman[1];
} else if (token == "\\font_sans") {
- lex.eatLine();
- fonts_sans = lex.getString();
+ lex >> fonts_sans[0];
+ lex >> fonts_sans[1];
} else if (token == "\\font_typewriter") {
- lex.eatLine();
- fonts_typewriter = lex.getString();
+ lex >> fonts_typewriter[0];
+ lex >> fonts_typewriter[1];
} else if (token == "\\font_math") {
- lex.eatLine();
- fonts_math = lex.getString();
+ lex >> fonts_math[0];
+ lex >> fonts_math[1];
} else if (token == "\\font_default_family") {
lex >> fonts_default_family;
} else if (token == "\\use_non_tex_fonts") {
} else if (token == "\\font_osf") {
lex >> fonts_old_figures;
} else if (token == "\\font_sf_scale") {
- lex >> fonts_sans_scale;
+ lex >> fonts_sans_scale[0];
+ lex >> fonts_sans_scale[1];
} else if (token == "\\font_tt_scale") {
- lex >> fonts_typewriter_scale;
+ lex >> fonts_typewriter_scale[0];
+ lex >> fonts_typewriter_scale[1];
} else if (token == "\\font_cjk") {
lex >> fonts_cjk;
} else if (token == "\\paragraph_separation") {
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;
// 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';
os << "\\language_package " << lang_package
<< "\n\\inputencoding " << inputenc
<< "\n\\fontencoding " << fontenc
- << "\n\\font_roman " << fonts_roman
- << "\n\\font_sans " << fonts_sans
- << "\n\\font_typewriter " << fonts_typewriter
- << "\n\\font_math " << fonts_math
+ << "\n\\font_roman \"" << fonts_roman[0]
+ << "\" \"" << fonts_roman[1] << '"'
+ << "\n\\font_sans \"" << fonts_sans[0]
+ << "\" \"" << fonts_sans[1] << '"'
+ << "\n\\font_typewriter \"" << fonts_typewriter[0]
+ << "\" \"" << fonts_typewriter[1] << '"'
+ << "\n\\font_math \"" << fonts_math[0]
+ << "\" \"" << fonts_math[1] << '"'
<< "\n\\font_default_family " << fonts_default_family
<< "\n\\use_non_tex_fonts " << convert<string>(useNonTeXFonts)
<< "\n\\font_sc " << convert<string>(fonts_expert_sc)
<< "\n\\font_osf " << convert<string>(fonts_old_figures)
- << "\n\\font_sf_scale " << fonts_sans_scale
- << "\n\\font_tt_scale " << fonts_typewriter_scale
+ << "\n\\font_sf_scale " << fonts_sans_scale[0]
+ << ' ' << fonts_sans_scale[1]
+ << "\n\\font_tt_scale " << fonts_typewriter_scale[0]
+ << ' ' << fonts_typewriter_scale[1]
<< '\n';
if (!fonts_cjk.empty()) {
os << "\\font_cjk " << fonts_cjk << '\n';
}
}
- 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';
}
// 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 && fonts_math != "auto")
+ if (useNonTeXFonts && fontsMath() != "auto")
features.require("unicode-math");
if (!language->requires().empty())
string const ams = features.loadAMSPackages();
bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1");
bool const use_newtxmath =
- theLaTeXFonts().getLaTeXFont(from_ascii(fonts_math)).getUsedPackage(
+ theLaTeXFonts().getLaTeXFont(from_ascii(fontsMath())).getUsedPackage(
ot1, false, false) == "newtxmath";
if ((useNonTeXFonts || use_newtxmath) && !ams.empty())
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";
// 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";
}
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{";
string format = documentClass().outputFormat();
if (format == "latex") {
if (useNonTeXFonts)
- return "xetex"; // FIXME: why not "luatex"?
+ return "xetex"; // actually "xetex or luatex"
if (encoding().package() == Encoding::japanese)
return "platex";
}
void BufferParams::writeEncodingPreamble(otexstream & os,
LaTeXFeatures & features) const
{
- // "inputenc" package not required with non-TeX fonts.
- if (useNonTeXFonts)
- return;
- // "inputenc" fails with XeTeX (even in 8-bit compatiblitly mode) and with TeX fonts,
- // (this is a bug in the "inputenc" package see #9740).
- if (features.runparams().flavor == OutputParams::XETEX)
+ // 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).
+ if (useNonTeXFonts || features.runparams().flavor == OutputParams::XETEX)
return;
- // For LuaTeX with TeX fonts, we can load
- // the "luainputenc" package with the specified encoding(s) (see below).
if (inputenc == "auto") {
string const doc_encoding =
Encoding::Package const package =
language->encoding()->package();
- // Create a list with all the input encodings used
- // in the document
- set<string> encodings =
- features.getEncodingSet(doc_encoding);
+ // Create list of inputenc options:
+ set<string> encodings;
+ // luainputenc fails with more than one encoding
+ if (!features.runparams().isFullUnicode()) // if we reach this point, this means LuaTeX with TeX fonts
+ // list all input encodings used in the document
+ encodings = features.getEncodingSet(doc_encoding);
// If the "japanese" package (i.e. pLaTeX) is used,
// inputenc must be omitted.
string const BufferParams::loadFonts(LaTeXFeatures & features) const
{
- if (fonts_roman == "default" && fonts_sans == "default"
- && fonts_typewriter == "default"
- && (fonts_math == "default" || fonts_math == "auto"))
+ if (fontsRoman() == "default" && fontsSans() == "default"
+ && fontsTypewriter() == "default"
+ && (fontsMath() == "default" || fontsMath() == "auto"))
//nothing to do
return string();
string const texmapping =
(features.runparams().flavor == OutputParams::XETEX) ?
"Mapping=tex-text" : "Ligatures=TeX";
- if (fonts_roman != "default") {
+ if (fontsRoman() != "default") {
os << "\\setmainfont[" << texmapping;
if (fonts_old_figures)
os << ",Numbers=OldStyle";
- os << "]{" << parseFontName(fonts_roman) << "}\n";
+ os << "]{" << parseFontName(fontsRoman()) << "}\n";
}
- if (fonts_sans != "default") {
- string const sans = parseFontName(fonts_sans);
- if (fonts_sans_scale != 100)
+ if (fontsSans() != "default") {
+ string const sans = parseFontName(fontsSans());
+ if (fontsSansScale() != 100)
os << "\\setsansfont[Scale="
- << float(fonts_sans_scale) / 100
+ << float(fontsSansScale()) / 100
<< "," << texmapping << "]{"
<< sans << "}\n";
else
os << "\\setsansfont[" << texmapping << "]{"
<< sans << "}\n";
}
- if (fonts_typewriter != "default") {
- string const mono = parseFontName(fonts_typewriter);
- if (fonts_typewriter_scale != 100)
+ if (fontsTypewriter() != "default") {
+ string const mono = parseFontName(fontsTypewriter());
+ if (fontsTypewriterScale() != 100)
os << "\\setmonofont[Scale="
- << float(fonts_typewriter_scale) / 100
+ << float(fontsTypewriterScale()) / 100
<< "]{"
<< mono << "}\n";
else
// Tex Fonts
bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1");
bool const dryrun = features.runparams().dryrun;
- bool const complete = (fonts_sans == "default" && fonts_typewriter == "default");
- bool const nomath = (fonts_math == "default");
+ bool const complete = (fontsSans() == "default" && fontsTypewriter() == "default");
+ bool const nomath = (fontsMath() == "default");
// ROMAN FONTS
- os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_roman)).getLaTeXCode(
+ os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsRoman())).getLaTeXCode(
dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
nomath);
// SANS SERIF
- os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_sans)).getLaTeXCode(
+ os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsSans())).getLaTeXCode(
dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
- nomath, fonts_sans_scale);
+ nomath, fontsSansScale());
// MONOSPACED/TYPEWRITER
- os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_typewriter)).getLaTeXCode(
+ os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsTypewriter())).getLaTeXCode(
dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
- nomath, fonts_typewriter_scale);
+ nomath, fontsTypewriterScale());
// MATH
- os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_math)).getLaTeXCode(
+ os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsMath())).getLaTeXCode(
dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
nomath);
Encoding const & BufferParams::encoding() const
{
- // FIXME: additionally, we must check for runparams().flavor == XeTeX
- // or runparams.isFullUnicode() to care for the combination
- // of XeTeX and TeX-fonts (see #9740).
- // Currently, we reset the encoding in Buffer::makeLaTeXFile
- // (for export) and Buffer::writeLaTeXSource (for preview).
+ // 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")