X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetbibtex.C;h=73ca790e50296ee3b8f9153b26cc62cb960ae606;hb=10ba1b8918e7da14334bb5573ce2a707671c8b51;hp=b0973ca0d4e63ca350669f3c18583b6bd34c629a;hpb=44cd0fc9a1687cc63911c7f98d978594458e7813;p=lyx.git diff --git a/src/insets/insetbibtex.C b/src/insets/insetbibtex.C index b0973ca0d4..73ca790e50 100644 --- a/src/insets/insetbibtex.C +++ b/src/insets/insetbibtex.C @@ -14,11 +14,13 @@ #include "buffer.h" #include "bufferparams.h" +#include "dispatchresult.h" #include "debug.h" #include "funcrequest.h" +#include "LaTeXFeatures.h" #include "gettext.h" -#include "latexrunparams.h" #include "metricsinfo.h" +#include "outputparams.h" #include "support/filetools.h" #include "support/lstrings.h" @@ -27,6 +29,7 @@ #include +using lyx::support::AbsolutePath; using lyx::support::ascii_lowercase; using lyx::support::ChangeExtension; using lyx::support::contains; @@ -34,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; @@ -54,82 +58,86 @@ using std::vector; InsetBibtex::InsetBibtex(InsetCommandParams const & p) - : InsetCommand(p) + : InsetCommand(p, "bibtex") {} -InsetBibtex::~InsetBibtex() -{ - InsetCommandMailer("bibtex", *this).hideDialog(); -} - - -std::auto_ptr InsetBibtex::clone() const +std::auto_ptr InsetBibtex::doClone() const { return std::auto_ptr(new InsetBibtex(*this)); } -void InsetBibtex::metrics(MetricsInfo & mi, Dimension & dim) const -{ - InsetCommand::metrics(mi, dim); - int center_indent = (mi.base.textwidth - dim.wid) / 2; - Box b(center_indent, center_indent + dim.wid, -dim.asc, dim.des); - button().setBox(b); - dim.wid = mi.base.textwidth; - dim_ = dim; -} - - -void InsetBibtex::draw(PainterInfo & pi, int x, int y) const -{ - InsetCommand::draw(pi, x + button().box().x1, y); -} - - -dispatch_result InsetBibtex::localDispatch(FuncRequest const & cmd) +void InsetBibtex::doDispatch(LCursor & cur, FuncRequest & cmd) { switch (cmd.action) { - case LFUN_INSET_DIALOG_SHOW: - InsetCommandMailer("bibtex", *this).showDialog(cmd.view()); - return DISPATCHED; - case LFUN_MOUSE_RELEASE: - if (button().box().contains(cmd.x, cmd.y)) - InsetCommandMailer("bibtex", *this).showDialog(cmd.view()); - return DISPATCHED; - case LFUN_INSET_MODIFY: { InsetCommandParams p; - InsetCommandMailer::string2params(cmd.argument, p); - if (p.getCmdName().empty()) - return DISPATCHED; - setParams(p); - return DISPATCHED; + InsetCommandMailer::string2params("bibtex", cmd.argument, p); + if (!p.getCmdName().empty()) + setParams(p); + break; } default: - return InsetCommand::localDispatch(cmd); + InsetCommand::doDispatch(cur, cmd); + break; } - } + string const InsetBibtex::getScreenLabel(Buffer const &) const { return _("BibTeX Generated References"); } +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, - LatexRunParams const & runparams) const + 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 @@ -141,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 @@ -175,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; } @@ -286,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"); +}