X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FPreamble.cpp;h=c8bd9cbff9ceb549f6f11f39a5aa0c55ffc7f427;hb=7a103ba6d74dd49b7affb84508baaba0d7f2bf07;hp=454f2165c50215719a5d4d3c28f250dde9815e99;hpb=b86c984bf408b47fbd6fc92c4009f9129d0d1ef8;p=lyx.git diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 454f2165c5..c8bd9cbff9 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -92,6 +92,41 @@ const char * const known_coded_languages[] = {"french", "afrikaans", "albanian", "uppersorbian", "uppersorbian", "english", "english", "vietnamese", "welsh", 0}; +/** + * known polyglossia language names (including variants) + */ +const char * const polyglossia_languages[] = { +"albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi", +"nynorsk", "syriac", "arabic", "danish", "icelandic", "occitan", "tamil", +"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", +"american", "ancient", "australian", "british", "monotonic", "newzealand", +"polytonic", 0}; + +/** + * the same as polyglossia_languages with .lyx names + * please keep this in sync with polyglossia_languages line by line! + */ +const char * const coded_polyglossia_languages[] = { +"albanian", "croatian", "hebrew", "norsk", "swedish", "amharic", "czech", "hindi", +"nynorsk", "syriac", "arabic_arabi", "danish", "icelandic", "occitan", "tamil", +"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", +"american", "ancientgreek", "australian", "british", "greek", "newzealand", +"polutonikogreek", 0}; + /// languages with english quotes (.lyx names) const char * const known_english_quotes_languages[] = {"american", "australian", "bahasa", "bahasam", "brazilian", "canadian", "chinese-simplified", "english", @@ -167,16 +202,18 @@ 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[] = {"amsbsy", "amsmath", "amssymb", -"amstext", "amsthm", "array", "booktabs", "calc", "color", "float", +"amstext", "amsthm", "array", "booktabs", "calc", "color", "float", "fontspec", "graphicx", "hhline", "ifthen", "longtable", "makeidx", "multirow", "nomencl", "pdfpages", "rotating", "rotfloat", "splitidx", "setspace", -"subscript", "textcomp", "ulem", "url", "varioref", "verbatim", "wrapfig", 0}; +"subscript", "textcomp", "ulem", "url", "varioref", "verbatim", "wrapfig", +"xunicode", 0}; // codes used to remove packages that are loaded automatically by LyX. // Syntax: package_beg_seppackage_mid_seppackage_end_sep @@ -340,7 +377,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; @@ -417,6 +454,7 @@ Preamble::Preamble() : one_language(true), title_layout_found(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"; @@ -599,6 +637,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"; + registerAutomaticallyLoadedPackage("fontspec"); if (h_inputencoding == "auto") p.setEncoding("utf8"); } @@ -682,11 +721,23 @@ void Preamble::handle_package(Parser &p, string const & name, // reasons for it. h_preamble << "\\usepackage[" << opts << "]{babel}\n"; delete_opt(options, known_languages); + // finally translate the babel name to a LyX name + h_language = babel2lyx(h_language); } else 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; + registerAutomaticallyLoadedPackage("xunicode"); + if (h_inputencoding == "auto") + p.setEncoding("utf8"); + } + else if (name == "fontenc") { h_fontencoding = getStringFromVector(options, ","); /* We could do the following for better round trip support, @@ -810,9 +861,6 @@ void Preamble::handle_if(Parser & p, bool in_lyx_preamble) bool Preamble::writeLyXHeader(ostream & os, bool subdoc) { - // translate from babel to LyX names - h_language = babel2lyx(h_language); - // set the quote language // LyX only knows the following quotes languages: // english, swedish, german, polish, french and danish @@ -887,7 +935,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"; } @@ -904,7 +952,8 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) << "\\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" @@ -936,7 +985,7 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) os << "\\papersize " << h_papersize << "\n" << "\\use_geometry " << h_use_geometry << '\n'; for (map::const_iterator it = h_use_packages.begin(); - it != h_use_packages.end(); it++) + 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' @@ -1057,6 +1106,55 @@ void Preamble::parse(Parser & p, string const & forceclass, else if (t.cs() == "pagestyle") h_paperpagestyle = p.verbatim_item(); + else if (t.cs() == "setdefaultlanguage") { + xetex = true; + // We don't yet care about non-language variant options + // because LyX doesn't support this yet, see bug #8214 + if (p.hasOpt()) { + string langopts = p.getOpt(); + // check if the option contains a variant, if yes, extract it + string::size_type pos_var = langopts.find("variant"); + string::size_type i = langopts.find(',', pos_var); + if (pos_var != string::npos){ + string variant; + if (i == string::npos) + variant = langopts.substr(pos_var + 8, langopts.length() - pos_var - 9); + else + variant = langopts.substr(pos_var + 8, i - pos_var - 8); + h_language = variant; + } + p.verbatim_item(); + } else + h_language = p.verbatim_item(); + //finally translate the poyglossia name to a LyX name + h_language = polyglossia2lyx(h_language); + } + + else if (t.cs() == "setotherlanguage") { + // We don't yet care about the option because LyX doesn't + // support this yet, see bug #8214 + p.hasOpt() ? p.getOpt() : string(); + p.verbatim_item(); + } + + 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()) @@ -1262,8 +1360,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() << "}"; @@ -1471,6 +1573,15 @@ string babel2lyx(string const & language) } +string polyglossia2lyx(string const & language) +{ + char const * const * where = is_known(language, polyglossia_languages); + if (where) + return coded_polyglossia_languages[where - polyglossia_languages]; + return language; +} + + string rgbcolor2code(string const & name) { char const * const * where = is_known(name, known_basic_colors);