};
-
namespace lyx {
+// XeTeX with TeX fonts:
+// run in 8-bit emulation mode and trick `inputenc` into working with XeTeX
+static docstring const xetex_pre_inputenc = from_ascii(
+ "\\XeTeXinputencoding \"bytes\" % current file\n"
+ "\\XeTeXdefaultencoding \"bytes\" % included files\n"
+ "\\makeatletter\n"
+ "\\let\\origUmathchar\\Umathchar\n"
+ "\\let\\Umathchar\\@undefined\n");
+static docstring const xetex_post_inputenc = from_ascii(
+ "\\let\\Umathchar\\origUmathchar\n"
+ "\\makeatother\n");
+
// Local translators
namespace {
string dir = document_dir.absFileName();
- for (int i = 0; i < 2; ++i) {
+ for (int i = 0; i < 3; ++i) {
dir = addPath(dir, "..");
if (!fileSearch(dir, "configure.py").empty() &&
!fileSearch(dir, "chkconfig.ltx").empty()) {
fonts_sans_scale[1] = 100;
fonts_typewriter_scale[0] = 100;
fonts_typewriter_scale[1] = 100;
- inputenc = "auto";
+ inputenc = "utf8";
lang_package = "default";
graphics_driver = "default";
default_output_format = "default";
columns = 1;
listings_params = string();
pagestyle = "default";
+ tablestyle = "default";
suppress_date = false;
justification = true;
// no color is the default (white)
output_sync = false;
use_refstyle = true;
use_minted = false;
+ use_lineno = false;
// map current author
author_map_[pimpl_->authorlist.get(0).bufferId()] = 0;
sides = sidestranslator().find(psides);
} else if (token == "\\paperpagestyle") {
lex >> pagestyle;
+ } else if (token == "\\tablestyle") {
+ lex >> tablestyle;
} else if (token == "\\bullet") {
readBullets(lex);
} else if (token == "\\bulletLaTeX") {
lex >> use_refstyle;
} else if (token == "\\use_minted") {
lex >> use_minted;
+ } else if (token == "\\use_lineno") {
+ lex >> use_lineno;
+ } else if (token == "\\lineno_options") {
+ lex.eatLine();
+ lineno_opts = trim(lex.getString());
} else {
lyxerr << "BufferParams::readToken(): Unknown token: " <<
token << endl;
<< "\n\\justification " << convert<string>(justification)
<< "\n\\use_refstyle " << use_refstyle
<< "\n\\use_minted " << use_minted
+ << "\n\\use_lineno " << use_lineno
<< '\n';
+
+ if (!lineno_opts.empty())
+ os << "\\lineno_options " << lineno_opts << '\n';
+
if (isbackgroundcolor == true)
os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n';
if (isfontcolor == true)
<< "\n\\dynamic_quotes " << dynamic_quotes
<< "\n\\papercolumns " << columns
<< "\n\\papersides " << sides
- << "\n\\paperpagestyle " << pagestyle << '\n';
+ << "\n\\paperpagestyle " << pagestyle
+ << "\n\\tablestyle " << tablestyle << '\n';
if (!listings_params.empty())
os << "\\listings_params \"" <<
InsetListingsParams(listings_params).encodedString() << "\"\n";
language_options << ',';
language_options << language->babel();
}
- if (global && !features.needBabelLangOptions()
- && !language_options.str().empty())
+ if (global && !language_options.str().empty())
clsoptions << language_options.str() << ',';
}
<< from_ascii(fonts_default_family) << "}\n";
// set font encoding
- // XeTeX and LuaTeX (with OS fonts) do not need fontenc
+ // non-TeX fonts use font encoding TU (set by fontspec)
if (!useNonTeXFonts && !features.isProvided("fontenc")
&& main_font_encoding() != "default") {
// get main font encodings
vector<string> fontencs = font_encodings();
// get font encodings of secondary languages
+ // FIXME: some languages (hebrew, ...) assume a standard font encoding as last
+ // option (for text in other languages).
features.getFontEncodings(fontencs);
if (!fontencs.empty()) {
os << "\\usepackage["
}
}
+ // Load textcomp and pmboxdraw before (lua)inputenc (#11454)
+ if (features.mustProvide("textcomp"))
+ os << "\\usepackage{textcomp}\n";
+ if (features.mustProvide("pmboxdraw"))
+ os << "\\usepackage{pmboxdraw}\n";
+
// handle inputenc etc.
- writeEncodingPreamble(os, features);
+ // (In documents containing text in Thai language,
+ // we must load inputenc after babel, see lib/languages).
+ if (!contains(features.getBabelPostsettings(), from_ascii("thai.ldf")))
+ writeEncodingPreamble(os, features);
// includeonly
if (!features.runparams().includeall && !included_children_.empty()) {
os << features.getBabelPresettings();
// FIXME UNICODE
os << from_utf8(babelCall(language_options.str(),
- features.needBabelLangOptions())) + '\n';
+ !lyxrc.language_global_options)) + '\n';
os << features.getBabelPostsettings();
}
// hyperref loads this automatically
os << "\\usepackage{nameref}\n";
+ if (use_lineno){
+ os << "\\usepackage";
+ if (!lineno_opts.empty())
+ os << "[" << lineno_opts << "]";
+ os << "{lineno}\n";
+ os << "\\linenumbers\n";
+ }
+
// bibtopic needs to be loaded after hyperref.
// the dot provides the aux file naming which LyX can detect.
if (features.mustProvide("bibtopic"))
os << features.getBabelPresettings();
// FIXME UNICODE
os << from_utf8(babelCall(language_options.str(),
- features.needBabelLangOptions())) + '\n';
+ !lyxrc.language_global_options)) + '\n';
os << features.getBabelPostsettings();
}
+ // In documents containing text in Thai language,
+ // we must load inputenc after babel (see lib/languages).
+ if (contains(features.getBabelPostsettings(), from_ascii("thai.ldf")))
+ writeEncodingPreamble(os, features);
+
if (features.isRequired("bicaption"))
os << "\\usepackage{bicaption}\n";
if (!listings_params.empty()
// esint and the other packages that provide special glyphs
if (features.mustProvide("tipa") && useNonTeXFonts
&& !features.isProvided("xunicode")) {
- // The package officially only supports XeTeX, but also works
- // with LuaTeX. Thus we work around its XeTeX test.
+ // The `xunicode` package officially only supports XeTeX,
+ // but also works with LuaTeX. We work around its XeTeX test.
if (features.runparams().flavor != OutputParams::XETEX) {
os << "% Pretend to xunicode that we are XeTeX\n"
<< "\\def\\XeTeXpicfile{}\n";
}
// ... but before biblatex (see #7065)
- if (features.mustProvide("biblatex")
+ if ((features.mustProvide("biblatex")
+ || features.isRequired("biblatex-chicago"))
+ && !features.isProvided("biblatex-chicago")
&& !features.isProvided("biblatex-natbib")
&& !features.isProvided("natbib-internal")
&& !features.isProvided("natbib")
&& !features.isProvided("jurabib")) {
+ // The biblatex-chicago package has a differing interface
+ // it uses a wrapper package and loads styles via fixed options
+ bool const chicago = features.isRequired("biblatex-chicago");
string delim = "";
string opts;
os << "\\usepackage";
if (!biblatex_bibstyle.empty()
- && (biblatex_bibstyle == biblatex_citestyle)) {
+ && (biblatex_bibstyle == biblatex_citestyle)
+ && !chicago) {
opts = "style=" + biblatex_bibstyle;
delim = ",";
- } else {
+ } else if (!chicago) {
if (!biblatex_bibstyle.empty()) {
opts = "bibstyle=" + biblatex_bibstyle;
delim = ",";
opts += delim + biblio_opts;
if (!opts.empty())
os << "[" << opts << "]";
- os << "{biblatex}\n";
+ if (chicago)
+ os << "{biblatex-chicago}\n";
+ else
+ os << "{biblatex}\n";
}
sides = tclass.sides();
columns = tclass.columns();
pagestyle = tclass.pagestyle();
+ tablestyle = tclass.tablestyle();
use_default_options = true;
// Only if class has a ToC hierarchy
if (tclass.hasTocLevels()) {
return sides == tclass.sides()
&& columns == tclass.columns()
&& pagestyle == tclass.pagestyle()
+ && tablestyle == tclass.tablestyle()
&& use_default_options
&& secnumdepth == tclass.secnumdepth()
&& tocdepth == tclass.tocdepth();
if (useNonTeXFonts) {
excludes.insert("latex");
excludes.insert("pdflatex");
- }
- FormatList result =
- theConverters().getReachable(backs[0], only_viewable, true, excludes);
+ } else if (inputenc != "ascii" && inputenc != "utf8"
+ && inputenc != "utf8x" && inputenc != "utf8-plain")
+ // XeTeX with TeX fonts requires input encoding ascii or utf8
+ // (https://www.tug.org/pipermail/xetex/2010-April/016452.html).
+ excludes.insert("xetex");
+ FormatList result = theConverters().getReachable(backs[0], only_viewable,
+ true, excludes);
for (vector<string>::const_iterator it = backs.begin() + 1;
it != backs.end(); ++it) {
FormatList r = theConverters().getReachable(*it, only_viewable,
- false, excludes);
+ false, excludes);
result.insert(result.end(), r.begin(), r.end());
}
sort(result.begin(), result.end(), Format::formatSorter);
v.push_back("pdflatex");
v.push_back("latex");
}
- v.push_back("xetex");
+ if (useNonTeXFonts || inputenc == "ascii" || inputenc == "utf8"
+ || inputenc == "utf8x" || inputenc == "utf8-plain")
+ v.push_back("xetex");
v.push_back("luatex");
v.push_back("dviluatex");
}
// other languages are used (lang_opts is then empty)
if (lang_opts.empty())
return string();
- // either a specific language (AsBabelOptions setting in
- // lib/languages) or the prefs require the languages to
+ // The prefs may require the languages to
// be submitted to babel itself (not the class).
if (langoptions)
return "\\usepackage[" + lang_opts + "]{babel}";
void BufferParams::writeEncodingPreamble(otexstream & os,
LaTeXFeatures & features) const
{
- // 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 (see Buffer.cpp),
- // for LuaTeX, we load "luainputenc" (see below).
- if (useNonTeXFonts || features.runparams().flavor == OutputParams::XETEX)
+ // With no-TeX fonts we use utf8-plain without encoding package.
+ if (useNonTeXFonts)
return;
- if (inputenc == "auto") {
+ if (inputenc == "auto-legacy") {
string const doc_encoding =
language->encoding()->latexName();
Encoding::Package const package =
// Create list of inputenc options:
set<string> encoding_set;
// luainputenc fails with more than one encoding
- if (!features.runparams().isFullUnicode()) // if we reach this point, this means LuaTeX with TeX fonts
+ if (features.runparams().flavor != OutputParams::LUATEX
+ && features.runparams().flavor != OutputParams::DVILUATEX)
// list all input encodings used in the document
encoding_set = features.getEncodingSet(doc_encoding);
- // If the "japanese" package (i.e. pLaTeX) is used,
- // inputenc must be omitted.
- // see http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html
+ // The "japanese" babel-language requires the pLaTeX engine
+ // which conflicts with "inputenc".
+ // See http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html
if ((!encoding_set.empty() || package == Encoding::inputenc)
&& !features.isRequired("japanese")
&& !features.isProvided("inputenc")) {
else
os << "]{inputenc}\n";
}
- } else if (inputenc != "default") {
+ } else if (inputenc != "auto-legacy-plain") {
switch (encoding().package()) {
case Encoding::none:
case Encoding::CJK:
case Encoding::japanese:
- if (encoding().iconvName() != "UTF-8")
+ if (encoding().iconvName() != "UTF-8"
+ && !features.runparams().isFullUnicode())
// don't default to [utf8]{inputenc} with TeXLive >= 18
os << "\\ifdefined\\UseRawInputEncoding\n"
<< " \\UseRawInputEncoding\\fi\n";
if (features.isRequired("japanese")
|| features.isProvided("inputenc"))
break;
+ if (features.runparams().flavor == OutputParams::XETEX)
+ os << xetex_pre_inputenc;
os << "\\usepackage[" << from_ascii(encoding().latexName());
if (features.runparams().flavor == OutputParams::LUATEX
|| features.runparams().flavor == OutputParams::DVILUATEX)
os << "]{luainputenc}\n";
else
os << "]{inputenc}\n";
+ if (features.runparams().flavor == OutputParams::XETEX)
+ os << xetex_post_inputenc;
break;
}
}
- if (inputenc == "default" or features.isRequired("japanese")) {
+ if (inputenc == "auto-legacy-plain" || features.isRequired("japanese")) {
// don't default to [utf8]{inputenc} with TeXLive >= 18
os << "\\ifdefined\\UseRawInputEncoding\n";
os << " \\UseRawInputEncoding\\fi\n";
Encoding const & BufferParams::encoding() const
{
// 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")
+ if (inputenc == "auto-legacy" || inputenc == "auto-legacy-plain")
return *language->encoding();
+ if (inputenc == "utf8" && language->lang() == "japanese")
+ return *(encodings.fromLyXName("utf8-platex"));
Encoding const * const enc = encodings.fromLyXName(inputenc);
if (enc)
return *enc;
setBaseClass(doc_class);
}
+
+void BufferParams::setBibFileEncoding(string const & file, string const & enc)
+{
+ bib_encodings[file] = enc;
+}
+
+
+string const BufferParams::bibFileEncoding(string const & file) const
+{
+ if (bib_encodings.find(file) == bib_encodings.end())
+ return string();
+ return bib_encodings.find(file)->second;
+}
+
+
+
} // namespace lyx