X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=24dba48977f2784d2c01e6d314145bbb80c3df80;hb=5aece0832c5a1116b34ee003f7f51d8150f44db5;hp=e63507db45999724f340b112a4b88ad6448ec39f;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index e63507db45..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,25 +27,18 @@ #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 std::endl; -using std::find; -using std::string; -using std::list; -using std::ostream; -using std::ostringstream; -using std::set; +using namespace std; +using namespace lyx::support; namespace lyx { -using support::isSGMLFilename; -using support::libFileSearch; -using support::makeRelPath; -using support::onlyPath; - ///////////////////////////////////////////////////////////////////// // // Strings @@ -145,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"; @@ -160,7 +148,7 @@ static string const mathcircumflex_def = static string const tabularnewline_def = "%% Because html converters don't know tabularnewline\n" "\\providecommand{\\tabularnewline}{\\\\}\n"; - + static string const lyxgreyedout_def = "%% The greyedout annotation environment\n" "\\newenvironment{lyxgreyedout}{\\textcolor[gray]{0.8}\\bgroup}{\\egroup}\n"; @@ -183,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"; @@ -201,6 +199,21 @@ static string const textcyr_def = "\\DeclareRobustCommand{\\textcyr}[1]{\\leavevmode{\\cyrtext #1}}\n" "\\DeclareFontEncoding{T2A}{}{}\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"; ///////////////////////////////////////////////////////////////////// // @@ -208,7 +221,7 @@ static string const textcyr_def = // ///////////////////////////////////////////////////////////////////// -LaTeXFeatures::PackagesList LaTeXFeatures::packages_; +LaTeXFeatures::Packages LaTeXFeatures::packages_; LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, @@ -228,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()) @@ -259,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()); } } } @@ -281,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; - LayoutPtr const & lyt = tclass[layoutname]; - if (!lyt->depends_on().empty()) { + Layout const & layout = tclass[layoutname]; + require(layout.requires()); + + if (!layout.depends_on().empty()) { ++level; - useLayout(lyt->depends_on()); + useLayout(layout.depends_on()); --level; } usedLayouts_.push_back(layoutname); @@ -310,13 +321,13 @@ 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); } @@ -324,26 +335,32 @@ bool LaTeXFeatures::isAvailable(string const & name) { if (packages_.empty()) getAvailable(); - return find(packages_.begin(), packages_.end(), name) != 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"); } @@ -354,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) @@ -414,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 @@ -422,6 +443,7 @@ char const * simplefeatures[] = { the `float' package. See the caption package documentation for explanation.*/ "float", + "rotfloat", "wrapfig", "booktabs", "dvipost", @@ -429,11 +451,10 @@ char const * simplefeatures[] = { "calc", "units", "tipa", + "tipx", "framed", - "pdfcolmk", "soul", "textcomp", - "xcolor", "pmboxdraw", "bbding", "ifsym", @@ -442,6 +463,17 @@ char const * simplefeatures[] = { "mathrsfs", "ascii", "url", + "covington", + "csquotes", + "enumitem", + "endnotes", + "ifthen", + "amsthm", + "listings", + "bm", + "pdfpages", + "relsize", + "amscd" }; int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); @@ -452,7 +484,13 @@ 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. + // However, with the Require tag of layouts/custom insets, + // also inknown packages can be requested. They are silently + // swallowed now. We should change this eventually. // // These are all the 'simple' includes. i.e @@ -475,8 +513,11 @@ 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 // are used // wasysym redefines some integrals (e.g. iint) from amsmath. That @@ -489,16 +530,22 @@ 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")) + packages << "\\usepackage{pdfcolmk}\n"; + // makeidx.sty if (isRequired("makeidx")) { if (!tclass.provides("makeidx")) @@ -516,7 +563,7 @@ string const LaTeXFeatures::getPackages() const << "]{graphicx}\n"; } // shadecolor for shaded - if (mustProvide("framed") && mustProvide("color")) { + if (isRequired("framed") && mustProvide("color")) { RGBColor c = rgbFromHexName(lcolor.getX11Name(Color_shadedbg)); //255.0 to force conversion to double //NOTE As Jürgen Spitzmüller pointed out, an alternative would be @@ -531,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") @@ -573,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"; @@ -606,9 +633,6 @@ string const LaTeXFeatures::getPackages() const "\\makenomenclature\n"; } - if (mustProvide("listings")) - packages << "\\usepackage{listings}\n"; - return packages.str(); } @@ -619,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'; @@ -642,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'; @@ -657,8 +690,6 @@ 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")) @@ -700,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")) @@ -731,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(); @@ -739,16 +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(); - } - - InsetLayouts const & insetlayouts = tclass.insetlayouts(); - InsetLayouts::const_iterator cit2 = insetlayouts.begin(); - InsetLayouts::const_iterator end2 = insetlayouts.end(); - for (; cit2 != end2; ++cit2) { - if (isRequired(to_utf8(cit2->first))) { - tcpreamble << from_utf8(cit2->second.preamble); - } + tcpreamble << tclass[*cit].preamble(); } return tcpreamble.str(); @@ -786,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() @@ -815,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. @@ -826,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; @@ -871,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"; } }