]> AND Private Git Repository - LiCO.git/blob - PeCO/ACM-Reference-Format-Journals.bst
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
ok
[LiCO.git] / PeCO / ACM-Reference-Format-Journals.bst
1 %%% -*-BibTeX-*-\r
2 %%% ====================================================================\r
3 %%%  @BibTeX-style-file{\r
4 %%%     author          = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray",\r
5 %%%     version         = "1.00",\r
6 %%%     date            = "18 January 2012",\r
7 %%%     time            = "11:48 EST",\r
8 %%%     filename        = "ACM-Reference-Format-Journals.bst",\r
9 %%%     address         = "University of Utah\r
10 %%%                        Department of Mathematics, 110 LCB\r
11 %%%                        155 S 1400 E RM 233\r
12 %%%                        Salt Lake City, UT 84112-0090\r
13 %%%                        USA",\r
14 %%%     telephone       = "+1 801 581 5254",\r
15 %%%     FAX             = "+1 801 581 4148",\r
16 %%%     URL             = "http://www.math.utah.edu/~beebe",\r
17 %%%     checksum        = "available here: http://www.acm.org/publications/latex_style/CRC-journals.txt"\r
18 %%%     email           = "beebe@math.utah.edu, beebe@acm.org,\r
19 %%%                        beebe@computer.org, borisv@lk.net, murray@hq.acm.org", \r
20 %%%     codetable       = "ISO/ASCII",\r
21 %%%     keywords        = "ACM Transactions bibliography style; BibTeX",\r
22 %%%     license         = "public domain",\r
23 %%%     supported       = "yes",\r
24 %%%     abstract        = "",\r
25 %%%     docstring       = "The checksum field, above, is produced by WinMD5Free (v1.20) \r
26 %%%                        available from http://www.winmd5.com/?rid=winmd5,"\r
27 %%%  }\r
28 %%% ====================================================================\r
29 \r
30 % "ACM Transactions" BibTeX style, ACM-Reference-Format-Journals.bst\r
31 %  for BibTeX version 0.99c, LaTeX version 3.141\r
32 %  ACM extensions with code cleaned up, extended, and debugged 10--15-Nov-2008\r
33 %  Revised 17-APRIL-2008 (Nelson)\r
34 %  Revised 13-MARCH-2011 (Boris/Gerry)\r
35 %  Revised 23-MARCH-2011 (Boris/Gerry)\r
36 %  Revised 27-MARCH-2011 (Boris/Gerry)\r
37 %  Revised 15-APRIL-2011 (Boris/Gerry)\r
38 %  Revised 27-SEPTEMBER-2011 (Boris)\r
39 %\r
40 %\r
41 % History (by Nelson)\r
42 %\r
43 % Based on 'acmtrans' (for ACM Journals)\r
44 % Date: 28th April 2008\r
45 %\r
46 % 1. Avoid 'repeating' the 'month' values.\r
47 % 2. Avoid incorrectly italicizing the volume number.\r
48 % 3. Avoid non italicizing certain titles (book, inproceedings etc).\r
49 % 4. NO series if there is NO volume.\r
50 % 5. Sorting of reference with first surname.\r
51 % 6. Article no added for Inproceedings.\r
52 %\r
53 % Date: 07th May 2008\r
54 %\r
55 % 1. Abbreviation list added\r
56 %\r
57 %   Citation format: [author-last-name year]\r
58 %             [author-last-name and author-last-name year]\r
59 %             [author-last-name, author-last-name, and author-last-name year]\r
60 %             [author-last-name et al. year]\r
61 %             [author-last-name]\r
62 %             author-last-name [year]\r
63 %             [author-last-name and author-last-name]\r
64 %             [author-last-name et al.]\r
65 %             [year] or [year,year]\r
66 %             year or year,year\r
67 %\r
68 %   Reference list ordering: alphabetical by author or whatever passes\r
69 %    for author in the absence of one.\r
70 %\r
71 % Features of the old acmtrans.bst:\r
72 % =================================\r
73 %\r
74 % - all authors appear last name first.\r
75 % - all pages are listed xx-xx, (no pp.) and are at the end of the reference\r
76 % - publishers are identified as publisher, address\r
77 % - conferences papers (inproceedings) may give city of conference,\r
78 %   date of conference, and journal that the proceedings appear in.\r
79 % - months abbreviated to max four letters (eg. Mar.)\r
80 % - volume of a series indicated after the title of the series\r
81 % - editors appear after edited title and are identified by a trailing "Eds."\r
82 %   not in parentheses.  Editor names are not given in small caps.\r
83 %   (unless there is no author line)\r
84 % - names terminated with a period even if there is no first name.\r
85 % - editions are indicated trailing after the work, not in parentheses.\r
86 % - "et al." citations have a protected period to avoid bad spacing (jrh)\r
87 % - "address" required when publisher given\r
88 % - series (roman) and volume are in a sentence separate from (book-)title\r
89 %\r
90 %\r
91 % Features of chicago.bst:\r
92 % =======================\r
93 %\r
94 % - full names used in citations, but abbreviated citations are available\r
95 %   (see above)\r
96 % - if an entry has a "month", then the month and year are also printed\r
97 %   as part of that bibitem.\r
98 % - all conjunctions use "and" instead of "\&"\r
99 % - major modification from Chicago Manual of Style (13th ed.) is that\r
100 %   only the first author in a reference appears last name first-\r
101 %   additional authors appear as J. Q. Public.\r
102 % - pages are listed as "pp. xx-xx" in all entry types except\r
103 %   article entries.\r
104 % - book, inbook, and manual use "location: publisher" (or organization)\r
105 %   for address and publisher. All other types list publishers separately.\r
106 % - "pp." are used to identify page numbers for all entry types except\r
107 %   articles.\r
108 % - organization is used as a citation label if neither author nor editor\r
109 %   is present (for manuals).\r
110 % - "et al." is used for long author and editor lists, or when "others"\r
111 %   is used.\r
112 %\r
113 % Modifications and bug fixes from newapa.bst:\r
114 % ===========================================\r
115 %\r
116 %   - added month, year to bib entries if month is present\r
117 %   - fixed bug with In proceedings, added necessary comma after title\r
118 %   - all conjunctions changed to "and" from "\&"\r
119 %   - fixed bug with author labels in my.full.label: "et al." now is\r
120 %        generated when "others" is an author name\r
121 %   - major modification from Chicago Manual of Style (13th ed.) is that\r
122 %     only the first author in a reference appears last name first-\r
123 %     additional authors appear as J. Q. Public.\r
124 %   - pages are listed as "pp. xx-xx" in all entry types except\r
125 %     article entries. Unnecessary (IMHO) "()" around page numbers\r
126 %     were removed, and page numbers now don't end with a period.\r
127 %   - created chicago.sty for use with this bibstyle (required).\r
128 %   - fixed bugs in FUNCTION {format.vol.num.pages} for missing volume,\r
129 %     number, and /or pages. Renamed to format.journal.volume.number.\r
130 %   - fixed bug in formatting booktitles: additional period an error if\r
131 %     book has a volume.\r
132 %   - fixed bug: editors usually given redundant period before next clause\r
133 %     (format.editors.dot) removed.\r
134 %   - added label support for organizations, if both author and editor\r
135 %     are missing (from alpha.bst). If organization is too long, then\r
136 %     the key field is used for abbreviated citations.\r
137 %   - In proceedings or books of several volumes, no comma was written\r
138 %     between the "Volume x" and the page numbers (this was intentional\r
139 %     in newapa.bst). Fixed.\r
140 %   - Some journals may not have volumes/numbers, only month/year (eg.\r
141 %     IEEE Computer). Fixed bug in article style that assumed volume/number\r
142 %     was always present.\r
143 %\r
144 % Original documentation for newapa.sty:\r
145 % =====================================\r
146 %\r
147 % This version was made by modifying the master file made by\r
148 % Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU), and the 'named' BibTeX\r
149 % style of Peter F. Patel-Schneider.\r
150 %\r
151 % Copyright (C) 1985, all rights reserved.\r
152 % Copying of this file is authorized only if either\r
153 % (1) you make absolutely no changes to your copy, including name, or\r
154 % (2) if you do make changes, you name it something other than 'newapa.bst'.\r
155 % There are undoubtably bugs in this style.  If you make bug fixes,\r
156 % improvements, etc.  please let me know.  My e-mail address is:\r
157 %    spencer@cgrg.ohio.state.edu or 71160.3141@compuserve.com\r
158 %\r
159 % This style was made from 'plain.bst', 'named.bst', and 'apalike.bst',\r
160 % with lots of tweaking to make it look like APA style, along with tips\r
161 % from Young Ryu and Brian Reiser's modifications of 'apalike.bst'.\r
162 %\r
163 %\r
164 % Start of ACM-Reference-Format-Journals.bst\r
165 %\r
166 % Note: Many of the new bibentry 'fields' will only work with the \r
167 % 'ACM-Reference-Format-Journals.bst' file. Legacy .bib files (which will, in all probability,\r
168 % NOT contain these new fields) will _still_ work with the ACM-Reference-Format-Journals.bst.\r
169\r
170 %\r
171 ENTRY\r
172   { address\r
173     advisor\r
174     author\r
175     booktitle\r
176     chapter\r
177     city        % jtb: added\r
178     date        % jtb: added\r
179     edition\r
180     editor\r
181     howpublished\r
182     institution\r
183     journal\r
184     key\r
185     month\r
186     note\r
187     number\r
188     organization\r
189     pages\r
190     publisher\r
191     school\r
192     series\r
193     title\r
194     type\r
195     volume\r
196     year\r
197         % New keys recognized \r
198         issue         % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra\r
199         articleno\r
200         day           % UTAH: needed for newspapers, weeklies, bi-weeklies\r
201         doi           % UTAH\r
202         url           % UTAH\r
203         bookpages     % UTAH\r
204         numpages\r
205         lastaccessed  % UTAH: used only for @Misc{...}\r
206         coden         % UTAH\r
207         isbn          % UTAH\r
208         isbn-13       % UTAH\r
209         issn          % UTAH\r
210         lccn          % UTAH\r
211   }\r
212   {}\r
213   { label.year extra.label sort.year sort.label }\r
214 \r
215 INTEGERS { output.state before.all mid.sentence after.sentence after.block }\r
216 \r
217 INTEGERS { show-isbn-10-and-13 }  % initialized below in begin.bib\r
218 \r
219 INTEGERS { nameptr namesleft numnames }\r
220 \r
221 INTEGERS { multiresult }\r
222 \r
223 INTEGERS { len }\r
224 \r
225 INTEGERS { last.extra.num }\r
226 \r
227 STRINGS { s t t.org u }\r
228 \r
229 STRINGS { last.label next.extra }\r
230 \r
231 STRINGS { p1 p2 p3 page.count }\r
232 \r
233 FUNCTION { dump.stack.1 }\r
234 {\r
235     duplicate$ "STACK[top] = [" swap$ * "]" * warning$\r
236 }\r
237 \r
238 FUNCTION { dump.stack.2 }\r
239 {\r
240     duplicate$ "STACK[top  ] = [" swap$ * "]" * warning$\r
241     swap$\r
242     duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$\r
243     swap$\r
244 }\r
245 \r
246 FUNCTION { empty.or.unknown }\r
247 {\r
248   %% Examine the top stack entry, and push 1 if it is empty, or\r
249   %% consists only of whitespace, or is a string beginning with two\r
250   %% queries (??), and otherwise, push 0.\r
251   %%\r
252   %% This function provides a replacement for empty$, with the\r
253   %% convenient feature that unknown values marked by two leading\r
254   %% queries are treated the same as missing values, and thus, do not\r
255   %% appear in the output .bbl file, and yet, their presence in .bib\r
256   %% file(s) serves to mark values which are temporarily missing, but\r
257   %% are expected to be filled in eventually once more data is\r
258   %% obtained.  The TeX User Group and BibNet bibliography archives\r
259   %% make extensive use of this practice.\r
260   %%\r
261   %% An empty string cannot serve the same purpose, because just as in\r
262   %% statistics data processing, an unknown value is not the same as an\r
263   %% empty value.\r
264   %%\r
265   %% At entry: stack = ... top:[string]\r
266   %% At exit:  stack = ... top:[0 or 1]\r
267 \r
268   duplicate$ empty$\r
269     { pop$ #1 }\r
270     { #1 #2 substring$ "??" = }\r
271   if$\r
272 }\r
273 \r
274 FUNCTION { writeln }\r
275 {\r
276   %% In BibTeX style files, the sequences\r
277   %%\r
278   %%     ... "one" "two" output\r
279   %%     ... "one" "two" output.xxx\r
280   %%\r
281   %% ship "one" to the output file, possibly following by punctuation,\r
282   %% leaving the stack with\r
283   %%\r
284   %%     ... "two"\r
285   %%\r
286   %% There is thus a one-string lag in output processing that must be\r
287   %% carefully handled to avoid duplicating a string in the output\r
288   %% file.  Unless otherwise noted, all output.xxx functions leave\r
289   %% just one new string on the stack, and that model should be born\r
290   %% in mind when reading or writing function code.\r
291   %%\r
292   %% BibTeX's asynchronous buffering of output from strings from the\r
293   %% stack is confusing because newline$ bypasses the buffer.  It\r
294   %% would have been so much easier for newline to be a character\r
295   %% rather than a state of the output-in-progress.\r
296   %%\r
297   %% The documentation in btxhak.dvi is WRONG:  it says\r
298   %%\r
299   %%    newline$ Writes onto the bbl file what's accumulated in the\r
300   %%             output buffer. It writes a blank line if and only\r
301   %%             if the output buffer is empty. Since write$ does\r
302   %%             reasonable line breaking, you should use this\r
303   %%             function only when you want a blank line or an\r
304   %%             explicit line break.\r
305   %%\r
306   %%    write$   Pops the top (string) literal and writes it on the\r
307   %%             output buffer (which will result in stuff being\r
308   %%             written onto the bbl file when the buffer fills\r
309   %%             up).\r
310   %%\r
311   %% Examination of the BibTeX source code shows that write$ does\r
312   %% indeed behave as claimed, but newline$ sends a newline character\r
313   %% directly to the output file, leaving the stack unchanged.  The\r
314   %% first line "Writes onto ... buffer." is therefore wrong.\r
315   %%\r
316   %% The original BibTeX style files almost always use "write$ newline$"\r
317   %% in that order, so it makes sense to hide that pair in a private\r
318   %% function like this one, named after a statement in Pascal,\r
319   %% the programming language embedded in the BibTeX Web program.\r
320 \r
321   write$                % output top-of-stack string\r
322   newline$              % immediate write of newline (not via stack)\r
323 }\r
324 \r
325 FUNCTION { init.state.consts }\r
326 {\r
327   #0 'before.all :=\r
328   #1 'mid.sentence :=\r
329   #2 'after.sentence :=\r
330   #3 'after.block :=\r
331 }\r
332 \r
333 FUNCTION { output.nonnull }\r
334 { % Stack in: ... R S T  Stack out: ... R T   File out: S<comma><space>\r
335   's :=\r
336   output.state mid.sentence =\r
337     {\r
338       ", " * write$\r
339     }\r
340     {\r
341       output.state after.block =\r
342         {\r
343           add.period$ writeln\r
344           "\newblock " write$\r
345         }\r
346         {\r
347           output.state before.all =\r
348             {\r
349               write$\r
350             }\r
351             {\r
352               add.period$ " " * write$\r
353             }\r
354           if$\r
355         }\r
356       if$\r
357       mid.sentence 'output.state :=\r
358     }\r
359   if$\r
360   s\r
361 }\r
362 \r
363 FUNCTION { output.nonnull.dot.space }\r
364 { % Stack in: ... R S T  Stack out: ... R T   File out: S<dot><space>\r
365   's :=\r
366   output.state mid.sentence =           % { "<DEBUG output.nonnull.dot.space>. " * write$ }\r
367     {\r
368       ". " * write$\r
369     }\r
370     {\r
371       output.state after.block =\r
372         {\r
373           add.period$ writeln "\newblock " write$\r
374         }\r
375         {\r
376           output.state before.all =\r
377             {\r
378               write$\r
379             }\r
380             {\r
381               add.period$ " " * write$\r
382             }\r
383           if$\r
384         }\r
385       if$\r
386       mid.sentence 'output.state :=\r
387     }\r
388   if$\r
389   s\r
390 }\r
391 \r
392 FUNCTION { output.nonnull.remove }\r
393 { % Stack in: ... R S T  Stack out: ... R T   File out: S<space>\r
394   's :=\r
395   output.state mid.sentence =\r
396     {\r
397       " " * write$\r
398     }\r
399     {\r
400       output.state after.block =\r
401         {\r
402           add.period$ writeln "\newblock " write$\r
403         }\r
404         {\r
405           output.state before.all =\r
406             {\r
407               write$\r
408             }\r
409             {\r
410               add.period$ " " * write$\r
411             }\r
412           if$\r
413         }\r
414       if$\r
415       mid.sentence 'output.state :=\r
416     }\r
417   if$\r
418   s\r
419 }\r
420 \r
421 FUNCTION { output.nonnull.removenospace }\r
422 { % Stack in: ... R S T  Stack out: ... R T   File out: S\r
423   's :=\r
424   output.state mid.sentence =\r
425     {\r
426       "" * write$\r
427     }\r
428     {\r
429       output.state after.block =\r
430         {\r
431           add.period$ writeln "\newblock " write$\r
432         }\r
433         {\r
434           output.state before.all =\r
435             {\r
436               write$\r
437             }\r
438             {\r
439               add.period$ " " * write$\r
440             }\r
441           if$\r
442         }\r
443       if$\r
444       mid.sentence 'output.state :=\r
445     }\r
446   if$\r
447   s\r
448 }\r
449 \r
450 FUNCTION { output }\r
451 { % discard top token if empty, else like output.nonnull\r
452   duplicate$ empty.or.unknown\r
453     'pop$\r
454     'output.nonnull\r
455   if$\r
456 }\r
457 \r
458 FUNCTION { output.dot.space }\r
459 { % discard top token if empty, else like output.nonnull.dot.space\r
460   duplicate$ empty.or.unknown\r
461     'pop$\r
462     'output.nonnull.dot.space\r
463   if$\r
464 }\r
465 \r
466 FUNCTION { output.removenospace }\r
467 { % discard top token if empty, else like output.nonnull.removenospace\r
468   duplicate$ empty.or.unknown\r
469     'pop$\r
470     'output.nonnull.removenospace\r
471   if$\r
472 }\r
473 \r
474 FUNCTION { output.check }\r
475 { % like output, but warn if key name on top-of-stack is not set\r
476   't :=\r
477   duplicate$ empty.or.unknown\r
478     { pop$ "empty " t * " in " * cite$ * warning$ }\r
479     'output.nonnull\r
480   if$\r
481 }\r
482 \r
483 FUNCTION { output.check.dot.space }\r
484 { % like output.dot.space, but warn if key name on top-of-stack is not set\r
485   't :=\r
486   duplicate$ empty.or.unknown\r
487     { pop$ "empty " t * " in " * cite$ * warning$ }\r
488     'output.nonnull.dot.space\r
489   if$\r
490 }\r
491 \r
492 FUNCTION { fin.block }\r
493 { % functionally, but not logically, identical to fin.entry\r
494    add.period$\r
495    writeln\r
496 }\r
497 \r
498 FUNCTION { fin.entry }\r
499 {\r
500    add.period$\r
501    writeln\r
502 }\r
503 \r
504 FUNCTION { new.sentence }\r
505 { % update sentence state, with neither output nor stack change\r
506   output.state after.block =\r
507     'skip$\r
508     {\r
509       output.state before.all =\r
510         'skip$\r
511         { after.sentence 'output.state := }\r
512       if$\r
513     }\r
514   if$\r
515 }\r
516 \r
517 FUNCTION { fin.sentence }\r
518 {\r
519    add.period$\r
520    write$\r
521    new.sentence\r
522    ""\r
523 }\r
524 \r
525 FUNCTION { new.block }\r
526 {\r
527   output.state before.all =\r
528     'skip$\r
529     { after.block 'output.state := }\r
530   if$\r
531 }\r
532 \r
533 FUNCTION { output.coden }       % UTAH\r
534 { % output non-empty CODEN as one-line sentence (stack untouched)\r
535   coden empty.or.unknown\r
536     { }\r
537     { "\showCODEN{" coden * "}" * writeln }\r
538   if$\r
539 }\r
540 \r
541 FUNCTION { format.articleno }\r
542 {\r
543   articleno empty.or.unknown\r
544      { "" }\r
545      {\r
546         numpages empty.or.unknown\r
547           { "articleno field, but no numpages field, in " cite$ * warning$ }\r
548           { }\r
549         if$\r
550         "Article " articleno *\r
551      }\r
552   if$\r
553 }\r
554 \r
555 FUNCTION { format.year }\r
556 { % push year string or "????" onto output stack\r
557   %% Because year is a mandatory field, we always force SOMETHING\r
558   %% to be output\r
559   year empty.or.unknown\r
560     { "????" }\r
561     { year }\r
562   if$\r
563 }\r
564 \r
565 FUNCTION { format.day.month }\r
566 { % push "day month " or "month " or "" onto output stack\r
567   day empty.or.unknown\r
568     {\r
569       month empty.or.unknown\r
570         { "" }\r
571         { month " " *}\r
572       if$\r
573     }\r
574     {\r
575       month empty.or.unknown\r
576         { "" }\r
577         { day " " * month * " " *}\r
578       if$\r
579     }\r
580   if$\r
581 }\r
582 \r
583 FUNCTION { format.day.month.year }     % UTAH\r
584 { % if month is empty, push "" else push "(MON.)" or "(DD MON.)"\r
585   % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)\r
586   % acm-*.bst addition: prefix parenthesized date string with\r
587   % ", Article nnn "\r
588   articleno empty.or.unknown\r
589     { "" }\r
590     { ", " format.articleno * }\r
591   if$\r
592   " (" * format.day.month * format.year * ")" *\r
593 }\r
594 \r
595 FUNCTION { output.day.month.year }     % UTAH\r
596 { % if month is empty value, do nothing; else output stack top and\r
597   % leave with new top string "(MON.)" or "(DD MON.)"\r
598   % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)\r
599   format.day.month.year\r
600   output.nonnull.remove\r
601 }\r
602 \r
603 FUNCTION { strip.doi } % UTAH\r
604 { % Strip any Web address prefix to recover the bare DOI, leaving the\r
605   % result on the output stack, as recommended by CrossRef DOI\r
606   % documentation.\r
607   % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to\r
608   % "10.1145/1534530.1534545".  That is later typeset and displayed as\r
609   % doi:10.1145/1534530.1534545 as the LAST item in the reference list\r
610   % entry.  Publisher Web sites wrap this with a suitable link to a real\r
611   % URL to resolve the DOI, and the master http://dx.doi.org/ address is\r
612   % preferred, since publisher-specific URLs can disappear in response\r
613   % to economic events.  All journals are encouraged by the DOI\r
614   % authorities to use that typeset format and link procedures for\r
615   % uniformity across all publications that include DOIs in reference\r
616   % lists.\r
617   % The numeric prefix is guaranteed to start with "10.", so we use\r
618   % that as a test.\r
619   doi #1 #3 substring$ "10." =\r
620     { doi }\r
621     {\r
622       doi #1 #7 substring$ "http://" =\r
623         {\r
624             doi #8 doi text.length$ #7 - substring$ 't := % get modifiable copy of rest of DOI\r
625 \r
626             "INTERNAL STYLE-FILE ERROR" 's :=\r
627 \r
628             % search for next "/" and assign its suffix to s\r
629 \r
630             { t text.length$ }\r
631             {\r
632               t #1 #1 substring$ "/" =\r
633                 {\r
634                   % save rest of string as true DOI (should be 10.xxxx/yyyy)\r
635                   t #2 t text.length$ #1 - substring$ 's :=\r
636                   "" 't :=    % empty string t terminates the loop\r
637                 }\r
638                 {\r
639                   % discard first character and continue loop: t <= substring(t,2,last)\r
640                   t #2 t text.length$ #1 - substring$ 't :=\r
641                 }\r
642               if$\r
643             }\r
644             while$\r
645 \r
646             % check for valid DOI (should be 10.xxxx/yyyy)\r
647             s #1 #3 substring$ "10." =\r
648               { }\r
649               { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ }\r
650             if$\r
651 \r
652             s   % push the stripped DOI on the output stack\r
653 \r
654         }\r
655         {\r
656           "unrecognized DOI value [" doi * "]" * warning$\r
657           doi   % push the unrecognized original DOI on the output stack\r
658         }\r
659       if$\r
660     }\r
661   if$\r
662 }\r
663 \r
664 %\r
665 % Change by BV: added standard prefix to URL\r
666 %\r
667 FUNCTION { output.doi } % UTAH\r
668 { % output non-empty DOI as one-line sentence (stack untouched)\r
669   doi empty.or.unknown\r
670     { }\r
671     {\r
672       %% NB: We want URLs at beginning of line to reduce likelihood of\r
673       %% BibTeX's nasty line wrapping after column 79, which then requires\r
674       %% manual (or automated) editing of the .bbl file to repair.\r
675       %% The \url{} macro strips percent-newlines, and is thus safe in\r
676       %% the presence of the line wrapping, but \path|...| and\r
677       %% \verb|...| do not.\r
678       "\showDOI{%" writeln\r
679       "\url{http://dx.doi.org/" strip.doi * "}}" * writeln\r
680     }\r
681   if$\r
682 }\r
683 \r
684 FUNCTION { output.isbn }                % UTAH\r
685 { % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched)\r
686   show-isbn-10-and-13\r
687     {\r
688       %% show both 10- and 13-digit ISBNs\r
689       isbn empty.or.unknown\r
690         { }\r
691         {\r
692           "\showISBNx{" isbn * "}" * writeln\r
693         }\r
694       if$\r
695       isbn-13 empty.or.unknown\r
696         { }\r
697         {\r
698           "\showISBNxiii{" isbn-13 * "}" * writeln\r
699         }\r
700       if$\r
701     }\r
702     {\r
703       %% show 10-digit ISBNs only if 13-digit ISBNs not available\r
704       isbn-13 empty.or.unknown\r
705         {\r
706           isbn empty.or.unknown\r
707             { }\r
708             {\r
709               "\showISBNx{" isbn * "}" * writeln\r
710             }\r
711           if$\r
712         }\r
713         {\r
714           "\showISBNxiii{" isbn-13 * "}" * writeln\r
715         }\r
716       if$\r
717     }\r
718   if$\r
719 }\r
720 \r
721 FUNCTION { output.issn } % UTAH\r
722 { % output non-empty ISSN as one-line sentence (stack untouched)\r
723   issn empty.or.unknown\r
724     { }\r
725     { "\showISSN{" issn * "}" * writeln }\r
726   if$\r
727 }\r
728 \r
729 FUNCTION { output.issue }\r
730 { % output non-empty issue number as a one-line sentence (stack untouched)\r
731   issue empty.or.unknown\r
732     { }\r
733     { "Issue " issue * "." * writeln }\r
734   if$\r
735 }\r
736 \r
737 FUNCTION { output.lccn } % UTAH\r
738 { % return with stack untouched\r
739   lccn empty.or.unknown\r
740     { }\r
741     { "\showLCCN{" lccn * "}" * writeln }\r
742   if$\r
743 }\r
744 \r
745 FUNCTION { output.note } % UTAH\r
746 { % return with stack empty\r
747   note empty.or.unknown\r
748     { }\r
749     { "\shownote{" note add.period$ * "}" * writeln }\r
750   if$\r
751 }\r
752 \r
753 FUNCTION { output.note.check } % UTAH\r
754 { % return with stack empty\r
755   note empty.or.unknown\r
756     { "empty note in " cite$ * warning$ }\r
757     { "\shownote{" note add.period$ * "}" * writeln }\r
758   if$\r
759 }\r
760 \r
761 %\r
762 % Changes by BV 2011/04/15.  Do not output\r
763 % url if doi is defined\r
764 %\r
765 FUNCTION { output.url } % UTAH\r
766 { % return with stack untouched\r
767   % output URL and associated lastaccessed fields\r
768   doi empty.or.unknown\r
769   {\r
770     url empty.or.unknown\r
771       { }\r
772       {\r
773           %% NB: We want URLs at beginning of line to reduce likelihood of\r
774           %% BibTeX's nasty line wrapping after column 79, which would require\r
775           %% manual (or automated) editing of the .bbl file to repair.  However,\r
776           %% the \url{} macro handles the unwrapping job automatically.\r
777           "\showURL{%" writeln\r
778           lastaccessed empty.or.unknown\r
779             { "" }\r
780             { "Retrieved " lastaccessed * " from " * }\r
781           if$\r
782 \r
783           %% The URL field may contain a semicolon-separated list of Web\r
784           %% addresses, and we locate and wrap each of them in \url{...}.\r
785           %% The simplistic approach of putting the entire list into the\r
786           %% macro argument is that the semicolons are typeset in a\r
787           %% typewriter font, and no space follows them.\r
788           %%\r
789           %% We therefore replace the original code\r
790           %%    "\url{" * url * "}}" * writeln\r
791           %% with this character-at-a-time loop:\r
792 \r
793           "\url{" *\r
794 \r
795           url 't :=                       % get modifiable copy of URL list\r
796 \r
797           { t text.length$ }\r
798           {\r
799             t #1 #1 substring$ ";" =\r
800               {                         % then split argument at separator\r
801                 "};" * writeln\r
802                 "\url{"\r
803               }\r
804               {                         % else concatenate nonblank character to argument\r
805                 t #1 #1 substring$ " " =\r
806                   { }\r
807                   { t #1 #1 substring$ * }\r
808                 if$\r
809               }\r
810             if$\r
811 \r
812             t #2 t text.length$ #1 - substring$ 't :=\r
813           }\r
814           while$\r
815 \r
816           "}}" * writeln\r
817       }\r
818     if$\r
819   }\r
820   { }\r
821   if$\r
822 }\r
823 \r
824 FUNCTION { output.year.check }\r
825 { % warn if year empty, else output top string and leave " YEAR<label>" on stack in mid-sentence\r
826   year empty.or.unknown\r
827      { "empty year in " cite$ * warning$ }\r
828      { write$\r
829         " " year * extra.label *\r
830        mid.sentence 'output.state :=\r
831      }\r
832   if$\r
833 }\r
834 \r
835 FUNCTION { not }\r
836 {\r
837     { #0 }\r
838     { #1 }\r
839   if$\r
840 }\r
841 \r
842 FUNCTION { and }\r
843 {\r
844     'skip$\r
845     { pop$ #0 }\r
846   if$\r
847 }\r
848 \r
849 FUNCTION { or }\r
850 {\r
851    { pop$ #1 }\r
852     'skip$\r
853   if$\r
854 }\r
855 \r
856 FUNCTION { le }\r
857 {\r
858   %% test whether first number is less than or equal to second number\r
859   %% stack in:  n1 n2\r
860   %% stack out: if n1 <= n2 then 1 else 0\r
861 \r
862   %% "DEBUG: le " cite$ * warning$\r
863   > { #0 } { #1 } if$\r
864 }\r
865 \r
866 FUNCTION { ge }\r
867 {\r
868   %% test whether first number is greater than or equal to second number\r
869   %% stack in:  n1 n2\r
870   %% stack out: if n1 >= n2 then 1 else 0\r
871 \r
872   %% "DEBUG: ge " cite$ * warning$\r
873   < { #0 } { #1 } if$\r
874 }\r
875 \r
876 FUNCTION { is.leading.digit }\r
877 {\r
878   %% test whether first character of string is a digit\r
879   %% stack in:  string\r
880   %% stack out: if first-char-is-digit then 1 else 0\r
881 \r
882   #1 #1 substring$                      % replace string by string[1:1]\r
883   duplicate$                            % string[1:1] string[1:1]\r
884   chr.to.int$\r
885   "0" chr.to.int$ swap$ le              % "0" <= string[1:1] --> 0-or-1\r
886   swap$                                 % 0-or-1 string[1:1]\r
887   chr.to.int$\r
888   "9" chr.to.int$ le                    % string[1:1} <= "9" --> 0-or-1\r
889   and\r
890 }\r
891 \r
892 FUNCTION { skip.digits }\r
893 {\r
894   %% skip over leading digits in string\r
895   %% stack in:  string\r
896   %% stack out: rest-of-string leading-digits\r
897 \r
898   %% "DEBUG: enter skip.digits " cite$ * warning$\r
899 \r
900   %% dump.stack.1\r
901 \r
902   duplicate$\r
903   't :=\r
904   't.org :=\r
905   "" 'u :=\r
906 \r
907   { t text.length$ }\r
908   {\r
909     %% "=================DEBUG: skip.digits   t = [" t * "]" * warning$\r
910     t is.leading.digit\r
911       { t #2 t text.length$ #1 - substring$ }\r
912       {\r
913         t 'u :=\r
914         ""\r
915       }\r
916     if$\r
917     't :=\r
918   }\r
919   while$\r
920 \r
921   u                                                             % rest of string\r
922   t.org #1 t.org text.length$ u text.length$ - substring$       % leading digits\r
923 \r
924   %% "DEBUG: t.org = [" t.org * "]" * warning$\r
925   %% "DEBUG: u     = [" u * "]" * warning$\r
926 \r
927   %% dump.stack.2\r
928 \r
929   %% "DEBUG: leave skip.digits " cite$ * warning$\r
930 }\r
931 \r
932 FUNCTION { skip.nondigits }\r
933 {\r
934   %% skip over leading nondigits in string\r
935   %% stack in:  string\r
936   %% stack out: rest-of-string\r
937 \r
938   %% "DEBUG: enter skip.nondigits " cite$ * warning$\r
939 \r
940   't :=\r
941   "" 'u :=\r
942 \r
943   { t text.length$ }\r
944   {\r
945     %% "=================DEBUG: skip.nondigits   t = [" t * "]" * warning$\r
946     t is.leading.digit\r
947       {\r
948         t 'u :=\r
949         ""\r
950       }\r
951       { t #2 t text.length$ #1 - substring$ }\r
952     if$\r
953     't :=\r
954   }\r
955   while$\r
956 \r
957   u                     % rest of string\r
958 \r
959   %% dump.stack.1\r
960   %% "DEBUG: leave skip.nondigits " cite$ * warning$\r
961 }\r
962 \r
963 FUNCTION { parse.next.number }\r
964 {\r
965   %% stack in:  string\r
966   %% stack out: rest-of-string next-numeric-part-of-string\r
967   %% Example:\r
968   %% stack in:  "123:1--123:59"\r
969   %% stack out: ":1--123:59" "123"\r
970 \r
971   's :=\r
972   s skip.nondigits 's :=\r
973   s skip.digits\r
974 }\r
975 \r
976 FUNCTION { reduce.pages.to.page.count }\r
977 {\r
978   %% Stack in:  arbitrary-and-unused\r
979   %% Stack out: unchanged\r
980   %%\r
981   %% For the new-style pagination with article number and numpages or\r
982   %% pages, we expect to have BibTeX entries containing something like\r
983   %%     articleno = "17",\r
984   %%     pages     = "1--23",\r
985   %% with output "Article 17, 23 pages",\r
986   %% or\r
987   %%     articleno = "17",\r
988   %%     numpages  = "23",\r
989   %% with output "Article 17, 23 pages",\r
990   %% or\r
991   %%     articleno = "17",\r
992   %%     pages     = "17:1--17:23",\r
993   %% with output "Article 17, 23 pages",\r
994   %%\r
995   %% If articleno is missing or empty, then we should output "1--23",\r
996   %% "23" (with a warning of a missing articleno), or "17:1--17:23",\r
997   %% respectively.\r
998 \r
999   %% "DEBUG: enter reduce.pages.to.page.count " cite$ * warning$\r
1000 \r
1001   %% "DEBUG: pages = [" pages * "]" * warning$\r
1002 \r
1003   pages\r
1004   parse.next.number 'p1 :=\r
1005   parse.next.number 'p2 :=\r
1006   parse.next.number 'p3 :=\r
1007   parse.next.number 'page.count :=\r
1008 \r
1009   duplicate$\r
1010   empty.or.unknown\r
1011     {  }\r
1012     {\r
1013       duplicate$ "unexpected trailing garbage [" swap$ *\r
1014       "] after n:p1--n:p2 in pages = [" *\r
1015       pages *\r
1016       "] in " *\r
1017       cite$ *\r
1018       warning$\r
1019     }\r
1020   if$\r
1021 \r
1022   pop$\r
1023 \r
1024   %% "DEBUG: reduce.pages.to.page.count: "\r
1025   %% " p1 = " p1 * *\r
1026   %% " p2 = " p2 * *\r
1027   %% " p3 = " p3 * *\r
1028   %% " p4 = " page.count * *\r
1029   %% " in " cite$ * * warning$\r
1030 \r
1031   p1 p3 =   p2 "1" =   and   numpages empty.or.unknown   and\r
1032     { "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$ }\r
1033     {\r
1034       numpages empty.or.unknown\r
1035         { pages }\r
1036         { numpages }\r
1037       if$\r
1038       'page.count :=\r
1039     }\r
1040   if$\r
1041 \r
1042   p1 "1" =   p3 empty.or.unknown   and   numpages empty.or.unknown   and\r
1043     {\r
1044       p2 'page.count :=\r
1045       "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$\r
1046     }\r
1047     {\r
1048       numpages empty.or.unknown\r
1049         { pages }\r
1050         { numpages }\r
1051       if$\r
1052       'page.count :=\r
1053     }\r
1054   if$\r
1055 \r
1056   %% "DEBUG: leave reduce.pages.to.page.count " cite$ * warning$\r
1057 }\r
1058 \r
1059 FUNCTION { new.block.checkb }\r
1060 { % issue a new.block only if at least one of top two stack strings is not empty\r
1061   empty.or.unknown\r
1062   swap$ empty.or.unknown\r
1063   and\r
1064     'skip$\r
1065     'new.block\r
1066   if$\r
1067 }\r
1068 \r
1069 FUNCTION { field.or.null }\r
1070 { % convert empty value to null string, else return value\r
1071   duplicate$ empty.or.unknown\r
1072     { pop$ "" }\r
1073     'skip$\r
1074   if$\r
1075 }\r
1076 \r
1077 FUNCTION { emphasize }\r
1078 { % emphasize a non-empty top string on the stack (WITHOUT italic correction)\r
1079   duplicate$ empty.or.unknown\r
1080     { pop$ "" }\r
1081     { "{\em " swap$ * "}" * }\r
1082   if$\r
1083 }\r
1084 \r
1085 FUNCTION { emphasize.with.italic.correction }\r
1086 { % convert empty string to null string, or emphasize with a trailing italic correction\r
1087   duplicate$ empty.or.unknown\r
1088     { pop$ "" }\r
1089     { "{\em " swap$ * "\/}" * }\r
1090   if$\r
1091 }\r
1092 \r
1093 FUNCTION { comma }\r
1094 { % convert empty string to null string, or brace string and add trailing comma\r
1095   duplicate$ empty.or.unknown\r
1096     { pop$ "" }\r
1097     { "{" swap$ * "}," * }\r
1098   if$\r
1099 }\r
1100 \r
1101 FUNCTION { format.names }\r
1102 {\r
1103   % Format bibliographical entries with the first author last name first,\r
1104   % and subsequent authors with initials followed by last name.\r
1105   % All names are formatted in this routine.\r
1106 \r
1107   's :=\r
1108   #1 'nameptr :=               % nameptr = 1;\r
1109   s num.names$ 'numnames :=    % numnames = num.name$(s);\r
1110   numnames 'namesleft :=\r
1111     { namesleft #0 > }\r
1112     { nameptr #1 =\r
1113         %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }\r
1114         %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }\r
1115         {"{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }\r
1116         {"{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }\r
1117       if$\r
1118       nameptr #1 >\r
1119         {\r
1120           namesleft #1 >\r
1121             { ", " * t * }\r
1122             {\r
1123               numnames #2 >\r
1124                 { "," * }\r
1125                 'skip$\r
1126               if$\r
1127               t "{\sc others}" =\r
1128                 { " {et~al\mbox{.}}" * } % jrh: avoid spacing problems\r
1129                 { " {and} " * t * } % from Chicago Manual of Style\r
1130               if$\r
1131             }\r
1132           if$\r
1133         }\r
1134         't\r
1135       if$\r
1136       nameptr #1 + 'nameptr :=          % nameptr += 1;\r
1137       namesleft #1 - 'namesleft :=      % namesleft =- 1;\r
1138     }\r
1139   while$\r
1140 }\r
1141 \r
1142 FUNCTION { my.full.label }\r
1143 {\r
1144   's :=\r
1145   #1 'nameptr :=               % nameptr = 1;\r
1146   s num.names$ 'numnames :=    % numnames = num.name$(s);\r
1147   numnames 'namesleft :=\r
1148     { namesleft #0 > }\r
1149 \r
1150     { s nameptr "{vv~}{ll}" format.name$ 't :=  % get the next name\r
1151       nameptr #1 >\r
1152         {\r
1153           namesleft #1 >\r
1154             { ", " * t * }\r
1155             {\r
1156               numnames #2 >\r
1157                 { "," * }\r
1158                 'skip$\r
1159               if$\r
1160               t "others" =\r
1161                 { " et~al\mbox{.}" * } % jrh: avoid spacing problems\r
1162                 { " and " * t * } % from Chicago Manual of Style\r
1163               if$\r
1164             }\r
1165           if$\r
1166         }\r
1167         't\r
1168       if$\r
1169       nameptr #1 + 'nameptr :=          % nameptr += 1;\r
1170       namesleft #1 - 'namesleft :=      % namesleft =- 1;\r
1171     }\r
1172   while$\r
1173 \r
1174 }\r
1175 \r
1176 FUNCTION { format.names.fml }\r
1177 {\r
1178   % Format names in "familiar" format, with first initial followed by\r
1179   % last name. Like format.names, ALL names are formatted.\r
1180   % jtb: The names are NOT put in small caps\r
1181 \r
1182   's :=\r
1183   #1 'nameptr :=               % nameptr = 1;\r
1184   s num.names$ 'numnames :=    % numnames = num.name$(s);\r
1185   numnames 'namesleft :=\r
1186     { namesleft #0 > }\r
1187 \r
1188     {\r
1189       "{" s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ * "}" * 't :=\r
1190 \r
1191       nameptr #1 >\r
1192         {\r
1193           namesleft #1 >\r
1194             { ", " * t * }\r
1195             {\r
1196               numnames #2 >\r
1197                 { "," * }\r
1198                 'skip$\r
1199               if$\r
1200               t "{others}" =\r
1201                 { " {et~al\mbox{.}}" * }\r
1202                 { " {and} " * t * }\r
1203               if$\r
1204             }\r
1205           if$\r
1206         }\r
1207         't\r
1208       if$\r
1209       nameptr #1 + 'nameptr :=          % nameptr += 1;\r
1210       namesleft #1 - 'namesleft :=      % namesleft =- 1;\r
1211     }\r
1212   while$\r
1213 }\r
1214 \r
1215 FUNCTION { format.authors }\r
1216 {\r
1217   author empty.or.unknown\r
1218     { "" }\r
1219     { author format.names add.period$} % jtb: add period if none before\r
1220   if$\r
1221 }\r
1222 \r
1223 FUNCTION { format.key }\r
1224 {\r
1225   empty.or.unknown\r
1226     { key field.or.null }\r
1227     { "" }\r
1228   if$\r
1229 }\r
1230 \r
1231 FUNCTION { format.no.key }\r
1232 {\r
1233   empty.or.unknown\r
1234     { "" }\r
1235     { "" }\r
1236   if$\r
1237 }\r
1238 \r
1239 FUNCTION { format.editors.fml }\r
1240 {\r
1241   % Format editor names for use in the "in" types: inbook, incollection,\r
1242   % inproceedings: first initial, then last names. When editors are the\r
1243   % LABEL for an entry, then format.editor is used which lists editors\r
1244   % by last name first.\r
1245 \r
1246   editor empty.or.unknown\r
1247     { "" }\r
1248     {\r
1249       editor format.names.fml editor num.names$ #1 >\r
1250         { " (Eds.)" * }\r
1251         { " (Ed.)" * }\r
1252       if$\r
1253     }\r
1254   if$\r
1255 }\r
1256 \r
1257 FUNCTION { format.editors }\r
1258 { % format editor names for use in labels, last names first.\r
1259   editor empty.or.unknown\r
1260     { "" }\r
1261     {\r
1262       editor format.names\r
1263       editor num.names$ #1 >\r
1264         { " (Eds.)." * }\r
1265         { " (Ed.)." * }\r
1266       if$\r
1267     }\r
1268   if$\r
1269 }\r
1270 \r
1271 FUNCTION { format.articletitle }\r
1272 {\r
1273   title empty.or.unknown\r
1274     { "" }\r
1275     % Use this to preserve lettercase in titles:\r
1276     { "\showarticletitle{" title * "}" * }\r
1277     % Use this for downcase title style:\r
1278     % { \showarticletitle{" title "t" change.case$ * "}" * }\r
1279   if$\r
1280 }\r
1281 \r
1282 FUNCTION { format.title }\r
1283 {\r
1284   title empty.or.unknown\r
1285     { "" }\r
1286     % Use this to preserve lettercase in titles:\r
1287     { title }\r
1288     % Use this for downcase title style:\r
1289     % { title "t" change.case$ }\r
1290   if$\r
1291 }\r
1292 \r
1293 FUNCTION { n.dashify }\r
1294 {\r
1295   't :=\r
1296   ""\r
1297     { t empty.or.unknown not }\r
1298     {\r
1299       t #1 #1 substring$ "-" =\r
1300         {\r
1301           t #1 #2 substring$ "--" = not\r
1302             { "--" *\r
1303               t #2 global.max$ substring$ 't :=\r
1304             }\r
1305             {\r
1306               { t #1 #1 substring$ "-" = }\r
1307               {\r
1308                 "-" *\r
1309                 t #2 global.max$ substring$ 't :=\r
1310               }\r
1311               while$\r
1312             }\r
1313           if$\r
1314         }\r
1315         {\r
1316           t #1 #1 substring$ *\r
1317           t #2 global.max$ substring$ 't :=\r
1318         }\r
1319       if$\r
1320     }\r
1321   while$\r
1322 }\r
1323 \r
1324 FUNCTION { format.btitle }\r
1325 {\r
1326   edition empty.or.unknown\r
1327   { title emphasize }\r
1328   { title empty.or.unknown\r
1329     { title emphasize } % jtb: what is this supposed to do ?!?\r
1330     { "{\em " title * "\/} (" * edition "l" change.case$ * " ed.)" * } % jtb: no parens for ed.\r
1331     if$\r
1332   }\r
1333   if$\r
1334 }\r
1335 \r
1336 FUNCTION { format.emphasize.booktitle }\r
1337 { % push "" or "{\em booktitle}" or "{\em booktitle}, (second ed.)" on stack\r
1338   edition empty.or.unknown\r
1339     { booktitle emphasize }\r
1340     { booktitle empty.or.unknown\r
1341       { "" }\r
1342       { "{\em " booktitle * "} (" * edition "l" change.case$ * " ed.)" * }\r
1343       if$\r
1344     }\r
1345   if$\r
1346 }\r
1347 \r
1348 FUNCTION { format.city }\r
1349 {\r
1350   % jtb: if the preceding string (the title of the conference) is non-empty,\r
1351   % jtb: append the location, otherwise leave empty (so as to trigger the\r
1352   % jtb: error message in output.check\r
1353 \r
1354   duplicate$ empty.or.unknown\r
1355     { }\r
1356     {\r
1357       city empty.or.unknown\r
1358         {\r
1359           date empty.or.unknown\r
1360             { }\r
1361             { " (" * date * ")" * }\r
1362           if$\r
1363         }\r
1364         {\r
1365           date empty.or.unknown\r
1366             { " (" * city * ")" * }\r
1367             { " (" * city * ", " * date * ")" * }\r
1368           if$\r
1369         }\r
1370       if$\r
1371     }\r
1372   if$\r
1373 }\r
1374 \r
1375 FUNCTION { tie.or.space.connect }\r
1376 {\r
1377   duplicate$ text.length$ #3 <\r
1378     { "~" }\r
1379     { " " }\r
1380   if$\r
1381   swap$ * *\r
1382 }\r
1383 \r
1384 FUNCTION { either.or.check }\r
1385 {\r
1386   empty.or.unknown\r
1387     'pop$\r
1388     { "can't use both " swap$ * " fields in " * cite$ * warning$ }\r
1389   if$\r
1390 }\r
1391 \r
1392 FUNCTION { format.bvolume }\r
1393 {\r
1394   % jtb: If there is a series, this is added and the volume trails after it.\r
1395   % jtb: Otherwise, "Vol" is Capitalized.\r
1396 \r
1397   volume empty.or.unknown\r
1398     { "" }\r
1399     {\r
1400       series empty.or.unknown\r
1401         { "Vol." volume tie.or.space.connect}\r
1402         { series ", " * "Vol." volume tie.or.space.connect *}\r
1403       if$\r
1404       "volume and number" number either.or.check\r
1405     }\r
1406   if$\r
1407 }\r
1408 \r
1409 FUNCTION { format.bvolume.noseries }\r
1410 {\r
1411   volume empty.or.unknown\r
1412     { "" }\r
1413     {\r
1414       series empty.or.unknown\r
1415         { "Vol." volume tie.or.space.connect}\r
1416         { "Vol." volume tie.or.space.connect}\r
1417 %        { series ", " * "Vol." volume tie.or.space.connect *}\r
1418       if$\r
1419       "volume and number" number either.or.check\r
1420     }\r
1421   if$\r
1422 }\r
1423 \r
1424 FUNCTION { format.series }\r
1425 {\r
1426   series empty.or.unknown\r
1427     {""}\r
1428     {" {\em (" * series ")}" *}\r
1429   if$\r
1430 }\r
1431 \r
1432 FUNCTION { format.number.series }\r
1433 {\r
1434   volume empty.or.unknown\r
1435     {\r
1436       number empty.or.unknown\r
1437         {\r
1438           volume empty.or.unknown\r
1439           { "" }\r
1440           {\r
1441             series empty.or.unknown\r
1442               { "" }\r
1443               { " (" series * ")" * }\r
1444             if$\r
1445           }\r
1446           if$\r
1447         }                                       %    { series field.or.null }\r
1448         {\r
1449           output.state mid.sentence =\r
1450             { "Number" }                        % gnp - changed to mixed case always\r
1451             { "Number" }\r
1452           if$\r
1453           number tie.or.space.connect series empty.or.unknown\r
1454             { "there's a number but no series in " cite$ * warning$ }\r
1455             { " in " * series * }\r
1456           if$\r
1457         }\r
1458       if$\r
1459     }\r
1460     {\r
1461       ""\r
1462     }\r
1463   if$\r
1464 }\r
1465 \r
1466 FUNCTION { multi.page.check }\r
1467 {\r
1468   't :=\r
1469   #0 'multiresult :=\r
1470     { multiresult not\r
1471       t empty.or.unknown not\r
1472       and\r
1473     }\r
1474     { t #1 #1 substring$\r
1475       duplicate$ "-" =\r
1476       swap$ duplicate$ "," =\r
1477       swap$ "+" =\r
1478       or or\r
1479     { #1 'multiresult := }\r
1480     { t #2 global.max$ substring$ 't := }\r
1481       if$\r
1482     }\r
1483   while$\r
1484   multiresult\r
1485 }\r
1486 \r
1487 FUNCTION { format.pages }\r
1488 {\r
1489   pages empty.or.unknown\r
1490     { "" }\r
1491     {\r
1492       pages multi.page.check\r
1493         { pages n.dashify } % gnp - removed () % jtb: removed pp.\r
1494         { pages }\r
1495       if$\r
1496     }\r
1497   if$\r
1498 }\r
1499 \r
1500 FUNCTION { format.pages.check.without.articleno }\r
1501 { %% format pages field only if articleno is absent\r
1502   %% Stack out: pages-specification\r
1503   numpages missing$ pages missing$ and\r
1504     { "page numbers missing in both pages and numpages fields in " cite$ * warning$ }\r
1505     { }\r
1506   if$\r
1507 \r
1508   articleno empty.or.unknown\r
1509     {\r
1510       pages missing$\r
1511         { numpages }\r
1512         { format.pages }\r
1513       if$\r
1514     }\r
1515     { "" }\r
1516   if$\r
1517 }\r
1518 \r
1519 FUNCTION { format.pages.check }\r
1520 {\r
1521   pages empty.or.unknown\r
1522     { "page numbers missing in " cite$ * warning$ "" }\r
1523     { pages n.dashify }\r
1524   if$\r
1525 }\r
1526 \r
1527 FUNCTION { format.bookpages }\r
1528 {\r
1529   bookpages empty.or.unknown\r
1530     { "" }\r
1531     { bookpages "book pages" tie.or.space.connect }\r
1532   if$\r
1533 }\r
1534 \r
1535 FUNCTION { format.named.pages }\r
1536 {\r
1537   pages empty.or.unknown\r
1538     { "" }\r
1539     { format.pages "pages" tie.or.space.connect }\r
1540   if$\r
1541 }\r
1542 \r
1543 %\r
1544 % Changed by Boris Veytsman, 2011-03-13\r
1545 % Now the word "pages" is printed even if\r
1546 % there field pages is not empty.\r
1547 %\r
1548 \r
1549 FUNCTION { format.page.count }\r
1550 {\r
1551   page.count empty.or.unknown\r
1552     { "" }\r
1553     {\r
1554       articleno empty.or.unknown\r
1555         { "numpages field, but no articleno field, in " cite$ * warning$ }\r
1556         { }\r
1557       if$\r
1558       page.count "pages" tie.or.space.connect\r
1559     }\r
1560   if$\r
1561 }\r
1562 \r
1563 FUNCTION { format.articleno.numpages }\r
1564 {\r
1565   %% There are seven possible outputs, depending on which fields are set.\r
1566   %%\r
1567   %% These four are handled here:\r
1568   %%\r
1569   %%     articleno, numpages, pages     -> "Article articleno-value, numpages-value pages"\r
1570   %%     articleno, numpages            -> "Article articleno-value, numpages-value pages"\r
1571   %%     articleno, pages               -> "Article articleno-value, reduced-pages-value pages"\r
1572   %%     articleno                      -> "Article articleno-value" and warn about missing numpages\r
1573   %%\r
1574   %% The remaining three have already been handled by\r
1575   %% format.pages.check.without.articleno:\r
1576   %%\r
1577   %%     numpages, pages                -> "pages-value"\r
1578   %%     numpages                       -> "numpages-value"\r
1579   %%     pages                          -> "pages-value"\r
1580 \r
1581   articleno empty.or.unknown\r
1582     {\r
1583       numpages empty.or.unknown\r
1584         { }\r
1585         { "require articleno with numpages field in " cite$ * warning$ }\r
1586       if$\r
1587       ""\r
1588     }\r
1589     {\r
1590       numpages empty.or.unknown\r
1591         {\r
1592           pages empty.or.unknown\r
1593             {\r
1594               "require pages or numpages fields with articleno field in " cite$ * warning$\r
1595               "" 'page.count :=\r
1596             }\r
1597             { reduce.pages.to.page.count }\r
1598           if$\r
1599         }\r
1600         { numpages 'page.count := }\r
1601       if$\r
1602 \r
1603       %% The Article number is now handled in format.day.month.year because\r
1604       %% ACM prefers the style "Digital Libraries 12, 3, Article 5 (July 2008)"\r
1605       %% over "Digital Libraries 12, 3 (July 2008), Article 5"\r
1606       %% format.articleno output\r
1607       format.page.count\r
1608     }\r
1609   if$\r
1610 }\r
1611 \r
1612 FUNCTION { format.journal.volume.number.day.month.year }\r
1613 {\r
1614   % By Young (and Spencer)\r
1615   % GNP - fixed bugs with missing volume, number, and/or pages\r
1616   %\r
1617   % Format journal, volume, number, pages for article types.\r
1618   %\r
1619   journal empty.or.unknown\r
1620     { "no journal in " cite$ * warning$\r
1621       "" }\r
1622 %    { journal emphasize.with.italic.correction }\r
1623      {\r
1624            journal "Journal of the ACM" =\r
1625        { "{\it J. ACM}" }\r
1626        {\r
1627            journal "American Mathematical Society Translations" =\r
1628        { "{\it Amer. Math. Soc. Transl.}" }\r
1629        {\r
1630            journal "Bulletin of the American Mathematical Society" =\r
1631        { "{\it Bull. Amer. Math. Soc.}" }\r
1632        {\r
1633            journal "Proceedings of the American Mathematical Society" =\r
1634        { "{\it Proc. Amer. Math. Soc.}" }\r
1635        {\r
1636            journal "Transactions of the American Mathematical Society" =\r
1637        { "{\it Trans. Amer. Math. Soc.}" }\r
1638        {\r
1639            journal "Communications of the {ACM}" =\r
1640        { "{\it Commun. {ACM}}" }\r
1641        {\r
1642            journal "{ACM} Computing Surveys" =\r
1643        { "{\it Comput. Surveys}" }\r
1644        {\r
1645            journal "{ACM} Transactions on Mathematical Software" =\r
1646        { "{\it {ACM} Trans. Math. Software}" }\r
1647        {\r
1648            journal "{ACM} {SIGNUM} Newsletter" =\r
1649        { "{\it {ACM} {SIGNUM} Newslett.}" }\r
1650        {\r
1651            journal "American Journal of Sociology" =\r
1652        { "{\it Amer. J. Sociology}" }\r
1653        {\r
1654            journal "Journal of the American Statistical Association" =\r
1655        { "{\it J. Amer. Statist. Assoc.}" }\r
1656        {\r
1657            journal "Applied Mathematics and Computation" =\r
1658        { "{\it Appl. Math. Comput.}" }\r
1659        {\r
1660            journal "American Mathematical Monthly" =\r
1661        { "{\it Amer. Math. Monthly}" }\r
1662        {\r
1663            journal "British Journal of Mathematical and Statistical Psychology" =\r
1664        { "{\it Brit. J. Math. Statist. Psych.}" }\r
1665        {\r
1666            journal "Canadian Mathematical Bulletin" =\r
1667        { "{\it Canad. Math. Bull.}" }\r
1668        {\r
1669            journal "Journal of Computational and Applied Mathematics" =\r
1670        { "{\it J. Comput. Appl. Math.}" }\r
1671        {\r
1672            journal "Journal of Computational Physics" =\r
1673        { "{\it J. Comput. Phys.}" }\r
1674        {\r
1675            journal "Computers and Structures" =\r
1676        { "{\it Comput. \& Structures}" }\r
1677        {\r
1678            journal "The Computer Journal" =\r
1679        { "{\it Comput. J.}" }\r
1680        {\r
1681            journal "Journal of Computer and System Sciences" =\r
1682        { "{\it J. Comput. System Sci.}" }\r
1683        {\r
1684            journal "Contemporary Mathematics" =\r
1685        { "{\it Contemp. Math.}" }\r
1686        {\r
1687            journal "Crelle's Journal" =\r
1688        { "{\it Crelle's J.}" }\r
1689        {\r
1690            journal "Giornale di Mathematiche" =\r
1691        { "{\it Giorn. Mat.}" }\r
1692        {\r
1693            journal "{IEEE} Transactions on Computers" =\r
1694        { "{\it {IEEE} Trans. Comput.}" }\r
1695        {\r
1696            journal "{IEEE} Transactions on Automatic Control" =\r
1697        { "{\it {IEEE} Trans. Automat. Control}" }\r
1698        {\r
1699            journal "Proceedings of the {IEEE}" =\r
1700        { "{\it Proc. {IEEE}}" }\r
1701        {\r
1702            journal "{IEEE} Transactions on Aerospace and Electronic Systems" =\r
1703        { "{\it {IEEE} Trans. Aerospace Electron. Systems}" }\r
1704        {\r
1705            journal "{IMA} Journal of Numerical Analysis" =\r
1706        { "{\it {IMA} J. Numer. Anal.}" }\r
1707        {\r
1708            journal "Information Processing Letters" =\r
1709        { "{\it Inform. Process. Lett.}" }\r
1710        {\r
1711            journal "Journal of the Institute of Mathematics and its Applications" =\r
1712        { "{\it J. Inst. Math. Appl.}" }\r
1713        {\r
1714            journal "International Journal of Control" =\r
1715        { "{\it Internat. J. Control}" }\r
1716        {\r
1717            journal "International Journal for Numerical Methods in Engineering" =\r
1718        { "{\it Internat. J. Numer. Methods Engrg.}" }\r
1719        {\r
1720            journal "International Journal of Supercomputing Applications" =\r
1721        { "{\it Internat. J. Supercomputing Applic.}" }\r
1722        {\r
1723            journal "Journal of Research of the National Bureau of Standards" =\r
1724        { "{\it J. Res. Nat. Bur. Standards}" }\r
1725        {\r
1726            journal "Linear Algebra and its Applications" =\r
1727        { "{\it Linear Algebra Appl.}" }\r
1728        {\r
1729            journal "Journal of Mathematical Analysis and Applications" =\r
1730        { "{\it J. Math. Anal. Appl.}" }\r
1731        {\r
1732            journal "Mathematische Annalen" =\r
1733        { "{\it Math. Ann.}" }\r
1734        {\r
1735            journal "Journal of Mathematical Physics" =\r
1736        { "{\it J. Math. Phys.}" }\r
1737        {\r
1738            journal "Mathematics of Computation" =\r
1739        { "{\it Math. Comp.}" }\r
1740        {\r
1741            journal "Mathematica Scandinavica" =\r
1742        { "{\it Math. Scand.}" }\r
1743        {\r
1744            journal "Mathematical Tables and Other Aids to Computation" =\r
1745        { "{\it Math. Tables Aids Comput.}" }\r
1746        {\r
1747            journal "Numerische Mathematik" =\r
1748        { "{\it Numer. Math.}" }\r
1749        {\r
1750            journal "Pacific Journal of Mathematics" =\r
1751        { "{\it Pacific J. Math.}" }\r
1752        {\r
1753            journal "Journal of Parallel and Distributed Computing" =\r
1754        { "{\it J. Parallel and Distrib. Comput.}" }\r
1755        {\r
1756            journal "Parallel Computing" =\r
1757        { "{\it Parallel Comput.}" }\r
1758        {\r
1759            journal "Philosophical Magazine" =\r
1760        { "{\it Philos. Mag.}" }\r
1761        {\r
1762            journal "Proceedings of the National Academy of Sciences of the USA" =\r
1763        { "{\it Proc. Nat. Acad. Sci. U. S. A.}" }\r
1764        {\r
1765            journal "Quarterly Journal of Mathematics, Oxford, Series (2)" =\r
1766        { "{\it Quart. J. Math. Oxford Ser. (2)}" }\r
1767        {\r
1768            journal "Quarterly of Applied Mathematics" =\r
1769        { "{\it Quart. Appl. Math.}" }\r
1770        {\r
1771            journal "Review of the International Statisical Institute" =\r
1772        { "{\it Rev. Inst. Internat. Statist.}" }\r
1773        {\r
1774            journal "Journal of the Society for Industrial and Applied Mathematics" =\r
1775        { "{\it J. Soc. Indust. Appl. Math.}" }\r
1776        {\r
1777            journal "Journal of the Society for Industrial and Applied Mathematics, Series B, Numerical Analysis" =\r
1778        { "{\it J. Soc. Indust. Appl. Math. Ser. B Numer. Anal.}" }\r
1779        {\r
1780            journal "{SIAM} Journal on Algebraic and Discrete Methods" =\r
1781        { "{\it {SIAM} J. Algebraic Discrete Methods}" }\r
1782        {\r
1783            journal "{SIAM} Journal on Applied Mathematics" =\r
1784        { "{\it {SIAM} J. Appl. Math.}" }\r
1785        {\r
1786            journal "{SIAM} Journal on Computing" =\r
1787        { "{\it {SIAM} J. Comput.}" }\r
1788        {\r
1789            journal "{SIAM} Journal on Matrix Analysis and Applications" =\r
1790        { "{\it {SIAM} J. Matrix Anal. Appl.}" }\r
1791        {\r
1792            journal "{SIAM} Journal on Numerical Analysis" =\r
1793        { "{\it {SIAM} J. Numer. Anal.}" }\r
1794        {\r
1795            journal "{SIAM} Review" =\r
1796        { "{\it {SIAM} Rev.}" }\r
1797        {\r
1798            journal "{SIAM} Journal on Scientific and Statistical Computing" =\r
1799        { "{\it {SIAM} J. Sci. Statist. Comput.}" }\r
1800        {\r
1801            journal "Software Practice and Experience" =\r
1802        { "{\it Software Prac. Experience}" }\r
1803        {\r
1804            journal "Statistical Science" =\r
1805        { "{\it Statist. Sci.}" }\r
1806        {\r
1807            journal "{USSR} Computational Mathematics and Mathematical Physics" =\r
1808        { "{\it {U. S. S. R.} Comput. Math. and Math. Phys.}" }\r
1809        {\r
1810            journal "Journal of {VLSI} and Computer Systems" =\r
1811        { "{\it J. {VLSI} Comput. Syst.}" }\r
1812        {\r
1813            journal "Zeitschrift fur Angewandte Mathematik und Mechanik" =\r
1814        { "{\it Z. Angew. Math. Mech.}" }\r
1815        {\r
1816            journal "Zeitschrift fur Angewandte Mathematik und Physik" =\r
1817        { "{\it Z. Angew. Math. Phys.}" }\r
1818        {\r
1819            journal "ACM Computing Surveys" =\r
1820        { "{\it Comput. Surveys}" }\r
1821        {\r
1822            journal "ACM Transactions on Mathematical Software" =\r
1823        { "{\it ACM Trans. Math. Software}" }\r
1824        {\r
1825            journal "ACM {SIGNUM} Newsletter" =\r
1826        { "{\it ACM {SIGNUM} Newslett.}" }\r
1827        {\r
1828            journal "IEEE Transactions on Computers" =\r
1829        { "{\it IEEE Trans. Comput.}" }\r
1830        {\r
1831            journal "IEEE Transactions on Automatic Control" =\r
1832        { "{\it IEEE Trans. Automat. Control}" }\r
1833        {\r
1834            journal "Proceedings of the IEEE" =\r
1835        { "{\it Proc. IEEE}" }\r
1836        {\r
1837            journal "IEEE Transactions on Aerospace and Electronic Systems" =\r
1838        { "{\it IEEE Trans. Aerospace Electron. Systems}" }\r
1839        {\r
1840            journal "IMA Journal of Numerical Analysis" =\r
1841        { "{\it IMA J. Numer. Anal.}" }\r
1842        {\r
1843            journal "SIAM Journal on Algebraic and Discrete Methods" =\r
1844        { "{\it SIAM J. Algebraic Discrete Methods}" }\r
1845        {\r
1846            journal "SIAM Journal on Applied Mathematics" =\r
1847        { "{\it SIAM J. Appl. Math.}" }\r
1848        {\r
1849            journal "SIAM Journal on Computing" =\r
1850        { "{\it SIAM J. Comput.}" }\r
1851        {\r
1852            journal "SIAM Journal on Matrix Analysis and Applications" =\r
1853        { "{\it SIAM J. Matrix Anal. Appl.}" }\r
1854        {\r
1855            journal "SIAM Journal on Numerical Analysis" =\r
1856        { "{\it SIAM J. Numer. Anal.}" }\r
1857        {\r
1858            journal "SIAM Review" =\r
1859        { "{\it SIAM Rev.}" }\r
1860        {\r
1861            journal "SIAM Journal on Scientific and Statistical Computing" =\r
1862        { "{\it SIAM J. Sci. Statist. Comput.}" }\r
1863        {\r
1864            journal "USSR Computational Mathematics and Mathematical Physics" =\r
1865        { "{\it U. S. S. R. Comput. Math. and Math. Phys.}" }\r
1866        {\r
1867            journal "Journal of VLSI and Computer Systems" =\r
1868        { "{\it J. VLSI Comput. Syst.}" }\r
1869        {\r
1870            journal "Communications of the ACM" =\r
1871        { "{\it Commun. ACM}" }\r
1872        %% If no match with cases needing special handling, just output journal name\r
1873        {  journal emphasize.with.italic.correction  }\r
1874      if$\r
1875            }\r
1876      if$\r
1877            }\r
1878      if$\r
1879            }\r
1880      if$\r
1881            }\r
1882      if$\r
1883            }\r
1884      if$\r
1885            }\r
1886      if$\r
1887            }\r
1888      if$\r
1889            }\r
1890      if$\r
1891            }\r
1892      if$\r
1893            }\r
1894      if$\r
1895            }\r
1896      if$\r
1897            }\r
1898      if$\r
1899            }\r
1900      if$\r
1901            }\r
1902      if$\r
1903            }\r
1904      if$\r
1905            }\r
1906      if$\r
1907            }\r
1908      if$\r
1909            }\r
1910      if$\r
1911            }\r
1912      if$\r
1913            }\r
1914      if$\r
1915            }\r
1916      if$\r
1917            }\r
1918      if$\r
1919            }\r
1920      if$\r
1921            }\r
1922      if$\r
1923            }\r
1924      if$\r
1925            }\r
1926      if$\r
1927            }\r
1928      if$\r
1929            }\r
1930      if$\r
1931            }\r
1932      if$\r
1933            }\r
1934      if$\r
1935            }\r
1936      if$\r
1937            }\r
1938      if$\r
1939            }\r
1940      if$\r
1941            }\r
1942      if$\r
1943            }\r
1944      if$\r
1945            }\r
1946      if$\r
1947            }\r
1948      if$\r
1949            }\r
1950      if$\r
1951            }\r
1952      if$\r
1953            }\r
1954      if$\r
1955            }\r
1956      if$\r
1957            }\r
1958      if$\r
1959            }\r
1960      if$\r
1961            }\r
1962      if$\r
1963            }\r
1964      if$\r
1965            }\r
1966      if$\r
1967            }\r
1968      if$\r
1969            }\r
1970      if$\r
1971            }\r
1972      if$\r
1973            }\r
1974      if$\r
1975            }\r
1976      if$\r
1977            }\r
1978      if$\r
1979            }\r
1980      if$\r
1981            }\r
1982      if$\r
1983            }\r
1984      if$\r
1985            }\r
1986      if$\r
1987            }\r
1988      if$\r
1989            }\r
1990      if$\r
1991            }\r
1992      if$\r
1993            }\r
1994      if$\r
1995            }\r
1996      if$\r
1997            }\r
1998      if$\r
1999            }\r
2000      if$\r
2001            }\r
2002      if$\r
2003            }\r
2004      if$\r
2005            }\r
2006      if$\r
2007            }\r
2008      if$\r
2009            }\r
2010      if$\r
2011            }\r
2012      if$\r
2013            }\r
2014      if$\r
2015            }\r
2016      if$\r
2017            }\r
2018      if$\r
2019            }\r
2020      if$\r
2021            }\r
2022      if$\r
2023            }\r
2024      if$\r
2025            }\r
2026      if$\r
2027            }\r
2028      if$\r
2029            }\r
2030      if$\r
2031            }\r
2032      if$\r
2033            }\r
2034      if$\r
2035            }\r
2036      if$\r
2037            }\r
2038      if$\r
2039          }\r
2040     if$\r
2041 \r
2042   number empty.or.unknown\r
2043     {\r
2044       volume empty.or.unknown\r
2045         { "no number and no volume in " cite$ * warning$ "" * }\r
2046         { " " * " {" * volume * "}" * }\r
2047       if$\r
2048     }\r
2049     {\r
2050       volume empty.or.unknown\r
2051         {\r
2052           "unusual to have number, but no volume, for " cite$ * warning$\r
2053           " " * number *\r
2054         }\r
2055         { " " * volume comma " " * number * * }\r
2056       if$\r
2057     }\r
2058   if$\r
2059 \r
2060   format.day.month.year *\r
2061 }\r
2062 \r
2063 FUNCTION { format.chapter.pages }\r
2064 {\r
2065   chapter empty.or.unknown\r
2066     'format.pages\r
2067     { type empty.or.unknown\r
2068         { "Chapter" } % gnp - changed to mixed case\r
2069         { type "t" change.case$ }\r
2070       if$\r
2071       chapter tie.or.space.connect\r
2072       pages empty.or.unknown\r
2073         {"page numbers missing in " cite$ * warning$} % gnp - added check\r
2074         { ", " * format.pages * }\r
2075       if$\r
2076     }\r
2077   if$\r
2078 }\r
2079 \r
2080 FUNCTION { format.in.emphasize.booktitle }\r
2081 { % jtb: format for collections or proceedings not appearing in a journal\r
2082   booktitle empty.or.unknown\r
2083   { "" }\r
2084   { "In " format.emphasize.booktitle * }\r
2085   if$\r
2086 }\r
2087 \r
2088 FUNCTION { format.in.booktitle }\r
2089 { % jtb: format for proceedings appearing in a journal\r
2090   booktitle empty.or.unknown\r
2091   { "" }\r
2092   { "In " booktitle * }\r
2093   if$\r
2094 }\r
2095 \r
2096 FUNCTION { format.in.ed.booktitle }\r
2097 {\r
2098   booktitle empty.or.unknown\r
2099   { "" }\r
2100   { editor empty.or.unknown\r
2101     { "In " format.emphasize.booktitle * }\r
2102                 % jtb: swapped editor location\r
2103     { "In " format.emphasize.booktitle * ", " * format.editors.fml * }\r
2104     if$\r
2105   }\r
2106   if$\r
2107 }\r
2108 \r
2109 FUNCTION { format.thesis.type }\r
2110 { % call with default type on stack top\r
2111   type empty.or.unknown\r
2112     'skip$    % use default type\r
2113     {\r
2114       pop$    % discard default type\r
2115       % NO: it is silly to have to brace protect every degree type!:  type "t" change.case$\r
2116       type\r
2117     }\r
2118   if$\r
2119 }\r
2120 \r
2121 FUNCTION { format.tr.number }\r
2122 {\r
2123   type empty.or.unknown\r
2124 %    { "Tech. Rep." }     \r
2125     { "{T}echnical {R}eport" }     % ACM wants it explicit (Gerry 9/28)\r
2126     'type\r
2127   if$\r
2128   number empty.or.unknown\r
2129     { "t" change.case$ }\r
2130     %% LOOKS BAD: { "." * number tie.or.space.connect }\r
2131     %% Prefer "Research report RJ687." to "Research report. RJ687."\r
2132     { number tie.or.space.connect }\r
2133   if$\r
2134 }\r
2135 \r
2136 FUNCTION { format.advisor }\r
2137 {\r
2138   advisor empty.or.unknown\r
2139     { "" }\r
2140     { "Advisor(s) " advisor * }\r
2141   if$\r
2142 }\r
2143 \r
2144 FUNCTION { format.article.crossref }\r
2145 { "See"\r
2146   "\citeN{" * crossref * "}" *\r
2147 }\r
2148 \r
2149 FUNCTION { format.crossref.editor }\r
2150 {\r
2151   editor #1 "{vv~}{ll}" format.name$\r
2152   editor num.names$ duplicate$\r
2153   #2 >\r
2154     { pop$ " et~al\mbox{.}" * }         % jrh: avoid spacing problems\r
2155     { #2 <\r
2156     'skip$\r
2157     { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =\r
2158         { " et~al\mbox{.}" * }          % jrh: avoid spacing problems\r
2159         { " and " * editor #2 "{vv~}{ll}" format.name$ * }\r
2160       if$\r
2161     }\r
2162       if$\r
2163     }\r
2164   if$\r
2165 }\r
2166 \r
2167 FUNCTION { format.book.crossref }\r
2168 {\r
2169   volume empty.or.unknown\r
2170     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$\r
2171       "In "\r
2172     }\r
2173     { "Volume" volume tie.or.space.connect % gnp - changed to mixed case\r
2174       " of " *\r
2175     }\r
2176   if$\r
2177   editor empty.or.unknown\r
2178   editor field.or.null author field.or.null =\r
2179   or\r
2180     { key empty.or.unknown\r
2181     { series empty.or.unknown\r
2182         { "need editor, key, or series for " cite$ * " to crossref " *\r
2183           crossref * warning$\r
2184           "" *\r
2185         }\r
2186         { "{\em " * series * "\/}" * }\r
2187       if$\r
2188     }\r
2189     { key * }\r
2190       if$\r
2191     }\r
2192     { format.crossref.editor * }\r
2193   if$\r
2194   " \citeN{" * crossref * "}" *\r
2195 }\r
2196 \r
2197 FUNCTION { format.incoll.inproc.crossref }\r
2198 { "See"\r
2199   " \citeN{" * crossref * "}" *\r
2200 }\r
2201 \r
2202 FUNCTION { format.lab.names }\r
2203 {\r
2204   % format.lab.names:\r
2205   %\r
2206   % determines "short" names for the abbreviated author information.\r
2207   % "Long" labels are created in calc.label, using the routine my.full.label\r
2208   % to format author and editor fields.\r
2209   %\r
2210   % There are 4 cases for labels.   (n=3 in the example)\r
2211   % a) one author             Foo\r
2212   % b) one to n               Foo, Bar and Baz\r
2213   % c) use of "and others"    Foo, Bar et al.\r
2214   % d) more than n            Foo et al.\r
2215 \r
2216   's :=\r
2217   s num.names$ 'numnames :=\r
2218   numnames #2 >    % change number to number of others allowed before\r
2219                    % forcing "et al".\r
2220     { s #1 "{vv~}{ll}" format.name$ " et~al\mbox{.}" * } % jrh: \mbox{} added\r
2221     {\r
2222       numnames #1 - 'namesleft :=\r
2223       #2 'nameptr :=\r
2224       s #1 "{vv~}{ll}" format.name$\r
2225         { namesleft #0 > }\r
2226         { nameptr numnames =\r
2227             { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =\r
2228                 { " et~al\mbox{.}" * }          % jrh: avoid spacing problems\r
2229                 { " and " * s nameptr "{vv~}{ll}" format.name$ * }\r
2230               if$\r
2231             }\r
2232             { ", " * s nameptr "{vv~}{ll}" format.name$ * }\r
2233           if$\r
2234           nameptr #1 + 'nameptr :=\r
2235           namesleft #1 - 'namesleft :=\r
2236         }\r
2237       while$\r
2238     }\r
2239   if$\r
2240 }\r
2241 \r
2242 FUNCTION { author.key.label }\r
2243 {\r
2244   author empty.or.unknown\r
2245     { key empty.or.unknown\r
2246           { "no key, author in " cite$ * warning$\r
2247             cite$ #1 #3 substring$ }\r
2248          'key\r
2249       if$\r
2250     }\r
2251     { author format.lab.names }\r
2252   if$\r
2253 }\r
2254 \r
2255 FUNCTION { author.key.organization.label }\r
2256 { % added - gnp. Provide label formatting by organization if author is null.\r
2257   author empty.or.unknown\r
2258     { organization empty.or.unknown\r
2259         { key empty.or.unknown\r
2260             { "no key, author or organization in " cite$ * warning$\r
2261               cite$ #1 #3 substring$ }\r
2262             'key\r
2263           if$\r
2264         }\r
2265         { organization }\r
2266       if$\r
2267     }\r
2268     { author format.lab.names }\r
2269   if$\r
2270 }\r
2271 \r
2272 FUNCTION { editor.key.organization.label }\r
2273 { % added - gnp. Provide label formatting by organization if editor is null.\r
2274   editor empty.or.unknown\r
2275     { organization empty.or.unknown\r
2276         { key empty.or.unknown\r
2277             { "no key, editor or organization in " cite$ * warning$\r
2278               cite$ #1 #3 substring$ }\r
2279             'key\r
2280           if$\r
2281         }\r
2282         { organization }\r
2283       if$\r
2284     }\r
2285     { editor format.lab.names }\r
2286   if$\r
2287 }\r
2288 \r
2289 FUNCTION { author.editor.key.label }\r
2290 {\r
2291   author empty.or.unknown\r
2292     { editor empty.or.unknown\r
2293           { key empty.or.unknown\r
2294                { "no key, author, or editor in " cite$ * warning$\r
2295                  cite$ #1 #3 substring$ }\r
2296              'key\r
2297            if$\r
2298          }\r
2299           { editor format.lab.names }\r
2300       if$\r
2301     }\r
2302     { author format.lab.names }\r
2303   if$\r
2304 }\r
2305 \r
2306 FUNCTION { calc.label }\r
2307 {\r
2308   % Changed - GNP. See also author.organization.sort, editor.organization.sort\r
2309   % Form label for BibTeX entry. The classification of which fields are used\r
2310   % for which type of entry (book, inbook, etc.) are taken from alpha.bst.\r
2311   % The change here from newapa is to also include organization as a\r
2312   % citation label if author or editor is missing.\r
2313 \r
2314   type$ "book" =\r
2315   type$ "inbook" =\r
2316   or\r
2317   type$ "periodical" =\r
2318   or\r
2319     'author.editor.key.label\r
2320     { type$ "proceedings" =\r
2321         'editor.key.organization.label\r
2322         { type$ "manual" =\r
2323             'author.key.organization.label\r
2324             'author.key.label\r
2325           if$\r
2326         }\r
2327       if$\r
2328     }\r
2329   if$\r
2330 \r
2331   author empty.or.unknown  % generate the full label citation information.\r
2332     {\r
2333       editor empty.or.unknown\r
2334         {\r
2335           organization empty.or.unknown\r
2336             {\r
2337               key empty.or.unknown\r
2338                 {\r
2339                   "no author, editor, organization, or key in " cite$ * warning$\r
2340                   "??"\r
2341                 }\r
2342                 { key }\r
2343               if$\r
2344             }\r
2345             { organization }\r
2346           if$\r
2347         }\r
2348         { editor my.full.label }\r
2349       if$\r
2350     }\r
2351     { author my.full.label }\r
2352   if$\r
2353 \r
2354   % leave label on the stack, to be popped when required.\r
2355 \r
2356   "}{" * swap$ * "}{" *\r
2357   %  year field.or.null purify$ #-1 #4 substring$ *\r
2358   %\r
2359   % save the year for sort processing afterwards (adding a, b, c, etc.)\r
2360   %\r
2361   year field.or.null purify$ #-1 #4 substring$\r
2362   'label.year :=\r
2363 }\r
2364 \r
2365 %\r
2366 % Change by Gerry: use number-like citations for transactions\r
2367 % 2011/03/23\r
2368 %\r
2369 %FUNCTION {output.bibitem}\r
2370 %{ newline$\r
2371 %  "\bibitem{" write$\r
2372 %  cite$ write$\r
2373 %  "}" write$\r
2374 %  newline$\r
2375 %  ""\r
2376 %  before.all 'output.state :=\r
2377 %}\r
2378 \r
2379 FUNCTION { output.bibitem }\r
2380 {\r
2381   newline$\r
2382   "\bibitem[\protect\citeauthoryear{" write$\r
2383   calc.label write$\r
2384   sort.year write$\r
2385   "}]%" writeln\r
2386   "        {" write$\r
2387   cite$ write$\r
2388   "}" writeln\r
2389   ""\r
2390   before.all 'output.state :=\r
2391 }\r
2392 \r
2393 \r
2394 FUNCTION { output.issue.doi.coden.isxn.lccn.url }\r
2395 { % enter and return with stack empty\r
2396   %% We switch now from buffered output to output of complete lines, so\r
2397   %% that the Issue .. URL data have their own lines, and are less likely\r
2398   %% to be line-wrapped by BibTeX's short-sighted algorithm, which wraps\r
2399   %% lines longer than 79 characters, backtracking to what it thinks is\r
2400   %% a break point in the string.  Any such wrapping MUST be undone to\r
2401   %% prevent percent-newline from appearing in DOIs and URLs.  The\r
2402   %% output data are intentionally wrapped in \showxxx{} macros at\r
2403   %% beginning of line, and that supply their own punctuation (if they\r
2404   %% are not defined to suppress output entirely), to make it easier for\r
2405   %% other software to recover them from .bbl files.\r
2406   %%\r
2407   %% It also makes it possible to later change the macro definitions\r
2408   %% to suppress particular output values, or alter their appearance.\r
2409   %%\r
2410   %% Note that it is possible for theses, technical reports, and\r
2411   %% manuals to have ISBNs, and anything that has an ISBN may also\r
2412   %% have an ISSN.  When there are no values for these keys, there\r
2413   %% is no output generated for them here.\r
2414 \r
2415   "\newblock" writeln\r
2416   after.block 'output.state :=\r
2417 \r
2418   output.issue\r
2419   output.isbn\r
2420   output.coden  % CODEN is functionally like ISSN, so output them sequentially\r
2421   output.issn\r
2422   output.lccn\r
2423   output.doi    % DOI is ALWAYS last according to CrossRef DOI documentation\r
2424   output.url    % but ACM wants URL last\r
2425 }\r
2426 \r
2427 FUNCTION { output.issue.doi.coden.isxn.lccn.url.note }\r
2428 { % enter with stack empty, return with empty string on stack\r
2429   output.issue.doi.coden.isxn.lccn.url\r
2430   note empty.or.unknown\r
2431     { }\r
2432     {\r
2433       "\newblock" writeln\r
2434       output.note\r
2435     }\r
2436   if$\r
2437   ""\r
2438 }\r
2439 \r
2440 FUNCTION { output.issue.doi.coden.isxn.lccn.url.note.check }\r
2441 { % enter with stack empty, return with empty string on stack\r
2442   output.issue.doi.coden.isxn.lccn.url\r
2443   note empty.or.unknown\r
2444     { }\r
2445     {\r
2446       "\newblock" writeln\r
2447       output.note.check\r
2448     }\r
2449   if$\r
2450   ""\r
2451 }\r
2452 \r
2453 FUNCTION { article }\r
2454 {\r
2455   output.bibitem\r
2456 \r
2457   author empty.or.unknown\r
2458     {\r
2459       editor empty.or.unknown\r
2460         { "neither author and editor supplied for " cite$ * warning$ }\r
2461         { format.editors "editor" output.check }\r
2462       if$\r
2463     }\r
2464     { format.authors "author" output.check }\r
2465   if$\r
2466 \r
2467   author format.no.key output       % added\r
2468   output.year.check                 % added\r
2469   new.block\r
2470   format.articletitle "title" output.check\r
2471   new.block\r
2472   howpublished output\r
2473 \r
2474   crossref missing$\r
2475     { format.journal.volume.number.day.month.year }\r
2476     {\r
2477       "cross reference in @Article{...} is unusual" warning$\r
2478       format.article.crossref output.nonnull\r
2479     }\r
2480   if$\r
2481   output\r
2482 \r
2483   format.pages.check.without.articleno output\r
2484   format.articleno.numpages output\r
2485   fin.block\r
2486   output.issue.doi.coden.isxn.lccn.url.note\r
2487   fin.entry\r
2488 }\r
2489 \r
2490 FUNCTION { book }\r
2491 {\r
2492   output.bibitem\r
2493   author empty.or.unknown\r
2494     { format.editors "author and editor" output.check }\r
2495     { format.authors output.nonnull\r
2496       crossref missing$\r
2497         { "author and editor" editor either.or.check }\r
2498         'skip$\r
2499       if$\r
2500     }\r
2501   if$\r
2502   output.year.check       % added\r
2503   new.block\r
2504   format.btitle "title" output.check\r
2505   crossref missing$\r
2506     { new.sentence              % jtb: start a new sentence for series/volume\r
2507       format.bvolume output\r
2508       new.block\r
2509       format.number.series output\r
2510       new.sentence\r
2511       publisher "publisher" output.check\r
2512       address "address" output.check    % jtb: require address\r
2513       fin.sentence\r
2514       pages empty.or.unknown\r
2515         { format.bookpages }    % use bookpages when pages empty\r
2516         { format.pages.check "pages" tie.or.space.connect }\r
2517       if$\r
2518       output\r
2519     }\r
2520     { new.block\r
2521       format.book.crossref output.nonnull\r
2522     }\r
2523   if$\r
2524   fin.block\r
2525   output.issue.doi.coden.isxn.lccn.url.note\r
2526   fin.entry\r
2527 }\r
2528 \r
2529 FUNCTION { booklet }\r
2530 {\r
2531   output.bibitem\r
2532   format.authors output\r
2533   author format.key output          % added\r
2534   output.year.check                 % added\r
2535   new.block\r
2536   format.title "title" output.check\r
2537   new.block\r
2538   howpublished output\r
2539   address output\r
2540   fin.block\r
2541   output.issue.doi.coden.isxn.lccn.url.note\r
2542   fin.entry\r
2543 }\r
2544 \r
2545 FUNCTION { inbook }\r
2546 {\r
2547   output.bibitem\r
2548   author empty.or.unknown\r
2549     { format.editors\r
2550       "author and editor" output.check\r
2551     }\r
2552     { format.authors output.nonnull\r
2553       crossref missing$\r
2554     { "author and editor" editor either.or.check }\r
2555     'skip$\r
2556       if$\r
2557     }\r
2558   if$\r
2559   output.year.check                 % added\r
2560   new.block\r
2561   format.btitle "title" output.check\r
2562   crossref missing$\r
2563     { new.sentence              % jtb: start a new sentence for series/volume\r
2564       format.bvolume output\r
2565       new.block\r
2566       format.number.series output\r
2567       new.sentence\r
2568       publisher "publisher" output.check\r
2569       address "address" output.check    % jtb: require address\r
2570       format.bookpages output\r
2571       format.chapter.pages\r
2572       "chapter and pages" output.check  % jtb: moved from before publisher\r
2573     }\r
2574     {\r
2575       format.bookpages output\r
2576       format.chapter.pages "chapter and pages" output.check\r
2577       new.block\r
2578       format.book.crossref output.nonnull\r
2579     }\r
2580   if$\r
2581   fin.block\r
2582   output.issue.doi.coden.isxn.lccn.url.note\r
2583   fin.entry\r
2584 }\r
2585 \r
2586 FUNCTION { incollection }\r
2587 {\r
2588   output.bibitem\r
2589   format.authors "author" output.check\r
2590   author format.key output       % added\r
2591   output.year.check              % added\r
2592   new.block\r
2593   format.articletitle "title" output.check\r
2594   new.block\r
2595   crossref missing$\r
2596     { format.in.ed.booktitle "booktitle" output.check\r
2597       new.sentence                % jtb: start a new sentence for series/volume\r
2598       format.bvolume output\r
2599       format.number.series output\r
2600       new.sentence\r
2601       publisher "publisher" output.check\r
2602       address "address" output.check      % jtb: require address\r
2603       format.bookpages output\r
2604       format.chapter.pages output % gnp - was special.output.nonnull\r
2605                                   % left out comma before page numbers\r
2606                                   % jtb: moved from before publisher\r
2607     }\r
2608     {\r
2609       format.incoll.inproc.crossref output.nonnull\r
2610       format.chapter.pages output\r
2611     }\r
2612   if$\r
2613   fin.block\r
2614   output.issue.doi.coden.isxn.lccn.url.note\r
2615   fin.entry\r
2616 }\r
2617 \r
2618 FUNCTION { inproceedings }\r
2619 {\r
2620   output.bibitem\r
2621   format.authors "author" output.check\r
2622   author format.key output            % added\r
2623   output.year.check                   % added\r
2624   new.block\r
2625   format.articletitle "title" output.check\r
2626   howpublished output.dot.space\r
2627   crossref missing$\r
2628     {\r
2629       journal missing$          % jtb: proceedings appearing in journals\r
2630         { format.in.emphasize.booktitle format.city "booktitle"  output.check.dot.space\r
2631           format.series output.removenospace\r
2632           format.editors.fml output % BV 2011/09/27 Moved dot to comma\r
2633           format.bvolume.noseries output\r
2634           new.sentence\r
2635           organization output\r
2636           publisher "publisher" output.check % jtb: require publisher (?)\r
2637           address "address" output.check  % jtb: require address\r
2638           format.bookpages output\r
2639         }\r
2640         {\r
2641            format.in.booktitle format.city "booktitle" output.check\r
2642            format.editors.fml output\r
2643            new.sentence\r
2644            format.journal.volume.number.day.month.year output\r
2645         }\r
2646       if$\r
2647       format.articleno output\r
2648       format.pages.check.without.articleno output\r
2649     }\r
2650     {\r
2651       format.incoll.inproc.crossref output.nonnull\r
2652       format.articleno output\r
2653       format.pages.check.without.articleno output\r
2654     }\r
2655   if$\r
2656   format.articleno.numpages output\r
2657   fin.block\r
2658   output.issue.doi.coden.isxn.lccn.url.note\r
2659   fin.entry\r
2660 }\r
2661 \r
2662 FUNCTION { conference } { inproceedings }\r
2663 \r
2664 FUNCTION { manual }\r
2665 {\r
2666   output.bibitem\r
2667   author empty.or.unknown\r
2668     { editor empty.or.unknown\r
2669       { organization "organization" output.check\r
2670         organization format.key output }  % if all else fails, use key\r
2671       { format.editors "author and editor" output.check }\r
2672       if$\r
2673     }\r
2674     { format.authors output.nonnull }\r
2675     if$\r
2676   output.year.check                 % added\r
2677   new.block\r
2678   format.btitle "title" output.check\r
2679   organization address new.block.checkb\r
2680   % jtb: back to normal style: organization, address\r
2681   organization "organization" output.check\r
2682   address output\r
2683   fin.block\r
2684   output.issue.doi.coden.isxn.lccn.url.note\r
2685   fin.entry\r
2686 }\r
2687 \r
2688 FUNCTION { mastersthesis }\r
2689 {\r
2690   output.bibitem\r
2691   format.authors "author" output.check\r
2692   author format.key output          % added\r
2693   output.year.check                 % added\r
2694   new.block\r
2695   format.title emphasize "title" output.check  % NB: ACM style requires emphasized thesis title\r
2696   new.block\r
2697   "Master's\ thesis" format.thesis.type output new.sentence  % Added dot. BV 2011/09/27\r
2698   school "school" output.check\r
2699   address output\r
2700   new.block\r
2701   format.advisor output\r
2702   fin.block\r
2703   output.issue.doi.coden.isxn.lccn.url.note\r
2704   fin.entry\r
2705 }\r
2706 \r
2707 FUNCTION { misc }\r
2708 {\r
2709   output.bibitem\r
2710   format.authors output\r
2711   author format.key output            % added\r
2712   output.year.check                   % added\r
2713   title howpublished new.block.checkb\r
2714   format.title output\r
2715   new.block\r
2716   howpublished output\r
2717   "" output.nonnull.dot.space\r
2718   output.day.month.year              % Gerry - appears odd if (only) the year is 'repeated' but (appears) 'valuable' if the month/day is _also_ included - 2011/09/28\r
2719   fin.block\r
2720   output.issue.doi.coden.isxn.lccn.url.note\r
2721   fin.entry\r
2722 }\r
2723 \r
2724 FUNCTION { phdthesis }\r
2725 {\r
2726   output.bibitem\r
2727   format.authors "author" output.check\r
2728   author format.key output          % added\r
2729   output.year.check                 % added\r
2730   new.block\r
2731   format.title emphasize "title" output.check  % NB: ACM style requires emphasized thesis title\r
2732   new.block\r
2733  "Ph.D. Dissertation" format.thesis.type output new.sentence % Added dot. BV 2011/09/27\r
2734   school "school" output.check\r
2735   address output\r
2736   new.block\r
2737   format.advisor output\r
2738   fin.block\r
2739   output.issue.doi.coden.isxn.lccn.url.note\r
2740   fin.entry\r
2741 }\r
2742 \r
2743 FUNCTION {format.date}\r
2744 { year empty.or.unknown\r
2745     { month empty.or.unknown\r
2746         {\r
2747           ""                    % output empty date if year/month both empty\r
2748           day empty.or.unknown\r
2749             {  }\r
2750             { "there's a day but no month or year in " cite$ * warning$ }\r
2751           if$\r
2752         }\r
2753         { "there's a month but no year in " cite$ * warning$\r
2754           month\r
2755           day empty.or.unknown\r
2756             { }\r
2757             { " " * day * }\r
2758           if$\r
2759         }\r
2760       if$\r
2761     }\r
2762     { month empty.or.unknown\r
2763         {\r
2764           year                  % output only year if month empty\r
2765           day empty.or.unknown\r
2766             {  }\r
2767             { "there's a day and year but no month in " cite$ * warning$ }\r
2768           if$\r
2769         }\r
2770         {\r
2771           month " " *\r
2772           day empty.or.unknown\r
2773             { }\r
2774             { day * ", " * }\r
2775           if$\r
2776           year *\r
2777         }\r
2778       if$\r
2779     }\r
2780   if$\r
2781 }\r
2782 \r
2783 FUNCTION {new.block.checka}\r
2784 {\r
2785   empty.or.unknown\r
2786     'skip$\r
2787     'new.block\r
2788   if$\r
2789 }\r
2790 \r
2791 FUNCTION { periodical }\r
2792 {\r
2793   output.bibitem\r
2794   editor empty.or.unknown\r
2795     { organization output }\r
2796     { format.editors output.nonnull }\r
2797   if$\r
2798   new.block\r
2799   title emphasize "title" output.check\r
2800   format.date output\r
2801   new.sentence\r
2802   publisher output\r
2803   address output\r
2804   howpublished new.block.checka\r
2805   howpublished output\r
2806   fin.block\r
2807   output.issue.doi.coden.isxn.lccn.url.note\r
2808   fin.entry\r
2809 }\r
2810 \r
2811 FUNCTION { proceedings }\r
2812 {\r
2813   output.bibitem\r
2814   editor empty.or.unknown\r
2815     { organization output\r
2816       organization format.key output }  % gnp - changed from author format.key\r
2817     { format.editors output.nonnull }\r
2818   if$\r
2819   % author format.key output             % gnp - removed (should be either\r
2820   %                                        editor or organization\r
2821   output.year.check                    % added (newapa)\r
2822   new.block\r
2823   format.btitle format.city "title" output.check        % jtb: added city\r
2824   new.sentence\r
2825   format.bvolume output\r
2826   format.number.series output\r
2827   new.sentence\r
2828   organization output\r
2829   % jtb: normal order: publisher, address\r
2830   publisher output\r
2831   address output\r
2832   fin.block\r
2833   output.issue.doi.coden.isxn.lccn.url.note\r
2834   fin.entry\r
2835 }\r
2836 \r
2837 FUNCTION { techreport }\r
2838 {\r
2839   output.bibitem\r
2840   format.authors "author" output.check\r
2841   author format.key output             % added\r
2842   output.year.check                    % added\r
2843   new.block\r
2844   format.btitle "title" output.check\r
2845   new.block\r
2846 %   format.tr.number output               % jtb: moved month ...\r
2847   format.tr.number output new.sentence    % Gerry  - need dot 2011/09/28\r
2848   institution "institution" output.check\r
2849   address output\r
2850   new.sentence\r
2851   format.named.pages output\r
2852   % ACM omits year at end in transactions style\r
2853   % format.day.month.year output.nonnull.dot.space  % jtb: ... to here (no parens)\r
2854   fin.block\r
2855   output.issue.doi.coden.isxn.lccn.url.note\r
2856   fin.entry\r
2857 }\r
2858 \r
2859 FUNCTION { unpublished }\r
2860 {\r
2861   output.bibitem\r
2862   format.authors\r
2863   "author" output.check\r
2864   author format.key output              % added\r
2865   output.year.check                     % added\r
2866   new.block\r
2867   format.title "title" output.check\r
2868   fin.sentence\r
2869   output.day.month.year                 % UTAH\r
2870   fin.block\r
2871   output.issue.doi.coden.isxn.lccn.url.note.check\r
2872   fin.entry\r
2873 }\r
2874 \r
2875 FUNCTION { default.type } { misc }\r
2876 \r
2877 %%% ACM journal-style month definitions: full name if 1--5 letters, else\r
2878 %%% abbreviation of 3 or 4 characters and a dot\r
2879 \r
2880 MACRO {jan}             {"Jan."}\r
2881 \r
2882 MACRO {feb}             {"Feb."}\r
2883 \r
2884 MACRO {mar}             {"March"}\r
2885 \r
2886 MACRO {apr}             {"April"}\r
2887 \r
2888 MACRO {may}             {"May"}\r
2889 \r
2890 MACRO {jun}             {"June"}\r
2891 \r
2892 MACRO {jul}             {"July"}\r
2893 \r
2894 MACRO {aug}             {"Aug."}\r
2895 \r
2896 MACRO {sep}             {"Sept."}\r
2897 \r
2898 MACRO {oct}             {"Oct."}\r
2899 \r
2900 MACRO {nov}             {"Nov."}\r
2901 \r
2902 MACRO {dec}             {"Dec."}\r
2903 \r
2904 \r
2905 %%% ====================================================================\r
2906 %%%                 I M P O R T A N T   C H A N G E\r
2907 %%%\r
2908 %%% For the 2009 release of the official acm-*.bst files, there are to\r
2909 %%% be NO predefined journal abbreviations in those style files.\r
2910 %%%\r
2911 %%% ACM may later develop an official list of mappings of full journal\r
2912 %%% names of commonly-cited journals to ACM-preferred abbreviations, but\r
2913 %%% authors should consider that use of any of these commented-out\r
2914 %%% abbreviations is DEPRECATED unless the BibTeX file itself provides\r
2915 %%% its own @String{name = "value"} definitions.\r
2916 %%%\r
2917 %%% Use of journal (and publisher and address) @String{...}\r
2918 %%% abbreviations, as opposed to explicit value assignments such as\r
2919 %%% journal = "J. ACM" and publisher = "IEEE", is preferred in\r
2920 %%% bibliographic databases, because it makes it easier for journal\r
2921 %%% production staff to replace those definitions by publisher-preferred\r
2922 %%% abbreviations when articles are typeset for publication.\r
2923 %%%\r
2924 %%% For historical reasons, and because some of these abbreviations are\r
2925 %%% used in other (non-ACM) bibliography style files, they are preserved\r
2926 %%% here in comments.  Future releases of the acm*-.bst files are likely\r
2927 %%% to remove them entirely.\r
2928 %%% ====================================================================\r
2929 %%%\r
2930 %%% DEPRECATED: MACRO {acmcs}           {"ACM Comput. Surv."}                   % original BibTeX\r
2931 %%% DEPRECATED:\r
2932 %%% DEPRECATED: MACRO {acmlett}         {"ACM Lett. Program. Lang. Syst."}\r
2933 %%% DEPRECATED:\r
2934 %%% DEPRECATED: MACRO {acta}            {"Acta Inf."}                           % original BibTeX\r
2935 %%% DEPRECATED:\r
2936 %%% DEPRECATED: MACRO {ai}              {"Artificial Intelligence"}\r
2937 %%% DEPRECATED:\r
2938 %%% DEPRECATED: MACRO {al}              {"Ada Lett."}\r
2939 %%% DEPRECATED:\r
2940 %%% DEPRECATED: MACRO {acr}             {"Adv. Comput. Res."}\r
2941 %%% DEPRECATED:\r
2942 %%% DEPRECATED: MACRO {bit}             {"Bit"}\r
2943 %%% DEPRECATED:\r
2944 %%% DEPRECATED: MACRO {cacm}            {"Commun. ACM"}                         % original BibTeX\r
2945 %%% DEPRECATED:\r
2946 %%% DEPRECATED: MACRO {cj}              {"Comput. J."}\r
2947 %%% DEPRECATED:\r
2948 %%% DEPRECATED: MACRO {cn}              {"Comput. Netw."}\r
2949 %%% DEPRECATED:\r
2950 %%% DEPRECATED: MACRO {cl}              {"Comput. Lang."}\r
2951 %%% DEPRECATED:\r
2952 %%% DEPRECATED: MACRO {ibmjrd}          {"IBM J. Res. and Development"}         % original BibTeX\r
2953 %%% DEPRECATED:\r
2954 %%% DEPRECATED: MACRO {ibmsj}           {"IBM Systems Journal"}                 % original BibTeX\r
2955 %%% DEPRECATED:\r
2956 %%% DEPRECATED: MACRO {ict}             {"Inf. Contr."}\r
2957 %%% DEPRECATED:\r
2958 %%% DEPRECATED: MACRO {ieebcs}          {"IEE/BCS Softw. Eng. J."}\r
2959 %%% DEPRECATED:\r
2960 %%% DEPRECATED: MACRO {ieees}           {"IEEE Softw."}\r
2961 %%% DEPRECATED:\r
2962 %%% DEPRECATED: MACRO {ieeese}          {"IEEE Trans. Softw. Eng."}             % original BibTeX\r
2963 %%% DEPRECATED:\r
2964 %%% DEPRECATED: MACRO {ieeetc}          {"IEEE Trans. Comput."}                 % original BibTeX\r
2965 %%% DEPRECATED:\r
2966 %%% DEPRECATED: MACRO {ieeetcad}        {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} % original BibTeX\r
2967 %%% DEPRECATED:\r
2968 %%% DEPRECATED: MACRO {ieeetpds}        {"IEEE Trans. Parall. Distrib. Syst."}\r
2969 %%% DEPRECATED:\r
2970 %%% DEPRECATED: MACRO {ieeetit}         {"IEEE Trans. Inf. Theory"}\r
2971 %%% DEPRECATED:\r
2972 %%% DEPRECATED: MACRO {ipl}             {"Inf. Process. Lett."}                 % original BibTeX\r
2973 %%% DEPRECATED:\r
2974 %%% DEPRECATED: MACRO {icp}             {"Inf. Comput."}\r
2975 %%% DEPRECATED:\r
2976 %%% DEPRECATED: MACRO {ist}             {"Inf. Softw. Tech."}\r
2977 %%% DEPRECATED:\r
2978 %%% DEPRECATED: MACRO {ijsa}            {"Int. J. Supercomput. Appl."}\r
2979 %%% DEPRECATED:\r
2980 %%% DEPRECATED: MACRO {ijpp}            {"Int. J. Parallel Program."}\r
2981 %%% DEPRECATED:\r
2982 %%% DEPRECATED: MACRO {jacm}            {"J. ACM"}                              % original BibTeX\r
2983 %%% DEPRECATED:\r
2984 %%% DEPRECATED: % MACRO {jcss}          {"Journal of Computer and System Sciences"} % original BibTeX\r
2985 %%% DEPRECATED: MACRO {jcss}            {"J. Comput. Syst. Sci."}               % original BibTeX\r
2986 %%% DEPRECATED:\r
2987 %%% DEPRECATED: MACRO {jlp}             {"J. Logic Program."}\r
2988 %%% DEPRECATED:\r
2989 %%% DEPRECATED: MACRO {jfp}             {"J. Funct. Program."}\r
2990 %%% DEPRECATED:\r
2991 %%% DEPRECATED: MACRO {jsmrp}           {"J. Softw. Maint. Res. Pract."}\r
2992 %%% DEPRECATED:\r
2993 %%% DEPRECATED: MACRO {jss}             {"J. Syst. Softw."}\r
2994 %%% DEPRECATED:\r
2995 %%% DEPRECATED: MACRO {jlc}             {"J. Logic and Comput."}\r
2996 %%% DEPRECATED:\r
2997 %%% DEPRECATED: MACRO {jlsc}            {"J. Lisp Symb. Comput."}\r
2998 %%% DEPRECATED:\r
2999 %%% DEPRECATED: MACRO {lpls}            {"Lett. Program. Lang. Syst."}\r
3000 %%% DEPRECATED:\r
3001 %%% DEPRECATED: MACRO {mor}             {"Math. Oper. Res."}\r
3002 %%% DEPRECATED:\r
3003 %%% DEPRECATED: MACRO {mscs}            {"Math. Struct. Comput. Sci."}\r
3004 %%% DEPRECATED:\r
3005 %%% DEPRECATED: MACRO {mst}             {"Math. Syst. Theor."}\r
3006 %%% DEPRECATED:\r
3007 %%% DEPRECATED: MACRO {ngc}             {"New Gen. Comput."}\r
3008 %%% DEPRECATED:\r
3009 %%% DEPRECATED: MACRO {scp}             {"Sci. Comput. Program."}               % original BibTeX\r
3010 %%% DEPRECATED:\r
3011 %%% DEPRECATED: MACRO {sicomp}          {"SIAM J. Comput."}                     % original BibTeX\r
3012 %%% DEPRECATED:\r
3013 %%% DEPRECATED: MACRO {spe}             {"Softw. Pract. Exper."}\r
3014 %%% DEPRECATED:\r
3015 %%% DEPRECATED: MACRO {tocs}            {"ACM Trans. Comput. Syst."}            % original BibTeX\r
3016 %%% DEPRECATED:\r
3017 %%% DEPRECATED: MACRO {tods}            {"ACM Trans. Database Syst."}           % original BibTeX\r
3018 %%% DEPRECATED:\r
3019 %%% DEPRECATED: MACRO {tog}             {"ACM Trans. Graphics"}                 % original BibTeX\r
3020 %%% DEPRECATED:\r
3021 %%% DEPRECATED: MACRO {toms}            {"ACM Trans. Math. Softw."}             % original BibTeX\r
3022 %%% DEPRECATED:\r
3023 %%% DEPRECATED: MACRO {toois}           {"ACM Trans. Office Inf. Syst."}        % original BibTeX\r
3024 %%% DEPRECATED:\r
3025 %%% DEPRECATED: MACRO {toplas}          {"ACM Trans. Program. Lang. Syst."}     % original BibTeX\r
3026 %%% DEPRECATED:\r
3027 %%% DEPRECATED: MACRO {tcs}             {"Theor. Comput. Sci."}                 % original BibTeX\r
3028 %%% DEPRECATED:\r
3029 %%% DEPRECATED: MACRO {tr}              {"Tech. Rep."}\r
3030 %%% ====================================================================\r
3031 \r
3032 READ\r
3033 \r
3034 FUNCTION { sortify }\r
3035 {\r
3036   purify$\r
3037   "l" change.case$\r
3038 }\r
3039 \r
3040 FUNCTION { chop.word }\r
3041 {\r
3042   's :=\r
3043   'len :=\r
3044   s #1 len substring$ =\r
3045     { s len #1 + global.max$ substring$ }\r
3046     's\r
3047   if$\r
3048 }\r
3049 \r
3050 FUNCTION { sort.format.names }\r
3051 {\r
3052   's :=\r
3053   #1 'nameptr :=\r
3054   ""\r
3055   s num.names$ 'numnames :=\r
3056   numnames 'namesleft :=\r
3057     { namesleft #0 > }\r
3058     { nameptr #1 >\r
3059           { "   " * }\r
3060          'skip$\r
3061       if$\r
3062   %      s nameptr "{ff{ } }{ll{ }}{  vv{ }}{  jj{ }}" format.name$ 't :=\r
3063       s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=\r
3064       nameptr numnames = t "others" = and\r
3065           { " et~al" * }\r
3066           { t sortify * }\r
3067       if$\r
3068       nameptr #1 + 'nameptr :=\r
3069       namesleft #1 - 'namesleft :=\r
3070     }\r
3071   while$\r
3072 }\r
3073 \r
3074 FUNCTION { sort.format.title }\r
3075 {\r
3076   't :=\r
3077   "A " #2\r
3078     "An " #3\r
3079       "The " #4 t chop.word\r
3080     chop.word\r
3081   chop.word\r
3082   sortify\r
3083   #1 global.max$ substring$\r
3084 }\r
3085 \r
3086 FUNCTION { author.sort }\r
3087 {\r
3088   author empty.or.unknown\r
3089     { key empty.or.unknown\r
3090          { "to sort, need author or key in " cite$ * warning$\r
3091            "" }\r
3092          { key sortify }\r
3093       if$\r
3094     }\r
3095     { author sort.format.names }\r
3096   if$\r
3097 }\r
3098 \r
3099 FUNCTION { author.editor.sort }\r
3100 {\r
3101   author empty.or.unknown\r
3102     {\r
3103       editor empty.or.unknown\r
3104          {\r
3105            key empty.or.unknown\r
3106              { "to sort, need author, editor, or key in " cite$ * warning$\r
3107                ""\r
3108              }\r
3109              { key sortify }\r
3110            if$\r
3111          }\r
3112          { editor sort.format.names }\r
3113       if$\r
3114     }\r
3115     { author sort.format.names }\r
3116   if$\r
3117 }\r
3118 \r
3119 FUNCTION { author.organization.sort }\r
3120 {\r
3121   % added - GNP. Stack author or organization for sorting (from alpha.bst).\r
3122   % Unlike alpha.bst, we need entire names, not abbreviations\r
3123 \r
3124   author empty.or.unknown\r
3125     { organization empty.or.unknown\r
3126         { key empty.or.unknown\r
3127             { "to sort, need author, organization, or key in " cite$ * warning$\r
3128               ""\r
3129             }\r
3130             { key sortify }\r
3131           if$\r
3132         }\r
3133         { organization sortify }\r
3134       if$\r
3135     }\r
3136     { author sort.format.names }\r
3137   if$\r
3138 }\r
3139 \r
3140 FUNCTION { editor.organization.sort }\r
3141 {\r
3142   % added - GNP. Stack editor or organization for sorting (from alpha.bst).\r
3143   % Unlike alpha.bst, we need entire names, not abbreviations\r
3144 \r
3145   editor empty.or.unknown\r
3146     { organization empty.or.unknown\r
3147         { key empty.or.unknown\r
3148             { "to sort, need editor, organization, or key in " cite$ * warning$\r
3149               ""\r
3150             }\r
3151             { key sortify }\r
3152           if$\r
3153         }\r
3154         { organization sortify }\r
3155       if$\r
3156     }\r
3157     { editor sort.format.names }\r
3158   if$\r
3159 }\r
3160 \r
3161 FUNCTION { presort }\r
3162 {\r
3163   % Presort creates the bibentry's label via a call to calc.label, and then\r
3164   % sorts the entries based on entry type. Chicago.bst adds support for\r
3165   % including organizations as the sort key; the following is stolen from\r
3166   % alpha.bst.\r
3167 \r
3168   calc.label sortify % recalculate bibitem label\r
3169   year field.or.null purify$ #-1 #4 substring$ * % add year\r
3170   "    "\r
3171   *\r
3172   type$ "book" =\r
3173   type$ "inbook" =\r
3174   or\r
3175     'author.editor.sort\r
3176     { type$ "proceedings" =\r
3177         'editor.organization.sort\r
3178         { type$ "manual" =\r
3179             'author.organization.sort\r
3180             'author.sort\r
3181           if$\r
3182         }\r
3183       if$\r
3184     }\r
3185   if$\r
3186   #1 entry.max$ substring$        % added for newapa\r
3187   'sort.label :=                  % added for newapa\r
3188   sort.label                      % added for newapa\r
3189   *\r
3190   "    "\r
3191   *\r
3192   title field.or.null\r
3193   sort.format.title\r
3194   *\r
3195   #1 entry.max$ substring$\r
3196   'sort.key$ :=\r
3197 }\r
3198 \r
3199 ITERATE { presort }\r
3200 \r
3201 SORT             % by label, year, author/editor, title\r
3202 \r
3203 FUNCTION { initialize.extra.label.stuff }\r
3204 { #0 int.to.chr$ 'last.label :=\r
3205   "" 'next.extra :=\r
3206   #0 'last.extra.num :=\r
3207 }\r
3208 \r
3209 FUNCTION { forward.pass }\r
3210 {\r
3211   % Pass through all entries, comparing current entry to last one.\r
3212   % Need to concatenate year to the stack (done by calc.label) to determine\r
3213   % if two entries are the same (see presort)\r
3214 \r
3215   last.label\r
3216   % OLD:calc.label year field.or.null purify$ #-1 #4 substring$ * % add year\r
3217   % NEW:\r
3218   author.key.label year field.or.null purify$ #-1 #4 substring$ * % add year\r
3219   #1 entry.max$ substring$ =     % are they equal?\r
3220      { last.extra.num #1 + 'last.extra.num :=\r
3221        last.extra.num int.to.chr$ 'extra.label :=\r
3222      }\r
3223      { "a" chr.to.int$ 'last.extra.num :=\r
3224        "" 'extra.label :=\r
3225        % OLD: calc.label year field.or.null purify$ #-1 #4 substring$ * % add year\r
3226        % NEW:\r
3227        author.key.label year field.or.null purify$ #-1 #4 substring$ * % add year\r
3228        #1 entry.max$ substring$ 'last.label := % assign to last.label\r
3229      }\r
3230   if$\r
3231 }\r
3232 \r
3233 FUNCTION { reverse.pass }\r
3234 {\r
3235   next.extra "b" =\r
3236     { "a" 'extra.label := }\r
3237      'skip$\r
3238   if$\r
3239   label.year extra.label * 'sort.year :=\r
3240   extra.label 'next.extra :=\r
3241 }\r
3242 \r
3243 EXECUTE {initialize.extra.label.stuff}\r
3244 \r
3245 ITERATE {forward.pass}\r
3246 \r
3247 REVERSE {reverse.pass}\r
3248 \r
3249 FUNCTION { bib.sort.order }\r
3250 {\r
3251   sort.label\r
3252   "    "\r
3253   *\r
3254   year field.or.null sortify\r
3255   *\r
3256   "    "\r
3257   *\r
3258   title field.or.null\r
3259   sort.format.title\r
3260   *\r
3261   #1 entry.max$ substring$\r
3262   'sort.key$ :=\r
3263 }\r
3264 \r
3265 ITERATE { bib.sort.order }\r
3266 \r
3267 SORT             % by sort.label, year, title --- giving final bib. order.\r
3268 \r
3269 FUNCTION { begin.bib }\r
3270 {\r
3271   %% Set to #0 show 13-digit ISBN in preference to 10-digit ISBN.\r
3272   %% Set to #1 to show both 10-digit and 13-digit ISBNs.\r
3273   #1 'show-isbn-10-and-13 :=\r
3274 \r
3275   "%%% -*-BibTeX-*-" writeln\r
3276   "%%% Do NOT edit. File created by BibTeX with style" writeln\r
3277   "%%% ACM-Reference-Format-Journals [18-Jan-2012]." writeln\r
3278   "" writeln\r
3279 \r
3280   preamble$ empty.or.unknown\r
3281     'skip$\r
3282     { preamble$ writeln }\r
3283   if$\r
3284   "\begin{thebibliography}{00}" writeln\r
3285   ""                                                                         writeln\r
3286   "%%% ====================================================================" writeln\r
3287   "%%% NOTE TO THE USER: you can override these defaults by providing"       writeln\r
3288   "%%% customized versions of any of these macros before the \bibliography"  writeln\r
3289   "%%% command.  Each of them MUST provide its own final punctuation,"       writeln\r
3290   "%%% except for \shownote{}, \showDOI{}, and \showURL{}.  The latter two"  writeln\r
3291   "%%% do not use final punctuation, in order to avoid confusing it with"    writeln\r
3292   "%%% the Web address."                                                     writeln\r
3293   "%%%"                                                                      writeln\r
3294   "%%% To suppress output of a particular field, define its macro to expand" writeln\r
3295   "%%% to an empty string, or better, \unskip, like this:"                   writeln\r
3296   "%%%"                                                                      writeln\r
3297   "%%% \newcommand{\showDOI}[1]{\unskip}   % LaTeX syntax"                   writeln\r
3298   "%%%"                                                                      writeln\r
3299   "%%% \def \showDOI #1{\unskip}           % plain TeX syntax"               writeln\r
3300   "%%%"                                                                      writeln\r
3301   "%%% ====================================================================" writeln\r
3302   ""                                                                         writeln\r
3303 \r
3304   %% ACM publications do not use CODEN, ISSN, and LCCN data, so their default\r
3305   %% macro wrappers expand to \unskip, discarding their values and unwanted\r
3306   %% space.\r
3307   %%\r
3308   %% For other publications, prior definitions like these may be useful:\r
3309   %%\r
3310   %%     Plain TeX:\r
3311   %%         \def \showCODEN     #1{CODEN #1.}\r
3312   %%         \def \showISSN      #1{ISSN #1.}\r
3313   %%         \def \showLCCN      #1{LCCN #1.}\r
3314   %%\r
3315   %%     LaTeX:\r
3316   %%         \newcommand{\showCODEN}[1]{CODEN #1.}\r
3317   %%         \newcommand{\showISSN}[1]#1{ISSN #1.}\r
3318   %%         \newcommand{\showLCCN}[1]{LCCN #1.}\r
3319 \r
3320   "\ifx \showCODEN    \undefined \def \showCODEN     #1{\unskip}     \fi" writeln\r
3321   "\ifx \showDOI      \undefined \def \showDOI       #1{{\tt DOI:}\penalty0{#1}\ } \fi" writeln\r
3322   % ACM styles omit ISBNs, but they can be included by suitable definitions of\r
3323   % \showISBNx and \showISBNxiii before the .bbl file is read\r
3324   "\ifx \showISBNx    \undefined \def \showISBNx     #1{\unskip}     \fi" writeln\r
3325   "\ifx \showISBNxiii \undefined \def \showISBNxiii  #1{\unskip}     \fi" writeln\r
3326   "\ifx \showISSN     \undefined \def \showISSN      #1{\unskip}     \fi" writeln\r
3327   "\ifx \showLCCN     \undefined \def \showLCCN      #1{\unskip}     \fi" writeln\r
3328   "\ifx \shownote     \undefined \def \shownote      #1{#1}          \fi" writeln % NB: final period supplied by add.period$ above\r
3329   "\ifx \showarticletitle \undefined \def \showarticletitle #1{#1}   \fi" writeln\r
3330   "\ifx \showURL      \undefined \def \showURL       #1{#1}          \fi" writeln\r
3331 }\r
3332 \r
3333 EXECUTE {begin.bib}\r
3334 \r
3335 EXECUTE {init.state.consts}\r
3336 \r
3337 ITERATE {call.type$}\r
3338 \r
3339 FUNCTION { end.bib }\r
3340 {\r
3341   newline$\r
3342   "\end{thebibliography}"\r
3343   writeln\r
3344 }\r
3345 \r
3346 EXECUTE {end.bib}\r
3347 \r
3348 %%% End of ACM-Reference-Format-Journals.bst V1.00 - 18 January 2012\r
3349 \r