#include <config.h>
#ifdef __GNUG__
-#pragma implementation "LaTeXFeatures.h"
+#pragma implementation
#endif
-#include "LString.h"
+#include "LaTeXFeatures.h"
#include "debug.h"
#include "lyx_sty.h"
#include "lyxrc.h"
-#include "LaTeXFeatures.h"
#include "bufferparams.h"
-#include "layout.h"
-#include "support/filetools.h"
+#include "lyxtextclasslist.h"
#include "FloatList.h"
#include "language.h"
+#include "encoding.h"
+#include "LString.h"
+
+#include "support/filetools.h"
+#include "support/lstrings.h"
+
+using lyx::layout_type;
+using lyx::textclass_type;
using std::endl;
+using std::set;
-LaTeXFeatures::LaTeXFeatures(BufferParams const & p, LyXTextClass::size_type n)
+LaTeXFeatures::LaTeXFeatures(BufferParams const & p, layout_type n)
: layout(n, false), params(p)
+{}
+
+
+void LaTeXFeatures::require(string const & name)
{
- // packages
- array = false;
- color = false;
- graphics = false; // INSET_GRAPHICS: remove this when InsetFig is thrown.
- graphicx = false;
- setspace = false;
- makeidx = false;
- verbatim = false;
- longtable = false;
- //algorithm = false;
- rotating = false;
- amssymb = false;
- latexsym = false;
- pifont = false;
- subfigure = false;
- floatflt = false;
- url = false;
- varioref = false;
- prettyref = false;
- chess = false;
+ if (isRequired(name))
+ return;
- // commands
- lyx = false;
- lyxline = false;
- noun = false;
- lyxarrow = false;
-
- // quotes
- quotesinglbase = false;
- quotedblbase = false;
- guilsinglleft = false;
- guilsinglright = false;
- guillemotleft = false;
- guillemotright = false;
-
- // Math mode
- amsstyle = false;
- binom = false;
- boldsymbol = false;
-
- // special features
- ParagraphIndent = false;
- NeedLyXFootnoteCode = false;
- NeedLyXMinipageIndent = false;
+ // INSET_GRAPHICS: remove this when InsetFig is thrown.
+ if (name == "graphics") {
+ features.push_back("graphicx");
+ features.push_back("graphics");
+ } else
+ features.push_back(name);
}
-void LaTeXFeatures::require(string const & name)
+void LaTeXFeatures::useLayout(std::vector<bool>::size_type const & idx)
+{
+ layout[idx] = true;
+}
+
+
+bool LaTeXFeatures::isRequired(string const & name) const
+{
+ FeaturesList::const_iterator i = std::find(features.begin(),
+ features.end(),
+ name);
+ return i != features.end();
+}
+
+
+void LaTeXFeatures::addExternalPreamble(string const & pream)
+{
+ externalPreambles += pream;
+}
+
+
+void LaTeXFeatures::useFloat(string const & name)
{
- if (name == "array") {
- array = true;
- } else if (name == "color") {
- color = true;
- } else if (name == "graphics") {
- graphicx = true;
- graphics = true;// INSET_GRAPHICS: remove this when InsetFig is thrown.
- } else if (name == "setspace") {
- setspace = true;
- } else if (name == "makeidx") {
- makeidx = true;
- } else if (name == "verbatim") {
- verbatim = true;
- } else if (name == "longtable") {
- longtable = true;
- //} else if (name == "algorithm") {
- //algorithm = true;
- } else if (name == "rotating") {
- rotating = true;
- } else if (name == "amssymb") {
- amssymb = true;
- } else if (name == "latexsym") {
- latexsym = true;
- } else if (name == "pifont") {
- pifont = true;
- } else if (name == "subfigure") {
- subfigure = true;
- } else if (name == "floatflt") {
- floatflt = true;
- } else if (name == "url") {
- url = true;
- } else if (name == "varioref") {
- varioref = true;
- } else if (name == "prettyref") {
- prettyref = true;
- } else if (name == "chess") {
- chess = true;
- } else if (name == "amsstyle") {
- amsstyle = true;
- } else if (name == "boldsymbol") {
- boldsymbol = true;
- } else if (name == "binom") {
- binom = true;
+ usedFloats.insert(name);
+ // We only need float.sty if we use non builtin floats, or if we
+ // use the "H" modifier. This includes modified table and
+ // figure floats. (Lgb)
+ Floating const & fl = floatList.getType(name);
+ if (!fl.type().empty() && !fl.builtin()) {
+ require("float");
}
}
+void LaTeXFeatures::useLanguage(Language const * lang)
+{
+ UsedLanguages.insert(lang);
+}
+
+
+void LaTeXFeatures::includeFile(string const & key, string const & name)
+{
+ IncludedFiles[key] = name;
+}
+
+
+bool LaTeXFeatures::hasLanguages()
+{
+ return !UsedLanguages.empty();
+}
+
+
+string LaTeXFeatures::getLanguages() const
+{
+ ostringstream languages;
+
+ for (LanguageList::const_iterator cit =
+ UsedLanguages.begin();
+ cit != UsedLanguages.end();
+ ++cit)
+ languages << (*cit)->babel() << ',';
+
+ return languages.str().c_str();
+}
+
+
+set<string> LaTeXFeatures::getEncodingSet(string const & doc_encoding)
+{
+ set<string> encodings;
+ for (LanguageList::const_iterator it =
+ UsedLanguages.begin();
+ it != UsedLanguages.end(); ++it)
+ if ((*it)->encoding()->LatexName() != doc_encoding)
+ encodings.insert((*it)->encoding()->LatexName());
+ return encodings;
+}
+
+namespace {
+
+char const * simplefeatures[] = {
+ "array",
+ "verbatim",
+ "longtable",
+ "rotating",
+ "latexsym",
+ "pifont",
+ "subfigure",
+ "floatflt",
+ "varioref",
+ "prettyref",
+ "float"
+};
+
+const int nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *);
+
+}
+
string const LaTeXFeatures::getPackages() const
{
ostringstream packages;
LyXTextClass const & tclass =
textclasslist.TextClass(params.textclass);
- // array-package
- if (array)
- packages << "\\usepackage{array}\n";
+ /**
+ * These are all the 'simple' includes. i.e
+ * packages which we just \usepackage{package}
+ **/
+ for (int i = 0 ; i < nb_simplefeatures ; ++i) {
+ if (isRequired(simplefeatures[i]))
+ packages << "\\usepackage{"
+ << simplefeatures[i]
+ << "}\n";
+ }
+
+ /**
+ * The rest of these packages are somewhat more complicated
+ * than those above.
+ **/
+
+ if (isRequired("amsmath")
+ && ! tclass.provides(LyXTextClass::amsmath)) {
+ packages << "\\usepackage{amsmath}\n";
+ }
+
// color.sty
- if (color) {
+ if (isRequired("color")) {
if (params.graphicsDriver == "default")
packages << "\\usepackage{color}\n";
else
}
// makeidx.sty
- if (makeidx) {
- if (! tclass.provides(LyXTextClass::makeidx)
- && params.language->babel() != "french") // french provides
- // \index !
- // French should not be hardcoded. (Lgb)
+ if (isRequired("makeidx")) {
+ if (! tclass.provides(LyXTextClass::makeidx))
packages << "\\usepackage{makeidx}\n";
packages << "\\makeindex\n";
}
// graphicx.sty
- if (graphicx && params.graphicsDriver != "none") {
+ if (isRequired("graphicx") && params.graphicsDriver != "none") {
if (params.graphicsDriver == "default")
packages << "\\usepackage{graphicx}\n";
else
// INSET_GRAPHICS: remove this when InsetFig is thrown.
// graphics.sty
- if (graphics && params.graphicsDriver != "none") {
+ if (isRequired("graphics") && params.graphicsDriver != "none") {
if (params.graphicsDriver == "default")
packages << "\\usepackage{graphics}\n";
else
<< "]{graphics}\n";
}
- // verbatim.sty
- if (verbatim)
- packages << "\\usepackage{verbatim}\n";
-
//if (algorithm) {
// packages << "\\usepackage{algorithm}\n";
//}
- // lyxchess.sty
- if (chess) {
- packages << "\\usepackage{lyxchess}\n";
+ // lyxskak.sty --- newer chess support based on skak.sty
+ if (isRequired("chess")) {
+ packages << "\\usepackage[ps,mover]{lyxskak}\n";
}
// setspace.sty
if ((params.spacing.getSpace() != Spacing::Single
&& !params.spacing.isDefault())
- || setspace) {
+ || isRequired("setspace")) {
packages << "\\usepackage{setspace}\n";
}
switch (params.spacing.getSpace()) {
break;
}
- //longtable.sty
- if (longtable)
- packages << "\\usepackage{longtable}\n";
-
- //rotating.sty
- if (rotating)
- packages << "\\usepackage{rotating}\n";
-
// amssymb.sty
- if (amssymb || params.use_amsmath)
+ if (isRequired("amssymb") || params.use_amsmath)
packages << "\\usepackage{amssymb}\n";
-
- // latexsym.sty
- if (latexsym)
- packages << "\\usepackage{latexsym}\n";
-
- // pifont.sty
- if (pifont)
- packages << "\\usepackage{pifont}\n";
-
- // subfigure.sty
- if (subfigure)
- packages << "\\usepackage{subfigure}\n";
-
- // floatflt.sty
- if (floatflt)
- packages << "\\usepackage{floatflt}\n";
-
// url.sty
- if (url && ! tclass.provides(LyXTextClass::url))
+ if (isRequired("url") && ! tclass.provides(LyXTextClass::url))
packages << "\\IfFileExists{url.sty}{\\usepackage{url}}\n"
" {\\newcommand{\\url}{\\texttt}}\n";
- // varioref.sty
- if (varioref)
- packages << "\\usepackage{varioref}\n";
-
- // prettyref.sty
- if (prettyref)
- packages << "\\usepackage{prettyref}\n";
-
// float.sty
- // We only need float.sty if we use non builtin floats. This includes
- // modified table and figure floats. (Lgb)
- if (!usedFloats.empty()) {
- bool use_float = false;
- UsedFloats::const_iterator beg = usedFloats.begin();
- UsedFloats::const_iterator end = usedFloats.end();
- for (; beg != end; ++beg) {
- Floating const & fl = floatList.getType((*beg));
- if (!fl.type().empty() && !fl.builtin()) {
- use_float = true;
- break;
- }
+ // natbib.sty
+ if (isRequired("natbib")) {
+ packages << "\\usepackage[";
+ if (params.use_numerical_citations) {
+ packages << "numbers";
+ } else {
+ packages << "authoryear";
}
- if (use_float)
- packages << "\\usepackage{float}\n";
+ packages << "]{natbib}\n";
}
packages << externalPreambles;
ostringstream macros;
// always include this
- if (true || lyx)
+ if (true || isRequired("lyx"))
macros << lyx_def << '\n';
- if (lyxline)
+ if (isRequired("lyxline"))
macros << lyxline_def << '\n';
- if (noun) {
+ if (isRequired("noun"))
macros << noun_def << '\n';
- }
- if (lyxarrow) {
+ if (isRequired("lyxarrow"))
macros << lyxarrow_def << '\n';
- }
// quotes.
- if (quotesinglbase)
+ if (isRequired("quotesinglbase"))
macros << quotesinglbase_def << '\n';
- if (quotedblbase)
+ if (isRequired("quotedblbase"))
macros << quotedblbase_def << '\n';
- if (guilsinglleft)
+ if (isRequired("guilsinglleft"))
macros << guilsinglleft_def << '\n';
- if (guilsinglright)
+ if (isRequired("guilsinglright"))
macros << guilsinglright_def << '\n';
- if (guillemotleft)
+ if (isRequired("guillemotleft"))
macros << guillemotleft_def << '\n';
- if (guillemotright)
+ if (isRequired("guillemotright"))
macros << guillemotright_def << '\n';
// Math mode
- if (boldsymbol && !amsstyle)
+ if (isRequired("boldsymbol") && !isRequired("amsmath"))
macros << boldsymbol_def << '\n';
- if (binom && !amsstyle)
+ if (isRequired("binom") && !isRequired("amsmath"))
macros << binom_def << '\n';
// other
- if (NeedLyXMinipageIndent)
+ if (isRequired("NeedLyXMinipageIndent"))
macros << minipageindent_def;
- if (ParagraphIndent)
+ if (isRequired("ParagraphIndent"))
macros << paragraphindent_def;
- if (NeedLyXFootnoteCode)
+ if (isRequired("NeedLyXFootnoteCode"))
macros << floatingfootnote_def;
// floats
string const LaTeXFeatures::getTClassPreamble() const
{
// the text class specific preamble
- LyXTextClass const & tclass =
- textclasslist.TextClass(params.textclass);
+ LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
ostringstream tcpreamble;
tcpreamble << tclass.preamble();
- for (unsigned int i = 0; i < tclass.numLayouts(); ++i) {
+ for (layout_type i = 0; i < tclass.numLayouts(); ++i) {
if (layout[i]) {
- tcpreamble << tclass[i].preamble();
+ tcpreamble << tclass[i].preamble();
}
}
}
+string const LaTeXFeatures::getLyXSGMLEntities() const
+{
+ // Definition of entities used in the document that are LyX related.
+ ostringstream entities;
+
+ if (isRequired("lyxarrow")) {
+ entities << "<!ENTITY lyxarrow \"->\">" << '\n';
+ }
+
+ return entities.str().c_str();
+}
+
+
string const LaTeXFeatures::getIncludedFiles(string const & fname) const
{
ostringstream sgmlpreamble;
return params;
}
-
-void LaTeXFeatures::getFloatDefinitions(ostream & os) const
+void LaTeXFeatures::getFloatDefinitions(std::ostream & os) const
{
// Here we will output the code to create the needed float styles.
// We will try to do this as minimal as possible.
<< name << "}\n";
// What missing here is to code to minimalize the code
- // outputted so that the same flotastyle will not be
- // used several times. when the same style is still in
+ // output so that the same floatstyle will not be
+ // used several times, when the same style is still in
// effect. (Lgb)
}
}