char const * const side_char = "lr" ;
char const * const level_char = "sd";
-} // namespace anon
+} // namespace
/////////////////////////////////////////////////////////////////////
break;
}
case 0x0027: {// ' (plain)
- if (op == "t1")
- res = "\\textquotesingle";
- else
- res = "\\char39";
+ res = "\\textquotesingle";
break;
}
case 0x201e: {// ,,
break;
}
case 0x0022: {// "
- if (op == "t1")
- res = "\\textquotedbl";
- else
- res = "\\char34";
+ res = "\\textquotedbl";
break;
}
// The following are fakes
default:
break;
}
-
+
return from_ascii(res);
}
default:
break;
}
-
+
return from_ascii(res);
}
///////////////////////////////////////////////////////////////////////
InsetQuotes::InsetQuotes(Buffer * buf, string const & str)
- : Inset(buf),
+ : Inset(buf),
style_(InsetQuotesParams::EnglishQuotes), side_(InsetQuotesParams::OpeningQuote),
- pass_thru_(false)
+ pass_thru_(false), internal_fontenc_(false)
{
if (buf) {
global_style_ = buf->masterBuffer()->params().quotes_style;
InsetQuotes::InsetQuotes(Buffer * buf, char_type c, InsetQuotesParams::QuoteLevel level,
string const & side, string const & style)
- : Inset(buf), level_(level), pass_thru_(false), fontspec_(false)
+ : Inset(buf), level_(level), pass_thru_(false), fontspec_(false), internal_fontenc_(false)
{
bool dynamic = false;
if (buf) {
fontspec_ = buf->masterBuffer()->params().useNonTeXFonts;
} else {
global_style_ = InsetQuotesParams::EnglishQuotes;
- fontenc_ = lyxrc.fontenc;
+ fontenc_ = "OT1";
fontspec_ = false;
}
if (style.empty())
InsetQuotesParams::QuoteStyle InsetQuotes::getStyle(string const & s)
{
InsetQuotesParams::QuoteStyle qs = InsetQuotesParams::EnglishQuotes;
-
+
if (s == "english")
qs = InsetQuotesParams::EnglishQuotes;
else if (s == "swedish")
}
cur.recordUndoInset(this);
parseString(cmd.getArg(1), true);
- cur.buffer()->updateBuffer();
+ cur.forceBufferUpdate();
break;
}
default:
from_ascii("\\textquotedblplain") : from_ascii("\\textquotesingleplain");
}
else if (runparams.use_polyglossia) {
- // For polyglossia, we directly output the respective unicode chars
+ // For polyglossia, we directly output the respective unicode chars
// (spacing and kerning is then handled respectively)
qstr = docstring(1, quotechar);
}
+ // The CJK marks are not yet covered by utf8 inputenc (we don't have the entry in
+ // unicodesymbols, since we don't want to add fake synbols there).
else if (style == InsetQuotesParams::CJKQuotes || style == InsetQuotesParams::CJKAngleQuotes) {
- if (runparams.encoding && runparams.encoding->encodable(quotechar))
+ if (runparams.encoding && runparams.encoding->name() != "utf8"
+ && runparams.encoding->encodable(quotechar))
qstr = docstring(1, quotechar);
else
qstr = quoteparams.getLaTeXQuote(quotechar, "int");
// (ligatures not featured)
qstr = quoteparams.getLaTeXQuote(quotechar, "int");
#ifdef DO_USE_DEFAULT_LANGUAGE
- } else if (doclang == "default") {
+ } else if ((doclang == "default"
#else
- } else if (!runparams.use_babel || runparams.isFullUnicode()) {
+ } else if ((!runparams.use_babel
#endif
+ || (fontenc_ != "T1" && fontenc_ != "OT1"))
+ || runparams.isFullUnicode()) {
// Standard quotation mark macros
// These are also used by babel
// without fontenc (XeTeX/LuaTeX)
if (!runparams.pass_thru) {
// Guard against unwanted ligatures with preceding text
char_type const lastchar = os.lastChar();
+ // LuaTeX does not respect {} as ligature breaker by design,
+ // see https://tex.stackexchange.com/q/349725/19291
+ docstring const nolig =
+ (runparams.flavor == OutputParams::LUATEX
+ || runparams.flavor == OutputParams::DVILUATEX) ?
+ from_ascii("\\/") : from_ascii("{}");
// !` ?` => !{}` ?{}`
if (prefixIs(qstr, from_ascii("`"))
&& (lastchar == '!' || lastchar == '?'))
- os << "{}";
+ os << nolig;
// ``` ''' ,,, <<< >>>
// => `{}`` '{}'' ,{},, <{}<< >{}>>
if (contains(from_ascii(",'`<>"), lastchar)
&& prefixIs(qstr, lastchar))
- os << "{}";
+ os << nolig;
}
os << qstr;
}
-int InsetQuotes::plaintext(odocstringstream & os,
+int InsetQuotes::plaintext(odocstringstream & os,
OutputParams const &, size_t) const
{
docstring const str = displayString();
BufferParams const & bp = buffer().masterBuffer()->params();
pass_thru_ = it.paragraph().isPassThru();
context_lang_ = it.paragraph().getFontSettings(bp, it.pos()).language()->code();
+ internal_fontenc_ = it.paragraph().getFontSettings(bp, it.pos()).language()->internalFontEncoding();
fontenc_ = bp.main_font_encoding();
global_style_ = bp.quotes_style;
fontspec_ = bp.useNonTeXFonts;
case 0x0022: {
if (features.runparams().isFullUnicode() && fontspec_)
features.require("textquotedblp");
- else if (fontenc_ != "T1")
+ else if (fontenc_ != "T1" || internal_fontenc_)
features.require("textquotedbl");
break;
}
- // we fake these from math
+ // we fake these from math (also for utf8 inputenc
+ // currently; see above)
case 0x300e: // LEFT WHITE CORNER BRACKET
case 0x300f: // RIGHT WHITE CORNER BRACKET
if (!features.runparams().encoding
+ || features.runparams().encoding->name() == "utf8"
|| !features.runparams().encoding->encodable(type))
features.require("stmaryrd");
break;