]> AND Private Git Repository - Sensornets15.git/blob - apalike.bst
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Still working on sections 5 and 6
[Sensornets15.git] / apalike.bst
1 %NAME: apalike.bst
2 % BibTeX `apalike' bibliography style (24-Jan-88 version)
3 % Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
4 % Copyright (C) 1988, all rights reserved.
5 % Copying of this file is allowed, provided that if you make any changes at all
6 % you name it something other than `apalike.bst'.
7 % This restriction helps ensure that all copies are identical.
8 % Differences between this style and `alpha' are generally heralded by a `%'.
9 % The file btxbst.doc has the documentation for alpha.bst.
10 %
11 % This style should be used with the `apalike' LaTeX style (apalike.sty).
12 % \cite's come out like "(Jones, 1986)" in the text but there are no labels
13 % in the bibliography, and something like "(1986)" comes out immediately
14 % after the author.  Author (and editor) names appear as last name, comma,
15 % initials.  A `year' field is required for every entry, and so is either
16 % an author (or in some cases, an editor) field or a key field.
17 %
18 % Editorial note:
19 % Many journals require a style like `apalike', but I strongly, strongly,
20 % strongly recommend that you not use it if you have a choice---use something
21 % like `plain' instead.  Mary-Claire van Leunen (A Handbook for Scholars,
22 % Knopf, 1979) argues convincingly that a style like `plain' encourages better
23 % writing than one like `apalike'.  Furthermore the strongest arguments for
24 % using an author-date style like `apalike'---that it's "the most practical"
25 % (The Chicago Manual of Style, University of Chicago Press, thirteenth
26 % edition, 1982, pages 400--401)---fall flat on their face with the new
27 % computer-typesetting technology.  For instance page 401 anachronistically
28 % states "The chief disadvantage of [a style like `plain'] is that additions
29 % or deletions cannot be made after the manuscript is typed without changing
30 % numbers in both text references and list."  LaTeX sidesteps the disadvantage.
31 %
32 % History:
33 %   15-sep-86   (SK,OP) Original version, by Susan King and Oren Patashnik.
34 %   10-nov-86   (OP)    Truncated the sort.key$ string to the correct length
35 %                       in bib.sort.order to eliminate error message.
36 %   24-jan-88   (OP)    Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
37 %                       apalike now sorts by author, then year, then title;
38 %                       THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
39
40 ENTRY
41   { address
42     author
43     booktitle
44     chapter
45     edition
46     editor
47     howpublished
48     institution
49     journal
50     key
51 %    month              not used in apalike
52     note
53     number
54     organization
55     pages
56     publisher
57     school
58     series
59     title
60     type
61     volume
62     year
63   }
64   {}
65   { label extra.label sort.label }
66
67 INTEGERS { output.state before.all mid.sentence after.sentence after.block }
68
69 FUNCTION {init.state.consts}
70 { #0 'before.all :=
71   #1 'mid.sentence :=
72   #2 'after.sentence :=
73   #3 'after.block :=
74 }
75
76 STRINGS { s t }
77
78 FUNCTION {output.nonnull}
79 { 's :=
80   output.state mid.sentence =
81     { ", " * write$ }
82     { output.state after.block =
83         { add.period$ write$
84           newline$
85           "\newblock " write$
86         }
87         { output.state before.all =
88             'write$
89             { add.period$ " " * write$ }
90           if$
91         }
92       if$
93       mid.sentence 'output.state :=
94     }
95   if$
96   s
97 }
98
99 FUNCTION {output}
100 { duplicate$ empty$
101     'pop$
102     'output.nonnull
103   if$
104 }
105
106 FUNCTION {output.check}
107 { 't :=
108   duplicate$ empty$
109     { pop$ "empty " t * " in " * cite$ * warning$ }
110     'output.nonnull
111   if$
112 }
113
114 %                                       apalike needs this function because
115 %                                       the year has special punctuation;
116 %                                       apalike ignores the month
117 FUNCTION {output.year.check}
118 { year empty$
119     { "empty year in " cite$ * warning$ }
120     { write$
121       " (" year * extra.label * ")" *
122       mid.sentence 'output.state :=
123     }
124   if$
125 }
126
127 FUNCTION {output.bibitem}
128 { newline$
129   "\bibitem[" write$
130   label write$
131   "]{" write$
132   cite$ write$
133   "}" write$
134   newline$
135   ""
136   before.all 'output.state :=
137 }
138
139 FUNCTION {fin.entry}
140 { add.period$
141   write$
142   newline$
143 }
144
145 FUNCTION {new.block}
146 { output.state before.all =
147     'skip$
148     { after.block 'output.state := }
149   if$
150 }
151
152 FUNCTION {new.sentence}
153 { output.state after.block =
154     'skip$
155     { output.state before.all =
156         'skip$
157         { after.sentence 'output.state := }
158       if$
159     }
160   if$
161 }
162
163 FUNCTION {not}
164 {   { #0 }
165     { #1 }
166   if$
167 }
168
169 FUNCTION {and}
170 {   'skip$
171     { pop$ #0 }
172   if$
173 }
174
175 FUNCTION {or}
176 {   { pop$ #1 }
177     'skip$
178   if$
179 }
180
181 FUNCTION {new.block.checkb}
182 { empty$
183   swap$ empty$
184   and
185     'skip$
186     'new.block
187   if$
188 }
189
190 FUNCTION {field.or.null}
191 { duplicate$ empty$
192     { pop$ "" }
193     'skip$
194   if$
195 }
196
197 FUNCTION {emphasize}
198 { duplicate$ empty$
199     { pop$ "" }
200     { "{\em " swap$ * "}" * }
201   if$
202 }
203
204 INTEGERS { nameptr namesleft numnames }
205
206 FUNCTION {format.names}
207 { 's :=
208   #1 'nameptr :=
209   s num.names$ 'numnames :=
210   numnames 'namesleft :=
211     { namesleft #0 > }
212     { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=   % last name first
213       nameptr #1 >
214         { namesleft #1 >
215             { ", " * t * }
216             { numnames #2 >
217                 { "," * }
218                 'skip$
219               if$
220               t "others" =
221                 { " et~al." * }
222                 { " and " * t * }
223               if$
224             }
225           if$
226         }
227         't
228       if$
229       nameptr #1 + 'nameptr :=
230       namesleft #1 - 'namesleft :=
231     }
232   while$
233 }
234
235 FUNCTION {format.authors}
236 { author empty$
237     { "" }
238     { author format.names }
239   if$
240 }
241
242 FUNCTION {format.key}                   % this function is just for apalike
243 { empty$
244     { key field.or.null }
245     { "" }
246   if$
247 }
248
249 FUNCTION {format.editors}
250 { editor empty$
251     { "" }
252     { editor format.names
253       editor num.names$ #1 >
254         { ", editors" * }
255         { ", editor" * }
256       if$
257     }
258   if$
259 }
260
261 FUNCTION {format.title}
262 { title empty$
263     { "" }
264     { title "t" change.case$ }
265   if$
266 }
267
268 FUNCTION {n.dashify}
269 { 't :=
270   ""
271     { t empty$ not }
272     { t #1 #1 substring$ "-" =
273         { t #1 #2 substring$ "--" = not
274             { "--" *
275               t #2 global.max$ substring$ 't :=
276             }
277             {   { t #1 #1 substring$ "-" = }
278                 { "-" *
279                   t #2 global.max$ substring$ 't :=
280                 }
281               while$
282             }
283           if$
284         }
285         { t #1 #1 substring$ *
286           t #2 global.max$ substring$ 't :=
287         }
288       if$
289     }
290   while$
291 }
292
293 FUNCTION {format.btitle}
294 { title emphasize
295 }
296
297 FUNCTION {tie.or.space.connect}
298 { duplicate$ text.length$ #3 <
299     { "~" }
300     { " " }
301   if$
302   swap$ * *
303 }
304
305 FUNCTION {either.or.check}
306 { empty$
307     'pop$
308     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
309   if$
310 }
311
312 FUNCTION {format.bvolume}
313 { volume empty$
314     { "" }
315     { "volume" volume tie.or.space.connect
316       series empty$
317         'skip$
318         { " of " * series emphasize * }
319       if$
320       "volume and number" number either.or.check
321     }
322   if$
323 }
324
325 FUNCTION {format.number.series}
326 { volume empty$
327     { number empty$
328         { series field.or.null }
329         { output.state mid.sentence =
330             { "number" }
331             { "Number" }
332           if$
333           number tie.or.space.connect
334           series empty$
335             { "there's a number but no series in " cite$ * warning$ }
336             { " in " * series * }
337           if$
338         }
339       if$
340     }
341     { "" }
342   if$
343 }
344
345 FUNCTION {format.edition}
346 { edition empty$
347     { "" }
348     { output.state mid.sentence =
349         { edition "l" change.case$ " edition" * }
350         { edition "t" change.case$ " edition" * }
351       if$
352     }
353   if$
354 }
355
356 INTEGERS { multiresult }
357
358 FUNCTION {multi.page.check}
359 { 't :=
360   #0 'multiresult :=
361     { multiresult not
362       t empty$ not
363       and
364     }
365     { t #1 #1 substring$
366       duplicate$ "-" =
367       swap$ duplicate$ "," =
368       swap$ "+" =
369       or or
370         { #1 'multiresult := }
371         { t #2 global.max$ substring$ 't := }
372       if$
373     }
374   while$
375   multiresult
376 }
377
378 FUNCTION {format.pages}
379 { pages empty$
380     { "" }
381     { pages multi.page.check
382         { "pages" pages n.dashify tie.or.space.connect }
383         { "page" pages tie.or.space.connect }
384       if$
385     }
386   if$
387 }
388
389 FUNCTION {format.vol.num.pages}
390 { volume field.or.null
391   number empty$
392     'skip$
393     { "(" number * ")" * *
394       volume empty$
395         { "there's a number but no volume in " cite$ * warning$ }
396         'skip$
397       if$
398     }
399   if$
400   pages empty$
401     'skip$
402     { duplicate$ empty$
403         { pop$ format.pages }
404         { ":" * pages n.dashify * }
405       if$
406     }
407   if$
408 }
409
410 FUNCTION {format.chapter.pages}
411 { chapter empty$
412     'format.pages
413     { type empty$
414         { "chapter" }
415         { type "l" change.case$ }
416       if$
417       chapter tie.or.space.connect
418       pages empty$
419         'skip$
420         { ", " * format.pages * }
421       if$
422     }
423   if$
424 }
425
426 FUNCTION {format.in.ed.booktitle}
427 { booktitle empty$
428     { "" }
429     { editor empty$
430         { "In " booktitle emphasize * }
431         { "In " format.editors * ", " * booktitle emphasize * }
432       if$
433     }
434   if$
435 }
436
437 FUNCTION {format.thesis.type}
438 { type empty$
439     'skip$
440     { pop$
441       type "t" change.case$
442     }
443   if$
444 }
445
446 FUNCTION {format.tr.number}
447 { type empty$
448     { "Technical Report" }
449     'type
450   if$
451   number empty$
452     { "t" change.case$ }
453     { number tie.or.space.connect }
454   if$
455 }
456
457 FUNCTION {format.article.crossref}
458 { "In"                                                  % this is for apalike
459   " \cite{" * crossref * "}" *
460 }
461
462 FUNCTION {format.book.crossref}
463 { volume empty$
464     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
465       "In "
466     }
467     { "Volume" volume tie.or.space.connect
468       " of " *
469     }
470   if$
471   "\cite{" * crossref * "}" *                           % this is for apalike
472 }
473
474 FUNCTION {format.incoll.inproc.crossref}
475 { "In"                                                  % this is for apalike
476   " \cite{" * crossref * "}" *
477 }
478
479 FUNCTION {article}
480 { output.bibitem
481   format.authors "author" output.check
482   author format.key output                              % special for
483   output.year.check                                     % apalike
484   new.block
485   format.title "title" output.check
486   new.block
487   crossref missing$
488     { journal emphasize "journal" output.check
489       format.vol.num.pages output
490     }
491     { format.article.crossref output.nonnull
492       format.pages output
493     }
494   if$
495   new.block
496   note output
497   fin.entry
498 }
499
500 FUNCTION {book}
501 { output.bibitem
502   author empty$
503     { format.editors "author and editor" output.check
504       editor format.key output
505     }
506     { format.authors output.nonnull
507       crossref missing$
508         { "author and editor" editor either.or.check }
509         'skip$
510       if$
511     }
512   if$
513   output.year.check                             % special for apalike
514   new.block
515   format.btitle "title" output.check
516   crossref missing$
517     { format.bvolume output
518       new.block
519       format.number.series output
520       new.sentence
521       publisher "publisher" output.check
522       address output
523     }
524     { new.block
525       format.book.crossref output.nonnull
526     }
527   if$
528   format.edition output
529   new.block
530   note output
531   fin.entry
532 }
533
534 FUNCTION {booklet}
535 { output.bibitem
536   format.authors output
537   author format.key output                              % special for
538   output.year.check                                     % apalike
539   new.block
540   format.title "title" output.check
541   new.block
542   howpublished output
543   address output
544   new.block
545   note output
546   fin.entry
547 }
548
549 FUNCTION {inbook}
550 { output.bibitem
551   author empty$
552     { format.editors "author and editor" output.check
553       editor format.key output
554     }
555     { format.authors output.nonnull
556       crossref missing$
557         { "author and editor" editor either.or.check }
558         'skip$
559       if$
560     }
561   if$
562   output.year.check                             % special for apalike
563   new.block
564   format.btitle "title" output.check
565   crossref missing$
566     { format.bvolume output
567       format.chapter.pages "chapter and pages" output.check
568       new.block
569       format.number.series output
570       new.sentence
571       publisher "publisher" output.check
572       address output
573     }
574     { format.chapter.pages "chapter and pages" output.check
575       new.block
576       format.book.crossref output.nonnull
577     }
578   if$
579   format.edition output
580   new.block
581   note output
582   fin.entry
583 }
584
585 FUNCTION {incollection}
586 { output.bibitem
587   format.authors "author" output.check
588   author format.key output                              % special for
589   output.year.check                                     % apalike
590   new.block
591   format.title "title" output.check
592   new.block
593   crossref missing$
594     { format.in.ed.booktitle "booktitle" output.check
595       format.bvolume output
596       format.number.series output
597       format.chapter.pages output
598       new.sentence
599       publisher "publisher" output.check
600       address output
601       format.edition output
602     }
603     { format.incoll.inproc.crossref output.nonnull
604       format.chapter.pages output
605     }
606   if$
607   new.block
608   note output
609   fin.entry
610 }
611
612 FUNCTION {inproceedings}
613 { output.bibitem
614   format.authors "author" output.check
615   author format.key output                              % special for
616   output.year.check                                     % apalike
617   new.block
618   format.title "title" output.check
619   new.block
620   crossref missing$
621     { format.in.ed.booktitle "booktitle" output.check
622       format.bvolume output
623       format.number.series output
624       format.pages output
625       address output                                    % for apalike
626       new.sentence                                      % there's no year
627       organization output                               % here so things
628       publisher output                                  % are simpler
629     }
630     { format.incoll.inproc.crossref output.nonnull
631       format.pages output
632     }
633   if$
634   new.block
635   note output
636   fin.entry
637 }
638
639 FUNCTION {conference} { inproceedings }
640
641 FUNCTION {manual}
642 { output.bibitem
643   format.authors output
644   author format.key output                              % special for
645   output.year.check                                     % apalike
646   new.block
647   format.btitle "title" output.check
648   organization address new.block.checkb
649   organization output
650   address output
651   format.edition output
652   new.block
653   note output
654   fin.entry
655 }
656
657 FUNCTION {mastersthesis}
658 { output.bibitem
659   format.authors "author" output.check
660   author format.key output                              % special for
661   output.year.check                                     % apalike
662   new.block
663   format.title "title" output.check
664   new.block
665   "Master's thesis" format.thesis.type output.nonnull
666   school "school" output.check
667   address output
668   new.block
669   note output
670   fin.entry
671 }
672
673 FUNCTION {misc}
674 { output.bibitem
675   format.authors output
676   author format.key output                              % special for
677   output.year.check                                     % apalike
678   new.block
679   format.title output
680   new.block
681   howpublished output
682   new.block
683   note output
684   fin.entry
685 }
686
687 FUNCTION {phdthesis}
688 { output.bibitem
689   format.authors "author" output.check
690   author format.key output                              % special for
691   output.year.check                                     % apalike
692   new.block
693   format.btitle "title" output.check
694   new.block
695   "PhD thesis" format.thesis.type output.nonnull
696   school "school" output.check
697   address output
698   new.block
699   note output
700   fin.entry
701 }
702
703 FUNCTION {proceedings}
704 { output.bibitem
705   format.editors output
706   editor format.key output                              % special for
707   output.year.check                                     % apalike
708   new.block
709   format.btitle "title" output.check
710   format.bvolume output
711   format.number.series output
712   address output                                % for apalike
713   new.sentence                                  % we always output
714   organization output                           % a nonempty organization
715   publisher output                              % here
716   new.block
717   note output
718   fin.entry
719 }
720
721 FUNCTION {techreport}
722 { output.bibitem
723   format.authors "author" output.check
724   author format.key output                              % special for
725   output.year.check                                     % apalike
726   new.block
727   format.title "title" output.check
728   new.block
729   format.tr.number output.nonnull
730   institution "institution" output.check
731   address output
732   new.block
733   note output
734   fin.entry
735 }
736
737 FUNCTION {unpublished}
738 { output.bibitem
739   format.authors "author" output.check
740   author format.key output                              % special for
741   output.year.check                                     % apalike
742   new.block
743   format.title "title" output.check
744   new.block
745   note "note" output.check
746   fin.entry
747 }
748
749 FUNCTION {default.type} { misc }
750
751 MACRO {jan} {"January"}
752
753 MACRO {feb} {"February"}
754
755 MACRO {mar} {"March"}
756
757 MACRO {apr} {"April"}
758
759 MACRO {may} {"May"}
760
761 MACRO {jun} {"June"}
762
763 MACRO {jul} {"July"}
764
765 MACRO {aug} {"August"}
766
767 MACRO {sep} {"September"}
768
769 MACRO {oct} {"October"}
770
771 MACRO {nov} {"November"}
772
773 MACRO {dec} {"December"}
774
775 MACRO {acmcs} {"ACM Computing Surveys"}
776
777 MACRO {acta} {"Acta Informatica"}
778
779 MACRO {cacm} {"Communications of the ACM"}
780
781 MACRO {ibmjrd} {"IBM Journal of Research and Development"}
782
783 MACRO {ibmsj} {"IBM Systems Journal"}
784
785 MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
786
787 MACRO {ieeetc} {"IEEE Transactions on Computers"}
788
789 MACRO {ieeetcad}
790  {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
791
792 MACRO {ipl} {"Information Processing Letters"}
793
794 MACRO {jacm} {"Journal of the ACM"}
795
796 MACRO {jcss} {"Journal of Computer and System Sciences"}
797
798 MACRO {scp} {"Science of Computer Programming"}
799
800 MACRO {sicomp} {"SIAM Journal on Computing"}
801
802 MACRO {tocs} {"ACM Transactions on Computer Systems"}
803
804 MACRO {tods} {"ACM Transactions on Database Systems"}
805
806 MACRO {tog} {"ACM Transactions on Graphics"}
807
808 MACRO {toms} {"ACM Transactions on Mathematical Software"}
809
810 MACRO {toois} {"ACM Transactions on Office Information Systems"}
811
812 MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
813
814 MACRO {tcs} {"Theoretical Computer Science"}
815
816 READ
817
818 FUNCTION {sortify}
819 { purify$
820   "l" change.case$
821 }
822
823 INTEGERS { len }
824
825 FUNCTION {chop.word}
826 { 's :=
827   'len :=
828   s #1 len substring$ =
829     { s len #1 + global.max$ substring$ }
830     's
831   if$
832 }
833
834 %                       There are three apalike cases: one person (Jones),
835 %                       two (Jones and de~Bruijn), and more (Jones et~al.).
836 %                       This function is much like format.crossref.editors.
837 %
838 FUNCTION {format.lab.names}
839 { 's :=
840   s #1 "{vv~}{ll}" format.name$
841   s num.names$ duplicate$
842   #2 >
843     { pop$ " et~al." * }
844     { #2 <
845         'skip$
846         { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
847             { " et~al." * }
848             { " and " * s #2 "{vv~}{ll}" format.name$ * }
849           if$
850         }
851       if$
852     }
853   if$
854 }
855
856 FUNCTION {author.key.label}
857 { author empty$
858     { key empty$
859         { cite$ #1 #3 substring$ }
860         'key                                    % apalike uses the whole key
861       if$
862     }
863     { author format.lab.names }
864   if$
865 }
866
867 FUNCTION {author.editor.key.label}
868 { author empty$
869     { editor empty$
870         { key empty$
871             { cite$ #1 #3 substring$ }
872             'key                                % apalike uses the whole key
873           if$
874         }
875         { editor format.lab.names }
876       if$
877     }
878     { author format.lab.names }
879   if$
880 }
881
882 FUNCTION {editor.key.label}
883 { editor empty$
884     { key empty$
885         { cite$ #1 #3 substring$ }
886         'key                    % apalike uses the whole key, no organization
887       if$
888     }
889     { editor format.lab.names }
890   if$
891 }
892
893 FUNCTION {calc.label}
894 { type$ "book" =
895   type$ "inbook" =
896   or
897     'author.editor.key.label
898     { type$ "proceedings" =
899         'editor.key.label                       % apalike ignores organization
900         'author.key.label                       % for labeling and sorting
901       if$
902     }
903   if$
904   ", "                                                  % these three lines are
905   *                                                     % for apalike, which
906   year field.or.null purify$ #-1 #4 substring$          % uses all four digits
907   *
908   'label :=
909 }
910
911 FUNCTION {sort.format.names}
912 { 's :=
913   #1 'nameptr :=
914   ""
915   s num.names$ 'numnames :=
916   numnames 'namesleft :=
917     { namesleft #0 > }
918     { nameptr #1 >
919         { "   " * }
920         'skip$
921       if$                                               % apalike uses initials
922       s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't := % <= here
923       nameptr numnames = t "others" = and
924         { "et al" * }
925         { t sortify * }
926       if$
927       nameptr #1 + 'nameptr :=
928       namesleft #1 - 'namesleft :=
929     }
930   while$
931 }
932
933 FUNCTION {sort.format.title}
934 { 't :=
935   "A " #2
936     "An " #3
937       "The " #4 t chop.word
938     chop.word
939   chop.word
940   sortify
941   #1 global.max$ substring$
942 }
943
944 FUNCTION {author.sort}
945 { author empty$
946     { key empty$
947         { "to sort, need author or key in " cite$ * warning$
948           ""
949         }
950         { key sortify }
951       if$
952     }
953     { author sort.format.names }
954   if$
955 }
956
957 FUNCTION {author.editor.sort}
958 { author empty$
959     { editor empty$
960         { key empty$
961             { "to sort, need author, editor, or key in " cite$ * warning$
962               ""
963             }
964             { key sortify }
965           if$
966         }
967         { editor sort.format.names }
968       if$
969     }
970     { author sort.format.names }
971   if$
972 }
973
974 FUNCTION {editor.sort}
975 { editor empty$
976     { key empty$
977         { "to sort, need editor or key in " cite$ * warning$
978           ""
979         }
980         { key sortify }
981       if$
982     }
983     { editor sort.format.names }
984   if$
985 }
986
987 %                       apalike uses two sorting passes; the first one sets the
988 %                       labels so that the `a's, `b's, etc. can be computed;
989 %                       the second pass puts the references in "correct" order.
990 %                       The presort function is for the first pass. It computes
991 %                       label, sort.label, and title, and then concatenates.
992 FUNCTION {presort}
993 { calc.label
994   label sortify
995   "    "
996   *
997   type$ "book" =
998   type$ "inbook" =
999   or
1000     'author.editor.sort
1001     { type$ "proceedings" =
1002         'editor.sort
1003         'author.sort
1004       if$
1005     }
1006   if$
1007   #1 entry.max$ substring$      % for
1008   'sort.label :=                % apalike
1009   sort.label                    % style
1010   *
1011   "    "
1012   *
1013   title field.or.null
1014   sort.format.title
1015   *
1016   #1 entry.max$ substring$
1017   'sort.key$ :=
1018 }
1019
1020 ITERATE {presort}
1021
1022 SORT            % by label, sort.label, title---for final label calculation
1023
1024 STRINGS { last.label next.extra }       % apalike labels are only for the text;
1025
1026 INTEGERS { last.extra.num }             % there are none in the bibliography
1027
1028 FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
1029 { #0 int.to.chr$ 'last.label :=
1030   "" 'next.extra :=
1031   #0 'last.extra.num :=
1032 }
1033
1034 FUNCTION {forward.pass}
1035 { last.label label =
1036     { last.extra.num #1 + 'last.extra.num :=
1037       last.extra.num int.to.chr$ 'extra.label :=
1038     }
1039     { "a" chr.to.int$ 'last.extra.num :=
1040       "" 'extra.label :=
1041       label 'last.label :=
1042     }
1043   if$
1044 }
1045
1046 FUNCTION {reverse.pass}
1047 { next.extra "b" =
1048     { "a" 'extra.label := }
1049     'skip$
1050   if$
1051   label extra.label * 'label :=
1052   extra.label 'next.extra :=
1053 }
1054
1055 EXECUTE {initialize.extra.label.stuff}
1056
1057 ITERATE {forward.pass}
1058
1059 REVERSE {reverse.pass}
1060
1061 %                               Now that the label is right we sort for real,
1062 %                               on sort.label then year then title.  This is
1063 %                               for the second sorting pass.
1064 FUNCTION {bib.sort.order}
1065 { sort.label
1066   "    "
1067   *
1068   year field.or.null sortify
1069   *
1070   "    "
1071   *
1072   title field.or.null
1073   sort.format.title
1074   *
1075   #1 entry.max$ substring$
1076   'sort.key$ :=
1077 }
1078
1079 ITERATE {bib.sort.order}
1080
1081 SORT            % by sort.label, year, title---giving final bibliography order
1082
1083 FUNCTION {begin.bib}
1084 { preamble$ empty$                              % no \etalchar in apalike
1085     'skip$
1086     { preamble$ write$ newline$ }
1087   if$
1088   "\begin{thebibliography}{}" write$ newline$           % no labels in apalike
1089 }
1090
1091 EXECUTE {begin.bib}
1092
1093 EXECUTE {init.state.consts}
1094
1095 ITERATE {call.type$}
1096
1097 FUNCTION {end.bib}
1098 { newline$
1099   "\end{thebibliography}" write$ newline$
1100 }
1101
1102 EXECUTE {end.bib}