X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FPreamble.cpp;h=4dc363b5e1c563cf14d9c05aab19cfdbb3b7ebf7;hb=02b6586ad7f8631dfd8001e75779baeb7985c80e;hp=5504c535af32215139023e7f9624ca8bac3a9c6f;hpb=5d79cd531de9c2cae684501a148825cbc70a513f;p=lyx.git diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 5504c535af..4dc363b5e1 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -47,7 +47,6 @@ namespace { // "chinese-simplified", "chinese-traditional", "japanese-cjk", "korean" // cannot be supported because it is impossible to determine the correct document // language if CJK is used. -// FIXME: missing support for "japanese" (non-CJK) /** * known babel language names (including synonyms) * not in standard babel: arabic, arabtex, armenian, belarusian, serbian-latin, thai @@ -60,7 +59,7 @@ const char * const known_languages[] = {"acadian", "afrikaans", "albanian", "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "francais", "french", "frenchb", "frenchle", "frenchpro", "galician", "german", "germanb", "greek", "hebrew", "hungarian", "icelandic", "indon", "indonesian", "interlingua", -"irish", "italian", "kazakh", "kurmanji", "latin", "latvian", "lithuanian", +"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", @@ -80,7 +79,7 @@ const char * const known_coded_languages[] = {"french", "afrikaans", "albanian", "dutch", "english", "esperanto", "estonian", "farsi", "finnish", "french", "french", "french", "french", "french", "galician", "german", "german", "greek", "hebrew", "magyar", "icelandic", "bahasa", "bahasa", "interlingua", -"irish", "italian", "kazakh", "kurmanji", "latin", "latvian", "lithuanian", +"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", @@ -89,41 +88,6 @@ 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", @@ -206,8 +170,8 @@ 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", "booktabs", "calc", "CJK", "color", "float", "fontspec", -"graphicx", "hhline", "ifthen", "longtable", "makeidx", "multirow", +"amstext", "amsthm", "array", "babel", "booktabs", "calc", "CJK", "color", "float", +"fontspec", "graphicx", "hhline", "ifthen", "longtable", "makeidx", "multirow", "nomencl", "pdfpages", "rotating", "rotfloat", "splitidx", "setspace", "subscript", "textcomp", "ulem", "url", "varioref", "verbatim", "wrapfig", "xunicode", 0}; @@ -318,6 +282,42 @@ string process_keyval_opt(vector & options, string name) } // anonymous namespace +/** + * known polyglossia language names (including variants) + */ +const char * const Preamble::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 Preamble::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}; + + bool Preamble::indentParagraphs() const { return h_paragraph_separation == "indent"; @@ -470,6 +470,7 @@ Preamble::Preamble() : one_language(true), title_layout_found(false) //h_options; h_output_changes = "false"; h_output_sync = "0"; + //h_output_sync_macro h_papercolumns = "1"; h_paperfontsize = "default"; h_paperorientation = "portrait"; @@ -717,16 +718,26 @@ void Preamble::handle_package(Parser &p, string const & name, // call as document language. If there is no such language option, the // last language in the documentclass options is used. handle_opt(options, known_languages, h_language); - // If babel is called with options, LyX puts them by default into the - // document class options. This works for most languages, except - // for Latvian, Lithuanian, Mongolian, Turkmen and Vietnamese and - // perhaps in future others. - // Therefore keep the babel call as it is as the user might have - // reasons for it. - h_preamble << "\\usepackage[" << opts << "]{babel}\n"; - delete_opt(options, known_languages); - // finally translate the babel name to a LyX name + // translate the babel name to a LyX name h_language = babel2lyx(h_language); + // for Japanese we assume EUC-JP as encoding + // but we cannot determine the exact encoding and thus output also a note + if (h_language == "japanese") { + h_inputencoding = "euc"; + p.setEncoding("EUC-JP"); + is_nonCJKJapanese = true; + // in this case babel can be removed from the preamble + registerAutomaticallyLoadedPackage("babel"); + } else { + // If babel is called with options, LyX puts them by default into the + // document class options. This works for most languages, except + // for Latvian, Lithuanian, Mongolian, Turkmen and Vietnamese and + // perhaps in future others. + // Therefore keep the babel call as it is as the user might have + // reasons for it. + h_preamble << "\\usepackage[" << opts << "]{babel}\n"; + } + delete_opt(options, known_languages); } else h_preamble << "\\usepackage{babel}\n"; @@ -744,7 +755,7 @@ void Preamble::handle_package(Parser &p, string const & name, else if (name == "CJK") { // It is impossible to determine the document language if CJK is used. - // All we can do is to notify the user that he has to set this by hisself. + // All we can do is to notify the user that he has to set this by himself. have_CJK = true; // set the encoding to "auto" because it might be set to "default" by the babel handling // and this would not be correct for CJK @@ -776,6 +787,15 @@ void Preamble::handle_package(Parser &p, string const & name, options.clear(); } + else if (name == "srcltx") { + h_output_sync = "1"; + if (!opts.empty()) { + h_output_sync_macro = "\\usepackage[" + opts + "]{srcltx}"; + options.clear(); + } else + h_output_sync_macro = "\\usepackage{srcltx}"; + } + else if (is_known(name, known_old_language_packages)) { // known language packages from the times before babel // if they are found and not also babel, they will be used as @@ -966,11 +986,13 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc) << "\\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\n" + << "\\font_tt_scale " << h_font_tt_scale << "\n" << "\\graphics " << h_graphics << "\n" << "\\default_output_format " << h_default_output_format << "\n" - << "\\output_sync " << h_output_sync << "\n" - << "\\bibtex_command " << h_bibtex_command << "\n" + << "\\output_sync " << h_output_sync << "\n"; + if (h_output_sync == "1") + os << "\\output_sync_macro \"" << h_output_sync_macro << "\"\n"; + os << "\\bibtex_command " << h_bibtex_command << "\n" << "\\index_command " << h_index_command << "\n"; if (!h_float_placement.empty()) os << "\\float_placement " << h_float_placement << "\n"; @@ -1137,12 +1159,13 @@ void Preamble::parse(Parser & p, string const & forceclass, // 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); + string::size_type k = 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); + variant = langopts.substr(k + 1, langopts.length() - k - 2); else - variant = langopts.substr(pos_var + 8, i - pos_var - 8); + variant = langopts.substr(k + 1, i - k - 1); h_language = variant; } p.verbatim_item(); @@ -1165,16 +1188,30 @@ void Preamble::parse(Parser & p, string const & forceclass, 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() == "setsansfont" || t.cs() == "setmonofont") { + // LyX currently only supports the scale option + string scale; + 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 = scale_as_percentage(fontopts.substr(pos + 1)); + else + scale = scale_as_percentage(fontopts.substr(pos, i - pos)); + } + } + if (t.cs() == "setsansfont") { + if (!scale.empty()) + h_font_sf_scale = scale; + h_font_sans = p.getArg('{', '}'); + } else { + if (!scale.empty()) + h_font_tt_scale = scale; + h_font_typewriter = p.getArg('{', '}'); + } } else if (t.cs() == "date") { @@ -1451,6 +1488,19 @@ void Preamble::parse(Parser & p, string const & forceclass, else if (t.cs() == "setstretch") h_spacing = "other " + p.verbatim_item(); + else if (t.cs() == "synctex") { + // the scheme is \synctex=value + // where value can only be "1" or "-1" + h_output_sync = "1"; + // there can be any character behind the value (e.g. a linebreak or a '\' + // therefore we extract it char by char + p.get_token(); + string value = p.get_token().asInput(); + if (value == "-") + value += p.get_token().asInput(); + h_output_sync_macro = "\\synctex=" + value; + } + else if (t.cs() == "begin") { string const name = p.getArg('{', '}'); if (name == "document") @@ -1595,7 +1645,7 @@ string babel2lyx(string const & language) } -string polyglossia2lyx(string const & language) +string Preamble::polyglossia2lyx(string const & language) { char const * const * where = is_known(language, polyglossia_languages); if (where)