X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=6355dbcc6729d3f5a439c50f33936d5c6a260963;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=78c4f854942b0f3a2e399abc7b868b7a775bc1ff;hpb=0fce3ff6bd61a9d5b8d928b624741f31bc176795;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 78c4f85494..6355dbcc67 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -482,7 +482,7 @@ string const BufferParams::readToken(Lexer & lex, string const & token, // FIXME: this warning will be given even if there exists a local .cls // file. Even worse, the .lyx file can not be compiled or exported // because the textclass is marked as unavilable. - if (!getTextClass().isTeXClassAvailable()) { + if (!textClass().isTeXClassAvailable()) { docstring const msg = bformat(_("The layout file requested by this document,\n" "%1$s.layout,\n" @@ -529,7 +529,11 @@ string const BufferParams::readToken(Lexer & lex, string const & token, paragraph_separation = parseptranslator().find(parsep); } else if (token == "\\defskip") { lex.next(); - pimpl_->defskip = VSpace(lex.getString()); + string defskip = lex.getString(); + if (defskip == "defskip") + // this is invalid + defskip = "medskip"; + pimpl_->defskip = VSpace(defskip); } else if (token == "\\quotes_language") { string quotes_lang; lex >> quotes_lang; @@ -615,6 +619,8 @@ string const BufferParams::readToken(Lexer & lex, string const & token, lex >> headsep; } else if (token == "\\footskip") { lex >> footskip; + } else if (token == "\\columnsep") { + lex >> columnsep; } else if (token == "\\paperfontsize") { lex >> fontsize; } else if (token == "\\papercolumns") { @@ -764,6 +770,9 @@ void BufferParams::writeFile(ostream & os) const if (!footskip.empty()) os << "\\footskip " << VSpace(footskip).asLyXCommand() << '\n'; + if (!columnsep.empty()) + os << "\\columnsep " + << VSpace(columnsep).asLyXCommand() << '\n'; os << "\\secnumdepth " << secnumdepth << "\n\\tocdepth " << tocdepth << "\n\\paragraph_separation " @@ -810,6 +819,8 @@ void BufferParams::writeFile(ostream & os) const void BufferParams::validate(LaTeXFeatures & features) const { + features.require(textClass().requires()); + if (outputChanges) { bool dvipost = LaTeXFeatures::isAvailable("dvipost"); bool xcolorsoul = LaTeXFeatures::isAvailable("soul") && @@ -850,11 +861,15 @@ void BufferParams::validate(LaTeXFeatures & features) const // AMS Style is at document level if (use_amsmath == package_on - || getTextClass().provides("amsmath")) + || textClass().provides("amsmath")) features.require("amsmath"); if (use_esint == package_on) features.require("esint"); + // Document-level line spacing + if (spacing().getSpace() != Spacing::Single && !spacing().isDefault()) + features.require("setspace"); + // the bullet shapes are buffer level not paragraph level // so they are tested here for (int i = 0; i < 4; ++i) { @@ -876,6 +891,9 @@ void BufferParams::validate(LaTeXFeatures & features) const features.require("pifont"); } } + + if (pdfoptions().use_hyperref) + features.require("hyperref"); } @@ -884,7 +902,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, { os << "\\documentclass"; - TextClass const & tclass = getTextClass(); + TextClass const & tclass = textClass(); ostringstream clsoptions; // the document class options. @@ -1126,6 +1144,8 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, os << ",headsep=" << from_ascii(Length(headsep).asLatexString()); if (!footskip.empty()) os << ",footskip=" << from_ascii(Length(footskip).asLatexString()); + if (!columnsep.empty()) + os << ",columnsep=" << from_ascii(Length(columnsep).asLatexString()); os << "}\n"; texrow.newline(); } @@ -1195,6 +1215,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // The optional packages; docstring lyxpreamble(from_ascii(features.getPackages())); + // Line spacing + lyxpreamble += from_utf8(spacing().writePreamble(tclass.provides("SetSpace"))); + // We try to load babel late, in case it interferes // with other packages. But some packages also need babel to be loaded // before, e.g. jurabib has to be called after babel. @@ -1220,7 +1243,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // hyperref, see // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html if (language->lang() == "japanese-plain" && - !getTextClass().provides("japanese")) { + !textClass().provides("japanese")) { //load babel in case it was not loaded due to an empty language list if (language_options.str().empty()) lyxpreamble += "\\usepackage{babel}\n"; @@ -1235,10 +1258,12 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // before hyperref. Then hyperref has a chance to detect babel. // * Has to be loaded before the "LyX specific LaTeX commands" to // avoid errors with algorithm floats. - odocstringstream oss; // use hyperref explicitely when it is required - pdfoptions().writeLaTeX(oss, features.isRequired("hyperref")); - lyxpreamble += oss.str(); + if (features.isRequired("hyperref")) { + odocstringstream oss; + pdfoptions().writeLaTeX(oss, textClass().provides("hyperref")); + lyxpreamble += oss.str(); + } // this might be useful... lyxpreamble += "\n\\makeatletter\n"; @@ -1345,13 +1370,13 @@ bool BufferParams::hasClassDefaults() const } -TextClass const & BufferParams::getTextClass() const +TextClass const & BufferParams::textClass() const { return *textClass_; } -TextClassPtr BufferParams::getTextClassPtr() const { +TextClassPtr BufferParams::textClassPtr() const { return textClass_; } @@ -1413,8 +1438,12 @@ void BufferParams::makeTextClass() "may not be possible.\n"), from_utf8(modName)); frontend::Alert::warning(_("Package not available"), msg); } - FileName layout_file = libFileSearch("layouts", lm->filename); - textClass_->read(layout_file, TextClass::MODULE); + FileName layout_file = libFileSearch("layouts", lm->getFilename()); + if (!textClass_->read(layout_file, TextClass::MODULE)) { + docstring const msg = + bformat(_("Error reading module %1$s\n"), from_utf8(modName)); + frontend::Alert::warning(_("Read Error"), msg); + } } } @@ -1446,7 +1475,7 @@ void BufferParams::clearLayoutModules() { Font const BufferParams::getFont() const { - FontInfo f = getTextClass().defaultfont(); + FontInfo f = textClass().defaultfont(); if (fontsDefaultFamily == "rmdefault") f.setFamily(ROMAN_FAMILY); else if (fontsDefaultFamily == "sfdefault") @@ -1557,27 +1586,62 @@ void BufferParams::readModules(Lexer & lex) } -string const BufferParams::paperSizeName() const +string const BufferParams::paperSizeName(Papersize_Purpose const & purpose) const { char real_papersize = papersize; if (real_papersize == PAPER_DEFAULT) real_papersize = lyxrc.default_papersize; switch (real_papersize) { + case PAPER_DEFAULT: + // could be anything, so don't guess + return string(); + case PAPER_CUSTOM: { + if (purpose == XDVI && !paperwidth.empty() && + !paperheight.empty()) { + // heightxwidth + string first = paperwidth; + string second = paperheight; + if (orientation == ORIENTATION_LANDSCAPE) + first.swap(second); + // cut off unit. + return first.erase(first.length() - 2) + + "x" + second; + } + return string(); + } case PAPER_A3: return "a3"; case PAPER_A4: return "a4"; case PAPER_A5: return "a5"; + case PAPER_B3: + // dvips and dvipdfm do not know this + if (purpose == DVIPS || purpose == DVIPDFM) + return string(); + return "b3"; + case PAPER_B4: + // dvipdfm does not know this + if (purpose == DVIPDFM) + return string(); + return "b4"; case PAPER_B5: + // dvipdfm does not know this + if (purpose == DVIPDFM) + return string(); return "b5"; case PAPER_USEXECUTIVE: + // dvipdfm does not know this + if (purpose == DVIPDFM) + return string(); return "foolscap"; case PAPER_USLEGAL: return "legal"; case PAPER_USLETTER: default: + if (purpose == XDVI) + return "us"; return "letter"; } } @@ -1597,9 +1661,9 @@ string const BufferParams::dvips_options() const result += ' ' + paperwidth; result += ',' + paperheight; } else { - string const paper_option = paperSizeName(); - if (paper_option != "letter" || - orientation != ORIENTATION_LANDSCAPE) { + string const paper_option = paperSizeName(DVIPS); + if (!paper_option.empty() && (paper_option != "letter" || + orientation != ORIENTATION_LANDSCAPE)) { // dvips won't accept -t letter -t landscape. // In all other cases, include the paper size // explicitly. @@ -1858,7 +1922,7 @@ biblio::CiteEngine BufferParams::getEngine() const { // FIXME the class should provide the numerical/ // authoryear choice - if (getTextClass().provides("natbib") + if (textClass().provides("natbib") && cite_engine_ != biblio::ENGINE_NATBIB_NUMERICAL) return biblio::ENGINE_NATBIB_AUTHORYEAR; return cite_engine_;