summaryrefslogtreecommitdiffstats
path: root/cls
diff options
context:
space:
mode:
Diffstat (limited to 'cls')
-rw-r--r--cls/ACM-Reference-Format.bst3081
-rw-r--r--cls/psuthesis.cls915
-rw-r--r--cls/userlib.tex22
3 files changed, 4018 insertions, 0 deletions
diff --git a/cls/ACM-Reference-Format.bst b/cls/ACM-Reference-Format.bst
new file mode 100644
index 0000000..c47cb4c
--- /dev/null
+++ b/cls/ACM-Reference-Format.bst
@@ -0,0 +1,3081 @@
+%%% -*-BibTeX-*-
+%%% ====================================================================
+%%% @BibTeX-style-file{
+%%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray",
+%%% version = "2.1",
+%%% acmart-version = "1.90",
+%%% date = "Mar 26 2023",
+%%% filename = "ACM-Reference-Format.bst",
+%%% email = "borisv@lk.net, boris@varphi.com",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "ACM Transactions bibliography style; BibTeX",
+%%% license = "public domain",
+%%% supported = "yes",
+%%% abstract = "",
+%%% }
+%%% ====================================================================
+
+%%% Revision history: see source in git
+
+ENTRY
+ { address
+ advisor
+ archiveprefix
+ author
+ booktitle
+ chapter
+ city
+ date
+ edition
+ editor
+ eprint
+ eprinttype
+ eprintclass
+ howpublished
+ institution
+ journal
+ key
+ location
+ month
+ note
+ number
+ organization
+ pages
+ primaryclass
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ % New keys recognized
+ issue % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra
+ articleno
+ eid
+ day % UTAH: needed for newspapers, weeklies, bi-weeklies
+ doi % UTAH
+ url % UTAH
+ bookpages % UTAH
+ numpages
+ lastaccessed % UTAH: used only for @Misc{...}
+ coden % UTAH
+ isbn % UTAH
+ isbn-13 % UTAH
+ issn % UTAH
+ lccn % UTAH
+ distinctURL % whether to print url if doi is present
+ }
+ {}
+ { label.year extra.label sort.year sort.label basic.label.year}
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block }
+
+INTEGERS { show-isbn-10-and-13 } % initialized below in begin.bib
+
+INTEGERS { nameptr namesleft numnames }
+
+INTEGERS { multiresult }
+
+INTEGERS { len }
+
+INTEGERS { last.extra.num }
+
+STRINGS { s t t.org u }
+
+STRINGS { last.label next.extra }
+
+STRINGS { p1 p2 p3 page.count }
+
+
+FUNCTION { not }
+{
+ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION { and }
+{
+ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION { or }
+{
+ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+
+FUNCTION { dump.stack.1 }
+{
+ duplicate$ "STACK[top] = [" swap$ * "]" * warning$
+}
+
+FUNCTION { dump.stack.2 }
+{
+ duplicate$ "STACK[top ] = [" swap$ * "]" * warning$
+ swap$
+ duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$
+ swap$
+}
+
+FUNCTION { empty.or.unknown }
+{
+ %% Examine the top stack entry, and push 1 if it is empty, or
+ %% consists only of whitespace, or is a string beginning with two
+ %% queries (??), and otherwise, push 0.
+ %%
+ %% This function provides a replacement for empty$, with the
+ %% convenient feature that unknown values marked by two leading
+ %% queries are treated the same as missing values, and thus, do not
+ %% appear in the output .bbl file, and yet, their presence in .bib
+ %% file(s) serves to mark values which are temporarily missing, but
+ %% are expected to be filled in eventually once more data is
+ %% obtained. The TeX User Group and BibNet bibliography archives
+ %% make extensive use of this practice.
+ %%
+ %% An empty string cannot serve the same purpose, because just as in
+ %% statistics data processing, an unknown value is not the same as an
+ %% empty value.
+ %%
+ %% At entry: stack = ... top:[string]
+ %% At exit: stack = ... top:[0 or 1]
+
+ duplicate$ empty$
+ { pop$ #1 }
+ { #1 #2 substring$ "??" = }
+ if$
+}
+
+FUNCTION { empty.or.zero }
+{
+ %% Examine the top entry and push 1 if it is empty, or is zero
+ duplicate$ empty$
+ { pop$ #1 }
+ { "0" = }
+ if$
+}
+
+
+FUNCTION { writeln }
+{
+ %% In BibTeX style files, the sequences
+ %%
+ %% ... "one" "two" output
+ %% ... "one" "two" output.xxx
+ %%
+ %% ship "one" to the output file, possibly following by punctuation,
+ %% leaving the stack with
+ %%
+ %% ... "two"
+ %%
+ %% There is thus a one-string lag in output processing that must be
+ %% carefully handled to avoid duplicating a string in the output
+ %% file. Unless otherwise noted, all output.xxx functions leave
+ %% just one new string on the stack, and that model should be born
+ %% in mind when reading or writing function code.
+ %%
+ %% BibTeX's asynchronous buffering of output from strings from the
+ %% stack is confusing because newline$ bypasses the buffer. It
+ %% would have been so much easier for newline to be a character
+ %% rather than a state of the output-in-progress.
+ %%
+ %% The documentation in btxhak.dvi is WRONG: it says
+ %%
+ %% newline$ Writes onto the bbl file what's accumulated in the
+ %% output buffer. It writes a blank line if and only
+ %% if the output buffer is empty. Since write$ does
+ %% reasonable line breaking, you should use this
+ %% function only when you want a blank line or an
+ %% explicit line break.
+ %%
+ %% write$ Pops the top (string) literal and writes it on the
+ %% output buffer (which will result in stuff being
+ %% written onto the bbl file when the buffer fills
+ %% up).
+ %%
+ %% Examination of the BibTeX source code shows that write$ does
+ %% indeed behave as claimed, but newline$ sends a newline character
+ %% directly to the output file, leaving the stack unchanged. The
+ %% first line "Writes onto ... buffer." is therefore wrong.
+ %%
+ %% The original BibTeX style files almost always use "write$ newline$"
+ %% in that order, so it makes sense to hide that pair in a private
+ %% function like this one, named after a statement in Pascal,
+ %% the programming language embedded in the BibTeX Web program.
+
+ write$ % output top-of-stack string
+ newline$ % immediate write of newline (not via stack)
+}
+
+FUNCTION { init.state.consts }
+{
+ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+}
+
+FUNCTION { output.nonnull }
+{ % Stack in: ... R S T Stack out: ... R T File out: S<comma><space>
+ 's :=
+ output.state mid.sentence =
+ {
+ ", " * write$
+ }
+ {
+ output.state after.block =
+ {
+ add.period$ writeln
+ "\newblock " write$
+ }
+ {
+ output.state before.all =
+ {
+ write$
+ }
+ {
+ add.period$ " " * write$
+ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION { output.nonnull.dot.space }
+{ % Stack in: ... R S T Stack out: ... R T File out: S<dot><space>
+ 's :=
+ output.state mid.sentence = % { "<DEBUG output.nonnull.dot.space>. " * write$ }
+ {
+ ". " * write$
+ }
+ {
+ output.state after.block =
+ {
+ add.period$ writeln "\newblock " write$
+ }
+ {
+ output.state before.all =
+ {
+ write$
+ }
+ {
+ add.period$ " " * write$
+ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION { output.nonnull.remove }
+{ % Stack in: ... R S T Stack out: ... R T File out: S<space>
+ 's :=
+ output.state mid.sentence =
+ {
+ " " * write$
+ }
+ {
+ output.state after.block =
+ {
+ add.period$ writeln "\newblock " write$
+ }
+ {
+ output.state before.all =
+ {
+ write$
+ }
+ {
+ add.period$ " " * write$
+ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION { output.nonnull.removenospace }
+{ % Stack in: ... R S T Stack out: ... R T File out: S
+ 's :=
+ output.state mid.sentence =
+ {
+ "" * write$
+ }
+ {
+ output.state after.block =
+ {
+ add.period$ writeln "\newblock " write$
+ }
+ {
+ output.state before.all =
+ {
+ write$
+ }
+ {
+ add.period$ " " * write$
+ }
+ if$
+ }
+ if$
+ mid.sentence 'output.state :=
+ }
+ if$
+ s
+}
+
+FUNCTION { output }
+{ % discard top token if empty, else like output.nonnull
+ duplicate$ empty.or.unknown
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION { output.dot.space }
+{ % discard top token if empty, else like output.nonnull.dot.space
+ duplicate$ empty.or.unknown
+ 'pop$
+ 'output.nonnull.dot.space
+ if$
+}
+
+FUNCTION { output.removenospace }
+{ % discard top token if empty, else like output.nonnull.removenospace
+ duplicate$ empty.or.unknown
+ 'pop$
+ 'output.nonnull.removenospace
+ if$
+}
+
+FUNCTION { output.check }
+{ % like output, but warn if key name on top-of-stack is not set
+ 't :=
+ duplicate$ empty.or.unknown
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull
+ if$
+}
+
+FUNCTION { bibinfo.output.check }
+{ % like output.check, adding bibinfo field
+ 't :=
+ duplicate$ empty.or.unknown
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ { "\bibinfo{" t "}{" * * swap$ * "}" *
+ output.nonnull }
+ if$
+}
+
+FUNCTION { output.check.dot.space }
+{ % like output.dot.space, but warn if key name on top-of-stack is not set
+ 't :=
+ duplicate$ empty.or.unknown
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull.dot.space
+ if$
+}
+
+FUNCTION { fin.block }
+{ % functionally, but not logically, identical to fin.entry
+ add.period$
+ writeln
+}
+
+FUNCTION { fin.entry }
+{
+ add.period$
+ writeln
+}
+
+FUNCTION { new.sentence }
+{ % update sentence state, with neither output nor stack change
+ output.state after.block =
+ 'skip$
+ {
+ output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+}
+
+FUNCTION { fin.sentence }
+{
+ add.period$
+ write$
+ new.sentence
+ ""
+}
+
+FUNCTION { new.block }
+{
+ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION { output.coden } % UTAH
+{ % output non-empty CODEN as one-line sentence (stack untouched)
+ coden empty.or.unknown
+ { }
+ { "\showCODEN{" coden * "}" * writeln }
+ if$
+}
+
+%
+% Sometimes articleno starts with the word 'Article' or 'Paper.
+% (this is a bug of acmdl, sigh)
+% We strip them. We assume eid or articleno is already on stack
+%
+
+FUNCTION { strip.articleno.or.eid }
+{
+ 't :=
+ t #1 #7 substring$ "Article" =
+ {t #8 t text.length$ substring$ 't :=}
+ { }
+ if$
+ t #1 #7 substring$ "article" =
+ {t #8 t text.length$ substring$ 't :=}
+ { }
+ if$
+ t #1 #5 substring$ "Paper" =
+ {t #6 t text.length$ substring$ 't :=}
+ { }
+ if$
+ t #1 #5 substring$ "paper" =
+ {t #6 t text.length$ substring$ 't :=}
+ { }
+ if$
+ % Strip any left trailing space or ~
+ t #1 #1 substring$ " " =
+ {t #2 t text.length$ substring$ 't :=}
+ { }
+ if$
+ t #1 #1 substring$ "~" =
+ {t #2 t text.length$ substring$ 't :=}
+ { }
+ if$
+ t
+}
+
+
+FUNCTION { format.articleno }
+{
+ articleno empty.or.unknown not eid empty.or.unknown not and
+ { "Both articleno and eid are defined for " cite$ * warning$ }
+ 'skip$
+ if$
+ articleno empty.or.unknown eid empty.or.unknown and
+ { "" }
+ {
+ numpages empty.or.unknown
+ { "articleno or eid field, but no numpages field, in "
+ cite$ * warning$ }
+ { }
+ if$
+ eid empty.or.unknown
+ { "Article \bibinfo{articleno}{" articleno strip.articleno.or.eid * "}" * }
+ { "Article \bibinfo{articleno}{" eid strip.articleno.or.eid * "}" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.year }
+{ % push year string or "[n.\,d.]" onto output stack
+ %% Because year is a mandatory field, we always force SOMETHING
+ %% to be output
+ "\bibinfo{year}{"
+ year empty.or.unknown
+ { "[n.\,d.]" }
+ { year }
+ if$
+ * "}" *
+}
+
+FUNCTION { format.day.month }
+{ % push "day month " or "month " or "" onto output stack
+ day empty.or.unknown
+ {
+ month empty.or.unknown
+ { "" }
+ { "\bibinfo{date}{" month * "} " *}
+ if$
+ }
+ {
+ month empty.or.unknown
+ { "" }
+ { "\bibinfo{date}{" day * " " * month * "} " *}
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.day.month.year } % UTAH
+{ % if month is empty, push "" else push "(MON.)" or "(DD MON.)"
+ % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)
+ % acm-*.bst addition: prefix parenthesized date string with
+ % ", Article nnn "
+ articleno empty.or.unknown eid empty.or.unknown and
+ { "" }
+ { output.state after.block =
+ {", " format.articleno * }
+ { format.articleno }
+ if$
+ }
+ if$
+ " (" * format.day.month * format.year * ")" *
+}
+
+FUNCTION { output.day.month.year } % UTAH
+{ % if month is empty value, do nothing; else output stack top and
+ % leave with new top string "(MON.)" or "(DD MON.)"
+ % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)
+ format.day.month.year
+ output.nonnull.remove
+}
+
+FUNCTION { strip.doi } % UTAH
+{ % Strip any Web address prefix to recover the bare DOI, leaving the
+ % result on the output stack, as recommended by CrossRef DOI
+ % documentation.
+ % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to
+ % "10.1145/1534530.1534545". A suitable URL is later typeset and
+ % displayed as the LAST item in the reference list entry. Publisher Web
+ % sites wrap this with a suitable link to a real URL to resolve the DOI,
+ % and the master https://doi.org/ address is preferred, since publisher-
+ % specific URLs can disappear in response to economic events. All
+ % journals are encouraged by the DOI authorities to use that typeset
+ % format and link procedures for uniformity across all publications that
+ % include DOIs in reference lists.
+ % The numeric prefix is guaranteed to start with "10.", so we use
+ % that as a test.
+ % 2017-02-04 Added stripping of https:// (Boris)
+ doi #1 #3 substring$ "10." =
+ { doi }
+ {
+ doi 't := % get modifiable copy of DOI
+
+ % Change https:// to http:// to strip both prefixes (BV)
+
+ t #1 #8 substring$ "https://" =
+ { "http://" t #9 t text.length$ #8 - substring$ * 't := }
+ { }
+ if$
+
+ t #1 #7 substring$ "http://" =
+ {
+ t #8 t text.length$ #7 - substring$ 't :=
+
+ "INTERNAL STYLE-FILE ERROR" 's :=
+
+ % search for next "/" and assign its suffix to s
+
+ { t text.length$ }
+ {
+ t #1 #1 substring$ "/" =
+ {
+ % save rest of string as true DOI (should be 10.xxxx/yyyy)
+ t #2 t text.length$ #1 - substring$ 's :=
+ "" 't := % empty string t terminates the loop
+ }
+ {
+ % discard first character and continue loop: t <= substring(t,2,last)
+ t #2 t text.length$ #1 - substring$ 't :=
+ }
+ if$
+ }
+ while$
+
+ % check for valid DOI (should be 10.xxxx/yyyy)
+ s #1 #3 substring$ "10." =
+ { }
+ { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ }
+ if$
+
+ s % push the stripped DOI on the output stack
+
+ }
+ {
+ "unrecognized DOI value [" doi * "]" * warning$
+ doi % push the unrecognized original DOI on the output stack
+ }
+ if$
+ }
+ if$
+}
+
+%
+% Change by BV: added standard prefix to URL
+%
+FUNCTION { output.doi } % UTAH
+{ % output non-empty DOI as one-line sentence (stack untouched)
+ doi empty.or.unknown
+ { }
+ {
+ %% Use \urldef here for the same reason it is used in output.url,
+ %% see output.url for further discussion.
+ "\urldef\tempurl%" writeln
+ "\url{https://doi.org/" strip.doi * "}" * writeln
+ "\showDOI{\tempurl}" writeln
+ }
+ if$
+}
+
+FUNCTION { output.isbn } % UTAH
+{ % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched)
+ show-isbn-10-and-13
+ {
+ %% show both 10- and 13-digit ISBNs
+ isbn empty.or.unknown
+ { }
+ {
+ "\showISBNx{" isbn * "}" * writeln
+ }
+ if$
+ isbn-13 empty.or.unknown
+ { }
+ {
+ "\showISBNxiii{" isbn-13 * "}" * writeln
+ }
+ if$
+ }
+ {
+ %% show 10-digit ISBNs only if 13-digit ISBNs not available
+ isbn-13 empty.or.unknown
+ {
+ isbn empty.or.unknown
+ { }
+ {
+ "\showISBNx{" isbn * "}" * writeln
+ }
+ if$
+ }
+ {
+ "\showISBNxiii{" isbn-13 * "}" * writeln
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION { output.issn } % UTAH
+{ % output non-empty ISSN as one-line sentence (stack untouched)
+ issn empty.or.unknown
+ { }
+ { "\showISSN{" issn * "}" * writeln }
+ if$
+}
+
+FUNCTION { output.issue }
+{ % output non-empty issue number as a one-line sentence (stack untouched)
+ issue empty.or.unknown
+ { }
+ { "Issue " issue * "." * writeln }
+ if$
+}
+
+FUNCTION { output.lccn } % UTAH
+{ % return with stack untouched
+ lccn empty.or.unknown
+ { }
+ { "\showLCCN{" lccn * "}" * writeln }
+ if$
+}
+
+FUNCTION { output.note } % UTAH
+{ % return with stack empty
+ note empty.or.unknown
+ { }
+ { "\shownote{" note * "}" add.period$ * writeln }
+ if$
+}
+
+FUNCTION { output.note.check } % UTAH
+{ % return with stack empty
+ note empty.or.unknown
+ { "empty note in " cite$ * warning$ }
+ { "\shownote{" note * "}" add.period$ * writeln }
+ if$
+}
+
+FUNCTION { output.eprint } %
+{ % return with stack empty
+ eprint empty.or.unknown
+ { }
+ { "\showeprint"
+ archiveprefix empty.or.unknown
+ { eprinttype empty.or.unknown
+ { }
+ { "[" eprinttype "]" * * * }
+ if$
+ }
+ { "[" archiveprefix "l" change.case$ "]" * * * }
+ if$
+ "{" eprint "}" * * *
+ primaryclass empty.or.unknown
+ { eprintclass empty.or.unknown
+ { }
+ { "~[" eprintclass "]" * * * }
+ if$
+ }
+ { "~[" primaryclass "]" * * * }
+ if$
+ writeln
+ }
+ if$
+}
+
+
+%
+% Changes by BV 2011/04/15. Do not output
+% url if doi is defined
+%
+%
+% Changes by BV 2021/11/26. Output url even if doi is defined
+% if distinctURL is not zero.
+%
+FUNCTION { output.url } % UTAH
+{ % return with stack untouched
+ % output URL and associated lastaccessed fields
+ doi empty.or.unknown distinctURL empty.or.zero not or
+ {
+ url empty.or.unknown
+ { }
+ {
+ %% Use \urldef, outside \showURL, so that %nn, #, etc in URLs work
+ %% correctly. Put the actual URL on its own line to reduce the
+ %% likelihood of BibTeX's nasty line wrapping after column 79.
+ %% \url{} can undo this, but if that doesn't work for some reason
+ %% the .bbl file would have to be repaired manually.
+ "\urldef\tempurl%" writeln
+ "\url{" url * "}" * writeln
+
+ "\showURL{%" writeln
+ lastaccessed empty.or.unknown
+ { "" }
+ { "Retrieved " lastaccessed * " from " * }
+ if$
+ "\tempurl}" * writeln
+ }
+ if$
+ }
+ { }
+ if$
+}
+
+FUNCTION { output.year.check }
+{ % warn if year empty, output top string and leave " YEAR<label>" on stack in mid-sentence
+ year empty.or.unknown
+ { "empty year in " cite$ * warning$
+ write$
+ " \bibinfo{year}{[n.\,d.]}"
+ "\natexlab{" extra.label * "}" * *
+ mid.sentence 'output.state :=
+ }
+ { write$
+ " \bibinfo{year}{" year * "}" *
+ "\natexlab{" extra.label * "}" * *
+ mid.sentence 'output.state :=
+ }
+ if$
+}
+
+
+FUNCTION { le }
+{
+ %% test whether first number is less than or equal to second number
+ %% stack in: n1 n2
+ %% stack out: if n1 <= n2 then 1 else 0
+
+ %% "DEBUG: le " cite$ * warning$
+ > { #0 } { #1 } if$
+}
+
+FUNCTION { ge }
+{
+ %% test whether first number is greater than or equal to second number
+ %% stack in: n1 n2
+ %% stack out: if n1 >= n2 then 1 else 0
+
+ %% "DEBUG: ge " cite$ * warning$
+ < { #0 } { #1 } if$
+}
+
+FUNCTION { is.leading.digit }
+{
+ %% test whether first character of string is a digit
+ %% stack in: string
+ %% stack out: if first-char-is-digit then 1 else 0
+
+ #1 #1 substring$ % replace string by string[1:1]
+ duplicate$ % string[1:1] string[1:1]
+ chr.to.int$
+ "0" chr.to.int$ swap$ le % "0" <= string[1:1] --> 0-or-1
+ swap$ % 0-or-1 string[1:1]
+ chr.to.int$
+ "9" chr.to.int$ le % string[1:1} <= "9" --> 0-or-1
+ and
+}
+
+FUNCTION { skip.digits }
+{
+ %% skip over leading digits in string
+ %% stack in: string
+ %% stack out: rest-of-string leading-digits
+
+ %% "DEBUG: enter skip.digits " cite$ * warning$
+
+ %% dump.stack.1
+
+ duplicate$
+ 't :=
+ 't.org :=
+ "" 'u :=
+
+ { t text.length$ }
+ {
+ %% "=================DEBUG: skip.digits t = [" t * "]" * warning$
+ t is.leading.digit
+ { t #2 t text.length$ #1 - substring$ }
+ {
+ t 'u :=
+ ""
+ }
+ if$
+ 't :=
+ }
+ while$
+
+ u % rest of string
+ t.org #1 t.org text.length$ u text.length$ - substring$ % leading digits
+
+ %% "DEBUG: t.org = [" t.org * "]" * warning$
+ %% "DEBUG: u = [" u * "]" * warning$
+
+ %% dump.stack.2
+
+ %% "DEBUG: leave skip.digits " cite$ * warning$
+}
+
+FUNCTION { skip.nondigits }
+{
+ %% skip over leading nondigits in string
+ %% stack in: string
+ %% stack out: rest-of-string
+
+ %% "DEBUG: enter skip.nondigits " cite$ * warning$
+
+ 't :=
+ "" 'u :=
+
+ { t text.length$ }
+ {
+ %% "=================DEBUG: skip.nondigits t = [" t * "]" * warning$
+ t is.leading.digit
+ {
+ t 'u :=
+ ""
+ }
+ { t #2 t text.length$ #1 - substring$ }
+ if$
+ 't :=
+ }
+ while$
+
+ u % rest of string
+
+ %% dump.stack.1
+ %% "DEBUG: leave skip.nondigits " cite$ * warning$
+}
+
+FUNCTION { parse.next.number }
+{
+ %% stack in: string
+ %% stack out: rest-of-string next-numeric-part-of-string
+ %% Example:
+ %% stack in: "123:1--123:59"
+ %% stack out: ":1--123:59" "123"
+
+ 's :=
+ s skip.nondigits 's :=
+ s skip.digits
+}
+
+FUNCTION { reduce.pages.to.page.count }
+{
+ %% Stack in: arbitrary-and-unused
+ %% Stack out: unchanged
+ %%
+ %% For the new-style pagination with article number and numpages or
+ %% pages, we expect to have BibTeX entries containing something like
+ %% articleno = "17",
+ %% pages = "1--23",
+ %% with output "Article 17, 23 pages",
+ %% or
+ %% articleno = "17",
+ %% numpages = "23",
+ %% with output "Article 17, 23 pages",
+ %% or
+ %% articleno = "17",
+ %% pages = "17:1--17:23",
+ %% with output "Article 17, 23 pages",
+ %%
+ %% If articleno is missing or empty, then we should output "1--23",
+ %% "23" (with a warning of a missing articleno), or "17:1--17:23",
+ %% respectively.
+
+ %% "DEBUG: enter reduce.pages.to.page.count " cite$ * warning$
+
+ %% "DEBUG: pages = [" pages * "]" * warning$
+
+ pages
+ parse.next.number 'p1 :=
+ parse.next.number 'p2 :=
+ parse.next.number 'p3 :=
+ parse.next.number 'page.count :=
+
+ duplicate$
+ empty.or.unknown
+ { }
+ {
+ duplicate$ "unexpected trailing garbage [" swap$ *
+ "] after n:p1--n:p2 in pages = [" *
+ pages *
+ "] in " *
+ cite$ *
+ warning$
+ }
+ if$
+
+ pop$
+
+ %% "DEBUG: reduce.pages.to.page.count: "
+ %% " p1 = " p1 * *
+ %% " p2 = " p2 * *
+ %% " p3 = " p3 * *
+ %% " p4 = " page.count * *
+ %% " in " cite$ * * warning$
+
+ p1 p3 = p2 "1" = and numpages empty.or.unknown and
+ { "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$ }
+ {
+ numpages empty.or.unknown
+ { pages }
+ { numpages }
+ if$
+ 'page.count :=
+ }
+ if$
+
+ p1 "1" = p3 empty.or.unknown and numpages empty.or.unknown and
+ {
+ p2 'page.count :=
+ "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$
+ }
+ {
+ numpages empty.or.unknown
+ { pages }
+ { numpages }
+ if$
+ 'page.count :=
+ }
+ if$
+
+ %% "DEBUG: leave reduce.pages.to.page.count " cite$ * warning$
+}
+
+FUNCTION { new.block.checkb }
+{ % issue a new.block only if at least one of top two stack strings is not empty
+ empty.or.unknown
+ swap$ empty.or.unknown
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION { field.or.null }
+{ % convert empty value to null string, else return value
+ duplicate$ empty.or.unknown
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+
+
+FUNCTION { emphasize }
+{ % emphasize a non-empty top string on the stack
+ duplicate$ empty.or.unknown
+ { pop$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+FUNCTION { comma }
+{ % convert empty string to null string, or brace string and add trailing comma
+ duplicate$ empty.or.unknown
+ { pop$ "" }
+ { "{" swap$ * "}," * }
+ if$
+}
+
+FUNCTION { format.names }
+{
+ % Format bibliographical entries with the first author last name first,
+ % and subsequent authors with initials followed by last name.
+ % All names are formatted in this routine.
+
+ 's :=
+ #1 'nameptr := % nameptr = 1;
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 =
+ %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }
+ %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }
+ {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }
+ {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }
+ if$
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "\bibinfo{person}{others}" =
+ { " {et~al\mbox{.}}" * } % jrh: avoid spacing problems
+ { " {and} " * t * } % from Chicago Manual of Style
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+FUNCTION { my.full.label }
+{
+ 's :=
+ #1 'nameptr := % nameptr = 1;
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ { namesleft #0 > }
+
+ { s nameptr "{vv~}{ll}" format.name$ 't := % get the next name
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { " and " * t * } % from Chicago Manual of Style
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+
+}
+
+FUNCTION { format.names.fml }
+{
+ % Format names in "familiar" format, with first initial followed by
+ % last name. Like format.names, ALL names are formatted.
+ % jtb: The names are NOT put in small caps
+
+ 's :=
+ #1 'nameptr := % nameptr = 1;
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ { namesleft #0 > }
+
+ {
+ "\bibinfo{person}{" s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ * "}" * 't :=
+
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "\bibinfo{person}{others}" =
+ { " {et~al\mbox{.}}" * }
+ { " {and} " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+FUNCTION { format.authors }
+{
+ author empty.or.unknown
+ { "" }
+ {
+ "\bibfield{author}{"
+ author format.names add.period$ * "}" *} % jtb: add period if none before
+ if$
+}
+
+FUNCTION { format.key }
+{
+ empty.or.unknown
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION { format.no.key }
+{
+ empty.or.unknown
+ { "" }
+ { "" }
+ if$
+}
+
+FUNCTION { format.editors.fml }
+{
+ % Format editor names for use in the "in" types: inbook, incollection,
+ % inproceedings: first initial, then last names. When editors are the
+ % LABEL for an entry, then format.editor is used which lists editors
+ % by last name first.
+
+ editor empty.or.unknown
+ { "" }
+ {
+ "\bibfield{editor}{"
+ editor format.names.fml
+ * "}" *
+ editor num.names$ #1 >
+ { " (Eds.)" * }
+ { " (Ed.)" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.editors }
+{ % format editor names for use in labels, last names first.
+ editor empty.or.unknown
+ { "" }
+ {
+ "\bibfield{editor}{"
+ editor format.names
+ * "}" *
+ editor num.names$ #1 >
+ { " (Eds.)." * }
+ { " (Ed.)." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.articletitle }
+{
+ title empty.or.unknown
+ { "" }
+ % Use this to preserve lettercase in titles:
+ { "\showarticletitle{" title * "}" * }
+ % Use this for downcase title style:
+ % { \showarticletitle{" title "t" change.case$ * "}" * }
+ if$
+}
+
+FUNCTION { format.title }
+{
+ title empty.or.unknown
+ { "" }
+ % Use this to preserve lettercase in titles:
+ { "\bibinfo{title}{" title * "}" * }
+ % Use this for downcase title style:
+ % { title "t" change.case$ }
+ if$
+}
+
+FUNCTION { n.dashify }
+{
+ 't :=
+ ""
+ { t empty.or.unknown not }
+ {
+ t #1 #1 substring$ "-" =
+ {
+ t #1 #2 substring$ "--" = not
+ { "--" *
+ t #2 global.max$ substring$ 't :=
+ }
+ {
+ { t #1 #1 substring$ "-" = }
+ {
+ "-" *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+ }
+ if$
+ }
+ {
+ t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+}
+
+FUNCTION { format.a.title.with.edition }
+{
+ "\bibinfo{booktitle}{"
+ swap$ emphasize *
+ edition empty.or.unknown
+ 'skip$
+ { " (\bibinfo{edition}{" * edition "l" change.case$ *
+ "} ed.)" * } % jtb: no parens for ed.
+ if$
+ "}" *
+}
+
+FUNCTION { format.btitle }
+{ title format.a.title.with.edition }
+
+FUNCTION { format.emphasize.booktitle }
+{ booktitle format.a.title.with.edition }
+
+
+
+FUNCTION { format.city }
+{
+ % jtb: if the preceding string (the title of the conference) is non-empty,
+ % jtb: append the location, otherwise leave empty (so as to trigger the
+ % jtb: error message in output.check
+
+ duplicate$ empty.or.unknown
+ { }
+ {
+ city empty.or.unknown location empty.or.unknown and
+ {
+ date empty.or.unknown
+ { }
+ { " (" * date * ")" * }
+ if$
+ }
+ {
+ location empty.or.unknown
+ {
+ date empty.or.unknown
+ { " (" * city * ")" * }
+ { " (" * city * ", " * date * ")" * }
+ if$
+ }
+ {
+ date empty.or.unknown
+ { " (" * location * ")" * }
+ { " (" * location * ", " * date * ")" * }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION { tie.or.space.connect }
+{
+ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+FUNCTION { either.or.check }
+{
+ empty.or.unknown
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+FUNCTION { format.bvolume }
+{
+ % jtb: If there is a series, this is added and the volume trails after it.
+ % jtb: Otherwise, "Vol" is Capitalized.
+
+ volume empty.or.unknown
+ { "" }
+ {
+ series empty.or.unknown
+ { "Vol.~\bibinfo{volume}{" volume "}" * *}
+ { "\bibinfo{series}{" series "}, " * *
+ "Vol.~\bibinfo{volume}{" volume "}" * * *}
+ if$
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION { format.bvolume.noseries }
+{
+ volume empty.or.unknown
+ { "" }
+ { "Vol.~\bibinfo{volume}{" volume "}" * *
+ "volume and number" number either.or.check
+ }
+ if$
+}
+
+FUNCTION { format.series }
+{
+ series empty.or.unknown
+ {""}
+ {" \emph{(\bibinfo{series}{" * series "}" *
+ volume empty.or.unknown
+ {
+ number empty.or.unknown
+ {")}" *}
+ {", \bibinfo{number}{" number "})}" * * *}
+ if$
+ }
+ {", Vol.~\bibinfo{volume}{" volume "})}" * * *
+ "volume and number" number either.or.check
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.number.series }
+{
+ volume empty.or.unknown
+ {
+ number empty.or.unknown
+ {
+ volume empty.or.unknown
+ { "" }
+ {
+ series empty.or.unknown
+ { "" }
+ { " (\bibinfo{series}{" series * "})" * }
+ if$
+ }
+ if$
+ } % { series field.or.null }
+ {
+ output.state mid.sentence =
+ { "Number" } % gnp - changed to mixed case always
+ { "Number" }
+ if$
+ number tie.or.space.connect series empty.or.unknown
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in \bibinfo{series}{" * series * "}" * }
+ if$
+ }
+ if$
+ }
+ {
+ ""
+ }
+ if$
+}
+
+FUNCTION { multi.page.check }
+{
+ 't :=
+ #0 'multiresult :=
+ { multiresult not
+ t empty.or.unknown not
+ and
+ }
+ { t #1 #1 substring$
+ duplicate$ "-" =
+ swap$ duplicate$ "," =
+ swap$ "+" =
+ or or
+ { #1 'multiresult := }
+ { t #2 global.max$ substring$ 't := }
+ if$
+ }
+ while$
+ multiresult
+}
+
+FUNCTION { format.pages }
+{
+ pages empty.or.unknown
+ { "" }
+ { "\bibinfo{pages}{"
+ pages multi.page.check
+ { pages n.dashify } % gnp - removed () % jtb: removed pp.
+ { pages }
+ if$
+ * "}" *
+ }
+ if$
+}
+
+FUNCTION { format.pages.check.without.articleno }
+{ %% format pages field only if articleno is absent
+ %% Stack out: pages-specification
+ numpages missing$ pages missing$ and
+ { "page numbers missing in both pages and numpages fields in " cite$ * warning$ }
+ { }
+ if$
+
+ articleno empty.or.unknown eid empty.or.unknown and
+ {
+ pages missing$
+ {
+ numpages empty.or.unknown
+ {""}
+ { "\bibinfo{numpages}{" numpages * "}~pages" * }
+ if$
+ }
+ { format.pages }
+ if$
+ }
+ { "" }
+ if$
+}
+
+FUNCTION { format.pages.check }
+{
+ pages empty.or.unknown
+ { "page numbers missing in " cite$ * warning$ "" }
+ { pages n.dashify }
+ if$
+}
+
+FUNCTION { format.bookpages }
+{
+ bookpages empty.or.unknown
+ { "" }
+ { bookpages "book pages" tie.or.space.connect }
+ if$
+}
+
+FUNCTION { format.named.pages }
+{
+ pages empty.or.unknown
+ { "" }
+ { format.pages "pages" tie.or.space.connect }
+ if$
+}
+
+%
+% Changed by Boris Veytsman, 2011-03-13
+% Now the word "pages" is printed even if
+% there field pages is not empty.
+%
+
+FUNCTION { format.page.count }
+{
+ page.count empty.or.unknown
+ { "" }
+ { "\bibinfo{numpages}{" page.count * "}~pages" * }
+ if$
+}
+
+FUNCTION { format.articleno.numpages }
+{
+ %% There are seven possible outputs, depending on which fields are set.
+ %%
+ %% These four are handled here:
+ %%
+ %% articleno, numpages, pages -> "Article articleno-value, numpages-value pages"
+ %% articleno, numpages -> "Article articleno-value, numpages-value pages"
+ %% articleno, pages -> "Article articleno-value, reduced-pages-value pages"
+ %% articleno -> "Article articleno-value" and warn about missing numpages
+ %%
+ %% The remaining three have already been handled by
+ %% format.pages.check.without.articleno:
+ %%
+ %% numpages, pages -> "pages-value"
+ %% numpages -> "numpages-value"
+ %% pages -> "pages-value"
+ %%
+ %% We no longer issue warninig when missing articleno, but having numpages
+
+ articleno empty.or.unknown eid empty.or.unknown and
+ {
+%% numpages empty.or.unknown
+%% { }
+%% { "numpages field, but no articleno or eid field, in "
+%% cite$ * warning$ }
+%% if$
+ ""
+ }
+ {
+ numpages empty.or.unknown
+ {
+ pages empty.or.unknown
+ {
+ "articleno or eid, but no pages or numpages field in "
+ cite$ * warning$
+ "" 'page.count :=
+ }
+ { reduce.pages.to.page.count }
+ if$
+ }
+ { numpages 'page.count := }
+ if$
+
+ %% The Article number is now handled in format.day.month.year because
+ %% ACM prefers the style "Digital Libraries 12, 3, Article 5 (July 2008)"
+ %% over "Digital Libraries 12, 3 (July 2008), Article 5"
+ %% format.articleno output
+ format.page.count
+ }
+ if$
+}
+
+FUNCTION {calc.format.page.count}
+{
+ numpages empty.or.unknown
+ {
+ pages empty.or.unknown
+ {
+ "" 'page.count :=
+ }
+ { reduce.pages.to.page.count }
+ if$
+ }
+ { numpages 'page.count := }
+ if$
+ format.page.count
+}
+
+
+FUNCTION { journal.canon.abbrev }
+{
+ % Returns a canonical abbreviation for 'journal', or else 'journal'
+ % unchanged.
+ journal "ACM Computing Surveys" = { "Comput. Surveys" } {
+ journal "{ACM} Computing Surveys" = { "Comput. Surveys" } {
+ journal "ACM Transactions on Mathematical Software" = { "ACM Trans. Math. Software" } {
+ journal "{ACM} Transactions on Mathematical Software" = { "ACM Trans. Math. Software" } {
+ journal "ACM SIGNUM Newsletter" = { "ACM SIGNUM Newslett." } {
+ journal "ACM {SIGNUM} Newsletter" = { "ACM SIGNUM Newslett." } {
+ journal "{ACM} SIGNUM Newsletter" = { "ACM SIGNUM Newslett." } {
+ journal "{ACM} {SIGNUM} Newsletter" = { "ACM SIGNUM Newslett." } {
+ journal "American Journal of Sociology" = { "Amer. J. Sociology" } {
+ journal "American Mathematical Monthly" = { "Amer. Math. Monthly" } {
+ journal "American Mathematical Society Translations" = { "Amer. Math. Soc. Transl." } {
+ journal "Applied Mathematics and Computation" = { "Appl. Math. Comput." } {
+ journal "British Journal of Mathematical and Statistical Psychology" = { "Brit. J. Math. Statist. Psych." } {
+ journal "Bulletin of the American Mathematical Society" = { "Bull. Amer. Math. Soc." } {
+ journal "Canadian Mathematical Bulletin" = { "Canad. Math. Bull." } {
+ journal "Communications of the ACM" = { "Commun. ACM" } {
+ journal "Communications of the {ACM}" = { "Commun. ACM" } {
+ journal "Computers and Structures" = { "Comput. \& Structures" } {
+ journal "Contemporary Mathematics" = { "Contemp. Math." } {
+ journal "Crelle's Journal" = { "Crelle's J." } {
+ journal "Giornale di Mathematiche" = { "Giorn. Mat." } {
+ journal "IEEE Transactions on Aerospace and Electronic Systems" = { "IEEE Trans. Aerospace Electron. Systems" } {
+ journal "{IEEE} Transactions on Aerospace and Electronic Systems" = { "IEEE Trans. Aerospace Electron. Systems" } {
+ journal "IEEE Transactions on Automatic Control" = { "IEEE Trans. Automat. Control" } {
+ journal "{IEEE} Transactions on Automatic Control" = { "IEEE Trans. Automat. Control" } {
+ journal "IEEE Transactions on Computers" = { "IEEE Trans. Comput." } {
+ journal "{IEEE} Transactions on Computers" = { "IEEE Trans. Comput." } {
+ journal "IMA Journal of Numerical Analysis" = { "IMA J. Numer. Anal." } {
+ journal "{IMA} Journal of Numerical Analysis" = { "IMA J. Numer. Anal." } {
+ journal "Information Processing Letters" = { "Inform. Process. Lett." } {
+ journal "International Journal for Numerical Methods in Engineering" = { "Internat. J. Numer. Methods Engrg." } {
+ journal "International Journal of Control" = { "Internat. J. Control" } {
+ journal "International Journal of Supercomputing Applications" = { "Internat. J. Supercomputing Applic." } {
+ journal "Journal of Computational Physics" = { "J. Comput. Phys." } {
+ journal "Journal of Computational and Applied Mathematics" = { "J. Comput. Appl. Math." } {
+ journal "Journal of Computer and System Sciences" = { "J. Comput. System Sci." } {
+ journal "Journal of Mathematical Analysis and Applications" = { "J. Math. Anal. Appl." } {
+ journal "Journal of Mathematical Physics" = { "J. Math. Phys." } {
+ journal "Journal of Parallel and Distributed Computing" = { "J. Parallel and Distrib. Comput." } {
+ journal "Journal of Research of the National Bureau of Standards" = { "J. Res. Nat. Bur. Standards" } {
+ journal "Journal of VLSI and Computer Systems" = { "J. VLSI Comput. Syst." } {
+ journal "Journal of {VLSI} and Computer Systems" = { "J. VLSI Comput. Syst." } {
+ journal "Journal of the ACM" = { "J. ACM" } {
+ journal "Journal of the American Statistical Association" = { "J. Amer. Statist. Assoc." } {
+ journal "Journal of the Institute of Mathematics and its Applications" = { "J. Inst. Math. Appl." } {
+ journal "Journal of the Society for Industrial and Applied Mathematics" = { "J. Soc. Indust. Appl. Math." } {
+ journal "Journal of the Society for Industrial and Applied Mathematics, Series B, Numerical Analysis" = { "J. Soc. Indust. Appl. Math. Ser. B Numer. Anal." } {
+ journal "Linear Algebra and its Applications" = { "Linear Algebra Appl." } {
+ journal "Mathematica Scandinavica" = { "Math. Scand." } {
+ journal "Mathematical Tables and Other Aids to Computation" = { "Math. Tables Aids Comput." } {
+ journal "Mathematics of Computation" = { "Math. Comp." } {
+ journal "Mathematische Annalen" = { "Math. Ann." } {
+ journal "Numerische Mathematik" = { "Numer. Math." } {
+ journal "Pacific Journal of Mathematics" = { "Pacific J. Math." } {
+ journal "Parallel Computing" = { "Parallel Comput." } {
+ journal "Philosophical Magazine" = { "Philos. Mag." } {
+ journal "Proceedings of the American Mathematical Society" = { "Proc. Amer. Math. Soc." } {
+ journal "Proceedings of the IEEE" = { "Proc. IEEE" } {
+ journal "Proceedings of the {IEEE}" = { "Proc. IEEE" } {
+ journal "Proceedings of the National Academy of Sciences of the USA" = { "Proc. Nat. Acad. Sci. U. S. A." } {
+ journal "Quarterly Journal of Mathematics, Oxford, Series (2)" = { "Quart. J. Math. Oxford Ser. (2)" } {
+ journal "Quarterly of Applied Mathematics" = { "Quart. Appl. Math." } {
+ journal "Review of the International Statisical Institute" = { "Rev. Inst. Internat. Statist." } {
+ journal "SIAM Journal on Algebraic and Discrete Methods" = { "SIAM J. Algebraic Discrete Methods" } {
+ journal "{SIAM} Journal on Algebraic and Discrete Methods" = { "SIAM J. Algebraic Discrete Methods" } {
+ journal "SIAM Journal on Applied Mathematics" = { "SIAM J. Appl. Math." } {
+ journal "{SIAM} Journal on Applied Mathematics" = { "SIAM J. Appl. Math." } {
+ journal "SIAM Journal on Computing" = { "SIAM J. Comput." } {
+ journal "{SIAM} Journal on Computing" = { "SIAM J. Comput." } {
+ journal "SIAM Journal on Matrix Analysis and Applications" = { "SIAM J. Matrix Anal. Appl." } {
+ journal "{SIAM} Journal on Matrix Analysis and Applications" = { "SIAM J. Matrix Anal. Appl." } {
+ journal "SIAM Journal on Numerical Analysis" = { "SIAM J. Numer. Anal." } {
+ journal "{SIAM} Journal on Numerical Analysis" = { "SIAM J. Numer. Anal." } {
+ journal "SIAM Journal on Scientific and Statistical Computing" = { "SIAM J. Sci. Statist. Comput." } {
+ journal "{SIAM} Journal on Scientific and Statistical Computing" = { "SIAM J. Sci. Statist. Comput." } {
+ journal "SIAM Review" = { "SIAM Rev." } {
+ journal "{SIAM} Review" = { "SIAM Rev." } {
+ journal "Software Practice and Experience" = { "Software Prac. Experience" } {
+ journal "Statistical Science" = { "Statist. Sci." } {
+ journal "The Computer Journal" = { "Comput. J." } {
+ journal "Transactions of the American Mathematical Society" = { "Trans. Amer. Math. Soc." } {
+ journal "USSR Computational Mathematics and Mathematical Physics" = { "U. S. S. R. Comput. Math. and Math. Phys." } {
+ journal "{USSR} Computational Mathematics and Mathematical Physics" = { "U. S. S. R. Comput. Math. and Math. Phys." } {
+ journal "Zeitschrift fur Angewandte Mathematik und Mechanik" = { "Z. Angew. Math. Mech." } {
+ journal "Zeitschrift fur Angewandte Mathematik und Physik" = { "Z. Angew. Math. Phys." } {
+ journal
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+}
+
+FUNCTION { format.journal.volume.number.day.month.year }
+{
+ % By Young (and Spencer)
+ % GNP - fixed bugs with missing volume, number, and/or pages
+ %
+ % Format journal, volume, number, pages for article types.
+ %
+ journal empty.or.unknown
+ { "no journal in " cite$ * warning$ "" }
+ { "\bibinfo{journal}{"
+ journal.canon.abbrev emphasize *
+ "}" * }
+ if$
+
+ number empty.or.unknown
+ {
+ volume empty.or.unknown
+ { "no number and no volume in " cite$ * warning$ "" * }
+ { " " * " \bibinfo{volume}{" * volume * "}" * }
+ if$
+ }
+ {
+ volume empty.or.unknown
+ {
+ "unusual to have number, but no volume, for " cite$ * warning$
+ " \bibinfo{number}{" * number * "}" *
+ }
+ { " \bibinfo{volume}{" * volume * "}, \bibinfo{number}{" *
+ number * "}" *}
+ if$
+ }
+ if$
+ after.block 'output.state :=
+
+ % Sometimes proceedings are published in journals
+ % In this case we do not want to put year, day and month here
+
+ type$ "inproceedings" =
+ { }
+ {format.day.month.year * }
+ if$
+}
+
+FUNCTION { format.chapter.pages }
+{
+ chapter empty.or.unknown
+ 'format.pages
+ { type empty.or.unknown
+ { "Chapter" } % gnp - changed to mixed case
+ { type "t" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty.or.unknown
+ {"page numbers missing in " cite$ * warning$} % gnp - added check
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.in.emphasize.booktitle }
+{ % jtb: format for collections or proceedings not appearing in a journal
+ booktitle empty.or.unknown
+ { "" }
+ { "In " format.emphasize.booktitle * }
+ if$
+}
+
+FUNCTION { format.in.booktitle }
+{ % jtb: format for proceedings appearing in a journal
+ booktitle empty.or.unknown
+ { "" }
+ { "In \bibinfo{booktitle}{" booktitle * "}" * }
+ if$
+}
+
+FUNCTION { format.in.ed.booktitle }
+{
+ booktitle empty.or.unknown
+ { "" }
+ { editor empty.or.unknown
+ { "In " format.emphasize.booktitle * }
+ % jtb: swapped editor location
+ { "In " format.emphasize.booktitle * ", " * format.editors.fml * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.thesis.type }
+{ % call with default type on stack top
+ type empty.or.unknown
+ 'skip$ % use default type
+ {
+ pop$ % discard default type
+ % NO: it is silly to have to brace protect every degree type!: type "t" change.case$
+ type
+ }
+ if$
+}
+
+FUNCTION { format.tr.number }
+{
+ "\bibinfo{type}{"
+ type empty.or.unknown
+ { "{T}echnical {R}eport" }
+ 'type
+ if$
+ "}" * *
+ number empty.or.unknown
+ { "t" change.case$ }
+ %% LOOKS BAD: { "." * number tie.or.space.connect }
+ %% Prefer "Research report RJ687." to "Research report. RJ687."
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION { format.advisor }
+{
+ advisor empty.or.unknown
+ { "" }
+ { "Advisor(s) " advisor * }
+ if$
+}
+
+FUNCTION { format.article.crossref }
+{ "See"
+ "\citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.crossref.editor }
+{
+ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.book.crossref }
+{
+ volume empty.or.unknown
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
+ " of " *
+ }
+ if$
+ editor empty.or.unknown
+ editor field.or.null author field.or.null =
+ or
+ { key empty.or.unknown
+ { series empty.or.unknown
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { series emphasize * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ " \citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.incoll.inproc.crossref }
+{ "See"
+ " \citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.lab.names }
+{
+ % format.lab.names:
+ %
+ % determines "short" names for the abbreviated author information.
+ % "Long" labels are created in calc.label, using the routine my.full.label
+ % to format author and editor fields.
+ %
+ % There are 4 cases for labels. (n=3 in the example)
+ % a) one author Foo
+ % b) one to n Foo, Bar and Baz
+ % c) use of "and others" Foo, Bar et al.
+ % d) more than n Foo et al.
+
+ 's :=
+ s num.names$ 'numnames :=
+ numnames #2 > % change number to number of others allowed before
+ % forcing "et al".
+ { s #1 "{vv~}{ll}" format.name$ " et~al\mbox{.}" * } % jrh: \mbox{} added
+ {
+ numnames #1 - 'namesleft :=
+ #2 'nameptr :=
+ s #1 "{vv~}{ll}" format.name$
+ { namesleft #0 > }
+ { nameptr numnames =
+ { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { " and " * s nameptr "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ { ", " * s nameptr "{vv~}{ll}" format.name$ * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ }
+ if$
+}
+
+FUNCTION { author.key.label }
+{
+ author empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION { editor.key.organization.label }
+{ % added - gnp. Provide label formatting by organization if editor is null.
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "no key, editor or organization in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION { author.editor.key.label }
+{
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author, or editor in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION { author.editor.key.organization.label }
+{ % added - gnp. Provide label formatting by organization if author is null.
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author, editor or organization in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+% Calculate label and leave it on stack
+FUNCTION { calc.basic.label }
+{
+ type$ "book" =
+ type$ "inbook" =
+ or
+ type$ "article" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ type$ "periodical" =
+ or
+ 'editor.key.organization.label
+ { type$ "manual" =
+ 'author.editor.key.organization.label
+ 'author.key.label
+ if$
+ }
+ if$
+ }
+ if$
+ duplicate$
+ year empty.or.unknown
+ { "{[n.\,d.]}" }
+ { year field.or.null purify$ #-1 #4 substring$}
+ if$
+ *
+ 'basic.label.year :=
+}
+
+FUNCTION { calc.label }
+{
+ % Changed - GNP. See also author.editor.organization.sort, editor.organization.sort
+ % Form label for BibTeX entry. The classification of which fields are used
+ % for which type of entry (book, inbook, etc.) are taken from alpha.bst.
+ % The change here from newapa is to also include organization as a
+ % citation label if author or editor is missing.
+
+ calc.basic.label
+
+ author empty.or.unknown % generate the full label citation information.
+ {
+ editor empty.or.unknown
+ {
+ organization empty.or.unknown
+ {
+ key empty.or.unknown
+ {
+ "no author, editor, organization, or key in " cite$ * warning$
+ "??"
+ }
+ { key }
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor my.full.label }
+ if$
+ }
+ { author my.full.label }
+ if$
+
+ % leave label on the stack, to be popped when required.
+
+ "}{" * swap$ * "}{" *
+ % year field.or.null purify$ #-1 #4 substring$ *
+ %
+ % save the year for sort processing afterwards (adding a, b, c, etc.)
+ %
+ year empty.or.unknown
+ { "{[n.\,d.]}" }
+ { year field.or.null purify$ #-1 #4 substring$}
+ if$
+ 'label.year :=
+}
+
+
+FUNCTION { output.bibitem }
+{
+ newline$
+ "\bibitem[" write$
+ calc.basic.label write$
+ "(" write$
+ sort.year write$
+ ")" write$
+ "]%" writeln
+ " {" write$
+ cite$ write$
+ "}" writeln
+ ""
+ before.all 'output.state :=
+}
+
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint }
+{ % enter and return with stack empty
+ %% We switch now from buffered output to output of complete lines, so
+ %% that the Issue .. URL data have their own lines, and are less likely
+ %% to be line-wrapped by BibTeX's short-sighted algorithm, which wraps
+ %% lines longer than 79 characters, backtracking to what it thinks is
+ %% a break point in the string. Any such wrapping MUST be undone to
+ %% prevent percent-newline from appearing in DOIs and URLs. The
+ %% output data are intentionally wrapped in \showxxx{} macros at
+ %% beginning of line, and that supply their own punctuation (if they
+ %% are not defined to suppress output entirely), to make it easier for
+ %% other software to recover them from .bbl files.
+ %%
+ %% It also makes it possible to later change the macro definitions
+ %% to suppress particular output values, or alter their appearance.
+ %%
+ %% Note that it is possible for theses, technical reports, and
+ %% manuals to have ISBNs, and anything that has an ISBN may also
+ %% have an ISSN. When there are no values for these keys, there
+ %% is no output generated for them here.
+
+ "\newblock" writeln
+ after.block 'output.state :=
+
+ output.issue
+ output.isbn
+ output.coden % CODEN is functionally like ISSN, so output them sequentially
+ output.issn
+ output.lccn
+ output.doi % DOI is ALWAYS last according to CrossRef DOI documentation
+ output.eprint
+ output.url % but ACM wants URL last
+}
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note }
+{ % enter with stack empty, return with empty string on stack
+ output.issue.doi.coden.isxn.lccn.url.eprint
+ note empty.or.unknown
+ { }
+ {
+ "\newblock" writeln
+ output.note
+ }
+ if$
+ ""
+}
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note.check }
+{ % enter with stack empty, return with empty string on stack
+ output.issue.doi.coden.isxn.lccn.url.eprint
+ note empty.or.unknown
+ { }
+ {
+ "\newblock" writeln
+ output.note.check
+ }
+ if$
+ ""
+}
+
+FUNCTION { article }
+{
+ output.bibitem
+
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ { "neither author and editor supplied for " cite$ * warning$ }
+ { format.editors "editor" output.check }
+ if$
+ }
+ { format.authors "author" output.check }
+ if$
+
+ author format.no.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+
+ crossref missing$
+ { format.journal.volume.number.day.month.year output}
+ {
+ "cross reference in @Article{...} is unusual" warning$
+ format.article.crossref output.nonnull
+ }
+ if$
+
+ format.pages.check.without.articleno output
+ format.articleno.numpages output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { book }
+{
+ output.bibitem
+ author empty.or.unknown
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ fin.sentence
+ pages empty.or.unknown
+ { format.bookpages } % use bookpages when pages empty
+ { format.pages.check "pages" tie.or.space.connect }
+ if$
+ output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { booklet }
+{
+ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+ address output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { inbook }
+{
+ output.bibitem
+ author empty.or.unknown
+ { format.editors
+ "author and editor" output.check
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ format.chapter.pages
+ "chapter and pages" output.check % jtb: moved from before publisher
+ }
+ {
+ format.bookpages output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { incollection }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ format.chapter.pages output % gnp - was special.output.nonnull
+ % left out comma before page numbers
+ % jtb: moved from before publisher
+ }
+ {
+ format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { inproceedings }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output.dot.space }
+ if$
+ crossref missing$
+ {
+ journal missing$ % jtb: proceedings appearing in journals
+ { format.in.emphasize.booktitle format.city "booktitle" output.check.dot.space
+ format.series output.removenospace
+ format.editors.fml output % BV 2011/09/27 Moved dot to comma
+ series empty.or.unknown
+ { format.bvolume.noseries output }
+ {}
+ if$
+ new.sentence
+ organization output
+ publisher "publisher" bibinfo.output.check % jtb: require publisher (?)
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ }
+ {
+ format.in.booktitle format.city "booktitle" output.check
+ format.editors.fml output
+ new.sentence
+ format.journal.volume.number.day.month.year output
+ }
+ if$
+ format.articleno output
+ format.pages.check.without.articleno output
+ }
+ {
+ format.incoll.inproc.crossref output.nonnull
+ format.articleno output
+ format.pages.check.without.articleno output
+ }
+ if$
+ format.articleno.numpages output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { conference } { inproceedings }
+
+FUNCTION { manual }
+{
+ output.bibitem
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { organization "organization" output.check
+ organization format.key output } % if all else fails, use key
+ { format.editors "author and editor" output.check }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ % jtb: back to normal style: organization, address
+ organization "organization" output.check
+ address output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { mastersthesis }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title
+ new.block
+ "\bibinfo{thesistype}{Master's\ thesis}" format.thesis.type output
+ new.sentence
+ school "school" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ new.block
+ format.advisor output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { misc }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ title howpublished new.block.checkb
+ format.title output
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+ "" output.nonnull.dot.space
+ calc.format.page.count output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { online } { manual }
+
+FUNCTION { game } { manual }
+
+FUNCTION { artifactsoftware } { manual }
+
+FUNCTION { artifactdataset } { manual }
+
+FUNCTION { software } { manual }
+
+FUNCTION { dataset } { manual }
+
+FUNCTION { phdthesis }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title
+ new.block
+ "\bibinfo{thesistype}{Ph.\,D. Dissertation}" format.thesis.type output
+ new.sentence
+ school "school" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ new.block
+ format.advisor output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION {format.date}
+{ year empty.or.unknown
+ { month empty.or.unknown
+ {
+ "" % output empty date if year/month both empty
+ day empty.or.unknown
+ { }
+ { "there's a day but no month or year in " cite$ * warning$ }
+ if$
+ }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ day empty.or.unknown
+ { }
+ { " " * day * }
+ if$
+ }
+ if$
+ }
+ { month empty.or.unknown
+ {
+ year % output only year if month empty
+ day empty.or.unknown
+ { }
+ { "there's a day and year but no month in " cite$ * warning$ }
+ if$
+ }
+ {
+ month " " *
+ day empty.or.unknown
+ { }
+ { day * ", " * }
+ if$
+ year *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {new.block.checka}
+{
+ empty.or.unknown
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION { periodical }
+{
+ output.bibitem
+ editor empty.or.unknown
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ output.year.check
+ new.sentence
+ format.articletitle "title" output.check
+ format.journal.volume.number.day.month.year output
+ calc.format.page.count output
+ fin.entry
+}
+
+FUNCTION { proceedings }
+{
+ output.bibitem
+ editor empty.or.unknown
+ { organization output
+ organization format.key output } % gnp - changed from author format.key
+ { format.editors output.nonnull }
+ if$
+ % author format.key output % gnp - removed (should be either
+ % editor or organization
+ output.year.check % added (newapa)
+ new.block
+ format.btitle format.city "title" output.check % jtb: added city
+ new.sentence
+ format.bvolume output
+ format.number.series output
+ new.sentence
+ organization output
+ % jtb: normal order: publisher, address
+ publisher empty.or.unknown
+ { }
+ { "\bibinfo{publisher}{" publisher * "}" * output }
+ if$
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { collection } { proceedings }
+
+FUNCTION { techreport }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ new.block
+% format.tr.number output % jtb: moved month ...
+ format.tr.number output new.sentence % Gerry - need dot 2011/09/28
+ institution "institution" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address "}" * * output }
+ if$
+ new.sentence
+ format.named.pages output
+ % ACM omits year at end in transactions style
+ % format.day.month.year output.nonnull.dot.space % jtb: ... to here (no parens)
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { unpublished }
+{
+ output.bibitem
+ format.authors
+ "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title "title" output.check
+ fin.sentence
+ output.day.month.year % UTAH
+ calc.format.page.count output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note.check
+ fin.entry
+}
+
+FUNCTION { default.type } { misc }
+
+%%% ACM journal-style month definitions: full name if 1--5 letters, else
+%%% abbreviation of 3 or 4 characters and a dot
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sept."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+%%% ACM journal names
+
+MACRO {cie} {"ACM Computers in Entertainment"}
+MACRO {csur} {"ACM Computing Surveys"}
+MACRO {dgov} {"Digital Government: Research and Practice"}
+MACRO {dtrap} {"Digital Threats: Research and Practice"}
+MACRO {health} {"ACM Transactions on Computing for Healthcare"}
+MACRO {imwut} {"PACM on Interactive, Mobile, Wearable and Ubiquitous Technologies"}
+MACRO {jacm} {"Journal of the ACM"}
+MACRO {jdiq} {"ACM Journal of Data and Information Quality"}
+MACRO {jea} {"ACM Journal of Experimental Algorithmics"}
+MACRO {jeric} {"ACM Journal of Educational Resources in Computing"}
+MACRO {jetc} {"ACM Journal on Emerging Technologies in Computing Systems"}
+MACRO {jocch} {"ACM Journal on Computing and Cultural Heritage"}
+MACRO {pacmcgit} {"Proceedings of the ACM on Computer Graphics and Interactive Techniques"}
+MACRO {pacmhci} {"PACM on Human-Computer Interaction"}
+MACRO {pacmpl} {"PACM on Programming Languages"}
+MACRO {pomacs} {"PACM on Measurement and Analysis of Computing Systems"}
+MACRO {taas} {"ACM Transactions on Autonomous and Adaptive Systems"}
+MACRO {taccess} {"ACM Transactions on Accessible Computing"}
+MACRO {taco} {"ACM Transactions on Architecture and Code Optimization"}
+MACRO {talg} {"ACM Transactions on Algorithms"}
+MACRO {tallip} {"ACM Transactions on Asian and Low-Resource Language Information Processing"}
+MACRO {tap} {"ACM Transactions on Applied Perception"}
+MACRO {tcps} {"ACM Transactions on Cyber-Physical Systems"}
+MACRO {tds} {"ACM/IMS Transactions on Data Science"}
+MACRO {teac} {"ACM Transactions on Economics and Computation"}
+MACRO {tecs} {"ACM Transactions on Embedded Computing Systems"}
+MACRO {telo} {"ACM Transactions on Evolutionary Learning"}
+MACRO {thri} {"ACM Transactions on Human-Robot Interaction"}
+MACRO {tiis} {"ACM Transactions on Interactive Intelligent Systems"}
+MACRO {tiot} {"ACM Transactions on Internet of Things"}
+MACRO {tissec} {"ACM Transactions on Information and System Security"}
+MACRO {tist} {"ACM Transactions on Intelligent Systems and Technology"}
+MACRO {tkdd} {"ACM Transactions on Knowledge Discovery from Data"}
+MACRO {tmis} {"ACM Transactions on Management Information Systems"}
+MACRO {toce} {"ACM Transactions on Computing Education"}
+MACRO {tochi} {"ACM Transactions on Computer-Human Interaction"}
+MACRO {tocl} {"ACM Transactions on Computational Logic"}
+MACRO {tocs} {"ACM Transactions on Computer Systems"}
+MACRO {toct} {"ACM Transactions on Computation Theory"}
+MACRO {todaes} {"ACM Transactions on Design Automation of Electronic Systems"}
+MACRO {tods} {"ACM Transactions on Database Systems"}
+MACRO {tog} {"ACM Transactions on Graphics"}
+MACRO {tois} {"ACM Transactions on Information Systems"}
+MACRO {toit} {"ACM Transactions on Internet Technology"}
+MACRO {tomacs} {"ACM Transactions on Modeling and Computer Simulation"}
+MACRO {tomm} {"ACM Transactions on Multimedia Computing, Communications and Applications"}
+MACRO {tompecs} {"ACM Transactions on Modeling and Performance Evaluation of Computing Systems"}
+MACRO {toms} {"ACM Transactions on Mathematical Software"}
+MACRO {topc} {"ACM Transactions on Parallel Computing"}
+MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
+MACRO {tops} {"ACM Transactions on Privacy and Security"}
+MACRO {tos} {"ACM Transactions on Storage"}
+MACRO {tosem} {"ACM Transactions on Software Engineering and Methodology"}
+MACRO {tosn} {"ACM Transactions on Sensor Networks"}
+MACRO {tqc} {"ACM Transactions on Quantum Computing"}
+MACRO {trets} {"ACM Transactions on Reconfigurable Technology and Systems"}
+MACRO {tsas} {"ACM Transactions on Spatial Algorithms and Systems"}
+MACRO {tsc} {"ACM Transactions on Social Computing"}
+MACRO {tslp} {"ACM Transactions on Speech and Language Processing"}
+MACRO {tweb} {"ACM Transactions on the Web"}
+
+%%% Some traditional macros
+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 {jcss} {"Journal of Computer and System Sciences"}
+
+MACRO {scp} {"Science of Computer Programming"}
+
+MACRO {sicomp} {"SIAM Journal on Computing"}
+
+MACRO {toois} {"ACM Transactions on Office Information Systems"}
+
+MACRO {tcs} {"Theoretical Computer Science"}
+
+
+
+READ
+
+FUNCTION { sortify }
+{
+ purify$
+ "l" change.case$
+}
+
+FUNCTION { chop.word }
+{
+ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION { sort.format.names }
+{
+ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't :=
+ nameptr numnames = t "others" = and
+ { " et~al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION { sort.format.title }
+{
+ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION { author.sort }
+{
+ author empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need author or key in " cite$ * warning$
+ "" }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { author.editor.sort }
+{
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ {
+ key empty.or.unknown
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { editor.organization.sort }
+{
+ % added - GNP. Stack editor or organization for sorting (from alpha.bst).
+ % Unlike alpha.bst, we need entire names, not abbreviations
+
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need editor, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { organization sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION { author.editor.organization.sort }
+{
+ % added - GNP. Stack author or organization for sorting (from alpha.bst).
+ % Unlike alpha.bst, we need entire names, not abbreviations
+
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { organization sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { presort }
+{
+ % Presort creates the bibentry's label via a call to calc.label, and then
+ % sorts the entries based on entry type. Chicago.bst adds support for
+ % including organizations as the sort key; the following is stolen from
+ % alpha.bst.
+
+ calc.label
+ basic.label.year
+ swap$
+ " "
+ swap$
+ * *
+ " "
+ *
+ sortify
+ year field.or.null purify$ #-1 #4 substring$ * % add year
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ type$ "article" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ type$ "periodical" =
+ or
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.editor.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % added for newapa
+ 'sort.label := % added for newapa
+ sort.label % added for newapa
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+
+
+ITERATE { presort }
+
+SORT % by label, year, author/editor, title
+
+% From plainnat.bst
+STRINGS { longest.label }
+
+INTEGERS { longest.label.width number.label }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'longest.label.width :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+
+
+
+FUNCTION { initialize.extra.label.stuff }
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION { forward.pass }
+{
+ % Pass through all entries, comparing current entry to last one.
+ % Need to concatenate year to the stack (done by calc.label) to determine
+ % if two entries are the same (see presort)
+
+ last.label
+ calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year
+ #1 entry.max$ substring$ = % are they equal?
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year
+ #1 entry.max$ substring$ 'last.label := % assign to last.label
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+
+FUNCTION { reverse.pass }
+{
+ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ label.year extra.label * 'sort.year :=
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+EXECUTE {initialize.longest.label}
+
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION { bib.sort.order }
+{
+ sort.label
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE { bib.sort.order }
+
+SORT % by sort.label, year, title --- giving final bib. order.
+
+FUNCTION { begin.bib }
+{
+ %% Set to #0 show 13-digit ISBN in preference to 10-digit ISBN.
+ %% Set to #1 to show both 10-digit and 13-digit ISBNs.
+ #1 'show-isbn-10-and-13 :=
+
+ "%%% -*-BibTeX-*-" writeln
+ "%%% Do NOT edit. File created by BibTeX with style" writeln
+ "%%% ACM-Reference-Format-Journals [18-Jan-2012]." writeln
+ "" writeln
+
+ preamble$ empty.or.unknown
+ 'skip$
+ { preamble$ writeln }
+ if$
+ "\begin{thebibliography}{" number.label int.to.str$ * "}" * writeln
+ "" writeln
+ "%%% ====================================================================" writeln
+ "%%% NOTE TO THE USER: you can override these defaults by providing" writeln
+ "%%% customized versions of any of these macros before the \bibliography" writeln
+ "%%% command. Each of them MUST provide its own final punctuation," writeln
+ "%%% except for \shownote{}, \showDOI{}, and \showURL{}. The latter two" writeln
+ "%%% do not use final punctuation, in order to avoid confusing it with" writeln
+ "%%% the Web address." writeln
+ "%%%" writeln
+ "%%% To suppress output of a particular field, define its macro to expand" writeln
+ "%%% to an empty string, or better, \unskip, like this:" writeln
+ "%%%" writeln
+ "%%% \newcommand{\showDOI}[1]{\unskip} % LaTeX syntax" writeln
+ "%%%" writeln
+ "%%% \def \showDOI #1{\unskip} % plain TeX syntax" writeln
+ "%%%" writeln
+ "%%% ====================================================================" writeln
+ "" writeln
+
+ %% ACM publications do not use CODEN, ISSN, and LCCN data, so their default
+ %% macro wrappers expand to \unskip, discarding their values and unwanted
+ %% space.
+ %%
+ %% For other publications, prior definitions like these may be useful:
+ %%
+ %% Plain TeX:
+ %% \def \showCODEN #1{CODEN #1.}
+ %% \def \showISSN #1{ISSN #1.}
+ %% \def \showLCCN #1{LCCN #1.}
+ %%
+ %% LaTeX:
+ %% \newcommand{\showCODEN}[1]{CODEN #1.}
+ %% \newcommand{\showISSN}[1]#1{ISSN #1.}
+ %% \newcommand{\showLCCN}[1]{LCCN #1.}
+
+ "\ifx \showCODEN \undefined \def \showCODEN #1{\unskip} \fi" writeln
+ "\ifx \showDOI \undefined \def \showDOI #1{#1}\fi" writeln
+ % ACM styles omit ISBNs, but they can be included by suitable definitions of
+ % \showISBNx and \showISBNxiii before the .bbl file is read
+ "\ifx \showISBNx \undefined \def \showISBNx #1{\unskip} \fi" writeln
+ "\ifx \showISBNxiii \undefined \def \showISBNxiii #1{\unskip} \fi" writeln
+ "\ifx \showISSN \undefined \def \showISSN #1{\unskip} \fi" writeln
+ "\ifx \showLCCN \undefined \def \showLCCN #1{\unskip} \fi" writeln
+ "\ifx \shownote \undefined \def \shownote #1{#1} \fi" writeln % NB: final period supplied by add.period$ above
+ "\ifx \showarticletitle \undefined \def \showarticletitle #1{#1} \fi" writeln
+ "\ifx \showURL \undefined \def \showURL {\relax} \fi" writeln
+ "% The following commands are used for tagged output and should be " writeln
+ "% invisible to TeX" writeln
+ "\providecommand\bibfield[2]{#2}" writeln
+ "\providecommand\bibinfo[2]{#2}" writeln
+ "\providecommand\natexlab[1]{#1}" writeln
+ "\providecommand\showeprint[2][]{arXiv:#2}" writeln
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION { end.bib }
+{
+ newline$
+ "\end{thebibliography}"
+ writeln
+}
+
+EXECUTE {end.bib}
diff --git a/cls/psuthesis.cls b/cls/psuthesis.cls
new file mode 100644
index 0000000..97c81ab
--- /dev/null
+++ b/cls/psuthesis.cls
@@ -0,0 +1,915 @@
+%%% ======================================================================
+%%% @LaTeX-file{
+%%% filename = "psuthesis.cls",
+%%% version = "2.9.2",
+%%% date = "2019/07/10",
+%%% time = "16:00:00 EDT",
+%%% author = "Gary L. Gray",
+%%% copyright = "Gary L. Gray",
+%%% address = "Engineering Science and Mechanics,
+%%% 212 Earth & Engineering Sciences Bldg.,
+%%% Penn State University,
+%%% University Park, PA 16802,
+%%% USA",
+%%% telephone = "814-863-1778",
+%%% email = "gray@psu.edu",
+%%% keywords = "latex, psuthesis, thesis class",
+%%% supported = "yes",
+%%% abstract = "This package provides a style for typesetting
+%%% Penn State theses at the bachelors, masters,
+%%% or Ph.D. level."
+%%% }
+%%% ======================================================================
+% Change History
+% The change history can be found in the accompanying document entitled
+% "psuthesis class change history.md".
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesClass{psuthesis}[2019/07/10 v2.9.2 psuthesis class]
+\RequirePackage{ifthen}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Declare options for different degree types.
+% Allowable degrees are:
+% Ph.D. using class option <phd>
+% M.S. using class option <ms>
+% M.Eng. using class option <meng>
+% M.A. using class option <ma>
+% B.S. using class option <bs>
+% B.A. using class option <ba>
+% Bachelors degree with Schreyer honors using class option <schreyer>
+%
+% The option of an option sets the boolean for that option to
+% true and all others to false.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newboolean{psu@secondthesissupervisor}
+\newboolean{psu@schreyer}
+\newboolean{psu@esc}
+\newboolean{psu@twoha}
+\newboolean{psu@bs}
+\newboolean{psu@ba}
+\newboolean{psu@ms}
+\newboolean{psu@meng}
+\newboolean{psu@ma}
+\newboolean{psu@phd}
+\newboolean{psu@toc}
+
+\setboolean{psu@secondthesissupervisor}{false}
+\setboolean{psu@schreyer}{false}
+\setboolean{psu@esc}{false}
+\setboolean{psu@twoha}{false}
+\setboolean{psu@bs}{false}
+\setboolean{psu@ba}{false}
+\setboolean{psu@ms}{false}
+\setboolean{psu@meng}{false}
+\setboolean{psu@ma}{false}
+\setboolean{psu@phd}{false}
+
+\DeclareOption{bs}{\setboolean{psu@bs}{true}\setboolean{psu@phd}{false}}
+\DeclareOption{ba}{\setboolean{psu@ba}{true}\setboolean{psu@phd}{false}}
+\DeclareOption{ms}{\setboolean{psu@ms}{true}\setboolean{psu@phd}{false}}
+\DeclareOption{meng}{\setboolean{psu@meng}{true}\setboolean{psu@phd}{false}}
+\DeclareOption{ma}{\setboolean{psu@ma}{true}\setboolean{psu@phd}{false}}
+\DeclareOption{phd}{\setboolean{psu@phd}{true}}
+\DeclareOption{inlinechaptertoc}{\setboolean{psu@toc}{true}}
+\DeclareOption{secondthesissupervisor}{\setboolean{psu@secondthesissupervisor}{true}}
+\DeclareOption{schreyer}{\setboolean{psu@schreyer}{true}}%
+\DeclareOption{twoha}{\setboolean{psu@twoha}{true}}%
+\DeclareOption{esc}{\setboolean{psu@esc}{true}}%
+\setboolean{psu@bs}{false}
+\setboolean{psu@ba}{false}
+\setboolean{psu@phd}{false}
+\setboolean{psu@twoha}{false}
+
+\DeclareOption{draft}{\PassOptionsToClass{\CurrentOption}{book}}
+\DeclareOption{10pt}{\PassOptionsToClass{\CurrentOption}{book}}
+\DeclareOption{11pt}{\PassOptionsToClass{\CurrentOption}{book}}
+\DeclareOption{12pt}{\PassOptionsToClass{\CurrentOption}{book}}
+\DeclareOption*{\PackageWarning{psuthesis}{Unknown option `\CurrentOption'. Ignoring}}
+\ExecuteOptions{phd} % the default option is <phd>
+\ProcessOptions
+\LoadClass[openany,oneside]{book}
+\RequirePackage{calc}
+\RequirePackage{setspace}
+% If you are using the subfigure package, load the tocloft package with
+% the subfigure option and comment out the next line.
+%\RequirePackage{tocloft}[2003/09/26]
+\RequirePackage[subfigure]{tocloft}[2003/09/26]
+\RequirePackage{fancyhdr}
+\RequirePackage[overload]{textcase}
+\RequirePackage[letterpaper, left = 1.4in, right = 0.9in, top = 0.9in, bottom = 0.9in, includefoot]{geometry}
+\RequirePackage{twoopt}
+
+%%%%%%%%%%%%%%%%%%%%%%%%
+% Settings for tocloft %
+%%%%%%%%%%%%%%%%%%%%%%%%
+% Format chapter entries so that the chapter name goes on a line
+% following "Chapter #".
+\renewcommand{\@pnumwidth}{1.75em} % remove TOC margin errors
+\renewcommand{\@tocrmarg}{2.75em}
+\newlength{\mylength}% a "scratch" length
+\newlength{\mylonglength}% another "scratch" length
+\ifthenelse{\boolean{psu@toc}}
+{%
+% Format chapter entries so that the chapter name goes on the same line
+% as "Chapter #".
+\renewcommand{\cftchappresnum}{Chapter }
+\settowidth{\mylength}{\bfseries\cftchappresnum\cftchapaftersnum}% extra space
+\addtolength{\cftchapnumwidth}{\mylength} % add the extra space
+%
+\newcommand{\mylongname}{Appendix }% the longest chapter number header
+\settowidth{\mylonglength}{\bfseries\mylongname\cftchapaftersnum}% extra space
+}
+{%
+\renewcommand{\cftchappresnum}{Chapter }
+\renewcommand{\cftchapaftersnumb}{\\ \mbox{}\hspace{-\mylength}\hspace{-0.1em}}
+\settowidth{\mylength}{\bfseries\cftchappresnum\cftchapaftersnum} % extra space
+\addtolength{\cftchapnumwidth}{\mylength+0.1em} % add the extra space\renewcommand{\cftchapfont}{\bfseries}
+}%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Here I define internal "commands" that will be used to store the
+% thesis title, author name, department, etc.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Store the title of the thesis.
+\newcommand{\psu@title}{Theory of Everything}
+\renewcommand{\title}[1]{\renewcommand{\psu@title}{#1}}
+
+% Store the author's name.
+\newcommand{\psu@author}{Richard Feynman}
+\renewcommand{\author}[1]{\renewcommand{\psu@author}{#1}}
+
+% Store the department name.
+\newcommand{\psu@dept}{ESM}
+\providecommand{\dept}[1]{\renewcommand{\psu@dept}{#1}}
+
+% Store the date the degree will be conferred.
+\newcommand{\psu@degreedate}{May 1900}
+\providecommand{\degreedate}[1]{\renewcommand{\psu@degreedate}{#1}}
+
+% Store the year of the copyright.
+\newcommand{\psu@copyrightyear}{1900}
+\providecommand{\copyrightyear}[1]{\renewcommand{\psu@copyrightyear}{#1}}
+
+% Store the document type.
+\newcommand{\psu@documenttype}{Thesis}
+\providecommand{\documenttype}[1]{\renewcommand{\psu@documenttype}{#1}}
+
+% Store the academic unit to which the document has been submitted.
+\newcommand{\psu@submittedto}{The Graduate School}
+\providecommand{\submittedto}[1]{\renewcommand{\psu@submittedto}{#1}}
+
+% Store the College to which the document has been submitted.
+\newcommand{\psu@collegesubmittedto}{College of Engineering}
+\providecommand{\collegesubmittedto}[1]{\renewcommand{\psu@collegesubmittedto}{#1}}
+
+% Store the the info for the honors degree(s) type(s).
+\newcommand{\psu@bachelorsdegreeinfo}{for a baccalaureate degree(s) \\ in Biology and Physics \\ with honors in Computer Engineering}
+\providecommand{\bachelorsdegreeinfo}[1]{\renewcommand{\psu@bachelorsdegreeinfo}{#1}}
+
+% Store the academic unit to which the document has been submitted.
+\newcommand{\psu@escdepthead}{Department Q. Head}
+\providecommand{\escdepthead}[1]{\renewcommand{\psu@escdepthead}{#1}}
+
+% Store the academic unit to which the document has been submitted.
+\newcommand{\psu@escdeptheadtitle}{Department Q. Head}
+\providecommand{\escdeptheadtitle}[1]{\renewcommand{\psu@escdeptheadtitle}{#1}}
+
+% Store the name of the second Thesis Supervisor for a baccalaureate degree.
+\newcommand{\psu@secondthesissupervisor}{Second Q. Jones}
+\providecommand{\secondthesissupervisor}[1]{\renewcommand{\psu@secondthesissupervisor}{#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Store the name of the degree by determining which boolean was
+% set in the class option was specified.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\ifthenelse{\boolean{psu@bs}}%
+{\newcommand{\psu@degreetype}{Baccalaureate of Science}}%
+{}
+
+\ifthenelse{\boolean{psu@ba}}%
+{\newcommand{\psu@degreetype}{Baccalaureate of Arts}}%
+{}
+
+\ifthenelse{\boolean{psu@ms}}%
+{\newcommand{\psu@degreetype}{Master of Science}}%
+{}
+
+\ifthenelse{\boolean{psu@meng}}%
+{\newcommand{\psu@degreetype}{Master of Engineering}}%
+{}
+
+\ifthenelse{\boolean{psu@ma}}%
+{\newcommand{\psu@degreetype}{Master of Arts}}%
+{}
+
+\ifthenelse{\boolean{psu@phd}}%
+{\newcommand{\psu@degreetype}{Doctor of Philosophy}}%
+{}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Store the number of readers in \psu@readers. This quantity is
+% input in the main file using the \numberofreaders command.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\psu@readers}{4}
+\providecommand{\numberofreaders}[1]{\renewcommand{\psu@readers}{#1}}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\psu@honorsadvisor}{Name of Honors Advisor}%
+\newcommand{\psu@honorsadvisortitle}{Associate Professor of Something}%
+\providecommand{\honorsadvisor}[2]%
+{\renewcommand{\psu@honorsadvisor}{#1}%
+\renewcommand{\psu@honorsadvisortitle}{#2}}
+
+\newcommand{\psu@honorsadvisortwo}{Name of Second Honors Advisor}%
+\newcommand{\psu@honorsadvisortwotitle}{Associate Professor of Something}%
+\providecommand{\honorsadvisortwo}[2]%
+{\renewcommand{\psu@honorsadvisortwo}{#1}%
+\renewcommand{\psu@honorsadvisortwotitle}{#2}}
+
+%\newcommand{\psu@advisor}{John Doe}
+%\newcommand{\psu@advisortitle}{John Doe}
+%\newcommand{\psu@advisoroption}{}%
+%\providecommand{\advisor}[3][]%
+%{\renewcommand{\psu@advisoroption}{#1}%
+%\renewcommand{\psu@advisor}{#2}%
+%\renewcommand{\psu@advisortitle}{#3}}
+
+\newcommand{\psu@advisor}{John Doe}
+\newcommand{\psu@advisortitle}{John Doe}
+\newcommand{\psu@advisoroptionone}{}%
+\newcommand{\psu@advisoroptiontwo}{}%
+\providecommandtwoopt{\advisor}[4][][]%
+{\renewcommand{\psu@advisoroptionone}{#1}%
+\renewcommand{\psu@advisoroptiontwo}{#2}%
+\renewcommand{\psu@advisor}{#3}%
+\renewcommand{\psu@advisortitle}{#4}}
+
+\newcommand{\psu@readerone}{John Doe}
+\newcommand{\psu@readeronetitle}{John Doe}
+\newcommand{\psu@readeroneoption}{}%
+\providecommand{\readerone}[3][]%
+{\renewcommand{\psu@readeroneoption}{#1}%
+\renewcommand{\psu@readerone}{#2}%
+\renewcommand{\psu@readeronetitle}{#3}}
+
+\newcommand{\psu@readertwo}{John Doe}
+\newcommand{\psu@readertwotitle}{John Doe}
+\newcommand{\psu@readertwooption}{}%
+\providecommand{\readertwo}[3][]%
+{\renewcommand{\psu@readertwooption}{#1}%
+\renewcommand{\psu@readertwo}{#2}%
+\renewcommand{\psu@readertwotitle}{#3}}
+
+\newcommand{\psu@readerthree}{John Doe}
+\newcommand{\psu@readerthreetitle}{John Doe}
+\newcommand{\psu@readerthreeoption}{}%
+\providecommand{\readerthree}[3][]%
+{\renewcommand{\psu@readerthreeoption}{#1}%
+\renewcommand{\psu@readerthree}{#2}%
+\renewcommand{\psu@readerthreetitle}{#3}}
+
+\newcommand{\psu@readerfour}{John Doe}
+\newcommand{\psu@readerfourtitle}{John Doe}
+\newcommand{\psu@readerfouroption}{}%
+\providecommand{\readerfour}[3][]%
+{\renewcommand{\psu@readerfouroption}{#1}%
+\renewcommand{\psu@readerfour}{#2}%
+\renewcommand{\psu@readerfourtitle}{#3}}
+
+\newcommand{\psu@readerfive}{John Doe}
+\newcommand{\psu@readerfivetitle}{John Doe}
+\newcommand{\psu@readerfiveoption}{}%
+\providecommand{\readerfive}[3][]%
+{\renewcommand{\psu@readerfiveoption}{#1}%
+\renewcommand{\psu@readerfive}{#2}%
+\renewcommand{\psu@readerfivetitle}{#3}}
+
+\newcommand{\psu@readersix}{John Doe}
+\newcommand{\psu@readersixtitle}{John Doe}
+\newcommand{\psu@readersixoption}{}%
+\providecommand{\readersix}[3][]%
+{\renewcommand{\psu@readersixoption}{#1}%
+\renewcommand{\psu@readersix}{#2}%
+\renewcommand{\psu@readersixtitle}{#3}}
+
+
+\newsavebox{\tempbox}
+\renewcommand{\@makecaption}[2]{%
+\vspace{7pt}\sbox{\tempbox}{\small\textbf{#1.} #2}%
+\ifthenelse{\lengthtest{\wd\tempbox > \linewidth}}%
+{\small\textbf{#1.} #2\par}%
+{\centering \small\textbf{#1.} #2}%
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% The actual layout begins here. %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Here is the permission page.
+%\newcommand{\psupermissionpage}{%
+%\thispagestyle{empty}
+%\begin{singlespace}
+%\noindent
+%I grant The Pennsylvania State University the non-exclusive right to use this work for the University's own purposes and to make single copies of the work available to the public on a not-for-profit basis if copies are not otherwise available. \\[0.6in]
+%\mbox{} \hfill
+%\parbox{3in}{\begin{center} \rule{3in}{0.4pt} \\ \psu@author
+%\end{center}}
+%\end{singlespace}
+%\newpage
+%\addtocounter{page}{-1}
+%}
+
+
+% Here is the title page.
+\newcommand{\psutitlepage}{%
+\setcounter{page}{1}
+\thispagestyle{empty}%
+%%%
+\ifthenelse{\boolean{psu@bs} \or \boolean{psu@ba}}
+%%%
+{%
+\vspace*{-1in}
+%\enlargethispage{0.5in}
+\ifthenelse{\boolean{psu@schreyer}}
+{
+\begin{center}
+THE PENNSYLVANIA STATE UNIVERSITY \\ SCHREYER HONORS COLLEGE
+\end{center}
+}
+{
+\begin{center}
+THE PENNSYLVANIA STATE UNIVERSITY
+\end{center}
+}
+\vfill
+\begin{center}
+\MakeUppercase{\psu@dept}
+\end{center}
+\vfill
+\begin{center}
+\MakeUppercase{\psu@title}
+\end{center}
+\vfill
+\begin{center}
+\MakeUppercase{\psu@author} \\ \MakeUppercase{\psu@degreedate}
+\end{center}
+\vfill
+\begin{center}
+A thesis \\ submitted in partial fulfillment \\ of the requirements \\
+\psu@bachelorsdegreeinfo
+\end{center}
+\vfill
+\mbox{}
+\begin{center}
+Reviewed and approved$^{*}$ by the following:\\[4mm]
+\psu@advisor \\
+\psu@advisortitle \\
+Thesis Supervisor \\[4mm]
+\ifthenelse{\boolean{psu@twoha}}
+{
+\psu@honorsadvisor \\
+\psu@honorsadvisortitle\\
+Honors Advisor \\[4mm]
+\psu@honorsadvisortwo \\
+\psu@honorsadvisortwotitle\\
+Honors Advisor
+}
+{
+\psu@honorsadvisor \\
+\psu@honorsadvisortitle\\
+Honors Advisor
+} \\[4mm]
+\ifthenelse{\boolean{psu@esc}}
+{
+\psu@escdepthead \\
+Department Head \\
+\psu@escdeptheadtitle
+\enlargethispage{24pt}
+}
+{}
+\vfill
+\ifthenelse{\boolean{psu@schreyer}}
+{
+$^{*}$Signatures are on file in the Schreyer Honors College and Department of Engineering Science and Mechanics.
+}
+{
+$^{*}$Signatures are on file in the Department of Engineering Science and Mechanics.
+}
+\end{center}
+%
+%
+\newpage
+% Now for the bachelors signature pages.
+\ifthenelse{\boolean{psu@schreyer} \and \boolean{psu@esc}}
+{
+{\thispagestyle{empty}\large\bfseries\noindent
+This page is not included in the thesis. The page following this one is submitted to the Department of Engineering Science and Mechanics.
+}
+\newpage
+\thispagestyle{empty}
+\noindent
+We approve the thesis of \psu@author:\\[10mm]
+\mbox{}\hfill Date of Signature \hspace{5mm}\mbox{}\\[24pt]
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@advisor \\
+\psu@advisortitle \\
+Thesis Supervisor \\[42pt]
+%
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisor \\
+\psu@honorsadvisortitle \\
+Honors Advisor \\[42pt]
+\ifthenelse{\boolean{psu@twoha}}
+{
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisortwo \\
+\psu@honorsadvisortwotitle \\
+Honors Advisor \\[42pt]
+}
+{}
+\ifthenelse{\boolean{psu@esc}}{
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@escdepthead \\
+Department Head \\
+\psu@escdeptheadtitle
+}
+{}
+% Now the page that goes to the Schreyer Honors College.
+\newpage
+{\thispagestyle{empty}\large\bfseries\noindent
+This page is not included in the thesis. The page following this one is submitted to the Schreyer Honors College.
+}
+\newpage
+\thispagestyle{empty}
+\noindent
+We approve the thesis of \psu@author:\\[10mm]
+\mbox{}\hfill Date of Signature \hspace{5mm}\mbox{}\\[24pt]
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@advisor \\
+\psu@advisortitle \\
+Thesis Supervisor \\[42pt]
+%
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisor \\
+\psu@honorsadvisortitle \\
+Honors Advisor \\[42pt]
+\ifthenelse{\boolean{psu@twoha}}
+{
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisortwo \\
+\psu@honorsadvisortwotitle \\
+Honors Advisor \\[42pt]
+}
+{}
+\addtocounter{page}{-5}
+}
+{
+\newpage
+\thispagestyle{empty}
+\noindent
+We approve the thesis of \psu@author:\\[10mm]
+\mbox{}\hfill Date of Signature \hspace{5mm}\mbox{}\\[24pt]
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@advisor \\
+\psu@advisortitle \\
+Thesis Supervisor \\[42pt]
+%
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisor \\
+\psu@honorsadvisortitle \\
+Honors Advisor \\[42pt]
+\ifthenelse{\boolean{psu@twoha}}
+{
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@honorsadvisortwo \\
+\psu@honorsadvisortwotitle \\
+Honors Advisor \\[42pt]
+}
+{}
+\ifthenelse{\boolean{psu@esc}}{
+\rule{3.5in}{0.5pt}\hfill\rule{1.5in}{0.5pt}\\[12pt]
+\psu@escdepthead \\
+Department Head \\
+\psu@escdeptheadtitle
+}
+{}
+\addtocounter{page}{-2}
+}
+%\ifthenelse{\boolean{psu@escdepthead}}{%
+%\begin{tabbing}%
+%Approved: \= \rule{2.75in}{0.5pt} \quad Date: \= \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@advisor \\[-3pt]
+% \> \qquad Thesis Supervisor \\[8mm]
+%%
+%\ifthenelse{\boolean{psu@secondthesissupervisor}}{%
+% \> \rule{2.75in}{0.5pt} \> \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@secondthesissupervisor \\[-3pt]
+% \> \qquad Thesis Supervisor \\[8mm]
+%}{}%
+%%
+% \> \rule{2.75in}{0.5pt} \> \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@honorsadvisor \\[-3pt]
+% \> \qquad Honors Advisor \\[8mm]
+% %
+% \> \rule{2.75in}{0.5pt} \> \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@escdepthead \\[-3pt]
+% \> \qquad Department Head
+%\end{tabbing}%
+%}%
+%{%
+%\begin{tabbing}%
+%Approved: \= \rule{2.75in}{0.5pt} \quad Date: \= \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@advisor \\[-3pt]
+% \> \qquad Thesis Supervisor \\[8mm]
+%%
+%\ifthenelse{\boolean{psu@secondthesissupervisor}}{%
+% \> \rule{2.75in}{0.5pt} \> \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@secondthesissupervisor \\[-3pt]
+% \> \qquad Thesis Supervisor \\[8mm]
+%}{}%
+%%
+% \> \rule{2.75in}{0.5pt} \> \rule{1.5in}{0.5pt} \\[-3pt]
+% \> \qquad \psu@honorsadvisor \\[-3pt]
+% \> \qquad Honors Advisor
+%\end{tabbing}%
+%}%
+}%
+%%%
+{%
+\vspace*{-0.25in}
+\begin{center}
+ The Pennsylvania State University\\
+ \psu@submittedto \\
+ \psu@collegesubmittedto
+\end{center}
+\vfill
+\begin{center}
+ \setstretch{2}
+ \bfseries\uppercase\expandafter{\psu@title}
+\end{center}
+\vfill
+\begin{center}
+ A \psu@documenttype\ in\\
+ \psu@dept\\
+ by\\
+ \psu@author\\
+\end{center}
+\vfill
+\begin{center}
+ \copyright\ \psu@copyrightyear\ \psu@author
+\end{center}
+\vfill
+\begin{center}
+ Submitted in Partial Fulfillment\\
+ of the Requirements\\
+ for the Degree of
+\end{center}
+\vfill
+\begin{center}
+ \psu@degreetype
+\end{center}
+\vfill
+\begin{center}
+ \psu@degreedate
+\end{center}
+%\newpage
+%\ifthenelse{\boolean{psu@ms} \or \boolean{psu@meng} \or \boolean{psu@ma}}{\psupermissionpage}{}
+}
+%%%
+\restoregeometry
+\newpage
+}
+
+
+% Here is the committee page.
+
+\newlength{\psu@sigoptionskip}
+\newlength{\psu@sigafteroptionskip}
+\newlength{\psu@intersigspace}
+
+\newcommand{\psucommitteepage}{%
+ \ifthenelse{\psu@readers = 6}{%
+ \setlength{\psu@sigafteroptionskip}{1.0\baselineskip}
+ \setlength{\psu@intersigspace}{1.0\baselineskip}
+ }%
+ {%
+ \setlength{\psu@sigafteroptionskip}{1.5\baselineskip}
+ \setlength{\psu@intersigspace}{1.5\baselineskip}
+ }
+ \vspace*{-0.2in}
+ \noindent {\normalsize The \MakeTextLowercase{\psu@documenttype} of \psu@author\ was reviewed and approved by the following:}\\[3\baselineskip]
+\mbox{}\hfill
+\parbox{\textwidth - 0.5in}{
+ \psu@advisor\\[\psu@sigoptionskip]
+ \psu@advisortitle
+ \ifthenelse{\equal{\psu@advisoroptionone}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@advisoroptionone \\ \psu@advisoroptiontwo \\[\psu@sigafteroptionskip]}
+\ifcase \psu@readers
+\or
+ \psu@readerone\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readeroneoption}
+\or
+ \psu@readerone\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readeroneoption \\[\psu@sigafteroptionskip]}
+ \psu@readertwo\\[\psu@sigoptionskip]
+ \psu@readertwotitle
+ \ifthenelse{\equal{\psu@readertwooption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readertwooption}
+\or
+ {\psu@readerone}\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readeroneoption \\[\psu@sigafteroptionskip]}
+ {\psu@readertwo}\\[\psu@sigoptionskip]
+ \psu@readertwotitle
+ \ifthenelse{\equal{\psu@readertwooption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readertwooption \\[\psu@sigafteroptionskip]}
+ {\psu@readerthree}\\[\psu@sigoptionskip]
+ \psu@readerthreetitle
+ \ifthenelse{\equal{\psu@readerthreeoption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readerthreeoption}
+\or
+ \psu@readerone\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readeroneoption \\[\psu@sigafteroptionskip]}
+ \psu@readertwo\\[\psu@sigoptionskip]
+ \psu@readertwotitle
+ \ifthenelse{\equal{\psu@readertwooption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readertwooption \\[\psu@sigafteroptionskip]}
+ \psu@readerthree\\[\psu@sigoptionskip]
+ \psu@readerthreetitle
+ \ifthenelse{\equal{\psu@readerthreeoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerthreeoption \\[\psu@sigafteroptionskip]}
+ \psu@readerfour\\[\psu@sigoptionskip]
+ \psu@readerfourtitle
+ \ifthenelse{\equal{\psu@readerfouroption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readerfouroption}
+\or
+ \psu@readerone\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readeroneoption \\[\psu@sigafteroptionskip]}
+ \psu@readertwo\\[\psu@sigoptionskip]
+ \psu@readertwotitle
+ \ifthenelse{\equal{\psu@readertwooption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readertwooption \\[\psu@sigafteroptionskip]}
+ \psu@readerthree\\[\psu@sigoptionskip]
+ \psu@readerthreetitle
+ \ifthenelse{\equal{\psu@readerthreeoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerthreeoption \\[\psu@sigafteroptionskip]}
+ \psu@readerfour\\[\psu@sigoptionskip]
+ \psu@readerfourtitle
+ \ifthenelse{\equal{\psu@readerfouroption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerfouroption \\[\psu@sigafteroptionskip]}
+ \psu@readerfive\\[\psu@sigoptionskip]
+ \psu@readerfivetitle
+ \ifthenelse{\equal{\psu@readerfiveoption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readerfiveoption}
+\or
+ \psu@readerone\\[\psu@sigoptionskip]
+ \psu@readeronetitle
+ \ifthenelse{\equal{\psu@readeroneoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readeroneoption \\[\psu@sigafteroptionskip]}
+ \psu@readertwo\\[\psu@sigoptionskip]
+ \psu@readertwotitle
+ \ifthenelse{\equal{\psu@readertwooption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readertwooption \\[\psu@sigafteroptionskip]}
+ \psu@readerthree\\[\psu@sigoptionskip]
+ \psu@readerthreetitle
+ \ifthenelse{\equal{\psu@readerthreeoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerthreeoption \\[\psu@sigafteroptionskip]}
+ \psu@readerfour\\[\psu@sigoptionskip]
+ \psu@readerfourtitle
+ \ifthenelse{\equal{\psu@readerfouroption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerfouroption \\[\psu@sigafteroptionskip]}
+ \psu@readerfive\\[\psu@sigoptionskip]
+ \psu@readerfivetitle
+ \ifthenelse{\equal{\psu@readerfiveoption}{}}%
+ {\\[\psu@intersigspace]}%
+ {\\[\psu@sigoptionskip]
+ \psu@readerfiveoption \\[\psu@sigafteroptionskip]}
+ \psu@readersix\\[\psu@sigoptionskip]
+ \psu@readersixtitle
+ \ifthenelse{\equal{\psu@readersixoption}{}}%
+ {}%
+ {\\[\psu@sigoptionskip] \psu@readersixoption}
+\fi
+}
+
+\mbox{}\vfill
+
+\noindent
+% \parbox{\textwidth}{$^{*}$Signatures are on file in the Graduate School.}
+
+\newpage
+}
+
+
+%\newcommand{\psusigpage}{%\setlength{\textheight}{8.0in}
+%{\Huge\thispagestyle{empty}
+%\sffamily\bfseries
+%\mbox{}\vfill
+%\noindent
+%The following page is the Signature Page. The Signature Page needs to be given to the Grad School, but it should not be bound with the thesis.
+%\begin{center}
+%\tiny Don't bind this page either!
+%\end{center}
+%\vfill
+%}
+%\newpage
+%\psu@signaturepage}
+
+
+\newcommand{\thesisabstract}[1]{%
+%\pagestyle{plain}
+\chapter*{Abstract}
+ \begin{singlespace}
+ \input{#1}
+ \end{singlespace}
+\newpage
+}
+
+
+\renewcommand{\contentsname}{Table of Contents}
+\setcounter{secnumdepth}{10}
+\setcounter{tocdepth}{4}
+\newcommand{\thesistableofcontents}{%
+\begin{singlespace}
+\if@twocolumn
+\@restonecoltrue\onecolumn
+\else
+\@restonecolfalse
+\fi
+\chapter*{\contentsname
+\@mkboth{%
+\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
+\@starttoc{toc}%
+\if@restonecol\twocolumn\fi%
+\end{singlespace}
+\clearpage
+}
+
+%\renewcommand{\listfigurename}{List of Figures}
+%\newcommand{\thesislistoffigures}{%
+%\begin{singlespace}
+%\if@twocolumn
+%\@restonecoltrue\onecolumn
+%\else
+%\@restonecolfalse
+%\fi
+%%\chapter{\listfigurename
+%%\@mkboth{%
+%%\MakeUppercase\listfigurename}{\MakeUppercase\listfigurename}}%
+%\chapter{\listfigurename}
+%\@starttoc{lof}%
+%\if@restonecol\twocolumn\fi
+%\end{singlespace}
+%\clearpage
+%}
+
+\renewcommand{\listtablename}{List of Tables}
+\newcommand{\thesislistoftables}{%
+\begin{singlespace}
+\if@twocolumn
+\@restonecoltrue\onecolumn
+\else
+\@restonecolfalse
+\fi
+\chapter{\listtablename
+\@mkboth{%
+\MakeUppercase\listtablename}{\MakeUppercase\listtablename}}%
+\@starttoc{lot}%
+\if@restonecol\twocolumn\fi
+\end{singlespace}
+\clearpage
+}
+
+
+\newcommand{\thesislistofsymbols}[1]{%
+\chapter{List of Symbols}
+%\addcontentsline{toc}{chapter}{List of Symbols}
+\begin{singlespace}
+ \input{#1}
+\end{singlespace}
+}
+
+
+\newcommand{\thesisacknowledgments}[1]{%
+\chapter{Acknowledgments}
+%\addcontentsline{toc}{chapter}{Acknowledgments}
+\begin{singlespace}
+ \input{#1}
+\end{singlespace}
+}
+
+
+\newcommand{\thesisdedication}[2]{%
+\chapter*{#2}
+\begin{singlespace}
+ \input{#1}
+\end{singlespace}
+}
+
+
+\newcommand{\Appendix}{\@dblarg\my@Appendix}
+\def\my@Appendix[#1]#2{%
+\ifthenelse{\value{chapter} = 0}
+{
+\ifthenelse{\boolean{psu@toc}}
+{%
+\addtocontents{toc}{\protect\addtolength{\cftchapnumwidth}{-\mylength}}
+\addtocontents{toc}{\string\renewcommand{\string\cftchappresnum}{Appendix }}
+\addtocontents{toc}{\protect\addtolength{\cftchapnumwidth}{\mylonglength}}
+}%
+{%
+\addtocontents{toc}{\string\renewcommand{\string\cftchappresnum}{Appendix }}
+}}{}%
+\chapter[#1]{#2}
+}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DeclareRobustCommand{\thesismainmatter}{%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%\setlength{\textheight}{8.5in}
+\mainmatter
+%\pagestyle{empty}
+%\renewcommand{\@oddhead}{\mbox{}\hfill\arabic{page}}
+%\let\ps@plain = \ps@empty
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand{\vita}[1]{%
+\begin{singlespace}
+\thispagestyle{empty}
+\begin{center}
+ \textbf{{\large Vita} \\[0.1in] \psu@author}
+\end{center}
+\input{#1}
+\end{singlespace}
+}
+
+
+%%
+%% End of file `psuthesis.cls'.
diff --git a/cls/userlib.tex b/cls/userlib.tex
new file mode 100644
index 0000000..c64d25a
--- /dev/null
+++ b/cls/userlib.tex
@@ -0,0 +1,22 @@
+\newcommand{\nop}[1]{}
+\newtheorem{definition}{Definition}
+\newtheorem{theorem}{Theorem}
+\newtheorem{observation}{Observation}
+\newtheorem{lemma}{Lemma}
+\newtheorem{remark}{Remark}[section]
+\newtheorem{corollary}{Corollary}[section]
+\newtheorem{example}{Example}
+\newtheorem{claim}{Claim}
+
+\DeclareMathOperator{\op}{op}
+\DeclareMathOperator{\args}{arg}
+\DeclareMathOperator{\cost}{cost}
+\DeclareMathOperator{\lleft}{left}
+\DeclareMathOperator{\rright}{right}
+\DeclareMathOperator{\argmax}{argmax}
+\DeclareMathOperator{\argmin}{argmin}
+
+\newcommand{\Paragraph}[1]{~\vspace*{-0.8\baselineskip}\\{\bf #1}}
+\newcommand\mathbftt[1]{\textnormal{\ttfamily\bfseries #1}}
+
+\newcommand\note[1]{\marginpar{\color{red}\tiny #1}}