X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftex2lyx%2FPreamble.cpp;h=7b69bc4db5392eaa0bbba2853c42684f4866b721;hb=fd5adacef25eb40f813dedd961920c353448213a;hp=ea76e5f8c513dca7384827208b0cfa0a0a29f669;hpb=75156487744566ce52491eb91238c25ca886d531;p=features.git diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index ea76e5f8c5..7b69bc4db5 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -18,7 +18,6 @@ #include "Encoding.h" #include "LayoutFile.h" -#include "Layout.h" #include "Lexer.h" #include "TextClass.h" #include "version.h" @@ -28,10 +27,9 @@ #include "support/filetools.h" #include "support/lstrings.h" -#include "support/regex.h" - #include #include +#include using namespace std; using namespace lyx::support; @@ -123,6 +121,9 @@ const char * const known_german_quotes_languages[] = {"austrian", "bulgarian", const char * const known_polish_quotes_languages[] = {"afrikaans", "bosnian", "croatian", "dutch", "magyar", "polish", "romanian", "serbian", "serbian-latin", 0}; +/// languages with hungarian quotes (.lyx names) +const char * const known_hungarian_quotes_languages[] = {"magyar", 0}; + /// languages with russian quotes (.lyx names) const char * const known_russian_quotes_languages[] = {"azerbaijani", "oldrussian", "russian", "ukrainian", 0}; @@ -142,31 +143,28 @@ const char * const known_old_language_packages[] = {"french", "frenchle", char const * const known_fontsizes[] = { "10pt", "11pt", "12pt", 0 }; const char * const known_roman_font_packages[] = { "ae", "beraserif", "bookman", -"ccfonts", "chancery", "charter", "cmr", "cochineal", "crimson", "DejaVuSerif", "DejaVuSerifCondensed", "fourier", -"garamondx", "libertine", "libertineRoman", "libertine-type1", "lmodern", "mathdesign", "mathpazo", -"mathptmx", "MinionPro", "newcent", "noto", "noto-serif", "PTSerif", "tgbonum", "tgchorus", -"tgpagella", "tgschola", "tgtermes", "utopia", "xcharter", 0 }; +"ccfonts", "chancery", "charter", "cmr", "cochineal", "crimson", "CrimsonPro", "DejaVuSerif", +"DejaVuSerifCondensed", "fourier", "garamondx", "libertine", "libertineRoman", "libertine-type1", +"lmodern", "mathdesign", "mathpazo", "mathptmx", "MinionPro", "newcent", "noto", "noto-serif", +"PTSerif", "tgbonum", "tgchorus", "tgpagella", "tgschola", "tgtermes", "utopia", "xcharter", 0 }; const char * const known_sans_font_packages[] = { "avant", "berasans", "biolinum", "biolinum-type1", "cantarell", "Chivo", "cmbr", "cmss", "DejaVuSans", "DejaVuSansCondensed", "FiraSans", "helvet", "iwona", -"iwonac", "iwonal", "iwonalc", "kurier", "kurierc", "kurierl", "kurierlc", "lmss", "noto", "noto-sans", "PTSans", +"iwonac", "iwonal", "iwonalc", "kurier", "kurierc", "kurierl", "kurierlc", "LibertinusSans-LF", "lmss", "noto-sans", "PTSans", "tgadventor", "tgheros", "uop", 0 }; const char * const known_typewriter_font_packages[] = { "beramono", "cmtl", "cmtt", "courier", "DejaVuSansMono", -"FiraMono", "lmtt", "luximono", "fourier", "libertineMono", "libertineMono-type1", "lmodern", -"mathpazo", "mathptmx", "newcent", "noto", "noto-mono", "PTMono", "tgcursor", "txtt", 0 }; +"FiraMono", "lmtt", "luximono", "libertineMono", "libertineMono-type1", "LibertinusMono-TLF", "lmodern", +"mathpazo", "mathptmx", "newcent", "noto-mono", "PTMono", "tgcursor", "txtt", 0 }; const char * const known_math_font_packages[] = { "eulervm", "newtxmath", 0}; -const char * const known_paper_sizes[] = { "a0paper", "b0paper", "c0paper", +const char * const known_latex_paper_sizes[] = { "a0paper", "b0paper", "c0paper", "a1paper", "b1paper", "c1paper", "a2paper", "b2paper", "c2paper", "a3paper", "b3paper", "c3paper", "a4paper", "b4paper", "c4paper", "a5paper", "b5paper", "c5paper", "a6paper", "b6paper", "c6paper", "executivepaper", "legalpaper", "letterpaper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", 0}; -const char * const known_class_paper_sizes[] = { "a4paper", "a5paper", -"executivepaper", "legalpaper", "letterpaper", 0}; - const char * const known_paper_margins[] = { "lmargin", "tmargin", "rmargin", "bmargin", "headheight", "headsep", "footskip", "columnsep", 0}; @@ -206,7 +204,7 @@ 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", "framed", "graphicx", "hhline", "ifthen", "longtable", -"makeidx", "minted", "multirow", "nomencl", "pdfpages", "prettyref", "refstyle", +"makeidx", "minted", "multirow", "nomencl", "parskip", "pdfpages", "prettyref", "refstyle", "rotating", "rotfloat", "splitidx", "setspace", "subscript", "tabularx","textcomp", "tipa", "tipx", "tone", "ulem", "url", "varioref", "verbatim", "wrapfig", "xcolor", "xltabular", "xunicode", 0}; @@ -298,7 +296,7 @@ vector split_options(string const & input) * \p options and return the value. * The found option is also removed from \p options. */ -string process_keyval_opt(vector & options, string name) +string process_keyval_opt(vector & options, string const & name) { for (size_t i = 0; i < options.size(); ++i) { vector option; @@ -414,9 +412,9 @@ void Preamble::suppressDate(bool suppress) } -void Preamble::registerAuthor(std::string const & name) +void Preamble::registerAuthor(std::string const & name, string const & initials) { - Author author(from_utf8(name), empty_docstring()); + Author author(from_utf8(name), empty_docstring(), from_utf8(initials)); author.setUsed(true); authors_.record(author); h_tracking_changes = "true"; @@ -426,7 +424,7 @@ void Preamble::registerAuthor(std::string const & name) Author const & Preamble::getAuthor(std::string const & name) const { - Author author(from_utf8(name), empty_docstring()); + Author author(from_utf8(name), empty_docstring(), empty_docstring()); for (AuthorList::Authors::const_iterator it = authors_.begin(); it != authors_.end(); ++it) if (*it == author) @@ -448,8 +446,7 @@ int Preamble::getSpecialTableColumnArguments(char c) const void Preamble::add_package(string const & name, vector & options) { // every package inherits the global options - if (used_packages.find(name) == used_packages.end()) - used_packages[name] = split_options(h_options); + used_packages.insert({name, split_options(h_options)}); // Insert options passed via PassOptionsToPackage for (auto const & p : extra_package_options_) { @@ -472,6 +469,16 @@ void Preamble::add_package(string const & name, vector & options) } } +void Preamble::setTextClass(string const & tclass, TeX2LyXDocClass & tc) +{ + h_textclass = tclass; + tc.setName(h_textclass); + if (!LayoutFileList::get().haveClass(h_textclass) || !tc.load()) { + cerr << "Error: Could not read layout file for textclass \"" << h_textclass << "\"." << endl; + exit(EXIT_FAILURE); + } +} + namespace { @@ -546,6 +553,8 @@ Preamble::Preamble() : one_language(true), explicit_babel(false), h_html_be_strict = "false"; h_html_css_as_file = "0"; h_html_math_output = "0"; + h_docbook_table_output = "0"; + h_docbook_mathml_prefix = "1"; h_index[0] = "Index"; h_index_command = "default"; h_inputencoding = "auto-legacy"; @@ -553,11 +562,12 @@ Preamble::Preamble() : one_language(true), explicit_babel(false), h_language = "english"; h_language_package = "none"; //h_listings_params; - h_maintain_unincluded_children = "false"; + h_maintain_unincluded_children = "no"; //h_margins; //h_notefontcolor; //h_options; h_output_changes = "false"; + h_change_bars = "false"; h_output_sync = "0"; //h_output_sync_macro h_papercolumns = "1"; @@ -709,13 +719,18 @@ void Preamble::handle_geometry(vector & options) options.erase(it); } // paper size - // keyval version: "paper=letter" + // keyval version: "paper=letter" or "paper=letterpaper" string paper = process_keyval_opt(options, "paper"); if (!paper.empty()) - h_papersize = paper + "paper"; + if (suffixIs(paper, "paper")) + paper = subst(paper, "paper", ""); // alternative version: "letterpaper" - handle_opt(options, known_paper_sizes, h_papersize); - delete_opt(options, known_paper_sizes); + handle_opt(options, known_latex_paper_sizes, paper); + if (suffixIs(paper, "paper")) + paper = subst(paper, "paper", ""); + delete_opt(options, known_latex_paper_sizes); + if (!paper.empty()) + h_papersize = paper; // page margins char const * const * margin = known_paper_margins; for (; *margin; ++margin) { @@ -850,6 +865,74 @@ void Preamble::handle_package(Parser &p, string const & name, h_font_roman_osf = "true"; } + if (name == "libertinus" || name == "libertinus-type1") { + bool sf = true; + bool tt = true; + bool rm = true; + bool osf = false; + string scalesf; + string scalett; + for (auto const & opt : allopts) { + if (opt == "rm" || opt == "serif") { + tt = false; + sf = false; + continue; + } + if (opt == "sf" || opt == "sans") { + tt = false; + rm = false; + continue; + } + if (opt == "tt=false" || opt == "mono=false") { + tt = false; + continue; + } + if (opt == "osf") { + osf = true; + continue; + } + if (opt == "scaleSF") { + scalesf = opt; + continue; + } + if (opt == "scaleTT") { + scalett = opt; + continue; + } + if (opt == "lining") { + h_font_roman_osf = "false"; + continue; + } + if (!xopts.empty()) + xopts += ", "; + xopts += opt; + } + if (rm) { + h_font_roman[0] = "libertinus"; + if (osf) + h_font_roman_osf = "true"; + else + h_font_roman_osf = "false"; + } + if (sf) { + h_font_sans[0] = "LibertinusSans-LF"; + if (osf) + h_font_sans_osf = "true"; + else + h_font_sans_osf = "false"; + if (!scalesf.empty()) + scale_as_percentage(scalesf, h_font_sf_scale[0]); + } + if (tt) { + h_font_typewriter[0] = "LibertinusMono-TLF"; + if (!scalett.empty()) + scale_as_percentage(scalett, h_font_tt_scale[0]); + } + if (!xopts.empty()) + h_font_roman_opts = xopts; + options.clear(); + } + if (name == "MinionPro") { h_font_roman[0] = "minionpro"; h_font_roman_osf = "true"; @@ -946,38 +1029,41 @@ void Preamble::handle_package(Parser &p, string const & name, options.clear(); } - if (name == "eco") - // font uses old-style figure + if (name == "CrimsonPro") { h_font_roman_osf = "true"; - - if (name == "noto") { - h_font_roman[0] = "NotoSerif-TLF"; - // noto as typewriter is handled in handling of \ttdefault - // special cases are handled in handling of \rmdefault and \sfdefault for (auto const & opt : allopts) { - if (opt == "rm") { - h_font_roman[0] = "NotoSerif-TLF"; + if (opt == "lf" || opt == "lining") { + h_font_roman_osf = "false"; continue; } - if (opt == "sf") { - h_font_sans[0] = "NotoSans-TLF"; + if (opt == "proportional" || opt == "p") + continue; + if (opt == "medium") { + h_font_roman[0] = "CrimsonProMedium"; continue; } - if (opt == "nott") { - h_font_roman[0] = "NotoSerif-TLF"; - h_font_sans[0] = "NotoSans-TLF"; + if (opt == "extralight") { + h_font_roman[0] = "CrimsonProExtraLight"; continue; } - if (opt == "osf") { - h_font_roman_osf = "true"; + if (opt == "light") { + h_font_roman[0] = "CrimsonProLight"; continue; } if (!xopts.empty()) xopts += ", "; xopts += opt; } + if (!xopts.empty()) + h_font_roman_opts = xopts; + options.clear(); } + + if (name == "eco") + // font uses old-style figure + h_font_roman_osf = "true"; + if (name == "paratype") { // in this case all fonts are ParaType h_font_roman[0] = "PTSerif-TLF"; @@ -1019,10 +1105,6 @@ void Preamble::handle_package(Parser &p, string const & name, h_font_roman[0] = "IBMPlexSerifLight"; continue; } - if (opt == "semibold") { - h_font_roman[0] = "IBMPlexSerifSemibold"; - continue; - } if (!xopts.empty()) xopts += ", "; xopts += opt; @@ -1032,35 +1114,120 @@ void Preamble::handle_package(Parser &p, string const & name, options.clear(); } - if (name == "noto-serif") { - h_font_roman[0] = "NotoSerifRegular"; + if (name == "noto-serif" || name == "noto") { + bool rm = false; + bool rmx = false; + bool sf = false; + bool sfx = false; + bool tt = false; + bool thin = false; + bool extralight = false; + bool light = false; + bool medium = false; + bool osf = false; + string scl; + if (name == "noto") { + rm = true; + sf = true; + tt = true; + } + // Since the options might apply to different shapes, + // we need to parse all options first and then handle them. for (auto const & opt : allopts) { if (opt == "regular") // skip continue; + if (opt == "rm") { + rm = true; + rmx = true; + sf = sfx; + tt = false; + continue; + } if (opt == "thin") { - h_font_roman[0] = "NotoSerifThin"; + thin = true; continue; } if (opt == "extralight") { - h_font_roman[0] = "NotoSerifExtralight"; + extralight = true; continue; } if (opt == "light") { - h_font_roman[0] = "NotoSerifLight"; + light = true; continue; } if (opt == "medium") { - h_font_roman[0] = "NotoSerifMedium"; + medium = true; + continue; + } + if (opt == "sf") { + sfx = true; + sf = true; + rm = rmx; + tt = false; + continue; + } + if (opt == "nott") { + tt = false; + continue; + } + if (opt == "osf") { + osf = true; + continue; + } + if (prefixIs(opt, "scaled=")) { + scl = opt; continue; } if (!xopts.empty()) xopts += ", "; xopts += opt; } - if (!xopts.empty()) - h_font_roman_opts = xopts; options.clear(); + // handle options that might affect different shapes + if (name == "noto-serif" || rm) { + if (thin) + h_font_roman[0] = "NotoSerifThin"; + else if (extralight) + h_font_roman[0] = "NotoSerifExtralight"; + else if (light) + h_font_roman[0] = "NotoSerifLight"; + else if (medium) + h_font_roman[0] = "NotoSerifMedium"; + else + h_font_roman[0] = "NotoSerifRegular"; + if (osf) + h_font_roman_osf = "true"; + if (!xopts.empty()) + h_font_roman_opts = xopts; + } + if (name == "noto" && sf) { + if (thin) + h_font_sans[0] = "NotoSansThin"; + else if (extralight) + h_font_sans[0] = "NotoSansExtralight"; + else if (light) + h_font_sans[0] = "NotoSansLight"; + else if (medium) + h_font_sans[0] = "NotoSansMedium"; + else + h_font_sans[0] = "NotoSansRegular"; + if (osf) + h_font_sans_osf = "true"; + if (!scl.empty()) + scale_as_percentage(scl, h_font_sf_scale[0]); + if (!xopts.empty()) + h_font_sans_opts = xopts; + } + if (name == "noto" && tt) { + h_font_typewriter[0] = "NotoMonoRegular"; + if (osf) + h_font_typewriter_osf = "true"; + if (!scl.empty()) + scale_as_percentage(scl, h_font_tt_scale[0]); + if (!xopts.empty()) + h_font_typewriter_opts = xopts; + } } if (name == "sourceserifpro") { @@ -1089,7 +1256,7 @@ void Preamble::handle_package(Parser &p, string const & name, if (is_known(name, known_sans_font_packages)) { h_font_sans[0] = name; if (contains(opts, "scale")) { - vector::const_iterator it = allopts.begin(); + vector::iterator it = allopts.begin(); for (; it != allopts.end() ; ++it) { string const opt = *it; if (prefixIs(opt, "scaled=") || prefixIs(opt, "scale=")) { @@ -1228,10 +1395,6 @@ void Preamble::handle_package(Parser &p, string const & name, h_font_sans[0] = "IBMPlexSansLight"; continue; } - if (opt == "semibold") { - h_font_sans[0] = "IBMPlexSansSemibold"; - continue; - } if (!xopts.empty()) xopts += ", "; xopts += opt; @@ -1298,12 +1461,10 @@ void Preamble::handle_package(Parser &p, string const & name, // By default, we use the package name as LyX font name, // so this only needs to be reset if these names differ. // Also, we handle the scaling option here generally. - // Note: fourier can be set as roman font _only_ - // fourier as typewriter is handled in handling of \ttdefault - if (is_known(name, known_typewriter_font_packages) && name != "fourier") { + if (is_known(name, known_typewriter_font_packages)) { h_font_typewriter[0] = name; if (contains(opts, "scale")) { - vector::const_iterator it = allopts.begin(); + vector::iterator it = allopts.begin(); for (; it != allopts.end() ; ++it) { string const opt = *it; if (prefixIs(opt, "scaled=") || prefixIs(opt, "scale=")) { @@ -1353,10 +1514,6 @@ void Preamble::handle_package(Parser &p, string const & name, h_font_typewriter[0] = "IBMPlexMonoLight"; continue; } - if (opt == "semibold"){ - h_font_typewriter[0] = "IBMPlexMonoSemibold"; - continue; - } if (!xopts.empty()) xopts += ", "; xopts += opt; @@ -1567,6 +1724,24 @@ void Preamble::handle_package(Parser &p, string const & name, delete_opt(options, o); } + else if (name == "parskip" && options.size() < 2 && (opts.empty() || prefixIs(opts, "skip="))) { + if (opts.empty()) + h_paragraph_separation = "halfline"; + else { + if (opts == "skip=\\smallskipamount") + h_defskip = "smallskip"; + else if (opts == "skip=\\medskipamount") + h_defskip = "medskip"; + else if (opts == "skip=\\bigskipamount") + h_defskip = "bigskip"; + else if (opts == "skip=\\baselineskip") + h_defskip = "fullline"; + else + h_defskip = "opts"; + h_paragraph_separation = "skip"; + } + } + else if (is_known(name, known_lyx_packages) && options.empty()) { if (name == "splitidx") h_use_indices = "true"; @@ -1576,6 +1751,7 @@ void Preamble::handle_package(Parser &p, string const & name, 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{" @@ -1650,7 +1826,7 @@ void Preamble::handle_package(Parser &p, string const & name, || opt == "subsection") h_multibib = opt; else - cerr << "Ignoring unkown refesection value '" + cerr << "Ignoring unknown refsection value '" << opt << "'."; } opt = process_keyval_opt(options, "bibencoding"); @@ -1706,6 +1882,9 @@ void Preamble::handle_package(Parser &p, string const & name, } } + else if (name == "changebar") + h_output_changes = "true"; + else if (!in_lyx_preamble) { if (options.empty()) h_preamble << "\\usepackage{" << name << '}'; @@ -1771,6 +1950,11 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled << "\\save_transient_properties " << h_save_transient_properties << "\n" << "\\origin " << origin << "\n" << "\\textclass " << h_textclass << "\n"; + if (!h_doc_metadata.empty()) { + os << "\\begin_metadata\n" + << h_doc_metadata + << "\n\\end_metadata\n"; + } string const raw = subdoc ? empty_string() : h_preamble.str(); if (!raw.empty()) { os << "\\begin_preamble\n"; @@ -1946,9 +2130,12 @@ bool Preamble::writeLyXHeader(ostream & os, bool subdoc, string const & outfiled os << "\\listings_params " << h_listings_params << "\n"; os << "\\tracking_changes " << h_tracking_changes << "\n" << "\\output_changes " << h_output_changes << "\n" + << "\\change_bars " << h_change_bars << "\n" << "\\html_math_output " << h_html_math_output << "\n" << "\\html_css_as_file " << h_html_css_as_file << "\n" << "\\html_be_strict " << h_html_be_strict << "\n" + << "\\docbook_table_output " << h_docbook_table_output << "\n" + << "\\docbook_mathml_prefix " << h_docbook_mathml_prefix << "\n" << authors_ << "\\end_header\n\n" << "\\begin_body\n"; @@ -1971,6 +2158,7 @@ void Preamble::parse(Parser & p, string const & forceclass, bool is_full_document = false; bool is_lyx_file = false; bool in_lyx_preamble = false; + bool class_set = false; // determine whether this is a full document or a fragment for inclusion while (p.good()) { @@ -1986,6 +2174,12 @@ void Preamble::parse(Parser & p, string const & forceclass, if (detectEncoding && !is_full_document) return; + // Force textclass if the user wanted it + if (!forceclass.empty()) { + setTextClass(forceclass, tc); + class_set = true; + } + while (is_full_document && p.good()) { if (detectEncoding && h_inputencoding != "auto-legacy" && h_inputencoding != "auto-legacy-plain") @@ -2412,12 +2606,19 @@ void Preamble::parse(Parser & p, string const & forceclass, p.skip_spaces(); in_lyx_preamble = true; } - if (name == "\\sfdefault") + if (name == "\\sfdefault") { if (is_known(body, known_sans_font_packages)) { h_font_sans[0] = body; p.skip_spaces(); in_lyx_preamble = true; } + if (body == "LibertinusSans-OsF") { + h_font_sans[0] = "LibertinusSans-LF"; + h_font_sans_osf = "true"; + p.skip_spaces(); + in_lyx_preamble = true; + } + } if (name == "\\ttdefault") if (is_known(body, known_typewriter_font_packages)) { h_font_typewriter[0] = body; @@ -2431,6 +2632,18 @@ void Preamble::parse(Parser & p, string const & forceclass, p.skip_spaces(); in_lyx_preamble = true; } + if (name == "\\LibertinusSans@scale") { + if (isStrDbl(body)) { + h_font_sf_scale[0] = convert( + static_cast(100 * convert(body))); + } + } + if (name == "\\LibertinusMono@scale") { + if (isStrDbl(body)) { + h_font_tt_scale[0] = convert( + static_cast(100 * convert(body))); + } + } // remove LyX-specific definitions that are re-added by LyX // if necessary @@ -2469,12 +2682,41 @@ void Preamble::parse(Parser & p, string const & forceclass, if (t.cs() == "documentclass") { vector::iterator it; vector opts = split_options(p.getArg('[', ']')); + // FIXME This does not work for classes that have a + // different name in LyX than in LaTeX + string const tclass = p.getArg('{', '}'); + p.skip_spaces(); + // Only set text class if a class hasn't been forced + // (this was set above) + if (!class_set) { + // textclass needs to be set at this place (if not already done) + // as we need to know it for other parameters + // (such as class-dependent paper size) + setTextClass(tclass, tc); + class_set = true; + } + + // Font sizes. + // Try those who are (most likely) known to all packages first handle_opt(opts, known_fontsizes, h_paperfontsize); delete_opt(opts, known_fontsizes); // delete "pt" at the end string::size_type i = h_paperfontsize.find("pt"); if (i != string::npos) h_paperfontsize.erase(i); + // Now those known specifically to the class + vector class_fsizes = getVectorFromString(tc.opt_fontsize(), "|"); + string const fsize_format = tc.fontsizeformat(); + for (auto const & fsize : class_fsizes) { + string latexsize = subst(fsize_format, "$$s", fsize); + vector::iterator it = find(opts.begin(), opts.end(), latexsize); + if (it != opts.end()) { + h_paperfontsize = fsize; + opts.erase(it); + break; + } + } + // The documentclass options are always parsed before the options // of the babel call so that a language cannot overwrite the babel // options. @@ -2527,16 +2769,37 @@ void Preamble::parse(Parser & p, string const & forceclass, opts.erase(it); } // paper sizes - // some size options are known to any document classes, other sizes + // some size options are known by the document class, other sizes // are handled by the \geometry command of the geometry package - handle_opt(opts, known_class_paper_sizes, h_papersize); - delete_opt(opts, known_class_paper_sizes); + vector class_psizes = getVectorFromString(tc.opt_pagesize(), "|"); + string const psize_format = tc.pagesizeformat(); + for (auto const & psize : class_psizes) { + string latexsize = subst(psize_format, "$$s", psize); + vector::iterator it = find(opts.begin(), opts.end(), latexsize); + if (it != opts.end()) { + h_papersize = psize; + opts.erase(it); + break; + } + if (psize_format == "$$spaper") + continue; + // Also try with the default format since this is understood by + // most classes + latexsize = psize + "paper"; + it = find(opts.begin(), opts.end(), latexsize); + if (it != opts.end()) { + h_papersize = psize; + opts.erase(it); + break; + } + } // the remaining options h_options = join(opts, ","); - // FIXME This does not work for classes that have a - // different name in LyX than in LaTeX - h_textclass = p.getArg('{', '}'); - p.skip_spaces(); + continue; + } + + if (t.cs() == "DocumentMetadata") { + h_doc_metadata = trimSpaceAndEol(p.getArg('{', '}')); continue; } @@ -2655,18 +2918,17 @@ void Preamble::parse(Parser & p, string const & forceclass, string const name = p.verbatim_item(); string const content = p.verbatim_item(); // the paragraphs are only not indented when \parindent is set to zero - if (name == "\\parindent" && content != "") { - if (content[0] == '0') - h_paragraph_separation = "skip"; - else - h_paragraph_indentation = translate_len(content); - } else if (name == "\\parskip") { + if (name == "\\parindent" && content != "") + h_paragraph_indentation = translate_len(content); + else if (name == "\\parskip" && isPackageUsed("parskip")) { if (content == "\\smallskipamount") h_defskip = "smallskip"; else if (content == "\\medskipamount") h_defskip = "medskip"; else if (content == "\\bigskipamount") h_defskip = "bigskip"; + else if (content == "\\baselineskip") + h_defskip = "fullline"; else h_defskip = translate_len(content); } else if (name == "\\mathindent") { @@ -2858,17 +3120,13 @@ void Preamble::parse(Parser & p, string const & forceclass, } } + // set textclass if not yet done (snippets without \documentclass and forced class) + if (!class_set) + setTextClass(h_textclass, tc); + // remove the whitespace p.skip_spaces(); - // Force textclass if the user wanted it - if (!forceclass.empty()) - h_textclass = forceclass; - tc.setName(h_textclass); - if (!LayoutFileList::get().haveClass(h_textclass) || !tc.load()) { - cerr << "Error: Could not read layout file for textclass \"" << h_textclass << "\"." << endl; - exit(EXIT_FAILURE); - } if (h_papersides.empty()) { ostringstream ss; ss << tc.sides(); @@ -2930,6 +3188,9 @@ void Preamble::parse(Parser & p, string const & forceclass, // polish else if (is_known(h_language, known_polish_quotes_languages)) h_quotes_style = "polish"; + // hungarian + else if (is_known(h_language, known_hungarian_quotes_languages)) + h_quotes_style = "hungarian"; // russian else if (is_known(h_language, known_russian_quotes_languages)) h_quotes_style = "russian";