Start with BiBTeX (RNG section converted)
[ach-master.git] / src / alphalink.bst
1 % Derived from BibTeX standard bibliography style `alpha'
2 % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
3 % Copyright (C) 1985, all rights reserved.
4 % Copying of this file is authorized only if either
5 % (1) you make absolutely no changes to your copy, including name, or
6 % (2) if you do make changes, you name it something other than
7 % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
8 % This restriction helps ensure that all standard styles are identical.
9 % The file btxbst.doc has the documentation for this style.
10
11 % Now recognize url field. If present produce a hyperref on the
12 % bibliography label with a link to url.
13
14 ENTRY
15   { address
16     author
17     booktitle
18     chapter
19     edition
20     editor
21     howpublished
22     institution
23     journal
24     key
25     month
26     note
27     number
28     organization
29     pages
30     publisher
31     school
32     series
33     title
34     type
35     url
36     volume
37     year
38   }
39   {}
40   { label extra.label sort.label }
41
42 INTEGERS { output.state before.all mid.sentence after.sentence after.block }
43
44 FUNCTION {init.state.consts}
45 { #0 'before.all :=
46   #1 'mid.sentence :=
47   #2 'after.sentence :=
48   #3 'after.block :=
49 }
50
51 STRINGS { s t }
52
53 FUNCTION {output.nonnull}
54 { 's :=
55   output.state mid.sentence =
56     { ", " * write$ }
57     { output.state after.block =
58         { add.period$ write$
59           newline$
60           "\newblock " write$
61         }
62         { output.state before.all =
63             'write$
64             { add.period$ " " * write$ }
65           if$
66         }
67       if$
68       mid.sentence 'output.state :=
69     }
70   if$
71   s
72 }
73
74 FUNCTION {output}
75 { duplicate$ empty$
76     'pop$
77     'output.nonnull
78   if$
79 }
80
81 FUNCTION {output.check}
82 { 't :=
83   duplicate$ empty$
84     { pop$ "empty " t * " in " * cite$ * warning$ }
85     'output.nonnull
86   if$
87 }
88
89 FUNCTION {output.bibitem}
90 { newline$
91   "\bibitem[" write$
92   url empty$
93       { label write$ }
94       { "\xbiblabel{" write$
95         url write$
96         "%" write$
97         newline$
98         "}{}{}{" write$
99         label write$
100         "}" write$
101       }
102   if$
103   "]{" write$
104   cite$ write$
105   "}" write$
106   newline$
107   ""
108   before.all 'output.state :=
109 }
110
111 FUNCTION {fin.entry}
112 { add.period$
113   write$
114   newline$
115 }
116
117 FUNCTION {new.block}
118 { output.state before.all =
119     'skip$
120     { after.block 'output.state := }
121   if$
122 }
123
124 FUNCTION {new.sentence}
125 { output.state after.block =
126     'skip$
127     { output.state before.all =
128         'skip$
129         { after.sentence 'output.state := }
130       if$
131     }
132   if$
133 }
134
135 FUNCTION {not}
136 {   { #0 }
137     { #1 }
138   if$
139 }
140
141 FUNCTION {and}
142 {   'skip$
143     { pop$ #0 }
144   if$
145 }
146
147 FUNCTION {or}
148 {   { pop$ #1 }
149     'skip$
150   if$
151 }
152
153 FUNCTION {new.block.checka}
154 { empty$
155     'skip$
156     'new.block
157   if$
158 }
159
160 FUNCTION {new.block.checkb}
161 { empty$
162   swap$ empty$
163   and
164     'skip$
165     'new.block
166   if$
167 }
168
169 FUNCTION {new.sentence.checka}
170 { empty$
171     'skip$
172     'new.sentence
173   if$
174 }
175
176 FUNCTION {new.sentence.checkb}
177 { empty$
178   swap$ empty$
179   and
180     'skip$
181     'new.sentence
182   if$
183 }
184
185 FUNCTION {field.or.null}
186 { duplicate$ empty$
187     { pop$ "" }
188     'skip$
189   if$
190 }
191
192 FUNCTION {emphasize}
193 { duplicate$ empty$
194     { pop$ "" }
195     { "{\em " swap$ * "}" * }
196   if$
197 }
198
199 INTEGERS { nameptr namesleft numnames }
200
201 FUNCTION {format.names}
202 { 's :=
203   #1 'nameptr :=
204   s num.names$ 'numnames :=
205   numnames 'namesleft :=
206     { namesleft #0 > }
207     { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
208       nameptr #1 >
209         { namesleft #1 >
210             { ", " * t * }
211             { numnames #2 >
212                 { "," * }
213                 'skip$
214               if$
215               t "others" =
216                 { " et~al." * }
217                 { " and " * t * }
218               if$
219             }
220           if$
221         }
222         't
223       if$
224       nameptr #1 + 'nameptr :=
225       namesleft #1 - 'namesleft :=
226     }
227   while$
228 }
229
230 FUNCTION {format.authors}
231 { author empty$
232     { "" }
233     { author format.names }
234   if$
235 }
236
237 FUNCTION {format.editors}
238 { editor empty$
239     { "" }
240     { editor format.names
241       editor num.names$ #1 >
242         { ", editors" * }
243         { ", editor" * }
244       if$
245     }
246   if$
247 }
248
249 FUNCTION {format.title}
250 { title empty$
251     { "" }
252     { title "t" change.case$ }
253   if$
254 }
255
256 FUNCTION {n.dashify}
257 { 't :=
258   ""
259     { t empty$ not }
260     { t #1 #1 substring$ "-" =
261         { t #1 #2 substring$ "--" = not
262             { "--" *
263               t #2 global.max$ substring$ 't :=
264             }
265             {   { t #1 #1 substring$ "-" = }
266                 { "-" *
267                   t #2 global.max$ substring$ 't :=
268                 }
269               while$
270             }
271           if$
272         }
273         { t #1 #1 substring$ *
274           t #2 global.max$ substring$ 't :=
275         }
276       if$
277     }
278   while$
279 }
280
281 FUNCTION {format.date}
282 { year empty$
283     { month empty$
284         { "" }
285         { "there's a month but no year in " cite$ * warning$
286           month
287         }
288       if$
289     }
290     { month empty$
291         'year
292         { month " " * year * }
293       if$
294     }
295   if$
296 }
297
298 FUNCTION {format.btitle}
299 { title emphasize
300 }
301
302 FUNCTION {tie.or.space.connect}
303 { duplicate$ text.length$ #3 <
304     { "~" }
305     { " " }
306   if$
307   swap$ * *
308 }
309
310 FUNCTION {either.or.check}
311 { empty$
312     'pop$
313     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
314   if$
315 }
316
317 FUNCTION {format.bvolume}
318 { volume empty$
319     { "" }
320     { "volume" volume tie.or.space.connect
321       series empty$
322         'skip$
323         { " of " * series emphasize * }
324       if$
325       "volume and number" number either.or.check
326     }
327   if$
328 }
329
330 FUNCTION {format.number.series}
331 { volume empty$
332     { number empty$
333         { series field.or.null }
334         { output.state mid.sentence =
335             { "number" }
336             { "Number" }
337           if$
338           number tie.or.space.connect
339           series empty$
340             { "there's a number but no series in " cite$ * warning$ }
341             { " in " * series * }
342           if$
343         }
344       if$
345     }
346     { "" }
347   if$
348 }
349
350 FUNCTION {format.edition}
351 { edition empty$
352     { "" }
353     { output.state mid.sentence =
354         { edition "l" change.case$ " edition" * }
355         { edition "t" change.case$ " edition" * }
356       if$
357     }
358   if$
359 }
360
361 INTEGERS { multiresult }
362
363 FUNCTION {multi.page.check}
364 { 't :=
365   #0 'multiresult :=
366     { multiresult not
367       t empty$ not
368       and
369     }
370     { t #1 #1 substring$
371       duplicate$ "-" =
372       swap$ duplicate$ "," =
373       swap$ "+" =
374       or or
375         { #1 'multiresult := }
376         { t #2 global.max$ substring$ 't := }
377       if$
378     }
379   while$
380   multiresult
381 }
382
383 FUNCTION {format.pages}
384 { pages empty$
385     { "" }
386     { pages multi.page.check
387         { "pages" pages n.dashify tie.or.space.connect }
388         { "page" pages tie.or.space.connect }
389       if$
390     }
391   if$
392 }
393
394 FUNCTION {format.vol.num.pages}
395 { volume field.or.null
396   number empty$
397     'skip$
398     { "(" number * ")" * *
399       volume empty$
400         { "there's a number but no volume in " cite$ * warning$ }
401         'skip$
402       if$
403     }
404   if$
405   pages empty$
406     'skip$
407     { duplicate$ empty$
408         { pop$ format.pages }
409         { ":" * pages n.dashify * }
410       if$
411     }
412   if$
413 }
414
415 FUNCTION {format.chapter.pages}
416 { chapter empty$
417     'format.pages
418     { type empty$
419         { "chapter" }
420         { type "l" change.case$ }
421       if$
422       chapter tie.or.space.connect
423       pages empty$
424         'skip$
425         { ", " * format.pages * }
426       if$
427     }
428   if$
429 }
430
431 FUNCTION {format.in.ed.booktitle}
432 { booktitle empty$
433     { "" }
434     { editor empty$
435         { "In " booktitle emphasize * }
436         { "In " format.editors * ", " * booktitle emphasize * }
437       if$
438     }
439   if$
440 }
441
442 FUNCTION {empty.misc.check}
443 { author empty$ title empty$ howpublished empty$
444   month empty$ year empty$ note empty$
445   and and and and and
446   key empty$ not and
447     { "all relevant fields are empty in " cite$ * warning$ }
448     'skip$
449   if$
450 }
451
452 FUNCTION {format.thesis.type}
453 { type empty$
454     'skip$
455     { pop$
456       type "t" change.case$
457     }
458   if$
459 }
460
461 FUNCTION {format.tr.number}
462 { type empty$
463     { "Technical Report" }
464     'type
465   if$
466   number empty$
467     { "t" change.case$ }
468     { number tie.or.space.connect }
469   if$
470 }
471
472 FUNCTION {format.article.crossref}
473 { key empty$
474     { journal empty$
475         { "need key or journal for " cite$ * " to crossref " * crossref *
476           warning$
477           ""
478         }
479         { "In {\em " journal * "\/}" * }
480       if$
481     }
482     { "In " key * }
483   if$
484   " \cite{" * crossref * "}" *
485 }
486
487 FUNCTION {format.crossref.editor}
488 { editor #1 "{vv~}{ll}" format.name$
489   editor num.names$ duplicate$
490   #2 >
491     { pop$ " et~al." * }
492     { #2 <
493         'skip$
494         { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
495             { " et~al." * }
496             { " and " * editor #2 "{vv~}{ll}" format.name$ * }
497           if$
498         }
499       if$
500     }
501   if$
502 }
503
504 FUNCTION {format.book.crossref}
505 { volume empty$
506     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
507       "In "
508     }
509     { "Volume" volume tie.or.space.connect
510       " of " *
511     }
512   if$
513   editor empty$
514   editor field.or.null author field.or.null =
515   or
516     { key empty$
517         { series empty$
518             { "need editor, key, or series for " cite$ * " to crossref " *
519               crossref * warning$
520               "" *
521             }
522             { "{\em " * series * "\/}" * }
523           if$
524         }
525         { key * }
526       if$
527     }
528     { format.crossref.editor * }
529   if$
530   " \cite{" * crossref * "}" *
531 }
532
533 FUNCTION {format.incoll.inproc.crossref}
534 { editor empty$
535   editor field.or.null author field.or.null =
536   or
537     { key empty$
538         { booktitle empty$
539             { "need editor, key, or booktitle for " cite$ * " to crossref " *
540               crossref * warning$
541               ""
542             }
543             { "In {\em " booktitle * "\/}" * }
544           if$
545         }
546         { "In " key * }
547       if$
548     }
549     { "In " format.crossref.editor * }
550   if$
551   " \cite{" * crossref * "}" *
552 }
553
554 FUNCTION {article}
555 { output.bibitem
556   format.authors "author" output.check
557   new.block
558   format.title "title" output.check
559   new.block
560   crossref missing$
561     { journal emphasize "journal" output.check
562       format.vol.num.pages output
563       format.date "year" output.check
564     }
565     { format.article.crossref output.nonnull
566       format.pages output
567     }
568   if$
569   new.block
570   note output
571   fin.entry
572 }
573
574 FUNCTION {book}
575 { output.bibitem
576   author empty$
577     { format.editors "author and editor" output.check }
578     { format.authors output.nonnull
579       crossref missing$
580         { "author and editor" editor either.or.check }
581         'skip$
582       if$
583     }
584   if$
585   new.block
586   format.btitle "title" output.check
587   crossref missing$
588     { format.bvolume output
589       new.block
590       format.number.series output
591       new.sentence
592       publisher "publisher" output.check
593       address output
594     }
595     { new.block
596       format.book.crossref output.nonnull
597     }
598   if$
599   format.edition output
600   format.date "year" output.check
601   new.block
602   note output
603   fin.entry
604 }
605
606 FUNCTION {booklet}
607 { output.bibitem
608   format.authors output
609   new.block
610   format.title "title" output.check
611   howpublished address new.block.checkb
612   howpublished output
613   address output
614   format.date output
615   new.block
616   note output
617   fin.entry
618 }
619
620 FUNCTION {inbook}
621 { output.bibitem
622   author empty$
623     { format.editors "author and editor" output.check }
624     { format.authors output.nonnull
625       crossref missing$
626         { "author and editor" editor either.or.check }
627         'skip$
628       if$
629     }
630   if$
631   new.block
632   format.btitle "title" output.check
633   crossref missing$
634     { format.bvolume output
635       format.chapter.pages "chapter and pages" output.check
636       new.block
637       format.number.series output
638       new.sentence
639       publisher "publisher" output.check
640       address output
641     }
642     { format.chapter.pages "chapter and pages" output.check
643       new.block
644       format.book.crossref output.nonnull
645     }
646   if$
647   format.edition output
648   format.date "year" output.check
649   new.block
650   note output
651   fin.entry
652 }
653
654 FUNCTION {incollection}
655 { output.bibitem
656   format.authors "author" output.check
657   new.block
658   format.title "title" output.check
659   new.block
660   crossref missing$
661     { format.in.ed.booktitle "booktitle" output.check
662       format.bvolume output
663       format.number.series output
664       format.chapter.pages output
665       new.sentence
666       publisher "publisher" output.check
667       address output
668       format.edition output
669       format.date "year" output.check
670     }
671     { format.incoll.inproc.crossref output.nonnull
672       format.chapter.pages output
673     }
674   if$
675   new.block
676   note output
677   fin.entry
678 }
679
680 FUNCTION {inproceedings}
681 { output.bibitem
682   format.authors "author" output.check
683   new.block
684   format.title "title" output.check
685   new.block
686   crossref missing$
687     { format.in.ed.booktitle "booktitle" output.check
688       format.bvolume output
689       format.number.series output
690       format.pages output
691       address empty$
692         { organization publisher new.sentence.checkb
693           organization output
694           publisher output
695           format.date "year" output.check
696         }
697         { address output.nonnull
698           format.date "year" output.check
699           new.sentence
700           organization output
701           publisher output
702         }
703       if$
704     }
705     { format.incoll.inproc.crossref output.nonnull
706       format.pages output
707     }
708   if$
709   new.block
710   note output
711   fin.entry
712 }
713
714 FUNCTION {conference} { inproceedings }
715
716 FUNCTION {manual}
717 { output.bibitem
718   author empty$
719     { organization empty$
720         'skip$
721         { organization output.nonnull
722           address output
723         }
724       if$
725     }
726     { format.authors output.nonnull }
727   if$
728   new.block
729   format.btitle "title" output.check
730   author empty$
731     { organization empty$
732         { address new.block.checka
733           address output
734         }
735         'skip$
736       if$
737     }
738     { organization address new.block.checkb
739       organization output
740       address output
741     }
742   if$
743   format.edition output
744   format.date output
745   new.block
746   note output
747   fin.entry
748 }
749
750 FUNCTION {mastersthesis}
751 { output.bibitem
752   format.authors "author" output.check
753   new.block
754   format.title "title" output.check
755   new.block
756   "Master's thesis" format.thesis.type output.nonnull
757   school "school" output.check
758   address output
759   format.date "year" output.check
760   new.block
761   note output
762   fin.entry
763 }
764
765 FUNCTION {misc}
766 { output.bibitem
767   format.authors output
768   title howpublished new.block.checkb
769   format.title output
770   howpublished new.block.checka
771   howpublished output
772   format.date output
773   new.block
774   note output
775   fin.entry
776   empty.misc.check
777 }
778
779 FUNCTION {phdthesis}
780 { output.bibitem
781   format.authors "author" output.check
782   new.block
783   format.btitle "title" output.check
784   new.block
785   "PhD thesis" format.thesis.type output.nonnull
786   school "school" output.check
787   address output
788   format.date "year" output.check
789   new.block
790   note output
791   fin.entry
792 }
793
794 FUNCTION {proceedings}
795 { output.bibitem
796   editor empty$
797     { organization output }
798     { format.editors output.nonnull }
799   if$
800   new.block
801   format.btitle "title" output.check
802   format.bvolume output
803   format.number.series output
804   address empty$
805     { editor empty$
806         { publisher new.sentence.checka }
807         { organization publisher new.sentence.checkb
808           organization output
809         }
810       if$
811       publisher output
812       format.date "year" output.check
813     }
814     { address output.nonnull
815       format.date "year" output.check
816       new.sentence
817       editor empty$
818         'skip$
819         { organization output }
820       if$
821       publisher output
822     }
823   if$
824   new.block
825   note output
826   fin.entry
827 }
828
829 FUNCTION {techreport}
830 { output.bibitem
831   format.authors "author" output.check
832   new.block
833   format.title "title" output.check
834   new.block
835   format.tr.number output.nonnull
836   institution "institution" output.check
837   address output
838   format.date "year" output.check
839   new.block
840   note output
841   fin.entry
842 }
843
844 FUNCTION {unpublished}
845 { output.bibitem
846   format.authors "author" output.check
847   new.block
848   format.title "title" output.check
849   new.block
850   note "note" output.check
851   format.date output
852   fin.entry
853 }
854
855 FUNCTION {default.type} { misc }
856
857 MACRO {jan} {"January"}
858
859 MACRO {feb} {"February"}
860
861 MACRO {mar} {"March"}
862
863 MACRO {apr} {"April"}
864
865 MACRO {may} {"May"}
866
867 MACRO {jun} {"June"}
868
869 MACRO {jul} {"July"}
870
871 MACRO {aug} {"August"}
872
873 MACRO {sep} {"September"}
874
875 MACRO {oct} {"October"}
876
877 MACRO {nov} {"November"}
878
879 MACRO {dec} {"December"}
880
881 MACRO {acmcs} {"ACM Computing Surveys"}
882
883 MACRO {acta} {"Acta Informatica"}
884
885 MACRO {cacm} {"Communications of the ACM"}
886
887 MACRO {ibmjrd} {"IBM Journal of Research and Development"}
888
889 MACRO {ibmsj} {"IBM Systems Journal"}
890
891 MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
892
893 MACRO {ieeetc} {"IEEE Transactions on Computers"}
894
895 MACRO {ieeetcad}
896  {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
897
898 MACRO {ipl} {"Information Processing Letters"}
899
900 MACRO {jacm} {"Journal of the ACM"}
901
902 MACRO {jcss} {"Journal of Computer and System Sciences"}
903
904 MACRO {scp} {"Science of Computer Programming"}
905
906 MACRO {sicomp} {"SIAM Journal on Computing"}
907
908 MACRO {tocs} {"ACM Transactions on Computer Systems"}
909
910 MACRO {tods} {"ACM Transactions on Database Systems"}
911
912 MACRO {tog} {"ACM Transactions on Graphics"}
913
914 MACRO {toms} {"ACM Transactions on Mathematical Software"}
915
916 MACRO {toois} {"ACM Transactions on Office Information Systems"}
917
918 MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
919
920 MACRO {tcs} {"Theoretical Computer Science"}
921
922 READ
923
924 FUNCTION {sortify}
925 { purify$
926   "l" change.case$
927 }
928
929 INTEGERS { len }
930
931 FUNCTION {chop.word}
932 { 's :=
933   'len :=
934   s #1 len substring$ =
935     { s len #1 + global.max$ substring$ }
936     's
937   if$
938 }
939
940 INTEGERS { et.al.char.used }
941
942 FUNCTION {initialize.et.al.char.used}
943 { #0 'et.al.char.used :=
944 }
945
946 EXECUTE {initialize.et.al.char.used}
947
948 FUNCTION {format.lab.names}
949 { 's :=
950   s num.names$ 'numnames :=
951   numnames #1 >
952     { numnames #4 >
953         { #3 'namesleft := }
954         { numnames 'namesleft := }
955       if$
956       #1 'nameptr :=
957       ""
958         { namesleft #0 > }
959         { nameptr numnames =
960             { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
961                 { "{\etalchar{+}}" *
962                   #1 'et.al.char.used :=
963                 }
964                 { s nameptr "{v{}}{l{}}" format.name$ * }
965               if$
966             }
967             { s nameptr "{v{}}{l{}}" format.name$ * }
968           if$
969           nameptr #1 + 'nameptr :=
970           namesleft #1 - 'namesleft :=
971         }
972       while$
973       numnames #4 >
974         { "{\etalchar{+}}" *
975           #1 'et.al.char.used :=
976         }
977         'skip$
978       if$
979     }
980     { s #1 "{v{}}{l{}}" format.name$
981       duplicate$ text.length$ #2 <
982         { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
983         'skip$
984       if$
985     }
986   if$
987 }
988
989 FUNCTION {author.key.label}
990 { author empty$
991     { key empty$
992         { cite$ #1 #3 substring$ }
993         { key #3 text.prefix$ }
994       if$
995     }
996     { author format.lab.names }
997   if$
998 }
999
1000 FUNCTION {author.editor.key.label}
1001 { author empty$
1002     { editor empty$
1003         { key empty$
1004             { cite$ #1 #3 substring$ }
1005             { key #3 text.prefix$ }
1006           if$
1007         }
1008         { editor format.lab.names }
1009       if$
1010     }
1011     { author format.lab.names }
1012   if$
1013 }
1014
1015 FUNCTION {author.key.organization.label}
1016 { author empty$
1017     { key empty$
1018         { organization empty$
1019             { cite$ #1 #3 substring$ }
1020             { "The " #4 organization chop.word #3 text.prefix$ }
1021           if$
1022         }
1023         { key #3 text.prefix$ }
1024       if$
1025     }
1026     { author format.lab.names }
1027   if$
1028 }
1029
1030 FUNCTION {editor.key.organization.label}
1031 { editor empty$
1032     { key empty$
1033         { organization empty$
1034             { cite$ #1 #3 substring$ }
1035             { "The " #4 organization chop.word #3 text.prefix$ }
1036           if$
1037         }
1038         { key #3 text.prefix$ }
1039       if$
1040     }
1041     { editor format.lab.names }
1042   if$
1043 }
1044
1045 FUNCTION {calc.label}
1046 { type$ "book" =
1047   type$ "inbook" =
1048   or
1049     'author.editor.key.label
1050     { type$ "proceedings" =
1051         'editor.key.organization.label
1052         { type$ "manual" =
1053             'author.key.organization.label
1054             'author.key.label
1055           if$
1056         }
1057       if$
1058     }
1059   if$
1060   duplicate$
1061   year field.or.null purify$ #-1 #2 substring$
1062   *
1063   'label :=
1064   year field.or.null purify$ #-1 #4 substring$
1065   *
1066   sortify 'sort.label :=
1067 }
1068
1069 FUNCTION {sort.format.names}
1070 { 's :=
1071   #1 'nameptr :=
1072   ""
1073   s num.names$ 'numnames :=
1074   numnames 'namesleft :=
1075     { namesleft #0 > }
1076     { nameptr #1 >
1077         { "   " * }
1078         'skip$
1079       if$
1080       s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
1081       nameptr numnames = t "others" = and
1082         { "et al" * }
1083         { t sortify * }
1084       if$
1085       nameptr #1 + 'nameptr :=
1086       namesleft #1 - 'namesleft :=
1087     }
1088   while$
1089 }
1090
1091 FUNCTION {sort.format.title}
1092 { 't :=
1093   "A " #2
1094     "An " #3
1095       "The " #4 t chop.word
1096     chop.word
1097   chop.word
1098   sortify
1099   #1 global.max$ substring$
1100 }
1101
1102 FUNCTION {author.sort}
1103 { author empty$
1104     { key empty$
1105         { "to sort, need author or key in " cite$ * warning$
1106           ""
1107         }
1108         { key sortify }
1109       if$
1110     }
1111     { author sort.format.names }
1112   if$
1113 }
1114
1115 FUNCTION {author.editor.sort}
1116 { author empty$
1117     { editor empty$
1118         { key empty$
1119             { "to sort, need author, editor, or key in " cite$ * warning$
1120               ""
1121             }
1122             { key sortify }
1123           if$
1124         }
1125         { editor sort.format.names }
1126       if$
1127     }
1128     { author sort.format.names }
1129   if$
1130 }
1131
1132 FUNCTION {author.organization.sort}
1133 { author empty$
1134     { organization empty$
1135         { key empty$
1136             { "to sort, need author, organization, or key in " cite$ * warning$
1137               ""
1138             }
1139             { key sortify }
1140           if$
1141         }
1142         { "The " #4 organization chop.word sortify }
1143       if$
1144     }
1145     { author sort.format.names }
1146   if$
1147 }
1148
1149 FUNCTION {editor.organization.sort}
1150 { editor empty$
1151     { organization empty$
1152         { key empty$
1153             { "to sort, need editor, organization, or key in " cite$ * warning$
1154               ""
1155             }
1156             { key sortify }
1157           if$
1158         }
1159         { "The " #4 organization chop.word sortify }
1160       if$
1161     }
1162     { editor sort.format.names }
1163   if$
1164 }
1165
1166 FUNCTION {presort}
1167 { calc.label
1168   sort.label
1169   "    "
1170   *
1171   type$ "book" =
1172   type$ "inbook" =
1173   or
1174     'author.editor.sort
1175     { type$ "proceedings" =
1176         'editor.organization.sort
1177         { type$ "manual" =
1178             'author.organization.sort
1179             'author.sort
1180           if$
1181         }
1182       if$
1183     }
1184   if$
1185   *
1186   "    "
1187   *
1188   year field.or.null sortify
1189   *
1190   "    "
1191   *
1192   title field.or.null
1193   sort.format.title
1194   *
1195   #1 entry.max$ substring$
1196   'sort.key$ :=
1197 }
1198
1199 ITERATE {presort}
1200
1201 SORT
1202
1203 STRINGS { longest.label last.sort.label next.extra }
1204
1205 INTEGERS { longest.label.width last.extra.num }
1206
1207 FUNCTION {initialize.longest.label}
1208 { "" 'longest.label :=
1209   #0 int.to.chr$ 'last.sort.label :=
1210   "" 'next.extra :=
1211   #0 'longest.label.width :=
1212   #0 'last.extra.num :=
1213 }
1214
1215 FUNCTION {forward.pass}
1216 { last.sort.label sort.label =
1217     { last.extra.num #1 + 'last.extra.num :=
1218       last.extra.num int.to.chr$ 'extra.label :=
1219     }
1220     { "a" chr.to.int$ 'last.extra.num :=
1221       "" 'extra.label :=
1222       sort.label 'last.sort.label :=
1223     }
1224   if$
1225 }
1226
1227 FUNCTION {reverse.pass}
1228 { next.extra "b" =
1229     { "a" 'extra.label := }
1230     'skip$
1231   if$
1232   label extra.label * 'label :=
1233   label width$ longest.label.width >
1234     { label 'longest.label :=
1235       label width$ 'longest.label.width :=
1236     }
1237     'skip$
1238   if$
1239   extra.label 'next.extra :=
1240 }
1241
1242 EXECUTE {initialize.longest.label}
1243
1244 ITERATE {forward.pass}
1245
1246 REVERSE {reverse.pass}
1247
1248 FUNCTION {begin.bib}
1249 { et.al.char.used
1250     { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ }
1251     'skip$
1252   if$
1253   "\makeatletter" write$ newline$
1254   "\@ifundefined{xbiblabel}{\newcommand{\xbiblabel}[4]{#4}}{}" write$ newline$
1255   "\let\@oldbiblabel\@biblabel" write$ newline$
1256   "\renewcommand{\@biblabel}[1]%" write$ newline$
1257   " {{\def\xbiblabel##1##2##3##4{\hyperref{##1}{##2}{##3}{##4}}%"
1258   write$ newline$
1259   "   \@oldbiblabel{#1}}}" write$ newline$
1260   "\makeatother"  write$ newline$
1261   newline$
1262
1263   preamble$ empty$
1264     'skip$
1265     { preamble$ write$ newline$ }
1266   if$
1267   "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
1268 }
1269
1270 EXECUTE {begin.bib}
1271
1272 EXECUTE {init.state.consts}
1273
1274 ITERATE {call.type$}
1275
1276 FUNCTION {end.bib}
1277 { newline$
1278   "\end{thebibliography}" write$ newline$
1279 }
1280
1281 EXECUTE {end.bib}