X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=19abefc0dd9706fd872c284aa9f14af470368482;hb=ee0cc3cec1cf97e154e968d33dc580f37eb29e84;hp=d56c15bb166f0310af69d6fece21a624a73e8bc3;hpb=7c9e9b4c90fade3be8623a9fc1a509e06872a9cd;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index d56c15bb16..19abefc0dd 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -23,6 +23,7 @@ #include "Buffer.h" #include "buffer_funcs.h" #include "Bullet.h" +#include "CiteEnginesList.h" #include "Color.h" #include "ColorSet.h" #include "Converter.h" @@ -71,8 +72,9 @@ static char const * const string_paragraph_separation[] = { }; -static char const * const string_quotes_language[] = { - "english", "swedish", "german", "polish", "french", "danish", "" +static char const * const string_quotes_style[] = { + "english", "swedish", "german", "polish", "swiss", "danish", "plain", + "british", "swedishg", "french", "frenchin", "russian", "cjk", "cjkangle", "" }; @@ -127,27 +129,35 @@ ParSepTranslator const & parseptranslator() } -// Quotes language -typedef Translator QuotesLangTranslator; +// Quotes style +typedef Translator QuotesStyleTranslator; -QuotesLangTranslator const init_quoteslangtranslator() +QuotesStyleTranslator const init_quotesstyletranslator() { - QuotesLangTranslator translator - (string_quotes_language[0], InsetQuotes::EnglishQuotes); - translator.addPair(string_quotes_language[1], InsetQuotes::SwedishQuotes); - translator.addPair(string_quotes_language[2], InsetQuotes::GermanQuotes); - translator.addPair(string_quotes_language[3], InsetQuotes::PolishQuotes); - translator.addPair(string_quotes_language[4], InsetQuotes::FrenchQuotes); - translator.addPair(string_quotes_language[5], InsetQuotes::DanishQuotes); + QuotesStyleTranslator translator + (string_quotes_style[0], InsetQuotesParams::EnglishQuotes); + translator.addPair(string_quotes_style[1], InsetQuotesParams::SwedishQuotes); + translator.addPair(string_quotes_style[2], InsetQuotesParams::GermanQuotes); + translator.addPair(string_quotes_style[3], InsetQuotesParams::PolishQuotes); + translator.addPair(string_quotes_style[4], InsetQuotesParams::SwissQuotes); + translator.addPair(string_quotes_style[5], InsetQuotesParams::DanishQuotes); + translator.addPair(string_quotes_style[6], InsetQuotesParams::PlainQuotes); + translator.addPair(string_quotes_style[7], InsetQuotesParams::BritishQuotes); + translator.addPair(string_quotes_style[8], InsetQuotesParams::SwedishGQuotes); + translator.addPair(string_quotes_style[9], InsetQuotesParams::FrenchQuotes); + translator.addPair(string_quotes_style[10], InsetQuotesParams::FrenchINQuotes); + translator.addPair(string_quotes_style[11], InsetQuotesParams::RussianQuotes); + translator.addPair(string_quotes_style[12], InsetQuotesParams::CJKQuotes); + translator.addPair(string_quotes_style[13], InsetQuotesParams::CJKAngleQuotes); return translator; } -QuotesLangTranslator const & quoteslangtranslator() +QuotesStyleTranslator const & quotesstyletranslator() { - static QuotesLangTranslator const translator = - init_quoteslangtranslator(); + static QuotesStyleTranslator const translator = + init_quotesstyletranslator(); return translator; } @@ -263,27 +273,6 @@ PackageTranslator const & packagetranslator() } -// Cite engine -typedef Translator CiteEngineTypeTranslator; - - -CiteEngineTypeTranslator const init_citeenginetypetranslator() -{ - CiteEngineTypeTranslator translator("authoryear", ENGINE_TYPE_AUTHORYEAR); - translator.addPair("numerical", ENGINE_TYPE_NUMERICAL); - translator.addPair("default", ENGINE_TYPE_DEFAULT); - return translator; -} - - -CiteEngineTypeTranslator const & citeenginetypetranslator() -{ - static CiteEngineTypeTranslator const translator = - init_citeenginetypetranslator(); - return translator; -} - - // Spacing typedef Translator SpaceTranslator; @@ -353,6 +342,7 @@ public: */ HSpace indentation; VSpace defskip; + HSpace math_indentation; PDFOptions pdfoptions; LayoutFileIndex baseClass_; FormatList exportableFormatList; @@ -394,7 +384,10 @@ BufferParams::BufferParams() cite_engine_type_ = ENGINE_TYPE_DEFAULT; makeDocumentClass(); paragraph_separation = ParagraphIndentSeparation; - quotes_language = InsetQuotes::EnglishQuotes; + is_math_indent = false; + math_indentation = "default"; + quotes_style = InsetQuotesParams::EnglishQuotes; + dynamic_quotes = false; fontsize = "default"; /* PaperLayout */ @@ -403,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; @@ -424,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; @@ -532,6 +527,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; @@ -626,6 +629,18 @@ PDFOptions const & BufferParams::pdfoptions() const } +HSpace const & BufferParams::getMathIndentation() const +{ + return pimpl_->math_indentation; +} + + +void BufferParams::setMathIndentation(HSpace const & indent) +{ + pimpl_->math_indentation = indent; +} + + HSpace const & BufferParams::getIndentation() const { return pimpl_->indentation; @@ -813,6 +828,8 @@ 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; @@ -828,10 +845,18 @@ 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 == "\\quotes_language") { - string quotes_lang; - lex >> quotes_lang; - quotes_language = quoteslangtranslator().find(quotes_lang); + } else if (token == "\\is_math_indent") { + lex >> is_math_indent; + } else if (token == "\\math_indentation") { + lex.next(); + string math_indentation = lex.getString(); + pimpl_->math_indentation = HSpace(math_indentation); + } else if (token == "\\quotes_style") { + string qstyle; + lex >> qstyle; + quotes_style = quotesstyletranslator().find(qstyle); + } else if (token == "\\dynamic_quotes") { + lex >> dynamic_quotes; } else if (token == "\\papersize") { string ppsize; lex >> ppsize; @@ -851,12 +876,23 @@ string BufferParams::readToken(Lexer & lex, string const & token, } else if (token == "\\cite_engine_type") { string engine_type; lex >> engine_type; - cite_engine_type_ = citeenginetypetranslator().find(engine_type); + cite_engine_type_ = theCiteEnginesList.getType(engine_type); } else if (token == "\\biblio_style") { lex.eatLine(); biblio_style = lex.getString(); + } else if (token == "\\biblio_options") { + lex.eatLine(); + biblio_opts = trim(lex.getString()); + } else if (token == "\\biblatex_bibstyle") { + lex.eatLine(); + biblatex_bibstyle = trim(lex.getString()); + } else if (token == "\\biblatex_citestyle") { + lex.eatLine(); + 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") { @@ -1184,6 +1220,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'; @@ -1222,9 +1259,20 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const os << "basic"; } - os << "\n\\cite_engine_type " << citeenginetypetranslator().find(cite_engine_type_) - << "\n\\biblio_style " << biblio_style - << "\n\\use_bibtopic " << convert(use_bibtopic) + os << "\n\\cite_engine_type " << theCiteEnginesList.getTypeAsString(cite_engine_type_); + + if (!biblio_style.empty()) + os << "\n\\biblio_style " << biblio_style; + if (!biblio_opts.empty()) + os << "\n\\biblio_options " << biblio_opts; + if (!biblatex_bibstyle.empty()) + 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) << "\n\\paperorientation " << string_orientation[orientation] << "\n\\suppress_date " << convert(suppress_date) @@ -1299,8 +1347,12 @@ void BufferParams::writeFile(ostream & os, Buffer const * buf) const os << "\n\\paragraph_indentation " << getIndentation().asLyXCommand(); else os << "\n\\defskip " << getDefSkip().asLyXCommand(); - os << "\n\\quotes_language " - << string_quotes_language[quotes_language] + os << "\n\\is_math_indent " << is_math_indent; + if (is_math_indent) + os << "\n\\math_indentation " << getMathIndentation().asLyXCommand(); + os << "\n\\quotes_style " + << string_quotes_style[quotes_style] + << "\n\\dynamic_quotes " << dynamic_quotes << "\n\\papercolumns " << columns << "\n\\papersides " << sides << "\n\\paperpagestyle " << pagestyle << '\n'; @@ -1452,7 +1504,7 @@ void BufferParams::validate(LaTeXFeatures & features) const // some languages are only available via polyglossia if (features.hasPolyglossiaExclusiveLanguages()) - features.require("polyglossia"); + features.require("polyglossia"); if (useNonTeXFonts && fontsMath() != "auto") features.require("unicode-math"); @@ -1579,6 +1631,9 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, && orientation == ORIENTATION_LANDSCAPE) clsoptions << "landscape,"; + if (is_math_indent) + clsoptions << "fleqn,"; + // language should be a parameter to \documentclass if (language->babel() == "hebrew" && default_language->babel() != "hebrew") @@ -1622,7 +1677,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"; @@ -1649,7 +1704,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 @@ -1903,6 +1958,16 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, } } + if (is_math_indent) { + // when formula indentation + // only output something when it is not the default + if (getMathIndentation().asLyXCommand() != "default") { + os << "\\setlength{\\mathindent}{" + << from_utf8(getMathIndentation().asLatexCommand()) + << "}\n"; + } + } + // Now insert the LyX specific LaTeX commands... features.resolveAlternatives(); features.expandMultiples(); @@ -1950,20 +2015,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"; } @@ -2165,14 +2217,21 @@ 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 + // Polyglossia must be loaded last ... if (use_polyglossia) { // call the package os << "\\usepackage{polyglossia}\n"; @@ -2182,17 +2241,60 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, os << "[" << from_ascii(language->polyglossiaOpts()) << "]"; os << "{" << from_ascii(language->polyglossia()) << "}\n"; // now setup the other languages - std::map const polylangs = + set const polylangs = features.getPolyglossiaLanguages(); - for (std::map::const_iterator mit = polylangs.begin(); + for (set::const_iterator mit = polylangs.begin(); mit != polylangs.end() ; ++mit) { + // We do not output the options here; they are output in + // the language switch commands. This is safer if multiple + // varieties are used. + if (*mit == language->polyglossia()) + continue; os << "\\setotherlanguage"; - if (!mit->second.empty()) - os << "[" << from_ascii(mit->second) << "]"; - os << "{" << from_ascii(mit->first) << "}\n"; + os << "{" << from_ascii(*mit) << "}\n"; + } + } + + // ... but before biblatex (see #7065) + if (features.mustProvide("biblatex")) { + string delim = ""; + string opts; + os << "\\usepackage"; + if (!biblatex_bibstyle.empty() + && (biblatex_bibstyle == biblatex_citestyle)) { + opts = "style=" + biblatex_bibstyle; + delim = ","; + } else { + if (!biblatex_bibstyle.empty()) { + opts = "bibstyle=" + biblatex_bibstyle; + delim = ","; + } + if (!biblatex_citestyle.empty()) { + opts += delim + "citestyle=" + biblatex_citestyle; + delim = ","; + } + } + if (!multibib.empty() && multibib != "child") { + opts += delim + "refsection=" + multibib; + delim = ","; + } + if (bibtexCommand() == "bibtex8" + || prefixIs(bibtexCommand(), "bibtex8 ")) { + opts += delim + "backend=bibtex8"; + delim = ","; + } else if (bibtexCommand() == "bibtex" + || prefixIs(bibtexCommand(), "bibtex ")) { + opts += delim + "backend=bibtex"; + delim = ","; } + if (!biblio_opts.empty()) + opts += delim + biblio_opts; + if (!opts.empty()) + os << "[" << opts << "]"; + os << "{biblatex}\n"; } + // Load custom language package here if (features.langPackage() == LaTeXFeatures::LANG_PACK_CUSTOM) { if (lang_package == "default") @@ -2317,6 +2419,7 @@ void BufferParams::makeDocumentClass(bool const clone) invalidateConverterCache(); LayoutModuleList mods; + LayoutModuleList ces; LayoutModuleList::iterator it = layout_modules_.begin(); LayoutModuleList::iterator en = layout_modules_.end(); for (; it != en; ++it) @@ -2325,9 +2428,9 @@ void BufferParams::makeDocumentClass(bool const clone) it = cite_engine_.begin(); en = cite_engine_.end(); for (; it != en; ++it) - mods.push_back(*it); + ces.push_back(*it); - doc_class_ = getDocumentClass(*baseClass(), mods, clone); + doc_class_ = getDocumentClass(*baseClass(), mods, ces, clone); TextClass::ReturnValues success = TextClass::OK; if (!forced_local_layout_.empty()) @@ -2391,9 +2494,9 @@ string BufferParams::bufferFormat() const } -bool BufferParams::isExportable(string const & format) const +bool BufferParams::isExportable(string const & format, bool need_viewable) const { - FormatList const & formats = exportableFormats(false); + FormatList const & formats = exportableFormats(need_viewable); FormatList::const_iterator fit = formats.begin(); FormatList::const_iterator end = formats.end(); for (; fit != end ; ++fit) { @@ -2434,19 +2537,6 @@ FormatList const & BufferParams::exportableFormats(bool only_viewable) const } -bool BufferParams::isExportableFormat(string const & format) const -{ - FormatList const & formats = exportableFormats(true); - FormatList::const_iterator fit = formats.begin(); - FormatList::const_iterator end = formats.end(); - for (; fit != end ; ++fit) { - if ((*fit)->name() == format) - return true; - } - return false; -} - - vector BufferParams::backends() const { vector v; @@ -2557,9 +2647,9 @@ Font const BufferParams::getFont() const } -InsetQuotes::QuoteLanguage BufferParams::getQuoteStyle(string const & qs) const +InsetQuotesParams::QuoteStyle BufferParams::getQuoteStyle(string const & qs) const { - return quoteslangtranslator().find(qs); + return quotesstyletranslator().find(qs); } @@ -2943,7 +3033,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(); } @@ -3179,7 +3269,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"); @@ -3256,7 +3346,12 @@ bool BufferParams::addCiteEngine(vector const & engine) string const & BufferParams::defaultBiblioStyle() const { - return documentClass().defaultBiblioStyle(); + map const & bs = documentClass().defaultBiblioStyle(); + auto cit = bs.find(theCiteEnginesList.getTypeAsString(citeEngineType())); + if (cit != bs.end()) + return cit->second; + else + return empty_string(); } @@ -3266,6 +3361,20 @@ bool const & BufferParams::fullAuthorList() const } +string BufferParams::getCiteAlias(string const & s) const +{ + vector commands = + documentClass().citeCommands(citeEngineType()); + // If it is a real command, don't treat it as an alias + if (find(commands.begin(), commands.end(), s) != commands.end()) + return string(); + map aliases = documentClass().citeCommandAliases(); + if (aliases.find(s) != aliases.end()) + return aliases[s]; + return string(); +} + + void BufferParams::setCiteEngine(string const & engine) { clearCiteEngine(); @@ -3286,7 +3395,7 @@ vector BufferParams::citeCommands() const vector commands = documentClass().citeCommands(citeEngineType()); if (commands.empty()) - commands.push_back(default_style.cmd); + commands.push_back(default_style.name); return commands; } @@ -3301,6 +3410,53 @@ vector BufferParams::citeStyles() const return styles; } + +string const BufferParams::bibtexCommand() const +{ + // Return document-specific setting if available + if (bibtex_command != "default") + return bibtex_command; + + // If we have "default" in document settings, consult the prefs + // 1. Japanese (uses a specific processor) + if (encoding().package() == Encoding::japanese) { + if (lyxrc.jbibtex_command != "automatic") + // Return the specified program, if "automatic" is not set + return lyxrc.jbibtex_command; + else if (!useBiblatex()) { + // With classic BibTeX, return pbibtex, jbibtex, bibtex + if (lyxrc.jbibtex_alternatives.find("pbibtex") != lyxrc.jbibtex_alternatives.end()) + return "pbibtex"; + if (lyxrc.jbibtex_alternatives.find("jbibtex") != lyxrc.jbibtex_alternatives.end()) + return "jbibtex"; + return "bibtex"; + } + } + // 2. All other languages + else if (lyxrc.bibtex_command != "automatic") + // Return the specified program, if "automatic" is not set + return lyxrc.bibtex_command; + + // 3. Automatic: find the most suitable for the current cite framework + if (useBiblatex()) { + // For Biblatex, we prefer biber (also for Japanese) + // and fall back to bibtex8 and, as last resort, bibtex + if (lyxrc.bibtex_alternatives.find("biber") != lyxrc.bibtex_alternatives.end()) + return "biber"; + else if (lyxrc.bibtex_alternatives.find("bibtex8") != lyxrc.bibtex_alternatives.end()) + return "bibtex8"; + } + return "bibtex"; +} + + +bool BufferParams::useBiblatex() const +{ + return theCiteEnginesList[citeEngine().list().front()] + ->getCiteFramework() == "biblatex"; +} + + void BufferParams::invalidateConverterCache() const { pimpl_->isExportCacheValid = false;