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.
This commit is contained in:
Juergen Spitzmueller 2019-04-19 19:03:29 +02:00
parent 54147a7140
commit c0f734bcef
2 changed files with 41 additions and 0 deletions

View File

@ -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)

View File

@ -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;