#include "frontends/alert.h"
#include "insets/InsetListingsParams.h"
-#include "support/lyxalgo.h" // for lyx::count
#include "support/convert.h"
#include "support/Translator.h"
#include <boost/array.hpp>
+#include <algorithm>
#include <sstream>
+using std::count;
using std::endl;
using std::string;
using std::istringstream;
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."));
}
} 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;
<< "\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]) {
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";
}
}
}
// 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;
language_options << ',';
language_options << language->babel();
}
- if (lyxrc.language_global_options)
+ if (lyxrc.language_global_options && !language_options.str().empty())
clsoptions << language_options.str() << ',';
}
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<string> encodings =
- features.getEncodingSet(doc_encoding);
-
- if (!encodings.empty() || package == Encoding::inputenc) {
- os << "\\usepackage[";
- std::set<string>::const_iterator it = encodings.begin();
- std::set<string>::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";
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();
}
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<string> encodings =
+ features.getEncodingSet(doc_encoding);
+
+ if (!encodings.empty() || package == Encoding::inputenc) {
+ os << "\\usepackage[";
+ std::set<string>::const_iterator it = encodings.begin();
+ std::set<string>::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,