#include "gettext.h"
#include "Language.h"
#include "LaTeXFeatures.h"
+#include "Messages.h"
#include "Color.h"
-#include "LyXFont.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 "insets/InsetListingsParams.h"
#include "support/lyxalgo.h" // for lyx::count
#include "support/convert.h"
#include <sstream>
-
-namespace lyx {
-
-using support::bformat;
-using support::rtrim;
-using support::tokenPos;
-
using std::endl;
using std::string;
using std::istringstream;
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 {
// 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;
}
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) {
{}
+docstring const BufferParams::B_(string const & l10n) const
+{
+ BOOST_ASSERT(language);
+ return getMessages(language->code()).get(l10n);
+}
+
+
AuthorList & BufferParams::authors()
{
return pimpl_->authorlist;
// 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"
"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"),
+ frontend::Alert::warning(_("Document class not available"),
msg + _("LyX will not be able to produce output."));
}
} else if (token == "\\begin_preamble") {
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;
<< "\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) {
{
os << "\\documentclass";
- LyXTextClass const & tclass = getLyXTextClass();
+ TextClass const & tclass = getTextClass();
ostringstream clsoptions; // the document class options.
// 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;
}
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() << ',';
}
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();
}
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);
os << "]{inputenc}\n";
texrow.newline();
}
- } else if (inputenc != "default" && inputenc != "tis620-0" &&
- inputenc != "ascii") {
- os << "\\usepackage[" << from_ascii(inputenc)
- << "]{inputenc}\n";
+ 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();
}
+ 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();
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) {
void BufferParams::useClassDefaults()
{
- LyXTextClass const & tclass = textclasslist[textclass];
+ TextClass const & tclass = textclasslist[textclass];
sides = tclass.sides();
columns = tclass.columns();
bool BufferParams::hasClassDefaults() const
{
- LyXTextClass const & tclass = textclasslist[textclass];
+ TextClass const & tclass = textclasslist[textclass];
return (sides == tclass.sides()
&& columns == tclass.columns()
}
-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;
}
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;
}
{
// 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_;