]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
Do not use \&@#^_~$ as lstinline delimiter, as suggested by Herbert
[lyx.git] / src / BufferParams.cpp
index 92fabd06c970f1203e9fd142ef3bb9d2e3b42b3d..c958a2dc5854933468b0fd2dc1d149a525f1ee6c 100644 (file)
@@ -37,6 +37,7 @@
 #include "VSpace.h"
 
 #include "frontends/alert.h"
+#include "insets/InsetListingsParams.h"
 
 #include "support/lyxalgo.h" // for lyx::count
 #include "support/convert.h"
@@ -351,6 +352,7 @@ BufferParams::BufferParams()
        graphicsDriver = "default";
        sides = TextClass::OneSide;
        columns = 1;
+       listings_params = string();
        pagestyle = "default";
        compressed = false;
        for (int iter = 0; iter < 4; ++iter) {
@@ -603,6 +605,17 @@ 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;
+               // 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();
+               }
        } else if (token == "\\papersides") {
                int psides;
                lex >> psides;
@@ -734,6 +747,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) {
@@ -851,7 +867,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() << ',';
        }
 
@@ -893,16 +909,15 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        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);
 
-               // 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") {
+               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();
@@ -912,7 +927,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        }
                        for (; it != end; ++it)
                                os << ',' << from_ascii(*it);
-                       if (doc_encoding != "tis620-0") {
+                       if (package == Encoding::inputenc) {
                                if (!encodings.empty())
                                        os << ',';
                                os << from_ascii(doc_encoding);
@@ -920,12 +935,24 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        os << "]{inputenc}\n";
                        texrow.newline();
                }
-       // utf8-plain is for XeTeX users (inputenc not desired)
-       } else if (inputenc != "default" && inputenc != "tis620-0" &&
-                  inputenc != "ascii" &&  inputenc != "utf8-plain") {
-               os << "\\usepackage[" << from_ascii(inputenc)
-                  << "]{inputenc}\n";
-               texrow.newline();
+               if (package == Encoding::CJK) {
+                       os << "\\usepackage{CJK}\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";
+                       texrow.newline();
+                       break;
+               }
        }
 
        // The encoding "armscii8" is only available when the package "armtex" is loaded.
@@ -935,6 +962,20 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                texrow.newline();
        }
 
+       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();
@@ -1165,16 +1206,6 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
 
        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";
-       }
-
        int const nlines =
                int(lyx::count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
        for (int j = 0; j != nlines; ++j) {
@@ -1377,10 +1408,17 @@ 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;
 }