X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=24dba48977f2784d2c01e6d314145bbb80c3df80;hb=5aece0832c5a1116b34ee003f7f51d8150f44db5;hp=80bb7cf29d90f00d735dd54a2c2268746cce6622;hpb=9275f580ef7ba37e6e797d0671f6d6735ad29ad4;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 80bb7cf29d..24dba48977 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -18,7 +18,6 @@ #include "Color.h" #include "BufferParams.h" -#include "support/debug.h" #include "Encoding.h" #include "Floating.h" #include "FloatList.h" @@ -28,13 +27,16 @@ #include "LyXRC.h" #include "TextClass.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/FileName.h" #include "support/filetools.h" +#include "support/lstrings.h" using namespace std; using namespace lyx::support; + namespace lyx { ///////////////////////////////////////////////////////////////////// @@ -135,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"; @@ -173,6 +171,16 @@ static string const changetracking_dvipost_def = "\\newcommand{\\lyxdeleted}[3]{%\n" "\\changestart\\overstrikeon#3\\overstrikeoff\\changeend}\n"; +static string const changetracking_xcolor_soul_def = + "%% Change tracking with soul\n" + "\\newcommand{\\lyxadded}[3]{{\\color{lyxadded}#3}}\n" + "\\newcommand{\\lyxdeleted}[3]{{\\color{lyxdeleted}\\st{#3}}}\n"; + +static string const changetracking_xcolor_soul_hyperref_def = + "%% Change tracking with soul\n" + "\\newcommand{\\lyxadded}[3]{{\\texorpdfstring{\\color{lyxadded}}{}#3}}\n" + "\\newcommand{\\lyxdeleted}[3]{{\\texorpdfstring{\\color{lyxdeleted}\\st{#3}}{}}}\n"; + static string const changetracking_none_def = "\\newcommand{\\lyxadded}[3]{#3}\n" "\\newcommand{\\lyxdeleted}[3]{}\n"; @@ -191,108 +199,29 @@ static string const textcyr_def = "\\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"; - +static string const lyxmathsym_def = + "\\DeclareRobustCommand{\\lyxmathsym}[1]{%\n" + " \\ifmmode\\begingroup\n" + " \\edef\\b@ld{bold}%\n" + " \\def\\rmorbf##1{\\ifx\\math@version\\b@ld\\textbf{##1}\\else\\textrm{##1}\\fi}%\n" + " \\mathchoice{\\hbox{\\rmorbf{#1}}}{\\hbox{\\rmorbf{#1}}}%\n" + " {\\hbox{\\smaller[2]\\rmorbf{#1}}}{\\hbox{\\smaller[3]\\rmorbf{#1}}}%\n" + " \\endgroup\\else#1\\fi}\n"; + +static string const papersizedvi_def = + "\\special{papersize=\\the\\paperwidth,\\the\\paperheight}\n"; + +static string const papersizepdf_def = + "\\pdfpageheight\\paperheight\n" + "\\pdfpagewidth\\paperwidth\n"; + ///////////////////////////////////////////////////////////////////// // // LaTeXFeatures // ///////////////////////////////////////////////////////////////////// -LaTeXFeatures::PackagesList LaTeXFeatures::packages_; +LaTeXFeatures::Packages LaTeXFeatures::packages_; LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, @@ -312,16 +241,19 @@ bool LaTeXFeatures::useBabel() const void LaTeXFeatures::require(string const & name) { - if (isRequired(name)) - return; + features_.insert(name); +} + - features_.push_back(name); +void LaTeXFeatures::require(set const & names) +{ + features_.insert(names.begin(), names.end()); } void LaTeXFeatures::getAvailable() { - Lexer lex(0, 0); + Lexer lex; support::FileName const real_file = libFileSearch("", "packages.lst"); if (real_file.empty()) @@ -343,11 +275,7 @@ void LaTeXFeatures::getAvailable() finished = true; break; default: - string const name = lex.getString(); - PackagesList::const_iterator begin = packages_.begin(); - PackagesList::const_iterator end = packages_.end(); - if (find(begin, end, name) == end) - packages_.push_back(name); + packages_.insert(lex.getString()); } } } @@ -365,20 +293,19 @@ 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? - list::const_iterator cit = usedLayouts_.begin(); - list::const_iterator end = usedLayouts_.end(); - for (; cit != end; ++cit) { - if (layoutname == *cit) - return; - } + if (find(usedLayouts_.begin(), usedLayouts_.end(), layoutname) + != usedLayouts_.end()) + return; + + Layout const & layout = tclass[layoutname]; + require(layout.requires()); - LayoutPtr const & lyt = tclass[layoutname]; - if (!lyt->depends_on().empty()) { + if (!layout.depends_on().empty()) { ++level; - useLayout(lyt->depends_on()); + useLayout(layout.depends_on()); --level; } usedLayouts_.push_back(layoutname); @@ -394,44 +321,46 @@ void LaTeXFeatures::useLayout(docstring const & layoutname) bool LaTeXFeatures::isRequired(string const & name) const { - return find(features_.begin(), features_.end(), name) != features_.end(); + return features_.find(name) != features_.end(); } bool LaTeXFeatures::mustProvide(string const & name) const { - return isRequired(name) && !params_.getTextClass().provides(name); + return isRequired(name) && !params_.documentClass().provides(name); } bool LaTeXFeatures::isAvailable(string const & name) { - string n = name; if (packages_.empty()) getAvailable(); - size_t loc = n.rfind(".sty"); - if (loc == n.length() - 4) - n = n.erase(name.length() - 4); - return find(packages_.begin(), packages_.end(), n) != packages_.end(); + string n = name; + if (suffixIs(n, ".sty")) + n.erase(name.length() - 4); + return packages_.find(n) != packages_.end(); } void LaTeXFeatures::addPreambleSnippet(string const & preamble) { - FeaturesList::const_iterator begin = preamble_snippets_.begin(); - FeaturesList::const_iterator end = preamble_snippets_.end(); + SnippetList::const_iterator begin = preamble_snippets_.begin(); + SnippetList::const_iterator end = preamble_snippets_.end(); if (find(begin, end, preamble) == end) preamble_snippets_.push_back(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"); } @@ -442,6 +371,10 @@ void LaTeXFeatures::useLanguage(Language const * lang) { if (!lang->babel().empty()) UsedLanguages_.insert(lang); + if (lang->lang() == "vietnamese") + require("vietnamese"); + else if (lang->lang() == "japanese") + require("japanese"); // CJK languages do not have a babel name. // They use the CJK package if (lang->encoding()->package() == Encoding::CJK) @@ -502,7 +435,7 @@ char const * simplefeatures[] = { "rotating", "latexsym", "pifont", - "subfigure", + // subfig is handled in BufferParams.cpp "varioref", "prettyref", /*For a successful cooperation of the `wrapfig' package with the @@ -518,10 +451,10 @@ char const * simplefeatures[] = { "calc", "units", "tipa", + "tipx", "framed", "soul", "textcomp", - "xcolor", "pmboxdraw", "bbding", "ifsym", @@ -535,7 +468,12 @@ char const * simplefeatures[] = { "enumitem", "endnotes", "ifthen", - "amsthm" + "amsthm", + "listings", + "bm", + "pdfpages", + "relsize", + "amscd" }; int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); @@ -546,7 +484,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. @@ -575,6 +513,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 @@ -589,20 +530,21 @@ string const LaTeXFeatures::getPackages() const (params_.use_esint != BufferParams::package_off || !isRequired("esint"))) packages << "\\usepackage{wasysym}\n"; - // color.sty - if (mustProvide("color")) { + // [x]color.sty + if (mustProvide("color") || mustProvide("xcolor")) { + string const package = + (mustProvide("xcolor") ? "xcolor" : "color"); if (params_.graphicsDriver == "default") - packages << "\\usepackage{color}\n"; + packages << "\\usepackage{" << package << "}\n"; else packages << "\\usepackage[" << params_.graphicsDriver - << "]{color}\n"; + << "]{" << package << "}\n"; } // pdfcolmk must be loaded after color - if (mustProvide("pdfcolmk")) { + if (mustProvide("pdfcolmk")) packages << "\\usepackage{pdfcolmk}\n"; - } // makeidx.sty if (isRequired("makeidx")) { @@ -636,33 +578,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 ((params_.spacing().getSpace() != Spacing::Single - && !params_.spacing().isDefault()) - || isRequired("setspace")) { - packages << "\\usepackage{setspace}\n"; - } - switch (params_.spacing().getSpace()) { - case Spacing::Default: - case Spacing::Single: - // we dont use setspace.sty so dont print anything - //packages += "\\singlespacing\n"; - break; - case Spacing::Onehalf: - packages << "\\onehalfspacing\n"; - break; - case Spacing::Double: - packages << "\\doublespacing\n"; - break; - case Spacing::Other: - packages << "\\setstretch{" - << params_.spacing().getValue() << "}\n"; - break; - } + if (mustProvide("setspace") && !tclass.provides("SetSpace")) + packages << "\\usepackage{setspace}\n"; // amssymb.sty if (mustProvide("amssymb") @@ -678,24 +599,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"; @@ -711,9 +633,6 @@ string const LaTeXFeatures::getPackages() const "\\makenomenclature\n"; } - if (mustProvide("listings")) - packages << "\\usepackage{listings}\n"; - return packages.str(); } @@ -724,11 +643,17 @@ string const LaTeXFeatures::getMacros() const if (!preamble_snippets_.empty()) macros << '\n'; - FeaturesList::const_iterator pit = preamble_snippets_.begin(); - FeaturesList::const_iterator pend = preamble_snippets_.end(); + SnippetList::const_iterator pit = preamble_snippets_.begin(); + SnippetList::const_iterator pend = preamble_snippets_.end(); for (; pit != pend; ++pit) macros << *pit << '\n'; + if (mustProvide("papersize")) + if (runparams_.flavor == OutputParams::LATEX) + macros << papersizedvi_def << '\n'; + else + macros << papersizepdf_def << '\n'; + if (mustProvide("LyX")) macros << lyx_def << '\n'; @@ -747,6 +672,9 @@ string const LaTeXFeatures::getMacros() const if (mustProvide("textcyr")) macros << textcyr_def << '\n'; + if (mustProvide("lyxmathsym")) + macros << lyxmathsym_def << '\n'; + // quotes. if (mustProvide("quotesinglbase")) macros << quotesinglbase_def << '\n'; @@ -762,14 +690,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")) @@ -807,9 +731,11 @@ string const LaTeXFeatures::getMacros() const << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n"; macros.precision(prec); - - macros << "\\newcommand{\\lyxadded}[3]{{\\color{lyxadded}#3}}\n" - << "\\newcommand{\\lyxdeleted}[3]{{\\color{lyxdeleted}\\st{#3}}}\n"; + + if (isRequired("hyperref")) + macros << changetracking_xcolor_soul_hyperref_def; + else + macros << changetracking_xcolor_soul_def; } if (mustProvide("ct-none")) @@ -838,7 +764,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(); @@ -846,7 +772,7 @@ docstring const LaTeXFeatures::getTClassPreamble() const 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(); @@ -884,7 +810,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() @@ -913,7 +840,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. @@ -924,7 +851,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; @@ -969,6 +896,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"; } }