]> git.lyx.org Git - lyx.git/blobdiff - src/BufferParams.cpp
* Only enter inset which return true on isActive(). This is the behavior in the curso...
[lyx.git] / src / BufferParams.cpp
index 2fc2a5c79b0195d044684067599b7ea1ff2b816a..f1ef2b4f89c84b1607ba89ee1b48eebe0204f2bb 100644 (file)
 #include "gettext.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
-#include "LColor.h"
-#include "LyXFont.h"
-#include "LyXLex.h"
+#include "Messages.h"
+#include "Color.h"
+#include "Font.h"
+#include "Lexer.h"
 #include "LyXRC.h"
-#include "LyXTextClassList.h"
+#include "TextClassList.h"
 #include "OutputParams.h"
-#include "tex-strings.h"
 #include "Spacing.h"
 #include "TexRow.h"
 #include "VSpace.h"
 
-#include "frontends/Alert.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 "support/Translator.h"
 
 #include <boost/array.hpp>
 
 #include <sstream>
 
-
-namespace lyx {
-
-using support::bformat;
-using support::rtrim;
-using support::tokenPos;
-
 using std::endl;
 using std::string;
 using std::istringstream;
@@ -60,9 +54,45 @@ using std::ostream;
 using std::ostringstream;
 using std::pair;
 
-namespace Alert = lyx::frontend::Alert;
+using lyx::support::bformat;
+using lyx::support::rtrim;
+using lyx::support::tokenPos;
+
+
+static char const * const string_paragraph_separation[] = {
+       "indent", "skip", ""
+};
+
+
+static char const * const string_quotes_language[] = {
+       "english", "swedish", "german", "polish", "french", "danish", ""
+};
+
+
+static char const * const string_papersize[] = {
+       "default", "custom", "letterpaper", "executivepaper", "legalpaper",
+       "a3paper", "a4paper", "a5paper", "b3paper", "b4paper", "b5paper", ""
+};
+
+
+static char const * const string_orientation[] = {
+       "portrait", "landscape", ""
+};
 
 
+static char const * const string_footnotekinds[] = {
+       "footnote", "margin", "fig", "tab", "alg", "wide-fig", "wide-tab", ""
+};
+
+
+static char const * const tex_graphics[] = {
+       "default", "dvips", "dvitops", "emtex",
+       "ln", "oztex", "textures", "none", ""
+};
+
+
+namespace lyx {
+
 // Local translators
 namespace {
 
@@ -156,13 +186,13 @@ PaperOrientationTranslator const & paperorientationtranslator()
 
 
 // Page sides
-typedef Translator<int, LyXTextClass::PageSides> SidesTranslator;
+typedef Translator<int, TextClass::PageSides> SidesTranslator;
 
 
 SidesTranslator const init_sidestranslator()
 {
-       SidesTranslator translator(1, LyXTextClass::OneSide);
-       translator.addPair(2, LyXTextClass::TwoSides);
+       SidesTranslator translator(1, TextClass::OneSide);
+       translator.addPair(2, TextClass::TwoSides);
        return translator;
 }
 
@@ -320,8 +350,9 @@ BufferParams::BufferParams()
        fontsTypewriterScale = 100;
        inputenc = "auto";
        graphicsDriver = "default";
-       sides = LyXTextClass::OneSide;
+       sides = TextClass::OneSide;
        columns = 1;
+       listings_params = string();
        pagestyle = "default";
        compressed = false;
        for (int iter = 0; iter < 4; ++iter) {
@@ -335,6 +366,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;
@@ -411,7 +449,7 @@ void BufferParams::setDefSkip(VSpace const & vs)
 }
 
 
-string const BufferParams::readToken(LyXLex & lex, string const & token)
+string const BufferParams::readToken(Lexer & lex, string const & token)
 {
        if (token == "\\textclass") {
                lex.next();
@@ -433,15 +471,15 @@ string const BufferParams::readToken(LyXLex & lex, string const & token)
                // FIXME: isTeXClassAvailable will try to load the layout file, but will
                // fail because of the lack of path info. Warnings will be given although
                // the layout file will be correctly loaded later.
-               if (!getLyXTextClass().isTeXClassAvailable()) {
+               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));
-                       Alert::warning(_("Document class not available"),
+                                                "%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 == "\\begin_preamble") {
@@ -527,9 +565,9 @@ string const BufferParams::readToken(LyXLex & lex, string const & token)
                                string color = lex.getString();
                                if (branch_ptr)
                                        branch_ptr->setColor(color);
-                               // Update also the LColor table:
+                               // Update also the Color table:
                                if (color == "none")
-                                       color = lcolor.getX11Name(LColor::background);
+                                       color = lcolor.getX11Name(Color::background);
                                // FIXME UNICODE
                                lcolor.setColor(to_utf8(branch), color);
 
@@ -567,6 +605,17 @@ string const BufferParams::readToken(LyXLex & 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;
@@ -698,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) {
@@ -731,7 +783,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
 {
        os << "\\documentclass";
 
-       LyXTextClass const & tclass = getLyXTextClass();
+       TextClass const & tclass = getTextClass();
 
        ostringstream clsoptions; // the document class options.
 
@@ -742,7 +794,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;
@@ -779,10 +831,10 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
        // if needed
        if (sides != tclass.sides()) {
                switch (sides) {
-               case LyXTextClass::OneSide:
+               case TextClass::OneSide:
                        clsoptions << "oneside,";
                        break;
-               case LyXTextClass::TwoSides:
+               case TextClass::TwoSides:
                        clsoptions << "twoside,";
                        break;
                }
@@ -810,8 +862,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() << ',';
        }
 
@@ -850,43 +906,23 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                texrow.newline();
        }
 
-       if (inputenc == "auto") {
-               string const doc_encoding =
-                       language->encoding()->latexName();
+       // handle inputenc etc.
+       writeEncodingPreamble(os, features, texrow);
 
-               // 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") {
-                       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();
@@ -961,19 +997,19 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
                        }
                }
                if (!topmargin.empty())
-                       os << ",tmargin=" << from_ascii(LyXLength(topmargin).asLatexString());
+                       os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
                if (!bottommargin.empty())
-                       os << ",bmargin=" << from_ascii(LyXLength(bottommargin).asLatexString());
+                       os << ",bmargin=" << from_ascii(Length(bottommargin).asLatexString());
                if (!leftmargin.empty())
-                       os << ",lmargin=" << from_ascii(LyXLength(leftmargin).asLatexString());
+                       os << ",lmargin=" << from_ascii(Length(leftmargin).asLatexString());
                if (!rightmargin.empty())
-                       os << ",rmargin=" << from_ascii(LyXLength(rightmargin).asLatexString());
+                       os << ",rmargin=" << from_ascii(Length(rightmargin).asLatexString());
                if (!headheight.empty())
-                       os << ",headheight=" << from_ascii(LyXLength(headheight).asLatexString());
+                       os << ",headheight=" << from_ascii(Length(headheight).asLatexString());
                if (!headsep.empty())
-                       os << ",headsep=" << from_ascii(LyXLength(headsep).asLatexString());
+                       os << ",headsep=" << from_ascii(Length(headsep).asLatexString());
                if (!footskip.empty())
-                       os << ",footskip=" << from_ascii(LyXLength(footskip).asLatexString());
+                       os << ",footskip=" << from_ascii(Length(footskip).asLatexString());
                os << "}\n";
                texrow.newline();
        }
@@ -1117,16 +1153,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) {
@@ -1140,7 +1166,7 @@ bool BufferParams::writeLaTeX(odocstream & os, LaTeXFeatures & features,
 
 void BufferParams::useClassDefaults()
 {
-       LyXTextClass const & tclass = textclasslist[textclass];
+       TextClass const & tclass = textclasslist[textclass];
 
        sides = tclass.sides();
        columns = tclass.columns();
@@ -1156,7 +1182,7 @@ void BufferParams::useClassDefaults()
 
 bool BufferParams::hasClassDefaults() const
 {
-       LyXTextClass const & tclass = textclasslist[textclass];
+       TextClass const & tclass = textclasslist[textclass];
 
        return (sides == tclass.sides()
                && columns == tclass.columns()
@@ -1167,27 +1193,27 @@ bool BufferParams::hasClassDefaults() const
 }
 
 
-LyXTextClass const & BufferParams::getLyXTextClass() const
+TextClass const & BufferParams::getTextClass() const
 {
        return textclasslist[textclass];
 }
 
 
-LyXFont const BufferParams::getFont() const
+Font const BufferParams::getFont() const
 {
-       LyXFont f = getLyXTextClass().defaultfont();
+       Font f = getTextClass().defaultfont();
        f.setLanguage(language);
        if (fontsDefaultFamily == "rmdefault")
-               f.setFamily(LyXFont::ROMAN_FAMILY);
+               f.setFamily(Font::ROMAN_FAMILY);
        else if (fontsDefaultFamily == "sfdefault")
-               f.setFamily(LyXFont::SANS_FAMILY);
+               f.setFamily(Font::SANS_FAMILY);
        else if (fontsDefaultFamily == "ttdefault")
-               f.setFamily(LyXFont::TYPEWRITER_FAMILY);
+               f.setFamily(Font::TYPEWRITER_FAMILY);
        return f;
 }
 
 
-void BufferParams::readPreamble(LyXLex & lex)
+void BufferParams::readPreamble(Lexer & lex)
 {
        if (lex.getString() != "\\begin_preamble")
                lyxerr << "Error (BufferParams::readPreamble):"
@@ -1197,7 +1223,7 @@ void BufferParams::readPreamble(LyXLex & lex)
 }
 
 
-void BufferParams::readLanguage(LyXLex & lex)
+void BufferParams::readLanguage(Lexer & lex)
 {
        if (!lex.next()) return;
 
@@ -1215,7 +1241,7 @@ void BufferParams::readLanguage(LyXLex & lex)
 }
 
 
-void BufferParams::readGraphicsDriver(LyXLex & lex)
+void BufferParams::readGraphicsDriver(Lexer & lex)
 {
        if (!lex.next()) return;
 
@@ -1239,7 +1265,7 @@ void BufferParams::readGraphicsDriver(LyXLex & lex)
 }
 
 
-void BufferParams::readBullets(LyXLex & lex)
+void BufferParams::readBullets(Lexer & lex)
 {
        if (!lex.next()) return;
 
@@ -1257,7 +1283,7 @@ void BufferParams::readBullets(LyXLex & lex)
 }
 
 
-void BufferParams::readBulletsLaTeX(LyXLex & lex)
+void BufferParams::readBulletsLaTeX(Lexer & lex)
 {
        // The bullet class should be able to read this.
        if (!lex.next()) return;
@@ -1329,10 +1355,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 (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.
+       // armscii8 is used for Armenian.
+       if (language->encoding()->latexName() == "armscii8" || inputenc == "armscii8") {
+               os << "\\usepackage{armtex}\n";
+               texrow.newline();
+       }
 }
 
 
@@ -1491,7 +1585,7 @@ biblio::CiteEngine BufferParams::getEngine() const
 {
        // FIXME the class should provide the numerical/
        // authoryear choice
-       if (getLyXTextClass().provides("natbib")
+       if (getTextClass().provides("natbib")
            && cite_engine_ != biblio::ENGINE_NATBIB_NUMERICAL)
                return biblio::ENGINE_NATBIB_AUTHORYEAR;
        return cite_engine_;