]> git.lyx.org Git - features.git/commitdiff
Use proper listings font styles with polyglossia and RTL
authorJuergen Spitzmueller <spitz@lyx.org>
Fri, 19 Apr 2019 15:18:18 +0000 (17:18 +0200)
committerJuergen Spitzmueller <spitz@lyx.org>
Fri, 19 Apr 2019 15:18:18 +0000 (17:18 +0200)
Fixes: #11554
Also load color with minted and polyglossia/RTL, as minted loads it
too late.

src/LaTeXFeatures.h
src/insets/InsetListings.cpp

index 3d984d6bc52ea568cef50fc98df7076d2b57e773..864efeee4ae15f9204a203a53b2a8e7dd8f46a58 100644 (file)
@@ -180,13 +180,13 @@ public:
        void setHTMLTitle(docstring const & t) { htmltitle_ = t; }
        ///
        docstring const & htmlTitle() const { return htmltitle_; }
+       ///
+       bool hasRTLLanguage() const;
 
 private:
        ///
        void useLayout(docstring const &, int);
        ///
-       bool hasRTLLanguage() const;
-       ///
        std::list<docstring> usedLayouts_;
        ///
        std::list<docstring> usedInsetLayouts_;
index b344241cadc50f611e3912ef709645f250bd7a4e..1f6087913ae6e6fc546023180dae86149cf178aa 100644 (file)
@@ -147,6 +147,22 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
        // of the listings package (see page 25 of the manual)
        bool const isInline = params().isInline();
        bool const use_minted = buffer().params().use_minted;
+       static regex const reg1("(.*)(basicstyle=\\{)([^\\}]*)(\\\\ttfamily)([^\\}]*)(\\})(.*)");
+       static regex const reg2("(.*)(basicstyle=\\{)([^\\}]*)(\\\\rmfamily)([^\\}]*)(\\})(.*)");
+       static regex const reg3("(.*)(basicstyle=\\{)([^\\}]*)(\\\\sffamily)([^\\}]*)(\\})(.*)");
+       if (runparams.use_polyglossia && runparams.local_font->isRightToLeft()) {
+               // We need to use the *latin switches (#11554)
+               smatch sub;
+               if (regex_match(param_string, sub, reg1))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg2))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+               if (regex_match(param_string, sub, reg3))
+                       param_string = sub.str(1) + sub.str(2) + sub.str(3) + sub.str(4)
+                                       + "latin"  + sub.str(5) + sub.str(6) + sub.str(7);
+       }
        string minted_language;
        string float_placement;
        bool const isfloat = params().isFloat();
@@ -159,11 +175,11 @@ void InsetListings::latex(otexstream & os, OutputParams const & runparams) const
                        if (prefixIs(opts[i], "float")) {
                                if (prefixIs(opts[i], "float="))
                                        float_placement = opts[i].substr(6);
-                               opts.erase(opts.begin() + i--);
+                               opts.erase(opts.begin() + int(i--));
                        }
                        else if (prefixIs(opts[i], "language=")) {
                                minted_language = opts[i].substr(9);
-                               opts.erase(opts.begin() + i--);
+                               opts.erase(opts.begin() + int(i--));
                        }
                }
                param_string = getStringFromVector(opts, ",");
@@ -494,6 +510,10 @@ void InsetListings::validate(LaTeXFeatures & features) const
                OutputParams rp = features.runparams();
                if (!params().isFloat() && !getCaption(rp).str.empty())
                        features.require("lyxmintcaption");
+               if (features.usePolyglossia() && features.hasRTLLanguage())
+                       // minted loads color, but color must be loaded before bidi
+                       // (i.e., polyglossia)
+                       features.require("color");
        } else {
                features.require("listings");
                if (contains(param_string, "\\color"))