Juergen Spitzmueller wrote:
> Finally, since jurabib does not support numerical styles, jurabib
> and numerical should be mutually exclusive (currently there is a
> problem when switching from Jurabib/numerical to natbib).
Jürgen,
attached is a patch that should help ensure the above requirement.
It's actually just a refactoring of existing code, even though it
looks pretty frightening.
If you'd be good enough to stress test it, that'd be great. I'm away
for the weekend, so you've a few days to break it ;-)
The next step after this is to store a variable of type
enum CiteEngine {
ENGINE_PLAIN,
ENGINE_NATBIB_AUTHORYEAR,
ENGINE_NATBIB_NUMERICAL,
ENGINE_JURABIB
};
in the BufferParams, rather than this triplet of bools.
bool use_natbib;
bool use_numerical_citations;
bool use_jurabib;
I think that that will guarantee that we no longer trip up over our
own feet.
--
Angus
Index: src/frontends/controllers/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ChangeLog,v
retrieving revision 1.439
diff -u -p -r1.439 ChangeLog
--- src/frontends/controllers/ChangeLog 20 Apr 2004 08:51:11 -0000 1.439
+++ src/frontends/controllers/ChangeLog 5 May 2004 11:20:14 -0000
@@ -1,3 +1,8 @@
+2004-05-05 Angus Leeming <[EMAIL PROTECTED]>
+
+ * biblio.C (getCiteStyles): ensure that '[#ID]' is the
+ first entry in the list of possible numerical citations.
+
2004-04-12 Georg Baum <[EMAIL PROTECTED]>
* ControlGraphics.[Ch] (editGraphics): new method
Index: src/frontends/controllers/ControlCitation.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlCitation.C,v
retrieving revision 1.40
diff -u -p -r1.40 ControlCitation.C
--- src/frontends/controllers/ControlCitation.C 3 Apr 2004 08:37:09 -0000 1.40
+++ src/frontends/controllers/ControlCitation.C 5 May 2004 11:20:14 -0000
@@ -37,6 +37,8 @@ bool ControlCitation::initialiseParams(s
kernel().buffer().fillWithBibKeys(blist);
bool use_styles = (usingNatbib() || usingJurabib());
+ bool const numerical_citations =
+ kernel().buffer().params().use_numerical_citations;
typedef std::map<string, string>::value_type InfoMapValue;
@@ -47,12 +49,17 @@ bool ControlCitation::initialiseParams(s
}
if (citeStyles_.empty())
- citeStyles_ = biblio::getCiteStyles(usingNatbib(), usingJurabib());
+ citeStyles_ =
+ biblio::getCiteStyles(usingNatbib(),
+ usingJurabib(),
+ numerical_citations);
else {
if ((use_styles && citeStyles_.size() == 1) ||
(!use_styles && citeStyles_.size() != 1))
- citeStyles_ = biblio::getCiteStyles(usingNatbib(),
- usingJurabib());
+ citeStyles_ =
+ biblio::getCiteStyles(usingNatbib(),
+ usingJurabib(),
+ numerical_citations);
}
return true;
@@ -89,10 +96,15 @@ vector<string> const ControlCitation::ge
{
vector<string> styles;
+ bool const numerical_citations =
+ kernel().buffer().params().use_numerical_citations;
+
vector<biblio::CiteStyle> const cs =
- biblio::getCiteStyles(usingNatbib(), usingJurabib());
+ biblio::getCiteStyles(usingNatbib(),
+ usingJurabib(),
+ numerical_citations);
- if (kernel().buffer().params().use_numerical_citations)
+ if (numerical_citations)
styles = biblio::getNumericalStrings(key, bibkeysInfo_, cs);
else
styles = biblio::getAuthorYearStrings(key, bibkeysInfo_, cs);
Index: src/frontends/controllers/biblio.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/biblio.C,v
retrieving revision 1.62
diff -u -p -r1.62 biblio.C
--- src/frontends/controllers/biblio.C 7 Mar 2004 14:33:14 -0000 1.62
+++ src/frontends/controllers/biblio.C 5 May 2004 11:20:15 -0000
@@ -560,7 +560,9 @@ string const getCiteCommand(CiteStyle co
}
-vector<CiteStyle> const getCiteStyles(bool usingNatbib, bool usingJurabib)
+vector<CiteStyle> const getCiteStyles(bool usingNatbib,
+ bool usingJurabib,
+ bool numericalCitations)
{
unsigned int nStyles = 1;
unsigned int start = 0;
@@ -571,14 +573,28 @@ vector<CiteStyle> const getCiteStyles(bo
if (usingJurabib)
nStyles = nCiteStyles;
- vector<CiteStyle> styles(nStyles);
+ typedef vector<CiteStyle> cite_vec;
+ cite_vec styles(nStyles);
+
+ cite_vec::size_type const vec_npos =
+ static_cast<cite_vec::size_type>(-1);
+ cite_vec::size_type citep_pos = vec_npos;
+ cite_vec::size_type citet_pos = vec_npos;
vector<CiteStyle>::size_type i = 0;
int j = start;
for (; i != styles.size(); ++i, ++j) {
styles[i] = citeStyles[j];
+ if (styles[i] == CITE || styles[i] == CITEP)
+ citep_pos = i;
+ else if (styles[i] == CITET)
+ citet_pos = i;
}
+ if (numericalCitations &&
+ citep_pos != vec_npos && citet_pos != vec_npos)
+ std::swap(styles[citep_pos], styles[citet_pos]);
+
return styles;
}
@@ -587,9 +603,8 @@ vector<string> const
getNumericalStrings(string const & key,
InfoMap const & map, vector<CiteStyle> const & styles)
{
- if (map.empty()) {
+ if (map.empty())
return vector<string>();
- }
string const author = getAbbreviatedAuthor(map, key);
string const year = getYear(map, key);
Index: src/frontends/controllers/biblio.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/biblio.h,v
retrieving revision 1.18
diff -u -p -r1.18 biblio.h
--- src/frontends/controllers/biblio.h 7 Mar 2004 14:33:14 -0000 1.18
+++ src/frontends/controllers/biblio.h 5 May 2004 11:20:15 -0000
@@ -116,7 +116,9 @@ a flag forcing upper case, e.g. "della C
std::string const getCiteCommand(CiteStyle, bool full, bool forceUCase);
/// Returns a vector of available Citation styles.
-std::vector<CiteStyle> const getCiteStyles(bool usingNatbib, bool usingJurabib);
+std::vector<CiteStyle> const getCiteStyles(bool usingNatbib,
+ bool usingJurabib,
+ bool numericalCitations);
/**
"Translates" the available Citation Styles into strings for this key.