namespace {
docstring const i18npreamble(Language const * lang, Encoding const & enc,
- docstring const & templ, bool const polyglossia,
- bool const unicode)
+ docstring const & templ, bool const polyglossia)
{
if (templ.empty())
return templ;
smatch sub;
while (regex_search(preamble, sub, reg)) {
string const key = sub.str(1);
- string translated = to_utf8(lang->translateLayout(key));
- if (!unicode && langenc != bufenc)
- translated = "\\inputencoding{" + texenc + "}"
- + s1 + langenc + s2 + translated
+ docstring const name = lang->translateLayout(key);
+ // Check whether name can be encoded in the buffer encoding
+ bool encodable = true;
+ for (size_t i = 0; i < name.size(); ++i) {
+ if (enc.latexChar(name[i], true)[0] != name[i]) {
+ encodable = false;
+ break;
+ }
+ }
+ string const translated = encodable ? to_utf8(name)
+ : "\\inputencoding{" + texenc + "}"
+ + s1 + langenc + s2 + to_utf8(name)
+ s1 + bufenc + s2;
preamble = subst(preamble, sub.str(), translated);
}
docstring const Layout::langpreamble(Language const * lang,
- Encoding const & enc, bool const polyglossia,
- bool const unicode) const
+ Encoding const & enc, bool const polyglossia) const
{
- return i18npreamble(lang, enc, langpreamble_, polyglossia, unicode);
+ return i18npreamble(lang, enc, langpreamble_, polyglossia);
}
docstring const Layout::babelpreamble(Language const * lang,
- Encoding const & enc, bool const polyglossia,
- bool const unicode) const
+ Encoding const & enc, bool const polyglossia) const
{
- return i18npreamble(lang, enc, babelpreamble_, polyglossia, unicode);
+ return i18npreamble(lang, enc, babelpreamble_, polyglossia);
}