+void Layout::readArgument(Lexer & lex, bool validating)
+{
+ if (!lex.next()) {
+ LYXERR0("Unable to read argument ID!");
+ return;
+ }
+ string const id = lex.getString();
+
+ bool const itemarg = prefixIs(id, "item:");
+ bool const postcmd = prefixIs(id, "post:");
+ bool const listpreamble = prefixIs(id, "listpreamble:");
+
+ LaTeXArgMap & lam = itemarg ? itemargs_ :
+ (postcmd ? postcommandargs_ :
+ (listpreamble ? listpreamble_ :
+ latexargs_));
+ latexarg & arg = lam[id];
+
+ if (listpreamble)
+ // list preamble has no delimiters by default
+ arg.nodelims = true;
+
+ bool error = false;
+ bool finished = false;
+ while (!finished && lex.isOK() && !error) {
+ lex.next();
+ string const tok = ascii_lowercase(lex.getString());
+
+ if (tok.empty()) {
+ continue;
+ } else if (tok == "endargument") {
+ finished = true;
+ } else if (tok == "labelstring") {
+ lex.next();
+ arg.labelstring = lex.getDocString();
+ } else if (tok == "menustring") {
+ lex.next();
+ arg.menustring = lex.getDocString();
+ } else if (tok == "mandatory") {
+ lex.next();
+ arg.mandatory = lex.getBool();
+ } else if (tok == "autoinsert") {
+ lex.next();
+ arg.autoinsert = lex.getBool();
+ } else if (tok == "insertcotext") {
+ lex.next();
+ arg.insertcotext = lex.getBool();
+ } else if (tok == "leftdelim") {
+ lex.next();
+ arg.ldelim = lex.getDocString();
+ arg.ldelim = support::subst(arg.ldelim, from_ascii("<br/>"),
+ from_ascii("\n"));
+ } else if (tok == "rightdelim") {
+ lex.next();
+ arg.rdelim = lex.getDocString();
+ arg.rdelim = support::subst(arg.rdelim, from_ascii("<br/>"),
+ from_ascii("\n"));
+ } else if (tok == "defaultarg") {
+ lex.next();
+ arg.defaultarg = lex.getDocString();
+ } else if (tok == "presetarg") {
+ lex.next();
+ arg.presetarg = lex.getDocString();
+ } else if (tok == "tooltip") {
+ lex.next();
+ arg.tooltip = lex.getDocString();
+ } else if (tok == "requires") {
+ lex.next();
+ arg.required = lex.getString();
+ } else if (tok == "decoration") {
+ lex.next();
+ arg.decoration = lex.getString();
+ } else if (tok == "newlinecmd") {
+ lex.next();
+ arg.newlinecmd = lex.getString();
+ } else if (tok == "font") {
+ arg.font = lyxRead(lex, arg.font);
+ } else if (tok == "labelfont") {
+ arg.labelfont = lyxRead(lex, arg.labelfont);
+ } else if (tok == "passthruchars") {
+ lex.next();
+ arg.pass_thru_chars = lex.getDocString();
+ } else if (tok == "passthru") {
+ lex.next();
+ docstring value = lex.getDocString();
+ if (value == "true" || value == "1")
+ arg.passthru = PT_TRUE;
+ else if (value == "false" || value == "0")
+ arg.passthru = PT_FALSE;
+ else
+ arg.passthru = PT_INHERITED;
+ } else if (tok == "istoccaption") {
+ lex.next();
+ arg.is_toc_caption = lex.getBool();
+ } else if (tok == "freespacing") {
+ lex.next();
+ arg.free_spacing = lex.getBool();
+ } else if (tok == "docbooktag") {
+ lex.next();
+ arg.docbooktag = lex.getDocString();
+ } else if (tok == "docbookattr") {
+ lex.next();
+ arg.docbookattr = lex.getDocString();
+ } else if (tok == "docbooktagtype") {
+ lex.next();
+ arg.docbooktagtype = lex.getDocString();
+ } else if (tok == "docbookargumentaftermaintag") {
+ lex.next();
+ arg.docbookargumentaftermaintag = lex.getBool();
+ } else if (tok == "docbookargumentbeforemaintag") {
+ lex.next();
+ arg.docbookargumentbeforemaintag = lex.getBool();
+ } else {
+ lex.printError("Unknown tag");
+ error = true;
+ }
+ }
+ if (!validating && arg.labelstring.empty()) {
+ LYXERR0("Incomplete Argument definition!");
+ // remove invalid definition
+ lam.erase(id);
+ }
+}
+
+
+void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg)
+{
+ os << "\tArgument " << id << '\n';
+ if (!arg.labelstring.empty())
+ os << "\t\tLabelString \"" << to_utf8(arg.labelstring) << "\"\n";
+ if (!arg.menustring.empty())
+ os << "\t\tMenuString \"" << to_utf8(arg.menustring) << "\"\n";
+ if (arg.mandatory)
+ os << "\t\tMandatory " << arg.mandatory << '\n';
+ if (arg.autoinsert)
+ os << "\t\tAutoinsert " << arg.autoinsert << '\n';
+ if (arg.insertcotext)
+ os << "\t\tInsertCotext " << arg.insertcotext << '\n';
+ if (!arg.ldelim.empty())
+ os << "\t\tLeftDelim \""
+ << to_utf8(subst(arg.ldelim, from_ascii("\n"), from_ascii("<br/>")))
+ << "\"\n";
+ if (!arg.rdelim.empty())
+ os << "\t\tRightDelim \""
+ << to_utf8(subst(arg.rdelim, from_ascii("\n"), from_ascii("<br/>")))
+ << "\"\n";
+ if (!arg.defaultarg.empty())
+ os << "\t\tDefaultArg \"" << to_utf8(arg.defaultarg) << "\"\n";
+ if (!arg.presetarg.empty())
+ os << "\t\tPresetArg \"" << to_utf8(arg.presetarg) << "\"\n";
+ if (!arg.tooltip.empty())
+ os << "\t\tToolTip \"" << to_utf8(arg.tooltip) << "\"\n";
+ if (!arg.required.empty())
+ os << "\t\tRequires \"" << arg.required << "\"\n";
+ if (!arg.decoration.empty())
+ os << "\t\tDecoration \"" << arg.decoration << "\"\n";
+ if (!arg.newlinecmd.empty())
+ os << "\t\tNewlineCmd \"" << arg.newlinecmd << "\"\n";
+ if (arg.font != inherit_font)
+ lyxWrite(os, arg.font, "Font", 2);
+ if (arg.labelfont != inherit_font)
+ lyxWrite(os, arg.labelfont, "LabelFont", 2);
+ switch (arg.passthru) {
+ case PT_TRUE:
+ os << "\t\tPassThru true\n";
+ break;
+ case PT_FALSE:
+ os << "\t\tPassThru false\n";
+ break;
+ case PT_INHERITED:
+ os << "\t\tPassThru inherited\n";
+ break;
+ }
+ if (!arg.pass_thru_chars.empty())
+ os << "\t\tPassThruChars \"" << to_utf8(arg.pass_thru_chars) << "\"\n";
+ if (arg.free_spacing)
+ os << "\t\tFreeSpacing " << arg.free_spacing << "\n";
+ os << "\tEndArgument\n";
+}
+
+
+void Layout::write(ostream & os) const
+{
+ os << "Style \"" << to_utf8(name_) << "\"\n";
+ if (!category_.empty() && obsoleted_by_.empty())
+ os << "\tCategory \"" << to_utf8(category_) << "\"\n";
+ // Can't deduce Copystyle here :-(
+ if (!obsoleted_by_.empty()) {
+ os << "\tObsoletedBy \"" << to_utf8(obsoleted_by_)
+ << "\"\nEnd\n";
+ return;
+ }
+ if (!depends_on_.empty())
+ os << "\tDependsOn " << to_utf8(depends_on_) << '\n';
+ switch (margintype) {
+ case MARGIN_DYNAMIC:
+ os << "\tMargin Dynamic\n";
+ break;
+ case MARGIN_FIRST_DYNAMIC:
+ os << "\tMargin First_Dynamic\n";
+ break;
+ case MARGIN_MANUAL:
+ os << "\tMargin Manual\n";
+ break;
+ case MARGIN_RIGHT_ADDRESS_BOX:
+ os << "\tMargin Right_Address_Box\n";
+ break;
+ case MARGIN_STATIC:
+ os << "\tMargin Static\n";
+ break;
+ }
+ switch (latextype) {
+ case LATEX_BIB_ENVIRONMENT:
+ os << "\tLatexType Bib_Environment\n";
+ break;
+ case LATEX_COMMAND:
+ os << "\tLatexType Command\n";
+ break;
+ case LATEX_ENVIRONMENT:
+ os << "\tLatexType Environment\n";
+ break;
+ case LATEX_ITEM_ENVIRONMENT:
+ os << "\tLatexType Item_Environment\n";
+ break;
+ case LATEX_LIST_ENVIRONMENT:
+ os << "\tLatexType List_Environment\n";
+ break;
+ case LATEX_PARAGRAPH:
+ os << "\tLatexType Paragraph\n";
+ break;
+ }
+ os << "\tInTitle " << intitle << "\n"
+ "\tInPreamble " << inpreamble << "\n"
+ "\tTocLevel " << toclevel << "\n"
+ "\tResumeCounter " << resumecounter << "\n"
+ "\tStepParentCounter " << stepparentcounter << '\n';
+ // ResetArgs does not make sense here
+ for (LaTeXArgMap::const_iterator it = latexargs_.begin();
+ it != latexargs_.end(); ++it)
+ writeArgument(os, it->first, it->second);
+ for (LaTeXArgMap::const_iterator it = itemargs_.begin();
+ it != itemargs_.end(); ++it)
+ writeArgument(os, it->first, it->second);
+ for (LaTeXArgMap::const_iterator it = postcommandargs_.begin();
+ it != postcommandargs_.end(); ++it)
+ writeArgument(os, it->first, it->second);
+ for (LaTeXArgMap::const_iterator it = listpreamble_.begin();
+ it != listpreamble_.end(); ++it)
+ writeArgument(os, it->first, it->second);
+ os << "\tNeedProtect " << needprotect << "\n"
+ "\tNeedCProtect " << needcprotect << "\n"
+ "\tNeedMBoxProtect " << needmboxprotect << "\n"
+ "\tKeepEmpty " << keepempty << '\n';
+ if (labelfont == font)
+ lyxWrite(os, font, "Font", 1);
+ else {
+ lyxWrite(os, font, "TextFont", 1);
+ lyxWrite(os, labelfont, "LabelFont", 1);
+ }
+ os << "\tNextNoIndent " << nextnoindent << "\n"
+ "\tCommandDepth " << commanddepth << '\n';
+ if (!latexname_.empty())
+ os << "\tLatexName \"" << latexname_ << "\"\n";
+ if (!latexparam_.empty())
+ os << "\tLatexParam \"" << subst(latexparam_, "\"", """)
+ << "\"\n";
+ if (!leftdelim_.empty())
+ os << "\tLeftDelim "
+ << to_utf8(subst(leftdelim_, from_ascii("\n"), from_ascii("<br/>")))
+ << '\n';
+ if (!rightdelim_.empty())
+ os << "\tRightDelim "
+ << to_utf8(subst(rightdelim_, from_ascii("\n"), from_ascii("<br/>")))
+ << '\n';
+ if (!innertag_.empty())
+ os << "\tInnerTag \"" << innertag_ << "\"\n";
+ if (!labeltag_.empty())
+ os << "\tLabelTag \"" << labeltag_ << "\"\n";
+ if (!itemtag_.empty())
+ os << "\tItemTag \"" << itemtag_ << "\"\n";
+ if (!itemcommand_.empty())
+ os << "\tItemCommand " << itemcommand_ << '\n';
+ if (!preamble_.empty())
+ os << "\tPreamble\n\t"
+ << to_utf8(subst(rtrim(preamble_, "\n"),
+ from_ascii("\n"), from_ascii("\n\t")))
+ << "\n\tEndPreamble\n";
+ if (!langpreamble_.empty())
+ os << "\tLangPreamble\n\t"
+ << to_utf8(subst(rtrim(langpreamble_, "\n"),
+ from_ascii("\n"), from_ascii("\n\t")))
+ << "\n\tEndLangPreamble\n";
+ if (!babelpreamble_.empty())
+ os << "\tBabelPreamble\n\t"
+ << to_utf8(subst(rtrim(babelpreamble_, "\n"),
+ from_ascii("\n"), from_ascii("\n\t")))
+ << "\n\tEndBabelPreamble\n";
+ switch (labeltype) {
+ case LABEL_ABOVE:
+ os << "\tLabelType Above\n";
+ break;
+ case LABEL_BIBLIO:
+ os << "\tLabelType Bibliography\n";
+ break;
+ case LABEL_CENTERED:
+ os << "\tLabelType Centered\n";
+ break;
+ case LABEL_ENUMERATE:
+ os << "\tLabelType Enumerate\n";
+ break;
+ case LABEL_ITEMIZE:
+ os << "\tLabelType Itemize\n";
+ break;
+ case LABEL_MANUAL:
+ os << "\tLabelType Manual\n";
+ break;
+ case LABEL_NO_LABEL:
+ os << "\tLabelType No_Label\n";
+ break;
+ case LABEL_SENSITIVE:
+ os << "\tLabelType Sensitive\n";
+ break;
+ case LABEL_STATIC:
+ os << "\tLabelType Static\n";
+ break;
+ }
+ switch (endlabeltype) {
+ case END_LABEL_BOX:
+ os << "\tEndLabelType Box\n";
+ break;
+ case END_LABEL_FILLED_BOX:
+ os << "\tEndLabelType Filled_Box\n";
+ break;
+ case END_LABEL_NO_LABEL:
+ os << "\tEndLabelType No_Label\n";
+ break;
+ case END_LABEL_STATIC:
+ os << "\tEndLabelType Static\n";
+ break;
+ }
+ os << "\tParagraphGroup \"" << par_group_ << "\"\n";
+ if (!leftmargin.empty())
+ os << "\tLeftMargin \"" << to_utf8(leftmargin) << "\"\n";
+ if (!rightmargin.empty())
+ os << "\tRightMargin \"" << to_utf8(rightmargin) << "\"\n";
+ if (!labelindent.empty())
+ os << "\tLabelIndent " << to_utf8(labelindent) << '\n';
+ if (!parindent.empty())
+ os << "\tParIndent " << to_utf8(parindent) << '\n';
+ os << "\tParSkip " << parskip << "\n"
+ "\tItemSep " << itemsep << "\n"
+ "\tTopSep " << topsep << "\n"
+ "\tBottomSep " << bottomsep << "\n"
+ "\tLabelBottomSep " << labelbottomsep << '\n';
+ if (!labelsep.empty())
+ os << "\tLabelSep " << to_utf8(subst(labelsep, ' ', 'x'))
+ << '\n';
+ os << "\tParSep " << parsep << "\n"
+ "\tNewLine " << newline_allowed << '\n';
+ switch (align) {
+ case LYX_ALIGN_BLOCK:
+ os << "\tAlign Block\n";
+ break;
+ case LYX_ALIGN_CENTER:
+ os << "\tAlign Center\n";
+ break;
+ case LYX_ALIGN_LAYOUT:
+ os << "\tAlign Layout\n";
+ break;
+ case LYX_ALIGN_LEFT:
+ os << "\tAlign Left\n";
+ break;
+ case LYX_ALIGN_RIGHT:
+ os << "\tAlign Right\n";
+ break;
+ case LYX_ALIGN_DECIMAL:
+ case LYX_ALIGN_SPECIAL:
+ case LYX_ALIGN_NONE:
+ break;
+ }
+ if (alignpossible & (LYX_ALIGN_BLOCK | LYX_ALIGN_CENTER |
+ LYX_ALIGN_LAYOUT | LYX_ALIGN_LEFT | LYX_ALIGN_RIGHT)) {
+ bool first = true;
+ os << "\tAlignPossible";
+ if (alignpossible & LYX_ALIGN_BLOCK) {
+ os << " Block";
+ first = false;
+ }
+ if (alignpossible & LYX_ALIGN_CENTER) {
+ if (!first)
+ os << ',';
+ os << " Center";
+ first = false;
+ }
+ if (alignpossible & LYX_ALIGN_LAYOUT) {
+ if (!first)
+ os << ',';
+ os << " Layout";
+ first = false;
+ }
+ if (alignpossible & LYX_ALIGN_LEFT) {
+ if (!first)
+ os << ',';
+ os << " Left";
+ first = false;
+ }
+ if (alignpossible & LYX_ALIGN_RIGHT) {
+ if (!first)
+ os << ',';
+ os << " Right";
+ first = false;
+ }
+ os << '\n';
+ }
+ // LabelString must come before LabelStringAppendix
+ if (!labelstring_.empty())
+ os << "\tLabelString \"" << to_utf8(labelstring_) << "\"\n";
+ if (!endlabelstring_.empty())
+ os << "\tEndLabelString \"" << to_utf8(endlabelstring_) << "\"\n";
+ if (!labelstring_appendix_.empty() && labelstring_appendix_ != labelstring_)
+ os << "\tLabelStringAppendix \""
+ << to_utf8(labelstring_appendix_) << "\"\n";
+ if (!counter.empty())
+ os << "\tLabelCounter \"" << to_utf8(counter) << "\"\n";
+ os << "\tFreeSpacing " << free_spacing << '\n';
+ os << "\tPassThru " << pass_thru << '\n';
+ if (!pass_thru_chars.empty())
+ os << "\tPassThruChars " << to_utf8(pass_thru_chars) << '\n';
+ os << "\tParbreakIsNewline " << parbreak_is_newline << '\n';
+ switch (spacing.getSpace()) {
+ case Spacing::Double:
+ os << "\tSpacing Double\n";
+ break;
+ case Spacing::Onehalf:
+ os << "\tSpacing Onehalf\n";
+ break;
+ case Spacing::Other:
+ os << "\tSpacing Other " << spacing.getValueAsString() << '\n';
+ break;
+ case Spacing::Single:
+ os << "\tSpacing Single\n";
+ break;
+ case Spacing::Default:
+ break;
+ }
+ if (!required_.empty()) {
+ os << "\tRequires ";
+ for (set<string>::const_iterator it = required_.begin();
+ it != required_.end(); ++it) {
+ if (it != required_.begin())
+ os << ',';
+ os << *it;
+ }
+ os << '\n';
+ }
+ if (!autonests_.empty()) {
+ os << "\tAutoNests\n\t";
+ for (set<docstring>::const_iterator it = autonests_.begin();
+ it != autonests_.end(); ++it) {
+ if (it != autonests_.begin())
+ os << ',';
+ os << to_utf8(*it);
+ }
+ os << "\n\tEndAutoNests\n";
+ }
+ if (!autonested_by_.empty()) {
+ os << "\tIsAutoNestedBy\n\t\t";
+ for (set<docstring>::const_iterator it = autonested_by_.begin();
+ it != autonested_by_.end(); ++it) {
+ if (it != autonested_by_.begin())
+ os << ',';
+ os << to_utf8(*it);
+ }
+ os << "\n\tEndIsAutoNestedBy\n";
+ }
+ if (refprefix.empty())
+ os << "\tRefPrefix OFF\n";
+ else
+ os << "\tRefPrefix " << to_utf8(refprefix) << '\n';
+ if (!htmltag_.empty())
+ os << "\tHTMLTag " << htmltag_ << '\n';
+ if (!htmlattr_.empty())
+ os << "\tHTMLAttr " << htmlattr_ << '\n';
+ if (!htmlitemtag_.empty())
+ os << "\tHTMLItem " << htmlitemtag_ << '\n';
+ if (!htmlitemattr_.empty())
+ os << "\tHTMLItemAttr " << htmlitemattr_ << '\n';
+ if (!htmllabeltag_.empty())
+ os << "\tHTMLLabel " << htmllabeltag_ << '\n';
+ if (!htmllabelattr_.empty())
+ os << "\tHTMLLabelAttr " << htmllabelattr_ << '\n';
+ os << "\tHTMLLabelFirst " << htmllabelfirst_ << '\n';
+ if (!htmlstyle_.empty())
+ os << "\tHTMLStyle\n"
+ << to_utf8(rtrim(htmlstyle_, "\n"))
+ << "\n\tEndHTMLStyle\n";
+ os << "\tHTMLForceCSS " << htmlforcecss_ << '\n';
+ if (!htmlpreamble_.empty())
+ os << "\tHTMLPreamble\n"
+ << to_utf8(rtrim(htmlpreamble_, "\n"))
+ << "\n\tEndPreamble\n";
+ os << "\tHTMLTitle " << htmltitle_ << "\n";
+ if(!docbooktag_.empty())
+ os << "\tDocBookTag " << docbooktag_ << '\n';
+ if(!docbookattr_.empty())
+ os << "\tDocBookAttr \"" << docbookattr_ << "\"\n";
+ if(!docbooktagtype_.empty())
+ os << "\tDocBookTagType " << docbooktagtype_ << '\n';
+ if(!docbookinnertag_.empty())
+ os << "\tDocBookInnerTag " << docbookinnertag_ << '\n';
+ if(!docbookinnerattr_.empty())
+ os << "\tDocBookInnerAttr \"" << docbookinnerattr_ << "\"\n";
+ if(!docbookinnertagtype_.empty())
+ os << "\tDocBookInnerTagType " << docbookinnertagtype_ << '\n';
+ if(!docbookininfo_.empty())
+ os << "\tDocBookInInfo " << docbookininfo_ << '\n';
+ os << "\tDocBookAbstract " << docbookabstract_ << '\n';
+ if(!docbookwrappertag_.empty())
+ os << "\tDocBookWrapperTag " << docbookwrappertag_ << '\n';
+ if(!docbookwrapperattr_.empty())
+ os << "\tDocBookWrapperAttr " << docbookwrapperattr_ << '\n';
+ if(!docbookwrappertagtype_.empty())
+ os << "\tDocBookWrapperTagType " << docbookwrappertagtype_ << '\n';
+ os << "\tDocBookSection " << docbooksection_ << '\n';
+ if(!docbooksectiontag_.empty())
+ os << "\tDocBookSectionTag " << docbooksectiontag_ << '\n';
+ if(!docbookitemtag_.empty())
+ os << "\tDocBookItemTag " << docbookitemtag_ << '\n';
+ if(!docbookitemattr_.empty())
+ os << "\tDocBookItemAttr " << docbookitemattr_ << '\n';
+ if(!docbookitemtagtype_.empty())
+ os << "\tDocBookItemTagType " << docbookitemtagtype_ << '\n';
+ if(!docbookitemwrappertag_.empty())
+ os << "\tDocBookItemWrapperTag " << docbookitemwrappertag_ << '\n';
+ if(!docbookitemwrapperattr_.empty())
+ os << "\tDocBookItemWrapperAttr " << docbookitemwrapperattr_ << '\n';
+ if(!docbookitemwrappertagtype_.empty())
+ os << "\tDocBookItemWrapperTagType " << docbookitemwrappertagtype_ << '\n';
+ os << "\tDocBookWrapperMergeWithPrevious " << docbookwrappermergewithprevious_ << '\n';
+ if(!docbookitemlabeltag_.empty())
+ os << "\tDocBookItemLabelTag " << docbookitemlabeltag_ << '\n';
+ if(!docbookitemlabelattr_.empty())
+ os << "\tDocBookItemLabelAttr " << docbookitemlabelattr_ << '\n';
+ if(!docbookitemlabeltagtype_.empty())
+ os << "\tDocBookItemLabelTagType " << docbookitemlabeltagtype_ << '\n';
+ if(!docbookiteminnertag_.empty())
+ os << "\tDocBookItemInnerTag " << docbookiteminnertag_ << '\n';
+ if(!docbookiteminnerattr_.empty())
+ os << "\tDocBookItemInnerAttr " << docbookiteminnerattr_ << '\n';
+ if(!docbookiteminnertagtype_.empty())
+ os << "\tDocBookItemInnerTagType " << docbookiteminnertagtype_ << '\n';
+ if(!docbookforceabstracttag_.empty())
+ os << "\tDocBookForceAbstractTag " << docbookforceabstracttag_ << '\n';
+ os << "\tDocBookNoFontInside " << docbooknofontinside_ << "\n"
+ "\tSpellcheck " << spellcheck << "\n"
+ "\tForceLocal " << forcelocal << "\n"
+ "End\n";
+}
+
+
+bool Layout::hasArgs() const
+{
+ return !latexargs_.empty() || !postcommandargs_.empty() ||
+ !itemargs_.empty() || !listpreamble_.empty();
+}
+
+
+Layout::LaTeXArgMap Layout::args() const
+{
+ LaTeXArgMap args = latexargs_;
+ if (!postcommandargs_.empty())
+ args.insert(postcommandargs_.begin(), postcommandargs_.end());
+ if (!listpreamble_.empty())
+ args.insert(listpreamble_.begin(), listpreamble_.end());
+ if (!itemargs_.empty())
+ args.insert(itemargs_.begin(), itemargs_.end());
+ return args;
+}
+
+
+int Layout::optArgs() const
+{
+ int nr = 0;
+ LaTeXArgMap::const_iterator it = latexargs_.begin();
+ for (; it != latexargs_.end(); ++it) {
+ if (!(*it).second.mandatory)
+ ++nr;
+ }
+ LaTeXArgMap::const_iterator iit = postcommandargs_.begin();
+ for (; iit != postcommandargs_.end(); ++iit) {
+ if (!(*iit).second.mandatory)
+ ++nr;
+ }
+ return nr;
+}
+
+
+int Layout::requiredArgs() const
+{
+ int nr = 0;
+ LaTeXArgMap::const_iterator it = latexargs_.begin();
+ for (; it != latexargs_.end(); ++it) {
+ if ((*it).second.mandatory)
+ ++nr;
+ }
+ LaTeXArgMap::const_iterator iit = postcommandargs_.begin();
+ for (; iit != postcommandargs_.end(); ++iit) {
+ if (!(*iit).second.mandatory)
+ ++nr;
+ }
+ return nr;
+}
+
+
+string const & Layout::htmltag() const
+{