X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetbib.C;h=d314ad7013c235f5c9cf0a11f710e4496a4bbb11;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=044431ded0c4dce9c78867d38fe8069652f2f9f0;hpb=8075064372c5361f2dfd91860003f0cb317b4e39;p=lyx.git diff --git a/src/insets/insetbib.C b/src/insets/insetbib.C index 044431ded0..d314ad7013 100644 --- a/src/insets/insetbib.C +++ b/src/insets/insetbib.C @@ -1,26 +1,30 @@ #include -#include -#include - #ifdef __GNUG__ #pragma implementation #endif -#include "frontends/Dialogs.h" #include "insetbib.h" #include "buffer.h" #include "debug.h" #include "BufferView.h" #include "gettext.h" #include "lyxtext.h" +#include "lyxrc.h" +#include "font.h" +#include "LyXView.h" +#include "lyxtextclasslist.h" + +#include "frontends/Dialogs.h" + #include "support/filetools.h" #include "support/path.h" #include "support/os.h" #include "support/lstrings.h" -#include "lyxrc.h" -#include "font.h" -#include "LyXView.h" +#include "support/LAssert.h" + +#include +#include using std::ostream; using std::ifstream; @@ -137,80 +141,135 @@ 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, ','); - while(!adb.empty()) { - if (!buffer->niceFile && - IsFileReadable(MakeAbsPath(adb, buffer->filepath)+".bib")) - adb = os::external_path(MakeAbsPath(adb, buffer->filepath)); + // 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 & buffer) 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; + while (!tmp.empty()) { + 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())); - } + 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"; } + } else if (!keys.empty()) { + keys.back().second += linebuf + "\n"; } } - // Get next file name - bibfiles = split(bibfiles, tmp, ','); } return keys; } @@ -264,7 +323,7 @@ bool InsetBibtex::delDatabase(string const & db) int bibitemMaxWidth(BufferView * bv, LyXFont const & font) { int w = 0; -#warning Ha, now we are mainly at 1.2.0 and it is still here (Jug) + // Ha, now we are mainly at 1.2.0 and it is still here (Jug) // Does look like a hack? It is! (but will change at 0.13) Paragraph * par = bv->buffer()->paragraph;