]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Preamble.cpp
Store both sets of font selections
[lyx.git] / src / tex2lyx / Preamble.cpp
index dbf4d5cfe99af400ebcfa04dc5a23f5c83995950..01587cc02dfbbe0995cde64168ed7cca9e472129 100644 (file)
@@ -21,6 +21,7 @@
 #include "Layout.h"
 #include "Lexer.h"
 #include "TextClass.h"
+#include "version.h"
 
 #include "support/convert.h"
 #include "support/FileName.h"
@@ -38,9 +39,6 @@ using namespace lyx::support;
 
 namespace lyx {
 
-// special columntypes
-extern map<char, int> special_columns;
-
 Preamble preamble;
 
 namespace {
@@ -58,14 +56,15 @@ const char * const known_languages[] = {"acadian", "afrikaans", "albanian",
 "bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
 "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "francais",
 "french", "frenchb", "frenchle", "frenchpro", "galician", "german", "germanb",
-"greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian", "interlingua",
-"irish", "italian", "japanese", "kazakh", "kurmanji", "latin", "latvian", "lithuanian",
-"lowersorbian", "lsorbian", "magyar", "malay", "meyalu", "mongolian", "naustrian",
-"newzealand", "ngerman", "ngermanb", "norsk", "nynorsk", "polutonikogreek", "polish",
-"portuges", "portuguese", "romanian", "russian", "russianb", "samin",
-"scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish",
-"swedish", "thai", "turkish", "turkmen", "ukraineb", "ukrainian",
-"uppersorbian", "UKenglish", "USenglish", "usorbian", "vietnam", "welsh",
+"georgian", "greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian",
+"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
+"latvian", "lithuanian", "lowersorbian", "lsorbian", "magyar", "malay", "meyalu",
+"mongolian", "naustrian", "newzealand", "ngerman", "ngermanb", "norsk", "nswissgerman",
+"nynorsk", "polutonikogreek", "polish", "portuges", "portuguese", "romanian", "russian",
+"russianb", "samin", "scottish", "serbian", "serbian-latin", "slovak",
+"slovene", "spanish", "swedish", "swissgerman", "thai", "turkish", "turkmen",
+"ukraineb", "ukrainian", "uppersorbian", "UKenglish", "USenglish", "usorbian",
+"vietnam", "welsh",
 0};
 
 /**
@@ -78,14 +77,15 @@ const char * const known_coded_languages[] = {"french", "afrikaans", "albanian",
 "bulgarian", "canadian", "canadien", "catalan", "croatian", "czech", "danish",
 "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "french",
 "french", "french", "french", "french", "galician", "german", "german",
-"greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa", "interlingua",
-"irish", "italian", "japanese", "kazakh", "kurmanji", "latin", "latvian", "lithuanian",
-"lowersorbian", "lowersorbian", "magyar", "bahasam", "bahasam", "mongolian", "naustrian",
-"newzealand", "ngerman", "ngerman", "norsk", "nynorsk", "polutonikogreek", "polish",
-"portuguese", "portuguese", "romanian", "russian", "russian", "samin",
-"scottish", "serbian", "serbian-latin", "slovak", "slovene", "spanish",
-"swedish", "thai", "turkish", "turkmen", "ukrainian", "ukrainian",
-"uppersorbian", "uppersorbian", "english", "english", "vietnamese", "welsh",
+"georgian", "greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa",
+"interlingua", "irish", "italian", "japanese", "kazakh", "kurmanji", "latin",
+"latvian", "lithuanian", "lowersorbian", "lowersorbian", "magyar", "bahasam", "bahasam",
+"mongolian", "naustrian", "newzealand", "ngerman", "ngerman", "norsk", "german-ch",
+"nynorsk", "polutonikogreek", "polish", "portuguese", "portuguese", "romanian", "russian",
+"russian", "samin", "scottish", "serbian", "serbian-latin", "slovak",
+"slovene", "spanish", "swedish", "german-ch-old", "thai", "turkish", "turkmen",
+"ukrainian", "ukrainian", "uppersorbian", "english", "english", "uppersorbian",
+"vietnamese", "welsh",
 0};
 
 /// languages with danish quotes (.lyx names)
@@ -106,7 +106,7 @@ const char * const known_french_quotes_languages[] = {"albanian",
 
 /// languages with german quotes (.lyx names)
 const char * const known_german_quotes_languages[] = {"austrian", "bulgarian",
-"czech", "german", "icelandic", "lithuanian", "lowersorbian", "naustrian",
+"czech", "german", "georgian", "icelandic", "lithuanian", "lowersorbian", "naustrian",
 "ngerman", "serbian", "serbian-latin", "slovak", "slovene", "uppersorbian", 0};
 
 /// languages with polish quotes (.lyx names)
@@ -129,14 +129,12 @@ const char * const known_roman_fonts[] = { "ae", "beraserif", "bookman",
 "tgbonum", "tgchorus", "tgpagella", "tgschola", "tgtermes", "utopia", 0};
 
 const char * const known_sans_fonts[] = { "avant", "berasans", "biolinum-type1",
-"cmbr", "cmss", "helvet", "kurier", "kurierl", "lmss", "tgadventor", "tgheros", 0};
-
-const char * const known_kurier_fonts[] = { "kurier", "kurierl",
-"kurier-condensed", "kurier-light-condensed", 0};
+"cmbr", "cmss", "helvet", "iwona", "iwonac", "iwonal", "iwonalc", "kurier",
+"kurierc", "kurierl", "kurierlc", "lmss", "tgadventor", "tgheros", 0};
 
 const char * const known_typewriter_fonts[] = { "beramono", "cmtl", "cmtt",
-"courier", "lmtt", "luximono", "fourier", "lmodern", "mathpazo", "mathptmx",
-"newcent", "tgcursor", "txtt", 0};
+"courier", "lmtt", "luximono", "fourier", "libertineMono-type1", "lmodern",
+"mathpazo", "mathptmx", "newcent", "tgcursor", "txtt", 0};
 
 const char * const known_math_fonts[] = { "eulervm", "newtxmath", 0};
 
@@ -161,11 +159,13 @@ const char * const known_if_commands[] = {"if", "ifarydshln", "ifbraket",
 "ifcancel", "ifcolortbl", "ifeurosym", "ifmarginnote", "ifmmode", "ifpdf",
 "ifsidecap", "ifupgreek", 0};
 
-const char * const known_basic_colors[] = {"blue", "black", "cyan", "green",
-"magenta", "red", "white", "yellow", 0};
+const char * const known_basic_colors[] = {"black", "blue", "brown", "cyan",
+       "darkgray", "gray", "green", "lightgray", "lime", "magenta", "orange", "olive",
+       "pink", "purple", "red", "teal", "violet", "white", "yellow", 0};
 
-const char * const known_basic_color_codes[] = {"#0000ff", "#000000", "#00ffff",
-"#00ff00", "#ff00ff", "#ff0000", "#ffffff", "#ffff00", 0};
+const char * const known_basic_color_codes[] = {"#000000", "#0000ff", "#964B00", "#00ffff",
+       "#a9a9a9", "#808080", "#00ff00", "#d3d3d3", "#bfff00", "#ff00ff", "#ff7f00", "#808000",
+       "#ffc0cb", "#800080", "#ff0000", "#008080", "#8f00ff", "#ffffff", "#ffff00", 0};
 
 /// conditional commands with three arguments like \@ifundefined{}{}{}
 const char * const known_if_3arg_commands[] = {"@ifundefined", "IfFileExists",
@@ -180,10 +180,10 @@ const char * const known_xetex_packages[] = {"arabxetex", "fixlatvian",
 /// packages that are automatically skipped if loaded by LyX
 const char * const known_lyx_packages[] = {"amsbsy", "amsmath", "amssymb",
 "amstext", "amsthm", "array", "babel", "booktabs", "calc", "CJK", "color",
-"float", "fontspec", "graphicx", "hhline", "ifthen", "longtable", "makeidx",
-"multirow", "nomencl", "pdfpages", "prettyref", "refstyle", "rotating",
+"float", "fontspec", "framed", "graphicx", "hhline", "ifthen", "longtable",
+"makeidx", "multirow", "nomencl", "pdfpages", "prettyref", "refstyle", "rotating",
 "rotfloat", "splitidx", "setspace", "subscript", "textcomp", "tipa", "tipx",
-"tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xunicode", 0};
+"tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xcolor", "xunicode", 0};
 
 // used for the handling of \newindex
 int index_number = 0;
@@ -296,6 +296,7 @@ string process_keyval_opt(vector<string> & options, string name)
 
 /**
  * known polyglossia language names (including variants)
+ * FIXME: support spelling=old for german variants (german vs. ngerman LyX names etc)
  */
 const char * const Preamble::polyglossia_languages[] = {
 "albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi",
@@ -303,11 +304,11 @@ const char * const Preamble::polyglossia_languages[] = {
 "armenian", "divehi", "interlingua", "polish", "telugu", "asturian", "dutch",
 "irish", "portuges", "thai", "bahasai", "english", "italian", "romanian", "turkish",
 "bahasam", "esperanto", "lao", "russian", "turkmen", "basque", "estonian", "latin",
-"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "urdu", "brazil",
-"brazilian", "finnish", "lithuanian", "scottish", "usorbian", "breton", "french",
-"lsorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak",
-"welsh", "catalan", "german", "malayalam", "slovenian", "coptic", "greek",
-"marathi", "spanish",
+"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "tibetan", "urdu",
+"brazil", "brazilian", "finnish", "lithuanian", "scottish", "usorbian", "breton",
+"french", "lsorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar",
+"slovak", "welsh", "catalan", "german", "malayalam", "slovenian", "coptic", "greek",
+"marathi", "spanish", "austrian",
 "american", "ancient", "australian", "british", "monotonic", "newzealand",
 "polytonic", 0};
 
@@ -321,15 +322,21 @@ const char * const Preamble::coded_polyglossia_languages[] = {
 "armenian", "divehi", "interlingua", "polish", "telugu", "asturian", "dutch",
 "irish", "portuges", "thai", "bahasa", "english", "italian", "romanian", "turkish",
 "bahasam", "esperanto", "lao", "russian", "turkmen", "basque", "estonian", "latin",
-"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "urdu", "brazilian",
-"brazilian", "finnish", "lithuanian", "scottish", "uppersorbian", "breton", "french",
-"lowersorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar", "slovak",
-"welsh", "catalan", "ngerman", "malayalam", "slovene", "coptic", "greek",
-"marathi", "spanish",
+"samin", "ukrainian", "bengali", "farsi", "latvian", "sanskrit", "tibetan", "urdu",
+"brazilian", "brazilian", "finnish", "lithuanian", "scottish", "uppersorbian", "breton",
+"french", "lowersorbian", "serbian", "vietnamese", "bulgarian", "galician", "magyar",
+"slovak", "welsh", "catalan", "ngerman", "malayalam", "slovene", "coptic", "greek",
+"marathi", "spanish", "naustrian",
 "american", "ancientgreek", "australian", "british", "greek", "newzealand",
 "polutonikogreek", 0};
 
 
+bool Preamble::usePolyglossia() const
+{
+       return h_use_non_tex_fonts && h_language_package == "default";
+}
+
+
 bool Preamble::indentParagraphs() const
 {
        return h_paragraph_separation == "indent";
@@ -394,6 +401,15 @@ Author const & Preamble::getAuthor(std::string const & name) const
 }
 
 
+int Preamble::getSpecialTableColumnArguments(char c) const
+{
+       map<char, int>::const_iterator it = special_columns_.find(c);
+       if (it == special_columns_.end())
+               return -1;
+       return it->second;
+}
+
+
 void Preamble::add_package(string const & name, vector<string> & options)
 {
        // every package inherits the global options
@@ -422,7 +438,8 @@ bool scale_as_percentage(string const & scale, string & percentage)
        if (pos != string::npos) {
                string value = scale.substr(pos + 1);
                if (isStrDbl(value)) {
-                       percentage = convert<string>(100 * convert<double>(value));
+                       percentage = convert<string>(
+                               static_cast<int>(100 * convert<double>(value)));
                        return true;
                }
        }
@@ -450,22 +467,28 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
        h_biblio_style            = "plain";
        h_bibtex_command          = "default";
        h_cite_engine             = "basic";
-       h_cite_engine_type        = "numerical";
+       h_cite_engine_type        = "default";
        h_color                   = "#008000";
        h_defskip                 = "medskip";
        //h_float_placement;
        //h_fontcolor;
        h_fontencoding            = "default";
-       h_font_roman              = "default";
-       h_font_sans               = "default";
-       h_font_typewriter         = "default";
-       h_font_math               = "auto";
+       h_font_roman[0]           = "default";
+       h_font_roman[1]           = "default";
+       h_font_sans[0]            = "default";
+       h_font_sans[1]            = "default";
+       h_font_typewriter[0]      = "default";
+       h_font_typewriter[1]      = "default";
+       h_font_math[0]            = "auto";
+       h_font_math[1]            = "auto";
        h_font_default_family     = "default";
-       h_use_non_tex_fonts       = "false";
+       h_use_non_tex_fonts       = false;
        h_font_sc                 = "false";
        h_font_osf                = "false";
-       h_font_sf_scale           = "100";
-       h_font_tt_scale           = "100";
+       h_font_sf_scale[0]        = "100";
+       h_font_sf_scale[1]        = "100";
+       h_font_tt_scale[0]        = "100";
+       h_font_tt_scale[1]        = "100";
        //h_font_cjk
        h_graphics                = "default";
        h_default_output_format   = "default";
@@ -498,7 +521,7 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
        //h_pdf_author;
        //h_pdf_subject;
        //h_pdf_keywords;
-       h_pdf_bookmarks           = "1";
+       h_pdf_bookmarks           = "0";
        h_pdf_bookmarksnumbered   = "0";
        h_pdf_bookmarksopen       = "0";
        h_pdf_bookmarksopenlevel  = "1";
@@ -506,7 +529,7 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
        h_pdf_pdfborder           = "0";
        h_pdf_colorlinks          = "0";
        h_pdf_backref             = "section";
-       h_pdf_pdfusetitle         = "1";
+       h_pdf_pdfusetitle         = "0";
        //h_pdf_pagemode;
        //h_pdf_quoted_options;
        h_quotes_language         = "english";
@@ -659,7 +682,7 @@ void Preamble::handle_package(Parser &p, string const & name,
 
        if (is_known(name, known_xetex_packages)) {
                xetex = true;
-               h_use_non_tex_fonts = "true";
+               h_use_non_tex_fonts = true;
                registerAutomaticallyLoadedPackage("fontspec");
                if (h_inputencoding == "auto")
                        p.setEncoding("UTF-8");
@@ -667,25 +690,25 @@ void Preamble::handle_package(Parser &p, string const & name,
 
        // roman fonts
        if (is_known(name, known_roman_fonts))
-               h_font_roman = name;
+               h_font_roman[0] = name;
 
        if (name == "fourier") {
-               h_font_roman = "utopia";
+               h_font_roman[0] = "utopia";
                // when font uses real small capitals
                if (opts == "expert")
                        h_font_sc = "true";
        }
 
        if (name == "garamondx") {
-               h_font_roman = "garamondx";
+               h_font_roman[0] = "garamondx";
                if (opts == "osfI")
                        h_font_osf = "true";
        }
 
        if (name == "libertine") {
-               h_font_roman = "libertine";
+               h_font_roman[0] = "libertine";
                // this automatically invokes biolinum
-               h_font_sans = "biolinum";
+               h_font_sans[0] = "biolinum";
                if (opts == "osf")
                        h_font_osf = "true";
                else if (opts == "lining")
@@ -693,7 +716,7 @@ void Preamble::handle_package(Parser &p, string const & name,
        }
 
        if (name == "libertine-type1") {
-               h_font_roman = "libertine";
+               h_font_roman[0] = "libertine";
                // NOTE: contrary to libertine.sty, libertine-type1
                // does not automatically invoke biolinum
                if (opts == "lining")
@@ -701,14 +724,14 @@ void Preamble::handle_package(Parser &p, string const & name,
                else if (opts == "osf")
                        h_font_osf = "true";
        }
-       
+
        if (name == "mathdesign") {
                if (opts.find("charter") != string::npos)
-                       h_font_roman = "md-charter";
+                       h_font_roman[0] = "md-charter";
                if (opts.find("garamond") != string::npos)
-                       h_font_roman = "md-garamond";
+                       h_font_roman[0] = "md-garamond";
                if (opts.find("utopia") != string::npos)
-                       h_font_roman = "md-utopia";
+                       h_font_roman[0] = "md-utopia";
                if (opts.find("expert") != string::npos) {
                        h_font_sc = "true";
                        h_font_osf = "true";
@@ -716,55 +739,72 @@ void Preamble::handle_package(Parser &p, string const & name,
        }
 
        else if (name == "mathpazo")
-               h_font_roman = "palatino";
+               h_font_roman[0] = "palatino";
 
        else if (name == "mathptmx")
-               h_font_roman = "times";
+               h_font_roman[0] = "times";
 
        // sansserif fonts
        if (is_known(name, known_sans_fonts)) {
-               h_font_sans = name;
-               if (options.size() == 1) {
-                       if (scale_as_percentage(opts, h_font_sf_scale))
+               h_font_sans[0] = name;
+               if (options.size() >= 1) {
+                       if (scale_as_percentage(opts, h_font_sf_scale[0]))
                                options.clear();
                }
        }
 
-       if (name == "biolinum-type1")
-               h_font_sans = "biolinum";
+       if (name == "biolinum-type1") {
+               h_font_sans[0] = "biolinum";
+               // biolinum can have several options, e.g. [osf,scaled=0.97]
+               string::size_type pos = opts.find("osf");
+               if (pos != string::npos)
+                       h_font_osf = "true";
+       }
 
        // typewriter fonts
        if (is_known(name, known_typewriter_fonts)) {
                // fourier can be set as roman font _only_
                // fourier as typewriter is handled in handling of \ttdefault
                if (name != "fourier") {
-                       h_font_typewriter = name;
-                       if (options.size() == 1) {
-                               if (scale_as_percentage(opts, h_font_tt_scale))
+                       h_font_typewriter[0] = name;
+                       if (options.size() >= 1) {
+                               if (scale_as_percentage(opts, h_font_tt_scale[0]))
                                        options.clear();
                        }
                }
        }
 
+       if (name == "libertineMono-type1") {
+               h_font_typewriter[0] = "libertine-mono";
+       }
+
        // font uses old-style figure
        if (name == "eco")
                h_font_osf = "true";
 
        // math fonts
        if (is_known(name, known_math_fonts))
-               h_font_math = name;
+               h_font_math[0] = name;
 
        if (name == "newtxmath") {
                if (opts.empty())
-                       h_font_math = "newtxmath";
+                       h_font_math[0] = "newtxmath";
                else if (opts == "garamondx")
-                       h_font_math = "garamondx-ntxm";
+                       h_font_math[0] = "garamondx-ntxm";
                else if (opts == "libertine")
-                       h_font_math = "libertine-ntxm";
+                       h_font_math[0] = "libertine-ntxm";
                else if (opts == "minion")
-                       h_font_math = "minion-ntxm";
+                       h_font_math[0] = "minion-ntxm";
        }
 
+       if (name == "iwona")
+               if (opts == "math")
+                       h_font_math[0] = "iwona-math";
+
+       if (name == "kurier")
+               if (opts == "math")
+                       h_font_math[0] = "kurier-math";
+
        // after the detection and handling of special cases, we can remove the
        // fonts, otherwise they would appear in the preamble, see bug #7856
        if (is_known(name, known_roman_fonts) || is_known(name, known_sans_fonts)
@@ -829,7 +869,7 @@ void Preamble::handle_package(Parser &p, string const & name,
        else if (name == "polyglossia") {
                h_language_package = "default";
                h_default_output_format = "pdf4";
-               h_use_non_tex_fonts = "true";
+               h_use_non_tex_fonts = true;
                xetex = true;
                registerAutomaticallyLoadedPackage("xunicode");
                if (h_inputencoding == "auto")
@@ -955,9 +995,24 @@ void Preamble::handle_package(Parser &p, string const & name,
                h_cite_engine_type = "authoryear";
        }
 
+       else if (name == "bibtopic")
+               h_use_bibtopic = "true";
+
        else if (name == "hyperref")
                handle_hyperref(options);
 
+       else if (name == "algorithm2e") {
+               // Load "algorithm2e" module
+               addModule("algorithm2e");
+               // Add the package options to the global document options
+               if (!options.empty()) {
+                       if (h_options.empty())
+                               h_options = join(options, ",");
+                       else
+                               h_options += ',' + join(options, ",");
+               }
+       }
+
        else if (!in_lyx_preamble) {
                if (options.empty())
                        h_preamble << "\\usepackage{" << name << '}';
@@ -999,7 +1054,7 @@ void Preamble::handle_if(Parser & p, bool in_lyx_preamble)
 }
 
 
-bool Preamble::writeLyXHeader(ostream & os, bool subdoc)
+bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiledir)
 {
        // set the quote language
        // LyX only knows the following quotes languages:
@@ -1039,10 +1094,15 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc)
        }
 
        // output the LyX file settings
-       os << "#LyX file created by tex2lyx " << PACKAGE_VERSION << "\n"
+       // Important: Keep the version formatting in sync with LyX and
+       //            lyx2lyx (bug 7951)
+       string const origin = roundtripMode() ? "roundtrip" : outfiledir;
+       os << "#LyX file created by tex2lyx " << lyx_version_major << '.'
+          << lyx_version_minor << '\n'
           << "\\lyxformat " << LYX_FORMAT << '\n'
           << "\\begin_document\n"
           << "\\begin_header\n"
+          << "\\origin " << origin << "\n"
           << "\\textclass " << h_textclass << "\n";
        string const raw = subdoc ? empty_string() : h_preamble.str();
        if (!raw.empty()) {
@@ -1084,16 +1144,20 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc)
           << "\\language_package " << h_language_package << "\n"
           << "\\inputencoding " << h_inputencoding << "\n"
           << "\\fontencoding " << h_fontencoding << "\n"
-          << "\\font_roman " << h_font_roman << "\n"
-          << "\\font_sans " << h_font_sans << "\n"
-          << "\\font_typewriter " << h_font_typewriter << "\n"
-          << "\\font_math " << h_font_math << "\n"
+          << "\\font_roman \"" << h_font_roman[0]
+          << "\" \"" << h_font_roman[1] << "\"\n"
+          << "\\font_sans \"" << h_font_sans[0] << "\" \"" << h_font_sans[1] << "\"\n"
+          << "\\font_typewriter \"" << h_font_typewriter[0]
+          << "\" \"" << h_font_typewriter[1] << "\"\n"
+          << "\\font_math \"" << h_font_math[0] << "\" \"" << h_font_math[1] << "\"\n"
           << "\\font_default_family " << h_font_default_family << "\n"
-          << "\\use_non_tex_fonts " << h_use_non_tex_fonts << "\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 << "\n"
-          << "\\font_tt_scale " << h_font_tt_scale << '\n';
+          << "\\font_sf_scale " << h_font_sf_scale[0]
+          << ' ' << h_font_sf_scale[1] << '\n'
+          << "\\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';
        os << "\\graphics " << h_graphics << '\n'
@@ -1110,13 +1174,13 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc)
           << "\\use_hyperref " << h_use_hyperref << '\n';
        if (h_use_hyperref == "true") {
                if (!h_pdf_title.empty())
-                       os << "\\pdf_title \"" << h_pdf_title << "\"\n";
+                       os << "\\pdf_title " << Lexer::quoteString(h_pdf_title) << '\n';
                if (!h_pdf_author.empty())
-                       os << "\\pdf_author \"" << h_pdf_author << "\"\n";
+                       os << "\\pdf_author " << Lexer::quoteString(h_pdf_author) << '\n';
                if (!h_pdf_subject.empty())
-                       os << "\\pdf_subject \"" << h_pdf_subject << "\"\n";
+                       os << "\\pdf_subject " << Lexer::quoteString(h_pdf_subject) << '\n';
                if (!h_pdf_keywords.empty())
-                       os << "\\pdf_keywords \"" << h_pdf_keywords << "\"\n";
+                       os << "\\pdf_keywords " << Lexer::quoteString(h_pdf_keywords) << '\n';
                os << "\\pdf_bookmarks " << h_pdf_bookmarks << "\n"
                      "\\pdf_bookmarksnumbered " << h_pdf_bookmarksnumbered << "\n"
                      "\\pdf_bookmarksopen " << h_pdf_bookmarksopen << "\n"
@@ -1129,7 +1193,7 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc)
                if (!h_pdf_pagemode.empty())
                        os << "\\pdf_pagemode " << h_pdf_pagemode << '\n';
                if (!h_pdf_quoted_options.empty())
-                       os << "\\pdf_quoted_options \"" << h_pdf_quoted_options << "\"\n";
+                       os << "\\pdf_quoted_options " << Lexer::quoteString(h_pdf_quoted_options) << '\n';
        }
        os << "\\papersize " << h_papersize << "\n"
           << "\\use_geometry " << h_use_geometry << '\n';
@@ -1196,7 +1260,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                      TeX2LyXDocClass & tc)
 {
        // initialize fixed types
-       special_columns['D'] = 3;
+       special_columns_['D'] = 3;
        bool is_full_document = false;
        bool is_lyx_file = false;
        bool in_lyx_preamble = false;
@@ -1303,7 +1367,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                else if (t.cs() == "setmainfont") {
                        // we don't care about the option
                        p.hasOpt() ? p.getOpt() : string();
-                       h_font_roman = p.getArg('{', '}');
+                       h_font_roman[1] = p.getArg('{', '}');
                }
 
                else if (t.cs() == "setsansfont" || t.cs() == "setmonofont") {
@@ -1323,12 +1387,12 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        }
                        if (t.cs() == "setsansfont") {
                                if (!scale.empty())
-                                       h_font_sf_scale = scale;
-                               h_font_sans = p.getArg('{', '}');
+                                       h_font_sf_scale[1] = scale;
+                               h_font_sans[1] = p.getArg('{', '}');
                        } else {
                                if (!scale.empty())
-                                       h_font_tt_scale = scale;
-                               h_font_typewriter = p.getArg('{', '}');
+                                       h_font_tt_scale[1] = scale;
+                               h_font_typewriter[1] = p.getArg('{', '}');
                        }
                }
 
@@ -1413,7 +1477,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        string const body2 = p.verbatim_item();
                        // only non-lyxspecific stuff
                        if (in_lyx_preamble &&
-                           (name == "subref" || name == "thmref" || name == "lemref"))
+                           (name == "subsecref" || name == "thmref" || name == "lemref"))
                                p.skip_spaces();
                        else {
                                ostringstream ss;
@@ -1424,7 +1488,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                h_preamble << ss.str();
                        }
                }
-               
+
                else if (t.cs() == "AtBeginDocument") {
                        string const name = p.verbatim_item();
                        // only non-lyxspecific stuff
@@ -1432,7 +1496,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                            (name == "\\providecommand\\partref[1]{\\ref{part:#1}}"
                                || name == "\\providecommand\\chapref[1]{\\ref{chap:#1}}"
                                || name == "\\providecommand\\secref[1]{\\ref{sec:#1}}"
-                               || name == "\\providecommand\\subref[1]{\\ref{sub:#1}}"
+                               || name == "\\providecommand\\subsecref[1]{\\ref{subsec:#1}}"
                                || name == "\\providecommand\\parref[1]{\\ref{par:#1}}"
                                || name == "\\providecommand\\figref[1]{\\ref{fig:#1}}"
                                || name == "\\providecommand\\tabref[1]{\\ref{tab:#1}}"
@@ -1474,19 +1538,19 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        // font settings
                        if (name == "\\rmdefault")
                                if (is_known(body, known_roman_fonts)) {
-                                       h_font_roman = body;
+                                       h_font_roman[0] = body;
                                        p.skip_spaces();
                                        in_lyx_preamble = true;
                                }
                        if (name == "\\sfdefault")
                                if (is_known(body, known_sans_fonts)) {
-                                       h_font_sans = body;
+                                       h_font_sans[0] = body;
                                        p.skip_spaces();
                                        in_lyx_preamble = true;
                                }
                        if (name == "\\ttdefault")
                                if (is_known(body, known_typewriter_fonts)) {
-                                       h_font_typewriter = body;
+                                       h_font_typewriter[0] = body;
                                        p.skip_spaces();
                                        in_lyx_preamble = true;
                                }
@@ -1497,16 +1561,13 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                p.skip_spaces();
                                in_lyx_preamble = true;
                        }
-                       if (name == "\\bfdefault")
-                               // LyX re-adds this if a kurier font is used
-                               if (is_known(h_font_sans, known_kurier_fonts) && body == "b") {
-                                       p.skip_spaces();
-                                       in_lyx_preamble = true;
-                               }
 
-                       // remove the lyxdot definition that is re-added by LyX
+                       // remove LyX-specific definitions that are re-added by LyX
                        // if necessary
-                       if (name == "\\lyxdot") {
+                       // \lyxline is an ancient command that is converted by tex2lyx into
+                       // a \rule therefore remove its preamble code
+                       if (name == "\\lyxdot" || name == "\\lyxarrow"
+                           || name == "\\lyxline" || name == "\\LyX") {
                                p.skip_spaces();
                                in_lyx_preamble = true;
                        }
@@ -1533,22 +1594,6 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        in_lyx_preamble = was_in_lyx_preamble;
                }
 
-               else if (t.cs() == "edef"){
-                       // we only support this for kurier fonts
-                       string const command = p.next_token().asInput();
-                       p.get_token();
-                       if (command == "\\sfdefault") {
-                               p.getArg('{', '}');
-                               if (h_font_sans == "kurier")
-                                       h_font_sans = "kurier-condensed";
-                               if (h_font_sans == "kurierl")
-                                       h_font_sans = "kurier-light-condensed";
-                               p.skip_spaces();
-                       }
-                       else
-                               h_preamble << "\\edef" << command << "{" << p.getArg('{', '}') << "}\n";
-               }
-
                else if (t.cs() == "documentclass") {
                        vector<string>::iterator it;
                        vector<string> opts = split_options(p.getArg('[', ']'));
@@ -1652,13 +1697,13 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        string const body = p.verbatim_item();
                        string const opt3 = p.getFullOpt();
 
-                       add_known_theorem(name, opt1, !opt2.empty(),
-                               from_utf8("\\newtheorem{" + name + '}' +
-                                         opt1 + opt2 + '{' + body + '}' + opt3));
+                       string const complete = "\\newtheorem{" + name + '}' +
+                                         opt1 + opt2 + '{' + body + '}' + opt3;
+
+                       add_known_theorem(name, opt1, !opt2.empty(), from_utf8(complete));
 
                        if (!in_lyx_preamble)
-                               h_preamble << "\\newtheorem{" << name << '}'
-                                          << opt1 << opt2 << '{' << '}' << opt3;
+                               h_preamble << complete;
                }
 
                else if (t.cs() == "def") {
@@ -1683,7 +1728,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                istringstream is(string(opts, 1));
                                is >> nargs;
                        }
-                       special_columns[name[0]] = nargs;
+                       special_columns_[name[0]] = nargs;
                        h_preamble << "\\newcolumntype{" << name << "}";
                        if (nargs)
                                h_preamble << "[" << nargs << "]";
@@ -1718,7 +1763,7 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                else if (content == "\\bigskipamount")
                                        h_defskip = "bigskip";
                                else
-                                       h_defskip = content;
+                                       h_defskip = translate_len(content);
                        } else
                                h_preamble << "\\setlength{" << name << "}{" << content << "}";
                }