commit da23637d7f50aaa697a92f6051cd48dd1f97e380
Author: Günter Milde <[email protected]>
Date: Thu Apr 11 18:19:44 2019 +0200
Do not switch the input encoding inside documents using platex.
Fixes wrong and missing characters in text parts in other languages
(platex does not support "inputenc").
Fixes compilation errors due to desynchronized encoding switches.
---
autotests/export/latex/ja_wrong_auto_encoding.lyx | 43 ++-----------------
development/autotests/ignoredTests | 3 +-
development/autotests/invertedTests | 2 -
.../ja/Multilingual_Typesetting_%28platex%29.lyx | 31 ++++----------
src/BufferParams.cpp | 6 +-
src/LaTeXFeatures.cpp | 5 +-
src/insets/InsetListings.cpp | 3 +-
src/output_latex.cpp | 44 ++++++++++---------
8 files changed, 45 insertions(+), 92 deletions(-)
diff --git a/autotests/export/latex/ja_wrong_auto_encoding.lyx
b/autotests/export/latex/ja_wrong_auto_encoding.lyx
index f75dc4f..a3a4db9 100644
--- a/autotests/export/latex/ja_wrong_auto_encoding.lyx
+++ b/autotests/export/latex/ja_wrong_auto_encoding.lyx
@@ -1,47 +1,12 @@
#LyX 2.4 created this file. For more info see https://www.lyx.org/
-\lyxformat 569
+\lyxformat 572
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass scrbook
\begin_preamble
-% DO NOT ALTER THIS PREAMBLE!!!
-%
-% This preamble is designed to ensure that the manual prints
-% out as advertised. If you mess with this preamble,
-% parts of the manual may not print out as expected. If you
-% have problems LaTeXing this file, please contact
-% the documentation team
-% email: [email protected]
-\IfFileExists{pxjahyper.sty}
-{\usepackage{pxjahyper}}
-
-% if pdflatex is used
-\usepackage{ifpdf}
-\ifpdf
-
- % set fonts for nicer pdf view
- \IfFileExists{lmodern.sty}
- {\usepackage{lmodern}}{}
-
-\fi % end if pdflatex is used
-
-% the pages of the TOC are numbered roman
-% and a PDF-bookmark for the TOC is added
-\pagenumbering{roman}
-\let\myTOC\tableofcontents
-\renewcommand{\tableofcontents}{%
- \pdfbookmark[1]{\contentsname}{}
- \myTOC
- \cleardoublepage
- \pagenumbering{arabic}}
-
-% extra space for tables
-\newcommand{\extratablespace}[1]{\noalign{\vskip#1}}
-
-\usepackage{t1enc}
\end_preamble
\options
bibliography=totoc,index=totoc,BCOR7.5mm,titlepage,captions=tableheading
\use_default_options false
@@ -99,8 +64,8 @@ End
\language_package default
\inputencoding auto
\fontencoding auto
-\font_roman "default" "default"
-\font_sans "default" "default"
+\font_roman "lmodern" "IPAexGothic"
+\font_sans "default" "IPAexMincho"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
@@ -116,6 +81,8 @@ End
\output_sync 0
\bibtex_command default
\index_command default
+\float_placement class
+\float_alignment class
\paperfontsize 12
\spacing single
\use_hyperref true
diff --git a/development/autotests/ignoredTests
b/development/autotests/ignoredTests
index bef23a9..e1eda0e 100644
--- a/development/autotests/ignoredTests
+++ b/development/autotests/ignoredTests
@@ -61,6 +61,7 @@
export/examples/Modules/Chessboard_(lyx(16|20|21|22|23)|(pdf3|pdf5|dvi3)_texF)
# 1. Exceptions to the following pattern (test cases with the right encoding):
!export/.*(utf8|ascii)_pdf4_texF
!export/examples/(|ar|ca|cs|da|de|el|es|eu|fa|fr|gl|he|hu|id|it|ja|ko|nb|nl|pl|pt|pt_BR|pt_PT|ro|ru|sk|sl|sr|sv|uk|zh_CN)/Welcome_pdf4_texF
+!export/examples/ja/Multilingual_Typesetting_.*CJK.*_pdf4_texF
# 2. Catchall patterns to ignore the other tests:
.*_pdf4_texF
export/(doc|examples|templates)/(|ar|ca|cs|da|de|el|es|eu|fa|fr|gl|he|hu|id|it|ja|ko|nb|nl|pl|pt|pt_BR|pt_PT|ro|ru|sk|sl|sr|sv|uk|zh_CN)/.*pdf4_texF
@@ -82,7 +83,7 @@ export/examples/ja/Modules/Sweave.*
#
# Other Japanese documents use language "japanese" wich is tied to "platex"
# (automatically invoked instead of "latex" to create a DVI file).
-# Export by other engines works with language "japanese-cjk", e.g.
+# Export by plain- and pdflatex engines works with language "japanese-cjk",
e.g.
!export/examples/ja/Multilingual_Typesetting_.*CJK.*
# For a discussion of alternatives for Japanese with LaTeX , see also
#
http://www.preining.info/blog/2014/12/writing-japanese-in-latex-part-1-introduction/
diff --git a/development/autotests/invertedTests
b/development/autotests/invertedTests
index 0fbaa13..40e2afc 100644
--- a/development/autotests/invertedTests
+++ b/development/autotests/invertedTests
@@ -188,8 +188,6 @@ export/doc/ar/UserGuide_lyx(22|23)
#11532 inputencoding desynchronisation
export/export/latex/misplaced-inputenc-switch_pdf2
-# Error in Japanese document if LyX-logo is preceded by foreign language text
-export/export/latex/ja_wrong_auto_encoding_(dvi|pdf(|3)).*
# ==============================================================
diff --git a/lib/examples/ja/Multilingual_Typesetting_%28platex%29.lyx
b/lib/examples/ja/Multilingual_Typesetting_%28platex%29.lyx
index 212228b..cb4af5a 100644
--- a/lib/examples/ja/Multilingual_Typesetting_%28platex%29.lyx
+++ b/lib/examples/ja/Multilingual_Typesetting_%28platex%29.lyx
@@ -125,7 +125,15 @@ Russisch: Привет с
\begin_layout Standard
Text in some other languages with correct language setting (not all languages
- supported by LyX are compatible with pLaTeX):
+ supported by LyX are compatible with pLaTeX, try
+\begin_inset Quotes eld
+\end_inset
+
+japanese (CJK)
+\begin_inset Quotes erd
+\end_inset
+
+):
\end_layout
\begin_layout Standard
@@ -143,27 +151,6 @@ Afrikaans: Good dag minher.
\begin_layout Standard
-\emph on
-Missing and wrong characters with
-\emph default
-Language\SpecialChar menuseparator
-Encoding
-\begin_inset Quotes eld
-\end_inset
-
-language default
-\emph on
-
-\begin_inset Quotes erd
-\end_inset
-
-
-\emph default
-:
-\end_layout
-
-\begin_layout Standard
-
\lang swedish
Swedish: Hej då.
\end_layout
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index aee184c..c0f8a60 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -3259,9 +3259,9 @@ void BufferParams::writeEncodingPreamble(otexstream & os,
// 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/[email protected]/msg129680.html
+ // The "japanese" babel-language requires the pLaTeX engine
+ // which conflicts with "inputenc".
+ // See
http://www.mail-archive.com/[email protected]/msg129680.html
if ((!encoding_set.empty() || package == Encoding::inputenc)
&& !features.isRequired("japanese")
&& !features.isProvided("inputenc")) {
diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp
index bed11de..301d3c1 100644
--- a/src/LaTeXFeatures.cpp
+++ b/src/LaTeXFeatures.cpp
@@ -747,7 +747,7 @@ void LaTeXFeatures::useLanguage(Language const * lang)
// They use the CJK package
if (lang->encoding()->package() == Encoding::CJK)
require("CJK");
- // japanese package is special
+ // japanese babel language is special (tied to the pLaTeX engine).
if (lang->encoding()->package() == Encoding::japanese)
require("japanese");
}
@@ -879,8 +879,7 @@ set<string> LaTeXFeatures::getEncodingSet(string const &
doc_encoding) const
set<string> encs;
for (auto const & lang : UsedLanguages_)
if (lang->encoding()->latexName() != doc_encoding &&
- (lang->encoding()->package() == Encoding::inputenc
- || lang->encoding()->package() == Encoding::japanese))
+ lang->encoding()->package() == Encoding::inputenc)
encs.insert(lang->encoding()->latexName());
return encs;
}
diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp
index b50e926..8ff6108 100644
--- a/src/insets/InsetListings.cpp
+++ b/src/insets/InsetListings.cpp
@@ -127,8 +127,7 @@ Encoding const * InsetListings::forcedEncoding(Encoding
const * inner_enc,
// Minted can deal with all encodings.
if (buffer().params().use_minted
|| inner_enc->name() == "utf8-plain"
- || (buffer().params().encoding().package() == Encoding::japanese
- && inner_enc->package() == Encoding::japanese)
+ || buffer().params().encoding().package() == Encoding::japanese
|| inner_enc->hasFixedWidth())
return 0;
diff --git a/src/output_latex.cpp b/src/output_latex.cpp
index dacfa7f..80af664 100644
--- a/src/output_latex.cpp
+++ b/src/output_latex.cpp
@@ -984,6 +984,7 @@ void TeXOnePar(Buffer const & buf,
// \inputencoding command; the encoding switch will occur when necessary
if (bparams.inputenc == "auto"
&& !runparams.isFullUnicode() // Xe/LuaTeX use one
document-wide encoding (see also switchEncoding())
+ && runparams.encoding->package() != Encoding::japanese
&& runparams.encoding->package() != Encoding::none) {
// Look ahead for future encoding changes.
// We try to output them at the beginning of the paragraph,
@@ -1627,39 +1628,41 @@ void latexParagraphs(Buffer const & buf,
}
}
-
+// Switch the input encoding for some part(s) of the document.
pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
OutputParams const & runparams, Encoding const & newEnc,
bool force, bool noswitchmacro)
{
- // Never switch encoding with non-TeX fonts (always "utf8plain") or
- // with LuaTeX and TeX fonts (only one encoding accepted by
luainputenc).
+ // Never switch encoding with non-TeX fonts (always "utf8plain"),
+ // with LuaTeX and TeX fonts (only one encoding accepted by
luainputenc),
+ // or if we're in a moving argument or inherit the outer encoding.
if (bparams.useNonTeXFonts
|| runparams.flavor == OutputParams::LUATEX
|| runparams.flavor == OutputParams::DVILUATEX
|| newEnc.name() == "inherit")
return make_pair(false, 0);
- Encoding const & oldEnc = *runparams.encoding;
- bool moving_arg = runparams.moving_arg;
- if (!force
- && ((bparams.inputenc != "auto" && bparams.inputenc != "default")
|| moving_arg))
+ // Only switch for auto-selected legacy encodings (inputenc setting
+ // "auto" or "default").
+ // The "listings" environment can force a switch also with other
+ // encoding settings (it does not support variable width encodings
+ // (utf8, jis, ...) under 8-bit latex engines).
+ if (!force && ((bparams.inputenc != "auto" && bparams.inputenc !=
"default")
+ || runparams.moving_arg))
return make_pair(false, 0);
- // Do nothing if the encoding is unchanged.
- if (oldEnc.name() == newEnc.name())
+ Encoding const & oldEnc = *runparams.encoding;
+ // Do not switch, if the encoding is unchanged or switching is not
supported.
+ if (oldEnc.name() == newEnc.name()
+ || oldEnc.package() == Encoding::japanese
+ || oldEnc.package() == Encoding::none
+ || newEnc.package() == Encoding::none)
return make_pair(false, 0);
-
// FIXME We ignore encoding switches from/to encodings that do
// neither support the inputenc package nor the CJK package here.
- // This does of course only work in special cases (e.g. switch from
- // tis620-0 to latin1, but the text in latin1 contains ASCII only),
- // but it is the best we can do
- //
- // 2019-01-08 Possibly no longer required since tis620-0 is supported
- // by inputenc (but check special encodings "utf8-plain" and "default").
- if (oldEnc.package() == Encoding::none || newEnc.package() ==
Encoding::none)
- return make_pair(false, 0);
+ // This may fail for characters not supported by "unicodesymbols"
+ // or for non-ASCII characters in "listings"
+ // but it is the best we can do.
// change encoding
LYXERR(Debug::LATEX, "Changing LaTeX encoding from "
@@ -1673,7 +1676,7 @@ pair<bool, int> switchEncoding(odocstream & os,
BufferParams const & bparams,
switch (newEnc.package()) {
case Encoding::none:
case Encoding::japanese:
- // shouldn't ever reach here, see above
+ // shouldn't ever reach here (see above) but avoids
warning.
return make_pair(true, 0);
case Encoding::inputenc: {
int count = inputenc_arg.length();
@@ -1698,8 +1701,7 @@ pair<bool, int> switchEncoding(odocstream & os,
BufferParams const & bparams,
count += 7;
state->open_encoding_ = inputenc;
}
- // with the japanese option, inputenc is omitted.
- if (runparams.use_japanese || noswitchmacro)
+ if (noswitchmacro)
return make_pair(true, count);
os << "\\inputencoding{" << inputenc_arg << '}';
return make_pair(true, count + 16);