#include "Bullet.h"
#include "Color.h"
#include "ColorSet.h"
+#include "Converter.h"
#include "Encoding.h"
#include "HSpace.h"
#include "IndicesList.h"
use_esint = package_auto;
use_mhchem = package_auto;
use_mathdots = package_auto;
+ use_undertilde = package_auto;
cite_engine_ = ENGINE_BASIC;
+ 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;
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") {
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 == "\\cite_engine") {
string engine;
lex >> engine;
cite_engine_ = citeenginetranslator().find(engine);
+ } 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
<< "\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\\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())
switch (features.runparams().flavor) {
case OutputParams::LATEX:
+ case OutputParams::DVILUATEX:
if (dvipost) {
features.require("ct-dvipost");
features.require("dvipost");
features.require("ulem");
features.require("xcolor");
// improves color handling in PDF output
- features.require("pdfcolmk");
+ features.require("pdfcolmk");
} else {
features.require("ct-none");
}
features.require("mhchem");
if (use_mathdots == package_on)
features.require("mathdots");
+ if (use_undertilde == package_on)
+ features.require("undertilde");
// 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) {
// http://www.tug.org/texmf-dist/doc/latex/base/fixltx2e.pdf
// !! To use the Fix-cm package, load it before \documentclass, and use the command
// \RequirePackage to do so, rather than the normal \usepackage
- // Do not to load any other package before the document class, unless you
+ // Do not try to load any other package before the document class, unless you
// have a thorough understanding of the LATEX internals and know exactly what you
// are doing!
if (features.mustProvide("fix-cm"))
fonts_sans_scale, fonts_typewriter_scale,
useNonTeXFonts, features);
if (!fonts.empty())
- os << from_ascii(fonts);
+ os << from_utf8(fonts);
if (fonts_default_family != "default")
os << "\\renewcommand{\\familydefault}{\\"
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");
}
// Now insert the LyX specific LaTeX commands...
docstring lyxpreamble;
+ features.resolveAlternatives();
if (output_sync) {
if (!output_sync_macro.empty())
// 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;
}
doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), layout_modules_));
if (!local_layout.empty()) {
- if (!doc_class_->read(local_layout, TextClass::MODULE)) {
+ TextClass::ReturnValues success =
+ doc_class_->read(local_layout, TextClass::MODULE);
+ if (success != TextClass::OK && success != TextClass::OK_OLDFORMAT) {
docstring const msg = _("Error reading internal layout information");
frontend::Alert::warning(_("Read Error"), msg);
}
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;
}
+string BufferParams::bufferFormat() const
+{
+ string format = documentClass().outputFormat();
+ if (format == "latex") {
+ if (useNonTeXFonts)
+ return "xetex";
+ if (encoding().package() == Encoding::japanese)
+ return "platex";
+ }
+ return format;
+}
+
+
+bool BufferParams::isExportable(string const & format) const
+{
+ vector<string> backs = backends();
+ for (vector<string>::const_iterator it = backs.begin();
+ it != backs.end(); ++it)
+ if (theConverters().isReachable(*it, format))
+ return true;
+ return false;
+}
+
+
+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();
+ set<string> excludes;
+ if (useNonTeXFonts) {
+ excludes.insert("latex");
+ excludes.insert("pdflatex");
+ }
+ vector<Format const *> result =
+ theConverters().getReachable(backs[0], only_viewable, true, excludes);
+ for (vector<string>::const_iterator it = backs.begin() + 1;
+ it != backs.end(); ++it) {
+ vector<Format const *> r =
+ 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;
+}
+
+
+vector<string> BufferParams::backends() const
+{
+ vector<string> v;
+ v.push_back(bufferFormat());
+ // FIXME: Don't hardcode format names here, but use a flag
+ if (v.back() == "latex") {
+ v.push_back("pdflatex");
+ v.push_back("luatex");
+ v.push_back("dviluatex");
+ v.push_back("xetex");
+ } else if (v.back() == "xetex") {
+ v.push_back("luatex");
+ v.push_back("dviluatex");
+ }
+ v.push_back("xhtml");
+ v.push_back("text");
+ v.push_back("lyx");
+ return v;
+}
+
+
+OutputParams::FLAVOR BufferParams::getOutputFlavor(string const format) const
+{
+ string const dformat = (format.empty() || format == "default") ?
+ getDefaultOutputFormat() : format;
+ DefaultFlavorCache::const_iterator it =
+ default_flavors_.find(dformat);
+
+ if (it != default_flavors_.end())
+ return it->second;
+
+ OutputParams::FLAVOR result = OutputParams::LATEX;
+
+ if (dformat == "xhtml")
+ result = OutputParams::HTML;
+ else {
+ // Try to determine flavor of default output format
+ vector<string> backs = backends();
+ if (find(backs.begin(), backs.end(), dformat) == backs.end()) {
+ // Get shortest path to format
+ Graph::EdgePath path;
+ for (vector<string>::const_iterator it = backs.begin();
+ it != backs.end(); ++it) {
+ Graph::EdgePath p = theConverters().getPath(*it, dformat);
+ if (!p.empty() && (path.empty() || p.size() < path.size())) {
+ path = p;
+ }
+ }
+ if (!path.empty())
+ result = theConverters().getFlavor(path);
+ }
+ }
+ // cache this flavor
+ default_flavors_[dformat] = result;
+ return result;
+}
+
+
+string BufferParams::getDefaultOutputFormat() const
+{
+ if (!default_output_format.empty()
+ && default_output_format != "default")
+ return default_output_format;
+ if (isDocBook()
+ || useNonTeXFonts
+ || encoding().package() == Encoding::japanese) {
+ vector<Format const *> const formats = exportableFormats(true);
+ if (formats.empty())
+ return string();
+ // return the first we find
+ return formats.front()->name();
+ }
+ return lyxrc.default_view_format;
+}
+
Font const BufferParams::getFont() const
{
FontInfo f = documentClass().defaultfont();
}
+bool BufferParams::isLatex() const
+{
+ return documentClass().outputType() == LATEX;
+}
+
+
+bool BufferParams::isLiterate() const
+{
+ return documentClass().outputType() == LITERATE;
+}
+
+
+bool BufferParams::isDocBook() const
+{
+ return documentClass().outputType() == DOCBOOK;
+}
+
+
void BufferParams::readPreamble(Lexer & lex)
{
if (lex.getString() != "\\begin_preamble")
}
+bool BufferParams::setLanguage(string const & lang)
+{
+ Language const *new_language = languages.getLanguage(lang);
+ if (!new_language) {
+ // Language lang was not found
+ return false;
+ }
+ language = new_language;
+ return true;
+}
+
+
void BufferParams::readLanguage(Lexer & lex)
{
if (!lex.next()) return;
string const tmptok = lex.getString();
// check if tmptok is part of tex_babel in tex-defs.h
- language = languages.getLanguage(tmptok);
- if (!language) {
+ if (!setLanguage(tmptok)) {
// Language tmptok was not found
language = default_language;
lyxerr << "Warning: Setting language `"
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();
return;
// LuaTeX neither, but with tex fonts, we need to load
// the luainputenc package.
- if (features.runparams().flavor == OutputParams::LUATEX) {
+ if (features.runparams().flavor == OutputParams::LUATEX
+ || features.runparams().flavor == OutputParams::DVILUATEX) {
if (!useNonTeXFonts && inputenc != "default"
&& ((inputenc == "auto" && language->encoding()->package() == Encoding::inputenc)
|| (inputenc != "auto" && encoding().package() == Encoding::inputenc))) {
* -- 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