* Licence details can be found in the file COPYING.
*
* \author Alfredo Braunstein
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
* \author Jean-Marc Lasgouttes
* \author John Levon
- * \author André Pönitz
+ * \author André Pönitz
* \author Martin Vermeer
*
* Full author contact details are available in file CREDITS.
#include "buffer_funcs.h"
#include "Bullet.h"
#include "Color.h"
+#include "ColorSet.h"
#include "Encoding.h"
#include "Language.h"
#include "LaTeXFeatures.h"
} else if (token == "\\output_changes") {
lex >> outputChanges;
} else if (token == "\\branch") {
- lex.next();
+ lex.eatLine();
docstring branch = lex.getDocString();
branchlist().add(branch);
while (true) {
// removed modules
if (!removedModules_.empty()) {
os << "\\begin_removed_modules" << '\n';
- set<string>::const_iterator it = removedModules_.begin();
- set<string>::const_iterator en = removedModules_.end();
+ list<string>::const_iterator it = removedModules_.begin();
+ list<string>::const_iterator en = removedModules_.end();
for (; it != en; it++)
os << *it << '\n';
os << "\\end_removed_modules" << '\n';
if (outputChanges) {
bool dvipost = LaTeXFeatures::isAvailable("dvipost");
- bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+ bool xcolorulem = LaTeXFeatures::isAvailable("ulem") &&
LaTeXFeatures::isAvailable("xcolor");
switch (features.runparams().flavor) {
if (dvipost) {
features.require("ct-dvipost");
features.require("dvipost");
- } else if (xcolorsoul) {
- features.require("ct-xcolor-soul");
- features.require("soul");
+ } else if (xcolorulem) {
+ features.require("ct-xcolor-ulem");
+ features.require("ulem");
features.require("xcolor");
} else {
features.require("ct-none");
}
break;
case OutputParams::PDFLATEX:
- if (xcolorsoul) {
- features.require("ct-xcolor-soul");
- features.require("soul");
+ if (xcolorulem) {
+ features.require("ct-xcolor-ulem");
+ features.require("ulem");
features.require("xcolor");
// improves color handling in PDF output
features.require("pdfcolmk");
os << "}\n";
texrow.newline();
}
- if (use_geometry || nonstandard_papersize) {
- os << "\\usepackage{geometry}\n";
- texrow.newline();
- os << "\\geometry{verbose";
+ if (!tclass.provides("geometry")
+ && (use_geometry || nonstandard_papersize)) {
+ odocstringstream ods;
+ if (!getGraphicsDriver("geometry").empty())
+ ods << getGraphicsDriver("geometry");
if (orientation == ORIENTATION_LANDSCAPE)
- os << ",landscape";
+ ods << ",landscape";
switch (papersize) {
case PAPER_CUSTOM:
if (!paperwidth.empty())
- os << ",paperwidth="
+ ods << ",paperwidth="
<< from_ascii(paperwidth);
if (!paperheight.empty())
- os << ",paperheight="
+ ods << ",paperheight="
<< from_ascii(paperheight);
break;
case PAPER_USLETTER:
- os << ",letterpaper";
+ ods << ",letterpaper";
break;
case PAPER_USLEGAL:
- os << ",legalpaper";
+ ods << ",legalpaper";
break;
case PAPER_USEXECUTIVE:
- os << ",executivepaper";
+ ods << ",executivepaper";
break;
case PAPER_A3:
- os << ",a3paper";
+ ods << ",a3paper";
break;
case PAPER_A4:
- os << ",a4paper";
+ ods << ",a4paper";
break;
case PAPER_A5:
- os << ",a5paper";
+ ods << ",a5paper";
break;
case PAPER_B3:
- os << ",b3paper";
+ ods << ",b3paper";
break;
case PAPER_B4:
- os << ",b4paper";
+ ods << ",b4paper";
break;
case PAPER_B5:
- os << ",b5paper";
+ ods << ",b5paper";
break;
default:
// default papersize ie PAPER_DEFAULT
switch (lyxrc.default_papersize) {
case PAPER_DEFAULT: // keep compiler happy
case PAPER_USLETTER:
- os << ",letterpaper";
+ ods << ",letterpaper";
break;
case PAPER_USLEGAL:
- os << ",legalpaper";
+ ods << ",legalpaper";
break;
case PAPER_USEXECUTIVE:
- os << ",executivepaper";
+ ods << ",executivepaper";
break;
case PAPER_A3:
- os << ",a3paper";
+ ods << ",a3paper";
break;
case PAPER_A4:
- os << ",a4paper";
+ ods << ",a4paper";
break;
case PAPER_A5:
- os << ",a5paper";
+ ods << ",a5paper";
break;
case PAPER_B5:
- os << ",b5paper";
+ ods << ",b5paper";
break;
case PAPER_B3:
case PAPER_B4:
break;
}
}
+ docstring const g_options = trim(ods.str(), ",");
+ os << "\\usepackage";
+ if (!g_options.empty())
+ os << '[' << g_options << ']';
+ os << "{geometry}\n";
+ texrow.newline();
+ os << "\\geometry{verbose";
if (!topmargin.empty())
os << ",tmargin=" << from_ascii(Length(topmargin).asLatexString());
if (!bottommargin.empty())
lyxpreamble += from_utf8(features.getBabelOptions()) + '\n';
}
+ docstring const i18npreamble = features.getTClassI18nPreamble(use_babel);
+ if (!i18npreamble.empty())
+ lyxpreamble += i18npreamble + '\n';
+
int const nlines =
int(count(lyxpreamble.begin(), lyxpreamble.end(), '\n'));
for (int j = 0; j != nlines; ++j) {
}
-void BufferParams::addDefaultModules()
-{
- // add any default modules not already in use
- list<string> const & mods = baseClass()->defaultModules();
- list<string>::const_iterator mit = mods.begin();
- list<string>::const_iterator men = mods.end();
-
- // we want to add these to the front, but in the right order,
- // so we collect them here first.
- list<string> modulesToAdd;
-
- for (; mit != men; mit++) {
- string const & modName = *mit;
- // see if we're already in use
- if (find(layoutModules_.begin(), layoutModules_.end(), modName) !=
- layoutModules_.end()) {
- LYXERR(Debug::TCLASS, "Default module `" << modName <<
- "' not added because already used.");
- continue;
- }
- // make sure the user hasn't removed it
- if (find(removedModules_.begin(), removedModules_.end(), modName) !=
- removedModules_.end()) {
- LYXERR(Debug::TCLASS, "Default module `" << modName <<
- "' not added because removed by user.");
- continue;
- }
-
- // Now we want to check the list of selected modules to see if any of them
- // excludes this one, or if we exclude one of them.
- LyXModule * thismod = moduleList[modName];
- if (!thismod) {
- LYXERR0("Adding default module " << modName <<
- " even though it is unavailable.");
- modulesToAdd.push_back(modName);
- continue;
- }
-
- bool foundit = false;
- vector<string> const ourExcMods = thismod->getExcludedModules();
- vector<string>::const_iterator const eit = ourExcMods.begin();
- vector<string>::const_iterator const een = ourExcMods.end();
-
- // so iterate over the selected modules...
- LayoutModuleList::const_iterator lit = layoutModules_.begin();
- LayoutModuleList::const_iterator const len = layoutModules_.end();
- for (; lit != len; lit++) {
- LyXModule * lm = moduleList[*lit];
- if (!lm)
- continue;
- vector<string> const & exc = lm->getExcludedModules();
- // ...and see if this one excludes us.
- if (find(exc.begin(), exc.end(), modName) != exc.end()) {
- foundit = true;
- LYXERR(Debug::TCLASS, "Default module `" << modName <<
- "' not added because excluded by loaded module `" <<
- *lit << "'.");
- break;
- }
- if (find(eit, een, *lit) != een) {
- foundit = true;
- LYXERR(Debug::TCLASS, "Default module `" << modName <<
- "' not added because it excludes loaded module `" <<
- *lit << "'.");
- break;
- }
- }
-
- if (!foundit) {
- LYXERR(Debug::TCLASS, "Default module `" << modName << "' added.");
- modulesToAdd.push_back(modName);
- }
- }
-
- // OK, now we can add the default modules.
- layoutModules_.insert(
- layoutModules_.begin(), modulesToAdd.begin(), modulesToAdd.end());
-}
-
-
bool BufferParams::setBaseClass(string const & classname)
{
LYXERR(Debug::TCLASS, "setBaseClass: " << classname);
}
pimpl_->baseClass_ = classname;
- addDefaultModules();
-
+ layoutModules_.adaptToBaseClass(baseClass(), removedModules_);
return true;
}
if (!baseClass())
return;
- doc_class_ = &(DocumentClassBundle::get().newClass(*baseClass()));
+ doc_class_ = &(DocumentClassBundle::get().makeDocumentClass(*baseClass(), layoutModules_));
- // FIXME It might be worth loading the children's modules here,
- // just as we load their bibliographies and such, instead of just
- // doing a check in InsetInclude.
- LayoutModuleList::const_iterator it = layoutModules_.begin();
- for (; it != layoutModules_.end(); it++) {
- string const modName = *it;
- LyXModule * lm = moduleList[modName];
- if (!lm) {
- docstring const msg =
- bformat(_("The module %1$s has been requested by\n"
- "this document but has not been found in the list of\n"
- "available modules. If you recently installed it, you\n"
- "probably need to reconfigure LyX.\n"), from_utf8(modName));
- frontend::Alert::warning(_("Module not available"),
- msg + _("Some layouts may not be available."));
- LYXERR0("BufferParams::makeDocumentClass(): Module " <<
- modName << " requested but not found in module list.");
- continue;
- }
- if (!lm->isAvailable()) {
- docstring const msg =
- bformat(_("The module %1$s requires a package that is\n"
- "not available in your LaTeX installation. LaTeX output\n"
- "may not be possible.\n"), from_utf8(modName));
- frontend::Alert::warning(_("Package not available"), msg);
- }
- FileName layout_file = libFileSearch("layouts", lm->getFilename());
- if (!doc_class_->read(layout_file, TextClass::MODULE)) {
- docstring const msg =
- bformat(_("Error reading module %1$s\n"), from_utf8(modName));
- frontend::Alert::warning(_("Read Error"), msg);
- }
- }
if (!local_layout.empty()) {
if (!doc_class_->read(local_layout, TextClass::MODULE)) {
docstring const msg = _("Error reading internal layout information");
}
}
+bool BufferParams::moduleCanBeAdded(string const & modName) const
+{
+ return layoutModules_.moduleCanBeAdded(modName, baseClass());
+}
-bool BufferParams::addLayoutModule(string const & modName)
+
+bool BufferParams::addLayoutModule(string const & modName)
{
LayoutModuleList::const_iterator it = layoutModules_.begin();
LayoutModuleList::const_iterator end = layoutModules_.end();
string mod = lex.getString();
if (mod == "\\end_removed_modules")
break;
- removedModules_.insert(mod);
+ removedModules_.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
// start of the read.
- set<string>::const_iterator rit = removedModules_.begin();
- set<string>::const_iterator const ren = removedModules_.end();
+ list<string>::const_iterator rit = removedModules_.begin();
+ list<string>::const_iterator const ren = removedModules_.end();
for (; rit != ren; rit++) {
LayoutModuleList::iterator const mit = layoutModules_.begin();
LayoutModuleList::iterator const men = layoutModules_.end();
}
+docstring BufferParams::getGraphicsDriver(string const & package) const
+{
+ docstring result;
+
+ if (package == "geometry") {
+ if (graphicsDriver == "dvips"
+ || graphicsDriver == "dvipdfm"
+ || graphicsDriver == "pdftex"
+ || graphicsDriver == "vtex")
+ result = from_ascii(graphicsDriver);
+ else if (graphicsDriver == "dvipdfmx")
+ result = from_ascii("dvipdfm");
+ }
+
+ return result;
+}
+
+
void BufferParams::writeEncodingPreamble(odocstream & os,
LaTeXFeatures & features, TexRow & texrow) const
{
texrow.newline();
}
if (package == Encoding::CJK || features.mustProvide("CJK")) {
- os << "\\usepackage{CJK}\n";
+ if (language->encoding()->name() == "utf8-cjk"
+ && LaTeXFeatures::isAvailable("CJKutf8"))
+ os << "\\usepackage{CJKutf8}\n";
+ else
+ os << "\\usepackage{CJK}\n";
texrow.newline();
}
} else if (inputenc != "default") {
texrow.newline();
break;
case Encoding::CJK:
- os << "\\usepackage{CJK}\n";
+ if (encoding().name() == "utf8-cjk"
+ && LaTeXFeatures::isAvailable("CJKutf8"))
+ os << "\\usepackage{CJKutf8}\n";
+ else
+ os << "\\usepackage{CJK}\n";
texrow.newline();
break;
}