#include "Spacing.h"
#include "TexRow.h"
#include "VSpace.h"
+#include "PDFOptions.h"
#include "frontends/alert.h"
#include "insets/InsetListingsParams.h"
#include "support/convert.h"
#include "support/filetools.h"
#include "support/Translator.h"
+#include "support/lstrings.h"
#include <boost/array.hpp>
using lyx::support::bformat;
using lyx::support::rtrim;
using lyx::support::tokenPos;
+using lyx::support::prefixIs;
static char const * const string_paragraph_separation[] = {
* and for detached paragraphs in "indented" documents.
*/
VSpace defskip;
+ PDFOptions pdfoptions;
};
}
+PDFOptions & BufferParams::pdfoptions()
+{
+ return pimpl_->pdfoptions;
+}
+
+
+PDFOptions const & BufferParams::pdfoptions() const
+{
+ return pimpl_->pdfoptions;
+}
+
+
VSpace const & BufferParams::getDefSkip() const
{
return pimpl_->defskip;
spacing().set(spacetranslator().find(nspacing), tmp_val);
} else if (token == "\\float_placement") {
lex >> float_placement;
+
+ } else if (prefixIs(token, "\\pdf_") || token == "\\use_hyperref") {
+ string toktmp = pdfoptions().readToken(lex, token);
+ if (!toktmp.empty()) {
+ lyxerr << "PDFOptions::readToken(): Unknown token: " <<
+ toktmp << endl;
+ return toktmp;
+ }
} else {
lyxerr << "BufferParams::readToken(): Unknown token: " <<
token << endl;
os << "\\paperfontsize " << fontsize << '\n';
spacing().writeFile(os);
+ pdfoptions().writeFile(os);
os << "\\papersize " << string_papersize[papersize]
<< "\n\\use_geometry " << convert<string>(use_geometry)
// The optional packages;
docstring lyxpreamble(from_ascii(features.getPackages()));
+ // We try to load babel late, in case it interferes
+ // with other packages. But some packages also need babel to be loaded
+ // before, e.g. jurabib has to be called after babel.
+ // So load babel after the optional packages but before the user-defined
+ // preamble. This allows the users to redefine babel commands, e.g. to
+ // translate the word "Index" to the German "Stichwortverzeichnis".
+ // For more infos why this place was chosen, see
+ // http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg128425.html
+ // if you encounter problem, you can shift babel to its old place behind
+ // the user-defined preamble
+ if (use_babel && !features.isRequired("jurabib")) {
+ // FIXME UNICODE
+ lyxpreamble += from_utf8(babelCall(language_options.str())) + '\n';
+ lyxpreamble += from_utf8(features.getBabelOptions());
+ }
+
+ // PDF support.
+ // * Hyperref manual: "Make sure it comes last of your loaded
+ // packages, to give it a fighting chance of not being over-written,
+ // since its job is to redefine many LATEX commands."
+ // * Email from Heiko Oberdiek: "It is usually better to load babel
+ // before hyperref. Then hyperref has a chance to detect babel.
+ // * Has to be loaded before the "LyX specific LaTeX commands" to
+ // avoid errors with algorithm floats.
+ odocstringstream oss;
+ pdfoptions().writeLaTeX(oss);
+ lyxpreamble += oss.str();
+
// this might be useful...
lyxpreamble += "\n\\makeatletter\n";
if (!bullets_def.empty())
lyxpreamble += bullets_def + "}\n\n";
- // We try to load babel late, in case it interferes
- // with other packages.
- // Jurabib has to be called after babel, though.
- if (use_babel && !features.isRequired("jurabib")) {
- // FIXME UNICODE
- lyxpreamble += from_utf8(babelCall(language_options.str())) + '\n';
- lyxpreamble += from_utf8(features.getBabelOptions());
- }
-
lyxpreamble += "\\makeatother\n\n";
int const nlines =
}
-TextClass_ptr BufferParams::getTextClass_ptr() const {
+TextClassPtr BufferParams::getTextClassPtr() const {
return textClass_;
}
-void BufferParams::setTextClass(TextClass_ptr tc) {
+void BufferParams::setTextClass(TextClassPtr tc) {
textClass_ = tc;
}
-void BufferParams::setBaseClass(textclass_type tc)
+bool BufferParams::setBaseClass(textclass_type tc)
{
- baseClass_ = tc;
+ bool retVal = true;
+ if (textclasslist[tc].load())
+ baseClass_ = tc;
+ else {
+ docstring s =
+ bformat(_("The document class %1$s could not be loaded."),
+ from_utf8(textclasslist[tc].name()));
+ frontend::Alert::error(_("Could not load class"), s);
+ retVal = false;
+ }
makeTextClass();
+ return retVal;
}
{
textClass_.reset(new TextClass(textclasslist[getBaseClass()]));
//FIXME It might be worth loading the children's modules here,
- //instead of just doing a check in InsetInclude.
+ //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"
- "probalby need to reconfigure LyX.\n"), from_utf8(modName));
+ 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"
+ "probalby need to reconfigure LyX.\n"), from_utf8(modName));
frontend::Alert::warning(_("Module not available"),
- msg + _("Some layouts may not be available."));
+ msg + _("Some layouts may not be available."));
lyxerr << "BufferParams::makeTextClass(): Module " <<
modName << " requested but not found in module list." <<
endl;