%============================================================================== % abnt.bst % Estilo BibTeX de formatação de referências bibliográficas no padrão ABNT % % UFRGS TeX Users Group % Informatics Institute --- UFRGS % Porto Alegre, Brazil % http://www.inf.ufrgs.br/utug % Discussion list: utug-l@inf.ufrgs.br % % $Id: abnt.bst,v 5.7 2003/04/15 15:09:10 avila Exp $ % % Copyright (C) 2001-2003 UFRGS TeX Users Group % % This program is free software; you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation; either version 2 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program; if not, write to the Free Software % Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA %============================================================================== %============================================================================== % Definição dos campos das entradas %============================================================================== ENTRY { author editor title booktitle chapter pages address publisher year journal month number edition howpublished institution key note organization school series type volume } {} { label year.char } INTEGERS {i j n} STRINGS {s t last.label last.year.char current.letter names new.pages} %============================================================================== % Definicao dos nomes dos meses %============================================================================== MACRO {jan} {"Jan."} MACRO {feb} {"Feb."} MACRO {mar} {"Mar."} MACRO {apr} {"Apr."} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"Aug."} MACRO {sep} {"Sept."} MACRO {oct} {"Oct."} MACRO {nov} {"Nov."} MACRO {dec} {"Dec."} %============================================================================== % Definicao de strings usados na elaboracao das referencias %============================================================================== FUNCTION {str:mastersthesis} {"Disserta{\c{c}}{\~a}o (Mestrado em Ci{\^e}ncia da Computa{\c{c}}{\~a}o)"} FUNCTION {str:phdthesis} {"Tese (Doutorado em Ci{\^e}ncia da Computa{\c{c}}{\~a}o)"} FUNCTION {str:chapter} {"Cap."} %============================================================================== % Definicao das abreviaturas padrao %============================================================================== MACRO {acmcs} {"ACM Computing Surveys"} MACRO {acta} {"Acta Informatica"} MACRO {cacm} {"Communications of the ACM"} MACRO {ibmjrd} {"IBM Journal of Research and Development"} MACRO {ibmsj} {"IBM Systems Journal"} MACRO {ieeese} {"IEEE Transactions on Software Engineering"} MACRO {ieeetc} {"IEEE Transactions on Computers"} MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} MACRO {ipl} {"Information Processing Letters"} MACRO {jacm} {"Journal of the ACM"} MACRO {jcss} {"Journal of Computer and System Sciences"} MACRO {scp} {"Science of Computer Programming"} MACRO {sicomp} {"SIAM Journal on Computing"} MACRO {tocs} {"ACM Transactions on Computer Systems"} MACRO {tods} {"ACM Transactions on Database Systems"} MACRO {tog} {"ACM Transactions on Graphics"} MACRO {toms} {"ACM Transactions on Mathematical Software"} MACRO {toois} {"ACM Transactions on Office Information Systems"} MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} MACRO {tcs} {"Theoretical Computer Science"} %============================================================================== % Exibe warning quando um campo ``required'' esta' faltando. Recebe na pilha o % tipo do campo. %============================================================================== FUNCTION {show.missing.field.warning} { "Falta o campo " swap$ " em " cite$ * * * warning$ } %============================================================================== % Funcoes logicas %============================================================================== FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {is.numeric.char} { #1 #1 substring$ duplicate$ "" = {pop$ #0} { duplicate$ chr.to.int$ #47 > swap$ chr.to.int$ #58 < and } if$ } FUNCTION {is.uppercase.char} { #1 #1 substring$ duplicate$ "" = {pop$ #0} { duplicate$ chr.to.int$ #64 > swap$ chr.to.int$ #91 < and } if$ } %============================================================================== % Escreve no arquivo o comando que gera o item % % Parm: % um string com a formatacao do item %============================================================================== FUNCTION {write.item} { "\bibitem[" label * "]{" * cite$ * "} " * swap$ * write$ newline$ newline$ } %============================================================================== % Separa o titulo em titulo e sub-titulo, empilhando o sub-titulo e o titulo, % nessa ordem % % Parm: % o titulo %============================================================================== FUNCTION {extract.subtitle} { #1 'i := duplicate$ i #1 substring$ { duplicate$ ":" = not swap$ "" = not and } { #1 i + 'i := duplicate$ i #1 substring$ } while$ duplicate$ i #999 substring$ swap$ #1 i #1 - substring$ } %============================================================================== % Separa a primeira palavra do texto, empilhando o resto e a palavra, nessa % ordem % % Parm: % o texto %============================================================================== FUNCTION {extract.first.word} { #1 'i := duplicate$ i #1 substring$ { duplicate$ " " = not swap$ "" = not and } { #1 i + 'i := duplicate$ i #1 substring$ } while$ duplicate$ i #999 substring$ swap$ #1 i #1 - substring$ } %============================================================================== % Enfatiza um string % % Parm: % o string %============================================================================== FUNCTION {emphasize} { "\textbf{" swap$ * "}" * } %============================================================================== % Adiciona um texto (se nao-empty$) ja' formatado ao item, separando-o por % ponto. % Ex.: NOME. Titulo. data. ano. % % Parm: % um string representando o item (pode ser vazio, para iniciar o item) % o texto a ser adicionado %============================================================================== FUNCTION {add.to.item} { duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ 'skip$ {" " *} if$ swap$ add.period$ * } if$ } %============================================================================== % Adiciona um item (se nao-empty$) a uma lista do tipo "a, b, c, ..." % % Parm: % um string representando a lista (pode ser vazio, para criar uma lista) % o item a ser adicionado %============================================================================== FUNCTION {add.to.list} { duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ 'skip$ {", " *} if$ swap$ * } if$ } %============================================================================== % Adiciona um nome a uma lista de nomes (separados por ponto-e-virgula) % % Parm: % um string representando a lista (pode ser vazio, para criar uma lista) % o nome a ser adicionado %============================================================================== FUNCTION {add.to.namelist} { swap$ duplicate$ empty$ 'skip$ {"; " *} if$ swap$ * } %============================================================================== % Formata uma lista de nomes. % % Parm: % os nomes a serem formatados %============================================================================== FUNCTION {format.names} { duplicate$ num.names$ 'n := #1 'i := "" 'names := {i n #1 + <} { duplicate$ duplicate$ i "{ll}{~jj}" format.name$ duplicate$ "others" = { pop$ pop$ names " et~al." * n 'i := }{ "u" change.case$ swap$ i "{, f.}{~vv}" format.name$ * names swap$ add.to.namelist } if$ 'names := #1 i + 'i := } while$ pop$ names duplicate$ #-1 #1 substring$ "." = { #-2 global.max$ substring$ "\@." * } 'skip$ if$ } %============================================================================== % Formata uma lista de sobrenomes. % % Parm: % os nomes a serem formatados %============================================================================== FUNCTION {format.family.names} { duplicate$ num.names$ 'n := #1 'i := "" 'names := {i n #1 + <} { duplicate$ i "{ll}{~jj}" format.name$ duplicate$ "others" = n #3 > i #2 = and or { pop$ names " et~al." * n 'i := }{ "u" change.case$ names swap$ add.to.namelist } if$ 'names := #1 i + 'i := } while$ pop$ names } %============================================================================== % Formata uma lista de sobrenomes com todos os autores. % % Parm: % os nomes a serem formatados %============================================================================== FUNCTION {format.family.names.all} { duplicate$ num.names$ 'n := #1 'i := "" 'names := {i n #1 + <} { duplicate$ i "{ll}{~jj}" format.name$ duplicate$ "others" = { pop$ names " et~al." * n 'i := }{ "u" change.case$ names swap$ add.to.namelist } if$ 'names := #1 i + 'i := } while$ pop$ names } %============================================================================== % Formata um titulo (pode ser `title' ou `booktitle') % % Parm: % um valor (0 ou 1) que indica se a formatacao deve ser enfatizada ou nao % um string com o titulo a ser formatado %============================================================================== FUNCTION {format.title} { swap$ {extract.subtitle emphasize} {extract.subtitle} if$ swap$ "l" change.case$ * } %============================================================================== % Retorna a indicacao de paginas ajustada para ter dois tracos (`--') se a % entrada so' tiver um. %============================================================================== FUNCTION {get.adjusted.pages} { #1 'i := "" 'new.pages := pages #1 #1 substring$ {duplicate$ "" = not} { duplicate$ "-" = pages i #1 - #1 substring$ "-" = not and pages i #1 + #1 substring$ "-" = not and {"-" *} 'skip$ if$ new.pages swap$ * 'new.pages := #1 i + 'i := pages i #1 substring$ } while$ pop$ new.pages } %============================================================================== % Coloca a primeira palavra do titulo em letras maiusculas e o resto em % minusculas. Esta funcao e' usada para gerar referencias cuja entrada e' pelo % titulo. %============================================================================== FUNCTION {format.entrytitle} { #0 title format.title extract.first.word "u" change.case$ swap$ * } %============================================================================== % Converte a edicao literal ("First", "Second", etc., que é o padrão indicado % no manual do BibTeX) para o algarismo correspondente. Recebe na pilha o % string e devolve o numero. %============================================================================== FUNCTION {convert.to.number} { duplicate$ "First" = {pop$ "1"} {duplicate$ "Second" = {pop$ "2"} {duplicate$ "Third" = {pop$ "3"} {duplicate$ "Fourth" = {pop$ "4"} {duplicate$ "Fifth" = {pop$ "5"} {duplicate$ "Sixth" = {pop$ "6"} {duplicate$ "Seventh" = {pop$ "7"} {duplicate$ "Eighth" = {pop$ "8"} {duplicate$ "Ninth" = {pop$ "9"} {duplicate$ "Tenth" = {pop$ "10"} {skip$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } %========================================================================= % Formatacao dos campos. Se o campo nao existir a funcao devolve um string % vazio. %============================================================================== FUNCTION {format.author} { author empty$ {""} {author format.names} if$ } FUNCTION {format.editor} { editor empty$ {""} {editor format.names "~(Ed.)" *} if$ } FUNCTION {format.edition} { edition empty$ {""} {edition convert.to.number ".ed." *} if$ } FUNCTION {format.volume} { volume empty$ {""} {"v." volume *} if$ } FUNCTION {format.number} { number empty$ {""} {"n." number *} if$ } FUNCTION {format.month} { month empty$ {""} {month} if$ } FUNCTION {format.address} { address empty$ {""} {address} if$ } FUNCTION {format.publisher} { type$ "mastersthesis" = type$ "phdthesis" = or { school empty$ {""} {school} if$ }{ type$ "techreport" = { institution empty$ {""} {institution} if$ }{ type$ "manual" = { organization empty$ {""} {organization} if$ }{ publisher empty$ {""} {publisher} if$ } if$ } if$ } if$ } FUNCTION {format.year} { year empty$ {""} {year} if$ } FUNCTION {format.chapter} { chapter empty$ {""} { type empty$ {str:chapter} {type "~" *} if$ chapter * } if$ } FUNCTION {format.pages} { pages empty$ {""} {"p." get.adjusted.pages *} if$ } FUNCTION {format.totalpages} { pages empty$ {""} {pages "p." *} if$ } FUNCTION {format.note} { note empty$ {""} {note} if$ } FUNCTION {format.month.year} { month empty$ {year} {month "~" * year *} if$ } FUNCTION {format.type} { type empty$ 'skip$ {pop$ type} if$ } FUNCTION {format.howpublished} { howpublished empty$ {""} {howpublished} if$ } FUNCTION {format.series} { series empty$ {""} {series} if$ } FUNCTION {format.parenthised.number} { number empty$ { "" }{ "(" number * ")" * } if$ } %============================================================================== % As seguintes funcoes adicionam um item a uma lista passada na pilha. %============================================================================== FUNCTION {add.address} {format.address add.to.list} FUNCTION {add.publisher} {format.publisher add.to.list} FUNCTION {add.year} {format.year add.to.list} FUNCTION {add.chapter} {format.chapter add.to.list} FUNCTION {add.edition} {format.edition add.to.list} FUNCTION {add.volume} {format.volume add.to.list} FUNCTION {add.number} {format.number add.to.list} FUNCTION {add.month} {format.month add.to.list} FUNCTION {add.totalpages} {format.totalpages add.to.list} FUNCTION {add.pages} {format.pages add.to.list} FUNCTION {add.note} {format.note add.to.list} FUNCTION {add.month.year} {format.month.year add.to.list} FUNCTION {add.howpublished} {format.howpublished add.to.list} %============================================================================== % Converte virgula para dois-pontos; usado na formatacao do publisher de % proceedings e inproceedings, que normalmente levam tambem o local de publi- % cao; no padrao ABNT essa separacao deve ser por dois-pontos. % Recebe o string original e devolve o novo. %============================================================================== FUNCTION {comma.to.colon} { 's := "" 't := #1 'i := {s i #1 substring$ "" = not} { s i #1 substring$ duplicate$ "," = {pop$ t ":" * 't :=} {t swap$ * 't :=} if$ i #1 + 'i := } while$ t } % % localiza a posicao do primeiro caractere maiusculo % recebe o string, devolve a posicao % FUNCTION {find.first.uppercase.char} { 's := #1 'j := #1 'i := { s i #1 substring$ 't := t "" = not t is.uppercase.char not and } { i #1 + 'i := t "\" = not t "{" = not and t "}" = not and {i 'j :=} 'skip$ if$ } while$ t "" = {#1} {j} if$ } % % extrai o primeiro numero que aparece no string passado na pilha, % retornando-o; se nao ha' numero, retorna "" % FUNCTION {extract.first.number} { 's := "" 't := #1 'i := { s i #1 substring$ duplicate$ is.numeric.char not swap$ "" = not and } { i #1 + 'i := } while$ {s i #1 substring$ is.numeric.char} { t s i #1 substring$ * 't := i #1 + 'i := } while$ t } % % divide um string em dois % recebe o string e a posicao % devolve a primeira e a segunda parte FUNCTION {split.string} { swap$ 's := duplicate$ s swap$ #1 swap$ #1 - substring$ swap$ s swap$ global.max$ substring$ } % % recebe o titulo original e devolve, na ordem, o tipo de proceedings e o % restante do titulo % FUNCTION {extract.proceedings.type} { 's := type empty$ not {type s} {"dummy" pop$ s #1 #11 substring$ duplicate$ "Proceedings" = {s #12 global.max$ substring$}{ pop$ s #1 #5 substring$ duplicate$ "Proc." = {pop$ "Proceedings" s #6 global.max$ substring$}{ pop$ s #1 #22 substring$ duplicate$ "Conference Proceedings" = {pop$ "Proceedings" s #23 global.max$ substring$}{ pop$ s #1 #6 substring$ duplicate$ "Annals" = {s #7 global.max$ substring$}{ pop$ s #1 #5 substring$ duplicate$ "Actas" = {s #6 global.max$ substring$}{ pop$ s #1 #5 substring$ duplicate$ "Anais" = {s #6 global.max$ substring$}{ pop$ s #1 #6 substring$ duplicate$ "Anales" = {s #7 global.max$ substring$}{ pop$ s #1 #8 substring$ duplicate$ "Memorias" = {s #9 global.max$ substring$}{ pop$ s #1 #22 substring$ duplicate$ "Trabajos Seleccionados" = {s #23 global.max$ substring$}{ pop$ s #1 #11 substring$ duplicate$ "Tagungsband" = {s #12 global.max$ substring$} {pop$ "Anais" s} if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } %============================================================================== % Converte um booktitle do tipo "Proc. of XXX" no padrao ABNT % Recebe na pilha o titulo original % Devolve na pilha, na ordem: % - o tipo de publicacao % - o titulo ja' formatado (em maiusculas e com a edicao) %============================================================================== FUNCTION {process.proceedings.booktitle} { extract.proceedings.type duplicate$ find.first.uppercase.char split.string "u" change.case$ swap$ extract.first.number duplicate$ empty$ 'pop$ {", " swap$ * * "." *} if$ } %============================================================================== % Estas funcoes formatam partes comuns a varios tipos de referencia. %============================================================================== FUNCTION {format.publication} { "" address empty$ { "[S.l." format.publisher empty$ {":~s.n.]" *} {"]: " format.publisher * *} if$ add.year add.to.item } { format.address format.publisher empty$ {": [s.n.]" *} {": " format.publisher * *} if$ add.year add.to.item } if$ } FUNCTION {format.proceedings.publication} { publisher empty$ {"[S.l.:~s.n.]"} {publisher comma.to.colon} if$ add.year } FUNCTION {format.misc.publication} { publisher empty$ { format.address add.year }{ format.publication } if$ } FUNCTION {format.series.info} { "(" format.series * add.volume ")" * } FUNCTION {format.complementary.data.with.totalpages} { "" format.totalpages add.to.item "" series empty$ {add.volume add.number add.to.item} {add.number add.to.item format.series.info add.to.item} if$ } FUNCTION {format.complementary.data.with.page.range} { "" series empty$ {add.volume add.number add.pages} {"" add.number add.pages add.to.item format.series.info add.to.item} if$ } % % esta funcao recebe o titulo a ser formatado % FUNCTION {format.proceedings.booktitle} { process.proceedings.booktitle "" swap$ add.year add.address add.to.item swap$ "{\ldots}" * emphasize " " swap$ * * } %============================================================================== % Formatacao das entradas %============================================================================== FUNCTION {article} { "" format.author add.to.item #0 title format.title add.to.item journal emphasize address empty$ { "[S.l.]" add.to.list }{ add.address } if$ add.volume add.number add.pages add.month.year add.to.item format.note add.to.item write.item } FUNCTION {book} { "" editor empty$ {format.author} {format.editor} if$ add.to.item #1 title format.title add.to.item format.edition add.to.item format.publication add.to.item format.complementary.data.with.totalpages add.to.item format.note add.to.item write.item } FUNCTION {inbook} { "" editor empty$ {format.author} {format.editor} if$ add.to.item #1 title format.title add.to.item format.edition add.to.item format.publication add.to.item format.complementary.data.with.page.range add.to.item format.note add.to.item write.item } FUNCTION {incollection} { "" format.author add.to.item #0 title format.title add.to.item "In:" editor empty$ 'skip$ {format.editor add.to.item} if$ #1 booktitle format.title add.to.item add.to.item format.edition add.to.item format.publication add.to.item format.complementary.data.with.page.range add.to.item format.note add.to.item write.item } FUNCTION {inproceedings} { "" format.author add.to.item #0 title format.title add.to.item " In: " booktitle format.proceedings.booktitle * * format.proceedings.publication add.to.item format.complementary.data.with.page.range add.to.item format.note add.to.item write.item } FUNCTION {manual} { "" author empty$ {format.entrytitle add.to.item} { format.author add.to.item #1 title format.title add.to.item } if$ format.edition add.to.item format.publication add.to.item format.complementary.data.with.totalpages add.to.item format.note add.to.item write.item } FUNCTION {mastersthesis} { "" format.author add.to.item #1 title format.title add.to.item format.year add.to.item format.totalpages add.to.item str:mastersthesis format.type " --- " * format.publisher * add.address add.to.item format.note add.to.item format.parenthised.number add.to.item write.item } FUNCTION {misc} { "" author empty$ { title empty$ 'skip$ {format.entrytitle add.to.item} if$ } { format.author add.to.item title empty$ 'skip$ {#1 title format.title add.to.item} if$ } if$ note empty$ { format.misc.publication add.to.item format.complementary.data.with.totalpages add.to.item }{ format.note add.howpublished add.to.item } if$ write.item } FUNCTION {phdthesis} { "" format.author add.to.item #1 title format.title add.to.item format.year add.to.item format.totalpages add.to.item str:phdthesis format.type " --- " * format.publisher * add.address add.to.item format.note add.to.item format.parenthised.number add.to.item write.item } FUNCTION {proceedings} { "" title format.proceedings.booktitle * format.proceedings.publication add.to.item format.complementary.data.with.page.range add.to.item format.note add.to.item write.item } FUNCTION {techreport} { "" format.author add.to.item #1 title format.title add.to.item format.publication add.to.item type empty$ {""} {type} if$ add.note add.to.item format.parenthised.number add.to.item write.item } FUNCTION {booklet} {misc} FUNCTION {unpublished} {misc} FUNCTION {default.type} {misc} %============================================================================== % Inicializa algumas variaveis globais %============================================================================== FUNCTION {init} { "" 'last.label := "b" 'current.letter := } %============================================================================== % Retorna na pilha o string a ser usado para a ordenacao das entradas. %============================================================================== FUNCTION {get.sortstring} { author empty$ not {format.author " AAA" *}{ editor empty$ not {format.editor " AAA" *}{ title empty$ not {title}{ note empty$ not {note}{ key empty$ not {key}{ "???" } if$ } if$ } if$ } if$ } if$ type$ "inbook" = booktitle empty$ not and { booktitle title = not {pop$ title} 'skip$ if$ } 'skip$ if$ type$ "proceedings" = { pop$ title process.proceedings.booktitle swap$ pop$ } 'skip$ if$ purify$ "l" change.case$ } %============================================================================== % Define as ``keys'' para ordenacao %============================================================================== FUNCTION {set.sortkeys} { get.sortstring format.year * #1 entry.max$ substring$ #1 global.max$ substring$ 'sort.key$ := } %============================================================================== % Ajusta os labels, adicionando letras minusculas aos labels de mesmo autor e % ano %============================================================================== FUNCTION {adjust.label} { last.label label 'last.label := label = { current.letter 'year.char := current.letter chr.to.int$ #1 + int.to.chr$ 'current.letter := }{ "" 'year.char := "b" 'current.letter := } if$ } FUNCTION {reverse.adjust.label} { last.year.char "b" = { "a" 'year.char := } 'skip$ if$ year.char 'last.year.char := } %============================================================================== % Retorna na pilha o string a ser usado para a construcao do label. Quase sempre % sera' o sobrenome do primeiro autor, mas para alguns tipos de referencia pode % ser o editor, a entidade ou o titulo %============================================================================== FUNCTION {get.labelstring} { author empty$ not {author format.family.names} { editor empty$ not {editor format.family.names} { title empty$ not {title "u" change.case$} { key empty$ not {key} {"???"} if$ } if$ } if$ } if$ type$ "inbook" = booktitle empty$ not and { booktitle title = not {pop$ title "u" change.case$} 'skip$ if$ } 'skip$ if$ } %============================================================================== % Retorna na pilha o string a ser usado para a construcao do label. Quase sempre % sera' o sobrenome do primeiro autor, mas para alguns tipos de referencia pode % ser o editor, a entidade ou o titulo % % esta versao retorna os nomes completos %============================================================================== FUNCTION {get.labelstring.all} { author empty$ not {author format.family.names.all} { editor empty$ not {editor format.family.names.all} { title empty$ not {title "u" change.case$} { key empty$ not {key} {"???"} if$ } if$ } if$ } if$ type$ "inbook" = booktitle empty$ not and { booktitle title = not {pop$ title "u" change.case$} 'skip$ if$ } 'skip$ if$ } %============================================================================== % Construção dos labels %============================================================================== FUNCTION {prepare.label.sorting} { get.labelstring.all format.year * duplicate$ 'label := 'sort.key$ := } FUNCTION {make.label} { get.labelstring "(" * year empty$ { "????" }{ year year.char * } if$ * ")" * get.labelstring.all * #1 entry.max$ substring$ #1 global.max$ substring$ 'label := } %============================================================================== % Inicia a definicao das referencias %============================================================================== FUNCTION {begin.bib} { preamble$ empty$ 'skip$ {preamble$ write$ newline$ newline$} if$ "\begin{thebibliography}{\hspace{\parindent}}" write$ newline$ newline$ } %============================================================================== % Termina a definicao das referencias %============================================================================== FUNCTION {end.bib} { "\end{thebibliography}" write$ newline$ } %============================================================================== % main() %============================================================================== READ EXECUTE {init} ITERATE {prepare.label.sorting} SORT ITERATE {adjust.label} REVERSE {reverse.adjust.label} ITERATE {make.label} ITERATE {set.sortkeys} SORT EXECUTE {begin.bib} ITERATE {call.type$} EXECUTE {end.bib}