diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 54397c0a91..993018c589 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,16 @@ +2001-08-20 Herbert Voss + * insetbib.C: added a option bibtotoc which is from "BIB to TOC" + in the the bibtex-database-gui for inserting a line + \addcontentsline... + + If no style is given than there is no tex-output. + +2001-08-18 Angus Leeming + + * insetbib.[Ch] (getFiles): new method, returning the BibTeX database + files as a vector. + (getKeys): use it. + 2001-08-18 Dekel Tsur * insetert.C (latex): Fix output for multiple paragraphs. diff --git a/src/insets/insetbib.C b/src/insets/insetbib.C index 88fb0b9e86..34cb2b53f9 100644 --- a/src/insets/insetbib.C +++ b/src/insets/insetbib.C @@ -18,6 +18,7 @@ #include "support/path.h" #include "support/os.h" #include "support/lstrings.h" +#include "support/LAssert.h" #include "lyxrc.h" #include "font.h" #include "LyXView.h" @@ -137,81 +138,136 @@ string const InsetBibtex::getScreenLabel(Buffer const *) const int InsetBibtex::latex(Buffer const * buffer, ostream & os, bool /*fragile*/, bool/*fs*/) const { - // If we generate in a temp dir, we might need to give an - // absolute path there. This is a bit complicated since we can - // have a comma-separated list of bibliographies + // changing the sequence of the commands + // 1. \bibliographystyle{style} + // 2. \addcontentsline{...} - if option bibtotoc set + // 3. \bibliography{database} string adb, db_out; string db_in = getContents(); db_in = split(db_in, adb, ','); + + // Style-Options + string style = getOptions(); // maybe empty! and with bibtotoc + string bibtotoc; + if (prefixIs(style,"bibtotoc")) { + bibtotoc = "bibtotoc"; + if (contains(style,',')) { + style = split(style,bibtotoc,','); + } + } + + if (!buffer->niceFile + && IsFileReadable(MakeAbsPath(style, buffer->filepath) + ".bst")) { + style = MakeAbsPath(style, buffer->filepath); + } + + if (!style.empty()) { // we want no \biblio...{} + os << "\\bibliographystyle{" << style << "}\n"; + } + + // bibtotoc-Option + if (!bibtotoc.empty()) { + // maybe a problem when a textclass has no "art" as + // part of its name, because it's than book. + // For the "official" lyx-layouts it's no problem to support + // all well + if (!contains(textclasslist.NameOfClass(buffer->params.textclass),"art")) { + if (buffer->params.sides == LyXTextClass::OneSide) { + // oneside + os << "\\clearpage"; + } else { + // twoside + os << "\\cleardoublepage"; + } + + // bookclass + os << "\\addcontentsline{toc}{chapter}{\\bibname}"; + + } else { + // article class + os << "\\addcontentsline{toc}{section}{\\refname}"; + } + } + + // database + // If we generate in a temp dir, we might need to give an + // absolute path there. This is a bit complicated since we can + // have a comma-separated list of bibliographies while(!adb.empty()) { if (!buffer->niceFile && IsFileReadable(MakeAbsPath(adb, buffer->filepath)+".bib")) adb = os::external_path(MakeAbsPath(adb, buffer->filepath)); - db_out += adb; db_out += ','; db_in= split(db_in, adb,','); } db_out = strip(db_out, ','); - // Idem, but simpler - string style; - if (!buffer->niceFile - && IsFileReadable(MakeAbsPath(getOptions(), buffer->filepath) - + ".bst")) - style = MakeAbsPath(getOptions(), buffer->filepath); - else - style = getOptions(); - - os << "\\bibliographystyle{" << style << "}\n" - << "\\bibliography{" << db_out << "}\n"; + os << "\\bibliography{" << db_out << "}\n"; return 2; } -// This method returns a comma separated list of Bibtex entries -vector > const InsetBibtex::getKeys(Buffer const * buffer) const +vector const InsetBibtex::getFiles(Buffer const &) const { - Path p(buffer->filepath); + // Doesn't appear to be used (Angus, 31 July 2001) + // Path p(buffer->filepath); + + vector vec; - vector > keys; string tmp; string bibfiles = getContents(); bibfiles = split(bibfiles, tmp, ','); while(!tmp.empty()) { - string fil = findtexfile(ChangeExtension(tmp, "bib"), - "bib"); - lyxerr[Debug::LATEX] << "Bibfile: " << fil << endl; + string file = findtexfile(ChangeExtension(tmp, "bib"), "bib"); + lyxerr[Debug::LATEX] << "Bibfile: " << file << endl; + // If we didn't find a matching file name just fail silently - if (!fil.empty()) { - // This is a _very_ simple parser for Bibtex database - // files. All it does is to look for lines starting - // in @ and not being @preamble and @string entries. - // It does NOT do any syntax checking! - ifstream ifs(fil.c_str()); - string linebuf0; - while (getline(ifs, linebuf0)) { - string linebuf = frontStrip(strip(linebuf0)); - if (linebuf.empty() ) continue; - if (prefixIs(linebuf, "@")) { - linebuf = subst(linebuf, '{', '('); - linebuf = split(linebuf, tmp, '('); - tmp = lowercase(tmp); - if (!prefixIs(tmp, "@string") - && !prefixIs(tmp, "@preamble")) { - linebuf = split(linebuf, tmp, ','); - tmp = frontStrip(tmp); - if (!tmp.empty()) { - keys.push_back(pair(tmp,string())); - } - } - } else if (!keys.empty()) { - keys.back().second += linebuf + "\n"; - } - } - } + if (!file.empty()) + vec.push_back(file); + // Get next file name bibfiles = split(bibfiles, tmp, ','); } + + return vec; +} + +// This method returns a comma separated list of Bibtex entries +vector > const InsetBibtex::getKeys(Buffer const * buffer) const +{ + vector > keys; + + lyx::Assert(buffer); + vector const files = getFiles(*buffer); + for (vector::const_iterator it = files.begin(); + it != files.end(); ++ it) { + // This is a _very_ simple parser for Bibtex database + // files. All it does is to look for lines starting + // in @ and not being @preamble and @string entries. + // It does NOT do any syntax checking! + ifstream ifs(it->c_str()); + string linebuf0; + while (getline(ifs, linebuf0)) { + string linebuf = frontStrip(strip(linebuf0)); + if (linebuf.empty() ) continue; + if (prefixIs(linebuf, "@")) { + linebuf = subst(linebuf, '{', '('); + string tmp; + linebuf = split(linebuf, tmp, '('); + tmp = lowercase(tmp); + if (!prefixIs(tmp, "@string") + && !prefixIs(tmp, "@preamble")) { + linebuf = split(linebuf, tmp, ','); + tmp = frontStrip(tmp); + if (!tmp.empty()) { + keys.push_back(pair(tmp,string())); + } + } + } else if (!keys.empty()) { + keys.back().second += linebuf + "\n"; + } + } + } return keys; } diff --git a/src/insets/insetbib.h b/src/insets/insetbib.h index 408d24b161..e51b236dea 100644 --- a/src/insets/insetbib.h +++ b/src/insets/insetbib.h @@ -102,6 +102,8 @@ public: /// std::vector > const getKeys(Buffer const *) const; /// + std::vector const getFiles(Buffer const &) const; + /// bool addDatabase(string const &); /// bool delDatabase(string const &);