]> git.lyx.org Git - lyx.git/blobdiff - src/TextClass.cpp
Fix bug #11716
[lyx.git] / src / TextClass.cpp
index e381060e0cdc3f0e4022bd222958399981c3ea89..9f22d6d8a17a2823e5a7c6472c072e78a5da2d02 100644 (file)
@@ -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 = 73; // spitz: MenuString
+int const LAYOUT_FORMAT = 80; // spitz: Requires for floats
 
 
 // Layout format for the current lyx file format. Controls which format is
@@ -150,13 +150,14 @@ 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_pagestyle_("empty|plain|headings|fancy"), pagestyle_("default"),
-         tablestyle_("default"), columns_(1), sides_(OneSide), secnumdepth_(3),
-         tocdepth_(3), outputType_(LATEX), outputFormat_("latex"),
-         has_output_format_(false), defaultfont_(sane_font), 
+         opt_pagesize_("default|a4|a5|b5|letter|legal|executive"),
+         opt_pagestyle_("empty|plain|headings|fancy"), fontsize_format_("$$spt"), pagesize_("default"),
+         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)
+         cite_full_author_list_(true), bibintoc_(false)
 {
 }
 
@@ -191,6 +192,7 @@ enum TextClassTags {
        TC_COLUMNS,
        TC_SIDES,
        TC_PAGESTYLE,
+       TC_PAGESIZE,
        TC_DEFAULTFONT,
        TC_SECNUMDEPTH,
        TC_TOCDEPTH,
@@ -227,7 +229,8 @@ enum TextClassTags {
        TC_DEFAULTBIBLIO,
        TC_FULLAUTHORLIST,
        TC_OUTLINERNAME,
-       TC_TABLESTYLE
+       TC_TABLESTYLE,
+       TC_BIBINTOC
 };
 
 
@@ -238,6 +241,7 @@ LexerKeyword textClassTags[] = {
        { "addtohtmlpreamble", TC_ADDTOHTMLPREAMBLE },
        { "addtohtmlstyles",   TC_ADDTOHTMLSTYLES },
        { "addtopreamble",     TC_ADDTOPREAMBLE },
+       { "bibintoc",          TC_BIBINTOC },
        { "citeengine",        TC_CITEENGINE },
        { "citeenginetype",    TC_CITEENGINETYPE },
        { "citeformat",        TC_CITEFORMAT },
@@ -270,6 +274,7 @@ LexerKeyword textClassTags[] = {
        { "outputformat",      TC_OUTPUTFORMAT },
        { "outputtype",        TC_OUTPUTTYPE },
        { "packageoptions",    TC_PKGOPTS },
+       { "pagesize",          TC_PAGESIZE },
        { "pagestyle",         TC_PAGESTYLE },
        { "preamble",          TC_PREAMBLE },
        { "provides",          TC_PROVIDES },
@@ -604,6 +609,11 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        }
                        break;
 
+               case TC_PAGESIZE:
+                       lexrc.next();
+                       pagesize_ = rtrim(lexrc.getString());
+                       break;
+
                case TC_PAGESTYLE:
                        lexrc.next();
                        pagestyle_ = rtrim(lexrc.getString());
@@ -810,6 +820,11 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, ReadType rt)
                        }
                        break;
 
+               case TC_BIBINTOC:
+                       if (lexrc.next())
+                               bibintoc_ = lexrc.getBool();
+                       break;
+
                case TC_FULLAUTHORLIST:
                        if (lexrc.next())
                                cite_full_author_list_ &= lexrc.getBool();
@@ -989,6 +1004,9 @@ void TextClass::readClassOptions(Lexer & lexrc)
 {
        enum {
                CO_FONTSIZE = 1,
+               CO_FONTSIZE_FORMAT,
+               CO_PAGESIZE,
+               CO_PAGESIZE_FORMAT,
                CO_PAGESTYLE,
                CO_OTHER,
                CO_HEADER,
@@ -998,8 +1016,11 @@ void TextClass::readClassOptions(Lexer & lexrc)
        LexerKeyword classOptionsTags[] = {
                {"end",       CO_END },
                {"fontsize",  CO_FONTSIZE },
+               {"fontsizeformat", CO_FONTSIZE_FORMAT },
                {"header",    CO_HEADER },
                {"other",     CO_OTHER },
+               {"pagesize",  CO_PAGESIZE },
+               {"pagesizeformat", CO_PAGESIZE_FORMAT },
                {"pagestyle", CO_PAGESTYLE }
        };
 
@@ -1019,6 +1040,18 @@ void TextClass::readClassOptions(Lexer & lexrc)
                        lexrc.next();
                        opt_fontsize_ = rtrim(lexrc.getString());
                        break;
+               case CO_FONTSIZE_FORMAT:
+                       lexrc.next();
+                       fontsize_format_ = rtrim(lexrc.getString());
+                       break;
+               case CO_PAGESIZE:
+                       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());
@@ -1168,7 +1201,7 @@ bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add)
                                cite_command_aliases_[s] = lyx_cmd;
                }
                vector<string> const stardescs = getVectorFromString(stardesc, "!");
-               int size = stardesc.size();
+               int size = int(stardesc.size());
                if (size > 0)
                        cs.stardesc = stardescs[0];
                if (size > 1)
@@ -1205,14 +1238,14 @@ bool TextClass::readCiteEngine(Lexer & lexrc, ReadType rt, bool const add)
 
        // Add the styles from AddToCiteEngine to the class' styles
        // (but only if they are not yet defined)
-       for (auto const cis : class_cite_styles_) {
+       for (auto const cis : class_cite_styles_) {
                // Only consider the current CiteEngineType
                if (!(type & cis.first))
                        continue;
-               for (auto const ciss : cis.second) {
+               for (auto const ciss : cis.second) {
                        bool defined = false;
                        // Check if the style "name" is already def'ed
-                       for (auto const av : getCiteStyles(cis.first))
+                       for (auto const av : getCiteStyles(cis.first))
                                if (av.name == ciss.name)
                                        defined = true;
                        if (!defined) {
@@ -1280,36 +1313,58 @@ bool TextClass::readCiteFormat(Lexer & lexrc, ReadType rt)
                        continue;
                if (initchar == '!' || initchar == '_' || prefixIs(etype, "B_")) {
                        bool defined = false;
+                       bool aydefined = false;
+                       bool numdefined = false;
                        // Check if the macro is already def'ed
-                       for (auto const cm : cite_macros_) {
+                       for (auto const cm : cite_macros_) {
                                if (!(type & cm.first))
                                        continue;
-                               if (cm.second.find(etype) != cm.second.end())
-                                       defined = true;
+                               if (cm.second.find(etype) != cm.second.end()) {
+                                       if (type == cm.first)
+                                               // defined as default or specific type
+                                               defined = true;
+                                       if (cm.first == ENGINE_TYPE_AUTHORYEAR)
+                                               // defined for author-year
+                                               aydefined = true;
+                                       else if (cm.first == ENGINE_TYPE_NUMERICAL)
+                                               // defined for numerical
+                                               numdefined = true;
+                               }
                        }
                        if (!defined || overwrite) {
-                               if (type & ENGINE_TYPE_AUTHORYEAR)
+                               if (type & ENGINE_TYPE_AUTHORYEAR && (type != ENGINE_TYPE_DEFAULT || !aydefined))
                                        cite_macros_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
-                               if (type & ENGINE_TYPE_NUMERICAL)
+                               if (type & ENGINE_TYPE_NUMERICAL && (type != ENGINE_TYPE_DEFAULT || !numdefined))
                                        cite_macros_[ENGINE_TYPE_NUMERICAL][etype] = definition;
-                               if (type & ENGINE_TYPE_DEFAULT)
+                               if (type == ENGINE_TYPE_DEFAULT)
                                        cite_macros_[ENGINE_TYPE_DEFAULT][etype] = definition;
                        }
                } else {
                        bool defined = false;
+                       bool aydefined = false;
+                       bool numdefined = false;
                        // Check if the format is already def'ed
-                       for (auto const cm : cite_formats_) {
+                       for (auto const cm : cite_formats_) {
                                if (!(type & cm.first))
                                        continue;
-                               if (cm.second.find(etype) != cm.second.end())
-                                       defined = true;
+                               if (cm.second.find(etype) != cm.second.end()) {
+                                       if (type == cm.first)
+                                               // defined as default or specific type
+                                               defined = true;
+                                       if (cm.first == ENGINE_TYPE_AUTHORYEAR)
+                                               // defined for author-year
+                                               aydefined = true;
+                                       else if (cm.first == ENGINE_TYPE_NUMERICAL)
+                                               // defined for numerical
+                                               numdefined = true;
+                               }
                        }
                        if (!defined || overwrite){
-                               if (type & ENGINE_TYPE_AUTHORYEAR)
+                               if (type & ENGINE_TYPE_AUTHORYEAR && (type != ENGINE_TYPE_DEFAULT || !aydefined))
                                        cite_formats_[ENGINE_TYPE_AUTHORYEAR][etype] = definition;
-                               if (type & ENGINE_TYPE_NUMERICAL)
+                               if (type & ENGINE_TYPE_NUMERICAL && (type != ENGINE_TYPE_DEFAULT || !numdefined))
                                        cite_formats_[ENGINE_TYPE_NUMERICAL][etype] = definition;
-                               if (type & ENGINE_TYPE_DEFAULT)
+                               if (type == ENGINE_TYPE_DEFAULT)
                                        cite_formats_[ENGINE_TYPE_DEFAULT][etype] = definition;
                        }
                }
@@ -1337,7 +1392,8 @@ bool TextClass::readFloat(Lexer & lexrc)
                FT_REFPREFIX,
                FT_ALLOWED_PLACEMENT,
                FT_ALLOWS_SIDEWAYS,
-               FT_ALLOWS_WIDE,
+               FT_ALLOWS_WIDE,
+               FT_REQUIRES,
                FT_END
        };
 
@@ -1357,6 +1413,7 @@ bool TextClass::readFloat(Lexer & lexrc)
                { "numberwithin", FT_WITHIN },
                { "placement", FT_PLACEMENT },
                { "refprefix", FT_REFPREFIX },
+               { "requires", FT_REQUIRES },
                { "style", FT_STYLE },
                { "type", FT_TYPE },
                { "usesfloatpkg", FT_USESFLOAT }
@@ -1377,6 +1434,7 @@ bool TextClass::readFloat(Lexer & lexrc)
        string style;
        string type;
        string within;
+       string requires;
        bool usesfloat = true;
        bool ispredefined = false;
        bool allowswide = true;
@@ -1452,6 +1510,10 @@ bool TextClass::readFloat(Lexer & lexrc)
                        lexrc.next();
                        usesfloat = lexrc.getBool();
                        break;
+               case FT_REQUIRES:
+                       lexrc.next();
+                       requires = lexrc.getString();
+                       break;
                case FT_PREDEFINED:
                        lexrc.next();
                        ispredefined = lexrc.getBool();
@@ -1505,8 +1567,8 @@ bool TextClass::readFloat(Lexer & lexrc)
                }
                Floating fl(type, placement, ext, within, style, name,
                            listname, listcommand, refprefix, allowed_placement,
-                           htmltag, htmlattr, htmlstyle, usesfloat, ispredefined,
-                           allowswide, allowssideways);
+                           htmltag, htmlattr, htmlstyle, requires, usesfloat,
+                           ispredefined, allowswide, allowssideways);
                floatlist_.newFloat(fl);
                // each float has its own counter
                counters_.newCounter(from_ascii(type), from_ascii(within),
@@ -1927,7 +1989,9 @@ Layout const & DocumentClass::htmlTOCLayout() const
 string const DocumentClass::getCiteFormat(CiteEngineType const & type,
        string const & entry, bool const punct, string const & fallback) const
 {
-       string default_format = "{%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, ed., ]]}]]}\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]][[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}";
+       string default_format = "{%fullnames:author%[[%fullnames:author%, ]][[{%fullnames:editor%[[%fullnames:editor%, ed., ]]}]]}"
+                               "\"%title%\"{%journal%[[, {!<i>!}%journal%{!</i>!}]][[{%publisher%[[, %publisher%]]"
+                               "[[{%institution%[[, %institution%]]}]]}]]}{%year%[[ (%year%)]]}{%pages%[[, %pages%]]}";
        if (punct)
                default_format += ".";