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.

Reply via email to