X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=bb2391ca115926533f3487f9fd6c511f0ebb8dba;hb=dae6ca73df7acbf58f1bb6ad92cb71e386ad29c7;hp=6379c399e657b30896c42079181233198374c125;hpb=f4261030e208e9af74a38ed35fa809c90f920758;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index 6379c399e6..bb2391ca11 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -335,8 +335,7 @@ BufferParams::Impl::Impl() BufferParams::Impl * BufferParams::MemoryTraits::clone(BufferParams::Impl const * ptr) { - LASSERT(ptr, /**/); - + LBUFERR(ptr); return new BufferParams::Impl(*ptr); } @@ -376,6 +375,7 @@ BufferParams::BufferParams() fonts_roman = "default"; fonts_sans = "default"; fonts_typewriter = "default"; + fonts_math = "auto"; fonts_default_family = "default"; useNonTeXFonts = false; fonts_expert_sc = false; @@ -422,7 +422,7 @@ BufferParams::BufferParams() docstring BufferParams::B_(string const & l10n) const { - LASSERT(language, /**/); + LASSERT(language, return from_utf8(l10n)); return getMessages(language->code()).get(l10n); } @@ -442,18 +442,31 @@ void BufferParams::use_package(std::string const & p, BufferParams::Package u) } -vector const & BufferParams::auto_packages() +map const & BufferParams::auto_packages() { - static vector packages; + static map packages; if (packages.empty()) { // adding a package here implies a file format change! - packages.push_back("amsmath"); - packages.push_back("amssymb"); - packages.push_back("esint"); - packages.push_back("mathdots"); - packages.push_back("mathtools"); - packages.push_back("mhchem"); - packages.push_back("undertilde"); + packages["amsmath"] = + N_("The LaTeX package amsmath is only used if AMS formula types or symbols from the AMS math toolbars are inserted into formulas"); + packages["amssymb"] = + N_("The LaTeX package amssymb is only used if symbols from the AMS math toolbars are inserted into formulas"); + packages["cancel"] = + N_("The LaTeX package cancel is only used if \\cancel commands are used in formulas"); + packages["esint"] = + N_("The LaTeX package esint is only used if special integral symbols are inserted into formulas"); + packages["mathdots"] = + N_("The LaTeX package mathdots is only used if the command \\iddots is inserted into formulas"); + packages["mathtools"] = + N_("The LaTeX package mathtools is only used if some mathematical relations are inserted into formulas"); + packages["mhchem"] = + N_("The LaTeX package mhchem is only used if either the command \\ce or \\cf is inserted into formulas"); + packages["stackrel"] = + N_("The LaTeX package stackrel is only used if the command \\stackrel with subscript is inserted into formulas"); + packages["stmaryrd"] = + N_("The LaTeX package stmaryrd is only used if symbols from the St Mary's Road symbol font for theoretical computer science are inserted into formulas"); + packages["undertilde"] = + N_("The LaTeX package undertilde is only used if you use the math frame decoration 'utilde'"); } return packages; } @@ -497,28 +510,28 @@ IndicesList const & BufferParams::indiceslist() const Bullet & BufferParams::temp_bullet(lyx::size_type const index) { - LASSERT(index < 4, /**/); + LASSERT(index < 4, return pimpl_->temp_bullets[0]); return pimpl_->temp_bullets[index]; } Bullet const & BufferParams::temp_bullet(lyx::size_type const index) const { - LASSERT(index < 4, /**/); + LASSERT(index < 4, return pimpl_->temp_bullets[0]); return pimpl_->temp_bullets[index]; } Bullet & BufferParams::user_defined_bullet(lyx::size_type const index) { - LASSERT(index < 4, /**/); + LASSERT(index < 4, return pimpl_->temp_bullets[0]); return pimpl_->user_defined_bullets[index]; } Bullet const & BufferParams::user_defined_bullet(lyx::size_type const index) const { - LASSERT(index < 4, /**/); + LASSERT(index < 4, return pimpl_->temp_bullets[0]); return pimpl_->user_defined_bullets[index]; } @@ -584,8 +597,9 @@ string BufferParams::readToken(Lexer & lex, string const & token, // be available. string tcp; LayoutFileList & bcl = LayoutFileList::get(); - if (tcp.empty() && !filepath.empty()) + if (!filepath.empty()) tcp = bcl.addLocalLayout(classname, filepath.absFileName()); + // that returns non-empty if a "local" layout file is found. if (!tcp.empty()) setBaseClass(tcp); else @@ -663,6 +677,9 @@ string BufferParams::readToken(Lexer & lex, string const & token, } else if (token == "\\font_typewriter") { lex.eatLine(); fonts_typewriter = lex.getString(); + } else if (token == "\\font_math") { + lex.eatLine(); + fonts_math = lex.getString(); } else if (token == "\\font_default_family") { lex >> fonts_default_family; } else if (token == "\\use_non_tex_fonts") { @@ -811,10 +828,12 @@ string BufferParams::readToken(Lexer & lex, string const & token, lex.eatLine(); string color = lex.getString(); notefontcolor = lyx::rgbFromHexName(color); + lcolor.setColor("notefontcolor", color); } else if (token == "\\boxbgcolor") { lex.eatLine(); string color = lex.getString(); boxbgcolor = lyx::rgbFromHexName(color); + lcolor.setColor("boxbgcolor", color); } else if (token == "\\paperwidth") { lex >> paperwidth; } else if (token == "\\paperheight") { @@ -988,6 +1007,7 @@ void BufferParams::writeFile(ostream & os) const << "\n\\font_roman " << fonts_roman << "\n\\font_sans " << fonts_sans << "\n\\font_typewriter " << fonts_typewriter + << "\n\\font_math " << fonts_math << "\n\\font_default_family " << fonts_default_family << "\n\\use_non_tex_fonts " << convert(useNonTeXFonts) << "\n\\font_sc " << convert(fonts_expert_sc) @@ -1016,10 +1036,11 @@ void BufferParams::writeFile(ostream & os) const os << "\\papersize " << string_papersize[papersize] << "\n\\use_geometry " << convert(use_geometry); - vector const & packages = auto_packages(); - for (size_t i = 0; i < packages.size(); ++i) - os << "\n\\use_package " << packages[i] << ' ' - << use_package(packages[i]); + map const & packages = auto_packages(); + for (map::const_iterator it = packages.begin(); + it != packages.end(); ++it) + os << "\n\\use_package " << it->first << ' ' + << use_package(it->first); os << "\n\\cite_engine "; @@ -1158,6 +1179,9 @@ void BufferParams::validate(LaTeXFeatures & features) const { features.require(documentClass().requires()); + if (columns > 1 && language->rightToLeft()) + features.require("rtloutputdblcol"); + if (outputChanges) { bool dvipost = LaTeXFeatures::isAvailable("dvipost"); bool xcolorulem = LaTeXFeatures::isAvailable("ulem") && @@ -1251,6 +1275,9 @@ void BufferParams::validate(LaTeXFeatures & features) const || useNonTeXFonts)) features.require("polyglossia"); + if (useNonTeXFonts && fonts_math != "auto") + features.require("unicode-math"); + if (!language->requires().empty()) features.require(language->requires()); } @@ -1411,15 +1438,15 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, if (useNonTeXFonts && !ams.empty()) os << from_ascii(ams); - if (useNonTeXFonts) + if (useNonTeXFonts) { os << "\\usepackage{fontspec}\n"; + if (features.mustProvide("unicode-math") + && features.isAvailable("unicode-math")) + os << "\\usepackage{unicode-math}\n"; + } // font selection must be done before loading fontenc.sty - string const fonts = - loadFonts(fonts_roman, fonts_sans, fonts_typewriter, - fonts_expert_sc, fonts_old_figures, - fonts_sans_scale, fonts_typewriter_scale, - useNonTeXFonts, features); + string const fonts = loadFonts(features); if (!fonts.empty()) os << from_utf8(fonts); @@ -1433,15 +1460,27 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // XeTeX and LuaTeX (with OS fonts) work without fontenc if (font_encoding() != "default" && language->lang() != "japanese" && !useNonTeXFonts && !features.isProvided("fontenc")) { + docstring extra_encoding; + if (features.mustProvide("textgreek")) + extra_encoding += from_ascii("LGR"); + if (features.mustProvide("textcyr")) { + if (!extra_encoding.empty()) + extra_encoding.push_back(','); + extra_encoding += from_ascii("T2A"); + } + if (!extra_encoding.empty() && !font_encoding().empty()) + extra_encoding.push_back(','); size_t fars = language_options.str().find("farsi"); size_t arab = language_options.str().find("arabic"); if (language->lang() == "arabic_arabi" || language->lang() == "farsi" || fars != string::npos || arab != string::npos) { - os << "\\usepackage[" << from_ascii(font_encoding()) + os << "\\usepackage[" << extra_encoding + << from_ascii(font_encoding()) << ",LFE,LAE]{fontenc}\n"; } else { - os << "\\usepackage[" << from_ascii(font_encoding()) + os << "\\usepackage[" << extra_encoding + << from_ascii(font_encoding()) << "]{fontenc}\n"; } } @@ -1724,10 +1763,12 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // 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 we use hyperref, jurabib, japanese, varioref or vietnamese, + // we have to call babel before if (use_babel && (features.isRequired("jurabib") || features.isRequired("hyperref") + || features.isRequired("varioref") || features.isRequired("vietnamese") || features.isRequired("japanese"))) { // FIXME UNICODE @@ -1886,9 +1927,10 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, + atlyxpreamble + "\\makeatother\n\n"; // We try to load babel late, in case it interferes with other packages. - // Jurabib and Hyperref have to be called after babel, though. + // Jurabib, hyperref and varioref have to be called after babel, though. if (use_babel && !features.isRequired("jurabib") && !features.isRequired("hyperref") + && !features.isRequired("varioref") && !features.isRequired("vietnamese") && !features.isRequired("japanese")) { // FIXME UNICODE @@ -2048,17 +2090,16 @@ void BufferParams::makeDocumentClass() return; LayoutModuleList mods; - LayoutModuleList::iterator it; - LayoutModuleList::iterator en; - - it = layout_modules_.begin(); - en = layout_modules_.end(); + LayoutModuleList::iterator it = layout_modules_.begin(); + LayoutModuleList::iterator en = layout_modules_.end(); for (; it != en; ++it) mods.push_back(*it); + it = cite_engine_.begin(); en = cite_engine_.end(); for (; it != en; ++it) mods.push_back(*it); + doc_class_ = getDocumentClass(*baseClass(), mods); if (!local_layout.empty()) { @@ -2072,10 +2113,15 @@ void BufferParams::makeDocumentClass() } -bool BufferParams::moduleCanBeAdded(string const & modName) const +bool BufferParams::layoutModuleCanBeAdded(string const & modName) const { - return cite_engine_.moduleCanBeAdded(modName, baseClass()) && - layout_modules_.moduleCanBeAdded(modName, baseClass()); + return layout_modules_.moduleCanBeAdded(modName, baseClass()); +} + + +bool BufferParams::citationModuleCanBeAdded(string const & modName) const +{ + return cite_engine_.moduleCanBeAdded(modName, baseClass()); } @@ -2115,13 +2161,6 @@ bool BufferParams::isExportable(string const & format) const } -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(); @@ -2138,7 +2177,6 @@ vector BufferParams::exportableFormats(bool only_viewable) const theConverters().getReachable(*it, only_viewable, false, excludes); result.insert(result.end(), r.begin(), r.end()); } - sort(result.begin(), result.end(), formatSorter); return result; } @@ -2174,8 +2212,11 @@ vector BufferParams::backends() const v.push_back("xetex"); } else if (buffmt == "xetex") { v.push_back("xetex"); - v.push_back("luatex"); - v.push_back("dviluatex"); + // FIXME: need to test all languages (bug 8205) + if (!language || !language->isPolyglossiaExclusive()) { + v.push_back("luatex"); + v.push_back("dviluatex"); + } } else v.push_back(buffmt); @@ -2752,7 +2793,7 @@ void BufferParams::writeEncodingPreamble(otexstream & os, // do not load inputenc if japanese is used if (features.isRequired("japanese")) break; - os << "\\usepackage[" << from_ascii(inputenc) + os << "\\usepackage[" << from_ascii(encoding().latexName()) << "]{inputenc}\n"; break; case Encoding::CJK: @@ -2778,16 +2819,11 @@ string const BufferParams::parseFontName(string const & name) const } -string const BufferParams::loadFonts(string const & rm, - string const & sf, string const & tt, - bool const & sc, bool const & osf, - int const & sfscale, int const & ttscale, - bool const & use_systemfonts, - LaTeXFeatures & features) const +string const BufferParams::loadFonts(LaTeXFeatures & features) const { - // TODO: separate math fonts. - - if (rm == "default" && sf == "default" && tt == "default") + if (fonts_roman == "default" && fonts_sans == "default" + && fonts_typewriter == "default" + && (fonts_math == "default" || fonts_math == "auto")) //nothing to do return string(); @@ -2803,7 +2839,7 @@ string const BufferParams::loadFonts(string const & rm, * -- if there's a way to find out if a font really supports * OldStyle, enable/disable the widget accordingly. */ - if (use_systemfonts && features.isAvailable("fontspec")) { + if (useNonTeXFonts && 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" @@ -2816,28 +2852,28 @@ string const BufferParams::loadFonts(string const & rm, string const texmapping = (features.runparams().flavor == OutputParams::XETEX) ? "Mapping=tex-text" : "Ligatures=TeX"; - if (rm != "default") { + if (fonts_roman != "default") { os << "\\setmainfont[" << texmapping; - if (osf) + if (fonts_old_figures) os << ",Numbers=OldStyle"; - os << "]{" << parseFontName(rm) << "}\n"; + os << "]{" << parseFontName(fonts_roman) << "}\n"; } - if (sf != "default") { - string const sans = parseFontName(sf); - if (sfscale != 100) + if (fonts_sans != "default") { + string const sans = parseFontName(fonts_sans); + if (fonts_sans_scale != 100) os << "\\setsansfont[Scale=" - << float(sfscale) / 100 + << float(fonts_sans_scale) / 100 << "," << texmapping << "]{" << sans << "}\n"; else os << "\\setsansfont[" << texmapping << "]{" << sans << "}\n"; } - if (tt != "default") { - string const mono = parseFontName(tt); - if (ttscale != 100) + if (fonts_typewriter != "default") { + string const mono = parseFontName(fonts_typewriter); + if (fonts_typewriter_scale != 100) os << "\\setmonofont[Scale=" - << float(ttscale) / 100 + << float(fonts_typewriter_scale) / 100 << "]{" << mono << "}\n"; else @@ -2850,16 +2886,28 @@ string const BufferParams::loadFonts(string const & rm, // Tex Fonts bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1"); bool const dryrun = features.runparams().dryrun; - bool const complete = (sf == "default" && tt == "default"); + bool const complete = (fonts_sans == "default" && fonts_typewriter == "default"); + bool const nomath = (fonts_math == "default"); // ROMAN FONTS - os << theLaTeXFonts().getLaTeXFont(from_ascii(rm)).getLaTeXCode(dryrun, ot1, complete, sc, osf); + os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_roman)).getLaTeXCode( + dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures, + nomath); // SANS SERIF - os << theLaTeXFonts().getLaTeXFont(from_ascii(sf)).getLaTeXCode(dryrun, ot1, complete, sc, osf, sfscale); + os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_sans)).getLaTeXCode( + dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures, + nomath, fonts_sans_scale); // MONOSPACED/TYPEWRITER - os << theLaTeXFonts().getLaTeXFont(from_ascii(tt)).getLaTeXCode(dryrun, ot1, complete, sc, osf, ttscale); + os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_typewriter)).getLaTeXCode( + dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures, + nomath, fonts_typewriter_scale); + + // MATH + os << theLaTeXFonts().getLaTeXFont(from_ascii(fonts_math)).getLaTeXCode( + dryrun, ot1, complete, fonts_expert_sc, fonts_old_figures, + nomath); return os.str(); } @@ -2872,10 +2920,10 @@ Encoding const & BufferParams::encoding() const // This check will not work with XeTeX/LuaTeX and tex fonts. // Thus we have to reset the encoding in Buffer::makeLaTeXFile. if (useNonTeXFonts) - return *(encodings.fromLaTeXName("utf8-plain")); + return *(encodings.fromLyXName("utf8-plain")); if (inputenc == "auto" || inputenc == "default") return *language->encoding(); - Encoding const * const enc = encodings.fromLaTeXName(inputenc); + Encoding const * const enc = encodings.fromLyXName(inputenc); if (enc) return *enc; LYXERR0("Unknown inputenc value `" << inputenc