From: Juergen Spitzmueller Date: Fri, 19 Apr 2019 17:03:29 +0000 (+0200) Subject: Fix some listings/minted incompatibilities X-Git-Tag: lyx-2.4.0dev-acb2ca7b~2134 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=c0f734bcef837ae5936f63f59c66b0c94030d748;p=features.git Fix some listings/minted incompatibilities The basic problem here is that rather than using an abstract syntax, backend-specific param strings are produced in the listings dialog, depending on whether listings or minted is used. Of course this breaks if a user switches backends inbetween (s/he would have to open and re-apply each and every listings inset!) Do at least the most basic translations in InsetListings::latex(). A sane solution would imply the use of only one param syntax with respective interpretation for each backend. But this would be a file format change. --- diff --git a/src/frontends/qt4/GuiListings.cpp b/src/frontends/qt4/GuiListings.cpp index 1ed2cddde2..c957cb0b75 100644 --- a/src/frontends/qt4/GuiListings.cpp +++ b/src/frontends/qt4/GuiListings.cpp @@ -297,6 +297,9 @@ string GuiListings::construct_params() string fontstyle = font_styles[qMax(0, fontstyleCO->currentIndex())]; string basicstyle; string mintedsize; + // FIXME: We should not compose listings- or minted-dependant string here + // This breaks if a users switches the backend without opening and + // re-applying all listings insets. Use a backend-abstract syntax! bool const use_minted = buffer().params().use_minted; if (fontsize != "default") { if (use_minted) diff --git a/src/insets/InsetListings.cpp b/src/insets/InsetListings.cpp index 1f6087913a..f2af5813bd 100644 --- a/src/insets/InsetListings.cpp +++ b/src/insets/InsetListings.cpp @@ -150,6 +150,44 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const static regex const reg1("(.*)(basicstyle=\\{)([^\\}]*)(\\\\ttfamily)([^\\}]*)(\\})(.*)"); static regex const reg2("(.*)(basicstyle=\\{)([^\\}]*)(\\\\rmfamily)([^\\}]*)(\\})(.*)"); static regex const reg3("(.*)(basicstyle=\\{)([^\\}]*)(\\\\sffamily)([^\\}]*)(\\})(.*)"); + static regex const reg4("(.*)(basicstyle=\\{)([^\\}]*)(\\\\(tiny|scriptsize|footnotesize|small|normalsize|large|Large))([^\\}]*)(\\})(.*)"); + static regex const reg5("(.*)(fontfamily=)(tt|sf|rm)(.*)"); + static regex const reg6("(.*)(fontsize=\\{)(\\\\(tiny|scriptsize|footnotesize|small|normalsize|large|Large))(\\})(.*)"); + if (use_minted) { + // If params have been entered with "listings", and then the user switched to "minted", + // we have params that need to be translated. + // FIXME: We should use a backend-abstract syntax in listings params instead! + // Substitute fontstyle option + smatch sub; + if (regex_match(param_string, sub, reg1)) + param_string = sub.str(1) + "fontfamily=tt," + sub.str(2) + sub.str(3) + + sub.str(5) + sub.str(6) + sub.str(7); + if (regex_match(param_string, sub, reg2)) + param_string = sub.str(1) + "fontfamily=rm," + sub.str(2) + sub.str(3) + + sub.str(5) + sub.str(6) + sub.str(7); + if (regex_match(param_string, sub, reg3)) + param_string = sub.str(1) + "fontfamily=sf," + sub.str(2) + sub.str(3) + + sub.str(5) + sub.str(6) + sub.str(7); + // as well as fontsize option + if (regex_match(param_string, sub, reg4)) + param_string = sub.str(1) + "fontsize={" + sub.str(4) + sub.str(3) + sub.str(7) + sub.str(8); + } else { + // And the same vice versa + // Substitute fontstyle option + smatch sub; + string basicstyle; + if (regex_match(param_string, sub, reg5)) { + basicstyle = "\\" + sub.str(3) + "family"; + param_string = sub.str(1) + sub.str(4); + } + // as well as fontsize option + if (regex_match(param_string, sub, reg6)) { + basicstyle += sub.str(3); + param_string = sub.str(1) + sub.str(6); + } + if (!basicstyle.empty()) + param_string = rtrim(param_string, ",") + ",basicstyle={" + basicstyle + "}"; + } if (runparams.use_polyglossia && runparams.local_font->isRightToLeft()) { // We need to use the *latin switches (#11554) smatch sub;