>>>>> "José" == José Matos <[EMAIL PROTECTED]> writes:
José> On Tuesday 20 March 2007 9:23:56 am Jean-Marc Lasgouttes wrote:
>> One solution would be to define a isNeeded() for this use case,
>> and still use isRequired in the few cases where this makes sense.
José> The patch seems quite interesting indeed. I think that it is
José> not yet ready to beta 2 but I would to see it (and to help
José> testing it) for a later release.
OK, here is the still untested second iteration. I introduce a helper
isNeeded, which is equivalent to "isRequired && ! provided" (if you
have a better name, please tell). With this change, any feature known
to LyX can be provided by a class.
What needs to be done
- update layout2layout. I need help there pretty please.
- actually test it. I do not expect any major problem, since I tried
to be conservative.
- document the changes (trivial).
JMarc
Index: src/LaTeXFeatures.C
===================================================================
--- src/LaTeXFeatures.C (révision 17488)
+++ src/LaTeXFeatures.C (copie de travail)
@@ -152,6 +152,12 @@ bool LaTeXFeatures::isRequired(string co
}
+bool LaTeXFeatures::isNeeded(string const & name) const
+{
+ return isRequired(name) && !params_.getLyXTextClass().provides(name);
+}
+
+
bool LaTeXFeatures::isAvailable(string const & name)
{
if (packages_.empty())
@@ -267,7 +273,7 @@ string const LaTeXFeatures::getPackages(
// packages which we just \usepackage{package}
//
for (int i = 0; i < nb_simplefeatures; ++i) {
- if (isRequired(simplefeatures[i]))
+ if (isNeeded(simplefeatures[i]))
packages << "\\usepackage{"
<< simplefeatures[i] << "}\n";
}
@@ -277,8 +283,7 @@ string const LaTeXFeatures::getPackages(
// than those above.
//
- if (isRequired("amsmath")
- && !tclass.provides(LyXTextClass::amsmath)
+ if (isNeeded("amsmath")
&& params_.use_amsmath != BufferParams::package_off) {
packages << "\\usepackage{amsmath}\n";
}
@@ -290,12 +295,12 @@ string const LaTeXFeatures::getPackages(
// esint is used, since esint redefines all relevant integral
// symbols from wasysym and amsmath.
// See http://bugzilla.lyx.org/show_bug.cgi?id=1942
- if (isRequired("wasysym") && isRequired("esint") &&
+ if (isNeeded("wasysym") && isRequired("esint") &&
params_.use_esint != BufferParams::package_off)
packages << "\\usepackage{wasysym}\n";
// color.sty
- if (isRequired("color")) {
+ if (isNeeded("color")) {
if (params_.graphicsDriver == "default")
packages << "\\usepackage{color}\n";
else
@@ -306,13 +311,13 @@ string const LaTeXFeatures::getPackages(
// makeidx.sty
if (isRequired("makeidx")) {
- if (!tclass.provides(LyXTextClass::makeidx))
+ if (!tclass.provides("makeidx"))
packages << "\\usepackage{makeidx}\n";
packages << "\\makeindex\n";
}
// graphicx.sty
- if (isRequired("graphicx") && params_.graphicsDriver != "none") {
+ if (isNeeded("graphicx") && params_.graphicsDriver != "none") {
if (params_.graphicsDriver == "default")
packages << "\\usepackage{graphicx}\n";
else
@@ -321,7 +326,7 @@ string const LaTeXFeatures::getPackages(
<< "]{graphicx}\n";
}
// shadecolor for shaded
- if (isRequired("framed")) {
+ if (isNeeded("framed")) {
RGBColor c = RGBColor(lcolor.getX11Name(LColor::shadedbg));
packages << "\\definecolor{shadecolor}{rgb}{"
<< c.r/255 << ',' << c.g/255 << ',' << c.b/255 << "}\n";
@@ -332,7 +337,7 @@ string const LaTeXFeatures::getPackages(
//}
// lyxskak.sty --- newer chess support based on skak.sty
- if (isRequired("chess")) {
+ if (isNeeded("chess")) {
packages << "\\usepackage[ps,mover]{lyxskak}\n";
}
@@ -361,22 +366,22 @@ string const LaTeXFeatures::getPackages(
}
// amssymb.sty
- if (isRequired("amssymb") || params_.use_amsmath == BufferParams::package_on)
+ if (isNeeded("amssymb") || params_.use_amsmath == BufferParams::package_on)
packages << "\\usepackage{amssymb}\n";
// esint must be after amsmath and wasysym, since it will redeclare
// inconsistent integral symbols
- if (isRequired("esint") && params_.use_esint != BufferParams::package_off)
+ if (isNeeded("esint") && params_.use_esint != BufferParams::package_off)
packages << "\\usepackage{esint}\n";
// url.sty
- if (isRequired("url") && ! tclass.provides(LyXTextClass::url))
+ if (isNeeded("url"))
packages << "\\IfFileExists{url.sty}{\\usepackage{url}}\n"
" {\\newcommand{\\url}{\\texttt}}\n";
// float.sty
// natbib.sty
- if (isRequired("natbib") && ! tclass.provides(LyXTextClass::natbib)) {
+ if (isNeeded("natbib")) {
packages << "\\usepackage[";
if (params_.cite_engine == biblio::ENGINE_NATBIB_NUMERICAL) {
packages << "numbers";
@@ -387,20 +392,20 @@ string const LaTeXFeatures::getPackages(
}
// jurabib -- we need version 0.6 at least.
- if (isRequired("jurabib")) {
+ if (isNeeded("jurabib")) {
packages << "\\usepackage{jurabib}[2004/01/25]\n";
}
// bibtopic -- the dot provides the aux file naming which
// LyX can detect.
- if (isRequired("bibtopic")) {
+ if (isNeeded("bibtopic")) {
packages << "\\usepackage[dot]{bibtopic}\n";
}
- if (isRequired("xy"))
+ if (isNeeded("xy"))
packages << "\\usepackage[all]{xy}\n";
- if (isRequired("nomencl")) {
+ if (isNeeded("nomencl")) {
packages << "\\usepackage{nomencl}[2005/09/22]\n"
<< "\\makenomenclature\n";
}
@@ -421,55 +426,55 @@ string const LaTeXFeatures::getMacros()
macros << *pit << '\n';
}
- if (isRequired("LyX"))
+ if (isNeeded("LyX"))
macros << lyx_def << '\n';
- if (isRequired("lyxline"))
+ if (isNeeded("lyxline"))
macros << lyxline_def << '\n';
- if (isRequired("noun"))
+ if (isNeeded("noun"))
macros << noun_def << '\n';
- if (isRequired("lyxarrow"))
+ if (isNeeded("lyxarrow"))
macros << lyxarrow_def << '\n';
// quotes.
- if (isRequired("quotesinglbase"))
+ if (isNeeded("quotesinglbase"))
macros << quotesinglbase_def << '\n';
- if (isRequired("quotedblbase"))
+ if (isNeeded("quotedblbase"))
macros << quotedblbase_def << '\n';
- if (isRequired("guilsinglleft"))
+ if (isNeeded("guilsinglleft"))
macros << guilsinglleft_def << '\n';
- if (isRequired("guilsinglright"))
+ if (isNeeded("guilsinglright"))
macros << guilsinglright_def << '\n';
- if (isRequired("guillemotleft"))
+ if (isNeeded("guillemotleft"))
macros << guillemotleft_def << '\n';
- if (isRequired("guillemotright"))
+ if (isNeeded("guillemotright"))
macros << guillemotright_def << '\n';
// Math mode
- if (isRequired("boldsymbol") && !isRequired("amsmath"))
+ if (isNeeded("boldsymbol") && !isNeeded("amsmath"))
macros << boldsymbol_def << '\n';
- if (isRequired("binom") && !isRequired("amsmath"))
+ if (isNeeded("binom") && !isRequired("amsmath"))
macros << binom_def << '\n';
- if (isRequired("mathcircumflex"))
+ if (isNeeded("mathcircumflex"))
macros << mathcircumflex_def << '\n';
// other
- if (isRequired("ParagraphLeftIndent"))
+ if (isNeeded("ParagraphLeftIndent"))
macros << paragraphleftindent_def;
- if (isRequired("NeedLyXFootnoteCode"))
+ if (isNeeded("NeedLyXFootnoteCode"))
macros << floatingfootnote_def;
// some problems with tex->html converters
- if (isRequired("NeedTabularnewline"))
+ if (isNeeded("NeedTabularnewline"))
macros << tabularnewline_def;
// greyedout environment (note inset)
- if (isRequired("lyxgreyedout"))
+ if (isNeeded("lyxgreyedout"))
macros << lyxgreyedout_def;
- if (isRequired("lyxdot"))
+ if (isNeeded("lyxdot"))
macros << lyxdot_def << '\n';
// floats
@@ -525,7 +530,7 @@ docstring const LaTeXFeatures::getLyXSGM
// Definition of entities used in the document that are LyX related.
odocstringstream entities;
- if (isRequired("lyxarrow")) {
+ if (isNeeded("lyxarrow")) {
entities << "<!ENTITY lyxarrow \"->\">" << '\n';
}
Index: src/LaTeXFeatures.h
===================================================================
--- src/LaTeXFeatures.h (révision 17488)
+++ src/LaTeXFeatures.h (copie de travail)
@@ -73,8 +73,13 @@ public:
static void getAvailable();
/// Is the (required) package available?
static bool isAvailable(std::string const & name);
- /// Is the package required?
+ /// Has the package been required?
bool isRequired(std::string const & name) const;
+ /* Is it necessary to load the package? This is true is
+ isRequired is true and the feature is not provided by the
+ textclass.
+ */
+ bool isNeeded(std::string const & name) const;
///
void useFloat(std::string const & name);
///
Index: src/buffer.C
===================================================================
--- src/buffer.C (révision 17488)
+++ src/buffer.C (copie de travail)
@@ -1195,7 +1195,7 @@ void Buffer::validate(LaTeXFeatures & fe
// AMS Style is at document level
if (params().use_amsmath == BufferParams::package_on
- || tclass.provides(LyXTextClass::amsmath))
+ || tclass.provides("amsmath"))
features.require("amsmath");
if (params().use_esint == BufferParams::package_on)
features.require("esint");
Index: src/lyxtextclass.C
===================================================================
--- src/lyxtextclass.C (révision 17488)
+++ src/lyxtextclass.C (copie de travail)
@@ -113,7 +113,6 @@ LyXTextClass::LyXTextClass(string const
defaultfont_ = LyXFont(LyXFont::ALL_SANE);
opt_fontsize_ = "10|11|12";
opt_pagestyle_ = "empty|plain|headings|fancy";
- provides_ = nothing;
titletype_ = TITLE_COMMAND_AFTER;
titlename_ = "maketitle";
loaded_ = false;
@@ -158,10 +157,7 @@ enum TextClassTags {
TC_TOCDEPTH,
TC_CLASSOPTIONS,
TC_PREAMBLE,
- TC_PROVIDESAMSMATH,
- TC_PROVIDESNATBIB,
- TC_PROVIDESMAKEIDX,
- TC_PROVIDESURL,
+ TC_PROVIDES,
TC_LEFTMARGIN,
TC_RIGHTMARGIN,
TC_FLOAT,
@@ -199,10 +195,7 @@ bool LyXTextClass::read(FileName const &
{ "outputtype", TC_OUTPUTTYPE },
{ "pagestyle", TC_PAGESTYLE },
{ "preamble", TC_PREAMBLE },
- { "providesamsmath", TC_PROVIDESAMSMATH },
- { "providesmakeidx", TC_PROVIDESMAKEIDX },
- { "providesnatbib", TC_PROVIDESNATBIB },
- { "providesurl", TC_PROVIDESURL },
+ { "provides", TC_PROVIDES },
{ "rightmargin", TC_RIGHTMARGIN },
{ "secnumdepth", TC_SECNUMDEPTH },
{ "sides", TC_SIDES },
@@ -383,24 +376,9 @@ bool LyXTextClass::read(FileName const &
preamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
break;
- case TC_PROVIDESAMSMATH:
- if (lexrc.next() && lexrc.getInteger())
- provides_ |= amsmath;
- break;
-
- case TC_PROVIDESNATBIB:
- if (lexrc.next() && lexrc.getInteger())
- provides_ |= natbib;
- break;
-
- case TC_PROVIDESMAKEIDX:
- if (lexrc.next() && lexrc.getInteger())
- provides_ |= makeidx;
- break;
-
- case TC_PROVIDESURL:
- if (lexrc.next() && lexrc.getInteger())
- provides_ |= url;
+ case TC_PROVIDES:
+ if (lexrc.next())
+ provides_.insert(lexrc.getString());
break;
case TC_LEFTMARGIN: // left margin type
@@ -1067,9 +1045,9 @@ OutputType LyXTextClass::outputType() co
}
-bool LyXTextClass::provides(LyXTextClass::Provides p) const
+bool LyXTextClass::provides(string const & p) const
{
- return provides_ & p;
+ return provides_.find(p) != provides_.end();
}
Index: src/lyxtextclass.h
===================================================================
--- src/lyxtextclass.h (révision 17488)
+++ src/lyxtextclass.h (copie de travail)
@@ -16,7 +16,7 @@
#include <boost/shared_ptr.hpp>
#include <vector>
-
+#include <set>
namespace lyx {
@@ -126,21 +126,8 @@ public:
///
docstring const & preamble() const;
- /// Packages that are already loaded by the class
- enum Provides {
- ///
- nothing = 0,
- ///
- amsmath = 1,
- ///
- makeidx = 2,
- ///
- url = 4,
- ///
- natbib = 8
- };
- ///
- bool provides(Provides p) const;
+ /// is this feature already provided by the class?
+ bool provides(std::string const & p) const;
///
unsigned int columns() const;
@@ -209,7 +196,7 @@ private:
/// preamble text to support layout styles
docstring preamble_;
/// latex packages loaded by document class.
- Provides provides_;
+ std::set<std::string> provides_;
///
unsigned int columns_;
///
@@ -261,14 +248,6 @@ private:
};
-/// Merge two different provides flags into one bit field record
-inline
-void operator|=(LyXTextClass::Provides & p1, LyXTextClass::Provides p2)
-{
- p1 = static_cast<LyXTextClass::Provides>(p1 | p2);
-}
-
-
/// convert page sides option to text 1 or 2
std::ostream & operator<<(std::ostream & os, LyXTextClass::PageSides p);