X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=ecf02295f54f0ec5d1e3c1ee8e5e9bfc5289efd4;hb=6154a90fba843789b65d2a023c7f3cc7b72ef775;hp=7b46065b8bc9a330132a880f94384c596a5abe65;hpb=02703f47bfdb01dbe229d13ec02c9f567995f6ee;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 7b46065b8b..ecf02295f5 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -16,38 +16,294 @@ #include "LaTeXFeatures.h" -#include "BufferParams.h" #include "Color.h" -#include "debug.h" +#include "BufferParams.h" #include "Encoding.h" #include "Floating.h" #include "FloatList.h" #include "Language.h" +#include "Layout.h" #include "Lexer.h" -#include "lyx_sty.h" #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" -#include "frontends/controllers/frontend_helpers.h" +using namespace std; +using namespace lyx::support; namespace lyx { -using support::isSGMLFilename; -using support::libFileSearch; -using support::makeRelPath; -using support::onlyPath; - -using std::endl; -using std::find; -using std::string; -using std::list; -using std::ostream; -using std::ostringstream; -using std::set; - -LaTeXFeatures::PackagesList LaTeXFeatures::packages_; +///////////////////////////////////////////////////////////////////// +// +// Strings +// +///////////////////////////////////////////////////////////////////// + +//\NeedsTeXFormat{LaTeX2e} +//\ProvidesPackage{lyx}[1996/01/11 LLE v0.2 (LyX LaTeX Extensions)] +//\message{LyX LaTeX Extensions (LLE v0.2) of 11-Jan-1996.} + +static string const lyx_def = + "\\providecommand{\\LyX}{L\\kern-.1667em\\lower.25em\\hbox{Y}\\kern-.125emX\\@}"; + +static string const lyxline_def = + "\\newcommand{\\lyxline}[1][1pt]{%\n" + " \\par\\noindent%\n" + " \\rule[.5ex]{\\linewidth}{#1}\\par}"; + +static string const noun_def = "\\newcommand{\\noun}[1]{\\textsc{#1}}"; + +static string const lyxarrow_def = + "\\newcommand{\\lyxarrow}{\\leavevmode\\,$\\triangleright$\\,\\allowbreak}"; + +// for quotes without babel. This does not give perfect results, but +// anybody serious about non-english quotes should use babel (JMarc). + +static string const quotedblbase_def = + "\\ProvideTextCommandDefault{\\quotedblbase}{%\n" + " \\raisebox{-1.4ex}[1ex][.5ex]{\\textquotedblright}%\n" + " \\penalty10000\\hskip0em\\relax%\n" + "}"; + +static string const quotesinglbase_def = + "\\ProvideTextCommandDefault{\\quotesinglbase}{%\n" + " \\raisebox{-1.4ex}[1ex][.5ex]{\\textquoteright}%\n" + " \\penalty10000\\hskip0em\\relax%\n" + "}"; + +static string const guillemotleft_def = + "\\ProvideTextCommandDefault{\\guillemotleft}{%\n" + " {\\usefont{U}{lasy}{m}{n}\\char'50\\kern-.15em\\char'50}%\n" + "\\penalty10000\\hskip0pt\\relax%\n" + "}"; + +static string const guillemotright_def = + "\\ProvideTextCommandDefault{\\guillemotright}{%\n" + " \\penalty10000\\hskip0pt%\n" + " {\\usefont{U}{lasy}{m}{n}\\char'51\\kern-.15em\\char'51}%\n" + "}"; + +static string const guilsinglleft_def = + "\\ProvideTextCommandDefault{\\guilsinglleft}{%\n" + " {\\usefont{U}{lasy}{m}{n}\\char'50}%\n" + " \\penalty10000\\hskip0pt\\relax%\n" + "}"; + +static string const guilsinglright_def = + "\\ProvideTextCommandDefault{\\guilsinglright}{%\n" + " \\penalty10000\\hskip0pt%\n" + " {\\usefont{U}{lasy}{m}{n}\\char'51}%\n" + "}"; + +static string const paragraphleftindent_def = + "\\newenvironment{LyXParagraphLeftIndent}[1]%\n" + "{\n" + " \\begin{list}{}{%\n" + " \\setlength{\\topsep}{0pt}%\n" + " \\addtolength{\\leftmargin}{#1}\n" +// ho hum, yet more things commented out with no hint as to why they +// weren't just removed +// "%% \\addtolength{\\leftmargin}{#1\\textwidth}\n" +// "%% \\setlength{\\textwidth}{#2\\textwidth}\n" +// "%% \\setlength\\listparindent\\parindent%\n" +// "%% \\setlength\\itemindent\\parindent%\n" + " \\setlength{\\parsep}{0pt plus 1pt}%\n" + " }\n" + " \\item[]\n" + "}\n" + "{\\end{list}}\n"; + +static string const floatingfootnote_def = + "%% Special footnote code from the package 'stblftnt.sty'\n" + "%% Author: Robin Fairbairns -- Last revised Dec 13 1996\n" + "\\let\\SF@@footnote\\footnote\n" + "\\def\\footnote{\\ifx\\protect\\@typeset@protect\n" + " \\expandafter\\SF@@footnote\n" + " \\else\n" + " \\expandafter\\SF@gobble@opt\n" + " \\fi\n" + "}\n" + "\\expandafter\\def\\csname SF@gobble@opt \\endcsname{\\@ifnextchar[%]\n" + " \\SF@gobble@twobracket\n" + " \\@gobble\n" + "}\n" + "\\edef\\SF@gobble@opt{\\noexpand\\protect\n" + " \\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"; + +static string const mathcircumflex_def = + "%% For printing a cirumflex inside a formula\n" + "\\newcommand{\\mathcircumflex}[0]{\\mbox{\\^{}}}\n"; + +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"; + +// We want to omit the file extension for includegraphics, but this does not +// work when the filename contains other dots. +// Idea from http://www.tex.ac.uk/cgi-bin/texfaq2html?label=unkgrfextn +static string const lyxdot_def = + "%% A simple dot to overcome graphicx limitations\n" + "\\newcommand{\\lyxdot}{.}\n"; + +static string const changetracking_dvipost_def = + "%% Change tracking with dvipost\n" + "\\dvipostlayout\n" + "\\dvipost{osstart color push Red}\n" + "\\dvipost{osend color pop}\n" + "\\dvipost{cbstart color push Blue}\n" + "\\dvipost{cbend color pop}\n" + "\\newcommand{\\lyxadded}[3]{\\changestart#3\\changeend}\n" + "\\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"; + +static string const textgreek_def = + "\\DeclareRobustCommand{\\greektext}{%\n" + " \\fontencoding{LGR}\\selectfont\n" + " \\def\\encodingdefault{LGR}}\n" + "\\DeclareRobustCommand{\\textgreek}[1]{\\leavevmode{\\greektext #1}}\n" + "\\DeclareFontEncoding{LGR}{}{}\n"; + +static string const textcyr_def = + "\\DeclareRobustCommand{\\cyrtext}{%\n" + " \\fontencoding{T2A}\\selectfont\n" + " \\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"; + +///////////////////////////////////////////////////////////////////// +// +// LaTeXFeatures +// +///////////////////////////////////////////////////////////////////// + +LaTeXFeatures::Packages LaTeXFeatures::packages_; LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, @@ -59,17 +315,21 @@ LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p, bool LaTeXFeatures::useBabel() const { return lyxrc.language_use_babel || - bufferParams().language->lang() != lyxrc.default_language || + (bufferParams().language->lang() != lyxrc.default_language && + !bufferParams().language->babel().empty()) || this->hasLanguages(); } 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()); } @@ -97,17 +357,13 @@ 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()); } } } -void LaTeXFeatures::useLayout(string const & layoutname) +void LaTeXFeatures::useLayout(docstring const & layoutname) { // Some code to avoid loops in dependency definition static int level = 0; @@ -115,30 +371,29 @@ void LaTeXFeatures::useLayout(string const & layoutname) if (level > maxlevel) { lyxerr << "LaTeXFeatures::useLayout: maximum level of " << "recursion attained by layout " - << layoutname << endl; + << to_utf8(layoutname) << endl; return; } - LyXTextClass const & tclass = params_.getLyXTextClass(); + TextClass const & tclass = params_.getTextClass(); 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()); - LyXLayout_ptr 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); } else { lyxerr << "LaTeXFeatures::useLayout: layout `" - << layoutname << "' does not exist in this class" + << to_utf8(layoutname) << "' does not exist in this class" << endl; } @@ -148,13 +403,13 @@ void LaTeXFeatures::useLayout(string 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_.getLyXTextClass().provides(name); + return isRequired(name) && !params_.getTextClass().provides(name); } @@ -162,14 +417,17 @@ 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); } @@ -181,7 +439,7 @@ void LaTeXFeatures::useFloat(string const & 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); + Floating const & fl = params_.getTextClass().floats().getType(name); if (!fl.type().empty() && !fl.builtin()) { require("float"); } @@ -190,7 +448,12 @@ void LaTeXFeatures::useFloat(string const & name) void LaTeXFeatures::useLanguage(Language const * lang) { - UsedLanguages_.insert(lang); + if (!lang->babel().empty()) + UsedLanguages_.insert(lang); + // CJK languages do not have a babel name. + // They use the CJK package + if (lang->encoding()->package() == Encoding::CJK) + require("CJK"); } @@ -210,26 +473,29 @@ string LaTeXFeatures::getLanguages() const { ostringstream languages; - for (LanguageList::const_iterator cit = - UsedLanguages_.begin(); + LanguageList::const_iterator const begin = UsedLanguages_.begin(); + for (LanguageList::const_iterator cit = begin; cit != UsedLanguages_.end(); - ++cit) - languages << (*cit)->babel() << ','; + ++cit) { + if (cit != begin) + languages << ','; + languages << (*cit)->babel(); + } return languages.str(); } set LaTeXFeatures::getEncodingSet(string const & doc_encoding) const { + // This does only find encodings of languages supported by babel, but + // that does not matter since we don't have a language with an + // encoding supported by inputenc but without babel support. set encodings; LanguageList::const_iterator it = UsedLanguages_.begin(); LanguageList::const_iterator end = UsedLanguages_.end(); for (; it != end; ++it) - // thailatex does not use the inputenc package, but sets up - // babel directly for tis620-0 encoding, therefore we must - // not add tis620-0 to the encoding set. if ((*it)->encoding()->latexName() != doc_encoding && - (*it)->encoding()->name() != "tis620-0") + (*it)->encoding()->package() == Encoding::inputenc) encodings.insert((*it)->encoding()->latexName()); return encodings; } @@ -237,6 +503,7 @@ set LaTeXFeatures::getEncodingSet(string const & doc_encoding) const namespace { char const * simplefeatures[] = { +// note that the package order here will be the same in the LaTeX-output "array", "verbatim", "longtable", @@ -244,18 +511,39 @@ char const * simplefeatures[] = { "latexsym", "pifont", "subfigure", - "floatflt", "varioref", "prettyref", + /*For a successful cooperation of the `wrapfig' package with the + `float' package you should load the `wrapfig' package *after* + the `float' package. See the caption package documentation + for explanation.*/ "float", + "rotfloat", + "wrapfig", "booktabs", "dvipost", "fancybox", "calc", - "nicefrac", + "units", "tipa", "framed", + "soul", "textcomp", + "pmboxdraw", + "bbding", + "ifsym", + "marvosym", + "txfonts", + "mathrsfs", + "ascii", + "url", + "covington", + "csquotes", + "enumitem", + "endnotes", + "ifthen", + "amsthm", + "listings" }; int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); @@ -266,7 +554,13 @@ int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); string const LaTeXFeatures::getPackages() const { ostringstream packages; - LyXTextClass const & tclass = params_.getLyXTextClass(); + TextClass const & tclass = params_.getTextClass(); + + // 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 @@ -283,30 +577,41 @@ string const LaTeXFeatures::getPackages() const // than those above. // - if (mustProvide("amsmath") - && params_.use_amsmath != BufferParams::package_off) { + // esint is preferred for esintoramsmath + if ((mustProvide("amsmath") && + params_.use_amsmath != BufferParams::package_off) || + (mustProvide("esintoramsmath") && + params_.use_esint == BufferParams::package_off)) { packages << "\\usepackage{amsmath}\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 // leads to inconsistent integrals. We only load this package if - // esint is used, since esint redefines all relevant integral - // symbols from wasysym and amsmath. + // the document does not contain integrals (then isRequired("esint") + // is false) or if esint is used, since esint redefines all relevant + // integral symbols from wasysym and amsmath. // See http://bugzilla.lyx.org/show_bug.cgi?id=1942 - if (mustProvide("wasysym") && isRequired("esint") && - params_.use_esint != BufferParams::package_off) + if (mustProvide("wasysym") && + (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 @@ -326,10 +631,18 @@ string const LaTeXFeatures::getPackages() const << "]{graphicx}\n"; } // shadecolor for shaded - if (mustProvide("framed")) { - RGBColor c = RGBColor(lcolor.getX11Name(Color::shadedbg)); - packages << "\\definecolor{shadecolor}{rgb}{" - << c.r/255 << ',' << c.g/255 << ',' << c.b/255 << "}\n"; + 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 + //to use the xcolor package instead, and then we can do + // \define{shadcolor}{RGB}... + //and not do any conversion. We'd then need to require xcolor + //in InsetNote::validate(). + int const stmSize = packages.precision(2); + packages << "\\definecolor{shadecolor}{rgb}{" + << c.r / 255.0 << ',' << c.g / 255.0 << ',' << c.b / 255.0 << "}\n"; + packages.precision(stmSize); } // lyxskak.sty --- newer chess support based on skak.sty @@ -338,45 +651,20 @@ string const LaTeXFeatures::getPackages() const } // 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") + if (mustProvide("amssymb") || params_.use_amsmath == BufferParams::package_on) packages << "\\usepackage{amssymb}\n"; // esint must be after amsmath and wasysym, since it will redeclare // inconsistent integral symbols - if (mustProvide("esint") - && params_.use_esint != BufferParams::package_off) + if ((mustProvide("esint") || mustProvide("esintoramsmath")) && + params_.use_esint != BufferParams::package_off) packages << "\\usepackage{esint}\n"; - // url.sty - if (mustProvide("url")) - packages << "\\IfFileExists{url.sty}{\\usepackage{url}}\n" - " {\\newcommand{\\url}{\\texttt}}\n"; - // natbib.sty if (mustProvide("natbib")) { packages << "\\usepackage["; @@ -407,12 +695,12 @@ string const LaTeXFeatures::getPackages() const // but don't use the compatibility option since it is // incompatible to other packages. packages << "\\usepackage{nomencl}\n" - "% the following is useful when we have the old nomencl.sty package\n" - "\\providecommand{\\printnomenclature}{\\printglossary}\n" - "\\providecommand{\\makenomenclature}{\\makeglossary}\n" - "\\makenomenclature\n"; + "% the following is useful when we have the old nomencl.sty package\n" + "\\providecommand{\\printnomenclature}{\\printglossary}\n" + "\\providecommand{\\makenomenclature}{\\makeglossary}\n" + "\\makenomenclature\n"; } - + return packages.str(); } @@ -423,11 +711,10 @@ 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(); - for (; pit != pend; ++pit) { + SnippetList::const_iterator pit = preamble_snippets_.begin(); + SnippetList::const_iterator pend = preamble_snippets_.end(); + for (; pit != pend; ++pit) macros << *pit << '\n'; - } if (mustProvide("LyX")) macros << lyx_def << '\n'; @@ -441,6 +728,12 @@ string const LaTeXFeatures::getMacros() const if (mustProvide("lyxarrow")) macros << lyxarrow_def << '\n'; + if (mustProvide("textgreek")) + macros << textgreek_def << '\n'; + + if (mustProvide("textcyr")) + macros << textcyr_def << '\n'; + // quotes. if (mustProvide("quotesinglbase")) macros << quotesinglbase_def << '\n'; @@ -462,6 +755,8 @@ string const LaTeXFeatures::getMacros() const macros << binom_def << '\n'; if (mustProvide("mathcircumflex")) macros << mathcircumflex_def << '\n'; + if (mustProvide("newlyxcommand")) + macros << newlyxcommand_def << '\n'; // other if (mustProvide("ParagraphLeftIndent")) @@ -483,6 +778,32 @@ string const LaTeXFeatures::getMacros() const // floats getFloatDefinitions(macros); + // change tracking + if (mustProvide("ct-dvipost")) + macros << changetracking_dvipost_def; + + if (mustProvide("ct-xcolor-soul")) { + int const prec = macros.precision(2); + + RGBColor cadd = rgbFromHexName(lcolor.getX11Name(Color_addedtext)); + macros << "\\providecolor{lyxadded}{rgb}{" + << cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n"; + + RGBColor cdel = rgbFromHexName(lcolor.getX11Name(Color_deletedtext)); + macros << "\\providecolor{lyxdeleted}{rgb}{" + << cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n"; + + macros.precision(prec); + + if (isRequired("hyperref")) + macros << changetracking_xcolor_soul_hyperref_def; + else + macros << changetracking_xcolor_soul_def; + } + + if (mustProvide("ct-none")) + macros << changetracking_none_def; + return macros.str(); } @@ -506,24 +827,17 @@ string const LaTeXFeatures::getBabelOptions() const docstring const LaTeXFeatures::getTClassPreamble() const { // the text class specific preamble - LyXTextClass const & tclass = params_.getLyXTextClass(); + TextClass const & tclass = params_.getTextClass(); odocstringstream tcpreamble; tcpreamble << tclass.preamble(); - list::const_iterator cit = usedLayouts_.begin(); - list::const_iterator end = usedLayouts_.end(); + list::const_iterator cit = usedLayouts_.begin(); + list::const_iterator end = usedLayouts_.end(); for (; cit != end; ++cit) { tcpreamble << tclass[*cit]->preamble(); } - CharStyles::iterator cs = tclass.charstyles().begin(); - CharStyles::iterator csend = tclass.charstyles().end(); - for (; cs != csend; ++cs) { - if (isRequired(cs->name)) - tcpreamble << cs->preamble; - } - return tcpreamble.str(); } @@ -588,7 +902,7 @@ BufferParams const & LaTeXFeatures::bufferParams() const void LaTeXFeatures::getFloatDefinitions(ostream & os) const { - FloatList const & floats = params_.getLyXTextClass().floats(); + FloatList const & floats = params_.getTextClass().floats(); // Here we will output the code to create the needed float styles. // We will try to do this as minimal as possible.