- if (name == "array") {
- array = true;
- } else if (name == "color") {
- color = true;
- } else if (name == "graphics") {
- graphicx = true;
- graphics = true;// INSET_GRAPHICS: remove this when InsetFig is thrown.
- } else if (name == "setspace") {
- setspace = true;
- } else if (name == "makeidx") {
- makeidx = true;
- } else if (name == "verbatim") {
- verbatim = true;
- } else if (name == "longtable") {
- longtable = true;
- //} else if (name == "algorithm") {
- //algorithm = true;
- } else if (name == "rotating") {
- rotating = true;
- } else if (name == "amssymb") {
- amssymb = true;
- } else if (name == "latexsym") {
- latexsym = true;
- } else if (name == "pifont") {
- pifont = true;
- } else if (name == "subfigure") {
- subfigure = true;
- } else if (name == "floatflt") {
- floatflt = true;
- } else if (name == "url") {
- url = true;
- } else if (name == "varioref") {
- varioref = true;
- } else if (name == "prettyref") {
- prettyref = true;
- } else if (name == "chess") {
- chess = true;
- } else if (name == "amsstyle") {
- amsstyle = true;
- } else if (name == "boldsymbol") {
- boldsymbol = true;
- } else if (name == "binom") {
- binom = true;
- } else if (name == "natbib") {
- natbib = true;
- } else if (name == "float") {
- floats = true;
+ if (isRequired(name))
+ return;
+
+ features_.push_back(name);
+}
+
+
+void LaTeXFeatures::getAvailable()
+{
+ LyXLex lex(0, 0);
+ string real_file = libFileSearch("", "packages.lst");
+
+ if (real_file.empty())
+ return;
+
+ lex.setFile(real_file);
+
+ if (!lex.isOK())
+ return;
+
+ // Make sure that we are clean
+ packages_.clear();
+
+ bool finished = false;
+ // Parse config-file
+ while (lex.isOK() && !finished) {
+ switch (lex.lex()) {
+ case LyXLex::LEX_FEOF:
+ finished = true;
+ break;
+ default:
+ string const name = lex.getString();
+ PackagesList::const_iterator begin = packages_.begin();
+ PackagesList::const_iterator end = packages_.end();
+ if (find(begin, end, name) == end)
+ packages_.push_back(name);
+ }
+ }
+
+ return;
+}
+
+
+void LaTeXFeatures::useLayout(string const & layoutname)
+{
+ // Some code to avoid loops in dependency definition
+ static int level = 0;
+ const int maxlevel = 30;
+ if (level > maxlevel) {
+ lyxerr << "LaTeXFeatures::useLayout: maximum level of "
+ << "recursion attained by layout "
+ << layoutname << endl;
+ return;
+ }
+
+ LyXTextClass const & tclass = params_.getLyXTextClass();
+ if (tclass.hasLayout(layoutname)) {
+ // Is this layout already in usedLayouts?
+ list<string>::const_iterator cit = usedLayouts_.begin();
+ list<string>::const_iterator end = usedLayouts_.end();
+ for (; cit != end; ++cit) {
+ if (layoutname == *cit)
+ return;
+ }
+
+ LyXLayout_ptr const & lyt = tclass[layoutname];
+ if (!lyt->depends_on().empty()) {
+ ++level;
+ useLayout(lyt->depends_on());
+ --level;
+ }
+ usedLayouts_.push_back(layoutname);
+ } else {
+ lyxerr << "LaTeXFeatures::useLayout: layout `"
+ << layoutname << "' does not exist in this class"
+ << endl;
+ }
+
+ --level;
+}
+
+
+bool LaTeXFeatures::isRequired(string const & name) const
+{
+ return find(features_.begin(), features_.end(), name) != features_.end();
+}
+
+
+bool LaTeXFeatures::isAvailable(string const & name) const
+{
+ if (packages_.empty())
+ getAvailable();
+ return find(packages_.begin(), packages_.end(), name) != packages_.end();
+}
+
+
+void LaTeXFeatures::addExternalPreamble(string const & preamble)
+{
+ FeaturesList::const_iterator begin = preamble_snippets_.begin();
+ FeaturesList::const_iterator end = preamble_snippets_.end();
+ if (find(begin, end, preamble) == end)
+ preamble_snippets_.push_back(preamble);
+}
+
+
+void LaTeXFeatures::useFloat(string const & name)
+{
+ usedFloats_.insert(name);
+ // We only need float.sty if we use non builtin floats, or if we
+ // use the "H" modifier. This includes modified table and
+ // figure floats. (Lgb)
+ Floating const & fl = params_.getLyXTextClass().floats().getType(name);
+ if (!fl.type().empty() && !fl.builtin()) {
+ require("float");