]> 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 85d09b5f3e0ee54d66b931c17d3eeb28d0f3c7d3..57932680f5bdb2e33fc016e6f287df4f9d463aef 100644 (file)
@@ -25,6 +25,7 @@
 #include "gettext.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
+#include "Messages.h"
 #include "Color.h"
 #include "Font.h"
 #include "Lexer.h"
 #include "VSpace.h"
 
 #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;
@@ -350,6 +353,7 @@ BufferParams::BufferParams()
        graphicsDriver = "default";
        sides = TextClass::OneSide;
        columns = 1;
+       listings_params = string();
        pagestyle = "default";
        compressed = false;
        for (int iter = 0; iter < 4; ++iter) {
@@ -363,6 +367,13 @@ BufferParams::~BufferParams()
 {}
 
 
+docstring const BufferParams::B_(string const & l10n) const
+{
+       BOOST_ASSERT(language);
+       return getMessages(language->code()).get(l10n);
+}
+
+
 AuthorList & BufferParams::authors()
 {
        return pimpl_->authorlist;
@@ -464,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."));
                }
@@ -595,6 +606,10 @@ string const BufferParams::readToken(Lexer & lex, string const & token)
                lex >> fontsize;
        } else if (token == "\\papercolumns") {
                lex >> columns;
+       } else if (token == "\\listings_params") {
+               string par;
+               lex >> par;
+               listings_params = InsetListingsParams(par).params();
        } else if (token == "\\papersides") {
                int psides;
                lex >> psides;
@@ -726,6 +741,9 @@ void BufferParams::writeFile(ostream & os) const
           << "\n\\papercolumns " << columns
           << "\n\\papersides " << sides
           << "\n\\paperpagestyle " << pagestyle << '\n';
+       if (!listings_params.empty())
+               os << "\\listings_params \"" <<
+                       InsetListingsParams(listings_params).encodedString() << "\"\n";
        for (int i = 0; i < 4; ++i) {
                if (user_defined_bullet(i) != ITEMIZE_DEFAULTS[i]) {
                        if (user_defined_bullet(i).getFont() != -1) {
@@ -749,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";
        }
 }
 
@@ -770,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;
@@ -838,8 +859,12 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        bool const use_babel = features.useBabel();
        if (use_babel) {
                language_options << features.getLanguages();
-               language_options << language->babel();
-               if (lyxrc.language_global_options)
+               if (!language->babel().empty()) {
+                       if (!language_options.str().empty())
+                               language_options << ',';
+                       language_options << language->babel();
+               }
+               if (lyxrc.language_global_options && !language_options.str().empty())
                        clsoptions << language_options.str() << ',';
        }
 
@@ -871,50 +896,39 @@ 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 (language->lang() == "arabic_arabi" || language->lang() == "farsi") {
+                       os << "\\usepackage[" << from_ascii(lyxrc.fontenc)
+                          << ",LFE,LAE]{fontenc}\n";
+                       texrow.newline();
+               } else {
+                       os << "\\usepackage[" << from_ascii(lyxrc.fontenc)
+                          << "]{fontenc}\n";
+                       texrow.newline();
+               }
        }
 
-       if (inputenc == "auto") {
-               string const doc_encoding =
-                       language->encoding()->latexName();
-
-               // Create a list with all the input encodings used
-               // in the document
-               std::set<string> encodings =
-                       features.getEncodingSet(doc_encoding);
+       // handle inputenc etc.
+       writeEncodingPreamble(os, features, texrow);
 
-               // thailatex does not use the inputenc package, but sets up
-               // babel directly for tis620-0 encoding, therefore we must
-               // not request inputenc for tis620-0 encoding
-               if (!encodings.empty() || doc_encoding != "tis620-0") {
-                       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 (doc_encoding != "tis620-0") {
-                               if (!encodings.empty())
-                                       os << ',';
-                               os << from_ascii(doc_encoding);
-                       }
-                       os << "]{inputenc}\n";
-                       texrow.newline();
-               }
-       } else if (inputenc != "default" && inputenc != "tis620-0" &&
-                  inputenc != "ascii") {
-               os << "\\usepackage[" << from_ascii(inputenc)
-                  << "]{inputenc}\n";
+       if (!listings_params.empty()) {
+               os << "\\usepackage{listings}\n";
+               texrow.newline();
+               os << "\\lstset{";
+               // do not test validity because listings_params is supposed to be valid
+               string par = InsetListingsParams(listings_params).separatedParams(true);
+               os << from_ascii(par);
+               // count the number of newlines
+               for (size_t i = 0; i < par.size(); ++i)
+                       if (par[i] == '\n')
+                               texrow.newline();
+               os << "}\n";
                texrow.newline();
        }
-
        if (use_geometry || nonstandard_papersize) {
                os << "\\usepackage{geometry}\n";
                texrow.newline();
@@ -1143,20 +1157,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                lyxpreamble += from_utf8(features.getBabelOptions());
        }
 
-       lyxpreamble += "\\makeatother\n";
-
-       // dvipost settings come after everything else
-       if (features.isAvailable("dvipost") && outputChanges) {
-               lyxpreamble +=
-                       "\\dvipostlayout\n"
-                       "\\dvipost{osstart color push Red}\n"
-                       "\\dvipost{osend color pop}\n"
-                       "\\dvipost{cbstart color push Blue}\n"
-                       "\\dvipost{cbend color pop}\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();
        }
@@ -1357,10 +1361,78 @@ string const BufferParams::dvips_options() const
 
 string const BufferParams::babelCall(string const & lang_opts) const
 {
-       string tmp = lyxrc.language_package;
-       if (!lyxrc.language_global_options && tmp == "\\usepackage{babel}")
-               tmp = string("\\usepackage[") + lang_opts + "]{babel}";
-       return tmp;
+       string lang_pack = lyxrc.language_package;
+       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();
+       }
 }