]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeXFeatures.cpp
Whitespace.
[lyx.git] / src / LaTeXFeatures.cpp
index 94cdb637d03bb0a077867a3d03f2bb6e6098de20..e4f563a456faf5b378792678d1b0b714979bea85 100644 (file)
@@ -184,19 +184,19 @@ static docstring const changetracking_dvipost_def = from_ascii(
        "\\dvipost{osend color pop}\n"
        "\\dvipost{cbstart color push Blue}\n"
        "\\dvipost{cbend color pop}\n"
-       "\\newcommand{\\lyxadded}[3]{\\changestart#3\\changeend}\n"
-       "\\newcommand{\\lyxdeleted}[3]{%\n"
+       "\\DeclareRobustCommand{\\lyxadded}[3]{\\changestart#3\\changeend}\n"
+       "\\DeclareRobustCommand{\\lyxdeleted}[3]{%\n"
        "\\changestart\\overstrikeon#3\\overstrikeoff\\changeend}\n");
 
 static docstring const changetracking_xcolor_ulem_def = from_ascii(
        "%% Change tracking with ulem\n"
-       "\\newcommand{\\lyxadded}[3]{{\\color{lyxadded}{}#3}}\n"
-       "\\newcommand{\\lyxdeleted}[3]{{\\color{lyxdeleted}\\sout{#3}}}\n");
+       "\\DeclareRobustCommand{\\lyxadded}[3]{{\\color{lyxadded}{}#3}}\n"
+       "\\DeclareRobustCommand{\\lyxdeleted}[3]{{\\color{lyxdeleted}\\sout{#3}}}\n");
 
 static docstring const changetracking_xcolor_ulem_hyperref_def = from_ascii(
        "%% Change tracking with ulem\n"
-       "\\newcommand{\\lyxadded}[3]{{\\texorpdfstring{\\color{lyxadded}{}}{}#3}}\n"
-       "\\newcommand{\\lyxdeleted}[3]{{\\texorpdfstring{\\color{lyxdeleted}\\sout{#3}}{}}}\n");
+       "\\DeclareRobustCommand{\\lyxadded}[3]{{\\texorpdfstring{\\color{lyxadded}{}}{}#3}}\n"
+       "\\DeclareRobustCommand{\\lyxdeleted}[3]{{\\texorpdfstring{\\color{lyxdeleted}\\sout{#3}}{}}}\n");
 
 static docstring const changetracking_none_def = from_ascii(
        "\\newcommand{\\lyxadded}[3]{#3}\n"
@@ -314,6 +314,25 @@ static docstring const rtloutputdblcol_def = from_ascii(
        "\\@mparswitchtrue\n");
 
 
+/////////////////////////////////////////////////////////////////////
+//
+// LyXHTML strings
+//
+/////////////////////////////////////////////////////////////////////
+
+static docstring const lyxnoun_style = from_ascii(
+       "dfn.lyxnoun {\n"
+  "  font-variant: small-caps;\n"
+  "}\n");
+
+
+// this is how it normally renders, but it might not always do so.
+static docstring const lyxstrikeout_style = from_ascii(
+       "del.strikeout {\n"
+  "  text-decoration: line-through;\n"
+  "}\n");
+
+
 /////////////////////////////////////////////////////////////////////
 //
 // LaTeXFeatures
@@ -327,7 +346,7 @@ LaTeXFeatures::LaTeXFeatures(Buffer const & b, BufferParams const & p,
 {}
 
 
-LaTeXFeatures::LangPackage LaTeXFeatures::langPackage(bool englishbabel) const
+LaTeXFeatures::LangPackage LaTeXFeatures::langPackage() const
 {
        string const local_lp = bufferParams().lang_package;
 
@@ -347,9 +366,6 @@ LaTeXFeatures::LangPackage LaTeXFeatures::langPackage(bool englishbabel) const
         * If babel is selected (either directly or via the "auto"
         * mechanism), we really do only require it if we have
         * a language that needs it.
-        * English alone normally does not require babel (since it is
-        * the default language of LaTeX). However, in some cases we
-        * need to surpass this exception (see Font::validate).
         */
        bool const polyglossia_required =
                isRequired("polyglossia")
@@ -357,8 +373,7 @@ LaTeXFeatures::LangPackage LaTeXFeatures::langPackage(bool englishbabel) const
                && !isProvided("babel")
                && this->hasOnlyPolyglossiaLanguages();
        bool const babel_required = 
-               ((englishbabel || bufferParams().language->lang() != "english")
-                && !bufferParams().language->babel().empty())
+               !bufferParams().language->babel().empty()
                || !this->getBabelLanguages().empty();
 
        if (local_lp == "auto") {
@@ -501,6 +516,7 @@ bool LaTeXFeatures::isProvided(string const & name) const
                                                                       nomath);
 }
 
+
 bool LaTeXFeatures::mustProvide(string const & name) const
 {
        return isRequired(name) && !isProvided(name);
@@ -601,7 +617,7 @@ bool LaTeXFeatures::hasPolyglossiaExclusiveLanguages() const
        for (LanguageList::const_iterator cit = begin;
             cit != UsedLanguages_.end();
             ++cit) {
-               if ((*cit)->babel().empty() && !(*cit)->polyglossia().empty() && (*cit)->requires().empty())
+               if ((*cit)->isPolyglossiaExclusive())
                        return true;
        }
        return false;
@@ -701,7 +717,7 @@ char const * simplefeatures[] = {
        "mathrsfs",
        "mathabx",
        "mathtools",
-       "cancel",
+       // "cancel",
        "ascii",
        "url",
        "covington",
@@ -719,6 +735,21 @@ char const * simplefeatures[] = {
        "tfrupee"
 };
 
+char const * bibliofeatures[] = {
+       // Known bibliography packages (will be loaded before natbib)
+       "achicago",
+       "apacite",
+       "apalike",
+       "astron",
+       "authordate1-4",
+       "chicago",
+       "harvard",
+       "mslapa",
+       "named"
+};
+
+int const nb_bibliofeatures = sizeof(bibliofeatures) / sizeof(char const *);
+
 int const nb_simplefeatures = sizeof(simplefeatures) / sizeof(char const *);
 
 }
@@ -794,20 +825,25 @@ string const LaTeXFeatures::getPackages() const
        // also unknown packages can be requested. They are silently
        // swallowed now. We should change this eventually.
 
-       //
+       // Output all the package option stuff we have been asked to do.
+       map<string, string>::const_iterator it =
+           params_.documentClass().packageOptions().begin();
+       map<string, string>::const_iterator en =
+           params_.documentClass().packageOptions().end();
+       for (; it != en; ++it)
+               if (mustProvide(it->first))
+                       packages << "\\PassOptionsToPackage{" << it->second << "}"
+                                << "{" << it->first << "}\n";
+
        //  These are all the 'simple' includes.  i.e
        //  packages which we just \usepackage{package}
-       //
        for (int i = 0; i < nb_simplefeatures; ++i) {
                if (mustProvide(simplefeatures[i]))
-                       packages << "\\usepackage{"
-                                << simplefeatures[i] << "}\n";
+                       packages << "\\usepackage{" << simplefeatures[i] << "}\n";
        }
 
-       //
        // The rest of these packages are somewhat more complicated
        // than those above.
-       //
 
        // if fontspec is used, AMS packages have to be loaded before
        // fontspec (in BufferParams)
@@ -821,6 +857,9 @@ string const LaTeXFeatures::getPackages() const
        if (mustProvide("fixltx2e"))
                packages << "\\usepackage{fixltx2e}\n";
 
+        if (mustProvide("cancel") &&
+            params_.use_package("cancel") != BufferParams::package_off)
+                packages << "\\usepackage{cancel}\n";
        // wasysym is a simple feature, but it must be after amsmath if both
        // are used
        // wasysym redefines some integrals (e.g. iint) from amsmath. That
@@ -849,6 +888,15 @@ string const LaTeXFeatures::getPackages() const
            params_.use_package("yhmath") != BufferParams::package_off)
                packages << "\\usepackage{yhmath}\n";
 
+       // stmaryrd must be loaded after amsmath
+       if (mustProvide("stmaryrd") &&
+           params_.use_package("stmaryrd") != BufferParams::package_off)
+               packages << "\\usepackage{stmaryrd}\n";
+
+       if (mustProvide("stackrel") &&
+           params_.use_package("stackrel") != BufferParams::package_off)
+               packages << "\\usepackage{stackrel}\n";
+
        if (mustProvide("undertilde") &&
                params_.use_package("undertilde") != BufferParams::package_off)
                packages << "\\usepackage{undertilde}\n";
@@ -888,6 +936,17 @@ string const LaTeXFeatures::getPackages() const
            params_.use_package("esint") != BufferParams::package_off)
                packages << "\\usepackage{esint}\n";
 
+       // Known bibliography packages (simple \usepackage{package})
+       for (int i = 0; i < nb_bibliofeatures; ++i) {
+               if (mustProvide(bibliofeatures[i]))
+                       packages << "\\usepackage{"
+                                << bibliofeatures[i] << "}\n";
+       }
+
+       // Compatibility between achicago and natbib
+       if (mustProvide("achicago") && mustProvide("natbib"))
+               packages << "\\let\\achicagobib\\thebibliography\n";
+
        // natbib.sty
        // Some classes load natbib themselves, but still allow (or even require)
        // plain numeric citations (ReVTeX is such a case, see bug 5182).
@@ -901,6 +960,13 @@ string const LaTeXFeatures::getPackages() const
                packages << "]{natbib}\n";
        }
 
+       // Compatibility between achicago and natbib
+       if (mustProvide("achicago") && mustProvide("natbib")) {
+               packages << "\\let\\thebibliography\\achicagobib\n";
+               packages << "\\let\\SCcite\\astroncite\n";
+               packages << "\\let\\UnexpandableProtect\\protect\n";
+       }
+
        // jurabib -- we need version 0.6 at least.
        if (mustProvide("jurabib"))
                packages << "\\usepackage{jurabib}[2004/01/25]\n";
@@ -1258,6 +1324,13 @@ docstring const LaTeXFeatures::getTClassHTMLStyles() const
        DocumentClass const & tclass = params_.documentClass();
        odocstringstream tcpreamble;
 
+       if (mustProvide("noun"))
+               tcpreamble << lyxnoun_style;
+       // this isn't exact, but it won't hurt that much if it
+       // wasn't for this.
+       if (mustProvide("ulem"))
+               tcpreamble << lyxstrikeout_style;
+
        tcpreamble << tclass.htmlstyles();
 
        list<docstring>::const_iterator cit = usedLayouts_.begin();
@@ -1280,6 +1353,7 @@ docstring const LaTeXFeatures::getTClassHTMLStyles() const
 
 
 namespace {
+
 docstring const getFloatI18nPreamble(docstring const & type,
                        docstring const & name, Language const * lang,
                        Encoding const & enc, bool const polyglossia)