]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Fixed some lines that were too long. It compiled afterwards.
[lyx.git] / src / BufferParams.cpp
index e3f24f4088d556cf2c6a517c6bd7aff9c599e2c5..57932680f5bdb2e33fc016e6f287df4f9d463aef 100644 (file)
 #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;
@@ -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<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";
@@ -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<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,