commit c0f734bcef837ae5936f63f59c66b0c94030d748
Author: Juergen Spitzmueller <[email protected]>
Date: Fri Apr 19 19:03:29 2019 +0200
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(+), 0 deletions(-)
diff --git a/src/frontends/qt4/GuiListings.cpp
b/src/frontends/qt4/GuiListings.cpp
index 1ed2cdd..c957cb0 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 1f60879..f2af581 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;