#include "Floating.h"
#include "FloatList.h"
#include "Language.h"
+#include "LaTeXPackages.h"
#include "Layout.h"
#include "Lexer.h"
#include "LyXRC.h"
static docstring const tabularnewline_def = from_ascii(
"%% Because html converters don't know tabularnewline\n"
"\\providecommand{\\tabularnewline}{\\\\}\n");
-
+
static docstring const lyxgreyedout_def = from_ascii(
"%% The greyedout annotation environment\n"
"\\newenvironment{lyxgreyedout}\n"
static docstring const lyxref_def = from_ascii(
"\\RS@ifundefined{subref}\n"
- " {\\def\\RSsubtxt{section~}\\newref{sub}{name = \\RSsubtxt}}\n"
+ " {\\def\\RSsubtxt{section~}\\newref{sub}{name = \\RSsubtxt}}\n"
" {}\n"
"\\RS@ifundefined{thmref}\n"
- " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n"
+ " {\\def\\RSthmtxt{theorem~}\\newref{thm}{name = \\RSthmtxt}}\n"
" {}\n"
"\\RS@ifundefined{lemref}\n"
" {\\def\\RSlemtxt{lemma~}\\newref{lem}{name = \\RSlemtxt}}\n"
//
/////////////////////////////////////////////////////////////////////
-LaTeXFeatures::Packages LaTeXFeatures::packages_;
-
LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p,
OutputParams const & r)
}
-void LaTeXFeatures::getAvailable()
-{
- Lexer lex;
- support::FileName const real_file = libFileSearch("", "packages.lst");
-
- if (real_file.empty())
- return;
-
- lex.setFile(real_file);
-
- if (!lex.isOK())
- return;
-
- // Make sure that we are clean
- packages_.clear();
-
- bool finished = false;
- // Parse config-file
- while (lex.isOK() && !finished) {
- switch (lex.lex()) {
- case Lexer::LEX_FEOF:
- finished = true;
- break;
- default:
- packages_.insert(lex.getString());
- }
- }
-}
-
-
void LaTeXFeatures::useLayout(docstring const & layoutname)
{
// Some code to avoid loops in dependency definition
DocumentClass const & tclass = params_.documentClass();
if (tclass.hasLayout(layoutname)) {
// Is this layout already in usedLayouts?
- if (find(usedLayouts_.begin(), usedLayouts_.end(), layoutname)
+ if (find(usedLayouts_.begin(), usedLayouts_.end(), layoutname)
!= usedLayouts_.end())
return;
if (!tclass.hasInsetLayout(lname))
return;
// Is this layout already in usedInsetLayouts?
- if (find(usedInsetLayouts_.begin(), usedInsetLayouts_.end(), lname)
+ if (find(usedInsetLayouts_.begin(), usedInsetLayouts_.end(), lname)
!= usedInsetLayouts_.end())
return;
//LYXERR0("from=[" << from << "] to=[" << to << "]");
return theConverters().isReachable(from, to);
}
-
- if (packages_.empty())
- getAvailable();
- string n = name;
- if (suffixIs(n, ".sty"))
- n.erase(name.length() - 4);
- return packages_.find(n) != packages_.end();
+ return LaTeXPackages::isAvailable(name);
}
}
+void LaTeXFeatures::addCSSSnippet(std::string const & snippet)
+{
+ SnippetList::const_iterator begin = css_snippets_.begin();
+ SnippetList::const_iterator end = css_snippets_.end();
+ if (find(begin, end, snippet) == end)
+ css_snippets_.push_back(snippet);
+}
+
+
void LaTeXFeatures::useFloat(string const & name, bool subfloat)
{
if (!usedFloats_[name])
"ifsym",
"marvosym",
"txfonts",
+ "pxfonts",
+ "mathdesign",
"mathrsfs",
+ "mathabx",
+ "mathtools",
"ascii",
"url",
"covington",
// if fontspec is used, AMS packages have to be loaded before
// fontspec (in BufferParams)
- if (!params_.useNonTeXFonts && !loadAMSPackages().empty())
- packages << loadAMSPackages();
+ string const amsPackages = loadAMSPackages();
+ if (!params_.useNonTeXFonts && !amsPackages.empty())
+ packages << amsPackages;
// fixltx2e must be loaded after amsthm, since amsthm produces an error with
- // the redefined \[ command (bug 7233). Load is as early as possible, since
+ // the redefined \[ command (bug 7233). Load it as early as possible, since
// other packages might profit from it.
if (mustProvide("fixltx2e"))
packages << "\\usepackage{fixltx2e}\n";
// integral symbols from wasysym and amsmath.
// See http://www.lyx.org/trac/ticket/1942
if (mustProvide("wasysym") &&
- (params_.use_esint != BufferParams::package_off || !isRequired("esint")))
+ params_.use_package("wasysym") != BufferParams::package_off &&
+ (params_.use_package("esint") != BufferParams::package_off || !isRequired("esint")))
packages << "\\usepackage{wasysym}\n";
// accents must be loaded after amsmath
- if (mustProvide("accents"))
+ if (mustProvide("accents") &&
+ params_.use_package("accents") != BufferParams::package_off)
packages << "\\usepackage{accents}\n";
// mathdots must be loaded after amsmath
if (mustProvide("mathdots") &&
- params_.use_mathdots != BufferParams::package_off)
+ params_.use_package("mathdots") != BufferParams::package_off)
packages << "\\usepackage{mathdots}\n";
// yhmath must be loaded after amsmath
- if (mustProvide("yhmath"))
+ if (mustProvide("yhmath") &&
+ params_.use_package("yhmath") != BufferParams::package_off)
packages << "\\usepackage{yhmath}\n";
+ if (mustProvide("undertilde") &&
+ params_.use_package("undertilde") != BufferParams::package_off)
+ packages << "\\usepackage{undertilde}\n";
+
// [x]color and pdfcolmk are handled in getColorOptions() above
-
+
// makeidx.sty
if (isRequired("makeidx") || isRequired("splitidx")) {
if (!tclass.provides("makeidx") && !isRequired("splitidx"))
<< params_.graphics_driver
<< "]{graphicx}\n";
}
-
+
// lyxskak.sty --- newer chess support based on skak.sty
if (mustProvide("chess"))
packages << "\\usepackage[ps,mover]{lyxskak}\n";
// esint must be after amsmath and wasysym, since it will redeclare
// inconsistent integral symbols
- if ((mustProvide("esint") || mustProvide("esintoramsmath")) &&
- params_.use_esint != BufferParams::package_off)
+ if (mustProvide("esint") &&
+ params_.use_package("esint") != BufferParams::package_off)
packages << "\\usepackage{esint}\n";
// natbib.sty
// This special case is indicated by the "natbib-internal" key.
if (mustProvide("natbib") && !tclass.provides("natbib-internal")) {
packages << "\\usepackage[";
- if (params_.citeEngine() == ENGINE_NATBIB_NUMERICAL)
+ if (params_.citeEngineType() == ENGINE_TYPE_NUMERICAL)
packages << "numbers";
else
packages << "authoryear";
// jurabib -- we need version 0.6 at least.
if (mustProvide("jurabib"))
packages << "\\usepackage{jurabib}[2004/01/25]\n";
-
+
// xargs -- we need version 1.09 at least
if (mustProvide("xargs"))
packages << "\\usepackage{xargs}[2008/03/08]\n";
packages << "\\PassOptionsToPackage{normalem}{ulem}\n"
"\\usepackage{ulem}\n";
- if (params_.use_mhchem == BufferParams::package_on ||
- (mustProvide("mhchem") &&
- params_.use_mhchem != BufferParams::package_off))
+ if (mustProvide("mhchem") &&
+ params_.use_package("mhchem") != BufferParams::package_off)
packages << "\\PassOptionsToPackage{version=3}{mhchem}\n"
"\\usepackage{mhchem}\n";
}
-string LaTeXFeatures::getPreambleSnippets() const
+string LaTeXFeatures::getPreambleSnippets() const
{
ostringstream snip;
SnippetList::const_iterator pit = preamble_snippets_.begin();
}
+std::string LaTeXFeatures::getCSSSnippets() const
+{
+ ostringstream snip;
+ SnippetList::const_iterator pit = css_snippets_.begin();
+ SnippetList::const_iterator pend = css_snippets_.end();
+ for (; pit != pend; ++pit)
+ snip << *pit << '\n';
+ return snip.str();
+}
+
+
docstring const LaTeXFeatures::getMacros() const
{
odocstringstream macros;
// floats
getFloatDefinitions(macros);
-
- if (mustProvide("refstyle"))
- macros << lyxref_def << '\n';
-
+
+ if (mustProvide("refstyle"))
+ macros << lyxref_def << '\n';
+
// change tracking
if (mustProvide("ct-dvipost"))
macros << changetracking_dvipost_def;
-
+
if (mustProvide("ct-xcolor-ulem")) {
streamsize const prec = macros.precision(2);
-
+
RGBColor cadd = rgbFromHexName(lcolor.getX11Name(Color_addedtext));
macros << "\\providecolor{lyxadded}{rgb}{"
<< cadd.r / 255.0 << ',' << cadd.g / 255.0 << ',' << cadd.b / 255.0 << "}\n";
<< cdel.r / 255.0 << ',' << cdel.g / 255.0 << ',' << cdel.b / 255.0 << "}\n";
macros.precision(prec);
-
+
if (isRequired("hyperref"))
macros << changetracking_xcolor_ulem_hyperref_def;
else
if (mustProvide("amsthm"))
tmp << "\\usepackage{amsthm}\n";
- // esint is preferred for esintoramsmath
- if ((mustProvide("amsmath")
- && params_.use_amsmath != BufferParams::package_off)
- || (mustProvide("esintoramsmath")
- && params_.use_esint == BufferParams::package_off
- && params_.use_amsmath != BufferParams::package_off)) {
+ if (mustProvide("amsmath")
+ && params_.use_package("amsmath") != BufferParams::package_off) {
tmp << "\\usepackage{amsmath}\n";
} else {
// amsbsy and amstext are already provided by amsmath
if (mustProvide("amstext"))
tmp << "\\usepackage{amstext}\n";
}
-
+
if (mustProvide("amssymb")
- || params_.use_amsmath == BufferParams::package_on)
+ || params_.use_package("amsmath") == BufferParams::package_on)
tmp << "\\usepackage{amssymb}\n";
return tmp.str();
}
-docstring const LaTeXFeatures::getTClassHTMLPreamble() const
+docstring const LaTeXFeatures::getTClassHTMLPreamble() const
{
DocumentClass const & tclass = params_.documentClass();
odocstringstream tcpreamble;
}
-docstring const LaTeXFeatures::getTClassHTMLStyles() const {
+docstring const LaTeXFeatures::getTClassHTMLStyles() const
+{
DocumentClass const & tclass = params_.documentClass();
odocstringstream tcpreamble;
+ tcpreamble << tclass.htmlstyles();
+
list<docstring>::const_iterator cit = usedLayouts_.begin();
list<docstring>::const_iterator end = usedLayouts_.end();
for (; cit != end; ++cit)
namespace {
-docstring const getFloatI18nPreamble(docstring const & type, docstring const & name, docstring const & lang)
+docstring const getFloatI18nPreamble(docstring const & type,
+ docstring const & name, Language const * lang,
+ Encoding const & enc, bool const polyglossia)
{
+ // Check whether name can be encoded in the buffer encoding
+ bool encodable = true;
+ for (size_t i = 0; i < name.size(); ++i) {
+ if (enc.latexChar(name[i], true)[0] != name[i]) {
+ encodable = false;
+ break;
+ }
+ }
+
+ docstring const language = polyglossia ? from_ascii(lang->polyglossia())
+ : from_ascii(lang->babel());
+ docstring const langenc = from_ascii(lang->encoding()->iconvName());
+ docstring const texenc = from_ascii(lang->encoding()->latexName());
+ docstring const bufenc = from_ascii(enc.iconvName());
+ docstring const s1 = docstring(1, 0xF0000);
+ docstring const s2 = docstring(1, 0xF0001);
+ docstring const translated = encodable ? name
+ : from_ascii("\\inputencoding{") + texenc + from_ascii("}")
+ + s1 + langenc + s2 + name + s1 + bufenc + s2;
+
odocstringstream os;
- os << "\\addto\\captions" << lang
- << "{\\renewcommand{\\" << type << "name}{" << name << "}}\n";
+ os << "\\addto\\captions" << language
+ << "{\\renewcommand{\\" << type << "name}{" << translated << "}}\n";
return os.str();
}
}
for (; cit != end; ++cit) {
// language dependent commands (once per document)
snippets.insert(tclass[*cit].langpreamble(buffer().language(),
- use_polyglossia));
+ buffer().params().encoding(),
+ use_polyglossia));
// commands for language changing (for multilanguage documents)
if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
- snippets.insert(tclass[*cit].babelpreamble(buffer().language(),
- use_polyglossia));
+ snippets.insert(tclass[*cit].babelpreamble(
+ buffer().language(),
+ buffer().params().encoding(),
+ use_polyglossia));
for (lang_it lit = lbeg; lit != lend; ++lit)
- snippets.insert(tclass[*cit].babelpreamble(*lit, use_polyglossia));
+ snippets.insert(tclass[*cit].babelpreamble(
+ *lit,
+ buffer().params().encoding(),
+ use_polyglossia));
}
}
if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
UsedFloats::const_iterator fend = usedFloats_.end();
for (; fit != fend; ++fit) {
Floating const & fl = floats.getType(fit->first);
- // we assume builtin floats are translated
+ // we assume builtin floats are translated
if (fl.isPredefined())
continue;
docstring const type = from_ascii(fl.floattype());
docstring const flname = from_utf8(fl.name());
- docstring name = translateIfPossible(flname,
- buffer().language()->code());
+ docstring name = buffer().language()->translateLayout(fl.name());
// only request translation if we have a real translation
// (that differs from the source)
- if (use_polyglossia && flname != name)
- snippets.insert(getFloatI18nPreamble(
- type, name,
- from_ascii(buffer().language()->polyglossia())));
- else if (flname != name)
+ if (flname != name)
snippets.insert(getFloatI18nPreamble(
- type, name,
- from_ascii(buffer().language()->babel())));
+ type, name, buffer().language(),
+ buffer().params().encoding(),
+ use_polyglossia));
for (lang_it lit = lbeg; lit != lend; ++lit) {
string const code = (*lit)->code();
- name = translateIfPossible(flname, code);
+ name = (*lit)->translateLayout(fl.name());
// we assume we have a suitable translation if
// either the language is English (we need to
// translate into English if English is a secondary
// something different to the English source.
bool const have_translation =
(flname != name || contains(code, "en"));
- if (use_polyglossia && have_translation)
- snippets.insert(getFloatI18nPreamble(
- type, name,
- from_ascii((*lit)->polyglossia())));
- else if (have_translation)
+ if (have_translation)
snippets.insert(getFloatI18nPreamble(
- type, name,
- from_ascii((*lit)->babel())));
+ type, name, *lit,
+ buffer().params().encoding(),
+ use_polyglossia));
}
}
}
docstring const ext = from_ascii(fl.ext());
docstring const within = from_ascii(fl.within());
docstring const style = from_ascii(fl.style());
- docstring const name = translateIfPossible(
- from_utf8(fl.name()),
- buffer().language()->code());
+ docstring const name =
+ buffer().language()->translateLayout(fl.name());
os << "\\floatstyle{" << style << "}\n"
<< "\\newfloat{" << type << "}{" << placement
<< "}{" << ext << '}';
}
+void LaTeXFeatures::resolveAlternatives()
+{
+ for (Features::iterator it = features_.begin(); it != features_.end();) {
+ if (contains(*it, '|')) {
+ vector<string> const alternatives = getVectorFromString(*it, "|");
+ vector<string>::const_iterator const end = alternatives.end();
+ vector<string>::const_iterator ita = alternatives.begin();
+ for (; ita != end; ++ita) {
+ if (isRequired(*ita))
+ break;
+ }
+ if (ita == end)
+ require(alternatives.front());
+ features_.erase(it);
+ it = features_.begin();
+ } else
+ ++it;
+ }
+}
+
+
} // namespace lyx