]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeXFeatures.cpp
endl is defined in ostream, iomanip is not enough (it matters for gcc 4.3)
[lyx.git] / src / LaTeXFeatures.cpp
index ecf02295f54f0ec5d1e3c1ee8e5e9bfc5289efd4..1e809380179ac19c81036f8074bf4a7296e62f2a 100644 (file)
@@ -36,6 +36,7 @@
 using namespace std;
 using namespace lyx::support;
 
+
 namespace lyx {
 
 /////////////////////////////////////////////////////////////////////
@@ -136,10 +137,6 @@ static string const floatingfootnote_def =
        "  \\expandafter\\noexpand\\csname SF@gobble@opt \\endcsname}\n"
        "\\def\\SF@gobble@twobracket[#1]#2{}\n";
 
-static string const boldsymbol_def =
-       "%% Bold symbol macro for standard LaTeX users\n"
-       "\\providecommand{\\boldsymbol}[1]{\\mbox{\\boldmath $#1$}}\n";
-
 static string const binom_def =
        "%% Binom macro for standard LaTeX users\n"
        "\\newcommand{\\binom}[2]{{#1 \\choose #2}}\n";
@@ -201,101 +198,6 @@ static string const textcyr_def =
        " \\def\\encodingdefault{T2A}}\n"
        "\\DeclareRobustCommand{\\textcyr}[1]{\\leavevmode{\\cyrtext #1}}\n"
        "\\DeclareFontEncoding{T2A}{}{}\n";
-
-static string const newlyxcommand_def =
-       "%% Math macros with multiple optional parameters\n"
-       "% #1<-\\foo\n"
-       "\\def\\newlyxcommand#1{\n"
-       "  \\@ifnextchar[%]\n"
-       "  {\\newlyxcommand@arity{#1}}\n"
-       "  {\\newlyxcommand@arity{#1}[0]}\n"
-       "}\n"
-       "\n"
-       "% #1<-\\foo #2<-arity\n"
-       "\\def\\newlyxcommand@arity#1[#2]{\n"
-       "  \\@ifnextchar[%]\n"
-       "  {\\newlyxcommand@firstopt{#1}{}{#2}}\n"
-       "  {\\newlyxcommand@def#1{#2}}\n"
-       "}\n"
-       "\n"
-       "% #1<-\\foo #2<-iii #3<-arity #4<-default value for (#2+1)th argument\n"
-       "\\def\\newlyxcommand@firstopt#1#2#3[#4]{\n"
-       "  % ##1<-\\foo@\n"
-       "  \\def\\@defclause##1{\n"
-       "    \\def#1{\n"
-       "      \\@ifnextchar[%]\n"
-       "      {##1{}{#4}}\n"
-       "      {##1{}{#4}[#4]}}\n"
-       "  }\n"
-       "  \\expandafter\\@defclause\\csname\\expandafter\\@gobble\\string#1@\\endcsname\n"
-       "  \\@ifnextchar[%]\n"
-       "  {\\newlyxcommand@opt{#1}{#2}{#3}}\n"
-       "  {\\newlyxcommand@last{#1}{#2}{#3}[#4]}\n"
-       "}\n"
-       "\n"
-       "\\begingroup\n"
-       "\\catcode`\\Q=3\n"
-       "\\gdef\\@myempty{Q}\n"
-       "\\endgroup\n"
-       "\n"
-       "% #1<-\\foo #2<-iii #3<-arity #4<-default value for (#2+1)th argument\n"
-       "\\def\\newlyxcommand@opt#1#2#3[#4]{\n"
-       "  % ##1<-\\foo@iii ##2<-\\foo@iiii \n"
-       "  % ####1<-{a}{b}{c} ####2<-default value ####3<- default arg\n"
-       "  \\def\\@defclause##1##2{\n"
-       "    \\def##1####1####2[####3]{\n"
-       "      \\ifx\\@myempty####3\\@myempty%\n"
-       "        \\def\\@callnext{\n"
-       "          \\@ifnextchar[%]\n"
-       "          {##2{####1{####2}}{#4}}\n"
-       "          {##2{####1{####2}}{#4}[#4]}\n"
-       "      }\n"
-       "      \\else\n"
-       "        \\def\\@callnext{\n"
-       "          \\@ifnextchar[%]\n"
-       "          {##2{####1{####3}}{#4}}\n"
-       "          {##2{####1{####3}}{#4}[#4]}\n"
-       "      }\n"
-       "      \\fi\n"
-       "      \\@callnext\n"
-       "    }\n"
-       "  }\n"
-       "  \\expandafter\\def\\expandafter\\@clausename\\expandafter{\\csname\\expandafter\\@gobble\\string#1@#2\\endcsname}\n"
-       "  \\expandafter\\def\\expandafter\\@nextclausename\\expandafter{\\csname\\expandafter\\@gobble\\string#1@#2i\\endcsname}\n"
-       "  \\expandafter\\expandafter\\expandafter  \n"
-       "  \\@defclause\\expandafter\\@clausename\\@nextclausename\n"
-       "  \\@ifnextchar[%]\n"
-       "  {\\newlyxcommand@opt{#1}{#2i}{#3}}\n"
-       "  {\\newlyxcommand@last{#1}{#2i}{#3}[#4]}\n"
-       "}\n"
-       "\n"
-       "% #1<-\\foo #2<-iii #3<-arity #4<-default value for (#2+1)th argument\n"
-       "\\def\\newlyxcommand@last#1#2#3[#4]{\n"
-       "  \\def\\@defclause##1##2{\n"
-       "    \\def##1####1####2[####3]{\n"
-       "      \\ifx\\@myempty####3\\@myempty%\n"
-       "        \\def\\@callnext{##2####1{####2}}\n"
-       "      \\else\n"
-       "        \\def\\@callnext{##2####1{####3}}\n"
-       "      \\fi\n"
-       "      \\@callnext\n"
-       "    }\n"
-       "  }\n"
-       "  \\expandafter\\def\\expandafter\\@clausename\\expandafter{\\csname\\expandafter\\@gobble\\string#1@#2\\endcsname}\n"
-       "  \\expandafter\\def\\expandafter\\@nextclausename\\expandafter{\\csname\\expandafter\\@gobble\\string#1@#2i\\endcsname}\n"
-       "  \\expandafter\\expandafter\\expandafter\n"
-       "  \\@defclause\\expandafter\\@clausename\\@nextclausename\n"
-       "  \\expandafter\\newlyxcommand@def\\csname\\expandafter\\@gobble\\string#1@#2i\\endcsname{#3}\n"
-       "}\n"
-       "\n"
-       "% #1<-\\foo #2<-arity #3<-definition\n"
-       "\\def\\newlyxcommand@def#1#2#3{\n"
-       "  \\ifx#20\n"
-       "  \\def#1{#3}\n"
-       "  \\else\n"
-       "  \\def\\@splitargs##1#2##2.{\\def#1##1#2}\\@splitargs##1##2##3##4##5##6##7##8##9.{#3}\n"
-       "  \\fi\n"
-       "}\n";
        
 /////////////////////////////////////////////////////////////////////
 //
@@ -335,7 +237,7 @@ void LaTeXFeatures::require(set<string> const & names)
 
 void LaTeXFeatures::getAvailable()
 {
-       Lexer lex(0, 0);
+       Lexer lex;
        support::FileName const real_file = libFileSearch("", "packages.lst");
 
        if (real_file.empty())
@@ -375,14 +277,14 @@ void LaTeXFeatures::useLayout(docstring const & layoutname)
                return;
        }
 
-       TextClass const & tclass = params_.getTextClass();
+       DocumentClass const & tclass = params_.documentClass();
        if (tclass.hasLayout(layoutname)) {
                // Is this layout already in usedLayouts?
                if (find(usedLayouts_.begin(), usedLayouts_.end(), layoutname) 
                    != usedLayouts_.end())
                        return;
 
-               Layout const & layout = *tclass[layoutname];
+               Layout const & layout = tclass[layoutname];
                require(layout.requires());
 
                if (!layout.depends_on().empty()) {
@@ -409,7 +311,7 @@ bool LaTeXFeatures::isRequired(string const & name) const
 
 bool LaTeXFeatures::mustProvide(string const & name) const
 {
-       return isRequired(name) && !params_.getTextClass().provides(name);
+       return isRequired(name) && !params_.documentClass().provides(name);
 }
 
 
@@ -433,13 +335,16 @@ void LaTeXFeatures::addPreambleSnippet(string const & preamble)
 }
 
 
-void LaTeXFeatures::useFloat(string const & name)
+void LaTeXFeatures::useFloat(string const & name, bool subfloat)
 {
-       usedFloats_.insert(name);
+       if (!usedFloats_[name])
+               usedFloats_[name] = subfloat;
+       if (subfloat)
+               require("subfig");
        // 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_.getTextClass().floats().getType(name);
+       Floating const & fl = params_.documentClass().floats().getType(name);
        if (!fl.type().empty() && !fl.builtin()) {
                require("float");
        }
@@ -510,7 +415,7 @@ char const * simplefeatures[] = {
        "rotating",
        "latexsym",
        "pifont",
-       "subfigure",
+       "subfig",
        "varioref",
        "prettyref",
        /*For a successful cooperation of the `wrapfig' package with the
@@ -526,6 +431,7 @@ char const * simplefeatures[] = {
        "calc",
        "units",
        "tipa",
+       "tipx",
        "framed",
        "soul",
        "textcomp",
@@ -543,7 +449,9 @@ char const * simplefeatures[] = {
        "endnotes",
        "ifthen",
        "amsthm",
-       "listings"
+       "listings",
+       "bm",
+       "pdfpages"
 };
 
 int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *);
@@ -554,7 +462,7 @@ int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *);
 string const LaTeXFeatures::getPackages() const
 {
        ostringstream packages;
-       TextClass const & tclass = params_.getTextClass();
+       DocumentClass const & tclass = params_.documentClass();
 
        // FIXME: currently, we can only load packages and macros known
        // to LyX.
@@ -583,6 +491,9 @@ string const LaTeXFeatures::getPackages() const
            (mustProvide("esintoramsmath") &&
             params_.use_esint == BufferParams::package_off)) {
                packages << "\\usepackage{amsmath}\n";
+       } else if (mustProvide("amsbsy")) {
+               // amsbsy is already provided by amsmath
+               packages << "\\usepackage{amsbsy}\n";
        }
        
        // wasysym is a simple feature, but it must be after amsmath if both
@@ -610,9 +521,8 @@ string const LaTeXFeatures::getPackages() const
        }
 
        // pdfcolmk must be loaded after color
-       if (mustProvide("pdfcolmk")) {
+       if (mustProvide("pdfcolmk"))
                packages << "\\usepackage{pdfcolmk}\n";
-       }
 
        // makeidx.sty
        if (isRequired("makeidx")) {
@@ -646,13 +556,12 @@ string const LaTeXFeatures::getPackages() const
        }
 
        // lyxskak.sty --- newer chess support based on skak.sty
-       if (mustProvide("chess")) {
+       if (mustProvide("chess"))
                packages << "\\usepackage[ps,mover]{lyxskak}\n";
-       }
 
        // setspace.sty
        if (mustProvide("setspace") && !tclass.provides("SetSpace"))
-                   packages << "\\usepackage{setspace}\n";
+    packages << "\\usepackage{setspace}\n";
 
        // amssymb.sty
        if (mustProvide("amssymb")
@@ -668,24 +577,25 @@ string const LaTeXFeatures::getPackages() const
        // natbib.sty
        if (mustProvide("natbib")) {
                packages << "\\usepackage[";
-               if (params_.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL) {
+               if (params_.citeEngine() == ENGINE_NATBIB_NUMERICAL)
                        packages << "numbers";
-               } else {
+               else
                        packages << "authoryear";
-               }
                packages << "]{natbib}\n";
        }
 
        // jurabib -- we need version 0.6 at least.
-       if (mustProvide("jurabib")) {
+       if (mustProvide("jurabib"))
                packages << "\\usepackage{jurabib}[2004/01/25]\n";
-       }
+       
+       // xargs -- we need version 1.09 at least
+       if (mustProvide("xargs"))
+               packages << "\\usepackage{xargs}[2008/03/08]\n";
 
        // bibtopic -- the dot provides the aux file naming which
        // LyX can detect.
-       if (mustProvide("bibtopic")) {
+       if (mustProvide("bibtopic"))
                packages << "\\usepackage[dot]{bibtopic}\n";
-       }
 
        if (mustProvide("xy"))
                packages << "\\usepackage[all]{xy}\n";
@@ -749,14 +659,10 @@ string const LaTeXFeatures::getMacros() const
                macros << guillemotright_def << '\n';
 
        // Math mode
-       if (mustProvide("boldsymbol") && !isRequired("amsmath"))
-               macros << boldsymbol_def << '\n';
        if (mustProvide("binom") && !isRequired("amsmath"))
                macros << binom_def << '\n';
        if (mustProvide("mathcircumflex"))
                macros << mathcircumflex_def << '\n';
-       if (mustProvide("newlyxcommand"))
-               macros << newlyxcommand_def << '\n';
 
        // other
        if (mustProvide("ParagraphLeftIndent"))
@@ -827,7 +733,7 @@ string const LaTeXFeatures::getBabelOptions() const
 docstring const LaTeXFeatures::getTClassPreamble() const
 {
        // the text class specific preamble
-       TextClass const & tclass = params_.getTextClass();
+       DocumentClass const & tclass = params_.documentClass();
        odocstringstream tcpreamble;
 
        tcpreamble << tclass.preamble();
@@ -835,7 +741,7 @@ docstring const LaTeXFeatures::getTClassPreamble() const
        list<docstring>::const_iterator cit = usedLayouts_.begin();
        list<docstring>::const_iterator end = usedLayouts_.end();
        for (; cit != end; ++cit) {
-               tcpreamble << tclass[*cit]->preamble();
+               tcpreamble << tclass[*cit].preamble();
        }
 
        return tcpreamble.str();
@@ -873,7 +779,8 @@ docstring const LaTeXFeatures::getIncludedFiles(string const & fname) const
 }
 
 
-void LaTeXFeatures::showStruct() const {
+void LaTeXFeatures::showStruct() const
+{
        lyxerr << "LyX needs the following commands when LaTeXing:"
               << "\n***** Packages:" << getPackages()
               << "\n***** Macros:" << getMacros()
@@ -902,7 +809,7 @@ BufferParams const & LaTeXFeatures::bufferParams() const
 
 void LaTeXFeatures::getFloatDefinitions(ostream & os) const
 {
-       FloatList const & floats = params_.getTextClass().floats();
+       FloatList const & floats = params_.documentClass().floats();
 
        // Here we will output the code to create the needed float styles.
        // We will try to do this as minimal as possible.
@@ -913,7 +820,7 @@ void LaTeXFeatures::getFloatDefinitions(ostream & os) const
        UsedFloats::const_iterator end = usedFloats_.end();
        // ostringstream floats;
        for (; cit != end; ++cit) {
-               Floating const & fl = floats.getType((*cit));
+               Floating const & fl = floats.getType((cit->first));
 
                // For builtin floats we do nothing.
                if (fl.builtin()) continue;
@@ -958,6 +865,8 @@ void LaTeXFeatures::getFloatDefinitions(ostream & os) const
                        // used several times, when the same style is still in
                        // effect. (Lgb)
                }
+               if (cit->second)
+                       os << "\n\\newsubfloat{" << fl.type() << "}\n";
        }
 }