X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=5e8f6126dd613378bf01215b32ded8ff8895ee88;hb=b92ceba9a1b6483eae74877fd84b2bfc114846bf;hp=2736c26977f78df08e9c7504803f5e13f674ce48;hpb=b3cc07e3a69bfcb2a99fc17ad033b1b05ccfd345;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 2736c26977..5e8f6126dd 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -28,11 +28,11 @@ #include "ColorSet.h" #include "Converter.h" #include "Encoding.h" -#include "HSpace.h" #include "IndicesList.h" #include "Language.h" #include "LaTeXFeatures.h" #include "LaTeXFonts.h" +#include "Length.h" #include "ModuleList.h" #include "Font.h" #include "Lexer.h" @@ -323,7 +323,7 @@ bool inSystemDir(FileName const & document_dir, string & system_dir) return false; } -} // anon namespace +} // namespace class BufferParams::Impl @@ -337,10 +337,11 @@ public: Bullet user_defined_bullets[4]; IndicesList indiceslist; Spacing spacing; + Length parindent; + Length mathindent; /** This is the amount of space used for paragraph_separation "skip", * and for detached paragraphs in "indented" documents. */ - HSpace indentation; VSpace defskip; PDFOptions pdfoptions; LayoutFileIndex baseClass_; @@ -383,6 +384,8 @@ BufferParams::BufferParams() cite_engine_type_ = ENGINE_TYPE_DEFAULT; makeDocumentClass(); paragraph_separation = ParagraphIndentSeparation; + is_math_indent = false; + math_numbering_side = DEFAULT; quotes_style = InsetQuotesParams::EnglishQuotes; dynamic_quotes = false; fontsize = "default"; @@ -393,6 +396,7 @@ BufferParams::BufferParams() use_geometry = false; biblio_style = "plain"; use_bibtopic = false; + multibib = string(); use_indices = false; save_transient_properties = true; track_changes = false; @@ -414,6 +418,7 @@ BufferParams::BufferParams() fonts_default_family = "default"; useNonTeXFonts = false; use_microtype = false; + use_dash_ligatures = true; fonts_expert_sc = false; fonts_old_figures = false; fonts_sans_scale[0] = 100; @@ -454,8 +459,10 @@ BufferParams::BufferParams() html_css_as_file = false; display_pixel_ratio = 1.0; + shell_escape = false; output_sync = false; use_refstyle = true; + use_minted = false; // map current author author_map_[pimpl_->authorlist.get(0).bufferId()] = 0; @@ -522,6 +529,14 @@ map const & BufferParams::auto_packages() } +bool BufferParams::useBibtopic() const +{ + if (useBiblatex()) + return false; + return (use_bibtopic || (!multibib.empty() && multibib != "child")); +} + + AuthorList & BufferParams::authors() { return pimpl_->authorlist; @@ -616,15 +631,27 @@ PDFOptions const & BufferParams::pdfoptions() const } -HSpace const & BufferParams::getIndentation() const +Length const & BufferParams::getMathIndent() const +{ + return pimpl_->mathindent; +} + + +void BufferParams::setMathIndent(Length const & indent) +{ + pimpl_->mathindent = indent; +} + + +Length const & BufferParams::getParIndent() const { - return pimpl_->indentation; + return pimpl_->parindent; } -void BufferParams::setIndentation(HSpace const & indent) +void BufferParams::setParIndent(Length const & indent) { - pimpl_->indentation = indent; + pimpl_->parindent = indent; } @@ -642,6 +669,19 @@ void BufferParams::setDefSkip(VSpace const & vs) } +BufferParams::MathNumber BufferParams::getMathNumber() const +{ + if (math_numbering_side != DEFAULT) + return math_numbering_side; + // FIXME: do not hardcode language here + else if (language->lang() == "arabic_arabi" + || documentClass().provides("leqno")) + return LEFT; + else + return RIGHT; +} + + string BufferParams::readToken(Lexer & lex, string const & token, FileName const & filepath) { @@ -803,14 +843,19 @@ string BufferParams::readToken(Lexer & lex, string const & token, lex >> fonts_cjk; } else if (token == "\\use_microtype") { lex >> use_microtype; + } else if (token == "\\use_dash_ligatures") { + lex >> use_dash_ligatures; } else if (token == "\\paragraph_separation") { string parsep; lex >> parsep; paragraph_separation = parseptranslator().find(parsep); } else if (token == "\\paragraph_indentation") { lex.next(); - string indentation = lex.getString(); - pimpl_->indentation = HSpace(indentation); + string parindent = lex.getString(); + if (parindent == "default") + pimpl_->parindent = Length(); + else + pimpl_->parindent = Length(parindent); } else if (token == "\\defskip") { lex.next(); string const defskip = lex.getString(); @@ -818,6 +863,24 @@ string BufferParams::readToken(Lexer & lex, string const & token, if (pimpl_->defskip.kind() == VSpace::DEFSKIP) // that is invalid pimpl_->defskip = VSpace(VSpace::MEDSKIP); + } else if (token == "\\is_math_indent") { + lex >> is_math_indent; + } else if (token == "\\math_indentation") { + lex.next(); + string mathindent = lex.getString(); + if (mathindent == "default") + pimpl_->mathindent = Length(); + else + pimpl_->mathindent = Length(mathindent); + } else if (token == "\\math_numbering_side") { + string tmp; + lex >> tmp; + if (tmp == "left") + math_numbering_side = LEFT; + else if (tmp == "right") + math_numbering_side = RIGHT; + else + math_numbering_side = DEFAULT; } else if (token == "\\quotes_style") { string qstyle; lex >> qstyle; @@ -858,6 +921,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, biblatex_citestyle = trim(lex.getString()); } else if (token == "\\use_bibtopic") { lex >> use_bibtopic; + } else if (token == "\\multibib") { + lex >> multibib; } else if (token == "\\use_indices") { lex >> use_indices; } else if (token == "\\tracking_changes") { @@ -1036,6 +1101,8 @@ string BufferParams::readToken(Lexer & lex, string const & token, lex >> output_sync_macro; } else if (token == "\\use_refstyle") { lex >> use_refstyle; + } else if (token == "\\use_minted") { + lex >> use_minted; } else { lyxerr << "BufferParams::readToken(): Unknown token: " << token << endl; @@ -1053,7 +1120,7 @@ namespace { return "\"" + str + "\""; return str; } -} +} // namespace void BufferParams::writeFile(ostream & os, Buffer const * buf) const @@ -1185,6 +1252,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const os << "\\font_cjk " << fonts_cjk << '\n'; } os << "\\use_microtype " << convert(use_microtype) << '\n'; + os << "\\use_dash_ligatures " << convert(use_dash_ligatures) << '\n'; os << "\\graphics " << graphics_driver << '\n'; os << "\\default_output_format " << default_output_format << '\n'; os << "\\output_sync " << output_sync << '\n'; @@ -1233,6 +1301,8 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const os << "\n\\biblatex_bibstyle " << biblatex_bibstyle; if (!biblatex_citestyle.empty()) os << "\n\\biblatex_citestyle " << biblatex_citestyle; + if (!multibib.empty()) + os << "\n\\multibib " << multibib; os << "\n\\use_bibtopic " << convert(use_bibtopic) << "\n\\use_indices " << convert(use_indices) @@ -1240,6 +1310,7 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const << "\n\\suppress_date " << convert(suppress_date) << "\n\\justification " << convert(justification) << "\n\\use_refstyle " << use_refstyle + << "\n\\use_minted " << use_minted << '\n'; if (isbackgroundcolor == true) os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n'; @@ -1306,9 +1377,25 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const << "\n\\paragraph_separation " << string_paragraph_separation[paragraph_separation]; if (!paragraph_separation) - os << "\n\\paragraph_indentation " << getIndentation().asLyXCommand(); + os << "\n\\paragraph_indentation " + << (getParIndent().empty() ? "default" : getParIndent().asString()); else os << "\n\\defskip " << getDefSkip().asLyXCommand(); + os << "\n\\is_math_indent " << is_math_indent; + if (is_math_indent) + os << "\n\\math_indentation " + << (getMathIndent().empty() ? "default" : getMathIndent().asString()); + os << "\n\\math_numbering_side "; + switch(math_numbering_side) { + case LEFT: + os << "left"; + break; + case RIGHT: + os << "right"; + break; + case DEFAULT: + os << "default"; + } os << "\n\\quotes_style " << string_quotes_style[quotes_style] << "\n\\dynamic_quotes " << dynamic_quotes @@ -1467,7 +1554,7 @@ void BufferParams::validate(LaTeXFeatures & features) const if (useNonTeXFonts && fontsMath() != "auto") features.require("unicode-math"); - + if (use_microtype) features.require("microtype"); @@ -1590,6 +1677,21 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, && orientation == ORIENTATION_LANDSCAPE) clsoptions << "landscape,"; + if (is_math_indent) + clsoptions << "fleqn,"; + + switch(math_numbering_side) { + case LEFT: + clsoptions << "leqno,"; + break; + case RIGHT: + clsoptions << "reqno,"; + features.require("amsmath"); + break; + case DEFAULT: + break; + } + // language should be a parameter to \documentclass if (language->babel() == "hebrew" && default_language->babel() != "hebrew") @@ -1633,7 +1735,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // if we use fontspec or newtxmath, we have to load the AMS packages here string const ams = features.loadAMSPackages(); - bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1"); + bool const ot1 = (main_font_encoding() == "default" || main_font_encoding() == "OT1"); bool const use_newtxmath = theLaTeXFonts().getLaTeXFont(from_ascii(fontsMath())).getUsedPackage( ot1, false, false) == "newtxmath"; @@ -1660,7 +1762,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // set font encoding // XeTeX and LuaTeX (with OS fonts) do not need fontenc if (!useNonTeXFonts && !features.isProvided("fontenc") - && font_encoding() != "default") { + && main_font_encoding() != "default") { // get main font encodings vector fontencs = font_encodings(); // get font encodings of secondary languages @@ -1907,9 +2009,19 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, } else { // when separation by indentation // only output something when a width is given - if (getIndentation().asLyXCommand() != "default") { + if (!getParIndent().empty()) { os << "\\setlength{\\parindent}{" - << from_utf8(getIndentation().asLatexCommand()) + << from_utf8(getParIndent().asLatexString()) + << "}\n"; + } + } + + if (is_math_indent) { + // when formula indentation + // only output something when it is not the default + if (!getMathIndent().empty()) { + os << "\\setlength{\\mathindent}{" + << from_utf8(getMathIndent().asString()) << "}\n"; } } @@ -1938,13 +2050,12 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg144349.html os << from_ascii(features.getColorOptions()); - // If we use hyperref, jurabib, japanese, varioref or vietnamese, + // If we use hyperref, jurabib, japanese or varioref, // we have to call babel before if (use_babel && (features.isRequired("jurabib") || features.isRequired("hyperref") || features.isRequired("varioref") - || features.isRequired("vietnamese") || features.isRequired("japanese"))) { os << features.getBabelPresettings(); // FIXME UNICODE @@ -1961,20 +2072,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, IndicesList::const_iterator iit = indiceslist().begin(); IndicesList::const_iterator iend = indiceslist().end(); for (; iit != iend; ++iit) { - pair indexname_latex = - features.runparams().encoding->latexString(iit->index(), - features.runparams().dryrun); - if (!indexname_latex.second.empty()) { - // issue a warning about omitted characters - // FIXME: should be passed to the error dialog - frontend::Alert::warning(_("Uncodable characters"), - bformat(_("The following characters that are used in an index name are not\n" - "representable in the current encoding and therefore have been omitted:\n%1$s."), - indexname_latex.second)); - } - os << "\\newindex["; - os << indexname_latex.first; - os << "]{"; + os << "\\newindex{"; os << escape(iit->shortcut()); os << "}\n"; } @@ -2153,8 +2251,7 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // called after babel, though. if (use_babel && !features.isRequired("jurabib") && !features.isRequired("hyperref") - && !features.isRequired("varioref") - && !features.isRequired("vietnamese") + && !features.isRequired("varioref") && !features.isRequired("japanese")) { os << features.getBabelPresettings(); // FIXME UNICODE @@ -2164,10 +2261,19 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, } if (features.isRequired("bicaption")) os << "\\usepackage{bicaption}\n"; - if (!listings_params.empty() || features.mustProvide("listings")) - os << "\\usepackage{listings}\n"; + if (!listings_params.empty() + || features.mustProvide("listings") + || features.mustProvide("minted")) { + if (features.mustProvide("listings")) + os << "\\usepackage{listings}\n"; + else + os << "\\usepackage{minted}\n"; + } if (!listings_params.empty()) { - os << "\\lstset{"; + if (features.mustProvide("listings")) + os << "\\lstset{"; + else + os << "\\setminted{"; // do not test validity because listings_params is // supposed to be valid string par = @@ -2176,12 +2282,19 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, os << "}\n"; } - // xunicode needs to be loaded at least after amsmath, amssymb, + // xunicode only needs to be loaded if tipa is used + // (the rest is obsoleted by the new TU encoding). + // It needs to be loaded at least after amsmath, amssymb, // esint and the other packages that provide special glyphs - // The package only supports XeTeX currently. - if (features.runparams().flavor == OutputParams::XETEX - && useNonTeXFonts) + if (features.mustProvide("tipa") && useNonTeXFonts) { + // The package officially only supports XeTeX, but also works + // with LuaTeX. Thus we work around its XeTeX test. + if (features.runparams().flavor != OutputParams::XETEX) { + os << "% Pretend to xunicode that we are XeTeX\n" + << "\\def\\XeTeXpicfile{}\n"; + } os << "\\usepackage{xunicode}\n"; + } // Polyglossia must be loaded last ... if (use_polyglossia) { @@ -2226,6 +2339,10 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, delim = ","; } } + if (!multibib.empty() && multibib != "child") { + opts += delim + "refsection=" + multibib; + delim = ","; + } if (bibtexCommand() == "bibtex8" || prefixIs(bibtexCommand(), "bibtex8 ")) { opts += delim + "backend=bibtex8"; @@ -2253,7 +2370,8 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, } docstring const i18npreamble = - features.getTClassI18nPreamble(use_babel, use_polyglossia); + features.getTClassI18nPreamble(use_babel, use_polyglossia, + use_minted); if (!i18npreamble.empty()) os << i18npreamble + '\n'; @@ -2459,7 +2577,7 @@ FormatList const & BufferParams::exportableFormats(bool only_viewable) const { FormatList & cached = only_viewable ? pimpl_->viewableFormatList : pimpl_->exportableFormatList; - bool & valid = only_viewable ? + bool & valid = only_viewable ? pimpl_->isViewCacheValid : pimpl_->isExportCacheValid; if (valid) return cached; @@ -2474,7 +2592,7 @@ FormatList const & BufferParams::exportableFormats(bool only_viewable) const theConverters().getReachable(backs[0], only_viewable, true, excludes); for (vector::const_iterator it = backs.begin() + 1; it != backs.end(); ++it) { - FormatList r = theConverters().getReachable(*it, only_viewable, + FormatList r = theConverters().getReachable(*it, only_viewable, false, excludes); result.insert(result.end(), r.begin(), r.end()); } @@ -2503,8 +2621,16 @@ vector BufferParams::backends() const v.push_back("luatex"); v.push_back("dviluatex"); } - } else - v.push_back(buffmt); + } else { + string rbuffmt = buffmt; + // If we use an OutputFormat in Japanese docs, + // we need special format in order to get the path + // via pLaTeX (#8823) + if (documentClass().hasOutputFormat() + && encoding().package() == Encoding::japanese) + rbuffmt += "-ja"; + v.push_back(rbuffmt); + } v.push_back("xhtml"); v.push_back("text"); @@ -2981,7 +3107,7 @@ string const BufferParams::dvips_options() const } -string const BufferParams::font_encoding() const +string const BufferParams::main_font_encoding() const { return font_encodings().empty() ? "default" : font_encodings().back(); } @@ -3217,7 +3343,7 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const } // Tex Fonts - bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1"); + bool const ot1 = (main_font_encoding() == "default" || main_font_encoding() == "OT1"); bool const dryrun = features.runparams().dryrun; bool const complete = (fontsSans() == "default" && fontsTypewriter() == "default"); bool const nomath = (fontsMath() == "default"); @@ -3249,7 +3375,7 @@ string const BufferParams::loadFonts(LaTeXFeatures & features) const Encoding const & BufferParams::encoding() const { // Main encoding for LaTeX output. - // + // // Exception: XeTeX with 8-bit TeX fonts requires ASCII (see #9740). // As the "flavor" is only known once export started, this // cannot be handled here. Instead, runparams.encoding is set @@ -3294,8 +3420,12 @@ bool BufferParams::addCiteEngine(vector const & engine) string const & BufferParams::defaultBiblioStyle() const { - map bs = documentClass().defaultBiblioStyle(); - return bs[theCiteEnginesList.getTypeAsString(citeEngineType())]; + map const & bs = documentClass().defaultBiblioStyle(); + auto cit = bs.find(theCiteEnginesList.getTypeAsString(citeEngineType())); + if (cit != bs.end()) + return cit->second; + else + return empty_string(); }