From c0f734bcef837ae5936f63f59c66b0c94030d748 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Fri, 19 Apr 2019 19:03:29 +0200 Subject: [PATCH] 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. --- src/frontends/qt4/GuiListings.cpp | 3 +++ src/insets/InsetListings.cpp | 38 +++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) 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; -- 2.39.2