// Cite engine
-typedef Translator<string, CiteEngine> CiteEngineTranslator;
+typedef Translator<string, CiteEngineType> CiteEngineTypeTranslator;
-CiteEngineTranslator const init_citeenginetranslator()
+CiteEngineTypeTranslator const init_citeenginetypetranslator()
{
- CiteEngineTranslator translator("basic", ENGINE_BASIC);
- translator.addPair("natbib_numerical", ENGINE_NATBIB_NUMERICAL);
- translator.addPair("natbib_authoryear", ENGINE_NATBIB_AUTHORYEAR);
- translator.addPair("jurabib", ENGINE_JURABIB);
+ CiteEngineTypeTranslator translator("authoryear", ENGINE_TYPE_AUTHORYEAR);
+ translator.addPair("numerical", ENGINE_TYPE_NUMERICAL);
return translator;
}
-CiteEngineTranslator const & citeenginetranslator()
+CiteEngineTypeTranslator const & citeenginetypetranslator()
{
- static CiteEngineTranslator translator = init_citeenginetranslator();
+ static CiteEngineTypeTranslator translator = init_citeenginetypetranslator();
return translator;
}
papersize = PAPER_DEFAULT;
orientation = ORIENTATION_PORTRAIT;
use_geometry = false;
- use_amsmath = package_auto;
- use_esint = package_auto;
- use_mhchem = package_auto;
- use_mathdots = package_auto;
- use_undertilde = package_auto;
- cite_engine_ = ENGINE_BASIC;
+ cite_engine_.push_back("basic");
+ cite_engine_type_ = ENGINE_TYPE_NUMERICAL;
+ biblio_style = "plain";
use_bibtopic = false;
use_indices = false;
trackChanges = false;
listings_params = string();
pagestyle = "default";
suppress_date = false;
+ justification = true;
// no color is the default (white)
backgroundcolor = lyx::rgbFromHexName("#ffffff");
isbackgroundcolor = false;
}
+BufferParams::Package BufferParams::use_package(std::string const & p) const
+{
+ PackageMap::const_iterator it = use_packages.find(p);
+ if (it == use_packages.end())
+ return package_auto;
+ return it->second;
+}
+
+
+void BufferParams::use_package(std::string const & p, BufferParams::Package u)
+{
+ use_packages[p] = u;
+}
+
+
+vector<string> const & BufferParams::auto_packages()
+{
+ static vector<string> packages;
+ if (packages.empty()) {
+ // adding a package here implies a file format change!
+ packages.push_back("amsmath");
+ packages.push_back("esint");
+ packages.push_back("mathdots");
+ packages.push_back("mathtools");
+ packages.push_back("mhchem");
+ packages.push_back("undertilde");
+ }
+ return packages;
+}
+
+
AuthorList & BufferParams::authors()
{
return pimpl_->authorlist;
lex.next();
string const classname = lex.getString();
// if there exists a local layout file, ignore the system one
- // NOTE: in this case, the textclass (.cls file) is assumed to
+ // NOTE: in this case, the textclass (.cls file) is assumed to
// be available.
string tcp;
LayoutFileList & bcl = LayoutFileList::get();
setBaseClass(tcp);
else
setBaseClass(classname);
- // We assume that a tex class exists for local or unknown
+ // We assume that a tex class exists for local or unknown
// layouts so this warning, will only be given for system layouts.
if (!baseClass()->isTeXClassAvailable()) {
- docstring const desc =
+ docstring const desc =
translateIfPossible(from_utf8(baseClass()->description()));
- docstring const prereqs =
+ docstring const prereqs =
from_utf8(baseClass()->prerequisites());
docstring const msg =
bformat(_("The selected document class\n"
master = lex.getString();
} else if (token == "\\suppress_date") {
lex >> suppress_date;
+ } else if (token == "\\justification") {
+ lex >> justification;
} else if (token == "\\language") {
readLanguage(lex);
} else if (token == "\\language_package") {
papersize = papersizetranslator().find(ppsize);
} else if (token == "\\use_geometry") {
lex >> use_geometry;
- } else if (token == "\\use_amsmath") {
- int use_ams;
- lex >> use_ams;
- use_amsmath = packagetranslator().find(use_ams);
- } else if (token == "\\use_esint") {
- int useesint;
- lex >> useesint;
- use_esint = packagetranslator().find(useesint);
- } else if (token == "\\use_mhchem") {
- int usemhchem;
- lex >> usemhchem;
- use_mhchem = packagetranslator().find(usemhchem);
- } else if (token == "\\use_mathdots") {
- int usemathdots;
- lex >> usemathdots;
- use_mathdots = packagetranslator().find(usemathdots);
- } else if (token == "\\use_undertilde") {
- int useundertilde;
- lex >> useundertilde;
- use_undertilde = packagetranslator().find(useundertilde);
+ } else if (token == "\\use_package") {
+ string package;
+ int use;
+ lex >> package;
+ lex >> use;
+ use_package(package, packagetranslator().find(use));
} else if (token == "\\cite_engine") {
- string engine;
- lex >> engine;
- cite_engine_ = citeenginetranslator().find(engine);
+ lex.eatLine();
+ vector<string> engine = getVectorFromString(lex.getString());
+ setCiteEngine(engine);
+ } else if (token == "\\cite_engine_type") {
+ string engine_type;
+ lex >> engine_type;
+ cite_engine_type_ = citeenginetypetranslator().find(engine_type);
+ } else if (token == "\\biblio_style") {
+ lex.eatLine();
+ biblio_style = lex.getString();
} else if (token == "\\use_bibtopic") {
lex >> use_bibtopic;
} else if (token == "\\use_indices") {
} else if (token == "\\use_refstyle") {
lex >> use_refstyle;
} else {
- lyxerr << "BufferParams::readToken(): Unknown token: " <<
+ lyxerr << "BufferParams::readToken(): Unknown token: " <<
token << endl;
return token;
}
}
// use the class options defined in the layout?
- os << "\\use_default_options "
+ os << "\\use_default_options "
<< convert<string>(use_default_options) << "\n";
// the master document
if (!master.empty()) {
os << "\\master " << master << '\n';
}
-
+
// removed modules
if (!removed_modules_.empty()) {
os << "\\begin_removed_modules" << '\n';
// local layout information
if (!local_layout.empty()) {
- // remove '\n' from the end
+ // remove '\n' from the end
string const tmplocal = rtrim(local_layout, "\n");
os << "\\begin_local_layout\n"
<< tmplocal
pdfoptions().writeFile(os);
os << "\\papersize " << string_papersize[papersize]
- << "\n\\use_geometry " << convert<string>(use_geometry)
- << "\n\\use_amsmath " << use_amsmath
- << "\n\\use_esint " << use_esint
- << "\n\\use_mhchem " << use_mhchem
- << "\n\\use_mathdots " << use_mathdots
- << "\n\\use_undertilde " << use_undertilde
- << "\n\\cite_engine " << citeenginetranslator().find(cite_engine_)
+ << "\n\\use_geometry " << convert<string>(use_geometry);
+ vector<string> const & packages = auto_packages();
+ for (size_t i = 0; i < packages.size(); ++i)
+ os << "\n\\use_package " << packages[i] << ' '
+ << use_package(packages[i]);
+
+ os << "\n\\cite_engine ";
+
+ if (!cite_engine_.empty()) {
+ LayoutModuleList::const_iterator be = cite_engine_.begin();
+ LayoutModuleList::const_iterator en = cite_engine_.end();
+ for (LayoutModuleList::const_iterator it = be; it != en; ++it) {
+ if (it != be)
+ os << ',';
+ os << *it;
+ }
+ } else {
+ os << "basic";
+ }
+
+ os << "\n\\cite_engine_type " << citeenginetypetranslator().find(cite_engine_type_)
+ << "\n\\biblio_style " << biblio_style
<< "\n\\use_bibtopic " << convert<string>(use_bibtopic)
<< "\n\\use_indices " << convert<string>(use_indices)
<< "\n\\paperorientation " << string_orientation[orientation]
<< "\n\\suppress_date " << convert<string>(suppress_date)
- << "\n\\use_refstyle " << use_refstyle
+ << "\n\\justification " << convert<string>(justification)
+ << "\n\\use_refstyle " << use_refstyle
<< '\n';
if (isbackgroundcolor == true)
os << "\\backgroundcolor " << lyx::X11hexname(backgroundcolor) << '\n';
os << "\\footskip "
<< VSpace(footskip).asLyXCommand() << '\n';
if (!columnsep.empty())
- os << "\\columnsep "
+ os << "\\columnsep "
<< VSpace(columnsep).asLyXCommand() << '\n';
os << "\\secnumdepth " << secnumdepth
<< "\n\\tocdepth " << tocdepth
<< "\\html_math_output " << html_math_output << '\n'
<< "\\html_css_as_file " << html_css_as_file << '\n'
<< "\\html_be_strict " << convert<string>(html_be_strict) << '\n';
-
+
if (html_math_img_scale != 1.0)
os << "\\html_math_img_scale " << convert<string>(html_math_img_scale) << '\n';
if (!html_latex_start.empty())
features.require("ulem");
features.require("xcolor");
// improves color handling in PDF output
- features.require("pdfcolmk");
+ features.require("pdfcolmk");
} else {
features.require("ct-none");
}
if (float_placement.find('H') != string::npos)
features.require("float");
- // AMS Style is at document level
- if (use_amsmath == package_on
- || documentClass().provides("amsmath"))
- features.require("amsmath");
- if (use_esint == package_on)
- features.require("esint");
- if (use_mhchem == package_on)
- features.require("mhchem");
- if (use_mathdots == package_on)
- features.require("mathdots");
- if (use_undertilde == package_on)
- features.require("undertilde");
+ for (PackageMap::const_iterator it = use_packages.begin();
+ it != use_packages.end(); ++it) {
+ if (it->first == "amsmath") {
+ // AMS Style is at document level
+ if (it->second == package_on ||
+ documentClass().provides("amsmath"))
+ features.require(it->first);
+ } else if (it->second == package_on)
+ features.require(it->first);
+ }
// Document-level line spacing
if (spacing().getSpace() != Spacing::Single && !spacing().isDefault())
// the bullet shapes are buffer level not paragraph level
// so they are tested here
for (int i = 0; i < 4; ++i) {
- if (user_defined_bullet(i) == ITEMIZE_DEFAULTS[i])
+ if (user_defined_bullet(i) == ITEMIZE_DEFAULTS[i])
continue;
int const font = user_defined_bullet(i).getFont();
if (font == 0) {
mangledFileName();
if (!features.runparams().nice)
incfile = mangled;
- // \includeonly doesn't want an extension
+ // \includeonly doesn't want an extension
incfile = changeExtension(incfile, string());
incfile = support::latex_path(incfile);
if (!incfile.empty()) {
if (!listings_params.empty()) {
os << "\\lstset{";
- // do not test validity because listings_params is
+ // do not test validity because listings_params is
// supposed to be valid
string par =
InsetListingsParams(listings_params).separatedParams(true);
case PAPER_JISB6:
ods << ",b6j";
break;
- default:
- // default papersize ie PAPER_DEFAULT
- switch (lyxrc.default_papersize) {
- case PAPER_DEFAULT: // keep compiler happy
- break;
- case PAPER_USLETTER:
- ods << ",letterpaper";
- break;
- case PAPER_USLEGAL:
- ods << ",legalpaper";
- break;
- case PAPER_USEXECUTIVE:
- ods << ",executivepaper";
- break;
- case PAPER_A3:
- ods << ",a3paper";
- break;
- case PAPER_A4:
- ods << ",a4paper";
- break;
- case PAPER_A5:
- ods << ",a5paper";
- break;
- case PAPER_B5:
- ods << ",b5paper";
- break;
- case PAPER_A0:
- case PAPER_A1:
- case PAPER_A2:
- case PAPER_A6:
- case PAPER_B0:
- case PAPER_B1:
- case PAPER_B2:
- case PAPER_B3:
- case PAPER_B4:
- case PAPER_B6:
- case PAPER_C0:
- case PAPER_C1:
- case PAPER_C2:
- case PAPER_C3:
- case PAPER_C4:
- case PAPER_C5:
- case PAPER_C6:
- case PAPER_JISB0:
- case PAPER_JISB1:
- case PAPER_JISB2:
- case PAPER_JISB3:
- case PAPER_JISB4:
- case PAPER_JISB5:
- case PAPER_JISB6:
- case PAPER_CUSTOM:
- break;
- }
+ case PAPER_DEFAULT:
+ break;
}
docstring const g_options = trim(ods.str(), ",");
os << "\\usepackage";
if (isbackgroundcolor == true) {
// only require color here, the background color will be defined
// in LaTeXFeatures.cpp to avoid interferences with the LaTeX
- // package pdfpages
+ // package pdfpages
features.require("color");
features.require("pagecolor");
}
if (isfontcolor == true) {
// only require color here, the font color will be defined
// in LaTeXFeatures.cpp to avoid interferences with the LaTeX
- // package pdfpages
+ // package pdfpages
features.require("color");
features.require("fontcolor");
}
// we decided therefore to load color always before babel, see
// http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg144349.html
lyxpreamble += from_ascii(features.getColorOptions());
-
+
// If we use hyperref, jurabib, japanese, or vietnamese, we have to call babel before them.
if (use_babel
&& (features.isRequired("jurabib")
// avoid errors with algorithm floats.
// use hyperref explicitly if it is required
if (features.isRequired("hyperref")) {
- // pass what we have to stream here, since we need
+ // pass what we have to stream here, since we need
// to access the stream itself in PDFOptions.
os << lyxpreamble;
lyxpreamble += "[" + from_ascii(language->polyglossiaOpts()) + "]";
lyxpreamble += "{" + from_ascii(language->polyglossia()) + "}\n";
// now setup the other languages
- std::map<std::string, std::string> const polylangs =
+ std::map<std::string, std::string> const polylangs =
features.getPolyglossiaLanguages();
for (std::map<std::string, std::string>::const_iterator mit = polylangs.begin();
mit != polylangs.end() ; ++mit) {
LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
LayoutFileList & bcl = LayoutFileList::get();
if (!bcl.haveClass(classname)) {
- docstring s =
+ docstring s =
bformat(_("The layout file:\n"
"%1$s\n"
"could not be found. A default textclass with default\n"
bool const success = bcl[classname].load();
if (!success) {
- docstring s =
+ docstring s =
bformat(_("Due to some error in it, the layout file:\n"
"%1$s\n"
"could not be loaded. A default textclass with default\n"
{
if (LayoutFileList::get().haveClass(pimpl_->baseClass_))
return &(LayoutFileList::get()[pimpl_->baseClass_]);
- else
+ else
return 0;
}
if (!baseClass())
return;
- doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), layout_modules_));
+ LayoutModuleList mods;
+ LayoutModuleList::iterator it;
+ LayoutModuleList::iterator en;
+
+ it = layout_modules_.begin();
+ en = layout_modules_.end();
+ for (; it != en; it++)
+ mods.push_back(*it);
+ it = cite_engine_.begin();
+ en = cite_engine_.end();
+ for (; it != en; it++)
+ mods.push_back(*it);
+ doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), mods));
if (!local_layout.empty()) {
TextClass::ReturnValues success =
bool BufferParams::moduleCanBeAdded(string const & modName) const
{
- return layout_modules_.moduleCanBeAdded(modName, baseClass());
+ return cite_engine_.moduleCanBeAdded(modName, baseClass()) &&
+ layout_modules_.moduleCanBeAdded(modName, baseClass());
}
LayoutModuleList::const_iterator it = layout_modules_.begin();
LayoutModuleList::const_iterator end = layout_modules_.end();
for (; it != end; it++)
- if (*it == modName)
+ if (*it == modName)
return false;
layout_modules_.push_back(modName);
return true;
}
+namespace {
+bool formatSorter(Format const * lhs, Format const * rhs) {
+ return _(lhs->prettyname()) < _(rhs->prettyname());
+}
+}
+
+
vector<Format const *> BufferParams::exportableFormats(bool only_viewable) const
{
vector<string> const backs = backends();
theConverters().getReachable(*it, only_viewable, false, excludes);
result.insert(result.end(), r.begin(), r.end());
}
+ sort(result.begin(), result.end(), formatSorter);
return result;
}
bool BufferParams::isExportableFormat(string const & format) const
{
- typedef vector<Format const *> Formats;
- Formats formats;
- formats = exportableFormats(true);
- Formats::const_iterator fit = formats.begin();
- Formats::const_iterator end = formats.end();
- for (; fit != end ; ++fit) {
- if ((*fit)->name() == format)
- return true;
- }
- return false;
+ typedef vector<Format const *> Formats;
+ Formats formats;
+ formats = exportableFormats(true);
+ Formats::const_iterator fit = formats.begin();
+ Formats::const_iterator end = formats.end();
+ for (; fit != end ; ++fit) {
+ if ((*fit)->name() == format)
+ return true;
+ }
+ return false;
}
vector<string> BufferParams::backends() const
{
vector<string> v;
- v.push_back(bufferFormat());
+ string const buffmt = bufferFormat();
+
// FIXME: Don't hardcode format names here, but use a flag
- if (v.back() == "latex") {
- v.push_back("pdflatex");
+ if (buffmt == "latex") {
+ if (!useNonTeXFonts) {
+ v.push_back("pdflatex");
+ v.push_back("latex");
+ }
v.push_back("luatex");
v.push_back("dviluatex");
v.push_back("xetex");
- } else if (v.back() == "xetex") {
+ } else if (buffmt == "xetex") {
+ v.push_back("xetex");
v.push_back("luatex");
v.push_back("dviluatex");
- }
+ } else
+ v.push_back(buffmt);
+
v.push_back("xhtml");
v.push_back("text");
v.push_back("lyx");
if (dformat == "xhtml")
result = OutputParams::HTML;
+ else if (dformat == "text")
+ result = OutputParams::TEXT;
else {
// Try to determine flavor of default output format
vector<string> backs = backends();
void BufferParams::readGraphicsDriver(Lexer & lex)
{
- if (!lex.next())
+ if (!lex.next())
return;
string const tmptok = lex.getString();
void BufferParams::readBullets(Lexer & lex)
{
- if (!lex.next())
+ if (!lex.next())
return;
int const index = lex.getInteger();
void BufferParams::readBulletsLaTeX(Lexer & lex)
{
// The bullet class should be able to read this.
- if (!lex.next())
+ if (!lex.next())
return;
int const index = lex.getInteger();
lex.next(true);
removed_modules_.push_back(mod);
lex.eatLine();
}
- // now we want to remove any removed modules that were previously
- // added. normally, that will be because default modules were added in
- // setBaseClass(), which gets called when \textclass is read at the
+ // now we want to remove any removed modules that were previously
+ // added. normally, that will be because default modules were added in
+ // setBaseClass(), which gets called when \textclass is read at the
// start of the read.
list<string>::const_iterator rit = removed_modules_.begin();
list<string>::const_iterator const ren = removed_modules_.end();
string BufferParams::paperSizeName(PapersizePurpose purpose) const
{
- char real_papersize = papersize;
- if (real_papersize == PAPER_DEFAULT)
- real_papersize = lyxrc.default_papersize;
-
- switch (real_papersize) {
+ switch (papersize) {
case PAPER_DEFAULT:
// could be anything, so don't guess
return string();
{
string result;
+ // If the class loads the geometry package, we do not know which
+ // paper size is used, since we do not set it (bug 7013).
+ // Therefore we must not specify any argument here.
+ // dvips gets the correct paper size via DVI specials in this case
+ // (if the class uses the geometry package correctly).
+ if (documentClass().provides("geometry"))
+ return result;
+
if (use_geometry
&& papersize == PAPER_CUSTOM
&& !lyxrc.print_paper_dimension_flag.empty()
* -- add more GUI options?
* -- add more fonts (fonts for other scripts)
* -- if there's a way to find out if a font really supports
- * OldStyle, enable/disable the widget accordingly.
+ * OldStyle, enable/disable the widget accordingly.
*/
if (use_systemfonts && features.isAvailable("fontspec")) {
// "Mapping=tex-text" and "Ligatures=TeX" are equivalent.
if (sf != "default") {
string const sans = parseFontName(sf);
if (sfscale != 100)
- os << "\\setsansfont[Scale="
- << float(sfscale) / 100
+ os << "\\setsansfont[Scale="
+ << float(sfscale) / 100
<< "," << texmapping << "]{"
<< sans << "}\n";
else
if (tt != "default") {
string const mono = parseFontName(tt);
if (ttscale != 100)
- os << "\\setmonofont[Scale="
- << float(ttscale) / 100
+ os << "\\setmonofont[Scale="
+ << float(ttscale) / 100
<< "]{"
<< mono << "}\n";
else
}
-CiteEngine BufferParams::citeEngine() const
+bool BufferParams::addCiteEngine(string const & engine)
+{
+ LayoutModuleList::const_iterator it = cite_engine_.begin();
+ LayoutModuleList::const_iterator en = cite_engine_.end();
+ for (; it != en; ++it)
+ if (*it == engine)
+ return false;
+ cite_engine_.push_back(engine);
+ return true;
+}
+
+
+bool BufferParams::addCiteEngine(vector<string> const & engine)
+{
+ vector<string>::const_iterator it = engine.begin();
+ vector<string>::const_iterator en = engine.end();
+ bool ret = true;
+ for (; it != en; ++it)
+ if (!addCiteEngine(*it))
+ ret = false;
+ return ret;
+}
+
+
+string const & BufferParams::defaultBiblioStyle() const
+{
+ return documentClass().defaultBiblioStyle();
+}
+
+
+bool const & BufferParams::fullAuthorList() const
+{
+ return documentClass().fullAuthorList();
+}
+
+
+void BufferParams::setCiteEngine(string const & engine)
+{
+ clearCiteEngine();
+ addCiteEngine(engine);
+}
+
+
+void BufferParams::setCiteEngine(vector<string> const & engine)
+{
+ clearCiteEngine();
+ addCiteEngine(engine);
+}
+
+
+vector<string> BufferParams::citeCommands() const
{
- // FIXME the class should provide the numerical/
- // authoryear choice
- if (documentClass().provides("natbib")
- && cite_engine_ != ENGINE_NATBIB_NUMERICAL)
- return ENGINE_NATBIB_AUTHORYEAR;
- return cite_engine_;
+ static CitationStyle const default_style;
+ vector<string> commands =
+ documentClass().citeCommands(citeEngineType());
+ if (commands.empty())
+ commands.push_back(default_style.cmd);
+ return commands;
}
-void BufferParams::setCiteEngine(CiteEngine cite_engine)
+vector<CitationStyle> BufferParams::citeStyles() const
{
- cite_engine_ = cite_engine;
+ static CitationStyle const default_style;
+ vector<CitationStyle> styles =
+ documentClass().citeStyles(citeEngineType());
+ if (styles.empty())
+ styles.push_back(default_style);
+ return styles;
}
} // namespace lyx