+ LyXLex lex(0, 0);
+ support::FileName const 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);
+ }
+ }
+}
+
+
+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;