Subject: bibtex autokey no longer ignores uncapitalized title words

From: "era eriksson" <[email-masked]>
Date: Thu, 19 Feb 2009 15:47:15 +0200

Package: emacs
Version: 23.0.90.1

I'm taking the liberty to forward the following bug from the Ubuntu
Launchpad:

https://bugs.launchpad.net/ubuntu/+source/emacs22/+bug/243156

> What I Expected to Happen
> ====================
> 
> This affects the BibTeX mode. Emacs 20 changed the behaviour, thus:
> 
> *** Autokey generation now uses all words from the title, not just
> capitalized words. To avoid conflicts with existing customizations,
> bibtex-autokey-titleword-ignore is set up such that words starting 
> with lowerkey characters will still be ignored. Thus, if you want to 
> use lowercase words from the title, you will have to overwrite the 
> bibtex-autokey-titleword-ignore standard setting.
> 
> So for an entry
> 
> @InProceedings{,
>   author = {Ganter, Bernhard and Kuznetsov, Sergei O.},
>   title = {Stepwise Construction of the {Dedekind-MacNeille}
>                    Completion},
>   year = 1998,
>   booktitle = {ICCS '98: Proceedings of the 6th International 
>               Conference on Conceptual Structures},
>   pages = {295--302},
>   address = {Montpellier, France},
>   publisher = {Springer-Verlag},
>   isbn = {3-540-64791-0}
> }
> 
> pressing C-c C-c should generate and add the key
> 
>     ganter98:_stepw_const_dedek_macneil_compl
> 
> instead it generates
> 
>   ganter98:_stepw_const_of_dedek_macneil_compl
> 
> In emacs21
> =========
> 
> The variable `bibtex-autokey-titleword-ignore` is set to
> 
>   '("A" "An" "On" "The" "Eine?" "Der" "Die" "Das"
>     "[^A-Z].*" ".*[^a-zA-Z0-9].*")
> 
> and it works as expected.
> 
> In emacs22
> =========
> 
> The variable `bibtex-autokey-titleword-ignore` is set to
> 
>   '("A" "An" "On" "The" "Eine?" "Der" "Die" "Das"
>     "[^[:upper:]].*" ".*[^[:upper:]0-9].*")
> 
> and it does not work as expected.
> 
> Workaround
> =========
> 
> The old value from emacs21 does not solve the problem, instead I have > to enumerate all prepositions and conjunctions.

I have verified this bug with Emacs snapshot 1:20090207-1~intrepid1 from
https://launchpad.net/~ubuntu-elisp/+archive/ppa

Attached below please find a patch for Emacs 23.

/* era */

-- 
If this were a real .signature, it would suck less.  Well, maybe not.

--- emacs-snapshot-20090207/lisp/textmodes/bibtex.el~	2009-01-17 16:58:53.000000000 +0200
+++ emacs-snapshot-20090207/lisp/textmodes/bibtex.el	2009-02-19 15:33:43.000000000 +0200
@@ -746,7 +746,7 @@
 
 (defcustom bibtex-autokey-titleword-ignore
   '("A" "An" "On" "The" "Eine?" "Der" "Die" "Das"
-    "[^[:upper:]].*" ".*[^[:upper:]0-9].*")
+    "[^[:upper:]].*" ".*[^[:upper:][:lower:]0-9].*")
   "Determines words from the title that are not to be used in the key.
 Each item of the list is a regexp.  If a word of the title matches a
 regexp from that list, it is not included in the title part of the key.
@@ -2307,6 +2307,10 @@
     ;; gather words from titlestring into a list.  Ignore
     ;; specific words and use only a specific amount of words.
     (let ((counter 0)
+	  (re (concat "\\`\\(?:"
+		      (mapconcat #'identity
+				 bibtex-autokey-titleword-ignore "\\|")
+		      "\\)\\'") )
           titlewords titlewords-extra word)
       (while (and (or (not (numberp bibtex-autokey-titlewords))
                       (< counter (+ bibtex-autokey-titlewords
@@ -2316,12 +2320,10 @@
               titlestring (substring titlestring (match-end 0)))
         ;; Ignore words matched by one of the elements of
         ;; `bibtex-autokey-titleword-ignore'
-        (unless (let ((lst bibtex-autokey-titleword-ignore))
-                  (while (and lst
-                              (not (string-match (concat "\\`\\(?:" (car lst)
-                                                         "\\)\\'") word)))
-                    (setq lst (cdr lst)))
-                  lst)
+	;;;;;;;; XXX FIXME: case-fold-search should be unnecessary here
+	;; [[:upper:]] and [[:lower:]] should be unaffected by case folding
+        (unless (let ((case-fold-search nil))
+		  (string-match re word) )
           (setq counter (1+ counter))
           (if (or (not (numberp bibtex-autokey-titlewords))
                   (<= counter bibtex-autokey-titlewords))