X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetbibtex.C;h=73ca790e50296ee3b8f9153b26cc62cb960ae606;hb=10ba1b8918e7da14334bb5573ce2a707671c8b51;hp=bfc7806ffa8536ac7bad87c578a17c3cd4a23778;hpb=70d0ba900118ac7e253c1e1969fd7a3d64ec8e03;p=lyx.git diff --git a/src/insets/insetbibtex.C b/src/insets/insetbibtex.C index bfc7806ffa..73ca790e50 100644 --- a/src/insets/insetbibtex.C +++ b/src/insets/insetbibtex.C @@ -17,6 +17,7 @@ #include "dispatchresult.h" #include "debug.h" #include "funcrequest.h" +#include "LaTeXFeatures.h" #include "gettext.h" #include "metricsinfo.h" #include "outputparams.h" @@ -28,6 +29,7 @@ #include +using lyx::support::AbsolutePath; using lyx::support::ascii_lowercase; using lyx::support::ChangeExtension; using lyx::support::contains; @@ -35,6 +37,7 @@ using lyx::support::findtexfile; using lyx::support::IsFileReadable; using lyx::support::ltrim; using lyx::support::MakeAbsPath; +using lyx::support::MakeRelPath; using lyx::support::Path; using lyx::support::prefixIs; using lyx::support::rtrim; @@ -59,14 +62,13 @@ InsetBibtex::InsetBibtex(InsetCommandParams const & p) {} -std::auto_ptr InsetBibtex::clone() const +std::auto_ptr InsetBibtex::doClone() const { return std::auto_ptr(new InsetBibtex(*this)); } -DispatchResult -InsetBibtex::priv_dispatch(BufferView & bv, FuncRequest const & cmd) +void InsetBibtex::doDispatch(LCursor & cur, FuncRequest & cmd) { switch (cmd.action) { @@ -75,11 +77,12 @@ InsetBibtex::priv_dispatch(BufferView & bv, FuncRequest const & cmd) InsetCommandMailer::string2params("bibtex", cmd.argument, p); if (!p.getCmdName().empty()) setParams(p); - return DispatchResult(true, true); + break; } - + default: - return InsetCommand::priv_dispatch(bv, cmd); + InsetCommand::doDispatch(cur, cmd); + break; } } @@ -90,16 +93,51 @@ string const InsetBibtex::getScreenLabel(Buffer const &) const } +namespace { + +string normalize_name(Buffer const & buffer, OutputParams const & runparams, + string const & name, string const & ext) +{ + string const fname = MakeAbsPath(name, buffer.filePath()); + if (AbsolutePath(name) || !IsFileReadable(fname + ext)) + return name; + else if (!runparams.nice) + return fname; + else + return MakeRelPath(fname, buffer.getMasterBuffer()->filePath()); +} + +} + + int InsetBibtex::latex(Buffer const & buffer, ostream & os, OutputParams const & runparams) const { - // changing the sequence of the commands + // the sequence of the commands: // 1. \bibliographystyle{style} // 2. \addcontentsline{...} - if option bibtotoc set // 3. \bibliography{database} + // and with bibtopic: + // 1. \bibliographystyle{style} + // 2. \begin{btSect}{database} + // 3. \btPrint{Cited|NotCited|All} + // 4. \end{btSect} + + // the database string string adb; string db_in = getContents(); db_in = split(db_in, adb, ','); + // 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 + string db_out; + while (!adb.empty()) { + db_out += os::external_path(normalize_name(buffer, runparams, + adb, ".bib")); + db_out += ','; + db_in = split(db_in, adb,','); + } + db_out = rtrim(db_out, ","); // Style-Options string style = getOptions(); // maybe empty! and with bibtotoc @@ -111,17 +149,30 @@ int InsetBibtex::latex(Buffer const & buffer, ostream & os, } } - if (!runparams.nice - && IsFileReadable(MakeAbsPath(style, buffer.filePath()) + ".bst")) { - style = MakeAbsPath(style, buffer.filePath()); + // line count + int i = 0; + + if (!style.empty()) { + os << "\\bibliographystyle{" + << os::external_path(normalize_name(buffer, runparams, + style, ".bst")) + << "}\n"; + i += 1; } - if (!style.empty()) { // we want no \biblio...{} - os << "\\bibliographystyle{" << style << "}\n"; + if (buffer.params().use_bibtopic){ + os << "\\begin{btSect}{" << db_out << "}\n"; + string btprint = getSecOptions(); + if (btprint.empty()) + // default + btprint = "btPrintCited"; + os << "\\" << btprint << "\n" + << "\\end{btSect}\n"; + i += 3; } // bibtotoc-Option - if (!bibtotoc.empty()) { + if (!bibtotoc.empty() && !buffer.params().use_bibtopic) { // 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 @@ -145,22 +196,12 @@ int InsetBibtex::latex(Buffer const & buffer, ostream & os, } } - // 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 - string db_out; - while (!adb.empty()) { - if (!runparams.nice && - 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,','); + if (!buffer.params().use_bibtopic){ + os << "\\bibliography{" << db_out << "}\n"; + i += 1; } - db_out = rtrim(db_out, ","); - os << "\\bibliography{" << db_out << "}\n"; - return 2; + + return i; } @@ -256,3 +297,10 @@ bool InsetBibtex::delDatabase(string const & db) } return true; } + + +void InsetBibtex::validate(LaTeXFeatures & features) const +{ + if (features.bufferParams().use_bibtopic) + features.require("bibtopic"); +}