X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FPreamble.cpp;h=a0210d17956a6932bb18d16ef169f3f9441d9110;hb=aa9fed932225bb9344a056df3610258f19fa94dd;hp=6ef3aa886bfaaf7f33975f8ef9124f719422fffd;hpb=9b8773826cb2a59eb563e6f98883912ce591047e;p=lyx.git diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 6ef3aa886b..a0210d1795 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -144,7 +144,7 @@ const char * const known_paper_sizes[] = { "a0paper", "b0paper", "c0paper", const char * const known_class_paper_sizes[] = { "a4paper", "a5paper", "executivepaper", "legalpaper", "letterpaper", 0}; -const char * const known_paper_margins[] = { "lmargin", "tmargin", "rmargin", +const char * const known_paper_margins[] = { "lmargin", "tmargin", "rmargin", "bmargin", "headheight", "headsep", "footskip", "columnsep", 0}; const char * const known_coded_paper_margins[] = { "leftmargin", "topmargin", @@ -167,14 +167,16 @@ const char * const known_if_3arg_commands[] = {"@ifundefined", "IfFileExists", 0}; /// packages that work only in xetex +/// polyglossia is handled separately const char * const known_xetex_packages[] = {"arabxetex", "fixlatvian", -"fontbook", "fontwrap", "mathspec", "philokalia", "polyglossia", "unisugar", +"fontbook", "fontwrap", "mathspec", "philokalia", "unisugar", "xeCJK", "xecolor", "xecyr", "xeindex", "xepersian", "xunicode", 0}; /// packages that are automatically skipped if loaded by LyX -const char * const known_lyx_packages[] = {"array", "booktabs", "calc", -"color", "float", "graphicx", "hhline", "ifthen", "longtable", "makeidx", -"multirow", "nomencl", "pdfpages", "rotfloat", "splitidx", "setspace", +const char * const known_lyx_packages[] = {"amsbsy", "amsmath", "amssymb", +"amstext", "amsthm", "array", "booktabs", "calc", "color", "float", +"graphicx", "hhline", "ifthen", "longtable", "makeidx", "multirow", +"nomencl", "pdfpages", "rotating", "rotfloat", "splitidx", "setspace", "subscript", "textcomp", "ulem", "url", "varioref", "verbatim", "wrapfig", 0}; // codes used to remove packages that are loaded automatically by LyX. @@ -339,7 +341,7 @@ Author const & Preamble::getAuthor(std::string const & name) const { Author author(from_utf8(name), empty_docstring()); for (AuthorList::Authors::const_iterator it = authors_.begin(); - it != authors_.end(); it++) + it != authors_.end(); ++it) if (*it == author) return *it; static Author const dummy; @@ -395,11 +397,13 @@ string remove_braces(string const & value) } // anonymous namespace -Preamble::Preamble() : one_language(true) +Preamble::Preamble() : one_language(true), title_layout_found(false) { //h_backgroundcolor; //h_boxbgcolor; + h_biblio_style = "plain"; h_cite_engine = "basic"; + h_cite_engine_type = "numerical"; h_defskip = "medskip"; //h_float_placement; //h_fontcolor; @@ -408,11 +412,13 @@ Preamble::Preamble() : one_language(true) h_font_sans = "default"; h_font_typewriter = "default"; h_font_default_family = "default"; + 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_graphics = "default"; + h_default_output_format = "default"; h_html_be_strict = "false"; h_html_css_as_file = "0"; h_html_math_output = "0"; @@ -458,14 +464,16 @@ Preamble::Preamble() : one_language(true) h_use_bibtopic = "false"; h_use_indices = "false"; h_use_geometry = "false"; - h_use_amsmath = "1"; h_use_default_options = "false"; - h_use_esint = "1"; h_use_hyperref = "0"; - h_use_mhchem = "0"; - h_use_mathdots = "0"; h_use_refstyle = "0"; - h_use_undertilde = "0"; + h_use_packages["amsmath"] = "1"; + h_use_packages["amssymb"] = "0"; + h_use_packages["esint"] = "1"; + h_use_packages["mhchem"] = "0"; + h_use_packages["mathdots"] = "0"; + h_use_packages["mathtools"] = "0"; + h_use_packages["undertilde"] = "0"; } @@ -590,8 +598,12 @@ void Preamble::handle_package(Parser &p, string const & name, add_package(name, options); string scale; - if (is_known(name, known_xetex_packages)) + if (is_known(name, known_xetex_packages)) { xetex = true; + h_use_non_tex_fonts = "true"; + if (h_inputencoding == "auto") + p.setEncoding("utf8"); + } // roman fonts if (is_known(name, known_roman_fonts)) { @@ -644,20 +656,10 @@ void Preamble::handle_package(Parser &p, string const & name, || is_known(name, known_typewriter_fonts)) ; - else if (name == "amsmath" || name == "amssymb") - h_use_amsmath = "2"; - - else if (name == "esint") - h_use_esint = "2"; - - else if (name == "mhchem") - h_use_mhchem = "2"; - - else if (name == "mathdots") - h_use_mathdots = "2"; - - else if (name == "undertilde") - h_use_undertilde = "2"; + else if (name == "amsmath" || name == "amssymb" || + name == "esint" || name == "mhchem" || name == "mathdots" || + name == "mathtools" || name == "undertilde") + h_use_packages[name] = "2"; else if (name == "babel") { h_language_package = "default"; @@ -684,7 +686,16 @@ void Preamble::handle_package(Parser &p, string const & name, delete_opt(options, known_languages); } else - h_preamble << "\\usepackage{babel}\n"; + h_preamble << "\\usepackage{babel}\n"; + } + + else if (name == "polyglossia") { + h_language_package = "default"; + h_default_output_format = "pdf4"; + h_use_non_tex_fonts = "true"; + xetex = true; + if (h_inputencoding == "auto") + p.setEncoding("utf8"); } else if (name == "fontenc") { @@ -728,6 +739,8 @@ void Preamble::handle_package(Parser &p, string const & name, } else if (is_known(name, known_lyx_packages) && options.empty()) { + if (name == "splitidx") + h_use_indices = "true"; if (!in_lyx_preamble) h_preamble << package_beg_sep << name << package_mid_sep << "\\usepackage{" @@ -744,7 +757,9 @@ void Preamble::handle_package(Parser &p, string const & name, h_language = name; else if (name == "natbib") { - h_cite_engine = "natbib_authoryear"; + h_biblio_style = "plainnat"; + h_cite_engine = "natbib"; + h_cite_engine_type = "authoryear"; vector::iterator it = find(options.begin(), options.end(), "authoryear"); if (it != options.end()) @@ -752,24 +767,27 @@ void Preamble::handle_package(Parser &p, string const & name, else { it = find(options.begin(), options.end(), "numbers"); if (it != options.end()) { - h_cite_engine = "natbib_numerical"; + h_cite_engine_type = "numerical"; options.erase(it); } } } - else if (name == "jurabib") + else if (name == "jurabib") { + h_biblio_style = "jurabib"; h_cite_engine = "jurabib"; + h_cite_engine_type = "authoryear"; + } else if (name == "hyperref") handle_hyperref(options); else if (!in_lyx_preamble) { if (options.empty()) - h_preamble << "\\usepackage{" << name << "}"; + h_preamble << "\\usepackage{" << name << "}\n"; else { - h_preamble << "\\usepackage[" << opts << "]{" - << name << "}"; + h_preamble << "\\usepackage[" << opts << "]{" + << name << "}\n"; options.clear(); } } @@ -837,6 +855,11 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) registerAutomaticallyLoadedPackage("float"); if (h_spacing != "single" && h_spacing != "default") registerAutomaticallyLoadedPackage("setspace"); + if (h_use_packages["amsmath"] == "2") { + // amsbsy and amstext are already provided by amsmath + registerAutomaticallyLoadedPackage("amsbsy"); + registerAutomaticallyLoadedPackage("amstext"); + } // output the LyX file settings os << "#LyX file created by tex2lyx " << PACKAGE_VERSION << "\n" @@ -875,7 +898,7 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) os << "\\begin_modules\n"; vector::const_iterator const end = used_modules.end(); vector::const_iterator it = used_modules.begin(); - for (; it != end; it++) + for (; it != end; ++it) os << *it << '\n'; os << "\\end_modules\n"; } @@ -887,11 +910,13 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) << "\\font_sans " << h_font_sans << "\n" << "\\font_typewriter " << h_font_typewriter << "\n" << "\\font_default_family " << h_font_default_family << "\n" + << "\\use_non_tex_fonts " << h_use_non_tex_fonts << "\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" - << "\\graphics " << h_graphics << "\n"; + << "\\graphics " << h_graphics << "\n" + << "\\default_output_format " << h_default_output_format << "\n"; if (!h_float_placement.empty()) os << "\\float_placement " << h_float_placement << "\n"; os << "\\paperfontsize " << h_paperfontsize << "\n" @@ -921,13 +946,13 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) os << "\\pdf_quoted_options \"" << h_pdf_quoted_options << "\"\n"; } os << "\\papersize " << h_papersize << "\n" - << "\\use_geometry " << h_use_geometry << "\n" - << "\\use_amsmath " << h_use_amsmath << "\n" - << "\\use_esint " << h_use_esint << "\n" - << "\\use_mhchem " << h_use_mhchem << "\n" - << "\\use_mathdots " << h_use_mathdots << "\n" - << "\\use_undertilde " << h_use_undertilde << "\n" - << "\\cite_engine " << h_cite_engine << "\n" + << "\\use_geometry " << h_use_geometry << '\n'; + for (map::const_iterator it = h_use_packages.begin(); + it != h_use_packages.end(); ++it) + os << "\\use_package " << it->first << ' ' << it->second << '\n'; + os << "\\cite_engine " << h_cite_engine << '\n' + << "\\cite_engine_type " << h_cite_engine_type << '\n' + << "\\biblio_style " << h_biblio_style << "\n" << "\\use_bibtopic " << h_use_bibtopic << "\n" << "\\use_indices " << h_use_indices << "\n" << "\\paperorientation " << h_paperorientation << '\n' @@ -1011,7 +1036,7 @@ void Preamble::parse(Parser & p, string const & forceclass, t.cat() == catParameter)) h_preamble << t.cs(); - else if (!in_lyx_preamble && + else if (!in_lyx_preamble && (t.cat() == catSpace || t.cat() == catNewline)) h_preamble << t.asInput(); @@ -1024,7 +1049,7 @@ void Preamble::parse(Parser & p, string const & forceclass, // magically switch encoding default if it looks like XeLaTeX static string const magicXeLaTeX = "% This document must be compiled with XeLaTeX "; - if (comment.size() > magicXeLaTeX.size() + if (comment.size() > magicXeLaTeX.size() && comment.substr(0, magicXeLaTeX.size()) == magicXeLaTeX && h_inputencoding == "auto") { cerr << "XeLaTeX comment found, switching to UTF8\n"; @@ -1044,6 +1069,30 @@ void Preamble::parse(Parser & p, string const & forceclass, else if (t.cs() == "pagestyle") h_paperpagestyle = p.verbatim_item(); + else if (t.cs() == "setdefaultlanguage") + h_language = p.verbatim_item(); + + else if (t.cs() == "setotherlanguage") + ; + + else if (t.cs() == "setmainfont") { + // we don't care about the option + p.hasOpt() ? p.getOpt() : string(); + h_font_roman = p.getArg('{', '}'); + } + + else if (t.cs() == "setsansfont") { + // we don't care about the option + p.hasOpt() ? p.getOpt() : string(); + h_font_sans = p.getArg('{', '}'); + } + + else if (t.cs() == "setmonofont") { + // we don't care about the option + p.hasOpt() ? p.getOpt() : string(); + h_font_typewriter = p.getArg('{', '}'); + } + else if (t.cs() == "date") { string argument = p.getArg('{', '}'); if (argument.empty()) @@ -1221,7 +1270,7 @@ void Preamble::parse(Parser & p, string const & forceclass, vector::const_iterator it = vecnames.begin(); vector::const_iterator end = vecnames.end(); for (; it != end; ++it) - handle_package(p, trimSpaceAndEol(*it), options, + handle_package(p, trimSpaceAndEol(*it), options, in_lyx_preamble); } @@ -1249,8 +1298,12 @@ void Preamble::parse(Parser & p, string const & forceclass, else if (t.cs() == "def") { string name = p.get_token().cs(); + // In fact, name may be more than the name: + // In the test case of bug 8116 + // name == "csname SF@gobble@opt \endcsname". + // Therefore, we need to use asInput() instead of cs(). while (p.next_token().cat() != catBegin) - name += p.get_token().cs(); + name += p.get_token().asInput(); if (!in_lyx_preamble) h_preamble << "\\def\\" << name << '{' << p.verbatim_item() << "}"; @@ -1349,6 +1402,9 @@ void Preamble::parse(Parser & p, string const & forceclass, } } + else if (t.cs() == "bibliographystyle") + h_biblio_style = p.verbatim_item(); + else if (t.cs() == "jurabibsetup") { // FIXME p.getArg('{', '}') is most probably wrong (it // does not handle nested braces).