X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.C;h=3fd615848002e728ae19946b1a33c2901dd1ebfb;hb=b99a5acc7f18c3f885856fa962c0f0a63a0ca5ad;hp=92462114bfa3e7d0c744cd319c1320ac054196dd;hpb=b922cdd796f9e4b9a46a79808cdee596e04903eb;p=lyx.git diff --git a/src/LaTeXFeatures.C b/src/LaTeXFeatures.C index 92462114bf..3fd6158480 100644 --- a/src/LaTeXFeatures.C +++ b/src/LaTeXFeatures.C @@ -1,8 +1,8 @@ /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 the LyX Team. * @@ -10,16 +10,11 @@ #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" @@ -28,40 +23,71 @@ #include "support/filetools.h" #include "support/lstrings.h" -using lyx::layout_type; using lyx::textclass_type; using std::endl; +using std::list; using std::set; +using std::find; +using std::ostream; + -LaTeXFeatures::LaTeXFeatures(BufferParams const & p, layout_type n) - : layout(n, false), params(p) +LaTeXFeatures::LaTeXFeatures(BufferParams const & p) + : params(p) {} void LaTeXFeatures::require(string const & name) { - // INSET_GRAPHICS: remove this when InsetFig is thrown. - if (name == "graphics") { - features.push_back("graphicx"); - features.push_back("graphics"); - } else - features.push_back(name); + if (isRequired(name)) + return; + + features.push_back(name); } -void LaTeXFeatures::useLayout(std::vector::size_type const & idx) +void LaTeXFeatures::useLayout(string const & layoutname) { - layout[idx] = true; + // 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 = std::find(features.begin(), - features.end(), - name); - return i != features.end(); + return find(features.begin(), features.end(), name) != features.end(); } @@ -74,6 +100,13 @@ void LaTeXFeatures::addExternalPreamble(string const & pream) 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"); + } } @@ -83,33 +116,33 @@ void LaTeXFeatures::useLanguage(Language const * lang) } -void LaTeXFeatures::includeFile(string const & key, string const & name) +void LaTeXFeatures::includeFile(string const & key, string const & name) { IncludedFiles[key] = name; } -bool LaTeXFeatures::hasLanguages() +bool LaTeXFeatures::hasLanguages() const { return !UsedLanguages.empty(); } -string LaTeXFeatures::getLanguages() const +string LaTeXFeatures::getLanguages() const { ostringstream languages; for (LanguageList::const_iterator cit = UsedLanguages.begin(); - cit != UsedLanguages.end(); + cit != UsedLanguages.end(); ++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 = @@ -120,76 +153,65 @@ set LaTeXFeatures::getEncodingSet(string const & doc_encoding) return encodings; } +namespace { + +char const * simplefeatures[] = { + "array", + "verbatim", + "longtable", + "rotating", + "latexsym", + "pifont", + "subfigure", + "floatflt", + "varioref", + "prettyref", + "float", + "wasy", + "dvipost" +}; + +int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); + +} string const LaTeXFeatures::getPackages() const { ostringstream packages; - LyXTextClass const & tclass = - textclasslist.TextClass(params.textclass); - - - /** - * These are all the 'simple' includes. i.e - * packages which we just \usepackage{package} - **/ - - // array-package - if (isRequired("array")) - packages << "\\usepackage{array}\n"; - - // verbatim.sty - if (isRequired("verbatim")) - packages << "\\usepackage{verbatim}\n"; - - //longtable.sty - if (isRequired("longtable")) - packages << "\\usepackage{longtable}\n"; - - //rotating.sty - if (isRequired("rotating")) - packages << "\\usepackage{rotating}\n"; + LyXTextClass const & tclass = params.getLyXTextClass(); - // latexsym.sty - if (isRequired("latexsym")) - packages << "\\usepackage{latexsym}\n"; - - // pifont.sty - if (isRequired("pifont")) - packages << "\\usepackage{pifont}\n"; - - // subfigure.sty - if (isRequired("subfigure")) - packages << "\\usepackage{subfigure}\n"; - - // floatflt.sty - if (isRequired("floatflt")) - packages << "\\usepackage{floatflt}\n"; - - - // varioref.sty - if (isRequired("varioref")) - packages << "\\usepackage{varioref}\n"; + // + // 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"; + } - // prettyref.sty - if (isRequired("prettyref")) - packages << "\\usepackage{prettyref}\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)) { + 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[" + packages << "\\usepackage[" << params.graphicsDriver + << ",usenames" << "]{color}\n"; } - + // makeidx.sty if (isRequired("makeidx")) { if (! tclass.provides(LyXTextClass::makeidx)) @@ -202,22 +224,11 @@ string const LaTeXFeatures::getPackages() const if (params.graphicsDriver == "default") packages << "\\usepackage{graphicx}\n"; else - packages << "\\usepackage[" + packages << "\\usepackage[" << params.graphicsDriver << "]{graphicx}\n"; } - // INSET_GRAPHICS: remove this when InsetFig is thrown. - // graphics.sty - if (isRequired("graphics") && params.graphicsDriver != "none") { - if (params.graphicsDriver == "default") - packages << "\\usepackage{graphics}\n"; - else - packages << "\\usepackage[" - << params.graphicsDriver - << "]{graphics}\n"; - } - //if (algorithm) { // packages << "\\usepackage{algorithm}\n"; //} @@ -260,26 +271,8 @@ string const LaTeXFeatures::getPackages() const " {\\newcommand{\\url}{\\texttt}}\n"; // float.sty - // 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) - if (!usedFloats.empty()) { - UsedFloats::const_iterator beg = usedFloats.begin(); - UsedFloats::const_iterator end = usedFloats.end(); - for (; beg != end; ++beg) { - Floating const & fl = floatList.getType((*beg)); - if (!fl.type().empty() && !fl.builtin()) { - const_cast(this)->require("floats"); - break; - } - } - } - if (isRequired("floats")) { - packages << "\\usepackage{float}\n"; - } - // natbib.sty - if (isRequired("natbib")) { + if (isRequired("natbib") && ! tclass.provides(LyXTextClass::natbib)) { packages << "\\usepackage["; if (params.use_numerical_citations) { packages << "numbers"; @@ -288,10 +281,10 @@ string const LaTeXFeatures::getPackages() const } packages << "]{natbib}\n"; } - + packages << externalPreambles; - return packages.str().c_str(); + return STRCONV(packages.str()); } @@ -299,11 +292,10 @@ string const LaTeXFeatures::getMacros() const { ostringstream macros; - // always include this - if (true || isRequired("lyx")) + if (isRequired("LyX")) macros << lyx_def << '\n'; - if (isRequired("lyxline")) + if (isRequired("lyxline")) macros << lyxline_def << '\n'; if (isRequired("noun")) @@ -312,7 +304,7 @@ string const LaTeXFeatures::getMacros() const if (isRequired("lyxarrow")) macros << lyxarrow_def << '\n'; - // quotes. + // quotes. if (isRequired("quotesinglbase")) macros << quotesinglbase_def << '\n'; if (isRequired("quotedblbase")) @@ -325,51 +317,65 @@ string const LaTeXFeatures::getMacros() const macros << guillemotleft_def << '\n'; if (isRequired("guillemotright")) macros << guillemotright_def << '\n'; - - // Math mode - if (isRequired("boldsymbol") && !isRequired("amsstyle")) + + // Math mode + if (isRequired("boldsymbol") && !isRequired("amsmath")) macros << boldsymbol_def << '\n'; - if (isRequired("binom") && !isRequired("amsstyle")) + if (isRequired("binom") && !isRequired("amsmath")) macros << binom_def << '\n'; + if (isRequired("mathcircumflex")) + macros << mathcircumflex_def << '\n'; // other if (isRequired("NeedLyXMinipageIndent")) macros << minipageindent_def; - if (isRequired("ParagraphIndent")) - macros << paragraphindent_def; - if (isRequired("NeedLyXFootnoteCode")) + if (isRequired("ParagraphLeftIndent")) + macros << paragraphleftindent_def; + 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.TextClass(params.textclass); + // the text class specific preamble + LyXTextClass const & tclass = params.getLyXTextClass(); ostringstream tcpreamble; - + tcpreamble << tclass.preamble(); - for (layout_type i = 0; i < tclass.numLayouts(); ++i) { - if (layout[i]) { - tcpreamble << tclass[i].preamble(); - } + list::const_iterator cit = usedLayouts.begin(); + list::const_iterator end = usedLayouts.end(); + for (; cit != end; ++cit) { + tcpreamble << tclass[*cit]->preamble(); } - return tcpreamble.str().c_str(); -} + return STRCONV(tcpreamble.str()); +} string const LaTeXFeatures::getLyXSGMLEntities() const @@ -381,7 +387,7 @@ string const LaTeXFeatures::getLyXSGMLEntities() const entities << "" << '\n'; } - return entities.str().c_str(); + return STRCONV(entities.str()); } @@ -394,10 +400,10 @@ string const LaTeXFeatures::getIncludedFiles(string const & fname) const for (FileMap::const_iterator fi = IncludedFiles.begin(); fi != end; ++fi) sgmlpreamble << "\nfirst - << (IsSGMLFilename(fi->second) ? " SYSTEM \"" : " \"" ) + << (IsSGMLFilename(fi->second) ? " SYSTEM \"" : " \"") << MakeRelPath(fi->second, basename) << "\">"; - return sgmlpreamble.str().c_str(); + return STRCONV(sgmlpreamble.str()); } @@ -415,8 +421,11 @@ BufferParams const & LaTeXFeatures::bufferParams() const return params; } -void LaTeXFeatures::getFloatDefinitions(std::ostream & os) 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} @@ -426,11 +435,11 @@ void LaTeXFeatures::getFloatDefinitions(std::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; - + // We have to special case "table" and "figure" if (fl.type() == "tabular" || fl.type() == "figure") { // Output code to modify "table" or "figure" @@ -450,7 +459,7 @@ void LaTeXFeatures::getFloatDefinitions(std::ostream & os) const } } else { // The other non builtin floats. - + string const type = fl.type(); string const placement = fl.placement(); string const ext = fl.ext(); @@ -459,15 +468,15 @@ void LaTeXFeatures::getFloatDefinitions(std::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"; - + // What missing here is to code to minimalize the code - // outputted so that the same floatstyle will not be + // output so that the same floatstyle will not be // used several times, when the same style is still in // effect. (Lgb) }