X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.C;h=5380932443a7eb72ba229aa3c208eed49ee40e90;hb=fe390e9da1538e20eabbc98977d845295f8e563d;hp=8af355106ca04121f04098f32de5b3189c6a0087;hpb=e4fffd74bc3f4b072929a5d3729bede295829764;p=lyx.git diff --git a/src/LaTeXFeatures.C b/src/LaTeXFeatures.C index 8af355106c..5380932443 100644 --- a/src/LaTeXFeatures.C +++ b/src/LaTeXFeatures.C @@ -10,29 +10,27 @@ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "LaTeXFeatures.h" #include "debug.h" #include "lyx_sty.h" #include "lyxrc.h" #include "bufferparams.h" -#include "lyxtextclasslist.h" #include "FloatList.h" #include "language.h" #include "encoding.h" #include "LString.h" +#include "Lsstream.h" #include "support/filetools.h" #include "support/lstrings.h" +using namespace lyx::support; + using lyx::textclass_type; using std::endl; +using std::list; using std::set; -using std::vector; using std::find; using std::ostream; @@ -42,6 +40,14 @@ LaTeXFeatures::LaTeXFeatures(BufferParams const & p) {} +bool LaTeXFeatures::useBabel() const +{ + return lyxrc.language_use_babel || + bufferParams().language->lang() != lyxrc.default_language || + this->hasLanguages(); +} + + void LaTeXFeatures::require(string const & name) { if (isRequired(name)) @@ -51,18 +57,48 @@ void LaTeXFeatures::require(string const & name) } -void LaTeXFeatures::useLayout(string const & lyt) +void LaTeXFeatures::useLayout(string const & layoutname) { - layout.insert(lyt); + // 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::const_iterator cit = usedLayouts.begin(); + list::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 { - FeaturesList::const_iterator i = find(features.begin(), - features.end(), - name); - return i != features.end(); + return find(features.begin(), features.end(), name) != features.end(); } @@ -78,7 +114,7 @@ void LaTeXFeatures::useFloat(string const & 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 = floatList.getType(name); + Floating const & fl = params.getLyXTextClass().floats().getType(name); if (!fl.type().empty() && !fl.builtin()) { require("float"); } @@ -97,7 +133,7 @@ void LaTeXFeatures::includeFile(string const & key, string const & name) } -bool LaTeXFeatures::hasLanguages() +bool LaTeXFeatures::hasLanguages() const { return !UsedLanguages.empty(); } @@ -113,11 +149,11 @@ string LaTeXFeatures::getLanguages() const ++cit) languages << (*cit)->babel() << ','; - return languages.str().c_str(); + return STRCONV(languages.str()); } -set LaTeXFeatures::getEncodingSet(string const & doc_encoding) +set LaTeXFeatures::getEncodingSet(string const & doc_encoding) const { set encodings; for (LanguageList::const_iterator it = @@ -141,47 +177,50 @@ char const * simplefeatures[] = { "floatflt", "varioref", "prettyref", - "float" + "float", + "wasy", + "dvipost" }; -const int nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); +int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); } + string const LaTeXFeatures::getPackages() const { ostringstream packages; - LyXTextClass const & tclass = textclasslist[params.textclass]; + LyXTextClass const & tclass = params.getLyXTextClass(); - - /** - * These are all the 'simple' includes. i.e - * packages which we just \usepackage{package} - **/ - for (int i = 0 ; i < nb_simplefeatures ; ++i) { + // + // These are all the 'simple' includes. i.e + // packages which we just \usepackage{package} + // + for (int i = 0; i < nb_simplefeatures; ++i) { if (isRequired(simplefeatures[i])) packages << "\\usepackage{" - << simplefeatures[i] - << "}\n"; + << simplefeatures[i] << "}\n"; } - /** - * The rest of these packages are somewhat more complicated - * than those above. - **/ + // + // The rest of these packages are somewhat more complicated + // than those above. + // if (isRequired("amsmath") - && ! tclass.provides(LyXTextClass::amsmath)) { + && !tclass.provides(LyXTextClass::amsmath) + && params.use_amsmath != BufferParams::AMS_OFF) { packages << "\\usepackage{amsmath}\n"; } // color.sty if (isRequired("color")) { if (params.graphicsDriver == "default") - packages << "\\usepackage{color}\n"; + packages << "\\usepackage[usenames]{color}\n"; else packages << "\\usepackage[" << params.graphicsDriver + << ",usenames" << "]{color}\n"; } @@ -236,7 +275,7 @@ string const LaTeXFeatures::getPackages() const } // amssymb.sty - if (isRequired("amssymb") || params.use_amsmath) + if (isRequired("amssymb") || params.use_amsmath == BufferParams::AMS_ON) packages << "\\usepackage{amssymb}\n"; // url.sty if (isRequired("url") && ! tclass.provides(LyXTextClass::url)) @@ -257,7 +296,7 @@ string const LaTeXFeatures::getPackages() const packages << externalPreambles; - return packages.str().c_str(); + return STRCONV(packages.str()); } @@ -265,8 +304,7 @@ string const LaTeXFeatures::getMacros() const { ostringstream macros; - // always include this - if (true || isRequired("lyx")) + if (isRequired("LyX")) macros << lyx_def << '\n'; if (isRequired("lyxline")) @@ -308,35 +346,47 @@ string const LaTeXFeatures::getMacros() const if (isRequired("NeedLyXFootnoteCode")) macros << floatingfootnote_def; + // some problems with tex->html converters + if (isRequired("NeedTabularnewline")) + macros << tabularnewline_def; + // floats getFloatDefinitions(macros); + return STRCONV(macros.str()); +} + + +string const LaTeXFeatures::getBabelOptions() const +{ + ostringstream tmp; + for (LanguageList::const_iterator cit = UsedLanguages.begin(); cit != UsedLanguages.end(); ++cit) if (!(*cit)->latex_options().empty()) - macros << (*cit)->latex_options() << '\n'; + tmp << (*cit)->latex_options() << '\n'; if (!params.language->latex_options().empty()) - macros << params.language->latex_options() << '\n'; + tmp << params.language->latex_options() << '\n'; - return macros.str().c_str(); + return STRCONV(tmp.str()); } string const LaTeXFeatures::getTClassPreamble() const { // the text class specific preamble - LyXTextClass const & tclass = textclasslist[params.textclass]; + LyXTextClass const & tclass = params.getLyXTextClass(); ostringstream tcpreamble; tcpreamble << tclass.preamble(); - set::const_iterator cit = layout.begin(); - set::const_iterator end = layout.end(); + list::const_iterator cit = usedLayouts.begin(); + list::const_iterator end = usedLayouts.end(); for (; cit != end; ++cit) { - tcpreamble << tclass[*cit].preamble(); + tcpreamble << tclass[*cit]->preamble(); } - return tcpreamble.str().c_str(); + return STRCONV(tcpreamble.str()); } @@ -349,7 +399,7 @@ string const LaTeXFeatures::getLyXSGMLEntities() const entities << "" << '\n'; } - return entities.str().c_str(); + return STRCONV(entities.str()); } @@ -365,7 +415,7 @@ string const LaTeXFeatures::getIncludedFiles(string const & fname) const << (IsSGMLFilename(fi->second) ? " SYSTEM \"" : " \"") << MakeRelPath(fi->second, basename) << "\">"; - return sgmlpreamble.str().c_str(); + return STRCONV(sgmlpreamble.str()); } @@ -386,6 +436,8 @@ BufferParams const & LaTeXFeatures::bufferParams() const void LaTeXFeatures::getFloatDefinitions(ostream & os) const { + FloatList const & floats = params.getLyXTextClass().floats(); + // Here we will output the code to create the needed float styles. // We will try to do this as minimal as possible. // \floatstyle{ruled} @@ -395,7 +447,7 @@ void LaTeXFeatures::getFloatDefinitions(ostream & os) const UsedFloats::const_iterator end = usedFloats.end(); // ostringstream floats; for (; cit != end; ++cit) { - Floating const & fl = floatList.getType((*cit)); + Floating const & fl = floats.getType((*cit)); // For builtin floats we do nothing. if (fl.builtin()) continue; @@ -428,10 +480,10 @@ void LaTeXFeatures::getFloatDefinitions(ostream & os) const string const name = fl.name(); os << "\\floatstyle{" << style << "}\n" << "\\newfloat{" << type << "}{" << placement - << "}{" << ext << "}"; + << "}{" << ext << '}'; if (!within.empty()) - os << "[" << within << "]"; - os << "\n" + os << '[' << within << ']'; + os << '\n' << "\\floatname{" << type << "}{" << name << "}\n";