]> git.lyx.org Git - features.git/commitdiff
Implement support for font options
authorJuergen Spitzmueller <spitz@lyx.org>
Thu, 11 Jul 2019 18:28:34 +0000 (20:28 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Thu, 18 Jun 2020 13:48:35 +0000 (15:48 +0200)
This revives a patch by Uwe and extends it. Additional options to font
packages/fontspec can now be entered in Document Settings.
This is principally also true for TeX fonts, if the new TeXFont tag
MoreOptions is set. For the time being, I have only done this for
MinionPro, as a model and prove of concept.

Note that adding more TeXFonts requires a file format change,
respectively, and changes to tex2lyx (in the same way as I've done for
MinionPro).

This addresses #8226

14 files changed:
development/FORMAT
lib/latexfonts
lib/lyx2lyx/lyx_2_4.py
src/Buffer.cpp
src/BufferParams.cpp
src/BufferParams.h
src/LaTeXFonts.cpp
src/LaTeXFonts.h
src/frontends/qt4/GuiDocument.cpp
src/frontends/qt4/GuiDocument.h
src/frontends/qt4/ui/FontUi.ui
src/tex2lyx/Preamble.cpp
src/tex2lyx/Preamble.h
src/version.h

index 2f4097c3bf905e54ac6f8a03c16b8c277ee1c487..0c3bf536a4623d4a6fe3ee88558bb1f01a3c9cfa 100644 (file)
@@ -7,6 +7,14 @@ changes happened in particular if possible. A good example would be
 
 -----------------------
 
+2019-07-11 Uwe Stöhr <uwestoehr@web.de>
+           Jürgen Spitzmüller <spitz@lyx.org>
+       * Format incremented to 580: support for document font options
+         New buffer parameters
+         - \fonts_roman_opts
+         - \fonts_sans_opts
+         - \fonts_typewriter_opts
+
 2019-07-11  Jürgen Spitzmüller <spitz@lyx.org>
        * Format incremented to 579: Add support for \babelfont.
 
index 0c753df6cc4223930af6bd9aa072aa2c86a846e9..56c1d7e16b4e2a0c62c89376d12da885766fd991 100644 (file)
@@ -22,6 +22,7 @@
 #      ScOption           <option for true smallcaps support>
 #      OsfScOption        <option for combined osf and true smallcaps support>
 #      ScaleOption        <option for font scaling>
+#       MoreOptions        <0|1>
 #      Provides           <features provided by the font packages (comma-separated)>
 #      Preamble
 #        <some arbitrary LaTeX code to be issued in the preamble>
@@ -70,6 +71,8 @@
 #   default and provide an option for lining figures. Pass this option
 #   to OsfOption.
 # * ScaleOption supports the placeholder $$val for the scale value.
+# * If MoreOptions is true, then the user can insert additional options to
+#   the font package via the Document Settings.
 # * The Preamble code is output immediately after the respective font
 #   loading command.
 #
@@ -342,6 +345,7 @@ Font minionpro
        Package          MinionPro
        Provides         amssymb,amsfonts
        NoMathFont       minionpro-nomath
+       MoreOptions      1
 EndFont
 
 AltFont minionpro-nomath
index 08490576558e30a73234b7ef54fafc7247278cad..6dc8d92e2aec2955efcd1ffe8c178b8c3384416c 100644 (file)
@@ -2282,6 +2282,169 @@ def revert_babelfont(document):
     insert_to_preamble(document, pretext)
 
 
+def revert_minionpro(document):
+    " Revert native MinionPro font definition (with extra options) to LaTeX "
+
+    i = find_token(document.header, '\\use_non_tex_fonts', 0)
+    if i == -1:
+        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
+        return
+    if str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+        return
+
+    regexp = re.compile(r'(\\font_roman_opts)')
+    i = find_re(document.header, regexp, 0)
+    if i == -1:
+        return
+
+    # We need to use this regex since split() does not handle quote protection
+    romanopts = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+    opts = romanopts[1].strip('"')
+    del document.header[i]
+
+    i = find_token(document.header, "\\font_roman", 0)
+    if i == -1:
+        document.warning("Malformed LyX document: Missing \\font_roman.")
+        return
+    else:
+        # We need to use this regex since split() does not handle quote protection
+        romanfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+        roman = romanfont[1].strip('"')
+        if roman != "minionpro":
+            return
+        romanfont[1] = '"default"'
+        document.header[i] = " ".join(romanfont)
+        osf = False
+        j = find_token(document.header, "\\font_osf true", 0)
+        if j != -1:
+            osf = True
+        preamble = "\\usepackage["
+        if osf:
+            document.header[j] = "\\font_osf false"
+        else:
+            preamble += "lf,"
+        preamble += opts
+        preamble += "]{MinionPro}"
+        add_to_preamble(document, [preamble])
+
+
+def revert_font_opts(document):
+    " revert font options by outputting \\setxxxfont or \\babelfont to the preamble "
+
+    i = find_token(document.header, '\\use_non_tex_fonts', 0)
+    if i == -1:
+        document.warning("Malformed LyX document: Missing \\use_non_tex_fonts.")
+        return
+    if not str2bool(get_value(document.header, "\\use_non_tex_fonts", i)):
+        return
+    i = find_token(document.header, '\\language_package', 0)
+    if i == -1:
+        document.warning("Malformed LyX document: Missing \\language_package.")
+        return
+    Babel = (get_value(document.header, "\\language_package", 0) == "babel")
+
+    # 1. Roman
+    regexp = re.compile(r'(\\font_roman_opts)')
+    i = find_re(document.header, regexp, 0)
+    if i != -1:
+        # We need to use this regex since split() does not handle quote protection
+        romanopts = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+        opts = romanopts[1].strip('"')
+        del document.header[i]
+        regexp = re.compile(r'(\\font_roman)')
+        i = find_re(document.header, regexp, 0)
+        if i != -1:
+            # We need to use this regex since split() does not handle quote protection
+            romanfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+            font = romanfont[2].strip('"')
+            romanfont[2] = '"default"'
+            document.header[i] = " ".join(romanfont)
+            if font != "default":
+                if Babel:
+                    preamble = "\\babelfont{rm}["
+                else:
+                    preamble = "\\setmainfont["
+                preamble += opts
+                preamble += ","
+                preamble += "Mapping=tex-text]{"
+                preamble += font
+                preamble += "}"
+                add_to_preamble(document, [preamble])
+
+    # 2. Sans
+    regexp = re.compile(r'(\\font_sans_opts)')
+    i = find_re(document.header, regexp, 0)
+    if i != -1:
+        scaleval = 100
+        # We need to use this regex since split() does not handle quote protection
+        sfopts = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+        opts = sfopts[1].strip('"')
+        del document.header[i]
+        regexp = re.compile(r'(\\font_sf_scale)')
+        i = find_re(document.header, regexp, 0)
+        if i != -1:
+            scaleval = get_value(document.header, "\\font_sf_scale" , i).split()[1]
+        regexp = re.compile(r'(\\font_sans)')
+        i = find_re(document.header, regexp, 0)
+        if i != -1:
+            # We need to use this regex since split() does not handle quote protection
+            sffont = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+            font = sffont[2].strip('"')
+            sffont[2] = '"default"'
+            document.header[i] = " ".join(sffont)
+            if font != "default":
+                if Babel:
+                    preamble = "\\babelfont{sf}["
+                else:
+                    preamble = "\\setsansfont["
+                preamble += opts
+                preamble += ","
+                if scaleval != 100:
+                    preamble += "Scale=0."
+                    preamble += scaleval
+                    preamble += ","
+                preamble += "Mapping=tex-text]{"
+                preamble += font
+                preamble += "}"
+                add_to_preamble(document, [preamble])
+
+    # 3. Typewriter
+    regexp = re.compile(r'(\\font_typewriter_opts)')
+    i = find_re(document.header, regexp, 0)
+    if i != -1:
+        scaleval = 100
+        # We need to use this regex since split() does not handle quote protection
+        ttopts = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+        opts = ttopts[1].strip('"')
+        del document.header[i]
+        regexp = re.compile(r'(\\font_tt_scale)')
+        i = find_re(document.header, regexp, 0)
+        if i != -1:
+            scaleval = get_value(document.header, "\\font_tt_scale" , i).split()[1]
+        regexp = re.compile(r'(\\font_typewriter)')
+        i = find_re(document.header, regexp, 0)
+        if i != -1:
+            # We need to use this regex since split() does not handle quote protection
+            ttfont = re.findall(r'[^"\s]\S*|".+?"', document.header[i])
+            font = ttfont[2].strip('"')
+            ttfont[2] = '"default"'
+            document.header[i] = " ".join(ttfont)
+            if font != "default":
+                if Babel:
+                    preamble = "\\babelfont{tt}["
+                else:
+                    preamble = "\\setmonofont["
+                preamble += opts
+                preamble += ","
+                if scaleval != 100:
+                    preamble += "Scale=0."
+                    preamble += scaleval
+                    preamble += ","
+                preamble += "Mapping=tex-text]{"
+                preamble += font
+                preamble += "}"
+                add_to_preamble(document, [preamble])
+
 
 ##
 # Conversion hub
@@ -2323,10 +2486,12 @@ convert = [
            [576, []],
            [577, [convert_linggloss]],
            [578, []],
-           [579, []]
+           [579, []],
+           [580, []]
           ]
 
-revert =  [[578, [revert_babelfont]],
+revert =  [[579, [revert_font_opts, revert_minionpro]],
+           [578, [revert_babelfont]],
            [577, [revert_drs]],
            [576, [revert_linggloss, revert_subexarg]],
            [575, [revert_new_languages]],
index 2e467d589b8144722751a3e4655c47057636b505..0882c3d3c31402b5a0a552ea2c394890322c01f2 100644 (file)
@@ -926,6 +926,9 @@ int Buffer::readHeader(Lexer & lex)
        params().headsep.erase();
        params().footskip.erase();
        params().columnsep.erase();
+       params().font_roman_opts.erase();
+       params().font_sans_opts.erase();
+       params().font_typewriter_opts.erase();
        params().fonts_cjk.erase();
        params().listings_params.clear();
        params().clearLayoutModules();
index d4e2ca4e85c9ab17f446eac5d23777147c4d851d..0978b6fe7b54d68a0b1759a7f404f0c35aadf1f1 100644 (file)
@@ -846,12 +846,18 @@ string BufferParams::readToken(Lexer & lex, string const & token,
                lex >> fonts_expert_sc;
        } else if (token == "\\font_osf") {
                lex >> fonts_old_figures;
+       } else if (token == "\\font_roman_opts") {
+               lex >> font_roman_opts;
        } else if (token == "\\font_sf_scale") {
                lex >> fonts_sans_scale[0];
                lex >> fonts_sans_scale[1];
+       } else if (token == "\\font_sans_opts") {
+               lex >> font_sans_opts;
        } else if (token == "\\font_tt_scale") {
                lex >> fonts_typewriter_scale[0];
                lex >> fonts_typewriter_scale[1];
+       } else if (token == "\\font_typewriter_opts") {
+               lex >> font_typewriter_opts;
        } else if (token == "\\font_cjk") {
                lex >> fonts_cjk;
        } else if (token == "\\use_microtype") {
@@ -1263,15 +1269,20 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const
           << "\n\\font_default_family " << fonts_default_family
           << "\n\\use_non_tex_fonts " << convert<string>(useNonTeXFonts)
           << "\n\\font_sc " << convert<string>(fonts_expert_sc)
-          << "\n\\font_osf " << convert<string>(fonts_old_figures)
-          << "\n\\font_sf_scale " << fonts_sans_scale[0]
-          << ' ' << fonts_sans_scale[1]
-          << "\n\\font_tt_scale " << fonts_typewriter_scale[0]
-          << ' ' << fonts_typewriter_scale[1]
-          << '\n';
-       if (!fonts_cjk.empty()) {
+          << "\n\\font_osf " << convert<string>(fonts_old_figures);
+       if (!font_roman_opts.empty())
+               os << "\n\\font_roman_opts \"" << font_roman_opts << "\"";
+       os << "\n\\font_sf_scale " << fonts_sans_scale[0]
+          << ' ' << fonts_sans_scale[1];
+       if (!font_sans_opts.empty())
+               os << "\n\\font_sans_opts \"" << font_sans_opts << "\"";
+       os << "\n\\font_tt_scale " << fonts_typewriter_scale[0]
+          << ' ' << fonts_typewriter_scale[1];
+       if (!font_typewriter_opts.empty())
+               os << "\n\\font_typewriter_opts \"" << font_typewriter_opts << "\"";
+       os << '\n';
+       if (!fonts_cjk.empty())
                os << "\\font_cjk " << fonts_cjk << '\n';
-       }
        os << "\\use_microtype " << convert<string>(use_microtype) << '\n';
        os << "\\use_dash_ligatures " << convert<string>(use_dash_ligatures) << '\n';
        os << "\\graphics " << graphics_driver << '\n';
@@ -3408,6 +3419,8 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
                                os << "\\babelfont{rm}[";
                        else
                                os << "\\setmainfont[";
+                       if (!font_roman_opts.empty())
+                               os << font_roman_opts << ',';
                        os << texmapping;
                        if (fonts_old_figures)
                                os << ",Numbers=OldStyle";
@@ -3421,14 +3434,18 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
                                else
                                        os << "\\setsansfont";
                                os << "[Scale="
-                                  << float(fontsSansScale()) / 100
-                                  << "," << texmapping << "]{"
+                                  << float(fontsSansScale()) / 100 << ',';
+                               if (!font_sans_opts.empty())
+                                       os << font_sans_opts << ',';
+                               os << texmapping << "]{"
                                   << sans << "}\n";
                        } else {
                                if (babel)
                                        os << "\\babelfont{sf}[";
                                else
                                        os << "\\setsansfont[";
+                               if (!font_sans_opts.empty())
+                                       os << font_sans_opts << ',';
                                os << texmapping << "]{"
                                   << sans << "}\n";
                        }
@@ -3441,15 +3458,19 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
                                else
                                        os << "\\setmonofont";
                                os << "[Scale="
-                                  << float(fontsTypewriterScale()) / 100
-                                  << "]{"
+                                  << float(fontsTypewriterScale()) / 100;
+                               if (!font_typewriter_opts.empty())
+                                       os << ',' << font_typewriter_opts;
+                               os << "]{"
                                   << mono << "}\n";
                        } else {
                                if (babel)
-                                       os << "\\babelfont{tt}{";
+                                       os << "\\babelfont{tt}";
                                else
-                                       os << "\\setmonofont{";
-                               os << mono << "}\n";
+                                       os << "\\setmonofont";
+                               if (!font_typewriter_opts.empty())
+                                       os << '[' << font_typewriter_opts << ']';
+                               os << '{' << mono << "}\n";
                        }
                }
                return os.str();
@@ -3464,17 +3485,17 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const
        // ROMAN FONTS
        os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsRoman())).getLaTeXCode(
                dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
-               nomath);
+               nomath, font_roman_opts);
 
        // SANS SERIF
        os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsSans())).getLaTeXCode(
                dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
-               nomath, fontsSansScale());
+               nomath, font_roman_opts, fontsSansScale());
 
        // MONOSPACED/TYPEWRITER
        os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsTypewriter())).getLaTeXCode(
                dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures,
-               nomath, fontsTypewriterScale());
+               nomath, font_roman_opts, fontsTypewriterScale());
 
        // MATH
        os << theLaTeXFonts().getLaTeXFont(from_ascii(fontsMath())).getLaTeXCode(
index 1e8b5b00f17205ca99c3c2b100d508cab2892ef8..84c91ef8809a779cacf86564c58906b4d75a8bb7 100644 (file)
@@ -285,14 +285,20 @@ public:
        bool fonts_expert_sc;
        /// use Old Style Figures
        bool fonts_old_figures;
+       /// the options for the roman font
+       std::string font_roman_opts;
        /// the scale factor of the sf font: [0] for TeX fonts, [1] for non-TeX fonts
        int fonts_sans_scale[2];
        /// the scale factor of the sf font
        int fontsSansScale() const { return fonts_sans_scale[useNonTeXFonts]; }
+       // the options for the sans font
+       std::string font_sans_opts;
        /// the scale factor of the tt font: [0] for TeX fonts, [1] for non-TeX fonts
        int fonts_typewriter_scale[2];
        /// the scale factor of the tt font
        int fontsTypewriterScale() const { return fonts_typewriter_scale[useNonTeXFonts]; }
+       // the options for the typewriter font
+       std::string font_typewriter_opts;
        /// the font used by the CJK command
        std::string fonts_cjk;
        /// use LaTeX microtype package
index 8cd51139c1576f178bdcdb44a966bfccf79713c7..422c8c7ca36a42a82c26d071afa0d81d264a0040 100644 (file)
@@ -228,7 +228,7 @@ string const LaTeXFont::getAvailablePackage(bool dryrun)
 
 
 string const LaTeXFont::getPackageOptions(bool ot1, bool complete, bool sc, bool osf,
-                                         int scale, bool nomath)
+                                         int scale, string const extraopts, bool nomath)
 {
        ostringstream os;
        bool const needosfopt = (osf != osfdefault_);
@@ -263,12 +263,19 @@ string const LaTeXFont::getPackageOptions(bool ot1, bool complete, bool sc, bool
                os << subst(to_ascii(scaleoption_), "$$val",
                            convert<std::string>(float(scale) / 100));
        }
+
+       if (moreopts_ && !extraopts.empty()) {
+               if (!os.str().empty())
+                       os << ',';
+               os << extraopts;
+       }
        return os.str();
 }
 
 
 string const LaTeXFont::getLaTeXCode(bool dryrun, bool ot1, bool complete, bool sc,
-                                    bool osf, bool nomath, int const & scale)
+                                    bool osf, bool nomath, string const extraopts,
+                                    int const & scale)
 {
        ostringstream os;
 
@@ -276,7 +283,8 @@ string const LaTeXFont::getLaTeXCode(bool dryrun, bool ot1, bool complete, bool
        if (usedfont.empty())
                return string();
        else if (usedfont != name_)
-               return altFont(usedfont).getLaTeXCode(dryrun, ot1, complete, sc, osf, nomath, scale);
+               return altFont(usedfont).getLaTeXCode(dryrun, ot1, complete, sc,
+                                                     osf, nomath, extraopts, scale);
 
        if (switchdefault_) {
                if (family_.empty()) {
@@ -294,14 +302,15 @@ string const LaTeXFont::getLaTeXCode(bool dryrun, bool ot1, bool complete, bool
        } else {
                string const package =
                        getAvailablePackage(dryrun);
-               string const packageopts = getPackageOptions(ot1, complete, sc, osf, scale, nomath);
+               string const packageopts = getPackageOptions(ot1, complete, sc, osf, scale, extraopts, nomath);
                if (packageopts.empty() && !package.empty())
                        os << "\\usepackage{" << package << "}\n";
                else if (!packageopts.empty() && !package.empty())
                        os << "\\usepackage[" << packageopts << "]{" << package << "}\n";
        }
        if (osf && providesOSF(ot1, complete, nomath) && !osffont_.empty())
-               os << altFont(osffont_).getLaTeXCode(dryrun, ot1, complete, sc, osf, nomath, scale);
+               os << altFont(osffont_).getLaTeXCode(dryrun, ot1, complete, sc, osf,
+                                                    nomath, extraopts, scale);
 
        if (!preamble_.empty())
                os << to_utf8(preamble_);
@@ -335,6 +344,7 @@ bool LaTeXFont::readFont(Lexer & lex)
                LF_OSFOPTION,
                LF_OSFSCOPTION,
                LF_OT1_FONT,
+               LF_MOREOPTS,
                LF_PACKAGE,
                LF_PACKAGEOPTION,
                LF_PREAMBLE,
@@ -353,6 +363,7 @@ bool LaTeXFont::readFont(Lexer & lex)
                { "family",               LF_FAMILY },
                { "fontencoding",         LF_FONTENC },
                { "guiname",              LF_GUINAME },
+               { "moreoptions",          LF_MOREOPTS },
                { "nomathfont",           LF_NOMATHFONT },
                { "osfdefault",           LF_OSFDEFAULT },
                { "osffont",              LF_OSFFONT },
@@ -455,6 +466,9 @@ bool LaTeXFont::readFont(Lexer & lex)
                case LF_SCOPTION:
                        lex >> scoption_;
                        break;
+               case LF_MOREOPTS:
+                       lex >> moreopts_;
+                       break;
                case LF_SWITCHDEFAULT:
                        lex >> switchdefault_;
                        break;
@@ -473,6 +487,7 @@ bool LaTeXFont::read(Lexer & lex)
 {
        switchdefault_ = 0;
        osfdefault_ = 0;
+       moreopts_ = 0;
 
        if (!lex.next()) {
                lex.printError("No name given for LaTeX font: `$$Token'.");
index 7087649a4dcfc8c8b217fc6a5cb2c2486b1331f9..d15281cd97f8de3e66d0f96c7ddecc325e5cf3b3 100644 (file)
@@ -27,7 +27,7 @@ class LaTeXFont {
 public:
        /// TeX font
        // FIXME Add fontenc tag to classes which is used if no font is specified?
-       LaTeXFont() : osfdefault_(false), switchdefault_(false) { fontenc_.push_back("T1"); }
+       LaTeXFont() : osfdefault_(false), switchdefault_(false), moreopts_(false) { fontenc_.push_back("T1"); }
        /// The font name
        docstring const & name() { return name_; }
        /// The name to appear in the document dialog
@@ -58,6 +58,8 @@ public:
        docstring const & osfscoption() { return osfscoption_; }
        /// A package option for font scaling
        docstring const & scaleoption() { return scaleoption_; }
+       /// Does this provide additional options?
+       bool moreoptions() const { return moreopts_; }
        /// Alternative requirement to test for
        docstring const & requires() { return requires_; }
        /// Does this font provide a given \p feature
@@ -84,6 +86,7 @@ public:
        /// Return the LaTeX Code
        std::string const getLaTeXCode(bool dryrun, bool ot1, bool complete,
                                       bool sc, bool osf, bool nomath,
+                                      std::string const extraopts = std::string(),
                                       int const & scale = 100);
        /// Return the actually used font
        docstring const getUsedFont(bool ot1, bool complete, bool nomath);
@@ -102,6 +105,7 @@ private:
                                            bool sc,
                                            bool osf,
                                            int scale,
+                                           std::string const extraopts,
                                            bool nomath);
        /// Return an alternative font
        LaTeXFont altFont(docstring const & name);
@@ -145,6 +149,8 @@ private:
        bool osfdefault_;
        ///
        bool switchdefault_;
+       ///
+       bool moreopts_;
 };
 
 
index 1d811fd31c529f87bc8fa251548fac71297f1105..f1b4f8e7b348a8f2a7313ef1836e3a624ca23fcb 100644 (file)
@@ -1090,11 +1090,23 @@ GuiDocument::GuiDocument(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(fontModule->fontOsfCB, SIGNAL(toggled(bool)),
                this, SLOT(fontOsfToggled(bool)));
+       connect(fontModule->fontspecRomanLE, SIGNAL(textChanged(const QString &)),
+               this, SLOT(change_adaptor()));
+       connect(fontModule->fontspecSansLE, SIGNAL(textChanged(const QString &)),
+               this, SLOT(change_adaptor()));
+       connect(fontModule->fontspecTypewriterLE, SIGNAL(textChanged(const QString &)),
+               this, SLOT(change_adaptor()));
 
        fontModule->fontencLE->setValidator(new NoNewLineValidator(
                fontModule->fontencLE));
        fontModule->cjkFontLE->setValidator(new NoNewLineValidator(
                fontModule->cjkFontLE));
+       fontModule->fontspecRomanLE->setValidator(new NoNewLineValidator(
+               fontModule->fontspecRomanLE));
+       fontModule->fontspecSansLE->setValidator(new NoNewLineValidator(
+               fontModule->fontspecSansLE));
+       fontModule->fontspecTypewriterLE->setValidator(new NoNewLineValidator(
+               fontModule->fontspecTypewriterLE));
 
        updateFontlist();
 
@@ -2419,16 +2431,22 @@ void GuiDocument::updateFontOptions()
 {
        bool const tex_fonts = !fontModule->osFontsCB->isChecked();
        QString font;
+       if (tex_fonts)
+               font = fontModule->fontsRomanCO->itemData(
+                               fontModule->fontsRomanCO->currentIndex()).toString();
+       bool const rm_opts = providesExtraOpts(font);
        if (tex_fonts)
                font = fontModule->fontsSansCO->itemData(
                                fontModule->fontsSansCO->currentIndex()).toString();
        bool scaleable = providesScale(font);
+       bool const sf_opts = providesExtraOpts(font);
        fontModule->scaleSansSB->setEnabled(scaleable);
        fontModule->scaleSansLA->setEnabled(scaleable);
        if (tex_fonts)
                font = fontModule->fontsTypewriterCO->itemData(
                                fontModule->fontsTypewriterCO->currentIndex()).toString();
        scaleable = providesScale(font);
+       bool const tt_opts = providesExtraOpts(font);
        fontModule->scaleTypewriterSB->setEnabled(scaleable);
        fontModule->scaleTypewriterLA->setEnabled(scaleable);
        if (tex_fonts)
@@ -2436,6 +2454,12 @@ void GuiDocument::updateFontOptions()
                                fontModule->fontsRomanCO->currentIndex()).toString();
        fontModule->fontScCB->setEnabled(providesSC(font));
        fontModule->fontOsfCB->setEnabled(providesOSF(font));
+       fontModule->fontspecRomanLA->setEnabled(!tex_fonts || rm_opts);
+       fontModule->fontspecRomanLE->setEnabled(!tex_fonts || rm_opts);
+       fontModule->fontspecSansLA->setEnabled(!tex_fonts || sf_opts);
+       fontModule->fontspecSansLE->setEnabled(!tex_fonts || sf_opts);
+       fontModule->fontspecTypewriterLA->setEnabled(!tex_fonts || tt_opts);
+       fontModule->fontspecTypewriterLE->setEnabled(!tex_fonts || tt_opts);
        updateMathFonts(font);
 }
 
@@ -2613,8 +2637,11 @@ void GuiDocument::romanChanged(int item)
                return;
        QString const font =
                fontModule->fontsRomanCO->itemData(item).toString();
+       bool const opts = providesExtraOpts(font);
        fontModule->fontScCB->setEnabled(providesSC(font));
        fontModule->fontOsfCB->setEnabled(providesOSF(font));
+       fontModule->fontspecRomanLA->setEnabled(opts);
+       fontModule->fontspecRomanLE->setEnabled(opts);
        updateMathFonts(font);
 }
 
@@ -2625,9 +2652,12 @@ void GuiDocument::sansChanged(int item)
                return;
        QString const font =
                fontModule->fontsSansCO->itemData(item).toString();
-       bool scaleable = providesScale(font);
+       bool const scaleable = providesScale(font);
+       bool const opts = providesExtraOpts(font);
        fontModule->scaleSansSB->setEnabled(scaleable);
        fontModule->scaleSansLA->setEnabled(scaleable);
+       fontModule->fontspecSansLA->setEnabled(opts);
+       fontModule->fontspecSansLE->setEnabled(opts);
 }
 
 
@@ -2638,8 +2668,11 @@ void GuiDocument::ttChanged(int item)
        QString const font =
                fontModule->fontsTypewriterCO->itemData(item).toString();
        bool scaleable = providesScale(font);
+       bool const opts = providesExtraOpts(font);
        fontModule->scaleTypewriterSB->setEnabled(scaleable);
        fontModule->scaleTypewriterLA->setEnabled(scaleable);
+       fontModule->fontspecTypewriterLA->setEnabled(opts);
+       fontModule->fontspecTypewriterLE->setEnabled(opts);
 }
 
 
@@ -3630,16 +3663,19 @@ void GuiDocument::applyView()
                fromqstr(fontModule->fontsRomanCO->
                        itemData(fontModule->fontsRomanCO->currentIndex()).toString());
        bp_.fonts_roman[!nontexfonts] = fromqstr(fontModule->font_roman);
+       bp_.font_roman_opts = fromqstr(fontModule->fontspecRomanLE->text());
 
        bp_.fonts_sans[nontexfonts] =
                fromqstr(fontModule->fontsSansCO->
                        itemData(fontModule->fontsSansCO->currentIndex()).toString());
        bp_.fonts_sans[!nontexfonts] = fromqstr(fontModule->font_sans);
+       bp_.font_sans_opts = fromqstr(fontModule->fontspecSansLE->text());
 
        bp_.fonts_typewriter[nontexfonts] =
                fromqstr(fontModule->fontsTypewriterCO->
                        itemData(fontModule->fontsTypewriterCO->currentIndex()).toString());
        bp_.fonts_typewriter[!nontexfonts] = fromqstr(fontModule->font_typewriter);
+       bp_.font_typewriter_opts = fromqstr(fontModule->fontspecTypewriterLE->text());
 
        bp_.fonts_math[nontexfonts] =
                fromqstr(fontModule->fontsMathCO->
@@ -4188,6 +4224,21 @@ void GuiDocument::paramsToDialog()
        fontModule->font_sf_scale = bp_.fonts_sans_scale[!bp_.useNonTeXFonts];
        fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale());
        fontModule->font_tt_scale = bp_.fonts_typewriter_scale[!bp_.useNonTeXFonts];
+       if (!bp_.font_roman_opts.empty())
+               fontModule->fontspecRomanLE->setText(
+                       toqstr(bp_.font_roman_opts));
+       else
+               fontModule->fontspecRomanLE->setText(QString());
+       if (!bp_.font_sans_opts.empty())
+               fontModule->fontspecSansLE->setText(
+                       toqstr(bp_.font_sans_opts));
+       else
+               fontModule->fontspecSansLE->setText(QString());
+       if (!bp_.font_typewriter_opts.empty())
+               fontModule->fontspecTypewriterLE->setText(
+                       toqstr(bp_.font_typewriter_opts));
+       else
+               fontModule->fontspecTypewriterLE->setText(QString());
 
        nn = findToken(GuiDocument::fontfamilies, bp_.fonts_default_family);
        if (nn >= 0)
@@ -4901,6 +4952,15 @@ bool GuiDocument::providesScale(QString const & font) const
 }
 
 
+bool GuiDocument::providesExtraOpts(QString const & font) const
+{
+       if (fontModule->osFontsCB->isChecked())
+               return true;
+       return theLaTeXFonts().getLaTeXFont(
+                               qstring_to_ucs4(font)).moreoptions();
+}
+
+
 bool GuiDocument::providesNoMath(QString const & font) const
 {
        if (fontModule->osFontsCB->isChecked())
index 3e0c35384b303df7cf765a591b7c83a9aab4300d..219861bf94d41bb7ca7272967fcdc49812c5139e 100644 (file)
@@ -289,6 +289,8 @@ private:
        bool hasMonolithicExpertSet(QString const & font) const;
        /// does this font provide size adjustment?
        bool providesScale(QString const & font) const;
+       /// does this font provide extra options?
+       bool providesExtraOpts(QString const & font) const;
        /// does this font provide an alternative without math?
        bool providesNoMath(QString const & font) const;
        ///
index 8a207758f47bd9aa6ffc899c792236a6f9ace173..c31627fedacbfbaf1395a702c5385022a35e9049 100644 (file)
@@ -6,15 +6,15 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>533</width>
-    <height>447</height>
+    <width>534</width>
+    <height>632</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>FontUi</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="2">
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
     <widget class="QCheckBox" name="osFontsCB">
      <property name="toolTip">
       <string>Use OpenType and TrueType fonts with the fontspec package (requires XeTeX or LuaTeX)</string>
      </property>
     </widget>
    </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="fontsDefaultLA">
-     <property name="text">
-      <string>&amp;Default family:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontsDefaultCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <layout class="QHBoxLayout" name="horizontalLayout">
-     <item>
-      <widget class="QComboBox" name="fontsDefaultCO">
-       <property name="toolTip">
-        <string>Select the default family for the document</string>
+   <item row="1" column="0" colspan="2">
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="0" column="0">
+      <widget class="QLabel" name="fontsDefaultLA">
+       <property name="text">
+        <string>&amp;Default family:</string>
+       </property>
+       <property name="buddy">
+        <cstring>fontsDefaultCO</cstring>
        </property>
       </widget>
      </item>
-     <item>
-      <widget class="QLabel" name="BaseSizeLA">
+     <item row="0" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QComboBox" name="fontsDefaultCO">
+         <property name="toolTip">
+          <string>Select the default family for the document</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="BaseSizeLA">
+         <property name="text">
+          <string>&amp;Base size:</string>
+         </property>
+         <property name="buddy">
+          <cstring>fontsizeCO</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QComboBox" name="fontsizeCO">
+         <property name="toolTip">
+          <string/>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>59</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="fontencLA">
        <property name="text">
-        <string>&amp;Base size:</string>
+        <string>&amp;LaTeX font encoding:</string>
        </property>
        <property name="buddy">
-        <cstring>fontsizeCO</cstring>
+        <cstring>fontencCO</cstring>
        </property>
       </widget>
      </item>
-     <item>
-      <widget class="QComboBox" name="fontsizeCO">
-       <property name="toolTip">
-        <string/>
-       </property>
-      </widget>
+     <item row="1" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_2">
+       <item>
+        <widget class="QComboBox" name="fontencCO"/>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="fontencLE">
+         <property name="toolTip">
+          <string>Specify the font encoding (e.g., T1).</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
      </item>
-     <item>
-      <spacer name="horizontalSpacer">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+     <item row="2" column="0">
+      <widget class="QLabel" name="fontsRomanLA">
+       <property name="text">
+        <string>&amp;Roman:</string>
        </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>59</width>
-         <height>20</height>
-        </size>
+       <property name="buddy">
+        <cstring>fontsRomanCO</cstring>
        </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="fontencLA">
-     <property name="text">
-      <string>&amp;LaTeX font encoding:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontencCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="1">
-    <layout class="QHBoxLayout" name="horizontalLayout_2">
-     <item>
-      <widget class="QComboBox" name="fontencCO"/>
+      </widget>
      </item>
-     <item>
-      <widget class="QLineEdit" name="fontencLE">
+     <item row="2" column="1">
+      <widget class="QComboBox" name="fontsRomanCO">
        <property name="toolTip">
-        <string>Specify the font encoding (e.g., T1).</string>
+        <string>Select the roman (serif) typeface</string>
        </property>
       </widget>
      </item>
-    </layout>
-   </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="fontsRomanLA">
-     <property name="text">
-      <string>&amp;Roman:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontsRomanCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1">
-    <widget class="QComboBox" name="fontsRomanCO">
-     <property name="toolTip">
-      <string>Select the roman (serif) typeface</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0">
-    <widget class="QLabel" name="fontsSansLA">
-     <property name="text">
-      <string>&amp;Sans Serif:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontsSansCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="1">
-    <layout class="QHBoxLayout" name="horizontalLayout_3">
-     <item>
-      <widget class="QComboBox" name="fontsSansCO">
-       <property name="toolTip">
-        <string>Select the Sans Serif (grotesque) typeface</string>
+     <item row="3" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_5">
+       <item>
+        <widget class="QLabel" name="fontspecRomanLA">
+         <property name="text">
+          <string>Options:</string>
+         </property>
+         <property name="buddy">
+          <cstring>fontspecRomanLE</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="fontspecRomanLE">
+         <property name="toolTip">
+          <string>Here you can insert additional options (as provided by the font package)</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="4" column="0">
+      <widget class="QLabel" name="fontsSansLA">
+       <property name="text">
+        <string>&amp;Sans Serif:</string>
+       </property>
+       <property name="buddy">
+        <cstring>fontsSansCO</cstring>
        </property>
       </widget>
      </item>
-     <item>
-      <spacer name="horizontalSpacer_2">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+     <item row="4" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_6">
+       <item>
+        <widget class="QComboBox" name="fontsSansCO">
+         <property name="toolTip">
+          <string>Select the Sans Serif (grotesque) typeface</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="scaleSansLA">
+         <property name="text">
+          <string>S&amp;cale (%):</string>
+         </property>
+         <property name="buddy">
+          <cstring>scaleSansSB</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QSpinBox" name="scaleSansSB">
+         <property name="toolTip">
+          <string>Scale the Sans Serif font to match the base font's dimensions</string>
+         </property>
+         <property name="minimum">
+          <number>10</number>
+         </property>
+         <property name="maximum">
+          <number>200</number>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="5" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_3">
+       <item>
+        <widget class="QLabel" name="fontspecSansLA">
+         <property name="text">
+          <string>Options:</string>
+         </property>
+         <property name="buddy">
+          <cstring>fontspecSansLE</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="fontspecSansLE">
+         <property name="toolTip">
+          <string>Here you can insert additional options (as provided by the font package)</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="6" column="0">
+      <widget class="QLabel" name="fontsTypewriterLA">
+       <property name="text">
+        <string>&amp;Typewriter:</string>
        </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
+       <property name="buddy">
+        <cstring>fontsTypewriterCO</cstring>
        </property>
-      </spacer>
+      </widget>
+     </item>
+     <item row="6" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_7">
+       <item>
+        <widget class="QComboBox" name="fontsTypewriterCO">
+         <property name="toolTip">
+          <string>Select the typewriter (monospaced) typeface</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_3">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLabel" name="scaleTypewriterLA">
+         <property name="text">
+          <string>Sc&amp;ale (%):</string>
+         </property>
+         <property name="buddy">
+          <cstring>scaleTypewriterSB</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QSpinBox" name="scaleTypewriterSB">
+         <property name="toolTip">
+          <string>Scale the Typewriter font to match the base font's dimensions</string>
+         </property>
+         <property name="minimum">
+          <number>10</number>
+         </property>
+         <property name="maximum">
+          <number>200</number>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item row="7" column="1">
+      <layout class="QHBoxLayout" name="horizontalLayout_4">
+       <item>
+        <widget class="QLabel" name="fontspecTypewriterLA">
+         <property name="text">
+          <string>Options:</string>
+         </property>
+         <property name="buddy">
+          <cstring>fontspecTypewriterLE</cstring>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="fontspecTypewriterLE">
+         <property name="toolTip">
+          <string>Here you can insert additional options (as provided by the font package)</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
      </item>
-     <item>
-      <widget class="QLabel" name="scaleSansLA">
+     <item row="8" column="0">
+      <widget class="QLabel" name="fontsMathLA">
        <property name="text">
-        <string>S&amp;cale (%):</string>
+        <string>&amp;Math:</string>
        </property>
        <property name="buddy">
-        <cstring>scaleSansSB</cstring>
+        <cstring>fontsMathCO</cstring>
        </property>
       </widget>
      </item>
-     <item>
-      <widget class="QSpinBox" name="scaleSansSB">
+     <item row="8" column="1">
+      <widget class="QComboBox" name="fontsMathCO">
        <property name="toolTip">
-        <string>Scale the Sans Serif font to match the base font's dimensions</string>
+        <string>Select the math typeface</string>
        </property>
-       <property name="minimum">
-        <number>10</number>
+      </widget>
+     </item>
+     <item row="9" column="0">
+      <widget class="QLabel" name="cjkFontLA">
+       <property name="text">
+        <string>C&amp;JK:</string>
        </property>
-       <property name="maximum">
-        <number>200</number>
+       <property name="buddy">
+        <cstring>cjkFontLE</cstring>
        </property>
       </widget>
      </item>
-    </layout>
-   </item>
-   <item row="5" column="0">
-    <widget class="QLabel" name="fontsTypewriterLA">
-     <property name="text">
-      <string>&amp;Typewriter:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontsTypewriterCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="5" column="1">
-    <layout class="QHBoxLayout" name="horizontalLayout_4">
-     <item>
-      <widget class="QComboBox" name="fontsTypewriterCO">
+     <item row="9" column="1">
+      <widget class="QLineEdit" name="cjkFontLE">
        <property name="toolTip">
-        <string>Select the typewriter (monospaced) typeface</string>
+        <string>Input the font to be used for Chinese, Japanese or Korean (CJK) script</string>
        </property>
       </widget>
      </item>
-     <item>
-      <spacer name="horizontalSpacer_3">
-       <property name="orientation">
-        <enum>Qt::Horizontal</enum>
+     <item row="10" column="1">
+      <widget class="QCheckBox" name="fontScCB">
+       <property name="toolTip">
+        <string>Use a real small caps shape, if the font provides one</string>
        </property>
-       <property name="sizeHint" stdset="0">
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
+       <property name="text">
+        <string>Use true s&amp;mall caps</string>
        </property>
-      </spacer>
+      </widget>
      </item>
-     <item>
-      <widget class="QLabel" name="scaleTypewriterLA">
-       <property name="text">
-        <string>Sc&amp;ale (%):</string>
+     <item row="11" column="1">
+      <widget class="QCheckBox" name="fontOsfCB">
+       <property name="toolTip">
+        <string>Use old style instead of lining figures</string>
        </property>
-       <property name="buddy">
-        <cstring>scaleTypewriterSB</cstring>
+       <property name="text">
+        <string>Use &amp;old style figures</string>
        </property>
       </widget>
      </item>
-     <item>
-      <widget class="QSpinBox" name="scaleTypewriterSB">
+     <item row="12" column="1">
+      <widget class="QCheckBox" name="microtypeCB">
        <property name="toolTip">
-        <string>Scale the Typewriter font to match the base font's dimensions</string>
+        <string>Activate extensions such as character protrusion and font expansion via the microtype package</string>
        </property>
-       <property name="minimum">
-        <number>10</number>
+       <property name="text">
+        <string>Enable micr&amp;o-typographic extensions</string>
+       </property>
+      </widget>
+     </item>
+     <item row="13" column="1">
+      <widget class="QCheckBox" name="dashesCB">
+       <property name="toolTip">
+        <string>By default, a line break can occur after en- and em-dashes. Checking this box prevents that.</string>
        </property>
-       <property name="maximum">
-        <number>200</number>
+       <property name="text">
+        <string>Disallow l&amp;ine breaks after dashes</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
-   <item row="6" column="0">
-    <widget class="QLabel" name="fontsMathLA">
-     <property name="text">
-      <string>&amp;Math:</string>
-     </property>
-     <property name="buddy">
-      <cstring>fontsMathCO</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="6" column="1">
-    <widget class="QComboBox" name="fontsMathCO">
-     <property name="toolTip">
-      <string>Select the math typeface</string>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="0">
-    <widget class="QLabel" name="cjkFontLA">
-     <property name="text">
-      <string>C&amp;JK:</string>
-     </property>
-     <property name="buddy">
-      <cstring>cjkFontLE</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="1">
-    <widget class="QLineEdit" name="cjkFontLE">
-     <property name="toolTip">
-      <string>Input the font to be used for Chinese, Japanese or Korean (CJK) script</string>
-     </property>
-    </widget>
-   </item>
-   <item row="8" column="1">
-    <widget class="QCheckBox" name="fontScCB">
-     <property name="toolTip">
-      <string>Use a real small caps shape, if the font provides one</string>
-     </property>
-     <property name="text">
-      <string>Use true s&amp;mall caps</string>
-     </property>
-    </widget>
-   </item>
-   <item row="9" column="1">
-    <widget class="QCheckBox" name="fontOsfCB">
-     <property name="toolTip">
-      <string>Use old style instead of lining figures</string>
-     </property>
-     <property name="text">
-      <string>Use &amp;old style figures</string>
-     </property>
-    </widget>
-   </item>
-   <item row="10" column="1">
-    <widget class="QCheckBox" name="microtypeCB">
-     <property name="toolTip">
-      <string>Activate extensions such as character protrusion and font expansion via the microtype package</string>
-     </property>
-     <property name="text">
-      <string>Enable micr&amp;o-typographic extensions</string>
-     </property>
-    </widget>
-   </item>
-   <item row="11" column="1">
-    <widget class="QCheckBox" name="dashesCB">
-     <property name="toolTip">
-      <string>By default, a line break can occur after en- and em-dashes. Checking this box prevents that.</string>
-     </property>
-     <property name="text">
-      <string>Disallow l&amp;ine breaks after dashes</string>
-     </property>
-    </widget>
-   </item>
-   <item row="12" column="1">
+   <item row="2" column="1">
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
index 739af0f86cb101924a08411291b9593a3a32ecf3..e741f1f90104a61296e3fd493dc75de419edc99c 100644 (file)
@@ -535,6 +535,9 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
        h_font_sf_scale[1]        = "100";
        h_font_tt_scale[0]        = "100";
        h_font_tt_scale[1]        = "100";
+       // h_font_roman_opts;
+       // h_font_sans_opts;
+       // h_font_typewriter_opts;
        //h_font_cjk
        h_is_mathindent           = "0";
        h_math_numbering_side     = "default";
@@ -782,14 +785,26 @@ void Preamble::handle_package(Parser &p, string const & name,
 
        if (name == "MinionPro") {
                h_font_roman[0] = "minionpro";
-               if (opts.find("lf") != string::npos)
-                       h_font_osf = "false";
-               else
-                       h_font_osf = "true";
-               if (opts.find("onlytext") != string::npos)
-                       h_font_math[0] = "default";
-               else
-                       h_font_math[0] = "auto";
+               vector<string> allopts = getVectorFromString(opts);
+               string xopts;
+               h_font_osf = "true";
+               h_font_math[0] = "auto";
+               for (auto const & opt : allopts) {
+                       if (opt == "lf") {
+                               h_font_osf = "false";
+                               continue;
+                       }
+                       if (opt == "onlytext") {
+                               h_font_math[0] = "default";
+                               continue;
+                       }
+                       if (!xopts.empty())
+                               xopts += ", ";
+                       xopts += opt;
+               }
+               if (!xopts.empty())
+                       h_font_roman_opts = xopts;
+               options.clear();
        }
 
        if (name == "mathdesign") {
@@ -1423,13 +1438,19 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled
           << "\\font_default_family " << h_font_default_family << "\n"
           << "\\use_non_tex_fonts " << (h_use_non_tex_fonts ? "true" : "false") << '\n'
           << "\\font_sc " << h_font_sc << "\n"
-          << "\\font_osf " << h_font_osf << "\n"
-          << "\\font_sf_scale " << h_font_sf_scale[0]
-          << ' ' << h_font_sf_scale[1] << '\n'
-          << "\\font_tt_scale " << h_font_tt_scale[0]
+          << "\\font_osf " << h_font_osf << "\n";
+       if (!h_font_roman_opts.empty())
+               os << "\\font_roman_opts \"" << h_font_roman_opts << "\"" << '\n';
+       os << "\\font_sf_scale " << h_font_sf_scale[0]
+          << ' ' << h_font_sf_scale[1] << '\n';
+       if (!h_font_sans_opts.empty())
+               os << "\\font_sans_opts \"" << h_font_sans_opts << "\"" << '\n';
+       os << "\\font_tt_scale " << h_font_tt_scale[0]
           << ' ' << h_font_tt_scale[1] << '\n';
        if (!h_font_cjk.empty())
                os << "\\font_cjk " << h_font_cjk << '\n';
+       if (!h_font_typewriter_opts.empty())
+               os << "\\font_typewriter_opts \"" << h_font_typewriter_opts << "\"" << '\n';
        os << "\\use_microtype " << h_use_microtype << '\n'
           << "\\use_dash_ligatures " << h_use_dash_ligatures << '\n'
           << "\\graphics " << h_graphics << '\n'
@@ -1683,35 +1704,58 @@ void Preamble::parse(Parser & p, string const & forceclass,
                }
 
                if (t.cs() == "setmainfont") {
-                       // we don't care about the option
-                       p.hasOpt() ? p.getOpt() : string();
+                       string fontopts = p.hasOpt() ? p.getArg('[', ']') : string();
                        h_font_roman[1] = p.getArg('{', '}');
+                       if (!fontopts.empty()) {
+                               vector<string> opts = getVectorFromString(fontopts);
+                               fontopts.clear();
+                               for (auto const & opt : opts) {
+                                       if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
+                                               // ignore
+                                               continue;
+                                       if (!fontopts.empty())
+                                               fontopts += ", ";
+                                       fontopts += opt;
+                               }
+                               h_font_roman_opts = fontopts;
+                       }
                        continue;
                }
 
                if (t.cs() == "setsansfont" || t.cs() == "setmonofont") {
                        // LyX currently only supports the scale option
-                       string scale;
+                       string scale, fontopts;
                        if (p.hasOpt()) {
-                               string fontopts = p.getArg('[', ']');
-                               // check if the option contains a scaling, if yes, extract it
-                               string::size_type pos = fontopts.find("Scale");
-                               if (pos != string::npos) {
-                                       string::size_type i = fontopts.find(',', pos);
-                                       if (i == string::npos)
-                                               scale_as_percentage(fontopts.substr(pos + 1), scale);
-                                       else
-                                               scale_as_percentage(fontopts.substr(pos, i - pos), scale);
+                               fontopts = p.getArg('[', ']');
+                               if (!fontopts.empty()) {
+                                       vector<string> opts = getVectorFromString(fontopts);
+                                       fontopts.clear();
+                                       for (auto const & opt : opts) {
+                                               if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
+                                                       // ignore
+                                                       continue;
+                                               if (prefixIs(opt, "Scale=")) {
+                                                       scale_as_percentage(opt, scale);
+                                                       continue;
+                                               }
+                                               if (!fontopts.empty())
+                                                       fontopts += ", ";
+                                               fontopts += opt;
+                                       }
                                }
                        }
                        if (t.cs() == "setsansfont") {
                                if (!scale.empty())
                                        h_font_sf_scale[1] = scale;
                                h_font_sans[1] = p.getArg('{', '}');
+                               if (!fontopts.empty())
+                                       h_font_sans_opts = fontopts;
                        } else {
                                if (!scale.empty())
                                        h_font_tt_scale[1] = scale;
                                h_font_typewriter[1] = p.getArg('{', '}');
+                               if (!fontopts.empty())
+                                       h_font_typewriter_opts = fontopts;
                        }
                        continue;
                }
@@ -1725,33 +1769,55 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        // we don't care about the lang option
                        string const lang = p.hasOpt() ? p.getArg('[', ']') : string();
                         string const family = p.getArg('{', '}');
-                       string const fontopts = p.hasOpt() ? p.getArg('[', ']') : string();
+                       string fontopts = p.hasOpt() ? p.getArg('[', ']') : string();
                        string const fontname = p.getArg('{', '}');
                         if (lang.empty() && family == "rm") {
                                h_font_roman[1] = fontname;
+                               if (!fontopts.empty()) {
+                                       vector<string> opts = getVectorFromString(fontopts);
+                                       fontopts.clear();
+                                       for (auto const & opt : opts) {
+                                               if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
+                                                       // ignore
+                                                       continue;
+                                               if (!fontopts.empty())
+                                                       fontopts += ", ";
+                                               fontopts += opt;
+                                       }
+                                       h_font_roman_opts = fontopts;
+                               }
                                continue;
                        } else if (lang.empty() && (family == "sf" || family == "tt")) {
                                // LyX currently only supports the scale option
                                string scale;
                                if (!fontopts.empty()) {
-                                       // check if the option contains a scaling, if yes, extract it
-                                       string::size_type pos = fontopts.find("Scale");
-                                       if (pos != string::npos) {
-                                               string::size_type i = fontopts.find(',', pos);
-                                               if (i == string::npos)
-                                                       scale_as_percentage(fontopts.substr(pos + 1), scale);
-                                               else
-                                                       scale_as_percentage(fontopts.substr(pos, i - pos), scale);
+                                       vector<string> opts = getVectorFromString(fontopts);
+                                       fontopts.clear();
+                                       for (auto const & opt : opts) {
+                                               if (opt == "Mapping=tex-text" || opt == "Ligatures=TeX")
+                                                       // ignore
+                                                       continue;
+                                               if (prefixIs(opt, "Scale=")) {
+                                                       scale_as_percentage(opt, scale);
+                                                       continue;
+                                               }
+                                               if (!fontopts.empty())
+                                                       fontopts += ", ";
+                                               fontopts += opt;
                                        }
                                }
                                if (family == "sf") {
                                        if (!scale.empty())
                                                h_font_sf_scale[1] = scale;
                                        h_font_sans[1] = fontname;
+                                       if (!fontopts.empty())
+                                               h_font_sans_opts = fontopts;
                                } else {
                                        if (!scale.empty())
                                                h_font_tt_scale[1] = scale;
                                        h_font_typewriter[1] = fontname;
+                                       if (!fontopts.empty())
+                                               h_font_typewriter_opts = fontopts;
                                }
                                continue;
                        } else {
index 6c11d889c32c644c73ddac08957270954a9743ce..1130ad2d5bbea252d6053a5414d0fe799015248a 100644 (file)
@@ -166,6 +166,9 @@ private:
        std::string h_font_roman[2];
        std::string h_font_sans[2];
        std::string h_font_typewriter[2];
+       std::string h_font_roman_opts;
+       std::string h_font_sans_opts;
+       std::string h_font_typewriter_opts;
        std::string h_font_default_family;
        bool h_use_non_tex_fonts;
        std::string h_font_sc;
index 386d72efa80810c00e37fa0cd1c940a8175a5f0f..0d53cde07da29e3e9f345ab6482bd7056a531ff4 100644 (file)
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
 
 // Do not remove the comment below, so we get merge conflict in
 // independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 579 // spitz: babelfont
-#define LYX_FORMAT_TEX2LYX 579
+#define LYX_FORMAT_LYX 580 // spitz/uwestoehr: support for fontspec options
+#define LYX_FORMAT_TEX2LYX 580
 
 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
 #ifndef _MSC_VER