]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/Preamble.cpp
update a tex2lyx test file
[lyx.git] / src / tex2lyx / Preamble.cpp
index ad9b76014cf1b6fab38844bb8679426bf6d6a5b3..4dc363b5e1c563cf14d9c05aab19cfdbb3b7ebf7 100644 (file)
@@ -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<string> & 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";
@@ -718,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";
@@ -745,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
@@ -976,7 +986,7 @@ 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";
@@ -1149,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();
@@ -1177,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") {
@@ -1620,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)