X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.C;h=418f0b00ee93a359ede077a80459333ad325c2a9;hb=98c966c64594611e469313314abd1e59524adb4a;hp=6c9de09ef720c4433dc57ac4e9893b188135945e;hpb=8e0e11f8ae446682ac1590e586ae6726bafca992;p=lyx.git diff --git a/src/LaTeXFeatures.C b/src/LaTeXFeatures.C index 6c9de09ef7..418f0b00ee 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. * @@ -11,192 +11,210 @@ #include #ifdef __GNUG__ -#pragma implementation "LaTeXFeatures.h" +#pragma implementation #endif -#include "LString.h" +#include "LaTeXFeatures.h" #include "debug.h" #include "lyx_sty.h" #include "lyxrc.h" -#include "LaTeXFeatures.h" #include "bufferparams.h" -#include "layout.h" -#include "support/filetools.h" +#include "lyxtextclasslist.h" #include "FloatList.h" #include "language.h" +#include "encoding.h" +#include "LString.h" + +#include "support/filetools.h" +#include "support/lstrings.h" + +using lyx::textclass_type; using std::endl; +using std::set; +using std::vector; +using std::find; +using std::ostream; + + +LaTeXFeatures::LaTeXFeatures(BufferParams const & p) + : params(p) +{} + -LaTeXFeatures::LaTeXFeatures(BufferParams const & p, LyXTextClass::size_type n) - : layout(n, false), params(p) +void LaTeXFeatures::require(string const & name) { - // packages - array = false; - color = false; - graphics = false; // INSET_GRAPHICS: remove this when InsetFig is thrown. - graphicx = false; - setspace = false; - makeidx = false; - verbatim = false; - longtable = false; - //algorithm = false; - rotating = false; - amssymb = false; - latexsym = false; - pifont = false; - subfigure = false; - floatflt = false; - url = false; - varioref = false; - prettyref = false; - chess = false; - natbib = false; - - // commands - lyx = false; - lyxline = false; - noun = false; - lyxarrow = false; - - // quotes - quotesinglbase = false; - quotedblbase = false; - guilsinglleft = false; - guilsinglright = false; - guillemotleft = false; - guillemotright = false; + if (isRequired(name)) + return; - // Math mode - amsstyle = false; - binom = false; - boldsymbol = false; - - // special features - ParagraphIndent = false; - NeedLyXFootnoteCode = false; - NeedLyXMinipageIndent = false; + features.push_back(name); } -void LaTeXFeatures::require(string const & name) +void LaTeXFeatures::useLayout(string const & lyt) +{ + layout.insert(lyt); +} + + +bool LaTeXFeatures::isRequired(string const & name) const +{ + FeaturesList::const_iterator i = find(features.begin(), + features.end(), + name); + return i != features.end(); +} + + +void LaTeXFeatures::addExternalPreamble(string const & pream) { - 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; + externalPreambles += 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 = floatList.getType(name); + if (!fl.type().empty() && !fl.builtin()) { + require("float"); } } +void LaTeXFeatures::useLanguage(Language const * lang) +{ + UsedLanguages.insert(lang); +} + + +void LaTeXFeatures::includeFile(string const & key, string const & name) +{ + IncludedFiles[key] = name; +} + + +bool LaTeXFeatures::hasLanguages() +{ + return !UsedLanguages.empty(); +} + + +string LaTeXFeatures::getLanguages() const +{ + ostringstream languages; + + for (LanguageList::const_iterator cit = + UsedLanguages.begin(); + cit != UsedLanguages.end(); + ++cit) + languages << (*cit)->babel() << ','; + + return languages.str().c_str(); +} + + +set LaTeXFeatures::getEncodingSet(string const & doc_encoding) +{ + set encodings; + for (LanguageList::const_iterator it = + UsedLanguages.begin(); + it != UsedLanguages.end(); ++it) + if ((*it)->encoding()->LatexName() != doc_encoding) + encodings.insert((*it)->encoding()->LatexName()); + return encodings; +} + +namespace { + +char const * simplefeatures[] = { + "array", + "verbatim", + "longtable", + "rotating", + "latexsym", + "pifont", + "subfigure", + "floatflt", + "varioref", + "prettyref", + "float" +}; + +const int nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); + +} + string const LaTeXFeatures::getPackages() const { ostringstream packages; - LyXTextClass const & tclass = - textclasslist.TextClass(params.textclass); + LyXTextClass const & tclass = textclasslist[params.textclass]; + + + /** + * 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"; + } - // array-package - if (array) - packages << "\\usepackage{array}\n"; + /** + * 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 (color) { + if (isRequired("color")) { if (params.graphicsDriver == "default") packages << "\\usepackage{color}\n"; else - packages << "\\usepackage[" + packages << "\\usepackage[" << params.graphicsDriver << "]{color}\n"; } - + // makeidx.sty - if (makeidx) { - if (! tclass.provides(LyXTextClass::makeidx) - && params.language->babel() != "french") // french provides - // \index ! - // French should not be hardcoded. (Lgb) + if (isRequired("makeidx")) { + if (! tclass.provides(LyXTextClass::makeidx)) packages << "\\usepackage{makeidx}\n"; packages << "\\makeindex\n"; } // graphicx.sty - if (graphicx && params.graphicsDriver != "none") { + if (isRequired("graphicx") && params.graphicsDriver != "none") { 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 (graphics && params.graphicsDriver != "none") { - if (params.graphicsDriver == "default") - packages << "\\usepackage{graphics}\n"; - else - packages << "\\usepackage[" - << params.graphicsDriver - << "]{graphics}\n"; - } - - // verbatim.sty - if (verbatim) - packages << "\\usepackage{verbatim}\n"; - //if (algorithm) { // packages << "\\usepackage{algorithm}\n"; //} - // lyxchess.sty - if (chess) { - packages << "\\usepackage{lyxchess}\n"; + // lyxskak.sty --- newer chess support based on skak.sty + if (isRequired("chess")) { + packages << "\\usepackage[ps,mover]{lyxskak}\n"; } // setspace.sty if ((params.spacing.getSpace() != Spacing::Single && !params.spacing.isDefault()) - || setspace) { + || isRequired("setspace")) { packages << "\\usepackage{setspace}\n"; } switch (params.spacing.getSpace()) { @@ -217,67 +235,17 @@ string const LaTeXFeatures::getPackages() const break; } - //longtable.sty - if (longtable) - packages << "\\usepackage{longtable}\n"; - - //rotating.sty - if (rotating) - packages << "\\usepackage{rotating}\n"; - // amssymb.sty - if (amssymb || params.use_amsmath) + if (isRequired("amssymb") || params.use_amsmath) packages << "\\usepackage{amssymb}\n"; - - // latexsym.sty - if (latexsym) - packages << "\\usepackage{latexsym}\n"; - - // pifont.sty - if (pifont) - packages << "\\usepackage{pifont}\n"; - - // subfigure.sty - if (subfigure) - packages << "\\usepackage{subfigure}\n"; - - // floatflt.sty - if (floatflt) - packages << "\\usepackage{floatflt}\n"; - // url.sty - if (url && ! tclass.provides(LyXTextClass::url)) + if (isRequired("url") && ! tclass.provides(LyXTextClass::url)) packages << "\\IfFileExists{url.sty}{\\usepackage{url}}\n" " {\\newcommand{\\url}{\\texttt}}\n"; - // varioref.sty - if (varioref) - packages << "\\usepackage{varioref}\n"; - - // prettyref.sty - if (prettyref) - packages << "\\usepackage{prettyref}\n"; - // float.sty - // We only need float.sty if we use non builtin floats. This includes - // modified table and figure floats. (Lgb) - if (!usedFloats.empty()) { - bool use_float = false; - 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()) { - use_float = true; - break; - } - } - if (use_float) - packages << "\\usepackage{float}\n"; - } - // natbib.sty - if (natbib) { + if (isRequired("natbib")) { packages << "\\usepackage["; if (params.use_numerical_citations) { packages << "numbers"; @@ -286,7 +254,7 @@ string const LaTeXFeatures::getPackages() const } packages << "]{natbib}\n"; } - + packages << externalPreambles; return packages.str().c_str(); @@ -298,46 +266,46 @@ string const LaTeXFeatures::getMacros() const ostringstream macros; // always include this - if (true || lyx) + if (true || isRequired("lyx")) macros << lyx_def << '\n'; - if (lyxline) + if (isRequired("lyxline")) macros << lyxline_def << '\n'; - if (noun) { + if (isRequired("noun")) macros << noun_def << '\n'; - } - if (lyxarrow) { + if (isRequired("lyxarrow")) macros << lyxarrow_def << '\n'; - } - // quotes. - if (quotesinglbase) + // quotes. + if (isRequired("quotesinglbase")) macros << quotesinglbase_def << '\n'; - if (quotedblbase) + if (isRequired("quotedblbase")) macros << quotedblbase_def << '\n'; - if (guilsinglleft) + if (isRequired("guilsinglleft")) macros << guilsinglleft_def << '\n'; - if (guilsinglright) + if (isRequired("guilsinglright")) macros << guilsinglright_def << '\n'; - if (guillemotleft) + if (isRequired("guillemotleft")) macros << guillemotleft_def << '\n'; - if (guillemotright) + if (isRequired("guillemotright")) macros << guillemotright_def << '\n'; - - // Math mode - if (boldsymbol && !amsstyle) + + // Math mode + if (isRequired("boldsymbol") && !isRequired("amsmath")) macros << boldsymbol_def << '\n'; - if (binom && !amsstyle) + if (isRequired("binom") && !isRequired("amsmath")) macros << binom_def << '\n'; + if (isRequired("mathcircumflex")) + macros << mathcircumflex_def << '\n'; // other - if (NeedLyXMinipageIndent) + if (isRequired("NeedLyXMinipageIndent")) macros << minipageindent_def; - if (ParagraphIndent) + if (isRequired("ParagraphIndent")) macros << paragraphindent_def; - if (NeedLyXFootnoteCode) + if (isRequired("NeedLyXFootnoteCode")) macros << floatingfootnote_def; // floats @@ -356,21 +324,33 @@ string const LaTeXFeatures::getMacros() const 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 = textclasslist[params.textclass]; ostringstream tcpreamble; - + tcpreamble << tclass.preamble(); - for (unsigned int i = 0; i < tclass.numLayouts(); ++i) { - if (layout[i]) { - tcpreamble << tclass[i].preamble(); - } + set::const_iterator cit = layout.begin(); + set::const_iterator end = layout.end(); + for (; cit != end; ++cit) { + tcpreamble << tclass[*cit].preamble(); } return tcpreamble.str().c_str(); -} +} + + +string const LaTeXFeatures::getLyXSGMLEntities() const +{ + // Definition of entities used in the document that are LyX related. + ostringstream entities; + + if (isRequired("lyxarrow")) { + entities << "" << '\n'; + } + + return entities.str().c_str(); +} string const LaTeXFeatures::getIncludedFiles(string const & fname) const @@ -382,7 +362,7 @@ 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(); @@ -404,7 +384,7 @@ BufferParams const & LaTeXFeatures::bufferParams() const } -void LaTeXFeatures::getFloatDefinitions(std::ostream & os) const +void LaTeXFeatures::getFloatDefinitions(ostream & os) const { // Here we will output the code to create the needed float styles. // We will try to do this as minimal as possible. @@ -416,10 +396,10 @@ void LaTeXFeatures::getFloatDefinitions(std::ostream & os) const // ostringstream floats; for (; cit != end; ++cit) { Floating const & fl = floatList.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" @@ -439,7 +419,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(); @@ -454,10 +434,10 @@ void LaTeXFeatures::getFloatDefinitions(std::ostream & os) const os << "\n" << "\\floatname{" << type << "}{" << name << "}\n"; - + // What missing here is to code to minimalize the code - // outputted so that the same flotastyle will not be - // used several times. when the same style is still in + // output so that the same floatstyle will not be + // used several times, when the same style is still in // effect. (Lgb) } }