Fixes output for 3 of the 4 test lyx-files.
Includes "FIXME"s at places where further action is required to get the XeTeX
export right but I don't know how.
{
OutputParams runparams = runparams_in;
{
OutputParams runparams = runparams_in;
- // This is necessary for LuaTeX/XeTeX with tex fonts.
- // See FIXME in BufferParams::encoding()
- if (runparams.isFullUnicode())
- runparams.encoding = encodings.fromLyXName("utf8-plain");
+ // XeTeX with TeX fonts is only safe with ASCII encoding,
+ // See #9740 and FIXME in BufferParams::encoding()
+ if (params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+ runparams.encoding = encodings.fromLyXName("ascii");
string const encoding = runparams.encoding->iconvName();
LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << ", fname=" << fname.realPath());
string const encoding = runparams.encoding->iconvName();
LYXERR(Debug::LATEX, "makeLaTeXFile encoding: " << encoding << ", fname=" << fname.realPath());
OutputParams runparams = runparams_in;
OutputParams runparams = runparams_in;
- // This is necessary for LuaTeX/XeTeX with tex fonts.
- // See FIXME in BufferParams::encoding()
- if (runparams.isFullUnicode())
- runparams.encoding = encodings.fromLyXName("utf8-plain");
+ // XeTeX with TeX fonts is only safe with ASCII encoding,
+ // See #9740 and FIXME in BufferParams::encoding()
+ if (params().useNonTeXFonts && (runparams.flavor == OutputParams::XETEX))
+ runparams.encoding = encodings.fromLyXName("ascii");
// If we are compiling a file standalone, even if this is the
// child of some other buffer, let's cut the link here, so the
// If we are compiling a file standalone, even if this is the
// child of some other buffer, let's cut the link here, so the
string format = documentClass().outputFormat();
if (format == "latex") {
if (useNonTeXFonts)
string format = documentClass().outputFormat();
if (format == "latex") {
if (useNonTeXFonts)
+ return "xetex"; // FIXME: why not "luatex"?
if (encoding().package() == Encoding::japanese)
return "platex";
}
if (encoding().package() == Encoding::japanese)
return "platex";
}
void BufferParams::writeEncodingPreamble(otexstream & os,
LaTeXFeatures & features) const
{
void BufferParams::writeEncodingPreamble(otexstream & os,
LaTeXFeatures & features) const
{
- // XeTeX does not need this
- if (features.runparams().flavor == OutputParams::XETEX)
+ // "inputenc" package not required with non-TeX fonts.
+ if (useNonTeXFonts)
- // LuaTeX neither, but with tex fonts, we need to load
- // the luainputenc package.
- if (features.runparams().flavor == OutputParams::LUATEX
- || features.runparams().flavor == OutputParams::DVILUATEX) {
- if (!useNonTeXFonts && inputenc != "default"
- && ((inputenc == "auto" && language->encoding()->package() == Encoding::inputenc)
- || (inputenc != "auto" && encoding().package() == Encoding::inputenc))) {
- os << "\\usepackage[utf8]{luainputenc}\n";
- }
+ // "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)
+ // 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 =
language->encoding()->latexName();
if (inputenc == "auto") {
string const doc_encoding =
language->encoding()->latexName();
os << ',';
os << from_ascii(doc_encoding);
}
os << ',';
os << from_ascii(doc_encoding);
}
+ if (features.runparams().flavor == OutputParams::LUATEX
+ || features.runparams().flavor == OutputParams::DVILUATEX)
+ os << "]{luainputenc}\n";
+ else
+ os << "]{inputenc}\n";
}
if (package == Encoding::CJK || features.mustProvide("CJK")) {
if (language->encoding()->name() == "utf8-cjk"
}
if (package == Encoding::CJK || features.mustProvide("CJK")) {
if (language->encoding()->name() == "utf8-cjk"
if (features.isRequired("japanese")
|| features.isProvided("inputenc"))
break;
if (features.isRequired("japanese")
|| features.isProvided("inputenc"))
break;
- os << "\\usepackage[" << from_ascii(encoding().latexName())
- << "]{inputenc}\n";
+ os << "\\usepackage[" << from_ascii(encoding().latexName());
+ if (features.runparams().flavor == OutputParams::LUATEX
+ || features.runparams().flavor == OutputParams::DVILUATEX)
+ os << "]{luainputenc}\n";
+ else
+ os << "]{inputenc}\n";
break;
case Encoding::CJK:
if (encoding().name() == "utf8-cjk"
break;
case Encoding::CJK:
if (encoding().name() == "utf8-cjk"
Encoding const & BufferParams::encoding() const
{
Encoding const & BufferParams::encoding() const
{
- // FIXME: actually, we should check for the flavor
- // or runparams.isFullyUnicode() here:
- // This check will not work with XeTeX/LuaTeX and tex fonts.
- // Thus we have to reset the encoding in Buffer::makeLaTeXFile
+ // 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).
if (useNonTeXFonts)
return *(encodings.fromLyXName("utf8-plain"));
// (for export) and Buffer::writeLaTeXSource (for preview).
if (useNonTeXFonts)
return *(encodings.fromLyXName("utf8-plain"));
// hyperref expects utf8!
if (need_unicode && enc && enc->iconvName() != "UTF-8"
// hyperref expects utf8!
if (need_unicode && enc && enc->iconvName() != "UTF-8"
- &&!runparams.isFullUnicode()) {
+ &&!runparams.isFullUnicode()) { // FIXME: check must be done for useNonTeXFonts!
os << "\\inputencoding{utf8}\n"
<< setEncoding("UTF-8");
}
os << "\\inputencoding{utf8}\n"
<< setEncoding("UTF-8");
}
os << from_utf8(opt);
if (need_unicode && enc && enc->iconvName() != "UTF-8"
os << from_utf8(opt);
if (need_unicode && enc && enc->iconvName() != "UTF-8"
- &&!runparams.isFullUnicode()) {
+ &&!runparams.isFullUnicode()) { // FIXME: check for useNonTeXFonts!
os << setEncoding(enc->iconvName())
<< "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n";
}
os << setEncoding(enc->iconvName())
<< "\\inputencoding{" << from_ascii(enc->latexName()) << "}\n";
}
if (allowcust && d->endTeXParParams(bparams, os, runparams)
&& runparams.encoding != prev_encoding) {
runparams.encoding = prev_encoding;
if (allowcust && d->endTeXParParams(bparams, os, runparams)
&& runparams.encoding != prev_encoding) {
runparams.encoding = prev_encoding;
- if (!runparams.isFullUnicode())
+ if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
os << setEncoding(prev_encoding->iconvName());
}
os << setEncoding(prev_encoding->iconvName());
}
state->prev_env_language_ = data.par_language;
if (runparams.encoding != data.prev_encoding) {
runparams.encoding = data.prev_encoding;
state->prev_env_language_ = data.par_language;
if (runparams.encoding != data.prev_encoding) {
runparams.encoding = data.prev_encoding;
- if (!runparams.isFullUnicode())
+ if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
os << setEncoding(data.prev_encoding->iconvName());
}
}
os << setEncoding(data.prev_encoding->iconvName());
}
}
state->prev_env_language_ = data.par_language;
if (runparams.encoding != data.prev_encoding) {
runparams.encoding = data.prev_encoding;
state->prev_env_language_ = data.par_language;
if (runparams.encoding != data.prev_encoding) {
runparams.encoding = data.prev_encoding;
- if (!runparams.isFullUnicode())
+ if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
os << setEncoding(data.prev_encoding->iconvName());
}
}
os << setEncoding(data.prev_encoding->iconvName());
}
}
latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
if (runparams.encoding != prev_encoding) {
runparams.encoding = prev_encoding;
latexArgInsets(par, os, runparams, style.postcommandargs(), "post:");
if (runparams.encoding != prev_encoding) {
runparams.encoding = prev_encoding;
- if (!runparams.isFullUnicode())
+ if (!runparams.isFullUnicode()) // FIXME: test for UseTeXFonts
os << setEncoding(prev_encoding->iconvName());
}
}
os << setEncoding(prev_encoding->iconvName());
}
}
// If this is the last paragraph, and a local_font was set upon entering
// the inset, and we're using "auto" or "default" encoding, the encoding
// should be set back to that local_font's encoding.
// If this is the last paragraph, and a local_font was set upon entering
// the inset, and we're using "auto" or "default" encoding, the encoding
// should be set back to that local_font's encoding.
- // However, do not change the encoding when a fully unicode aware backend
- // such as XeTeX is used.
+ // However, do not change the encoding when non-TeX fonts are used.
if (runparams.isLastPar && runparams_in.local_font != 0
&& runparams_in.encoding != runparams_in.local_font->language()->encoding()
&& (bparams.inputenc == "auto" || bparams.inputenc == "default")
if (runparams.isLastPar && runparams_in.local_font != 0
&& runparams_in.encoding != runparams_in.local_font->language()->encoding()
&& (bparams.inputenc == "auto" || bparams.inputenc == "default")
- && (!runparams.isFullUnicode())) {
+ && (!runparams.isFullUnicode())) { // FIXME: test for UseTeXFonts
runparams_in.encoding = runparams_in.local_font->language()->encoding();
os << setEncoding(runparams_in.encoding->iconvName());
}
runparams_in.encoding = runparams_in.local_font->language()->encoding();
os << setEncoding(runparams_in.encoding->iconvName());
}