From 11c96f913f2168de1ffc52f9351965324b69cbe6 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sun, 26 May 2019 09:56:34 +0200 Subject: [PATCH] Supplement the fix for bug #11586 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The mhchem \ce inset is a text mode environment but allows entering spaces and mathmode commands. However, even if it doesn't allow unicode symbols, LyX allows entering them (by copy/paste, for example), causing latex errors. As a unicode symbol may have a proper latex representation from the unicodesymbols file, use it instead of the bare symbol. Here, we don't care about the mode because both text and math mode should be allowed. For example, the ⟶ symbol is not recognized but its latex representation (\longrightarrow) is fine. Of course, there may be symbols that are not recognized anyway, but this is better because they cause explicit errors from mhchem instead of cryptic iconv errors in case they cannot be represented in the document encoding. --- src/mathed/MathExtern.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/mathed/MathExtern.cpp b/src/mathed/MathExtern.cpp index 323ea138d1..24f2672b8c 100644 --- a/src/mathed/MathExtern.cpp +++ b/src/mathed/MathExtern.cpp @@ -1421,11 +1421,46 @@ void write(MathData const & dat, WriteStream & wi) void writeString(docstring const & s, WriteStream & os) { - if (!os.latex() || os.lockedMode()) { + if (!os.latex()) { os << (os.asciiOnly() ? escape(s) : s); return; } + if (os.lockedMode()) { + bool space; + docstring cmd; + for (char_type c : s) { + try { + Encodings::latexMathChar(c, false, os.encoding(), cmd, space); + os << cmd; + os.pendingSpace(space); + } catch (EncodingException const & e) { + switch (os.output()) { + case WriteStream::wsDryrun: { + os << "<" << _("LyX Warning: ") + << _("uncodable character") << " '"; + os << docstring(1, e.failed_char); + os << "'>"; + break; + } + case WriteStream::wsPreview: { + // indicate the encoding error by a boxed '?' + os << "{\\fboxsep=1pt\\fbox{?}}"; + LYXERR0("Uncodable character" << " '" + << docstring(1, e.failed_char) + << "'"); + break; + } + case WriteStream::wsDefault: + default: + // throw again + throw(e); + } + } + } + return; + } + docstring::const_iterator cit = s.begin(); docstring::const_iterator end = s.end(); -- 2.39.5