X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=24613e5bf835d1d3d5c891149e0915e99a8ea120;hb=b64d17e9dcaeb84a94095622c93a051e4d93eab7;hp=b9854e5867bf1669d6fe37a62bb1bba380306966;hpb=a756403301ff8fb78df4dc1e131e4cd50cd976e1;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index b9854e5867..24613e5bf8 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -30,6 +30,7 @@ #include "IndicesList.h" #include "Language.h" #include "LaTeXFeatures.h" +#include "LaTeXFonts.h" #include "ModuleList.h" #include "Font.h" #include "Lexer.h" @@ -997,7 +998,7 @@ void BufferParams::writeFile(ostream & os) const if (!fonts_cjk.empty()) { os << "\\font_cjk " << fonts_cjk << '\n'; } - os << "\n\\graphics " << graphics_driver << '\n'; + os << "\\graphics " << graphics_driver << '\n'; os << "\\default_output_format " << default_output_format << '\n'; os << "\\output_sync " << output_sync << '\n'; if (!output_sync_macro.empty()) @@ -1244,14 +1245,14 @@ void BufferParams::validate(LaTeXFeatures & features) const features.require("color"); } + // some languages are only available via polyglossia if (features.runparams().flavor == OutputParams::XETEX - && useNonTeXFonts) + && (features.hasPolyglossiaExclusiveLanguages() + || useNonTeXFonts)) features.require("polyglossia"); - if (language->lang() == "vietnamese") - features.require("vietnamese"); - else if (language->lang() == "japanese") - features.require("japanese"); + if (!language->requires().empty()) + features.require(language->requires()); } @@ -1375,13 +1376,14 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, bool const use_polyglossia = features.usePolyglossia(); bool const global = lyxrc.language_global_options; if (use_babel || (use_polyglossia && global)) { - language_options << features.getLanguages(); + language_options << features.getBabelLanguages(); if (!language->babel().empty()) { if (!language_options.str().empty()) language_options << ','; language_options << language->babel(); } - if (global && !features.needBabelLangOptions()) + if (global && !features.needBabelLangOptions() + && !language_options.str().empty()) clsoptions << language_options.str() << ','; } @@ -1743,10 +1745,21 @@ 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)); + } lyxpreamble += "\\newindex["; - lyxpreamble += iit->index(); + lyxpreamble += indexname_latex.first; lyxpreamble += "]{"; - lyxpreamble += iit->shortcut(); + lyxpreamble += escape(iit->shortcut()); lyxpreamble += "}\n"; } } @@ -1781,6 +1794,11 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, // hyperref loads this automatically lyxpreamble += "\\usepackage{nameref}\n"; + // bibtopic needs to be loaded after hyperref. + // the dot provides the aux file naming which LyX can detect. + if (features.mustProvide("bibtopic")) + lyxpreamble += "\\usepackage[dot]{bibtopic}\n"; + // Will be surrounded by \makeatletter and \makeatother when not empty docstring atlyxpreamble; @@ -1906,6 +1924,15 @@ bool BufferParams::writeLaTeX(otexstream & os, LaTeXFeatures & features, } } + // Load custom language package here + if (features.langPackage() == LaTeXFeatures::LANG_PACK_CUSTOM) { + if (lang_package == "default") + lyxpreamble += from_utf8(lyxrc.language_custom_package); + else + lyxpreamble += from_utf8(lang_package); + lyxpreamble += '\n'; + } + docstring const i18npreamble = features.getTClassI18nPreamble(use_babel, use_polyglossia); if (!i18npreamble.empty()) @@ -1948,20 +1975,20 @@ bool BufferParams::hasClassDefaults() const DocumentClass const & BufferParams::documentClass() const { - return *doc_class_; + return *doc_class_.get(); } -DocumentClass const * BufferParams::documentClassPtr() const +DocumentClassConstPtr BufferParams::documentClassPtr() const { return doc_class_; } -void BufferParams::setDocumentClass(DocumentClass const * const tc) +void BufferParams::setDocumentClass(DocumentClassConstPtr tc) { // evil, but this function is evil - doc_class_ = const_cast(tc); + doc_class_ = const_pointer_cast(tc); } @@ -2032,7 +2059,7 @@ void BufferParams::makeDocumentClass() en = cite_engine_.end(); for (; it != en; ++it) mods.push_back(*it); - doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), mods)); + doc_class_ = getDocumentClass(*baseClass(), mods); if (!local_layout.empty()) { TextClass::ReturnValues success = @@ -2171,10 +2198,22 @@ OutputParams::FLAVOR BufferParams::getOutputFlavor(string const format) const OutputParams::FLAVOR result = OutputParams::LATEX; + // FIXME It'd be better not to hardcode this, but to do + // something with formats. if (dformat == "xhtml") result = OutputParams::HTML; else if (dformat == "text") result = OutputParams::TEXT; + else if (dformat == "lyx") + result = OutputParams::LYX; + else if (dformat == "pdflatex") + result = OutputParams::PDFLATEX; + else if (dformat == "xetex") + result = OutputParams::XETEX; + else if (dformat == "luatex") + result = OutputParams::LUATEX; + else if (dformat == "dviluatex") + result = OutputParams::DVILUATEX; else { // Try to determine flavor of default output format vector backs = backends(); @@ -2228,6 +2267,12 @@ Font const BufferParams::getFont() const } +InsetQuotes::QuoteLanguage BufferParams::getQuoteStyle(string const qs) const +{ + return quoteslangtranslator().find(qs); +} + + bool BufferParams::isLatex() const { return documentClass().outputType() == LATEX; @@ -2610,11 +2655,6 @@ string const BufferParams::font_encoding() const string BufferParams::babelCall(string const & lang_opts, bool const langoptions) const { - if (lang_package != "auto" && lang_package != "babel" - && lang_package != "default" && lang_package != "none") - return lang_package; - if (lyxrc.language_package_selection == LyXRC::LP_CUSTOM) - return lyxrc.language_custom_package; // suppress the babel call if there is no BabelName defined // for the document language in the lib/languages file and if no // other languages are used (lang_opts is then empty) @@ -2678,9 +2718,6 @@ void BufferParams::writeEncodingPreamble(otexstream & os, // If the "japanese" package (i.e. pLaTeX) is used, // inputenc must be omitted. // see http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg129680.html - if (package == Encoding::japanese) - features.require("japanese"); - if ((!encodings.empty() || package == Encoding::inputenc) && !features.isRequired("japanese")) { os << "\\usepackage["; @@ -2727,12 +2764,6 @@ void BufferParams::writeEncodingPreamble(otexstream & os, break; } } - - // The encoding "armscii8" (for Armenian) is only available when - // the package "armtex" is loaded. - if (language->encoding()->latexName() == "armscii8" - || inputenc == "armscii8") - os << "\\usepackage{armtex}\n"; } @@ -2754,17 +2785,7 @@ string const BufferParams::loadFonts(string const & rm, bool const & use_systemfonts, LaTeXFeatures & features) const { - /* The LaTeX font world is in a flux. In the PSNFSS font interface, - several packages have been replaced by others, that might not - be installed on every system. We have to take care for that - (see psnfss.pdf). We try to support all psnfss fonts as well - as the fonts that have become de facto standard in the LaTeX - world (e.g. Latin Modern). We do not support obsolete fonts - (like PSLatex). In general, it should be possible to mix any - rm font with any sf or tt font, respectively. (JSpitzm) - TODO: - -- separate math fonts. - */ + // TODO: separate math fonts. if (rm == "default" && sf == "default" && tt == "default") //nothing to do @@ -2826,115 +2847,19 @@ string const BufferParams::loadFonts(string const & rm, return os.str(); } + // Tex Fonts + bool const ot1 = (font_encoding() == "default" || font_encoding() == "OT1"); + bool const dryrun = features.runparams().dryrun; + bool const complete = (sf == "default" && tt == "default"); + // ROMAN FONTS - // Computer Modern (must be explicitly selectable -- there might be classes - // that define a different default font! - if (rm == "cmr") { - os << "\\renewcommand{\\rmdefault}{cmr}\n"; - // osf for Computer Modern needs eco.sty - if (osf) - os << "\\usepackage{eco}\n"; - } - // Latin Modern Roman - else if (rm == "lmodern") - os << "\\usepackage{lmodern}\n"; - // AE - else if (rm == "ae") { - // not needed when using OT1 font encoding. - if (font_encoding() != "default") - os << "\\usepackage{ae,aecompl}\n"; - } - // Times - else if (rm == "times") { - // try to load the best available package - if (LaTeXFeatures::isAvailable("mathptmx")) - os << "\\usepackage{mathptmx}\n"; - else if (LaTeXFeatures::isAvailable("mathptm")) - os << "\\usepackage{mathptm}\n"; - else - os << "\\usepackage{times}\n"; - } - // Palatino - else if (rm == "palatino") { - // try to load the best available package - if (LaTeXFeatures::isAvailable("mathpazo")) { - os << "\\usepackage"; - if (osf || sc) { - os << '['; - if (!osf) - os << "sc"; - else - // "osf" includes "sc"! - os << "osf"; - os << ']'; - } - os << "{mathpazo}\n"; - } - else if (LaTeXFeatures::isAvailable("mathpple")) - os << "\\usepackage{mathpple}\n"; - else - os << "\\usepackage{palatino}\n"; - } - // Utopia - else if (rm == "utopia") { - // fourier supersedes utopia.sty, but does - // not work with OT1 encoding. - if (LaTeXFeatures::isAvailable("fourier") - && font_encoding() != "default") { - os << "\\usepackage"; - if (osf || sc) { - os << '['; - if (sc) - os << "expert"; - if (osf && sc) - os << ','; - if (osf) - os << "oldstyle"; - os << ']'; - } - os << "{fourier}\n"; - } - else - os << "\\usepackage{utopia}\n"; - } - // Bera (complete fontset) - else if (rm == "bera" && sf == "default" && tt == "default") - os << "\\usepackage{bera}\n"; - // everything else - else if (rm != "default") - os << "\\usepackage" << "{" << rm << "}\n"; + os << theLaTeXFonts().getLaTeXFont(from_ascii(rm)).getLaTeXCode(dryrun, ot1, complete, sc, osf); // SANS SERIF - // Helvetica, Bera Sans - if (sf == "helvet" || sf == "berasans") { - if (sfscale != 100) - os << "\\usepackage[scaled=" << float(sfscale) / 100 - << "]{" << sf << "}\n"; - else - os << "\\usepackage{" << sf << "}\n"; - } - // Avant Garde - else if (sf == "avant") - os << "\\usepackage{" << sf << "}\n"; - // Computer Modern, Latin Modern, CM Bright - else if (sf != "default") - os << "\\renewcommand{\\sfdefault}{" << sf << "}\n"; - - // monospaced/typewriter - // Courier, LuxiMono - if (tt == "luximono" || tt == "beramono") { - if (ttscale != 100) - os << "\\usepackage[scaled=" << float(ttscale) / 100 - << "]{" << tt << "}\n"; - else - os << "\\usepackage{" << tt << "}\n"; - } - // Courier - else if (tt == "courier" ) - os << "\\usepackage{" << tt << "}\n"; - // Computer Modern, Latin Modern, CM Bright - else if (tt != "default") - os << "\\renewcommand{\\ttdefault}{" << tt << "}\n"; + os << theLaTeXFonts().getLaTeXFont(from_ascii(sf)).getLaTeXCode(dryrun, ot1, complete, sc, osf, sfscale); + + // MONOSPACED/TYPEWRITER + os << theLaTeXFonts().getLaTeXFont(from_ascii(tt)).getLaTeXCode(dryrun, ot1, complete, sc, osf, ttscale); return os.str(); }