]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Preamble.cpp
Missing file format bis from 0c3b88e3
[lyx.git] / src / tex2lyx / Preamble.cpp
index a7ef65f53fd958ba71415486e878fea7e7ac307c..bb74519f57d958250e2e9fbc8b06ab94f84549b1 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"
@@ -129,10 +130,8 @@ 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",
@@ -181,9 +180,9 @@ const char * const known_xetex_packages[] = {"arabxetex", "fixlatvian",
 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", "refstyle", "rotating", "rotfloat", "splitidx",
-"setspace", "subscript", "textcomp", "tipa", "tipx", "tone", "ulem", "url",
-"varioref", "verbatim", "wrapfig", "xunicode", 0};
+"multirow", "nomencl", "pdfpages", "prettyref", "refstyle", "rotating",
+"rotfloat", "splitidx", "setspace", "subscript", "textcomp", "tipa", "tipx",
+"tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xunicode", 0};
 
 // used for the handling of \newindex
 int index_number = 0;
@@ -303,10 +302,10 @@ 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",
+"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",
 "american", "ancient", "australian", "british", "monotonic", "newzealand",
 "polytonic", 0};
@@ -321,10 +320,10 @@ 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",
+"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",
 "american", "ancientgreek", "australian", "british", "greek", "newzealand",
 "polutonikogreek", 0};
@@ -450,7 +449,7 @@ 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;
@@ -498,7 +497,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 +505,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";
@@ -522,9 +521,10 @@ Preamble::Preamble() : one_language(true), explicit_babel(false),
        h_use_geometry            = "false";
        h_use_default_options     = "false";
        h_use_hyperref            = "false";
-       h_use_refstyle            = "0";
+       h_use_refstyle            = false;
        h_use_packages["amsmath"]    = "1";
        h_use_packages["amssymb"]    = "0";
+       h_use_packages["cancel"]     = "0";
        h_use_packages["esint"]      = "1";
        h_use_packages["mhchem"]     = "0";
        h_use_packages["mathdots"]   = "0";
@@ -770,7 +770,7 @@ void Preamble::handle_package(Parser &p, string const & name,
                ||      is_known(name, known_typewriter_fonts) || is_known(name, known_math_fonts))
                ;
 
-       else if (name == "amsmath" || name == "amssymb" ||
+       else if (name == "amsmath" || name == "amssymb" || name == "cancel" ||
                 name == "esint" || name == "mhchem" || name == "mathdots" ||
                 name == "mathtools" || name == "stackrel" ||
                 name == "stmaryrd" || name == "undertilde")
@@ -844,7 +844,7 @@ void Preamble::handle_package(Parser &p, string const & name,
        }
 
        else if (name == "CJKutf8") {
-               h_inputencoding = "UTF8";
+               h_inputencoding = "utf8-cjk";
                p.setEncoding("UTF-8");
                registerAutomaticallyLoadedPackage("CJKutf8");
        }
@@ -863,14 +863,22 @@ void Preamble::handle_package(Parser &p, string const & name,
                // h_inputencoding is only set when there is not more than one
                // inputenc option because otherwise h_inputencoding must be
                // set to "auto" (the default encoding of the document language)
-               // Therefore check for the "," character.
+               // Therefore check that exactly one option is passed to inputenc.
                // It is also only set when there is not more than one babel
                // language option.
-               if (opts.find(",") == string::npos && one_language == true)
-                       h_inputencoding = opts;
-               if (!options.empty())
-                       p.setEncoding(options.back(), Encoding::inputenc);
-               options.clear();
+               if (!options.empty()) {
+                       string const encoding = options.back();
+                       Encoding const * const enc = encodings.fromLaTeXName(
+                               encoding, Encoding::inputenc, true);
+                       if (!enc)
+                               cerr << "Unknown encoding " << encoding << ". Ignoring." << std::endl;
+                       else {
+                               if (!enc->unsafe() && options.size() == 1 && one_language == true)
+                                       h_inputencoding = enc->name();
+                               p.setEncoding(enc->iconvName());
+                       }
+                       options.clear();
+               }
        }
 
        else if (name == "srcltx") {
@@ -889,9 +897,6 @@ void Preamble::handle_package(Parser &p, string const & name,
                h_language_package = "\\usepackage{" + name + "}";
        }
 
-       else if (name == "prettyref")
-               ; // ignore this FIXME: Use the package separator mechanism instead
-
        else if (name == "lyxskak") {
                // ignore this and its options
                const char * const o[] = {"ps", "mover", 0};
@@ -902,7 +907,9 @@ void Preamble::handle_package(Parser &p, string const & name,
                if (name == "splitidx")
                        h_use_indices = "true";
                if (name == "refstyle")
-                       h_use_refstyle = "1";
+                       h_use_refstyle = true;
+               else if (name == "prettyref")
+                       h_use_refstyle = false;
                if (!in_lyx_preamble) {
                        h_preamble << package_beg_sep << name
                                   << package_mid_sep << "\\usepackage{"
@@ -950,6 +957,18 @@ void Preamble::handle_package(Parser &p, string const & name,
        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 << '}';
@@ -1031,7 +1050,10 @@ 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)
+       os << "#LyX file created by tex2lyx " << lyx_version_major << '.'
+          << lyx_version_minor << '\n'
           << "\\lyxformat " << LYX_FORMAT << '\n'
           << "\\begin_document\n"
           << "\\begin_header\n"
@@ -1403,17 +1425,11 @@ void Preamble::parse(Parser & p, string const & forceclass,
                        string const name = p.verbatim_item();
                        string const body1 = p.verbatim_item();
                        string const body2 = p.verbatim_item();
-                       // store the in_lyx_preamble setting
-                       bool const was_in_lyx_preamble = in_lyx_preamble;
-                       if (name == "subref"
-                               || name == "thmref"
-                               || name == "lemref") {
-                               p.skip_spaces();
-                               preamble.registerAutomaticallyLoadedPackage("refstyle");
-                               in_lyx_preamble = true;
-                       }
                        // only non-lyxspecific stuff
-                       if (!in_lyx_preamble) {
+                       if (in_lyx_preamble &&
+                           (name == "subref" || name == "thmref" || name == "lemref"))
+                               p.skip_spaces();
+                       else {
                                ostringstream ss;
                                ss << '\\' << t.cs();
                                ss << '{' << name << '}'
@@ -1421,15 +1437,13 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                   << '{' << body2 << '}';
                                h_preamble << ss.str();
                        }
-                       // restore the in_lyx_preamble setting
-                       in_lyx_preamble = was_in_lyx_preamble;
                }
                
                else if (t.cs() == "AtBeginDocument") {
                        string const name = p.verbatim_item();
-                       // store the in_lyx_preamble setting
-                       bool const was_in_lyx_preamble = in_lyx_preamble;
-                       if (name == "\\providecommand\\partref[1]{\\ref{part:#1}}"
+                       // only non-lyxspecific stuff
+                       if (in_lyx_preamble &&
+                           (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}}"
@@ -1443,20 +1457,14 @@ void Preamble::parse(Parser & p, string const & forceclass,
                                || name == "\\providecommand\\lemref[1]{\\ref{lem:#1}}"
                                || name == "\\providecommand\\thmref[1]{\\ref{thm:#1}}"
                                || name == "\\providecommand\\corref[1]{\\ref{cor:#1}}"
-                               || name == "\\providecommand\\propref[1]{\\ref{prop:#1}}") {
+                               || name == "\\providecommand\\propref[1]{\\ref{prop:#1}}"))
                                p.skip_spaces();
-                               preamble.registerAutomaticallyLoadedPackage("refstyle");
-                               in_lyx_preamble = true;
-                       }
-                       // only non-lyxspecific stuff
-                       if (!in_lyx_preamble) {
+                       else {
                                ostringstream ss;
                                ss << '\\' << t.cs();
                                ss << '{' << name << '}';
                                h_preamble << ss.str();
                        }
-                       // restore the in_lyx_preamble setting
-                       in_lyx_preamble = was_in_lyx_preamble;
                }
 
                else if (t.cs() == "newcommand" || t.cs() == "newcommandx"
@@ -1503,12 +1511,6 @@ 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
                        // if necessary
@@ -1539,22 +1541,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('[', ']'));
@@ -1624,8 +1610,15 @@ void Preamble::parse(Parser & p, string const & forceclass,
 
                else if (t.cs() == "inputencoding") {
                        string const encoding = p.getArg('{','}');
-                       h_inputencoding = encoding;
-                       p.setEncoding(encoding, Encoding::inputenc);
+                       Encoding const * const enc = encodings.fromLaTeXName(
+                               encoding, Encoding::inputenc, true);
+                       if (!enc)
+                               cerr << "Unknown encoding " << encoding << ". Ignoring." << std::endl;
+                       else {
+                               if (!enc->unsafe())
+                                       h_inputencoding = enc->name();
+                               p.setEncoding(enc->iconvName());
+                       }
                }
 
                else if (t.cs() == "newenvironment") {