X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=38f298c76fa4a0a0a04b2e918ca2fc9e46c30516;hb=667ecbdd1d1da1488802480eae06c96aed946854;hp=5ba89b9587e6370e08611761807915068a84f143;hpb=f27d5aa9ae5f3f89c4e2923dae1592a116988906;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 5ba89b9587..38f298c76f 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -24,6 +24,7 @@ #include "Bullet.h" #include "Color.h" #include "ColorSet.h" +#include "Converter.h" #include "Encoding.h" #include "HSpace.h" #include "IndicesList.h" @@ -364,7 +365,9 @@ BufferParams::BufferParams() use_esint = package_auto; use_mhchem = package_auto; use_mathdots = package_auto; + use_undertilde = package_auto; cite_engine_ = ENGINE_BASIC; + biblio_style = "plain"; use_bibtopic = false; use_indices = false; trackChanges = false; @@ -395,6 +398,7 @@ BufferParams::BufferParams() listings_params = string(); pagestyle = "default"; suppress_date = false; + justification = true; // no color is the default (white) backgroundcolor = lyx::rgbFromHexName("#ffffff"); isbackgroundcolor = false; @@ -414,6 +418,7 @@ BufferParams::BufferParams() html_be_strict = false; html_math_output = MathML; html_math_img_scale = 1.0; + html_css_as_file = false; output_sync = false; use_refstyle = true; @@ -548,7 +553,7 @@ string BufferParams::readToken(Lexer & lex, string const & token, lex.next(); string const classname = lex.getString(); // if there exists a local layout file, ignore the system one - // NOTE: in this case, the textclass (.cls file) is assumed to + // NOTE: in this case, the textclass (.cls file) is assumed to // be available. string tcp; LayoutFileList & bcl = LayoutFileList::get(); @@ -558,12 +563,12 @@ string BufferParams::readToken(Lexer & lex, string const & token, setBaseClass(tcp); else setBaseClass(classname); - // We assume that a tex class exists for local or unknown + // We assume that a tex class exists for local or unknown // layouts so this warning, will only be given for system layouts. if (!baseClass()->isTeXClassAvailable()) { - docstring const desc = + docstring const desc = translateIfPossible(from_utf8(baseClass()->description())); - docstring const prereqs = + docstring const prereqs = from_utf8(baseClass()->prerequisites()); docstring const msg = bformat(_("The selected document class\n" @@ -600,6 +605,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, master = lex.getString(); } else if (token == "\\suppress_date") { lex >> suppress_date; + } else if (token == "\\justification") { + lex >> justification; } else if (token == "\\language") { readLanguage(lex); } else if (token == "\\language_package") { @@ -684,10 +691,17 @@ string BufferParams::readToken(Lexer & lex, string const & token, int usemathdots; lex >> usemathdots; use_mathdots = packagetranslator().find(usemathdots); + } else if (token == "\\use_undertilde") { + int useundertilde; + lex >> useundertilde; + use_undertilde = packagetranslator().find(useundertilde); } else if (token == "\\cite_engine") { string engine; lex >> engine; cite_engine_ = citeenginetranslator().find(engine); + } else if (token == "\\biblio_style") { + lex.eatLine(); + biblio_style = lex.getString(); } else if (token == "\\use_bibtopic") { lex >> use_bibtopic; } else if (token == "\\use_indices") { @@ -850,6 +864,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, html_math_output = static_cast(temp); } else if (token == "\\html_be_strict") { lex >> html_be_strict; + } else if (token == "\\html_css_as_file") { + lex >> html_css_as_file; } else if (token == "\\html_math_img_scale") { lex >> html_math_img_scale; } else if (token == "\\html_latex_start") { @@ -865,7 +881,7 @@ string BufferParams::readToken(Lexer & lex, string const & token, } else if (token == "\\use_refstyle") { lex >> use_refstyle; } else { - lyxerr << "BufferParams::readToken(): Unknown token: " << + lyxerr << "BufferParams::readToken(): Unknown token: " << token << endl; return token; } @@ -897,14 +913,14 @@ void BufferParams::writeFile(ostream & os) const } // use the class options defined in the layout? - os << "\\use_default_options " + os << "\\use_default_options " << convert(use_default_options) << "\n"; // the master document if (!master.empty()) { os << "\\master " << master << '\n'; } - + // removed modules if (!removed_modules_.empty()) { os << "\\begin_removed_modules" << '\n'; @@ -939,7 +955,7 @@ void BufferParams::writeFile(ostream & os) const // local layout information if (!local_layout.empty()) { - // remove '\n' from the end + // remove '\n' from the end string const tmplocal = rtrim(local_layout, "\n"); os << "\\begin_local_layout\n" << tmplocal @@ -987,12 +1003,15 @@ void BufferParams::writeFile(ostream & os) const << "\n\\use_esint " << use_esint << "\n\\use_mhchem " << use_mhchem << "\n\\use_mathdots " << use_mathdots + << "\n\\use_undertilde " << use_undertilde << "\n\\cite_engine " << citeenginetranslator().find(cite_engine_) + << "\n\\biblio_style " << biblio_style << "\n\\use_bibtopic " << convert(use_bibtopic) << "\n\\use_indices " << convert(use_indices) << "\n\\paperorientation " << string_orientation[orientation] << "\n\\suppress_date " << convert(suppress_date) - << "\n\\use_refstyle " << use_refstyle + << "\n\\justification " << convert(justification) + << "\n\\use_refstyle " << use_refstyle << '\n'; if (isbackgroundcolor == true) os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n'; @@ -1052,7 +1071,7 @@ void BufferParams::writeFile(ostream & os) const os << "\\footskip " << VSpace(footskip).asLyXCommand() << '\n'; if (!columnsep.empty()) - os << "\\columnsep " + os << "\\columnsep " << VSpace(columnsep).asLyXCommand() << '\n'; os << "\\secnumdepth " << secnumdepth << "\n\\tocdepth " << tocdepth @@ -1088,10 +1107,11 @@ void BufferParams::writeFile(ostream & os) const } os << "\\tracking_changes " << convert(trackChanges) << '\n' - << "\\output_changes " << convert(outputChanges) << '\n' - << "\\html_math_output " << html_math_output << '\n' - << "\\html_be_strict " << convert(html_be_strict) << '\n'; - + << "\\output_changes " << convert(outputChanges) << '\n' + << "\\html_math_output " << html_math_output << '\n' + << "\\html_css_as_file " << html_css_as_file << '\n' + << "\\html_be_strict " << convert(html_be_strict) << '\n'; + if (html_math_img_scale != 1.0) os << "\\html_math_img_scale " << convert(html_math_img_scale) << '\n'; if (!html_latex_start.empty()) @@ -1114,6 +1134,7 @@ void BufferParams::validate(LaTeXFeatures & features) const switch (features.runparams().flavor) { case OutputParams::LATEX: + case OutputParams::DVILUATEX: if (dvipost) { features.require("ct-dvipost"); features.require("dvipost"); @@ -1133,7 +1154,7 @@ void BufferParams::validate(LaTeXFeatures & features) const features.require("ulem"); features.require("xcolor"); // improves color handling in PDF output - features.require("pdfcolmk"); + features.require("pdfcolmk"); } else { features.require("ct-none"); } @@ -1157,6 +1178,8 @@ void BufferParams::validate(LaTeXFeatures & features) const features.require("mhchem"); if (use_mathdots == package_on) features.require("mathdots"); + if (use_undertilde == package_on) + features.require("undertilde"); // Document-level line spacing if (spacing().getSpace() != Spacing::Single && !spacing().isDefault()) @@ -1165,7 +1188,7 @@ void BufferParams::validate(LaTeXFeatures & features) const // the bullet shapes are buffer level not paragraph level // so they are tested here for (int i = 0; i < 4; ++i) { - if (user_defined_bullet(i) == ITEMIZE_DEFAULTS[i]) + if (user_defined_bullet(i) == ITEMIZE_DEFAULTS[i]) continue; int const font = user_defined_bullet(i).getFont(); if (font == 0) { @@ -1204,19 +1227,17 @@ void BufferParams::validate(LaTeXFeatures & features) const } -bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, - TexRow & texrow, FileName const & filepath) const +bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, + FileName const & filepath) const { // http://www.tug.org/texmf-dist/doc/latex/base/fixltx2e.pdf // !! To use the Fix-cm package, load it before \documentclass, and use the command // \RequirePackage to do so, rather than the normal \usepackage - // Do not to load any other package before the document class, unless you + // Do not try to load any other package before the document class, unless you // have a thorough understanding of the LATEX internals and know exactly what you // are doing! - if (features.mustProvide("fix-cm")) { + if (features.mustProvide("fix-cm")) os << "\\RequirePackage{fix-cm}\n"; - texrow.newline(); - } os << "\\documentclass"; @@ -1353,22 +1374,15 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, } os << '{' << from_ascii(tclass.latexname()) << "}\n"; - texrow.newline(); // end of \documentclass defs - int nlines; // if we use fontspec, we have to load the AMS packages here string const ams = features.loadAMSPackages(); - if (useNonTeXFonts && !ams.empty()) { + if (useNonTeXFonts && !ams.empty()) os << from_ascii(ams); - nlines = int(count(ams.begin(), ams.end(), '\n')); - texrow.newlines(nlines); - } - if (useNonTeXFonts) { + if (useNonTeXFonts) os << "\\usepackage{fontspec}\n"; - texrow.newline(); - } // font selection must be done before loading fontenc.sty string const fonts = @@ -1376,12 +1390,9 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, fonts_expert_sc, fonts_old_figures, fonts_sans_scale, fonts_typewriter_scale, useNonTeXFonts, features); - if (!fonts.empty()) { - os << from_ascii(fonts); - nlines = - int(count(fonts.begin(), fonts.end(), '\n')); - texrow.newlines(nlines); - } + if (!fonts.empty()) + os << from_utf8(fonts); + if (fonts_default_family != "default") os << "\\renewcommand{\\familydefault}{\\" << from_ascii(fonts_default_family) << "}\n"; @@ -1399,16 +1410,14 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, || arab != string::npos) { os << "\\usepackage[" << from_ascii(font_encoding()) << ",LFE,LAE]{fontenc}\n"; - texrow.newline(); } else { os << "\\usepackage[" << from_ascii(font_encoding()) << "]{fontenc}\n"; - texrow.newline(); } } // handle inputenc etc. - writeEncodingPreamble(os, features, texrow); + writeEncodingPreamble(os, features); // includeonly if (!features.runparams().includeall && !included_children_.empty()) { @@ -1423,7 +1432,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, mangledFileName(); if (!features.runparams().nice) incfile = mangled; - // \includeonly doesn't want an extension + // \includeonly doesn't want an extension incfile = changeExtension(incfile, string()); incfile = support::latex_path(incfile); if (!incfile.empty()) { @@ -1436,26 +1445,20 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, os << "}\n"; } - if (!listings_params.empty() || features.isRequired("listings")) { + if (!listings_params.empty() || features.isRequired("listings")) os << "\\usepackage{listings}\n"; - texrow.newline(); - } + if (!listings_params.empty()) { os << "\\lstset{"; - // do not test validity because listings_params is + // do not test validity because listings_params is // supposed to be valid string par = InsetListingsParams(listings_params).separatedParams(true); // we can't support all packages, but we should load the color package if (par.find("\\color", 0) != string::npos) features.require("color"); - os << from_utf8(par); - // count the number of newlines - for (size_t i = 0; i < par.size(); ++i) - if (par[i] == '\n') - texrow.newline(); - os << "}\n"; - texrow.newline(); + os << from_utf8(par) + << "}\n"; } if (!tclass.provides("geometry") && (use_geometry || nonstandard_papersize)) { @@ -1566,65 +1569,14 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, case PAPER_JISB6: ods << ",b6j"; break; - default: - // default papersize ie PAPER_DEFAULT - switch (lyxrc.default_papersize) { - case PAPER_DEFAULT: // keep compiler happy - case PAPER_USLETTER: - ods << ",letterpaper"; - break; - case PAPER_USLEGAL: - ods << ",legalpaper"; - break; - case PAPER_USEXECUTIVE: - ods << ",executivepaper"; - break; - case PAPER_A3: - ods << ",a3paper"; - break; - case PAPER_A4: - ods << ",a4paper"; - break; - case PAPER_A5: - ods << ",a5paper"; - break; - case PAPER_B5: - ods << ",b5paper"; - break; - case PAPER_A0: - case PAPER_A1: - case PAPER_A2: - case PAPER_A6: - case PAPER_B0: - case PAPER_B1: - case PAPER_B2: - case PAPER_B3: - case PAPER_B4: - case PAPER_B6: - case PAPER_C0: - case PAPER_C1: - case PAPER_C2: - case PAPER_C3: - case PAPER_C4: - case PAPER_C5: - case PAPER_C6: - case PAPER_JISB0: - case PAPER_JISB1: - case PAPER_JISB2: - case PAPER_JISB3: - case PAPER_JISB4: - case PAPER_JISB5: - case PAPER_JISB6: - case PAPER_CUSTOM: - break; - } + case PAPER_DEFAULT: + break; } docstring const g_options = trim(ods.str(), ","); os << "\\usepackage"; if (!g_options.empty()) os << '[' << g_options << ']'; os << "{geometry}\n"; - texrow.newline(); // output this only if use_geometry is true if (use_geometry) { os << "\\geometry{verbose"; @@ -1645,28 +1597,23 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, if (!columnsep.empty()) os << ",columnsep=" << from_ascii(Length(columnsep).asLatexString()); os << "}\n"; - texrow.newline(); } } else if (orientation == ORIENTATION_LANDSCAPE || papersize != PAPER_DEFAULT) { features.require("papersize"); } - if (tokenPos(tclass.opt_pagestyle(), - '|', pagestyle) >= 0) { - if (pagestyle == "fancy") { + if (tokenPos(tclass.opt_pagestyle(), '|', pagestyle) >= 0) { + if (pagestyle == "fancy") os << "\\usepackage{fancyhdr}\n"; - texrow.newline(); - } os << "\\pagestyle{" << from_ascii(pagestyle) << "}\n"; - texrow.newline(); } // only output when the background color is not default if (isbackgroundcolor == true) { // only require color here, the background color will be defined // in LaTeXFeatures.cpp to avoid interferences with the LaTeX - // package pdfpages + // package pdfpages features.require("color"); features.require("pagecolor"); } @@ -1675,7 +1622,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, if (isfontcolor == true) { // only require color here, the font color will be defined // in LaTeXFeatures.cpp to avoid interferences with the LaTeX - // package pdfpages + // package pdfpages features.require("color"); features.require("fontcolor"); } @@ -1686,13 +1633,11 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, os << "\\setcounter{secnumdepth}{" << secnumdepth << "}\n"; - texrow.newline(); } if (tocdepth != tclass.tocdepth()) { os << "\\setcounter{tocdepth}{" << tocdepth << "}\n"; - texrow.newline(); } } @@ -1717,22 +1662,20 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, os << "\\setlength{\\parskip}{\\medskipamount}\n"; break; } - texrow.newline(); os << "\\setlength{\\parindent}{0pt}\n"; - texrow.newline(); } else { // when separation by indentation // only output something when a width is given if (getIndentation().asLyXCommand() != "default") { os << "\\setlength{\\parindent}{" - << from_utf8(getIndentation().asLatexCommand()) + << from_utf8(getIndentation().asLatexCommand()) << "}\n"; - texrow.newline(); } } // Now insert the LyX specific LaTeX commands... docstring lyxpreamble; + features.resolveAlternatives(); if (output_sync) { if (!output_sync_macro.empty()) @@ -1750,7 +1693,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // we decided therefore to load color always before babel, see // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg144349.html lyxpreamble += from_ascii(features.getColorOptions()); - + // If we use hyperref, jurabib, japanese, or vietnamese, we have to call babel before them. if (use_babel && (features.isRequired("jurabib") @@ -1793,17 +1736,13 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, // avoid errors with algorithm floats. // use hyperref explicitly if it is required if (features.isRequired("hyperref")) { - // pass what we have to stream here, since we need + // pass what we have to stream here, since we need // to access the stream itself in PDFOptions. os << lyxpreamble; - int lines = - int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); - OutputParams tmp_params = features.runparams(); - lines += pdfoptions().writeLaTeX(tmp_params, os, + pdfoptions().writeLaTeX(tmp_params, os, documentClass().provides("hyperref")); - texrow.newlines(lines); // set back for the rest lyxpreamble.clear(); // correctly break URLs with hyperref and dvi output @@ -1928,7 +1867,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, lyxpreamble += "[" + from_ascii(language->polyglossiaOpts()) + "]"; lyxpreamble += "{" + from_ascii(language->polyglossia()) + "}\n"; // now setup the other languages - std::map const polylangs = + std::map const polylangs = features.getPolyglossiaLanguages(); for (std::map::const_iterator mit = polylangs.begin(); mit != polylangs.end() ; ++mit) { @@ -1944,9 +1883,6 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, if (!i18npreamble.empty()) lyxpreamble += i18npreamble + '\n'; - nlines = int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); - texrow.newlines(nlines); - os << lyxpreamble; return use_babel; @@ -2006,7 +1942,7 @@ bool BufferParams::setBaseClass(string const & classname) LYXERR(Debug::TCLASS, "setBaseClass: " << classname); LayoutFileList & bcl = LayoutFileList::get(); if (!bcl.haveClass(classname)) { - docstring s = + docstring s = bformat(_("The layout file:\n" "%1$s\n" "could not be found. A default textclass with default\n" @@ -2019,7 +1955,7 @@ bool BufferParams::setBaseClass(string const & classname) bool const success = bcl[classname].load(); if (!success) { - docstring s = + docstring s = bformat(_("Due to some error in it, the layout file:\n" "%1$s\n" "could not be loaded. A default textclass with default\n" @@ -2040,7 +1976,7 @@ LayoutFile const * BufferParams::baseClass() const { if (LayoutFileList::get().haveClass(pimpl_->baseClass_)) return &(LayoutFileList::get()[pimpl_->baseClass_]); - else + else return 0; } @@ -2059,7 +1995,9 @@ void BufferParams::makeDocumentClass() doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), layout_modules_)); if (!local_layout.empty()) { - if (!doc_class_->read(local_layout, TextClass::MODULE)) { + TextClass::ReturnValues success = + doc_class_->read(local_layout, TextClass::MODULE); + if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT) { docstring const msg = _("Error reading internal layout information"); frontend::Alert::warning(_("Read Error"), msg); } @@ -2078,13 +2016,155 @@ bool BufferParams::addLayoutModule(string const & modName) LayoutModuleList::const_iterator it = layout_modules_.begin(); LayoutModuleList::const_iterator end = layout_modules_.end(); for (; it != end; it++) - if (*it == modName) + if (*it == modName) return false; layout_modules_.push_back(modName); return true; } +string BufferParams::bufferFormat() const +{ + string format = documentClass().outputFormat(); + if (format == "latex") { + if (useNonTeXFonts) + return "xetex"; + if (encoding().package() == Encoding::japanese) + return "platex"; + } + return format; +} + + +bool BufferParams::isExportable(string const & format) const +{ + vector backs = backends(); + for (vector::const_iterator it = backs.begin(); + it != backs.end(); ++it) + if (theConverters().isReachable(*it, format)) + return true; + return false; +} + + +namespace { +bool formatSorter(Format const * lhs, Format const * rhs) { + return _(lhs->prettyname()) < _(rhs->prettyname()); +} +} + + +vector BufferParams::exportableFormats(bool only_viewable) const +{ + vector const backs = backends(); + set excludes; + if (useNonTeXFonts) { + excludes.insert("latex"); + excludes.insert("pdflatex"); + } + vector result = + theConverters().getReachable(backs[0], only_viewable, true, excludes); + for (vector::const_iterator it = backs.begin() + 1; + it != backs.end(); ++it) { + vector r = + theConverters().getReachable(*it, only_viewable, false, excludes); + result.insert(result.end(), r.begin(), r.end()); + } + sort(result.begin(), result.end(), formatSorter); + return result; +} + + +bool BufferParams::isExportableFormat(string const & format) const +{ + typedef vector Formats; + Formats formats; + formats = exportableFormats(true); + Formats::const_iterator fit = formats.begin(); + Formats::const_iterator end = formats.end(); + for (; fit != end ; ++fit) { + if ((*fit)->name() == format) + return true; + } + return false; +} + + +vector BufferParams::backends() const +{ + vector v; + v.push_back(bufferFormat()); + // FIXME: Don't hardcode format names here, but use a flag + if (v.back() == "latex") { + v.push_back("pdflatex"); + v.push_back("luatex"); + v.push_back("dviluatex"); + v.push_back("xetex"); + } else if (v.back() == "xetex") { + v.push_back("luatex"); + v.push_back("dviluatex"); + } + v.push_back("xhtml"); + v.push_back("text"); + v.push_back("lyx"); + return v; +} + + +OutputParams::FLAVOR BufferParams::getOutputFlavor(string const format) const +{ + string const dformat = (format.empty() || format == "default") ? + getDefaultOutputFormat() : format; + DefaultFlavorCache::const_iterator it = + default_flavors_.find(dformat); + + if (it != default_flavors_.end()) + return it->second; + + OutputParams::FLAVOR result = OutputParams::LATEX; + + if (dformat == "xhtml") + result = OutputParams::HTML; + else { + // Try to determine flavor of default output format + vector backs = backends(); + if (find(backs.begin(), backs.end(), dformat) == backs.end()) { + // Get shortest path to format + Graph::EdgePath path; + for (vector::const_iterator it = backs.begin(); + it != backs.end(); ++it) { + Graph::EdgePath p = theConverters().getPath(*it, dformat); + if (!p.empty() && (path.empty() || p.size() < path.size())) { + path = p; + } + } + if (!path.empty()) + result = theConverters().getFlavor(path); + } + } + // cache this flavor + default_flavors_[dformat] = result; + return result; +} + + +string BufferParams::getDefaultOutputFormat() const +{ + if (!default_output_format.empty() + && default_output_format != "default") + return default_output_format; + if (isDocBook() + || useNonTeXFonts + || encoding().package() == Encoding::japanese) { + vector const formats = exportableFormats(true); + if (formats.empty()) + return string(); + // return the first we find + return formats.front()->name(); + } + return lyxrc.default_view_format; +} + Font const BufferParams::getFont() const { FontInfo f = documentClass().defaultfont(); @@ -2098,6 +2178,24 @@ Font const BufferParams::getFont() const } +bool BufferParams::isLatex() const +{ + return documentClass().outputType() == LATEX; +} + + +bool BufferParams::isLiterate() const +{ + return documentClass().outputType() == LITERATE; +} + + +bool BufferParams::isDocBook() const +{ + return documentClass().outputType() == DOCBOOK; +} + + void BufferParams::readPreamble(Lexer & lex) { if (lex.getString() != "\\begin_preamble") @@ -2118,6 +2216,18 @@ void BufferParams::readLocalLayout(Lexer & lex) } +bool BufferParams::setLanguage(string const & lang) +{ + Language const *new_language = languages.getLanguage(lang); + if (!new_language) { + // Language lang was not found + return false; + } + language = new_language; + return true; +} + + void BufferParams::readLanguage(Lexer & lex) { if (!lex.next()) return; @@ -2125,8 +2235,7 @@ void BufferParams::readLanguage(Lexer & lex) string const tmptok = lex.getString(); // check if tmptok is part of tex_babel in tex-defs.h - language = languages.getLanguage(tmptok); - if (!language) { + if (!setLanguage(tmptok)) { // Language tmptok was not found language = default_language; lyxerr << "Warning: Setting language `" @@ -2138,7 +2247,7 @@ void BufferParams::readLanguage(Lexer & lex) void BufferParams::readGraphicsDriver(Lexer & lex) { - if (!lex.next()) + if (!lex.next()) return; string const tmptok = lex.getString(); @@ -2164,7 +2273,7 @@ void BufferParams::readGraphicsDriver(Lexer & lex) void BufferParams::readBullets(Lexer & lex) { - if (!lex.next()) + if (!lex.next()) return; int const index = lex.getInteger(); @@ -2184,7 +2293,7 @@ void BufferParams::readBullets(Lexer & lex) void BufferParams::readBulletsLaTeX(Lexer & lex) { // The bullet class should be able to read this. - if (!lex.next()) + if (!lex.next()) return; int const index = lex.getInteger(); lex.next(true); @@ -2226,9 +2335,9 @@ void BufferParams::readRemovedModules(Lexer & lex) removed_modules_.push_back(mod); lex.eatLine(); } - // now we want to remove any removed modules that were previously - // added. normally, that will be because default modules were added in - // setBaseClass(), which gets called when \textclass is read at the + // now we want to remove any removed modules that were previously + // added. normally, that will be because default modules were added in + // setBaseClass(), which gets called when \textclass is read at the // start of the read. list::const_iterator rit = removed_modules_.begin(); list::const_iterator const ren = removed_modules_.end(); @@ -2262,11 +2371,7 @@ void BufferParams::readIncludeonly(Lexer & lex) string BufferParams::paperSizeName(PapersizePurpose purpose) const { - char real_papersize = papersize; - if (real_papersize == PAPER_DEFAULT) - real_papersize = lyxrc.default_papersize; - - switch (real_papersize) { + switch (papersize) { case PAPER_DEFAULT: // could be anything, so don't guess return string(); @@ -2484,18 +2589,20 @@ docstring BufferParams::getGraphicsDriver(string const & package) const } -void BufferParams::writeEncodingPreamble(odocstream & os, - LaTeXFeatures & features, TexRow & texrow) const +void BufferParams::writeEncodingPreamble(otexstream & os, + LaTeXFeatures & features) const { // XeTeX does not need this if (features.runparams().flavor == OutputParams::XETEX) return; // LuaTeX neither, but with tex fonts, we need to load // the luainputenc package. - if (features.runparams().flavor == OutputParams::LUATEX) { - if (!useNonTeXFonts) { + if (features.runparams().flavor == OutputParams::LUATEX + || features.runparams().flavor == OutputParams::DVILUATEX) { + if (!useNonTeXFonts && inputenc != "default" + && ((inputenc == "auto" && language->encoding()->package() == Encoding::inputenc) + || (inputenc != "auto" && encoding().package() == Encoding::inputenc))) { os << "\\usepackage[utf8]{luainputenc}\n"; - texrow.newline(); } return; } @@ -2533,7 +2640,6 @@ void BufferParams::writeEncodingPreamble(odocstream & os, os << from_ascii(doc_encoding); } os << "]{inputenc}\n"; - texrow.newline(); } if (package == Encoding::CJK || features.mustProvide("CJK")) { if (language->encoding()->name() == "utf8-cjk" @@ -2541,7 +2647,6 @@ void BufferParams::writeEncodingPreamble(odocstream & os, os << "\\usepackage{CJKutf8}\n"; else os << "\\usepackage{CJK}\n"; - texrow.newline(); } } else if (inputenc != "default") { switch (encoding().package()) { @@ -2554,7 +2659,6 @@ void BufferParams::writeEncodingPreamble(odocstream & os, break; os << "\\usepackage[" << from_ascii(inputenc) << "]{inputenc}\n"; - texrow.newline(); break; case Encoding::CJK: if (encoding().name() == "utf8-cjk" @@ -2562,7 +2666,6 @@ void BufferParams::writeEncodingPreamble(odocstream & os, os << "\\usepackage{CJKutf8}\n"; else os << "\\usepackage{CJK}\n"; - texrow.newline(); break; } } @@ -2570,10 +2673,8 @@ void BufferParams::writeEncodingPreamble(odocstream & os, // The encoding "armscii8" (for Armenian) is only available when // the package "armtex" is loaded. if (language->encoding()->latexName() == "armscii8" - || inputenc == "armscii8") { + || inputenc == "armscii8") os << "\\usepackage{armtex}\n"; - texrow.newline(); - } } @@ -2621,9 +2722,9 @@ string const BufferParams::loadFonts(string const & rm, * -- add more GUI options? * -- add more fonts (fonts for other scripts) * -- if there's a way to find out if a font really supports - * OldStyle, enable/disable the widget accordingly. + * OldStyle, enable/disable the widget accordingly. */ - if (use_systemfonts) { + if (use_systemfonts && features.isAvailable("fontspec")) { // "Mapping=tex-text" and "Ligatures=TeX" are equivalent. // However, until v.2 (2010/07/11) fontspec only knew // Mapping=tex-text (for XeTeX only); then "Ligatures=TeX" @@ -2631,7 +2732,8 @@ string const BufferParams::loadFonts(string const & rm, // didn't understand "Mapping=tex-text", while XeTeX // understood both. With most recent versions, both // variants are understood by both engines. However, - // we want to provide support for at least TeXLive 2009. + // we want to provide support for at least TeXLive 2009 + // (for XeTeX; LuaTeX is only supported as of v.2) string const texmapping = (features.runparams().flavor == OutputParams::XETEX) ? "Mapping=tex-text" : "Ligatures=TeX"; @@ -2644,8 +2746,8 @@ string const BufferParams::loadFonts(string const & rm, if (sf != "default") { string const sans = parseFontName(sf); if (sfscale != 100) - os << "\\setsansfont[Scale=" - << float(sfscale) / 100 + os << "\\setsansfont[Scale=" + << float(sfscale) / 100 << "," << texmapping << "]{" << sans << "}\n"; else @@ -2655,8 +2757,8 @@ string const BufferParams::loadFonts(string const & rm, if (tt != "default") { string const mono = parseFontName(tt); if (ttscale != 100) - os << "\\setmonofont[Scale=" - << float(ttscale) / 100 + os << "\\setmonofont[Scale=" + << float(ttscale) / 100 << "]{" << mono << "}\n"; else