From 0b7305024a33e6616ef3ae73a0df63c5a62e3d10 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Wed, 7 Aug 2019 16:44:11 +0200 Subject: [PATCH] Use generic paper size names rather than LaTeXisms such as "letterpaper" This allows to support classes that don't use the Xpaper wording. Add support for KOMA font (keyval) syntax on top of that. Also support class-specific font and paper sizes in tex2lyx. File and layout format change. --- development/FORMAT | 4 ++ lib/doc/Customization.lyx | 119 +++++++++++++++++++++++++---------- lib/doc/de/Customization.lyx | 107 +++++++++++++++++++++---------- lib/layouts/memoir.layout | 4 +- lib/layouts/scrclass.inc | 5 +- lib/lyx2lyx/lyx_2_4.py | 38 ++++++++++- lib/scripts/layout2layout.py | 5 +- src/BufferParams.cpp | 22 ++++--- src/TextClass.cpp | 16 +++-- src/TextClass.h | 4 ++ src/tex2lyx/Preamble.cpp | 86 ++++++++++++++++++------- src/version.h | 4 +- 12 files changed, 303 insertions(+), 111 deletions(-) diff --git a/development/FORMAT b/development/FORMAT index 340d009e99..77d6813575 100644 --- a/development/FORMAT +++ b/development/FORMAT @@ -7,6 +7,10 @@ changes happened in particular if possible. A good example would be ----------------------- +2019-08-07 Jürgen Spitzmüller + * Format incremented to 587: Use more generic paper names as LyX names + (rather than LaTeXisms; e.g., "a4" rather than "a4paper"). + 2019-08-07 Jürgen Spitzmüller * Format incremented to 586: Allow for duplicate keys in qualified citation lists diff --git a/lib/doc/Customization.lyx b/lib/doc/Customization.lyx index 952535801e..4f4b1e4049 100644 --- a/lib/doc/Customization.lyx +++ b/lib/doc/Customization.lyx @@ -1,5 +1,5 @@ #LyX 2.4 created this file. For more info see https://www.lyx.org/ -\lyxformat 585 +\lyxformat 587 \begin_document \begin_header \save_transient_properties true @@ -10531,10 +10531,8 @@ status collapsed \emph on custom \emph default -, letterpaper, legalpaper, executivepaper, a0paper, a1paper, a2paper, a3paper, - a4paper, a5paper, a6paper, b0paper, b1paper, b2paper, b3paper, b4paper, - b5paper, b6paper, c0paper, c1paper, c2paper, c3paper, c4paper, c5paper, - c6paper, b0j, b1j, b2j, b3j, b4j, b5j, b6j +, letter, legal, executive, a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3, + b4, b5, b6, c0, c1, c2, c3, c4, c5, c6, b0j, b1j, b2j, b3j, b4j, b5j, b6j \end_layout \end_inset @@ -11629,7 +11627,7 @@ g.: PUBLIC \begin_layout Description -\change_inserted -712698321 1565105413 +\change_inserted -712698321 1565180598 \begin_inset Flex Code status collapsed @@ -11648,40 +11646,38 @@ status collapsed \begin_layout Plain Layout \change_inserted -712698321 1565105399 -string="letterpaper|\SpecialChar allowbreak -legalpaper|\SpecialChar allowbreak -executivepaper|\SpecialChar allowbreak -a0paper|\SpecialChar allowbreak -a1paper|\SpecialChar allowbreak -a2paper|\SpecialChar allowbreak -a3paper|\SpecialChar allowbreak -a4 -paper|\SpecialChar allowbreak -a5paper|\SpecialChar allowbreak -a6paper|\SpecialChar allowbreak -b0paper|\SpecialChar allowbreak -b1paper|\SpecialChar allowbreak -b2paper|\SpecialChar allowbreak -b3paper|\SpecialChar allowbreak -b4paper|\SpecialChar allowbreak -b5paper|\SpecialChar allowbreak -b6paper|\SpecialChar allowbreak -c0 -paper|\SpecialChar allowbreak -c1paper|\SpecialChar allowbreak -c2paper|\SpecialChar allowbreak -c3paper|\SpecialChar allowbreak -c4paper|\SpecialChar allowbreak -c5paper|\SpecialChar allowbreak -c6paper|\SpecialChar allowbreak +string="letter|\SpecialChar allowbreak +legal|\SpecialChar allowbreak +executive|\SpecialChar allowbreak +a0|\SpecialChar allowbreak +a1|\SpecialChar allowbreak +a2|\SpecialChar allowbreak +a3|\SpecialChar allowbreak +a4|\SpecialChar allowbreak +a5|\SpecialChar allowbreak +a6|\SpecialChar allowbreak +b0|\SpecialChar allowbreak +b1|\SpecialChar allowbreak +b2|\SpecialChar allowbreak +b3|\SpecialChar allowbreak +b4|\SpecialChar allowbreak +b5|\SpecialChar allowbreak +b6|\SpecialChar allowbreak +c0|\SpecialChar allowbreak +c1|\SpecialChar allowbreak +c +2|\SpecialChar allowbreak +c3|\SpecialChar allowbreak +c4|\SpecialChar allowbreak +c5|\SpecialChar allowbreak +c6|\SpecialChar allowbreak b0j|\SpecialChar allowbreak b1j|\SpecialChar allowbreak b2j|\SpecialChar allowbreak b3j|\SpecialChar allowbreak b4j|\SpecialChar allowbreak b5j|\SpecialChar allowbreak -b6 -j" +b6j" \end_layout \end_inset @@ -11709,6 +11705,61 @@ status collapsed . Currently, only the listed sizes are supported. Other sizes might be entered as custom class option. +\end_layout + +\begin_layout Description + +\change_inserted -712698321 1565180623 +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1565180605 +PageSizeFormat +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1565180601 +string +\end_layout + +\end_inset + +] The format for the page size option. + Default: +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1565180618 +$$spaper +\end_layout + +\end_inset + +. + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout + +\change_inserted -712698321 1565180601 +$$s +\end_layout + +\end_inset + + is a placeholder for the paper size. \change_unchanged \end_layout diff --git a/lib/doc/de/Customization.lyx b/lib/doc/de/Customization.lyx index 27ad41f605..9e33b41259 100644 --- a/lib/doc/de/Customization.lyx +++ b/lib/doc/de/Customization.lyx @@ -1,5 +1,5 @@ #LyX 2.4 created this file. For more info see https://www.lyx.org/ -\lyxformat 585 +\lyxformat 587 \begin_document \begin_header \save_transient_properties true @@ -8750,10 +8750,8 @@ status collapsed \emph on custom \emph default -, letterpaper, legalpaper, executivepaper, a0paper, a1paper, a2paper, a3paper, - a4paper, a5paper, a6paper, b0paper, b1paper, b2paper, b3paper, b4paper, - b5paper, b6paper, c0paper, c1paper, c2paper, c3paper, c4paper, c5paper, - c6paper, b0j, b1j, b2j, b3j, b4j, b5j, b6j +, letter, legal, executive, a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3, + b4, b5, b6, c0, c1, c2, c3, c4, c5, c6, b0j, b1j, b2j, b3j, b4j, b5j, b6j \end_layout \end_inset @@ -9795,40 +9793,38 @@ PageSize status collapsed \begin_layout Plain Layout -string="letterpaper|\SpecialChar allowbreak -legalpaper|\SpecialChar allowbreak -executivepaper|\SpecialChar allowbreak -a0paper|\SpecialChar allowbreak -a1paper|\SpecialChar allowbreak -a2paper|\SpecialChar allowbreak -a3paper|\SpecialChar allowbreak -a4 -paper|\SpecialChar allowbreak -a5paper|\SpecialChar allowbreak -a6paper|\SpecialChar allowbreak -b0paper|\SpecialChar allowbreak -b1paper|\SpecialChar allowbreak -b2paper|\SpecialChar allowbreak -b3paper|\SpecialChar allowbreak -b4paper|\SpecialChar allowbreak -b5paper|\SpecialChar allowbreak -b6paper|\SpecialChar allowbreak -c0 -paper|\SpecialChar allowbreak -c1paper|\SpecialChar allowbreak -c2paper|\SpecialChar allowbreak -c3paper|\SpecialChar allowbreak -c4paper|\SpecialChar allowbreak -c5paper|\SpecialChar allowbreak -c6paper|\SpecialChar allowbreak +string="letter|\SpecialChar allowbreak +legal|\SpecialChar allowbreak +executive|\SpecialChar allowbreak +a0|\SpecialChar allowbreak +a1|\SpecialChar allowbreak +a2|\SpecialChar allowbreak +a3|\SpecialChar allowbreak +a4|\SpecialChar allowbreak +a5|\SpecialChar allowbreak +a6|\SpecialChar allowbreak +b0|\SpecialChar allowbreak +b1|\SpecialChar allowbreak +b2|\SpecialChar allowbreak +b3|\SpecialChar allowbreak +b4|\SpecialChar allowbreak +b5|\SpecialChar allowbreak +b6|\SpecialChar allowbreak +c0|\SpecialChar allowbreak +c1|\SpecialChar allowbreak +c +2|\SpecialChar allowbreak +c3|\SpecialChar allowbreak +c4|\SpecialChar allowbreak +c5|\SpecialChar allowbreak +c6|\SpecialChar allowbreak b0j|\SpecialChar allowbreak b1j|\SpecialChar allowbreak b2j|\SpecialChar allowbreak b3j|\SpecialChar allowbreak b4j|\SpecialChar allowbreak b5j|\SpecialChar allowbreak -b6 -j" +b6j" \end_layout \end_inset @@ -9861,6 +9857,51 @@ status collapsed \begin_inset Flex Code status collapsed +\begin_layout Plain Layout +PageSizeFormat +\end_layout + +\end_inset + + [ +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +string +\end_layout + +\end_inset + +] Das Format der Seitengrößen-Option. + Voreinstellung: +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +$$spaper +\end_layout + +\end_inset + +. + +\begin_inset Flex Code +status collapsed + +\begin_layout Plain Layout +$$s +\end_layout + +\end_inset + + ist ein Platzhalter für die Papiergröße. +\end_layout + +\begin_layout Description +\begin_inset Flex Code +status collapsed + \begin_layout Plain Layout PageStyle \end_layout diff --git a/lib/layouts/memoir.layout b/lib/layouts/memoir.layout index 5c8de8d7c4..e51feb083a 100644 --- a/lib/layouts/memoir.layout +++ b/lib/layouts/memoir.layout @@ -14,7 +14,7 @@ SecNumDepth 1 TocDepth 1 DefaultStyle Standard PageStyle Headings -PageSize letterpaper +PageSize letter Provides makeidx 1 Provides framed 1 Provides subscript 1 @@ -28,7 +28,7 @@ Provides SetSpace 1 ClassOptions FontSize 9|10|11|12|14|17 - PageSize a3paper|a4paper|a5paper|a6paper|b3paper|b4paper|b5paper|b6paper|executivepaper|legalpaper|letterpaper + PageSize a3|a4|a5|a6|b3|b4|b5|b6|executive|legal|letter PageStyle empty|plain|headings|myheadings|ruled|Ruled|companion Other oldfontcommands End diff --git a/lib/layouts/scrclass.inc b/lib/layouts/scrclass.inc index 927eb6079c..6a55923049 100644 --- a/lib/layouts/scrclass.inc +++ b/lib/layouts/scrclass.inc @@ -12,13 +12,14 @@ Format 78 SecNumDepth 2 TocDepth 2 DefaultStyle Standard -PageSize a4paper +PageSize a4 Provides subscript 1 ClassOptions FontSize 9|10|11|12|13|14|15|16|17|18|19|20 FontSizeFormat fontsize=$$s - PageSize a0paper|a1paper|a2paper|a3paper|a4paper|a5paper|a6paper|b0paper|b1paper|b2paper|b3paper|b4paper|b5paper|b6paper|c0paper|c1paper|c2paper|c3paper|c4paper|c5paper|c6paper|executivepaper|legalpaper|letterpaper + PageSize a0|a1|a2|a3|a4|a5|a6|b0|b1|b2|b3|b4|b5|b6|c0|c1|c2|c3|c4|c5|c6|executive|legal|letter + PageSizeFormat paper=$$s End Style Standard diff --git a/lib/lyx2lyx/lyx_2_4.py b/lib/lyx2lyx/lyx_2_4.py index 3869e07b49..90ce08eca3 100644 --- a/lib/lyx2lyx/lyx_2_4.py +++ b/lib/lyx2lyx/lyx_2_4.py @@ -3357,6 +3357,38 @@ def revert_dupqualicites(document): res += "{" + kk + "}" document.body[i:j+1] = put_cmd_in_ert([res]) + +def convert_pagesizenames(document): + " Convert LyX page sizes names " + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + oldnames = ["letterpaper", "legalpaper", "executivepaper", \ + "a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", "a6paper", \ + "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", "b5paper", "b6paper", \ + "c0paper", "c1paper", "c2paper", "c3paper", "c4paper", "c5paper", "c6paper"] + val = get_value(document.header, "\\papersize", i) + if val in oldnames: + newval = val.replace("paper", "") + document.header[i] = "\\papersize " + newval + +def revert_pagesizenames(document): + " Convert LyX page sizes names " + + i = find_token(document.header, "\\papersize", 0) + if i == -1: + document.warning("Malformed LyX document! Missing \\papersize header.") + return + newnames = ["letter", "legal", "executive", \ + "a0", "a1", "a2", "a3", "a4", "a5", "a6", \ + "b0", "b1", "b2", "b3", "b4", "b5", "b6", \ + "c0", "c1", "c2", "c3", "c4", "c5", "c6"] + val = get_value(document.header, "\\papersize", i) + if val in newnames: + newval = val + "paper" + document.header[i] = "\\papersize " + newval ## @@ -3406,10 +3438,12 @@ convert = [ [583, [convert_ChivoFont,convert_Semibolds,convert_NotoRegulars,convert_CrimsonProFont]], [584, []], [585, [convert_pagesizes]], - [586, []] + [586, []], + [587, [convert_pagesizenames]] ] -revert = [[585, [revert_dupqualicites]], +revert = [[586, [revert_pagesizenames]], + [585, [revert_dupqualicites]], [584, [revert_pagesizes,revert_komafontsizes]], [583, [revert_vcsinfo_rev_abbrev]], [582, [revert_ChivoFont,revert_CrimsonProFont]], diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py index 0009c54c92..cd7348935e 100644 --- a/lib/scripts/layout2layout.py +++ b/lib/scripts/layout2layout.py @@ -11,7 +11,7 @@ # This script will update a .layout file to current format # The latest layout format is also defined in src/TextClass.cpp -currentFormat = 78 +currentFormat = 79 # Incremented to format 4, 6 April 2007, lasgouttes @@ -262,6 +262,9 @@ currentFormat = 78 # Incremented to format 78, 6 August 2019 by spitz # New textclass tag FontsizeFormat +# Incremented to format 79, 7 August 2019 by spitz +# New textclass tag PagesizeFormat + # Do not forget to document format change in Customization # Manual (section "Declaring a new text class"). diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index f964c8027b..3952c86845 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -79,12 +79,20 @@ static char const * const string_quotes_style[] = { static char const * const string_papersize[] = { + "default", "custom", "letter", "legal", "executive", + "a0", "a1", "a2", "a3", "a4", "a5", "a6", + "b0", "b1", "b2", "b3", "b4", "b5", "b6", + "c0", "c1", "c2", "c3", "c4", "c5", "c6", + "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", "" +}; + + +static char const * const string_papersize_geometry[] = { "default", "custom", "letterpaper", "legalpaper", "executivepaper", - "a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", - "a6paper", "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", - "b5paper", "b6paper", "c0paper", "c1paper", "c2paper", "c3paper", - "c4paper", "c5paper", "c6paper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", - "b6j", "" + "a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", "a6paper", + "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", "b5paper", "b6paper", + "c0paper", "c1paper", "c2paper", "c3paper", "c4paper", "c5paper", "c6paper", + "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", "" }; @@ -1628,7 +1636,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, if ((!use_geometry || features.isProvided("geometry-light")) && class_supported_papersize) - clsoptions << string_papersize[papersize] << ","; + clsoptions << subst(tclass.pagesizeformat(), "$$s", string_papersize[papersize]) << ","; // if needed if (sides != tclass.sides()) { @@ -1849,7 +1857,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, case PAPER_JISB4: case PAPER_JISB5: case PAPER_JISB6: - ods << "," << from_ascii(string_papersize[papersize]); + ods << "," << from_ascii(string_papersize_geometry[papersize]); break; case PAPER_DEFAULT: break; diff --git a/src/TextClass.cpp b/src/TextClass.cpp index 8b54a4cded..c11331e1a1 100644 --- a/src/TextClass.cpp +++ b/src/TextClass.cpp @@ -62,7 +62,7 @@ namespace lyx { // You should also run the development/tools/updatelayouts.py script, // to update the format of all of our layout files. // -int const LAYOUT_FORMAT = 78; // spitz: FontsizeFormat +int const LAYOUT_FORMAT = 79; // spitz: PagesizeFormat // Layout format for the current lyx file format. Controls which format is @@ -150,11 +150,11 @@ docstring const TextClass::plain_layout_ = from_ascii(N_("Plain Layout")); TextClass::TextClass() : loaded_(false), tex_class_avail_(false), opt_enginetype_("authoryear|numerical"), opt_fontsize_("10|11|12"), - opt_pagesize_("default|a4paper|a5paper|b5paper|letterpaper|legalpaper|executivepaper"), + opt_pagesize_("default|a4|a5|b5|letter|legal|executive"), opt_pagestyle_("empty|plain|headings|fancy"), fontsize_format_("$$spt"), pagesize_("default"), - pagestyle_("default"), tablestyle_("default"), columns_(1), sides_(OneSide), secnumdepth_(3), - tocdepth_(3), outputType_(LATEX), outputFormat_("latex"), - has_output_format_(false), defaultfont_(sane_font), + pagesize_format_("$$spaper"), pagestyle_("default"), tablestyle_("default"), + columns_(1), sides_(OneSide), secnumdepth_(3), tocdepth_(3), outputType_(LATEX), + outputFormat_("latex"), has_output_format_(false), defaultfont_(sane_font), titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"), min_toclevel_(0), max_toclevel_(0), maxcitenames_(2), cite_full_author_list_(true), bibintoc_(false) @@ -1006,6 +1006,7 @@ void TextClass::readClassOptions(Lexer & lexrc) CO_FONTSIZE = 1, CO_FONTSIZE_FORMAT, CO_PAGESIZE, + CO_PAGESIZE_FORMAT, CO_PAGESTYLE, CO_OTHER, CO_HEADER, @@ -1019,6 +1020,7 @@ void TextClass::readClassOptions(Lexer & lexrc) {"header", CO_HEADER }, {"other", CO_OTHER }, {"pagesize", CO_PAGESIZE }, + {"pagesizeformat", CO_PAGESIZE_FORMAT }, {"pagestyle", CO_PAGESTYLE } }; @@ -1046,6 +1048,10 @@ void TextClass::readClassOptions(Lexer & lexrc) lexrc.next(); opt_pagesize_ = rtrim(lexrc.getString()); break; + case CO_PAGESIZE_FORMAT: + lexrc.next(); + pagesize_format_ = rtrim(lexrc.getString()); + break; case CO_PAGESTYLE: lexrc.next(); opt_pagestyle_ = rtrim(lexrc.getString()); diff --git a/src/TextClass.h b/src/TextClass.h index 1e8582b1f0..3d06345636 100644 --- a/src/TextClass.h +++ b/src/TextClass.h @@ -280,6 +280,8 @@ protected: std::string fontsize_format_; /// Default page size std::string pagesize_; + /// Format of the papersize option + std::string pagesize_format_; /// std::string pagestyle_; /// @@ -467,6 +469,8 @@ public: /// std::string const & pagesize() const { return pagesize_; } /// + std::string const & pagesizeformat() const { return pagesize_format_; } + /// std::string const & pagestyle() const { return pagestyle_; } /// std::string const & tablestyle() const { return tablestyle_; } diff --git a/src/tex2lyx/Preamble.cpp b/src/tex2lyx/Preamble.cpp index 21d081c5c6..3e2fa67066 100644 --- a/src/tex2lyx/Preamble.cpp +++ b/src/tex2lyx/Preamble.cpp @@ -158,15 +158,12 @@ const char * const known_typewriter_font_packages[] = { "beramono", "cmtl", "cmt 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}; @@ -709,13 +706,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) { @@ -2543,12 +2545,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 + h_textclass = p.getArg('{', '}'); + 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); + } + + // 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 + string fsize; + 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. @@ -2601,16 +2632,33 @@ 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); + string paper; + 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; } @@ -2935,14 +2983,6 @@ void Preamble::parse(Parser & p, string const & forceclass, // 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(); diff --git a/src/version.h b/src/version.h index ca5e63df4a..13f06a39cd 100644 --- a/src/version.h +++ b/src/version.h @@ -32,8 +32,8 @@ extern char const * const lyx_version_info; // Do not remove the comment below, so we get merge conflict in // independent branches. Instead add your own. -#define LYX_FORMAT_LYX 586 // spitz: allow duplicate keys in qualified citation lists -#define LYX_FORMAT_TEX2LYX 586 +#define LYX_FORMAT_LYX 587 // spitz: generic paper size names +#define LYX_FORMAT_TEX2LYX 587 #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX #ifndef _MSC_VER -- 2.39.2