From ad6deb73668c3dc4cd82aa73f121f17ac55a248e Mon Sep 17 00:00:00 2001
From: Matthew Flatt <mflatt@racket-lang.org>
Date: Tue, 26 Sep 2017 07:45:10 -0600
Subject: [PATCH] upgrade acmart.cls

---
 scribble-lib/scribble/acmart/acmart.cls | 350 +++++++++++++++---------
 1 file changed, 216 insertions(+), 134 deletions(-)

diff --git a/scribble-lib/scribble/acmart/acmart.cls b/scribble-lib/scribble/acmart/acmart.cls
index 6cb51f04..987e3c41 100644
--- a/scribble-lib/scribble/acmart/acmart.cls
+++ b/scribble-lib/scribble/acmart/acmart.cls
@@ -37,7 +37,7 @@
 %%   Right brace   \}     Tilde         \~}
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesClass{acmart}
-[2017/07/09 v1.43 Typesetting articles for Association of
+[2017/09/16 v1.48 Typesetting articles for the Association for
 Computing Machinery]
 \def\@classname{acmart}
 \InputIfFileExists{acmart-preload-hook.tex}{%
@@ -68,15 +68,24 @@ Computing Machinery]
     \PackageInfo{\@classname}{Using screen mode}%
   \else
     \PackageInfo{\@classname}{Not using screen mode}%
-  \fi}{\PackageError{\@classname}{Option screen can be either true or
+  \fi}{\PackageError{\@classname}{The option screen can be either true or
     false}}
 \ExecuteOptionsX{screen=false}
+\define@boolkey+{acmart.cls}[@ACM@]{acmthm}[true]{%
+  \if@ACM@acmthm
+    \PackageInfo{\@classname}{Requiring acmthm}%
+  \else
+    \PackageInfo{\@classname}{Suppressing acmthm}%
+  \fi}{\PackageError{\@classname}{The option acmthm can be either true or
+    false}}
+\ExecuteOptionsX{acmthm=true}
 \define@boolkey+{acmart.cls}[@ACM@]{review}[true]{%
   \if@ACM@review
     \PackageInfo{\@classname}{Using review mode}%
+    \AtBeginDocument{\@ACM@printfoliostrue}%
   \else
     \PackageInfo{\@classname}{Not using review mode}%
-  \fi}{\PackageError{\@classname}{Option review can be either true or
+  \fi}{\PackageError{\@classname}{The option review can be either true or
     false}}
 \ExecuteOptionsX{review=false}
 \define@boolkey+{acmart.cls}[@ACM@]{authorversion}[true]{%
@@ -84,7 +93,7 @@ Computing Machinery]
     \PackageInfo{\@classname}{Using authorversion mode}%
   \else
     \PackageInfo{\@classname}{Not using authorversion mode}%
-  \fi}{\PackageError{\@classname}{Option authorversion can be either true or
+  \fi}{\PackageError{\@classname}{The option authorversion can be either true or
     false}}
 \ExecuteOptionsX{authorversion=false}
 \define@boolkey+{acmart.cls}[@ACM@]{natbib}[true]{%
@@ -92,7 +101,7 @@ Computing Machinery]
     \PackageInfo{\@classname}{Explicitly selecting natbib mode}%
   \else
     \PackageInfo{\@classname}{Explicitly deselecting natbib mode}%
-  \fi}{\PackageError{\@classname}{Option natbib can be either true or
+  \fi}{\PackageError{\@classname}{The option natbib can be either true or
     false}}
 \ExecuteOptionsX{natbib=true}
 \define@boolkey+{acmart.cls}[@ACM@]{anonymous}[true]{%
@@ -100,7 +109,7 @@ Computing Machinery]
     \PackageInfo{\@classname}{Using anonymous mode}%
   \else
     \PackageInfo{\@classname}{Not using anonymous mode}%
-  \fi}{\PackageError{\@classname}{Option anonymous can be either true or
+  \fi}{\PackageError{\@classname}{The option anonymous can be either true or
     false}}
 \ExecuteOptionsX{anonymous=false}
 \define@boolkey+{acmart.cls}[@ACM@]{timestamp}[true]{%
@@ -108,7 +117,7 @@ Computing Machinery]
     \PackageInfo{\@classname}{Using timestamp mode}%
   \else
     \PackageInfo{\@classname}{Not using timestamp mode}%
-  \fi}{\PackageError{\@classname}{Option timestamp can be either true or
+  \fi}{\PackageError{\@classname}{The option timestamp can be either true or
     false}}
 \ExecuteOptionsX{timestamp=false}
 \define@boolkey+{acmart.cls}[@ACM@]{authordraft}[true]{%
@@ -118,7 +127,7 @@ Computing Machinery]
     \@ACM@reviewtrue
   \else
     \PackageInfo{\@classname}{Not using authordraft mode}%
-  \fi}{\PackageError{\@classname}{Option authordraft can be either true or
+  \fi}{\PackageError{\@classname}{The option authordraft can be either true or
     false}}
 \ExecuteOptionsX{authordraft=false}
 \def\ACM@fontsize{}
@@ -134,7 +143,7 @@ Computing Machinery]
 \newif\if@ACM@journal
 \newif\if@ACM@sigchiamode
 \ifnum\ACM@format@nr=5\relax % siggraph
-  \ClassWarning{\@classname}{The format `siggraph' is now obsolete.
+  \ClassWarning{\@classname}{The format siggraph is now obsolete.
     I am switching to sigconf.}
   \setkeys{acmart.cls}{format=sigconf}
 \fi
@@ -190,6 +199,24 @@ Computing Machinery]
 \ClassInfo{\@classname}{Using fontsize \ACM@fontsize}
 \LoadClass[\ACM@fontsize, reqno]{amsart}
 \RequirePackage{microtype}
+\ifcase\ACM@format@nr
+ \relax % manuscript
+ \or % acmsmall
+ \or % acmlarge
+ \or % acmtog
+   \RequirePackage{flushend}
+ \or % sigconf
+   \RequirePackage{flushend}
+ \or % siggraph
+   \RequirePackage{flushend}
+ \or % sigplan
+   \RequirePackage{flushend}
+ \or % sigchi
+   \RequirePackage{flushend}
+ \or % sigchi-a
+\fi
+\RequirePackage{etoolbox}
+\RequirePackage{refcount}
 \RequirePackage{totpages}
 \RequirePackage{environ}
 \if@ACM@manuscript
@@ -422,16 +449,16 @@ Computing Machinery]
 \or % sigchi-a
   \urlstyle{sf}
 \fi
-\if@ACM@screen
-  \hypersetup{colorlinks,
-    linkcolor=ACMRed,
-    citecolor=ACMPurple,
-    urlcolor=ACMDarkBlue,
-    filecolor=ACMDarkBlue}
-\else
-  \hypersetup{hidelinks}
-\fi
-\RequirePackage{cleveref}
+\AtEndPreamble{%
+  \if@ACM@screen
+    \hypersetup{colorlinks,
+      linkcolor=ACMRed,
+      citecolor=ACMPurple,
+      urlcolor=ACMDarkBlue,
+      filecolor=ACMDarkBlue}
+    \else
+    \hypersetup{hidelinks}
+  \fi}
 \if@ACM@natbib
   \let\citeN\cite
   \let\cite\citep
@@ -558,6 +585,8 @@ Computing Machinery]
   \hrule \@width \columnwidth \kern 2.6\p@}
 \RequirePackage{manyfoot}
 \SelectFootnoteRule[2]{copyrightpermission}
+\DeclareNewFootnote{authorsaddresses}
+\SelectFootnoteRule[2]{copyrightpermission}
 \DeclareNewFootnote{copyrightpermission}
 \def\footnoterule{\kern-3\p@
   \hrule \@width 4pc \kern 2.6\p@}
@@ -569,7 +598,7 @@ Computing Machinery]
       \normalcolor
       \unvbox\@mpfootins
     \fi
-    \@minipagefalse   %% added 24 May 89
+    \@minipagefalse
   \color@endgroup
   \egroup
   \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}}
@@ -617,12 +646,13 @@ Computing Machinery]
 \newif\if@ACM@newfonts
 \@ACM@newfontstrue
 \IfFileExists{libertine.sty}{}{\ClassWarning{\@classname}{You do not
-    have libertine package installed.  Please upgrade your
+    have the libertine package installed.  Please upgrade your
     TeX}\@ACM@newfontsfalse}
 \IfFileExists{zi4.sty}{}{\ClassWarning{\@classname}{You do not
-    have zi4 package installed.  Please upgrade your TeX}\@ACM@newfontsfalse}
+    have the zi4 package installed.  Please upgrade your
+    TeX}\@ACM@newfontsfalse}
 \IfFileExists{newtxmath.sty}{}{\ClassWarning{\@classname}{You do not
-    have newtxmath package installed.  Please upgrade your
+    have the newtxmath package installed.  Please upgrade your
     TeX}\@ACM@newfontsfalse}
 \if@ACM@newfonts
 \RequirePackage[tt=false, type1=true]{libertine}
@@ -630,6 +660,9 @@ Computing Machinery]
 \RequirePackage[libertine]{newtxmath}
 \RequirePackage[T1]{fontenc}
 \fi
+\let\liningnums\@undefined
+\AtEndPreamble{%
+  \DeclareTextFontCommand{\liningnums}{\libertineLF}}
 \if@ACM@sigchiamode
   \renewcommand{\familydefault}{\sfdefault}
 \fi
@@ -637,7 +670,7 @@ Computing Machinery]
 \captionsetup[table]{position=top}
 \if@ACM@journal
   \captionsetup{labelfont={sf, small},
-    textfont={sf, small},  margin=\z@}
+    textfont={sf, small}, margin=\z@}
   \captionsetup[figure]{name={Fig.}}
 \else
   \captionsetup{labelfont={bf},
@@ -779,6 +812,7 @@ Computing Machinery]
   TCPS,%
   TEAC,%
   TECS,%
+  THRI,%
   TIIS,%
   TISSEC,%
   TIST,%
@@ -824,6 +858,8 @@ Computing Machinery]
     Wearable and Ubiquitous Technologies}%
   \def\@journalNameShort{Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.}%
   \def\@permissionCodeOne{2474-9567}%
+  \@ACM@screentrue
+  \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
 \or % JACM
   \def\@journalName{Journal of the ACM}%
   \def\@journalNameShort{J. ACM}%
@@ -846,19 +882,25 @@ Computing Machinery]
   \def\@permissionCodeOne{1550-4832}%
 \or % JOCCH
   \def\@journalName{ACM Journal on Computing and Cultural Heritage}%
-  \def\@journalName{ACM J. Comput. Cult. Herit.}%
+  \def\@journalNameShort{ACM J. Comput. Cult. Herit.}%
 \or % PACMHCI
   \def\@journalName{Proceedings of the ACM on Human-Computer Interaction}%
-  \def\@journalName{Proc. ACM Hum.-Comput. Interact.}%
+  \def\@journalNameShort{Proc. ACM Hum.-Comput. Interact.}%
   \def\@permissionCodeOne{2573-0142}%
+  \@ACM@screentrue
+  \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
 \or % PACMPL
   \def\@journalName{Proceedings of the ACM on Programming Languages}%
-  \def\@journalName{Proc. ACM Program. Lang.}%
+  \def\@journalNameShort{Proc. ACM Program. Lang.}%
   \def\@permissionCodeOne{2475-1421}%
+  \@ACM@screentrue
+  \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
 \or % POMACS
   \def\@journalName{Proceedings of the ACM on Measurement and Analysis of Computing Systems}%
-  \def\@journalName{Proc. ACM Meas. Anal. Comput. Syst.}%
+  \def\@journalNameShort{Proc. ACM Meas. Anal. Comput. Syst.}%
   \def\@permissionCodeOne{2476-1249}%
+  \@ACM@screentrue
+  \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
 \or % TAAS
   \def\@journalName{ACM Transactions on Autonomous and Adaptive Systems}%
   \def\@journalNameShort{ACM Trans. Autonom. Adapt. Syst.}%
@@ -869,6 +911,7 @@ Computing Machinery]
   \def\@permissionCodeOne{1936-7228}%
 \or % TACO
   \def\@journalName{ACM Transactions on Architecture and Code Optimization}%
+  \def\@journalNameShort{ACM Trans. Arch. Code Optim.}%
 \or % TALG
   \def\@journalName{ACM Transactions on Algorithms}%
   \def\@journalNameShort{ACM Trans. Algor.}%
@@ -887,6 +930,10 @@ Computing Machinery]
   \def\@journalName{ACM Transactions on Embedded Computing Systems}%
   \def\@journalNameShort{ACM Trans. Embedd. Comput. Syst.}%
   \def\@permissionCodeOne{1539-9087}%
+\or % THRI
+  \def\@journalName{ACM Transactions on Human-Robot Interaction}%
+  \def\@journalNameShort{ACM Trans. Hum.-Robot Interact.}%
+  \def\@permissionCodeOne{2573-9522}%
 \or % TIIS
   \def\@journalName{ACM Transactions on Interactive Intelligent Systems}%
   \def\@journalNameShort{ACM Trans. Interact. Intell. Syst.}%
@@ -940,7 +987,6 @@ Computing Machinery]
   \def\@journalNameShort{ACM Trans. Graph.}%
   \def\@permissionCodeOne{0730-0301}
 \or % TOIS
-  \def\@journalName{ACM Transactions on Information Systems}%
   \def\@journalName{ACM Transactions on Information Systems}%
   \def\@permissionCodeOne{1046-8188}%
 \or % TOIT
@@ -948,7 +994,6 @@ Computing Machinery]
   \def\@journalNameShort{ACM Trans. Internet Technol.}%
   \def\@permissionCodeOne{1533-5399}%
 \or % TOMACS
-  \def\@journalName{ACM Transactions on Modeling and Computer Simulation}%
   \def\@journalName{ACM Transactions on Modeling and Computer Simulation}%
   \def\@journalNameShort{ACM Trans. Model. Comput. Simul.}%
 \or % TOMM
@@ -1029,13 +1074,28 @@ Computing Machinery]
   \fi}
 \acmConference[Conference'17]{ACM Conference}{July 2017}{Washington,
   DC, USA}
+\def\acmBooktitle#1{\gdef\@acmBooktitle{#1}}
+\acmBooktitle{Proceedings of \acmConference@name
+       \ifx\acmConference@name\acmConference@shortname\else
+         \ (\acmConference@shortname)\fi}
+\def\@editorsAbbrev{(Ed.)}
+\def\@acmEditors{}
+\def\editor#1{\ifx\@acmEditors\@empty
+    \gdef\@acmEditors{#1}%
+  \else
+    \gdef\@editorsAbbrev{(Eds.)}%
+    \g@addto@macro\@acmEditors{\and#1}%
+\fi}
 \def\subtitle#1{\def\@subtitle{#1}}
 \subtitle{}
 \newcount\num@authorgroups
 \num@authorgroups=0\relax
+\newcount\num@authors
+\num@authors=0\relax
 \newif\if@insideauthorgroup
 \@insideauthorgroupfalse
 \renewcommand\author[2][]{%
+  \global\advance\num@authors by 1\relax
   \if@insideauthorgroup\else
     \global\advance\num@authorgroups by 1\relax
     \global\@insideauthorgrouptrue
@@ -1080,7 +1140,7 @@ Computing Machinery]
     \g@addto@macro\addresses{\affiliation{#1}{#2}}%
   \fi}
 \define@boolkey+{@ACM@affiliation@}[@ACM@affiliation@]{obeypunctuation}%
-[true]{}{\ClassError{\@classname}{obeypunctuation must be true or false}}
+[true]{}{\ClassError{\@classname}{The option obeypunctuation can be either true or false}}
 \def\additionalaffiliation#1{\authornote{\@additionalaffiliation{#1}}}
 \def\@additionalaffiliation#1{\bgroup
   \def\position##1{\ignorespaces}%
@@ -1098,6 +1158,8 @@ Computing Machinery]
     \g@addto@macro\addresses{\email{#1}{#2}}%
   \fi}
 \def\orcid#1{\unskip\ignorespaces}
+\def\authorsaddresses#1{\def\@authorsaddresses{#1}}
+\authorsaddresses{\@mkauthorsaddresses}
 \def\@titlenotes{}
 \def\titlenote#1{%
   \g@addto@macro\@title{\footnotemark}%
@@ -1135,7 +1197,7 @@ Computing Machinery]
 \def\acmNumber#1{\def\@acmNumber{#1}}
 \acmNumber{1}
 \def\acmArticle#1{\def\@acmArticle{#1}}
-\acmArticle{1}
+\acmArticle{}
 \def\acmArticleSeq#1{\def\@acmArticleSeq{#1}}
 \acmArticleSeq{\@acmArticle}
 \def\acmYear#1{\def\@acmYear{#1}}
@@ -1186,22 +1248,22 @@ Computing Machinery]
     \ClassInfo{\@classname}{Printing CCS}%
   \else
     \ClassInfo{\@classname}{Suppressing CCS}%
-  \fi}{\ClassError{\@classname}{printccs must be true or false}}
+  \fi}{\ClassError{\@classname}{The option printccs can be either true or false}}
 \define@boolkey+{@ACM@topmatter@}[@ACM@]{printacmref}[true]{%
   \if@ACM@printacmref
     \ClassInfo{\@classname}{Printing bibformat}%
   \else
     \ClassInfo{\@classname}{Suppressing bibformat}%
-  \fi}{\ClassError{\@classname}{printacmref must be true or false}}
+  \fi}{\ClassError{\@classname}{The option printacmref can be either true or false}}
 \define@boolkey+{@ACM@topmatter@}[@ACM@]{printfolios}[true]{%
   \if@ACM@printfolios
     \ClassInfo{\@classname}{Printing folios}%
   \else
     \ClassInfo{\@classname}{Suppressing folios}%
-  \fi}{\ClassError{\@classname}{printfolios must be true or false}}
+  \fi}{\ClassError{\@classname}{The option printfolios can be either true or false}}
 \define@cmdkey{@ACM@topmatter@}[@ACM@]{authorsperrow}[0]{%
   \IfInteger{#1}{\ClassInfo{\@classname}{Setting authorsperrow to
-      #1}}{\ClassWarning{\@classname}{Parameter authorsperrow must be
+      #1}}{\ClassWarning{\@classname}{The parameter authorsperrow must be
       numerical. Ignoring the input #1}\gdef\@ACM@authorsperrow{0}}}
 \def\settopmatter#1{\setkeys{@ACM@topmatter@}{#1}}
 \settopmatter{printccs=true, printacmref=true}
@@ -1269,8 +1331,7 @@ Computing Machinery]
 \define@choicekey*{ACM@}{acmcopyrightmode}[%
   \acm@copyrightinput\acm@copyrightmode]{none,%
     acmcopyright,acmlicensed,rightsretained,%
-    usgov,usgovmixed,cagov,cagovmixed,%
-    licensedusgovmixed,%
+    usgov,usgovmixed,cagov,cagovmixed,licensedusgovmixed,%
     licensedcagov,licensedcagovmixed,othergov,licensedothergov}{%
   \@printpermissiontrue
   \@printcopyrighttrue
@@ -1481,7 +1542,7 @@ Computing Machinery]
   \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
   \global\@topnum\z@ % this prevents floats from falling
                      % at the top of page 1
-  \global\@botnum\z@ % we do not want them to be on bottom either
+  \global\@botnum\z@ % we do not want them to be on the bottom either
   \hsize=\textwidth
   \def\@makefnmark{\hbox{\@textsuperscript{\@thefnmark}}}%
   \@mktitle\if@ACM@sigchiamode\else\@mkauthors\fi\@mkteasers
@@ -1492,12 +1553,21 @@ Computing Machinery]
   \@titlenotes
   \@subtitlenotes
   \@authornotes
-  \let\@makefnmark\relax  \let\@thefnmark\relax
+  \let\@makefnmark\relax
+  \let\@thefnmark\relax
   \let\@makefntext\noindent
   \ifx\@empty\thankses\else
-    \footnotetextcopyrightpermission{%
+    \footnotetextauthorsaddresses{%
       \def\par{\let\par\@par}\parindent\z@\@setthanks}%
   \fi
+  \ifx\@empty\@authorsaddresses\else
+     \if@ACM@anonymous\else
+       \if@ACM@journal
+         \footnotetextauthorsaddresses{%
+           \def\par{\let\par\@par}\parindent\z@\@setauthorsaddresses}%
+       \fi
+     \fi
+  \fi
   \footnotetextcopyrightpermission{%
     \if@ACM@authordraft
         \raisebox{-2ex}[\z@][\z@]{\makebox[0pt][l]{\large\bfseries
@@ -1529,7 +1599,7 @@ Computing Machinery]
           \if@ACM@journal
             \emph{\@journalName}%
           \else
-            \emph{Proceedings of \acmConference@name, \acmConference@date}%
+            \emph{\@acmBooktitle}%
           \fi
           \ifx\@acmDOI\@empty
           .
@@ -1542,9 +1612,9 @@ Computing Machinery]
             \ifx\@acmPrice\@empty\else\ \$\@acmPrice\fi\\
             \@formatdoi{\@acmDOI}%
           \else % Conference
-             ACM~ISBN~\@acmISBN
-             \ifx\@acmPrice\@empty.\else\dots\$\@acmPrice\fi\\
-             \@formatdoi{\@acmDOI}%
+            \ifx\@acmISBN\@empty\else ACM~ISBN~\@acmISBN
+            \ifx\@acmPrice\@empty.\else\dots\$\@acmPrice\fi\\\fi
+            \ifx\@acmDOI\@empty\else\@formatdoi{\@acmDOI}\fi%
           \fi
         \fi
       \fi}
@@ -1612,13 +1682,10 @@ Computing Machinery]
   \ifcase\ACM@format@nr
   \relax % manuscript
     \box\mktitle@bx\par
-    \noindent\hrulefill\par
   \or % acmsmall
     \box\mktitle@bx\par
-    \noindent\hrulefill\par
   \or % acmlarge
     \box\mktitle@bx\par
-    \noindent\hrulefill\par
   \or % acmtog
     \twocolumn[\box\mktitle@bx]%
   \or % sigconf
@@ -1670,11 +1737,11 @@ Computing Machinery]
 \def\@titlefont{%
   \ifcase\ACM@format@nr
   \relax % manuscript
-    \LARGE\bfseries\sffamily
+    \LARGE\sffamily\bfseries
   \or % acmsmall
-    \LARGE\bfseries\sffamily
+    \LARGE\sffamily\bfseries
   \or % acmlarge
-    \LARGE\bfseries\sffamily
+    \LARGE\sffamily\bfseries
   \or % acmtog
     \Huge\sffamily
   \or % sigconf
@@ -1785,10 +1852,10 @@ Computing Machinery]
 \def\postcode#1{\unskip\ignorespaces}
 \if@ACM@journal
   \def\position#1{\unskip\ignorespaces}
-  \def\institution#1{#1\ignorespaces}
+  \def\institution#1{\unskip~#1\ignorespaces}
   \def\city#1{\unskip\ignorespaces}
   \def\state#1{\unskip\ignorespaces}
-  \newcommand\department[2][0]{}
+  \newcommand\department[2][0]{\unskip\ignorespaces}
   \def\country#1{\if@ACM@affiliation@obeypunctuation\else, \fi#1\ignorespaces}
 \else
   \def\position#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
@@ -1989,6 +2056,26 @@ Computing Machinery]
     \par\raggedright\leftskip=\z@
     \lineskip=1pc\noindent
     \addresses\let\and\@typeset@author@bx\and\par\bigskip\egroup}
+\def\@mkauthorsaddresses{%
+  \ifnum\num@authors>1\relax
+  Authors' \else Author's \fi
+  \ifnum\num@authorgroups>1\relax
+  addresses: \else address: \fi
+  \bgroup
+  \def\streetaddress##1{\unskip\@addpunct, ##1}%
+  \def\postcode##1{\unskip\@addpunct, ##1}%
+  \def\position##1{\unskip\ignorespaces}%
+  \def\institution##1{\unskip\@addpunct, ##1}%
+  \def\city##1{\unskip\@addpunct, ##1}%
+  \def\state##1{\unskip\@addpunct, ##1}%
+  \renewcommand\department[2][0]{\unskip\@addpunct, ##2}%
+  \def\country##1{\unskip\@addpunct, ##1}%
+  \def\and{\unskip\@addpunct; }%
+  \def\@author##1{##1}%
+  \def\email##1##2{\unskip\@addpunct, \nolinkurl{##2}}%
+  \addresses
+  \egroup}
+\def\@setaddresses{}
 \def\@authornotemark{\g@addto@macro\@currentauthors{\footnotemark\relax}}
 \def\@@authornotemark#1{\g@addto@macro\@currentauthors{\footnotemark[#1]}}
 \def\@mkteasers{%
@@ -1998,60 +2085,45 @@ Computing Machinery]
     \global\setbox\mktitle@bx=\vbox{\noindent\box\mktitle@bx\par
     \noindent\@teaserfigures\par\medskip}%
   \fi}
-\def\@setaddresses{}
 \def\@mkabstract{\bgroup
   \ifx\@abstract\@lempty\else
   {\phantomsection\addcontentsline{toc}{section}{Abstract}%
     \if@ACM@journal
-       \small\noindent
+       \everypar{\setbox\z@\lastbox\everypar{}}\small
     \else
       \section*{Abstract}%
     \fi
    \ignorespaces\@abstract\par}%
   \fi\egroup}
 \def\@mkbibcitation{\bgroup
+  \def\@pages@word{\ifnum\getrefnumber{TotPages}=1\relax page\else pages\fi}%
   \def\footnotemark{}%
   \def\\{\unskip{} \ignorespaces}%
   \def\footnote{\ClassError{\@classname}{Please do note use footnotes
-      inside \string\title{} or \string\author{} command! Use
+      inside a \string\title{} or \string\author{} command! Use
       \string\titlenote{} or \string\authornote{} instead!}}%
+  \def\@article@string{\ifx\@acmArticle\@empty{\ }\else,
+    Article~\@acmArticle\ \fi}%
   \par\medskip\small\noindent{\bfseries ACM Reference Format:}\par\nobreak
-  \noindent\authors. \@acmYear. \@title.
+  \noindent\authors. \@acmYear. \@title
+  \ifx\@subtitle\@empty. \else: \@subtitle. \fi
   \if@ACM@journal
      \textit{\@journalNameShort}
-     \@acmVolume, \@acmNumber, Article~\@acmArticle\ (\@acmPubDate),
-     \ref{TotPages}~pages.
+     \@acmVolume, \@acmNumber \@article@string (\@acmPubDate),
+     \ref{TotPages}~\@pages@word.
   \else
-     In \textit{Proceedings of \acmConference@name, \acmConference@venue,
-       \acmConference@date
-       \ifx\acmConference@name\acmConference@shortname\else
-         \ (\acmConference@shortname)\fi
-         ,} \ref{TotPages}~pages.
-  \fi\par
-  \noindent\@formatdoi{\@acmDOI}
-\par\egroup}
-\def\@printendtopmatter{\par\medskip
-  \ifcase\ACM@format@nr
-  \relax % manuscript
-    \noindent\hrulefill\par\medskip
-  \or % acmsmall
-    \noindent\hrulefill\par\medskip
-  \or % acmlarge
-    \noindent\hrulefill\par\medskip
-  \or % acmtog
-    \par\bigskip
-  \or % sigconf
-    \par\bigskip
-  \or % siggraph
-    \par\bigskip
-  \or % sigplan
-    \par\bigskip
-  \or % sigchi
-    \par\bigskip
-  \or % sigchi-a
+     In \textit{\@acmBooktitle}%
+     \ifx\@acmEditors\@empty\textit{.}\else
+       \andify\@acmEditors\textit{, }\@acmEditors~\@editorsAbbrev.%
+     \fi\
+     ACM, New York, NY, USA%
+       \@article@string\unskip, \ref{TotPages}~\@pages@word.
   \fi
-}
+  \@formatdoi{\@acmDOI}
+\par\egroup}
+\def\@printendtopmatter{\par\bigskip}
 \def\@setthanks{\long\def\thanks##1{\par##1\@addpunct.}\thankses}
+\def\@setauthorsaddresses{\@authorsaddresses\unskip\@addpunct.}
 \RequirePackage{fancyhdr}
 \if@ACM@review
   \newsavebox{\ACM@linecount@bx}
@@ -2060,11 +2132,13 @@ Computing Machinery]
   \ACM@linecount\@ne\relax
   \def\ACM@mk@linecount{%
     \savebox{\ACM@linecount@bx}[4em][t]{\parbox[t]{4em}{%
-        \setlength{\ACM@linecount@bxht}{-\baselineskip}%
+        \setlength{\ACM@linecount@bxht}{0pt}%
         \loop{\color{red}\scriptsize\the\ACM@linecount}\\
         \global\advance\ACM@linecount by \@ne
         \addtolength{\ACM@linecount@bxht}{\baselineskip}%
-        \ifdim\ACM@linecount@bxht<\textheight\repeat}}}
+        \ifdim\ACM@linecount@bxht<\textheight\repeat
+        {\color{red}\scriptsize\the\ACM@linecount}\hfill
+        \global\advance\ACM@linecount by \@ne}}}
 \fi
 \def\ACM@linecountL{%
   \if@ACM@review
@@ -2081,7 +2155,7 @@ Computing Machinery]
   \end{picture}%
   \fi}
 \if@ACM@timestamp
-  % Subtracting 30 from \time gives us the effect of rounding-down despite
+  % Subtracting 30 from \time gives us the effect of rounding down despite
   % \numexpr rounding to nearest
   \newcounter{ACM@time@hours}
   \setcounter{ACM@time@hours}{\numexpr (\time - 30) / 60 \relax}
@@ -2089,36 +2163,16 @@ Computing Machinery]
   \setcounter{ACM@time@minutes}{\numexpr \time - \theACM@time@hours * 60 \relax}
   \newcommand\ACM@timestamp{%
     \footnotesize%
-    \the\year-\two@digits{\the\month}-\two@digits{\the\day}{ }%
-    \two@digits{\theACM@time@hours}:\two@digits{\theACM@time@minutes}{ }%
-    page~\thepage\ (pp. \@startPage-\pageref*{TotPages})%
     \ifx\@acmSubmissionID\@empty\relax\else
-    ~Submission~ID: \@acmSubmissionID
+    Submission ID: \@acmSubmissionID.{ }%
     \fi
+    \the\year-\two@digits{\the\month}-\two@digits{\the\day}{ }%
+    \two@digits{\theACM@time@hours}:\two@digits{\theACM@time@minutes}{. }%
+    Page \thepage\ of \@startPage--\pageref*{TotPages}.%
   }
 \fi
 \def\@shortauthors{\if@ACM@anonymous Anon.\else\shortauthors\fi}
-\def\@headfootfont{%
-  \ifcase\ACM@format@nr
-  \relax % manuscript
-    \sffamily
-  \or % acmsmall
-    \sffamily
-  \or % acmlarge
-    \sffamily
-  \or % acmtog
-    \sffamily
-  \or % sigconf
-    \sffamily
-  \or % siggraph
-    \sffamily
-  \or % sigplan
-    \sffamily
-  \or % sigchi
-    \sffamily
-  \or % sigchi-a
-    \sffamily
-  \fi}
+\def\@headfootfont{\sffamily}
 \fancypagestyle{standardpagestyle}{%
   \fancyhf{}%
   \renewcommand{\headrulewidth}{\z@}%
@@ -2191,7 +2245,8 @@ Computing Machinery]
   \@folio@voffset=.55in\relax
   \def\@folio@max{10}
 \fi
-\def\@folioblob{\@tempcnta=\@acmArticleSeq\relax
+\def\@folioblob{\@tempcnta=0\@acmArticleSeq\relax
+  \ifnum\@tempcnta=0\relax\else
   \loop
      \ifnum\@tempcnta>\@folio@max\relax
       \advance\@tempcnta by - \@folio@max
@@ -2207,8 +2262,8 @@ Computing Machinery]
             \rule{\@folio@wd}{\@folio@ht}}}%
         \parbox{\@folio@wd}{%
           \centering
-          \textcolor{white}{\LARGE\bfseries\sffamily\@acmArticle}}}}
-  \end{picture}}
+          \textcolor{white}{\LARGE\sffamily\bfseries\@acmArticle}}}}
+  \end{picture}\fi}
 
 \fancypagestyle{firstpagestyle}{%
   \fancyhf{}%
@@ -2255,6 +2310,14 @@ Computing Machinery]
     \fi
   \fi
 }
+\let\ACM@ps@plain\ps@plain
+\let\ACM@ps@myheadings\ps@myheadings
+\let\ACM@ps@headings\ps@headings
+\def\ACM@restore@pagestyle{%
+  \let\ps@plain\ACM@ps@plain
+  \let\ps@myheadings\ACM@ps@myheadings
+  \let\ps@headings\ACM@ps@headings}
+\AtBeginDocument{\ACM@restore@pagestyle}
 \renewcommand\section{\@startsection{section}{1}{\z@}%
   {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
   {.25\baselineskip}%
@@ -2297,8 +2360,8 @@ Computing Machinery]
  \def\@secfont{\bfseries\Large\section@raggedright\MakeTextUppercase}
  \def\@subsecfont{\bfseries\Large\section@raggedright}
 \or % siggraph
- \def\@secfont{\bfseries\sffamily\Large\section@raggedright\MakeTextUppercase}
- \def\@subsecfont{\bfseries\sffamily\Large\section@raggedright}
+ \def\@secfont{\sffamily\bfseries\Large\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\Large\section@raggedright}
 \or % sigplan
  \def\@secfont{\bfseries\Large\section@raggedright}
  \def\@subsecfont{\bfseries\section@raggedright}
@@ -2319,12 +2382,12 @@ Computing Machinery]
  \def\@subparfont{\itshape}
 \or % sigchi
  \setcounter{secnumdepth}{1}
- \def\@secfont{\bfseries\sffamily\section@raggedright\MakeTextUppercase}
- \def\@subsecfont{\bfseries\sffamily\section@raggedright}
+ \def\@secfont{\sffamily\bfseries\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\section@raggedright}
 \or % sigchi-a
  \setcounter{secnumdepth}{0}
- \def\@secfont{\bfseries\sffamily\section@raggedright\MakeTextUppercase}
- \def\@subsecfont{\bfseries\sffamily\section@raggedright}
+ \def\@secfont{\sffamily\bfseries\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\section@raggedright}
 \fi
 \def\@adddotafter#1{#1\@addpunct{.}}
 \def\@addspaceafter#1{#1\@addpunct{\enspace}}
@@ -2390,15 +2453,33 @@ Computing Machinery]
   {.5em}% spacing after head
   {\thmname{#1}\thmnumber{ #2}\thmnote{ {\@acmdefinitionnotefont(#3)}}}% head spec
 \theoremstyle{acmplain}
-\newtheorem{theorem}{Theorem}[section]
-\newtheorem{conjecture}[theorem]{Conjecture}
-\newtheorem{proposition}[theorem]{Proposition}
-\newtheorem{lemma}[theorem]{Lemma}
-\newtheorem{corollary}[theorem]{Corollary}
-\theoremstyle{acmdefinition}
-\newtheorem{example}[theorem]{Example}
-\newtheorem{definition}[theorem]{Definition}
-\theoremstyle{acmplain}
+\AtEndPreamble{%
+  \if@ACM@acmthm
+  \theoremstyle{acmplain}
+  \@ifundefined{theorem}{%
+  \newtheorem{theorem}{Theorem}[section]
+  }{}
+  \@ifundefined{conjecture}{%
+  \newtheorem{conjecture}[theorem]{Conjecture}
+  }{}
+  \@ifundefined{proposition}{%
+  \newtheorem{proposition}[theorem]{Proposition}
+  }{}
+  \newtheorem{lemma}[theorem]{Lemma}
+  \@ifundefined{lemma}{}{}
+  \@ifundefined{corollary}{%
+  \newtheorem{corollary}[theorem]{Corollary}
+  }{}
+  \theoremstyle{acmdefinition}
+  \@ifundefined{example}{%
+  \newtheorem{example}[theorem]{Example}
+  }{}
+  \@ifundefined{definition}{%
+  \newtheorem{definition}[theorem]{Definition}
+  }{}
+  \fi
+  \theoremstyle{acmplain}
+}
 \def\@proofnamefont{\scshape}
 \def\@proofindent{\indent}
 \ifcase\ACM@format@nr
@@ -2433,6 +2514,7 @@ Computing Machinery]
 \def\grantsponsor#1#2#3{#2}
 \newcommand\grantnum[3][]{#3%
   \def\@tempa{#1}\ifx\@tempa\@empty\else\space(\url{#1})\fi}
+\AtEndPreamble{%
 \if@ACM@screen
   \includecomment{screenonly}
   \excludecomment{printonly}
@@ -2445,7 +2527,7 @@ Computing Machinery]
   \excludecomment{acks}
 \else
   \includecomment{anonsuppress}
-\fi
+\fi}
 \newcommand\showeprint[2][arxiv]{%
   \def\@tempa{#1}%
   \ifx\@tempa\@empty\def\@tempa{arxiv}\fi