X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeXFeatures.cpp;h=24dba48977f2784d2c01e6d314145bbb80c3df80;hb=5aece0832c5a1116b34ee003f7f51d8150f44db5;hp=7df08f218730484409ce34f58171b530fe2a3fcd;hpb=2e7d1199dfa7ec7b7d963c374a014f2a2227ae7c;p=lyx.git diff --git a/src/LaTeXFeatures.cpp b/src/LaTeXFeatures.cpp index 7df08f2187..24dba48977 100644 --- a/src/LaTeXFeatures.cpp +++ b/src/LaTeXFeatures.cpp @@ -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"; @@ -202,101 +199,22 @@ 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 @@ -335,7 +253,7 @@ void LaTeXFeatures::require(set 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 +293,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 +327,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 +351,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"); } @@ -450,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) @@ -510,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 @@ -544,7 +469,11 @@ char const * simplefeatures[] = { "endnotes", "ifthen", "amsthm", - "listings" + "listings", + "bm", + "pdfpages", + "relsize", + "amscd" }; int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *); @@ -555,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. @@ -584,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 @@ -611,9 +543,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")) { @@ -647,13 +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 (mustProvide("setspace") && !tclass.provides("SetSpace")) - packages << "\\usepackage{setspace}\n"; + packages << "\\usepackage{setspace}\n"; // amssymb.sty if (mustProvide("amssymb") @@ -669,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"; @@ -717,6 +648,12 @@ string const LaTeXFeatures::getMacros() const 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'; @@ -735,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'; @@ -750,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")) @@ -828,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(); @@ -836,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(); @@ -874,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() @@ -903,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. @@ -914,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; @@ -959,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"; } }