X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxtextclass.C;h=e2a2d4362ccda5047fbebc7adf935ada8695818b;hb=4c6e0fe4226ce3b55d13726977f1e579f17c2ad1;hp=c3cbdc05a78461e31b6b3dfa26642ec66978140b;hpb=53274e31ec1cc715c0b48921ee67818790c2e99a;p=lyx.git diff --git a/src/lyxtextclass.C b/src/lyxtextclass.C index c3cbdc05a7..e2a2d4362c 100644 --- a/src/lyxtextclass.C +++ b/src/lyxtextclass.C @@ -1,57 +1,63 @@ -/* This file is part of - * ====================================================== +/** + * \file lyxtextclass.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * LyX, The Document Processor + * \author Lars Gullik Bjønnes + * \author Jean-Marc Lasgouttes + * \author Angus Leeming + * \author John Levon + * \author André Pönitz * - * Copyright 1995 Matthias Ettrich - * Copyright 1995-2001 The LyX Team. - * - * ====================================================== + * Full author contact details are available in file CREDITS. */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "lyxtextclass.h" #include "debug.h" #include "lyxlex.h" #include "counters.h" +#include "Floating.h" #include "FloatList.h" #include "support/lstrings.h" #include "support/LAssert.h" -#include "support/lyxfunctional.h" #include "support/filetools.h" -#include + +using namespace lyx::support; using std::endl; using std::find_if; using std::remove_if; + using std::ostream; namespace { // anon struct compare_name { + compare_name(string const & name) - : name_(name) {} - template - bool operator()(C & c) { + : name_(name) + {} + + bool operator()(boost::shared_ptr const & c) + { return c->name() == name_; } + string name_; + }; } // anon LyXTextClass::LyXTextClass(string const & fn, string const & cln, - string const & desc) + string const & desc, bool texClassAvail ) : name_(fn), latexname_(cln), description_(desc), - floatlist_(new FloatList), ctrs_(new Counters) + floatlist_(new FloatList), ctrs_(new Counters), texClassAvail_(texClassAvail) { outputType_ = LATEX; columns_ = 1; @@ -64,10 +70,18 @@ LyXTextClass::LyXTextClass(string const & fn, string const & cln, opt_fontsize_ = "10|11|12"; opt_pagestyle_ = "empty|plain|headings|fancy"; provides_ = nothing; + titletype_ = TITLE_COMMAND_AFTER; + titlename_ = "maketitle"; loaded = false; } +bool LyXTextClass::isTeXClassAvailable() const +{ + return texClassAvail_; +} + + bool LyXTextClass::do_readStyle(LyXLex & lexrc, LyXLayout & lay) { lyxerr[Debug::TCLASS] << "Reading style " << lay.name() << endl; @@ -89,6 +103,7 @@ enum TextClassTags { TC_INPUT, TC_STYLE, TC_DEFAULTSTYLE, + TC_ENVIRONMENT, TC_NOSTYLE, TC_COLUMNS, TC_SIDES, @@ -107,10 +122,11 @@ enum TextClassTags { TC_RIGHTMARGIN, TC_FLOAT, TC_COUNTER, - TC_NOFLOAT + TC_NOFLOAT, + TC_TITLELATEXNAME, + TC_TITLELATEXTYPE }; - // Reads a textclass structure from file. bool LyXTextClass::Read(string const & filename, bool merge) { @@ -120,6 +136,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) { "counter", TC_COUNTER }, { "defaultfont", TC_DEFAULTFONT }, { "defaultstyle", TC_DEFAULTSTYLE }, + { "environment", TC_ENVIRONMENT }, { "float", TC_FLOAT }, { "input", TC_INPUT }, { "leftmargin", TC_LEFTMARGIN }, @@ -137,6 +154,8 @@ bool LyXTextClass::Read(string const & filename, bool merge) { "secnumdepth", TC_SECNUMDEPTH }, { "sides", TC_SIDES }, { "style", TC_STYLE }, + { "titlelatexname", TC_TITLELATEXNAME }, + { "titlelatextype", TC_TITLELATEXTYPE }, { "tocdepth", TC_TOCDEPTH } }; @@ -149,7 +168,8 @@ bool LyXTextClass::Read(string const & filename, bool merge) << MakeDisplayPath(filename) << endl; - LyXLex lexrc(textClassTags, TC_NOFLOAT); + LyXLex lexrc(textClassTags, + sizeof(textClassTags) / sizeof(textClassTags[0])); bool error = false; lexrc.setFile(filename); @@ -158,6 +178,7 @@ bool LyXTextClass::Read(string const & filename, bool merge) // parsing while (lexrc.isOK() && !error) { int le = lexrc.lex(); + switch (le) { case LyXLex::LEX_FEOF: continue; @@ -166,9 +187,13 @@ bool LyXTextClass::Read(string const & filename, bool merge) lexrc.printError("Unknown TextClass tag `$$Token'"); error = true; continue; - default: break; + + default: + break; } + switch (static_cast(le)) { + case TC_OUTPUTTYPE: // output type definition readOutputType(lexrc); break; @@ -195,19 +220,22 @@ bool LyXTextClass::Read(string const & filename, bool merge) } break; + case TC_ENVIRONMENT: case TC_STYLE: if (lexrc.next()) { string const name = subst(lexrc.getString(), '_', ' '); if (hasLayout(name)) { - LyXLayout * lay = - operator[](name).get(); + LyXLayout * lay = operator[](name).get(); error = do_readStyle(lexrc, *lay); } else { LyXLayout lay; lay.setName(name); + if (le == TC_ENVIRONMENT) + lay.is_environment = true; if (!(error = do_readStyle(lexrc, lay))) - layoutlist_.push_back(boost::shared_ptr(new LyXLayout(lay))); + layoutlist_.push_back + (boost::shared_ptr(new LyXLayout(lay))); if (defaultlayout_.empty()) { // We do not have a default // layout yet, so we choose @@ -327,13 +355,19 @@ bool LyXTextClass::Read(string const & filename, bool merge) case TC_COUNTER: readCounter(lexrc); break; + case TC_TITLELATEXTYPE: + readTitleType(lexrc); + break; + case TC_TITLELATEXNAME: + if (lexrc.next()) + titlename_ = lexrc.getString(); + break; case TC_NOFLOAT: if (lexrc.next()) { string const nofloat = lexrc.getString(); floatlist_->erase(nofloat); } break; - } } @@ -355,6 +389,33 @@ bool LyXTextClass::Read(string const & filename, bool merge) } +void LyXTextClass::readTitleType(LyXLex & lexrc) +{ + keyword_item titleTypeTags[] = { + { "commandafter", TITLE_COMMAND_AFTER }, + { "environment", TITLE_ENVIRONMENT } + }; + + pushpophelper pph(lexrc, titleTypeTags, TITLE_ENVIRONMENT); + + int le = lexrc.lex(); + switch (le) { + case LyXLex::LEX_UNDEF: + lexrc.printError("Unknown output type `$$Token'"); + return; + case TITLE_COMMAND_AFTER: + case TITLE_ENVIRONMENT: + titletype_ = static_cast(le); + break; + default: + lyxerr << "Unhandled value " << le + << " in LyXTextClass::readTitleType." << endl; + + break; + } +} + + void LyXTextClass::readOutputType(LyXLex & lexrc) { keyword_item outputTypeTags[] = { @@ -416,13 +477,16 @@ void LyXTextClass::readMaxCounter(LyXLex & lexrc) }; pushpophelper pph(lexrc, maxCounterTags, MC_COUNTER_ENUMIV); + int le = lexrc.lex(); switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown MaxCounter tag `$$Token'"); return; - default: break; + default: + break; } + switch (static_cast(le)) { case MC_COUNTER_CHAPTER: maxcounter_ = LABEL_COUNTER_CHAPTER; @@ -693,20 +757,10 @@ bool LyXTextClass::hasLayout(string const & n) const } -LyXLayout_ptr const & LyXTextClass::operator[](string const & n) const -{ - lyx::Assert(!n.empty()); - - if (n.empty()) - lyxerr << "Operator[] called with empty n" << endl; - - string const name = (n.empty() ? defaultLayoutName() : n); - - static string lastLayoutName; - static LayoutList::difference_type lastLayoutIndex; - if (name == lastLayoutName) - return layoutlist_[lastLayoutIndex]; +LyXLayout_ptr const & LyXTextClass::operator[](string const & name) const +{ + Assert(!name.empty()); LayoutList::const_iterator cit = find_if(layoutlist_.begin(), @@ -717,18 +771,19 @@ LyXLayout_ptr const & LyXTextClass::operator[](string const & n) const lyxerr << "We failed to find the layout '" << name << "' in the layout list. You MUST investigate!" << endl; + for (LayoutList::const_iterator it = layoutlist_.begin(); + it != layoutlist_.end(); ++it) + lyxerr << " " << it->get()->name() << endl; // we require the name to exist - lyx::Assert(false); + Assert(false); } - lastLayoutName = name; - lastLayoutIndex = std::distance(layoutlist_.begin(), cit); - return (*cit); } + bool LyXTextClass::delete_layout(string const & name) { if (name == defaultLayoutName()) @@ -889,6 +944,21 @@ int LyXTextClass::maxcounter() const } +LYX_TITLE_LATEX_TYPES LyXTextClass::titletype() const +{ + return titletype_; +} + + +string const & LyXTextClass::titlename() const +{ + return titlename_; +} + + + + + int LyXTextClass::size() const { return layoutlist_.size();