X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferParams.cpp;h=57932680f5bdb2e33fc016e6f287df4f9d463aef;hb=e54ae72e5fac6f750c3f7972c74bb42b57f3a049;hp=e3f24f4088d556cf2c6a517c6bd7aff9c599e2c5;hpb=3db8583e2b505ef572237654ab7a73fa8dbc87a2;p=lyx.git diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp index e3f24f4088..57932680f5 100644 --- a/src/BufferParams.cpp +++ b/src/BufferParams.cpp @@ -39,14 +39,15 @@ #include "frontends/alert.h" #include "insets/InsetListingsParams.h" -#include "support/lyxalgo.h" // for lyx::count #include "support/convert.h" #include "support/Translator.h" #include +#include #include +using std::count; using std::endl; using std::string; using std::istringstream; @@ -474,11 +475,11 @@ string const BufferParams::readToken(Lexer & lex, string const & token) if (!getTextClass().isTeXClassAvailable()) { docstring const msg = bformat(_("The layout file requested by this document,\n" - "%1$s.layout,\n" - "is not usable. This is probably because a LaTeX\n" - "class or style file required by it is not\n" - "available. See the Customization documentation\n" - "for more information.\n"), from_utf8(classname)); + "%1$s.layout,\n" + "is not usable. This is probably because a LaTeX\n" + "class or style file required by it is not\n" + "available. See the Customization documentation\n" + "for more information.\n"), from_utf8(classname)); frontend::Alert::warning(_("Document class not available"), msg + _("LyX will not be able to produce output.")); } @@ -608,14 +609,7 @@ string const BufferParams::readToken(Lexer & lex, string const & token) } else if (token == "\\listings_params") { string par; lex >> par; - // validate par and produce a valid listings parameter string - try { - listings_params = InsetListingsParams(par).params(); - } catch (invalidParam & e) { - lyxerr << "Invalid parameter string " << par << endl; - lyxerr << e.what() << endl; - listings_params = string(); - } + listings_params = InsetListingsParams(par).params(); } else if (token == "\\papersides") { int psides; lex >> psides; @@ -748,7 +742,7 @@ void BufferParams::writeFile(ostream & os) const << "\n\\papersides " << sides << "\n\\paperpagestyle " << pagestyle << '\n'; if (!listings_params.empty()) - os << "\\listings_params \"" << + os << "\\listings_params \"" << InsetListingsParams(listings_params).encodedString() << "\"\n"; for (int i = 0; i < 4; ++i) { if (user_defined_bullet(i) != ITEMIZE_DEFAULTS[i]) { @@ -773,7 +767,10 @@ void BufferParams::writeFile(ostream & os) const AuthorList::Authors::const_iterator a_it = pimpl_->authorlist.begin(); AuthorList::Authors::const_iterator a_end = pimpl_->authorlist.end(); for (; a_it != a_end; ++a_it) { - os << "\\author " << a_it->second << "\n"; + if (a_it->second.used()) + os << "\\author " << a_it->second << "\n"; + else + os << "\\author " << Author() << "\n"; } } @@ -794,7 +791,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, } // custom, A3, B3 and B4 paper sizes need geometry - bool nonstandard_papersize = papersize == PAPER_B3 + bool nonstandard_papersize = papersize == PAPER_B3 || papersize == PAPER_B4 || papersize == PAPER_A3 || papersize == PAPER_CUSTOM; @@ -867,7 +864,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, language_options << ','; language_options << language->babel(); } - if (lyxrc.language_global_options) + if (lyxrc.language_global_options && !language_options.str().empty()) clsoptions << language_options.str() << ','; } @@ -899,68 +896,24 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, if (fontsDefaultFamily != "default") os << "\\renewcommand{\\familydefault}{\\" << from_ascii(fontsDefaultFamily) << "}\n"; + + // set font encoding // this one is not per buffer + // for arabic_arabi and farsi we also need to load the LAE and LFE encoding if (lyxrc.fontenc != "default") { - os << "\\usepackage[" << from_ascii(lyxrc.fontenc) - << "]{fontenc}\n"; - texrow.newline(); - } - - if (inputenc == "auto") { - string const doc_encoding = - language->encoding()->latexName(); - Encoding::Package const package = - language->encoding()->package(); - - // Create a list with all the input encodings used - // in the document - std::set encodings = - features.getEncodingSet(doc_encoding); - - if (!encodings.empty() || package == Encoding::inputenc) { - os << "\\usepackage["; - std::set::const_iterator it = encodings.begin(); - std::set::const_iterator const end = encodings.end(); - if (it != end) { - os << from_ascii(*it); - ++it; - } - for (; it != end; ++it) - os << ',' << from_ascii(*it); - if (package == Encoding::inputenc) { - if (!encodings.empty()) - os << ','; - os << from_ascii(doc_encoding); - } - os << "]{inputenc}\n"; - texrow.newline(); - } - if (package == Encoding::CJK) { - os << "\\usepackage{CJK}\n"; + if (language->lang() == "arabic_arabi" || language->lang() == "farsi") { + os << "\\usepackage[" << from_ascii(lyxrc.fontenc) + << ",LFE,LAE]{fontenc}\n"; texrow.newline(); - } - } else if (inputenc != "default") { - switch (language->encoding()->package()) { - case Encoding::none: - break; - case Encoding::inputenc: - os << "\\usepackage[" << from_ascii(inputenc) - << "]{inputenc}\n"; - texrow.newline(); - break; - case Encoding::CJK: - os << "\\usepackage{CJK}\n"; + } else { + os << "\\usepackage[" << from_ascii(lyxrc.fontenc) + << "]{fontenc}\n"; texrow.newline(); - break; } } - // The encoding "armscii8" is only available when the package "armtex" is loaded. - // armscii8 is used for Armenian. - if (language->encoding()->latexName() == "armscii8" || inputenc == "armscii8") { - os << "\\usepackage{armtex}\n"; - texrow.newline(); - } + // handle inputenc etc. + writeEncodingPreamble(os, features, texrow); if (!listings_params.empty()) { os << "\\usepackage{listings}\n"; @@ -1204,10 +1157,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features, lyxpreamble += from_utf8(features.getBabelOptions()); } - lyxpreamble += "\\makeatother\n"; + lyxpreamble += "\\makeatother\n\n"; int const nlines = - int(lyx::count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); + int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n')); for (int j = 0; j != nlines; ++j) { texrow.newline(); } @@ -1409,21 +1362,80 @@ string const BufferParams::dvips_options() const string const BufferParams::babelCall(string const & lang_opts) const { string lang_pack = lyxrc.language_package; - if (lang_pack == "\\usepackage{babel}") { - // suppress the babel call when there is no babel language defined - // for the document language in the lib/languages file and if no - // other languages are used - if (language->babel().empty() && lang_opts.empty()) - lang_pack.clear(); - if (!lyxrc.language_global_options && !lang_opts.empty()) - lang_pack = string("\\usepackage[") + lang_opts + "]{babel}"; - if (lyxrc.language_global_options) - return lang_pack; - } + if (lang_pack != "\\usepackage{babel}") + return lang_pack; + // suppress the babel call when there is no babel language defined + // for the document language in the lib/languages file and if no + // other languages are used (lang_opts is then empty) + if (lang_opts.empty()) + return string(); + if (!lyxrc.language_global_options) + return "\\usepackage[" + lang_opts + "]{babel}"; return lang_pack; } +void BufferParams::writeEncodingPreamble(odocstream & os, + LaTeXFeatures & features, TexRow & texrow) const +{ + if (inputenc == "auto") { + string const doc_encoding = + language->encoding()->latexName(); + Encoding::Package const package = + language->encoding()->package(); + + // Create a list with all the input encodings used + // in the document + std::set encodings = + features.getEncodingSet(doc_encoding); + + if (!encodings.empty() || package == Encoding::inputenc) { + os << "\\usepackage["; + std::set::const_iterator it = encodings.begin(); + std::set::const_iterator const end = encodings.end(); + if (it != end) { + os << from_ascii(*it); + ++it; + } + for (; it != end; ++it) + os << ',' << from_ascii(*it); + if (package == Encoding::inputenc) { + if (!encodings.empty()) + os << ','; + os << from_ascii(doc_encoding); + } + os << "]{inputenc}\n"; + texrow.newline(); + } + if (package == Encoding::CJK) { + os << "\\usepackage{CJK}\n"; + texrow.newline(); + } + } else if (inputenc != "default") { + switch (encoding().package()) { + case Encoding::none: + break; + case Encoding::inputenc: + os << "\\usepackage[" << from_ascii(inputenc) + << "]{inputenc}\n"; + texrow.newline(); + break; + case Encoding::CJK: + os << "\\usepackage{CJK}\n"; + texrow.newline(); + break; + } + } + + // The encoding "armscii8" is only available when the package "armtex" is loaded. + // armscii8 is used for Armenian. + if (language->encoding()->latexName() == "armscii8" || inputenc == "armscii8") { + os << "\\usepackage{armtex}\n"; + texrow.newline(); + } +} + + string const BufferParams::loadFonts(string const & rm, string const & sf, string const & tt, bool const & sc, bool const & osf,