V10/cmd/prefer/styles/newatt

###
### att reference formatting style
###

BEGIN	{
	PASS = "";		# only one pass thru document	
	sortflag = 0;		# reference_placement bibliography is not sorted
	STYLE = "att";
	SKEY = "adt";
}


#######################################################
#
# Functions required by general awk script
#
#######################################################


##
## Set author and editor fields
##	for reference
##	for possible sorting
##
func setauthor(b,a) {
	Afull[b,a] = LastF_M();
	Asort[b] = Asort[b] Afull[b,a] " ";
}


func seteditor(b,a) {
	E[b,a] = LastF_M();
	Ename[b,a] = F_M_Last();
	Esort[b] = Esort[b] E[b,a] " ";
}



##
## citations
##	print a citation list
##	troff	superscripted numbers
##	nroff	numbers in square brackets
##
func citations(tpunc) {

	seq = "no";
	sep = "";

	# troff citation

	if(nroff == 0) {
		tcite = "";
		begin_super = "\\^\\s-2\\v'-0.4m'\\f1\\&";
		end_super = "\\fP\\v'0.4m'\\s+2"
		if(quote(tpunc) || period(tpunc))
			end_super = end_super "\\ ";

		# format the list of citations, putting in commas and hypens

		for(i=1; i<=cites; i++) {
			seq = sequence(i,cites);
			if (seq == "in") continue;
			if (seq == "end") {
	 			sep = "-";
				seq = "no";
			}
 			tcite = tcite sep makemark(i);
			sep = ",\\ ";
		}
		printf "%s%s%s%s", tpunc, begin_super, tcite, end_super;
	}

	# nroff citation

	else {
		ncite = "\n";
		if(quote(tpunc)) {
			ncite = tpunc " ";
			tpunc = "\\ ";
		}
		else if(tpunc == "(") {
			ncite = tpunc;
			tpunc = "";
		}

		# format the list of citations, putting in commas and hypens

		for(i=1; i<=cites; i++) {
			seq = sequence(i,cites);
			if (seq == "in") continue;
			if (seq == "end") {
	 			sep = "-";
				seq = "no";
			}
			ncite = ncite sep "[" makemark(i) "]";
			sep = ", ";
		}
		printf "%s%s", ncite, tpunc;
	}
}

func quote(punc) {
	if(tpunc == "\"" || tpunc == "'") return 1;
	return 0;
}

func period(punc) {
	if (tpunc == "." || tpunc == "!" || tpunc == "?") return 1;
	return 0;
}


##
## makemark
##	return citation mark: identical citations have the same number
##
func makemark(m) {
	return(uniqno[bibptr[m]]);
}


##
## bibindex
##	print citation mark for the bibliography;
##	return an index for accessing rest of citation
##
func bibindex(b) {
	printf ".sp .5\n.ti -\\w'[" b "]\\ \\ \\ 'u\n";
	printf "[" b "]\\ \\ \\ " ;
	if(sortflag) return sortorder[b];
	else return b;
}



#############################################
#
# Reference types
#
############################################


func book(b) {
			punc = ""
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# italic(title),
			if (title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b];
				punc = ",\n";
			}
	# volume,
			if(volstr[b]) {
				printf "%s%s", punc, volstr[b];
				punc = ",\n";
			}
			else if(volume[b]) {
				printf "%sVol. %s", punc, volume[b];
				punc = ",\n";
			}
	# pages,
			if (pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else printf "%sp. %s", punc, pages[b];
				punc = ",\n";
			}
	# publisher,
			printf "%s%s", punc, issuer[b] ;
			punc = ",\n";
	# location
			if (city[b])
				printf "%s%s", punc, city[b] ;
	# (date)
			printf " (%s)", date[b] ;
}


func editedbook(b) {

			punc = "";
	# authorlist (Eds.),
			if(authors[b]) {
				authorlist(b);
				if(authors[b] <2)
					printf " (Ed.)";
				else
					printf " (Eds.)";
				punc = ",\n";
			}
	# italic(title),
			if (title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b];
				punc = ",\n";
			}
	# volume,
			if(volstr[b]) {
				printf "%s%s", punc, volstr[b];
				punc = ",\n";
			}
			else if(volume[b]) {
				printf "%sVol. %s", punc, volume[b];
				punc = ",\n";
			}
	# publisher,
			printf "%s%s", punc, issuer[b] ;
			punc = ",\n";
	# location,
			if (city[b] != "")
				printf "%s%s", punc, city[b] ;
	# pages
			if ( pages[b] != "" ) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else printf "%sp. %s", punc, pages[b];
			}
	# (date)
			printf " (%s)", date[b] ;
}

func thesis(b) {

			punc = ""
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n"
			}
	# italic(title),
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b];
				punc = ",\n"
			}
	# thesis,
			printf punc;
			if(reftype[b] == "phdthesis")
				printf "PhD Thesis";
			else
				printf "Master's Thesis";
			punc = ",\n";
	# report number,
			if(report[b])
				printf "%s%s", punc, report[b];
	# school
			printf "%s%s", punc, issuer[b];
	# (date)
			printf " (%s)", date[b] ;
}

func review(b) {
	article(b);
}


func article(b) {

			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n"
			}
	# ``Title,''
			if(title[b]) {
				if(nroff)
					printf "%s\"%s,\"", punc, title[b] ;
				else
					printf "%s``%s,''", punc, title[b] ;
				punc = "\n";
			}
	# Reviewed title and author
			if(booktitle[b]) {
				printf "%sReview of \\f2\\&%s\\f1\\&", punc, booktitle[b];
				if(editors[b]) {
					printf " by ";
					enamelist(b);
				}
				if (issuer[b]) {
					printf " %s", issuer[b];
				}
				punc = ",\n";
			}
	# italics(journal)
			printf "%s\\f2\\&%s\\f1\\&", punc, journal[b];
			punc = ",\n";
	# bold(volume)(number Pt part),
			if (volstr[b])
				printf " \\f3\\&%s\\f1\\&", volstr[b] ;
			else if (volume[b])
				printf " \\f3\\&%s\\f1\\&", volume[b] ;
			if (numstr[b]) {
				printf "(%s", numstr[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
			else if (number[b]) {
				printf "(%s", number[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
	# pages,
			if ( pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else printf "%sp. %s", punc,pages[b];
			}
	# publisher
			if(issuer[b])
				if(authors[b] || editors[b])
					printf "%s%s", punc, issuer[b];
	# (date)
			printf " (%s)", date[b];
}




func incollection(b) {

			punc = "";
	# Authorlist
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# ``Title,''
			if(title[b]) {
				if(nroff)
					printf "%s\"%s,\"", punc, title[b] ;
				else
					printf "%s``%s,''", punc, title[b] ;
				punc = "\n";
			}
	# pages
			if ( pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s ", punc, pages[b];
				else printf "%sp. %s ", punc, pages[b];
				punc = "";
			}
	# in italics(booktitle),
			printf "%sin \\f2\\&%s\\f1\\&", punc, booktitle[b];
			punc = ",\n";
	# volume,
			if(volstr[b]) {
				printf "%s%s", punc, volstr[b];
			}
			else if(volume[b]) {
				printf "%sVol. %s", punc, volume[b];
			}
	# editorlist (Ed.),
			if(editors[b]) {
				printf punc;
				editorlist(b);
				if (editors[b] == 1) printf " (Ed.)"
				else if (editors[b] > 1) printf " (Eds.)"
			}
	# publisher, location,
			printf  "%s%s", punc, issuer[b]
			if (city[b])
				printf ", %s", city[b] ;
	# (date)
			printf  " (%s)", date[b];
}


func inproceedings(b) {

			punc = "";
	# authorlist
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# ``Title,''
			if(title[b]) {
				if(nroff)
					printf "%s\"%s,\"", punc,title[b] ;
				else
					printf "%s``%s,''", punc,title[b] ;
				punc = "\n";
			}

	# italics(journal)
			printf "%s\\f2\\&%s\\f1\\&", punc, journal[b];
			punc = ",\n";
	# bold(vol)(no Pt. #),
			if (volstr[b])
				printf " \\f3\\&%s\\f1\\&", volstr[b] ;
			else if (volume[b])
				printf " \\f3\\&%s\\f1\\&", volume[b] ;
			if (numstr[b]) {
				printf "(%s", numstr[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
			else if (number[b]) {
				printf "(%s", number[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
	# pages,
			if ( pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else printf "%sp. %s", punc, pages[b];
			}
	# editorlist (Ed.),
			if(editors[b]) {
				printf punc;
				editorlist(b);
				if (editors[b] == 1) printf " (Ed.)"
				else if (editors[b] > 1) printf " (Eds.)"
			}
	# publisher
			if(issuer[b])
				if(authors[b] || editors[b])
					printf "%s%s", punc, issuer[b];
			if (city[b])
				printf "%s%s", punc, city[b] ;
	# (date)
			printf " (%s)", date[b];
}

func proceedings(b) {
			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
				
	# editorlist (Ed.),
			else if(editors[b]) {
				printf punc;
				editorlist(b);
				if (editors[b] == 1) printf " (Ed.)"
				else if (editors[b] > 1) printf " (Eds.)"
				punc = ",\n";
			}
	# publisher,
			else if(issuer[b]) {
				printf "%s%s", punc, issuer[b];
				punc = ",\n";
			}
	# italics(title)
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc,title[b];
				punc = " ";
			}
	# bold(vol)(no Pt. #),
			if (volstr[b]) {
				printf "%s\\f3\\&%s\\f1\\&", punc,volstr[b];
				punc = ",\n";
			}
			else if (volume[b]) {
				printf "%s\\f3\\&%s\\f1\\&", punc,volume[b];
				punc = ",\n";
			}
			if (numstr[b]) {
				printf "(%s", numstr[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
			else if (number[b]) {
				printf "(%s", number[b];
				if(partstr[b])
					printf " %s", partstr[b];
				else if(part[b])
					printf " Pt. %s", part[b];
				printf ")";
			}
	# publisher,
			if(issuer[b])
				if(authors[b] != 0 || editors[b] != 0)  {
					printf "%s%s", punc, issuer[b];
					punc = ",\n";
				}
	# location,
			if (city[b])
				printf "%s%s", punc, city[b] ;
	# (date)
			if (date[b])
				printf " (%s)", date[b];
}

func techreport(b) {

			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# ``Title,''
			if(title[b]) {
				if(nroff)
					printf "%s\"%s,\"", punc, title[b] ;
				else
					printf "%s``%s,''", punc, title[b] ;
				punc = "\n";
			}
	# report,
			printf "%s%s", punc, report[b];
			punc = ",\n";
	# publisher,
			if (issuer[b]) printf "%s%s", punc, issuer[b] ;
	# location
			if (city[b])
				printf "%s%s", punc, city[b] ;
	# (date)
			printf " (%s)", date[b] ;
}


func tm(b) {

			punc = ""
	# authorlist
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# italic(title),
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b];
				punc = ",\n";
			}
	# tmno
			printf punc;
			if(rp)
				printf "AT&T Bell Laboratories internal memorandum";
			else
				printf "%s", tmno[b] 
	# (date)
			printf " (%s)", date[b] ;
}


func manual(b) {
			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
	# editorlist (Ed.),
			else if(editors[b] > 0) {
				printf punc;
				editorlist(b);
				if (editors[b] == 1) printf " (Ed.)"
				else if (editors[b] > 1) printf " (Eds.)"
				punc = ",\n"
			}
	# publisher,
			else if(issuer[b]) {
				printf "%s%s", punc, issuer[b];
				punc = ",\n";
			}
	# italic(title),
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b];
				punc = ",\n";
			}
	# volume,
			if(volstr[b]) {
				printf "%s%s", punc, volstr[b];
			}
			else if(volume[b]) {
				printf "%sVol. %s", punc, volume[b];
			}
	# publisher,
			if(issuer[b])
				if(authors[b] || editors[b] ) {
					printf "%s%s", punc, issuer[b];
					punc = ",\n";
				}
	# location,
			if (city[b])
				printf "%s%s", punc, city[b] ;
	# pages
			if (pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else
					printf "%sp. %s", punc, pages[b];
			}
	# (date)
			printf " (%s)", date[b];
}

func pamphlet(b)
{
			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
				
	# publisher,
			else if(issuer[b]) {
				printf "%s%s", punc, issuer[b];
				punc = ",\n";
			}
	# ``Title,''
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b] ;
				punc = ",\n";
			}
	# publisher,
			if(issuer[b]) {
				if(authors[b] || editors[b]) {
					printf "%s%s", punc, issuer[b];
				}
			}
	# location
			if (city[b]) {
				printf "%s%s", punc, city[b] ;
			}
	# (date),
			if (date[b]) {
				printf " (%s)", date[b];
			}
}

func default(b) {
			punc = "";
	# authorlist,
			if(authors[b]) {
				authorlist(b);
				punc = ",\n";
			}
				
	# publisher,
			else if(issuer[b]) {
				printf "%s%s", punc, issuer[b];
				punc = ",\n";
			}
	# title,
			if(title[b]) {
				printf "%s\\f2\\&%s\\f1\\&", punc, title[b] ;
				punc = ",\n";
			}
	# volume,
			if(volstr[b]) {
				printf "%s%s", punc, volstr[b];
			}
			else if(volume[b]) {
				printf "%sVol. %s", punc, volume[b];
			}
	# publisher,
			if(issuer[b]) {
				if(authors[b] || editors[b]) {
					printf "%s%s", punc, issuer[b];
				}
			}
	# location,
			if (city[b]) {
				printf "%s%s", punc, city[b] ;
			}
	# pages
			if (pages[b]) {
				if ( pages[b] ~ /[,-]/ )
					printf "%spp. %s", punc, pages[b];
				else
					printf "%sp. %s", punc, pages[b];
			}
	# (date)
			if (date[b]) {
				printf " (%s)", date[b];
			}
}



##
## authorlist
##	First
##	First and Second
##	First, Second,..., and Last
##
func authorlist(b) {			
 	if ( authors[b] == 0 ) ;
	else if ( authors[b] == 1 ) {
		printf Afull[b,1] ;
		if(aetal[b]) printf ", et al.";
	}
	else if ( authors[b] == 2 ) printf Afull[b,1] " and " Afull[b,2];
	else {
		for ( j = 1; j < authors[b]; j++ ) print Afull[b,j] ", ";
		printf "and " Afull[b,authors[b]];
	}
}


##
## editorlist
##	First
##	First and Second
##	First, Second,..., and Last
##
func editorlist(b) {			
 	if ( editors[b] == 0 ) ;
	else if ( editors[b] == 1 ) {
		printf E[b,1] ;
		if(eetal[b]) printf ", et al.";
	}
	else if ( editors[b] == 2 ) printf E[b,1] " and " E[b,2];
	else {
		for ( j = 1; j < editors[b]; j++ ) print E[b,j] ", ";
		printf "and " E[b,editors[b]];
	}
}

##
## enamelist
##	First
##	First and Second
##	First, Second,..., and Last
##
func enamelist(b) {			
 	if ( editors[b] == 0 ) ;
	else if ( editors[b] == 1 ) {
		printf Ename[b,1] ;
		if(eetal[b]) printf ", et al.";
	}
	else if ( editors[b] == 2 ) printf Ename[b,1] " and " Ename[b,2];
	else {
		for ( j = 1; j < editors[b]; j++ ) print Ename[b,j] ", ";
		printf "and " Ename[b,editors[b]];
	}
}