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.
This commit is contained in:
Juergen Spitzmueller 2019-08-07 16:44:11 +02:00
parent 1386a3d8fd
commit 0b7305024a
12 changed files with 303 additions and 111 deletions

View File

@ -7,6 +7,10 @@ changes happened in particular if possible. A good example would be
----------------------- -----------------------
2019-08-07 Jürgen Spitzmüller <spitz@lyx.org>
* 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 <spitz@lyx.org> 2019-08-07 Jürgen Spitzmüller <spitz@lyx.org>
* Format incremented to 586: Allow for duplicate keys in qualified citation lists * Format incremented to 586: Allow for duplicate keys in qualified citation lists

View File

@ -1,5 +1,5 @@
#LyX 2.4 created this file. For more info see https://www.lyx.org/ #LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 585 \lyxformat 587
\begin_document \begin_document
\begin_header \begin_header
\save_transient_properties true \save_transient_properties true
@ -10531,10 +10531,8 @@ status collapsed
\emph on \emph on
custom custom
\emph default \emph default
, letterpaper, legalpaper, executivepaper, a0paper, a1paper, a2paper, a3paper, , letter, legal, executive, a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3,
a4paper, a5paper, a6paper, b0paper, b1paper, b2paper, b3paper, b4paper, b4, b5, b6, c0, c1, c2, c3, c4, c5, c6, b0j, b1j, b2j, b3j, b4j, b5j, b6j
b5paper, b6paper, c0paper, c1paper, c2paper, c3paper, c4paper, c5paper,
c6paper, b0j, b1j, b2j, b3j, b4j, b5j, b6j
\end_layout \end_layout
\end_inset \end_inset
@ -11629,7 +11627,7 @@ g.: PUBLIC
\begin_layout Description \begin_layout Description
\change_inserted -712698321 1565105413 \change_inserted -712698321 1565180598
\begin_inset Flex Code \begin_inset Flex Code
status collapsed status collapsed
@ -11648,40 +11646,38 @@ status collapsed
\begin_layout Plain Layout \begin_layout Plain Layout
\change_inserted -712698321 1565105399 \change_inserted -712698321 1565105399
string="letterpaper|\SpecialChar allowbreak string="letter|\SpecialChar allowbreak
legalpaper|\SpecialChar allowbreak legal|\SpecialChar allowbreak
executivepaper|\SpecialChar allowbreak executive|\SpecialChar allowbreak
a0paper|\SpecialChar allowbreak a0|\SpecialChar allowbreak
a1paper|\SpecialChar allowbreak a1|\SpecialChar allowbreak
a2paper|\SpecialChar allowbreak a2|\SpecialChar allowbreak
a3paper|\SpecialChar allowbreak a3|\SpecialChar allowbreak
a4 a4|\SpecialChar allowbreak
paper|\SpecialChar allowbreak a5|\SpecialChar allowbreak
a5paper|\SpecialChar allowbreak a6|\SpecialChar allowbreak
a6paper|\SpecialChar allowbreak b0|\SpecialChar allowbreak
b0paper|\SpecialChar allowbreak b1|\SpecialChar allowbreak
b1paper|\SpecialChar allowbreak b2|\SpecialChar allowbreak
b2paper|\SpecialChar allowbreak b3|\SpecialChar allowbreak
b3paper|\SpecialChar allowbreak b4|\SpecialChar allowbreak
b4paper|\SpecialChar allowbreak b5|\SpecialChar allowbreak
b5paper|\SpecialChar allowbreak b6|\SpecialChar allowbreak
b6paper|\SpecialChar allowbreak c0|\SpecialChar allowbreak
c0 c1|\SpecialChar allowbreak
paper|\SpecialChar allowbreak c
c1paper|\SpecialChar allowbreak 2|\SpecialChar allowbreak
c2paper|\SpecialChar allowbreak c3|\SpecialChar allowbreak
c3paper|\SpecialChar allowbreak c4|\SpecialChar allowbreak
c4paper|\SpecialChar allowbreak c5|\SpecialChar allowbreak
c5paper|\SpecialChar allowbreak c6|\SpecialChar allowbreak
c6paper|\SpecialChar allowbreak
b0j|\SpecialChar allowbreak b0j|\SpecialChar allowbreak
b1j|\SpecialChar allowbreak b1j|\SpecialChar allowbreak
b2j|\SpecialChar allowbreak b2j|\SpecialChar allowbreak
b3j|\SpecialChar allowbreak b3j|\SpecialChar allowbreak
b4j|\SpecialChar allowbreak b4j|\SpecialChar allowbreak
b5j|\SpecialChar allowbreak b5j|\SpecialChar allowbreak
b6 b6j"
j"
\end_layout \end_layout
\end_inset \end_inset
@ -11709,6 +11705,61 @@ status collapsed
. .
Currently, only the listed sizes are supported. Currently, only the listed sizes are supported.
Other sizes might be entered as custom class option. 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 \change_unchanged
\end_layout \end_layout

View File

@ -1,5 +1,5 @@
#LyX 2.4 created this file. For more info see https://www.lyx.org/ #LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 585 \lyxformat 587
\begin_document \begin_document
\begin_header \begin_header
\save_transient_properties true \save_transient_properties true
@ -8750,10 +8750,8 @@ status collapsed
\emph on \emph on
custom custom
\emph default \emph default
, letterpaper, legalpaper, executivepaper, a0paper, a1paper, a2paper, a3paper, , letter, legal, executive, a0, a1, a2, a3, a4, a5, a6, b0, b1, b2, b3,
a4paper, a5paper, a6paper, b0paper, b1paper, b2paper, b3paper, b4paper, b4, b5, b6, c0, c1, c2, c3, c4, c5, c6, b0j, b1j, b2j, b3j, b4j, b5j, b6j
b5paper, b6paper, c0paper, c1paper, c2paper, c3paper, c4paper, c5paper,
c6paper, b0j, b1j, b2j, b3j, b4j, b5j, b6j
\end_layout \end_layout
\end_inset \end_inset
@ -9795,40 +9793,38 @@ PageSize
status collapsed status collapsed
\begin_layout Plain Layout \begin_layout Plain Layout
string="letterpaper|\SpecialChar allowbreak string="letter|\SpecialChar allowbreak
legalpaper|\SpecialChar allowbreak legal|\SpecialChar allowbreak
executivepaper|\SpecialChar allowbreak executive|\SpecialChar allowbreak
a0paper|\SpecialChar allowbreak a0|\SpecialChar allowbreak
a1paper|\SpecialChar allowbreak a1|\SpecialChar allowbreak
a2paper|\SpecialChar allowbreak a2|\SpecialChar allowbreak
a3paper|\SpecialChar allowbreak a3|\SpecialChar allowbreak
a4 a4|\SpecialChar allowbreak
paper|\SpecialChar allowbreak a5|\SpecialChar allowbreak
a5paper|\SpecialChar allowbreak a6|\SpecialChar allowbreak
a6paper|\SpecialChar allowbreak b0|\SpecialChar allowbreak
b0paper|\SpecialChar allowbreak b1|\SpecialChar allowbreak
b1paper|\SpecialChar allowbreak b2|\SpecialChar allowbreak
b2paper|\SpecialChar allowbreak b3|\SpecialChar allowbreak
b3paper|\SpecialChar allowbreak b4|\SpecialChar allowbreak
b4paper|\SpecialChar allowbreak b5|\SpecialChar allowbreak
b5paper|\SpecialChar allowbreak b6|\SpecialChar allowbreak
b6paper|\SpecialChar allowbreak c0|\SpecialChar allowbreak
c0 c1|\SpecialChar allowbreak
paper|\SpecialChar allowbreak c
c1paper|\SpecialChar allowbreak 2|\SpecialChar allowbreak
c2paper|\SpecialChar allowbreak c3|\SpecialChar allowbreak
c3paper|\SpecialChar allowbreak c4|\SpecialChar allowbreak
c4paper|\SpecialChar allowbreak c5|\SpecialChar allowbreak
c5paper|\SpecialChar allowbreak c6|\SpecialChar allowbreak
c6paper|\SpecialChar allowbreak
b0j|\SpecialChar allowbreak b0j|\SpecialChar allowbreak
b1j|\SpecialChar allowbreak b1j|\SpecialChar allowbreak
b2j|\SpecialChar allowbreak b2j|\SpecialChar allowbreak
b3j|\SpecialChar allowbreak b3j|\SpecialChar allowbreak
b4j|\SpecialChar allowbreak b4j|\SpecialChar allowbreak
b5j|\SpecialChar allowbreak b5j|\SpecialChar allowbreak
b6 b6j"
j"
\end_layout \end_layout
\end_inset \end_inset
@ -9861,6 +9857,51 @@ status collapsed
\begin_inset Flex Code \begin_inset Flex Code
status collapsed 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 \begin_layout Plain Layout
PageStyle PageStyle
\end_layout \end_layout

View File

@ -14,7 +14,7 @@ SecNumDepth 1
TocDepth 1 TocDepth 1
DefaultStyle Standard DefaultStyle Standard
PageStyle Headings PageStyle Headings
PageSize letterpaper PageSize letter
Provides makeidx 1 Provides makeidx 1
Provides framed 1 Provides framed 1
Provides subscript 1 Provides subscript 1
@ -28,7 +28,7 @@ Provides SetSpace 1
ClassOptions ClassOptions
FontSize 9|10|11|12|14|17 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 PageStyle empty|plain|headings|myheadings|ruled|Ruled|companion
Other oldfontcommands Other oldfontcommands
End End

View File

@ -12,13 +12,14 @@ Format 78
SecNumDepth 2 SecNumDepth 2
TocDepth 2 TocDepth 2
DefaultStyle Standard DefaultStyle Standard
PageSize a4paper PageSize a4
Provides subscript 1 Provides subscript 1
ClassOptions ClassOptions
FontSize 9|10|11|12|13|14|15|16|17|18|19|20 FontSize 9|10|11|12|13|14|15|16|17|18|19|20
FontSizeFormat fontsize=$$s 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 End
Style Standard Style Standard

View File

@ -3357,6 +3357,38 @@ def revert_dupqualicites(document):
res += "{" + kk + "}" res += "{" + kk + "}"
document.body[i:j+1] = put_cmd_in_ert([res]) 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]], [583, [convert_ChivoFont,convert_Semibolds,convert_NotoRegulars,convert_CrimsonProFont]],
[584, []], [584, []],
[585, [convert_pagesizes]], [585, [convert_pagesizes]],
[586, []] [586, []],
[587, [convert_pagesizenames]]
] ]
revert = [[585, [revert_dupqualicites]], revert = [[586, [revert_pagesizenames]],
[585, [revert_dupqualicites]],
[584, [revert_pagesizes,revert_komafontsizes]], [584, [revert_pagesizes,revert_komafontsizes]],
[583, [revert_vcsinfo_rev_abbrev]], [583, [revert_vcsinfo_rev_abbrev]],
[582, [revert_ChivoFont,revert_CrimsonProFont]], [582, [revert_ChivoFont,revert_CrimsonProFont]],

View File

@ -11,7 +11,7 @@
# This script will update a .layout file to current format # This script will update a .layout file to current format
# The latest layout format is also defined in src/TextClass.cpp # The latest layout format is also defined in src/TextClass.cpp
currentFormat = 78 currentFormat = 79
# Incremented to format 4, 6 April 2007, lasgouttes # Incremented to format 4, 6 April 2007, lasgouttes
@ -262,6 +262,9 @@ currentFormat = 78
# Incremented to format 78, 6 August 2019 by spitz # Incremented to format 78, 6 August 2019 by spitz
# New textclass tag FontsizeFormat # 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 # Do not forget to document format change in Customization
# Manual (section "Declaring a new text class"). # Manual (section "Declaring a new text class").

View File

@ -79,12 +79,20 @@ static char const * const string_quotes_style[] = {
static char const * const string_papersize[] = { 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", "default", "custom", "letterpaper", "legalpaper", "executivepaper",
"a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", "a0paper", "a1paper", "a2paper", "a3paper", "a4paper", "a5paper", "a6paper",
"a6paper", "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", "b0paper", "b1paper", "b2paper", "b3paper", "b4paper", "b5paper", "b6paper",
"b5paper", "b6paper", "c0paper", "c1paper", "c2paper", "c3paper", "c0paper", "c1paper", "c2paper", "c3paper", "c4paper", "c5paper", "c6paper",
"c4paper", "c5paper", "c6paper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", ""
"b6j", ""
}; };
@ -1628,7 +1636,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
if ((!use_geometry || features.isProvided("geometry-light")) if ((!use_geometry || features.isProvided("geometry-light"))
&& class_supported_papersize) && class_supported_papersize)
clsoptions << string_papersize[papersize] << ","; clsoptions << subst(tclass.pagesizeformat(), "$$s", string_papersize[papersize]) << ",";
// if needed // if needed
if (sides != tclass.sides()) { if (sides != tclass.sides()) {
@ -1849,7 +1857,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features,
case PAPER_JISB4: case PAPER_JISB4:
case PAPER_JISB5: case PAPER_JISB5:
case PAPER_JISB6: case PAPER_JISB6:
ods << "," << from_ascii(string_papersize[papersize]); ods << "," << from_ascii(string_papersize_geometry[papersize]);
break; break;
case PAPER_DEFAULT: case PAPER_DEFAULT:
break; break;

View File

@ -62,7 +62,7 @@ namespace lyx {
// You should also run the development/tools/updatelayouts.py script, // You should also run the development/tools/updatelayouts.py script,
// to update the format of all of our layout files. // 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 // 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() TextClass::TextClass()
: loaded_(false), tex_class_avail_(false), : loaded_(false), tex_class_avail_(false),
opt_enginetype_("authoryear|numerical"), opt_fontsize_("10|11|12"), 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"), opt_pagestyle_("empty|plain|headings|fancy"), fontsize_format_("$$spt"), pagesize_("default"),
pagestyle_("default"), tablestyle_("default"), columns_(1), sides_(OneSide), secnumdepth_(3), pagesize_format_("$$spaper"), pagestyle_("default"), tablestyle_("default"),
tocdepth_(3), outputType_(LATEX), outputFormat_("latex"), columns_(1), sides_(OneSide), secnumdepth_(3), tocdepth_(3), outputType_(LATEX),
has_output_format_(false), defaultfont_(sane_font), outputFormat_("latex"), has_output_format_(false), defaultfont_(sane_font),
titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"), titletype_(TITLE_COMMAND_AFTER), titlename_("maketitle"),
min_toclevel_(0), max_toclevel_(0), maxcitenames_(2), min_toclevel_(0), max_toclevel_(0), maxcitenames_(2),
cite_full_author_list_(true), bibintoc_(false) cite_full_author_list_(true), bibintoc_(false)
@ -1006,6 +1006,7 @@ void TextClass::readClassOptions(Lexer & lexrc)
CO_FONTSIZE = 1, CO_FONTSIZE = 1,
CO_FONTSIZE_FORMAT, CO_FONTSIZE_FORMAT,
CO_PAGESIZE, CO_PAGESIZE,
CO_PAGESIZE_FORMAT,
CO_PAGESTYLE, CO_PAGESTYLE,
CO_OTHER, CO_OTHER,
CO_HEADER, CO_HEADER,
@ -1019,6 +1020,7 @@ void TextClass::readClassOptions(Lexer & lexrc)
{"header", CO_HEADER }, {"header", CO_HEADER },
{"other", CO_OTHER }, {"other", CO_OTHER },
{"pagesize", CO_PAGESIZE }, {"pagesize", CO_PAGESIZE },
{"pagesizeformat", CO_PAGESIZE_FORMAT },
{"pagestyle", CO_PAGESTYLE } {"pagestyle", CO_PAGESTYLE }
}; };
@ -1046,6 +1048,10 @@ void TextClass::readClassOptions(Lexer & lexrc)
lexrc.next(); lexrc.next();
opt_pagesize_ = rtrim(lexrc.getString()); opt_pagesize_ = rtrim(lexrc.getString());
break; break;
case CO_PAGESIZE_FORMAT:
lexrc.next();
pagesize_format_ = rtrim(lexrc.getString());
break;
case CO_PAGESTYLE: case CO_PAGESTYLE:
lexrc.next(); lexrc.next();
opt_pagestyle_ = rtrim(lexrc.getString()); opt_pagestyle_ = rtrim(lexrc.getString());

View File

@ -280,6 +280,8 @@ protected:
std::string fontsize_format_; std::string fontsize_format_;
/// Default page size /// Default page size
std::string pagesize_; std::string pagesize_;
/// Format of the papersize option
std::string pagesize_format_;
/// ///
std::string pagestyle_; std::string pagestyle_;
/// ///
@ -467,6 +469,8 @@ public:
/// ///
std::string const & pagesize() const { return pagesize_; } 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 & pagestyle() const { return pagestyle_; }
/// ///
std::string const & tablestyle() const { return tablestyle_; } std::string const & tablestyle() const { return tablestyle_; }

View File

@ -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_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", "a1paper", "b1paper", "c1paper", "a2paper", "b2paper", "c2paper", "a3paper",
"b3paper", "c3paper", "a4paper", "b4paper", "c4paper", "a5paper", "b5paper", "b3paper", "c3paper", "a4paper", "b4paper", "c4paper", "a5paper", "b5paper",
"c5paper", "a6paper", "b6paper", "c6paper", "executivepaper", "legalpaper", "c5paper", "a6paper", "b6paper", "c6paper", "executivepaper", "legalpaper",
"letterpaper", "b0j", "b1j", "b2j", "b3j", "b4j", "b5j", "b6j", 0}; "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", const char * const known_paper_margins[] = { "lmargin", "tmargin", "rmargin",
"bmargin", "headheight", "headsep", "footskip", "columnsep", 0}; "bmargin", "headheight", "headsep", "footskip", "columnsep", 0};
@ -709,13 +706,18 @@ void Preamble::handle_geometry(vector<string> & options)
options.erase(it); options.erase(it);
} }
// paper size // paper size
// keyval version: "paper=letter" // keyval version: "paper=letter" or "paper=letterpaper"
string paper = process_keyval_opt(options, "paper"); string paper = process_keyval_opt(options, "paper");
if (!paper.empty()) if (!paper.empty())
h_papersize = paper + "paper"; if (suffixIs(paper, "paper"))
paper = subst(paper, "paper", "");
// alternative version: "letterpaper" // alternative version: "letterpaper"
handle_opt(options, known_paper_sizes, h_papersize); handle_opt(options, known_latex_paper_sizes, paper);
delete_opt(options, known_paper_sizes); if (suffixIs(paper, "paper"))
paper = subst(paper, "paper", "");
delete_opt(options, known_latex_paper_sizes);
if (!paper.empty())
h_papersize = paper;
// page margins // page margins
char const * const * margin = known_paper_margins; char const * const * margin = known_paper_margins;
for (; *margin; ++margin) { for (; *margin; ++margin) {
@ -2543,12 +2545,41 @@ void Preamble::parse(Parser & p, string const & forceclass,
if (t.cs() == "documentclass") { if (t.cs() == "documentclass") {
vector<string>::iterator it; vector<string>::iterator it;
vector<string> opts = split_options(p.getArg('[', ']')); vector<string> 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); handle_opt(opts, known_fontsizes, h_paperfontsize);
delete_opt(opts, known_fontsizes); delete_opt(opts, known_fontsizes);
// delete "pt" at the end // delete "pt" at the end
string::size_type i = h_paperfontsize.find("pt"); string::size_type i = h_paperfontsize.find("pt");
if (i != string::npos) if (i != string::npos)
h_paperfontsize.erase(i); h_paperfontsize.erase(i);
// Now those known specifically to the class
string fsize;
vector<string> 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<string>::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 // The documentclass options are always parsed before the options
// of the babel call so that a language cannot overwrite the babel // of the babel call so that a language cannot overwrite the babel
// options. // options.
@ -2601,16 +2632,33 @@ void Preamble::parse(Parser & p, string const & forceclass,
opts.erase(it); opts.erase(it);
} }
// paper sizes // 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 // are handled by the \geometry command of the geometry package
handle_opt(opts, known_class_paper_sizes, h_papersize); string paper;
delete_opt(opts, known_class_paper_sizes); vector<string> 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<string>::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 // the remaining options
h_options = join(opts, ","); 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; continue;
} }
@ -2935,14 +2983,6 @@ void Preamble::parse(Parser & p, string const & forceclass,
// remove the whitespace // remove the whitespace
p.skip_spaces(); 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()) { if (h_papersides.empty()) {
ostringstream ss; ostringstream ss;
ss << tc.sides(); ss << tc.sides();

View File

@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
// Do not remove the comment below, so we get merge conflict in // Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own. // independent branches. Instead add your own.
#define LYX_FORMAT_LYX 586 // spitz: allow duplicate keys in qualified citation lists #define LYX_FORMAT_LYX 587 // spitz: generic paper size names
#define LYX_FORMAT_TEX2LYX 586 #define LYX_FORMAT_TEX2LYX 587
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX #if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
#ifndef _MSC_VER #ifndef _MSC_VER