commit 049bf4b07a6289b339dc358b8411f886e3d2f884
parent 60b0cd100cf2fb364ff5926215aa7dc2d7879b5e
Author: David Van Horn <dvanhorn@cs.umd.edu>
Date: Fri, 10 Mar 2017 18:24:27 -0500
Scribble support for new acmart.cls. (#85)
Scribble support for new acmart.cls.
Diffstat:
12 files changed, 2872 insertions(+), 2 deletions(-)
diff --git a/scribble-doc/scribblings/scribble/acmart.scrbl b/scribble-doc/scribblings/scribble/acmart.scrbl
@@ -0,0 +1,251 @@
+#lang scribble/manual
+@(require (except-in "utils.rkt" title author)
+ (for-label scribble/acmart))
+
+@(define acmart-url
+ "http://mirrors.concertpass.com/tex-archive/macros/latex/contrib/acmart/acmart.pdf")
+
+@title{ACM Paper Format}
+
+@defmodulelang[scribble/acmart]{The @racketmodname[scribble/acmart]
+language is like @racketmodname[scribble/base], but configured with
+LaTeX style defaults to use the @hyperlink[acmart-url]{@tt{acmart}}
+class for typesetting publications for the Association of Computing
+Machinery.}
+
+@deftogether[(
+@defidform[manuscript]
+@defidform[acmsmall]
+@defidform[acmlarge]
+@defidform[acmtog]
+@defidform[sigconf]
+@defidform[siggraph]
+@defidform[sigplan]
+@defidform[sigchi]
+@defidform[sigchi-a]
+)]{
+
+Enables the given document format. Use the format only on the same
+line as @hash-lang[], with only whitespace (or other options) between
+@racketmodname[scribble/acmart] and the format name:
+
+@verbatim[#:indent 2]|{
+ #lang scribble/acmart @acmsmall
+}|
+
+The @racket[manuscript], @racket[acmsmall], @racket[acmlarge],
+@racket[acmtog], @racket[sigconf], @racket[siggraph],
+@racket[sigplan], @racket[sigchi], and @racket[sigchi-a] formats are
+all mutually exclusive.}
+
+@deftogether[(
+@defidform[review]
+@defidform[screen]
+@defidform[natbib]
+@defidform[anonymous]
+@defidform[authorversion]
+)]{
+
+Enables the given document format option. Use the option only on the
+same line as @hash-lang[], with only whitespace (or other options)
+between @racketmodname[scribble/acmart] and the format option. Any
+number of options may be used:
+
+@verbatim[#:indent 2]|{
+ #lang scribble/acmart @acmsmall @review @anonymous @natbib
+}|
+
+}
+
+@defproc[(maketitle) block?]{
+
+Issues the @tt{maketitle} command. This @emph{must} be included in
+the document and should occur after the title, authors, and several
+other top-matter commands. (See the
+@hyperlink[acmart-url]{@tt{acmart}} documentation.)
+
+@codeblock|{
+ #lang scribble/acmart
+ @title{Example}
+ @maketitle{}
+}|}
+
+@defproc[(abstract [pre-content pre-content?] ...) block?]{
+
+Generates a @tech{nested flow} for a paper abstract.}
+
+@defform[(include-abstract module-path)]{
+
+Similar to @racket[include-section], but incorporates the document in the
+specified module as an abstract. The document must have no title or
+sub-parts.}
+
+@defproc[(title [#:short short-title pre-content? #f] [title pre-content?]) content?]{
+
+Specifies the title of the document, optionally with a short version of the title for running heads.}
+
+@defproc[(subtitle [pre-content pre-content?] ...) content?]{
+
+Specifies a subtitle.}
+
+@defproc[(author [pre-content pre-conent?] ...) content?]{
+
+Specifies an author.}
+
+@defproc[(email [pre-content pre-conent?] ...) content?]{
+
+Specifies an author's email address.}
+
+@deftogether[(
+@defproc[(acmJournal [journal pre-content?] ...) content?]
+@defproc[(acmConference [name pre-content?] [date pre-content?] [venue pre-content?]) content?]
+@defproc[(acmVolume [content pre-content?] ...) content?]
+@defproc[(acmNumber [content pre-content?] ...) content?]
+@defproc[(acmArticle [content pre-content?] ...) content?]
+@defproc[(acmYear [content pre-content?] ...) content?]
+@defproc[(acmMonth [content pre-content?] ...) content?]
+@defproc[(acmArticleSeq [content pre-content?] ...) content?]
+@defproc[(acmPrice [content pre-content?] ...) content?]
+@defproc[(acmISBN [content pre-content?] ...) content?]
+@defproc[(acmDOI [content pre-content?] ...) content?]
+)]{
+
+Declares information that is collected into the front-matter region of the paper.}
+
+@deftogether[(
+@defproc[(acmBadgeL [#:url url string? #f] [graphics string?]) content?]
+@defproc[(acmBadgeR [#:url url string? #f] [graphics string?]) content?]
+)]{
+
+Display a special badge, such as an artifact evaluation badge, on the
+left or right of the first page. If @racket[url] is provided, the
+screen version of the image links to the badge authority.
+
+}
+
+@defproc[(affiliation [content pre-content?] ...) content?]{
+
+Declares information about the affiliation of an author.}
+
+@deftogether[(
+@defproc[(position [content pre-content?] ...) content?]
+@defproc[(institution [content pre-content?] ...) content?]
+@defproc[(department [content pre-content?] ...) content?]
+@defproc[(streetaddress [content pre-content?] ...) content?]
+@defproc[(city [content pre-content?] ...) content?]
+@defproc[(state [content pre-content?] ...) content?]
+@defproc[(postcode [content pre-content?] ...) content?]
+@defproc[(country [content pre-content?] ...) content?]
+)]{
+
+Declares information that is collected for each author. These commands should
+ only be used within an @racket[affiliation] command.}
+
+@codeblock|{
+ #lang scribble/acmart
+ @title{Some Title}
+ @author{David Van Horn}
+ @email|{dvanhorn@cs.umd.edu}|
+ @affiliation{
+ @department{Department of Computer Science and UMIACS}
+ @institution{University of Maryland}
+ @city{College Park}
+ @state{Maryland}}
+
+ @abstract{This is an abstract.}
+ @maketitle{}
+}|
+
+
+@deftogether[(
+@defproc[(terms [content pre-content?] ...) content?]
+@defproc[(keywords [content pre-content?] ...) content?]
+)]{
+
+Typesets term and keyword information for the paper, which
+is normally placed immediately after an @racket[abstract] form.
+See also @url["http://www.acm.org/about/class/how-to-use"].
+
+For @racket[terms], each general term should be in titlecase. Terms
+are usually drawn from a fixed list, and they are usually optional.
+
+For @racket[keywords], capitalize only the first letter of the first
+word, separate phrases by commas, and do not include ``and'' before
+the last one. Keywords should be noun phrases, not adjectives.}
+
+@defproc[(startPage [content pre-content?] ...) content?]{
+Sets the start page for the paper.}
+
+@defproc[(ccsdesc [#:number number? #f] [content pre-content?] ...) content?]{
+
+Declares CCS description with optional numeric code.}
+
+@defproc[(received [#:stage stage string? #f] [date string?]) content?]{
+
+Sets the history of the publication. If @racket[stage] is omitted, it
+defaults to @racket{Received} for the first occurrence and
+@racket{revised} in subsequent uses.
+
+@codeblock[#:keep-lang-line? #f]|{
+ #lang scribble/acmart
+ @received{February 2007}
+ @received[#:stage "revised"]{March 2009}
+ @received[#:stage "accepted"]{June 2009}
+}|}
+
+@defproc[(citestyle [content pre-content?]) content?]{
+
+Sets the citation style for the paper.}
+
+@defproc[(setcitestyle [content pre-content?] ...) content?]{
+
+Sets customization options for the citation style for the paper.}
+
+@defproc[(teaserfigure [content pre-content?] ...) block?]{
+
+Creates a teaser figure to appear before main text.}
+
+@deftogether[(
+@defproc[(sidebar [content pre-content?] ...) block?]
+@defproc[(marginfigure [content pre-content?] ...) block?]
+@defproc[(margintable [content pre-content?] ...) block?]
+)]{
+
+In the @racket[sigchi-a] format, special sidebars,
+ tables and figures on the margin.}
+
+@deftogether[(
+@defproc[(printonly [content pre-content?] ...) block?]
+@defproc[(screenonly [content pre-content?] ...) block?]
+@defproc[(anonsuppress [content pre-content?] ...) block?]
+)]{
+Marks content to be included only for print or screen
+editions, or excluded from anonymous editions.}
+
+@defproc[(acks [content pre-content?] ...) block?]{
+
+Creates an unnumbered section ``Acknowledgments'' section, unless the
+@racket[anonymous] mode is selected.}
+
+@deftogether[(
+@defproc[(grantsponsor [sponsorID string?] [name string?] [url string?]) content?]
+@defproc[(grantnum [#:url url string? #f] [sponsorID string?] [num string?]) content?]
+)]{
+
+All financial support @emph{must} be listed using the
+@racket[grantsponsor] and @racket[grantnum] commands inside of
+@racket[acks].
+
+Here @racket[sponsorID] is the unique ID used to match grants to
+sponsors, @racket[name] is the name of the sponsor. The
+@racket[sponsorID] of a @racket[grantnum] must match some
+@racket[sponsorID] of a @racket[grantsponsor] command.
+
+@codeblock[#:keep-lang-line? #f]|{
+ #lang scribble/acmart
+ @acks{
+ The author thanks Benjamin Greenman for helpful comments on this
+ code. Financial support provided by the @grantsponsor["NSF7000"
+ "National Scribble Foundation"]{http://racket-lang.org} under
+ grant No.: @grantnum["NSF7000"]{867-5309}.}
+}|}
diff --git a/scribble-doc/scribblings/scribble/base.scrbl b/scribble-doc/scribblings/scribble/base.scrbl
@@ -105,7 +105,7 @@ removed.}
@def-section-like[section part-start?]{ Like @racket[title], but
- generates a @racket[part-start] of depth @racket[0] to be by
+ generates a @racket[part-start] of depth @racket[0] to be picked up by
@racket[decode] or @racket[decode-part].}
@def-section-like[subsection part-start?]{ Like @racket[section], but
diff --git a/scribble-doc/scribblings/scribble/generic.scrbl b/scribble-doc/scribblings/scribble/generic.scrbl
@@ -10,5 +10,6 @@
@include-section["book.scrbl"]
@include-section["report.scrbl"]
@include-section["sigplan.scrbl"]
+@include-section["acmart.scrbl"]
@include-section["jfp.scrbl"]
@include-section["lncs.scrbl"]
diff --git a/scribble-doc/scribblings/scribble/sigplan.scrbl b/scribble-doc/scribblings/scribble/sigplan.scrbl
@@ -5,7 +5,7 @@
@defmodulelang[scribble/sigplan]{The @racketmodname[scribble/sigplan]
language is like @racketmodname[scribble/base], but configured with
-Latex style defaults to use the @filepath{sigplanconf.cls} class
+LaTeX style defaults to use the @filepath{sigplanconf.cls} class
file that is included with Scribble.}
@defidform[preprint]{
diff --git a/scribble-lib/scribble/acmart.rkt b/scribble-lib/scribble/acmart.rkt
@@ -0,0 +1,211 @@
+#lang racket/base
+(require setup/collects
+ racket/contract/base
+ scribble/core
+ scribble/base
+ scribble/decode
+ scribble/html-properties
+ scribble/latex-properties
+ (for-syntax racket/base))
+
+(provide/contract
+ [title (->* (pre-content?) (#:short pre-content?) content?)]
+ [abstract
+ (->* () () #:rest (listof pre-content?)
+ block?)]
+ [acmJournal
+ (->* () () #:rest (listof pre-content?)
+ content?)]
+ [acmConference
+ (-> string? string? string? content?)]
+ [grantsponsor
+ (-> string? string? string? content?)]
+ [grantnum
+ (->* (string? string?) (#:url string?) content?)]
+ [acmBadgeR (->* (string?) (#:url string?) content?)]
+ [acmBadgeL (->* (string?) (#:url string?) content?)]
+ [received (->* (string?) (#:stage string?) content?)]
+ [citestyle (-> content? content?)]
+ [CCSXML
+ (->* () () #:rest (listof pre-content?)
+ any/c)])
+
+(provide maketitle)
+
+(define-syntax-rule (defopts name ...)
+ (begin (define-syntax (name stx)
+ (raise-syntax-error #f
+ "option must appear on the same line as `#lang scribble/acmart'"
+ stx))
+ ...
+ (provide name ...)))
+
+(define-syntax-rule (define-commands name ...)
+ (begin
+ (begin
+ (provide/contract [name (->* () () #:rest (listof pre-content?)
+ content?)])
+ (define (name . str)
+ (make-element (make-style (symbol->string 'name) command-props)
+ (decode-content str))))
+ ...))
+
+(define-syntax-rule (define-environments name ...)
+ (begin
+ (begin
+ (provide/contract [name (->* () () #:rest (listof pre-content?)
+ block?)])
+ (define (name . str)
+ (make-nested-flow (make-style (symbol->string 'name) acmart-extras)
+ (decode-flow str))))
+ ...))
+
+; comment environments ensure the \begin and \end are on their own lines
+(define-syntax-rule (define-comment-environments name ...)
+ (begin
+ (begin
+ (provide/contract [name (->* () () #:rest (listof pre-content?)
+ block?)])
+ (define (name . str)
+ (make-nested-flow (make-style (symbol->string 'name) acmart-extras)
+ (append (list (make-paragraph (style #f '()) '("")))
+ (decode-flow str)
+ (list (make-paragraph (style #f '()) '("")))))))
+ ...))
+
+; format options
+(defopts manuscript acmsmall acmlarge acmtog sigconf siggraph sigplan sigchi sigchi-a)
+; boolean options
+(defopts review screen natbib anonymous authorversion)
+
+(define acmart-extras
+ (let ([abs (lambda (s)
+ (path->collects-relative
+ (collection-file-path s "scribble" "acmart")))])
+ (list
+ (make-css-addition (abs "acmart.css"))
+ (make-tex-addition (abs "acmart.tex")))))
+
+;; ----------------------------------------
+;; Abstracts:
+
+(define abstract-style (make-style "abstract" acmart-extras))
+
+(define command-props (cons 'command acmart-extras))
+(define multicommand-props (cons 'multicommand acmart-extras))
+
+(define (abstract . strs)
+ (make-nested-flow
+ abstract-style
+ (decode-flow strs)))
+
+(define (maketitle)
+ (make-nested-flow (make-style "maketitle" command-props) '()))
+
+(define (extract-abstract p)
+ (unless (part? p)
+ (error 'include-abstract "doc binding is not a part: ~e" p))
+ (unless (null? (part-parts p))
+ (error 'include-abstract "abstract part has sub-parts: ~e" (part-parts p)))
+ (when (part-title-content p)
+ (error 'include-abstract "abstract part has title content: ~e" (part-title-content p)))
+ (part-blocks p))
+
+(define-syntax-rule (include-abstract mp)
+ (begin
+ (require (only-in mp [doc abstract-doc]))
+ (make-nested-flow abstract-style (extract-abstract abstract-doc))))
+
+
+(define (acmJournal . str)
+ (make-element (make-style "acmJournal" command-props)
+ (decode-content str)))
+
+(define (acmConference name date venue)
+ (make-multiarg-element (make-style "acmConference" multicommand-props)
+ (list (decode-string name)
+ (decode-string date)
+ (decode-string venue))))
+
+(define (grantsponsor id name url)
+ (make-multiarg-element (make-style "grantsponsor" multicommand-props)
+ (list (decode-string id)
+ (decode-string name)
+ (decode-string url))))
+
+(define (grantnum #:url [url #f] id num)
+ (if url
+ (make-multiarg-element (make-style "SgrantnumURL" multicommand-props)
+ (list (decode-string url)
+ (decode-string id)
+ (decode-string num)))
+ (make-multiarg-element (make-style "grantnum" multicommand-props)
+ (list (decode-string id)
+ (decode-string num)))))
+
+(define (acmBadgeR #:url [url #f] str)
+ (if url
+ (make-multiarg-element (make-style "SacmBadgeRURL" multicommand-props)
+ (list (decode-string url)
+ (decode-string str)))
+ (make-element (make-style "acmBadgeR" command-props)
+ (decode-string str))))
+
+(define (acmBadgeL #:url [url #f] str)
+ (if url
+ (make-multiarg-element (make-style "SacmBadgeLURL" multicommand-props)
+ (list (decode-string url)
+ (decode-string str)))
+ (make-element (make-style "acmBadgeL" command-props)
+ (decode-string str))))
+
+(define (received #:stage [s #f] str)
+ (if s
+ (make-multiarg-element (make-style "SreceivedStage" multicommand-props)
+ (list (decode-string s)
+ (decode-string str)))
+ (make-element (make-style "received" command-props)
+ (decode-string str))))
+
+(define (citestyle str)
+ (make-element (make-style "citestyle" command-props)
+ (decode-string str)))
+
+(define (ccsdesc #:number [n #f] str)
+ (if n
+ (make-multiarg-element (make-style "SccsdescNumber" multicommand-props)
+ (list (number->string n)
+ (decode-string str)))
+ (make-element (make-style "ccsdesc" command-props)
+ (decode-string str))))
+
+(define (title #:short [st #f] str)
+ (if st
+ (make-multiarg-element (make-style "StitleShort" multicommand-props)
+ (list (decode-string st)
+ (decode-string str)))
+ (make-element (make-style "title" command-props)
+ (decode-string str))))
+
+
+(define-commands subtitle orcid author affiliation email
+ position institution department streetaddress city state postcode country
+ thanks titlenote subtitlenote authornote acmVolume acmNumber acmArticle acmYear acmMonth
+ acmArticleSeq acmPrice acmISBN acmDOI
+ startPage terms keywords
+ setcopyright copyrightyear
+ settopmatter ; could be "Rackety"
+ shortauthors
+ setcitstyle)
+
+(define (CCSXML . strs)
+ (make-nested-flow (make-style "CCSXML" '())
+ (list (make-paragraph (make-style #f '())
+ (make-element (make-style #f '(exact-chars))
+ (apply string-append strs))))))
+
+(define-environments teaserfigure sidebar marginfigure margintable)
+(define-comment-environments printonly screenonly anonsuppress acks)
+
+; FIXME: theorem styles
+
diff --git a/scribble-lib/scribble/acmart/acmart-load.tex b/scribble-lib/scribble/acmart/acmart-load.tex
@@ -0,0 +1,2 @@
+% Avoid package option conflict
+\renewcommand\packageColor\relax
diff --git a/scribble-lib/scribble/acmart/acmart.cls b/scribble-lib/scribble/acmart/acmart.cls
@@ -0,0 +1,2187 @@
+%%
+%% This is file `acmart.cls',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% acmart.dtx (with options: `class')
+%%
+%% IMPORTANT NOTICE:
+%%
+%% For the copyright see the source file.
+%%
+%% Any modified versions of this file must be renamed
+%% with new filenames distinct from acmart.cls.
+%%
+%% For distribution of the original source see the terms
+%% for copying and modification in the file acmart.dtx.
+%%
+%% This generated file may be distributed as long as the
+%% original source files, as listed above, are part of the
+%% same distribution. (The sources need not necessarily be
+%% in the same archive or directory.)
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{acmart}
+[2016/12/03 v1.25 Typesetting articles for Association of
+Computing Machinery]
+\def\@classname{acmart}
+\RequirePackage{xkeyval}
+\define@choicekey*+{acmart.cls}{format}[\ACM@format\ACM@format@nr]{%
+ manuscript, acmsmall, acmlarge, acmtog, sigconf, siggraph,
+ sigplan, sigchi, sigchi-a}[manuscript]{}{%
+ \ClassError{\@classname}{The option format must be manuscript,
+ acmsmall, acmlarge, acmtog, sigconf, siggraph,
+ sigplan, sigchi or sigchi-a}}
+\def\@DeclareACMFormat#1{\DeclareOptionX{#1}{\setkeys{acmart.cls}{format=#1}}}
+\@DeclareACMFormat{manuscript}
+\@DeclareACMFormat{acmsmall}
+\@DeclareACMFormat{acmlarge}
+\@DeclareACMFormat{acmtog}
+\@DeclareACMFormat{sigconf}
+\@DeclareACMFormat{siggraph}
+\@DeclareACMFormat{sigplan}
+\@DeclareACMFormat{sigchi}
+\@DeclareACMFormat{sigchi-a}
+\ExecuteOptionsX{format}
+\define@boolkey+{acmart.cls}[@ACM@]{screen}[true]{%
+ \if@ACM@screen
+ \PackageInfo{\@classname}{Using screen mode}%
+ \else
+ \PackageInfo{\@classname}{Not using screen mode}%
+ \fi}{\PackageError{\@classname}{Option screen can be either true or
+ false}}
+\ExecuteOptionsX{screen=false}
+\define@boolkey+{acmart.cls}[@ACM@]{review}[true]{%
+ \if@ACM@review
+ \PackageInfo{\@classname}{Using review mode}%
+ \else
+ \PackageInfo{\@classname}{Not using review mode}%
+ \fi}{\PackageError{\@classname}{Option review can be either true or
+ false}}
+\ExecuteOptionsX{review=false}
+\define@boolkey+{acmart.cls}[@ACM@]{authorversion}[true]{%
+ \if@ACM@authorversion
+ \PackageInfo{\@classname}{Using authorversion mode}%
+ \else
+ \PackageInfo{\@classname}{Not using authorversion mode}%
+ \fi}{\PackageError{\@classname}{Option authorversion can be either true or
+ false}}
+\ExecuteOptionsX{authorversion=false}
+\newif\if@ACM@natbib@override
+\@ACM@natbib@overridefalse
+\define@boolkey+{acmart.cls}[@ACM@]{natbib}[true]{%
+ \@ACM@natbib@overridetrue
+ \if@ACM@natbib
+ \PackageInfo{\@classname}{Explicitly selecting natbib mode}%
+ \else
+ \PackageInfo{\@classname}{Explicitly deselecting natbib mode}%
+ \fi}{\PackageError{\@classname}{Option natbib can be either true or
+ false}}
+\define@boolkey+{acmart.cls}[@ACM@]{anonymous}[true]{%
+ \if@ACM@anonymous
+ \PackageInfo{\@classname}{Using anonymous mode}%
+ \else
+ \PackageInfo{\@classname}{Not using anonymous mode}%
+ \fi}{\PackageError{\@classname}{Option anonymous can be either true or
+ false}}
+\ExecuteOptionsX{anonymous=false}
+\def\ACM@fontsize{}
+\DeclareOptionX{9pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{10pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{11pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{12pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{draft}{\PassOptionsToClass{\CurrentOption}{amsart}}
+\DeclareOptionX{*}{\PassOptionsToClass{\CurrentOption}{amsart}}
+\ProcessOptionsX
+\ClassInfo{\@classname}{Using format \ACM@format, number \ACM@format@nr}
+\newif\if@ACM@manuscript
+\newif\if@ACM@journal
+\newif\if@ACM@sigchiamode
+\ifnum\ACM@format@nr=0\relax
+ \@ACM@manuscripttrue
+\else
+ \@ACM@manuscriptfalse
+\fi
+\@ACM@sigchiamodefalse
+\ifcase\ACM@format@nr
+\relax % manuscript
+ \@ACM@journaltrue
+\or % acmsmall
+ \@ACM@journaltrue
+\or % acmlarge
+ \@ACM@journaltrue
+\or % acmtog
+ \@ACM@journaltrue
+\or % sigconf
+ \@ACM@journalfalse
+\or % siggraph
+ \@ACM@journalfalse
+ \or % sigplan
+ \@ACM@journalfalse
+ \or % sigchi
+ \@ACM@journalfalse
+\or % sigchi-a
+ \@ACM@journalfalse
+ \@ACM@sigchiamodetrue
+\fi
+\if@ACM@natbib@override\else
+ \@ACM@natbibtrue
+\fi
+\ifx\ACM@fontsize\@empty
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \def\ACM@fontsize{9pt}%
+ \or % acmsmall
+ \def\ACM@fontsize{10pt}%
+ \or % acmlarge
+ \def\ACM@fontsize{10pt}%
+ \or % acmtog
+ \def\ACM@fontsize{9pt}%
+ \or % sigconf
+ \def\ACM@fontsize{9pt}%
+ \or % siggraph
+ \def\ACM@fontsize{9pt}%
+ \or % sigplan
+ \def\ACM@fontsize{9pt}%
+ \or % sigchi
+ \def\ACM@fontsize{10pt}%
+ \or % sigchi-a
+ \def\ACM@fontsize{10pt}%
+ \fi
+\fi
+\ClassInfo{\@classname}{Using fontsize \ACM@fontsize}
+\LoadClass[\ACM@fontsize, reqno]{amsart}
+\RequirePackage{microtype}
+\RequirePackage{totpages}
+\RequirePackage{environ}
+\if@ACM@manuscript
+\RequirePackage{setspace}
+\onehalfspacing
+\fi
+\if@ACM@natbib
+ \RequirePackage{natbib}
+ \renewcommand{\bibsection}{%
+ \section*{\refname}%
+ \phantomsection\addcontentsline{toc}{section}{\refname}%
+ }
+ \renewcommand{\bibfont}{\bibliofont}
+ \renewcommand\setcitestyle[1]{
+ \@for\@tempa:=#1\do
+ {\def\@tempb{round}\ifx\@tempa\@tempb
+ \renewcommand\NAT@open{(}\renewcommand\NAT@close{)}\fi
+ \def\@tempb{square}\ifx\@tempa\@tempb
+ \renewcommand\NAT@open{[}\renewcommand\NAT@close{]}\fi
+ \def\@tempb{angle}\ifx\@tempa\@tempb
+ \renewcommand\NAT@open{$<$}\renewcommand\NAT@close{$>$}\fi
+ \def\@tempb{curly}\ifx\@tempa\@tempb
+ \renewcommand\NAT@open{\{}\renewcommand\NAT@close{\}}\fi
+ \def\@tempb{semicolon}\ifx\@tempa\@tempb
+ \renewcommand\NAT@sep{;}\fi
+ \def\@tempb{colon}\ifx\@tempa\@tempb
+ \renewcommand\NAT@sep{;}\fi
+ \def\@tempb{comma}\ifx\@tempa\@tempb
+ \renewcommand\NAT@sep{,}\fi
+ \def\@tempb{authoryear}\ifx\@tempa\@tempb
+ \NAT@numbersfalse\fi
+ \def\@tempb{numbers}\ifx\@tempa\@tempb
+ \NAT@numberstrue\NAT@superfalse\fi
+ \def\@tempb{super}\ifx\@tempa\@tempb
+ \NAT@numberstrue\NAT@supertrue\fi
+ \def\@tempb{nobibstyle}\ifx\@tempa\@tempb
+ \let\bibstyle=\@gobble\fi
+ \def\@tempb{bibstyle}\ifx\@tempa\@tempb
+ \let\bibstyle=\@citestyle\fi
+ \def\@tempb{sort}\ifx\@tempa\@tempb
+ \def\NAT@sort{\@ne}\fi
+ \def\@tempb{nosort}\ifx\@tempa\@tempb
+ \def\NAT@sort{\z@}\fi
+ \def\@tempb{compress}\ifx\@tempa\@tempb
+ \def\NAT@cmprs{\@ne}\fi
+ \def\@tempb{nocompress}\ifx\@tempa\@tempb
+ \def\NAT@cmprs{\@z}\fi
+ \def\@tempb{sort&compress}\ifx\@tempa\@tempb
+ \def\NAT@sort{\@ne}\def\NAT@cmprs{\@ne}\fi
+ \def\@tempb{mcite}\ifx\@tempa\@tempb
+ \let\NAT@merge\@ne\fi
+ \def\@tempb{merge}\ifx\@tempa\@tempb
+ \@ifnum{\NAT@merge<\tw@}{\let\NAT@merge\tw@}{}\fi
+ \def\@tempb{elide}\ifx\@tempa\@tempb
+ \@ifnum{\NAT@merge<\thr@@}{\let\NAT@merge\thr@@}{}\fi
+ \def\@tempb{longnamesfirst}\ifx\@tempa\@tempb
+ \NAT@longnamestrue\fi
+ \def\@tempb{nonamebreak}\ifx\@tempa\@tempb
+ \def\NAT@nmfmt#1{\mbox{\NAT@up#1}}\fi
+ \expandafter\NAT@find@eq\@tempa=\relax\@nil
+ \if\@tempc\relax\else
+ \expandafter\NAT@rem@eq\@tempc
+ \def\@tempb{open}\ifx\@tempa\@tempb
+ \xdef\NAT@open{\@tempc}\fi
+ \def\@tempb{close}\ifx\@tempa\@tempb
+ \xdef\NAT@close{\@tempc}\fi
+ \def\@tempb{aysep}\ifx\@tempa\@tempb
+ \xdef\NAT@aysep{\@tempc}\fi
+ \def\@tempb{yysep}\ifx\@tempa\@tempb
+ \xdef\NAT@yrsep{\@tempc}\fi
+ \def\@tempb{notesep}\ifx\@tempa\@tempb
+ \xdef\NAT@cmt{\@tempc}\fi
+ \def\@tempb{citesep}\ifx\@tempa\@tempb
+ \xdef\NAT@sep{\@tempc}\fi
+ \fi
+ }%
+ \NAT@@setcites
+ }
+ \renewcommand\citestyle[1]{%
+ \ifcsname bibstyle@#1\endcsname%
+ \csname bibstyle@#1\endcsname\let\bibstyle\@gobble%
+ \else%
+ \@latex@error{Undefined `#1' citestyle}%
+ \fi
+ }%
+\fi
+\newcommand{\bibstyle@acmauthoryear}{%
+ \setcitestyle{%
+ authoryear,%
+ open={(},close={)},citesep={;},%
+ aysep={},yysep={,},%
+ notesep={, }}}
+\newcommand{\bibstyle@acmnumeric}{%
+ \setcitestyle{%
+ numbers,sort&compress,%
+ open={[},close={]},citesep={,},%
+ notesep={, }}}
+\citestyle{acmnumeric}
+\def\@startsection#1#2#3#4#5#6{%
+ \if@noskipsec \leavevmode \fi
+ \par
+ \@tempskipa #4\relax
+ \@afterindenttrue
+ \ifdim \@tempskipa <\z@
+ \@tempskipa -\@tempskipa \@afterindentfalse
+ \fi
+ \if@nobreak
+ \everypar{}%
+ \else
+ \addpenalty\@secpenalty\addvspace\@tempskipa
+ \fi
+ \@ifstar
+ {\@ssect{#3}{#4}{#5}{#6}}%
+ {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
+\def\@sect#1#2#3#4#5#6[#7]#8{%
+ \ifnum #2>\c@secnumdepth
+ \let\@svsec\@empty
+ \else
+ \refstepcounter{#1}%
+ \protected@edef\@svsec{\@seccntformat{#1}\relax}%
+ \fi
+ \@tempskipa #5\relax
+ \ifdim \@tempskipa>\z@
+ \begingroup
+ #6{%
+ \@hangfrom{\hskip #3\relax\@svsec}%
+ \interlinepenalty \@M #8\@@par}%
+ \endgroup
+ \csname #1mark\endcsname{#7}%
+ \addcontentsline{toc}{#1}{%
+ \ifnum #2>\c@secnumdepth \else
+ \protect\numberline{\csname the#1\endcsname}%
+ \fi
+ #7}%
+ \else
+ \def\@svsechd{%
+ #6{\hskip #3\relax
+ \@svsec #8}%
+ \csname #1mark\endcsname{#7}%
+ \addcontentsline{toc}{#1}{%
+ \ifnum #2>\c@secnumdepth \else
+ \protect\numberline{\csname the#1\endcsname}%
+ \fi
+ #7}}%
+ \fi
+ \@xsect{#5}}
+\def\@xsect#1{%
+ \@tempskipa #1\relax
+ \ifdim \@tempskipa>\z@
+ \par \nobreak
+ \vskip \@tempskipa
+ \@afterheading
+ \else
+ \@nobreakfalse
+ \global\@noskipsectrue
+ \everypar{%
+ \if@noskipsec
+ \global\@noskipsecfalse
+ {\setbox\z@\lastbox}%
+ \clubpenalty\@M
+ \begingroup \@svsechd \endgroup
+ \unskip
+ \@tempskipa #1\relax
+ \hskip -\@tempskipa
+ \else
+ \clubpenalty \@clubpenalty
+ \everypar{}%
+ \fi}%
+ \fi
+ \ignorespaces}
+\def\@seccntformat#1{\csname the#1\endcsname\quad}
+\def\@ssect#1#2#3#4#5{%
+ \@tempskipa #3\relax
+ \ifdim \@tempskipa>\z@
+ \begingroup
+ #4{%
+ \@hangfrom{\hskip #1}%
+ \interlinepenalty \@M #5\@@par}%
+ \endgroup
+ \else
+ \def\@svsechd{#4{\hskip #1\relax #5}}%
+ \fi
+ \@xsect{#3}}
+\let\@footnotemark@nolink\@footnotemark
+\let\@footnotetext@nolink\@footnotetext
+\RequirePackage[bookmarksnumbered]{hyperref}
+\urlstyle{rm}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \urlstyle{sf}
+\or % sigchi
+\or % sigchi-a
+ \urlstyle{sf}
+\fi
+\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
+ \let\citeANP\citeauthor
+ \let\citeNN\citeyearpar
+ \let\citeyearNP\citeyear
+ \let\citeyear\citeyearpar
+ \let\citeNP\citealt
+ \def\shortcite#1{\citeyear{#1}}
+ \DeclareRobustCommand\citeA
+ {\begingroup\NAT@swafalse
+ \let\NAT@ctype\@ne\NAT@partrue\NAT@fullfalse\NAT@open\NAT@citetp}%
+ \providecommand\newblock{}%
+\else
+ \providecommand\citename[1]{#1}
+\fi
+\def\bibliographystyle#1{%
+ \ifx\@begindocumenthook\@undefined\else
+ \expandafter\AtBeginDocument
+ \fi
+ {\if@filesw
+ \immediate\write\@auxout{\string\bibstyle{#1}}%
+ \fi}}
+\RequirePackage{graphicx, xcolor}
+\definecolor[named]{ACMBlue}{cmyk}{1,0.1,0,0.1}
+\definecolor[named]{ACMYellow}{cmyk}{0,0.16,1,0}
+\definecolor[named]{ACMOrange}{cmyk}{0,0.42,1,0.01}
+\definecolor[named]{ACMRed}{cmyk}{0,0.90,0.86,0}
+\definecolor[named]{ACMLightBlue}{cmyk}{0.49,0.01,0,0}
+\definecolor[named]{ACMGreen}{cmyk}{0.20,0,1,0.19}
+\definecolor[named]{ACMPurple}{cmyk}{0.55,1,0,0.15}
+\definecolor[named]{ACMDarkBlue}{cmyk}{1,0.58,0,0.21}
+\RequirePackage{geometry}
+\ifcase\ACM@format@nr
+\relax % manuscript
+ \geometry{letterpaper,head=1pc}%
+\or % acmsmall
+ \geometry{twoside=true,
+ includeheadfoot, head=1pc, foot=2pc,
+ paperwidth=6.75in, paperheight=10in,
+ top=58pt, bottom=44pt, inner=46pt, outer=46pt
+ }%
+\or % acmlarge
+ \geometry{twoside=true, head=1pc, foot=2pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot,
+ top=78pt, bottom=114pt, inner=81pt, outer=81pt
+ }%
+\or % acmtog
+ \geometry{twoside=true, head=1pc, foot=2pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot, columnsep=24pt,
+ top=52pt, bottom=75pt, inner=52pt, outer=52pt
+ }%
+\or % sigconf
+ \geometry{twoside=true, head=1pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot, columnsep=2pc,
+ top=57pt, bottom=73pt, inner=54pt, outer=54pt
+ }%
+\or % siggraph
+ \geometry{twoside=true, head=1pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot, columnsep=2pc,
+ top=57pt, bottom=73pt, inner=54pt, outer=54pt
+ }%
+\or % sigplan
+ \geometry{twoside=true, head=1pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot=false, columnsep=2pc,
+ top=1in, bottom=1in, inner=0.75in, outer=0.75in
+ }%
+\or % sigchi
+ \geometry{twoside=true, head=1pc,
+ paperwidth=8.5in, paperheight=11in,
+ includeheadfoot, columnsep=2pc,
+ top=66pt, bottom=73pt, inner=54pt, outer=54pt
+ }%
+\or % sigchi-a
+ \geometry{twoside=false, head=1pc,
+ paperwidth=11in, paperheight=8.5in,
+ includeheadfoot, marginparsep=72pt,
+ marginparwidth=170pt, columnsep=20pt,
+ top=72pt, bottom=72pt, left=314pt, right=72pt
+ }%
+ \@mparswitchfalse
+ \reversemarginpar
+\fi
+\setlength\parindent{10\p@}
+\setlength\parskip{\z@}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+ \setlength\parindent{9\p@}%
+\or % sigconf
+\or % siggraph
+\or % sigplan
+\or % sigchi
+\or % sigchi-a
+\fi
+\def\copyrightpermissionfootnoterule{\kern-3\p@
+ \hrule \@width \columnwidth \kern 2.6\p@}
+\RequirePackage{manyfoot}
+\SelectFootnoteRule[2]{copyrightpermission}
+\DeclareNewFootnote{copyrightpermission}
+\def\footnoterule{\kern-3\p@
+ \hrule \@width 4pc \kern 2.6\p@}
+\def\endminipage{%
+ \par
+ \unskip
+ \ifvoid\@mpfootins\else
+ \vskip\skip\@mpfootins
+ \normalcolor
+ \unvbox\@mpfootins
+ \fi
+ \@minipagefalse %% added 24 May 89
+ \color@endgroup
+ \egroup
+ \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}}
+\def\@makefntext{\noindent\@makefnmark}
+\if@ACM@sigchiamode
+\long\def\@footnotetext#1{\marginpar{%
+ \reset@font\small
+ \interlinepenalty\interfootnotelinepenalty
+ \protected@edef\@currentlabel{%
+ \csname p@footnote\endcsname\@thefnmark
+ }%
+ \color@begingroup
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}%
+\fi
+\long\def\@mpfootnotetext#1{%
+ \global\setbox\@mpfootins\vbox{%
+ \unvbox\@mpfootins
+ \reset@font\footnotesize
+ \hsize\columnwidth
+ \@parboxrestore
+ \protected@edef\@currentlabel
+ {\csname p@mpfootnote\endcsname\@thefnmark}%
+ \color@begingroup\centering
+ \@makefntext{%
+ \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
+ \color@endgroup}}
+\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}
+\newif\if@ACM@newfonts
+\@ACM@newfontstrue
+\IfFileExists{libertine.sty}{}{\ClassWarning{\@classname}{You do not
+ have 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}
+\IfFileExists{newtxmath.sty}{}{\ClassWarning{\@classname}{You do not
+ have newtxmath package installed. Please upgrade your
+ TeX}\@ACM@newfontsfalse}
+\if@ACM@newfonts
+\RequirePackage[tt=false]{libertine}
+\RequirePackage[varqu]{zi4}
+\RequirePackage[libertine]{newtxmath}
+\else
+\RequirePackage{textcomp}
+\fi
+\if@ACM@sigchiamode
+ \renewcommand{\familydefault}{\sfdefault}
+\fi
+\RequirePackage{caption, float}
+\captionsetup[table]{position=top}
+\if@ACM@journal
+ \captionsetup{labelfont={sf, small},
+ textfont={sf, small}, margin=\z@}
+ \captionsetup[figure]{name={Fig.}}
+\else
+ \captionsetup{labelfont={bf},
+ textfont={bf}, labelsep=colon, margin=\z@}
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \or % acmsmall
+ \or % acmlarge
+ \or % acmtog
+ \or % sigconf
+ \or % siggraph
+ \captionsetup{textfont={it}}
+ \or % sigplan
+ \captionsetup{labelfont={bf},
+ textfont={normalfont}, labelsep=period, margin=\z@}
+ \or % sigchi
+ \captionsetup[figure]{labelfont={bf, small},
+ textfont={bf, small}}
+ \or % sigchi-a
+ \captionsetup[figure]{labelfont={bf, small},
+ textfont={bf, small}}
+ \fi
+\fi
+\newfloat{sidebar}{}{sbar}
+\floatname{sidebar}{Sidebar}
+\renewenvironment{sidebar}{\Collect@Body\@sidebar}{}
+\long\def\@sidebar#1{\bgroup\captionsetup{type=sidebar}%
+ \marginpar{\small#1}\egroup}
+\newenvironment{marginfigure}{\Collect@Body\@marginfigure}{}
+\long\def\@marginfigure#1{\bgroup\captionsetup{type=figure}%
+ \marginpar{\centering\small#1}\egroup}
+\newenvironment{margintable}{\Collect@Body\@margintable}{}
+\long\def\@margintable#1{\bgroup\captionsetup{type=table}%
+ \marginpar{\centering\small#1}\egroup}
+\newdimen\fulltextwidth
+\fulltextwidth=\dimexpr(\textwidth+\marginparwidth+\marginparsep)
+\if@ACM@sigchiamode
+\def\@dblfloat{\bgroup\columnwidth=\fulltextwidth
+ \let\@endfloatbox\@endwidefloatbox
+ \def\@fpsadddefault{\def\@fps{tp}}%
+ \@float}
+\fi
+\if@ACM@sigchiamode
+\def\end@dblfloat{%
+ \end@float\egroup}
+\fi
+\def\@endwidefloatbox{%
+ \par\vskip\z@skip
+ \@minipagefalse
+ \outer@nobreak
+ \egroup
+ \color@endbox
+ \global\setbox\@currbox=\vbox{\moveleft
+ \dimexpr(\fulltextwidth-\textwidth)\box\@currbox}%
+ \wd\@currbox=\textwidth
+}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+\def\labelenumi{\theenumi.}
+\def\labelenumii{\theenumii.}
+\def\labelenumiii{\theenumiii.}
+\def\labelenumiv{\theenumiv.}
+\or % sigchi
+\or % sigchi-a
+\fi
+\renewcommand{\descriptionlabel}[1]{\hspace\labelsep \upshape\bfseries #1}
+\renewenvironment{description}{\list{}{%
+ \itemindent-12\p@
+ \labelwidth\z@ \let\makelabel\descriptionlabel}%
+}{
+ \endlist
+}
+\let\enddescription=\endlist % for efficiency
+\define@choicekey*+{ACM}{acmJournal}[\@journalCode\@journalCode@nr]{%
+ CIE,%
+ CSUR,%
+ IMWUT,%
+ JACM,%
+ JDIQ,%
+ JEA,%
+ JERIC,%
+ JETC,%
+ JOCCH,%
+ PACMPL,%
+ TAAS,%
+ TACCESS,%
+ TACO,%
+ TALG,%
+ TALLIP,%
+ TAP,%
+ TCPS,%
+ TEAC,%
+ TECS,%
+ TIIS,%
+ TISSEC,%
+ TIST,%
+ TKDD,%
+ TMIS,%
+ TOCE,%
+ TOCHI,%
+ TOCL,%
+ TOCS,%
+ TOCT,%
+ TODAES,%
+ TODS,%
+ TOG,%
+ TOIS,%
+ TOIT,%
+ TOMACS,%
+ TOMM,%
+ TOMPECS,%
+ TOMS,%
+ TOPC,%
+ TOPS,%
+ TOPLAS,%
+ TOS,%
+ TOSEM,%
+ TOSN,%
+ TRETS,%
+ TSAS,%
+ TSC,%
+ TSLP,%
+ TWEB%
+}{%
+\ifcase\@journalCode@nr
+\relax % CIE
+ \def\@journalName{ACM Computers in Entertainment}%
+ \def\@journalNameShort{ACM Comput. Entertain.}%
+ \def\@permissionCodeOne{1544-3574}%
+\or % CSUR
+ \def\@journalName{ACM Computing Surveys}%
+ \def\@journalNameShort{ACM Comput. Surv.}%
+ \def\@permissionCodeOne{0360-0300}%
+\or % IMWUT
+ \def\@journalName{PACM on Interactive, Mobile, Wearable and
+ Ubiquitous Technologies}%
+ \def\@journalNameShort{PACM Interact. Mob. Wearable Ubiquitous Technol.}%
+ \def\@permissionCodeOne{2474-9567}%
+\or % JACM
+ \def\@journalName{Journal of the ACM}%
+ \def\@journalNameShort{J. ACM}%
+ \def\@permissionCodeOne{0004-5411}%
+\or % JDIQ
+ \def\@journalName{ACM Journal of Data and Information Quality}%
+ \def\@journalNameShort{ACM J. Data Inform. Quality}%
+ \def\@permissionCodeOne{1936-1955}%
+\or % JEA
+ \def\@journalName{ACM Journal of Experimental Algorithmics}%
+ \def\@journalNameShort{ACM J. Exp. Algor.}%
+ \def\@permissionCodeOne{1084-6654}%
+\or % JERIC
+ \def\@journalName{ACM Journal of Educational Resources in Computing}%
+ \def\@journalNameShort{ACM J. Edu. Resources in Comput.}%
+ \def\@permissionCodeOne{1073-0516}%
+\or % JETC
+ \def\@journalName{ACM Journal on Emerging Technologies in Computing Systems}%
+ \def\@journalNameShort{ACM J. Emerg. Technol. Comput. Syst.}%
+ \def\@permissionCodeOne{1550-4832}%
+\or % JOCCH
+ \def\@journalName{ACM Journal on Computing and Cultural Heritage}%
+ \def\@journalName{ACM J. Comput. Cult. Herit.}%
+\or % PACMPL
+ \def\@journalName{PACM on Programming Languages}%
+ \def\@journalName{PACM Progr. Lang.}%
+ \def\@permissionCodeOne{2475-1421}%
+\or % TAAS
+ \def\@journalName{ACM Transactions on Autonomous and Adaptive Systems}%
+ \def\@journalNameShort{ACM Trans. Autonom. Adapt. Syst.}%
+ \def\@permissionCodeOne{1556-4665}%
+\or % TACCESS
+ \def\@journalName{ACM Transactions on Accessible Computing}%
+ \def\@journalNameShort{ACM Trans. Access. Comput.}%
+ \def\@permissionCodeOne{1936-7228}%
+\or % TACO
+ \def\@journalName{ACM Transactions on Architecture and Code Optimization}%
+\or % TALG
+ \def\@journalName{ACM Transactions on Algorithms}%
+ \def\@journalNameShort{ACM Trans. Algor.}%
+ \def\@permissionCodeOne{1549-6325}%
+\or % TALLIP
+ \def\@journalName{ACM Transactions on Asian and Low-Resource Language Information Processing}%
+ \def\@journalNameShort{ACM Trans. Asian Low-Resour. Lang. Inf. Process.}%
+ \def\@permissionCodeOne{2375-4699}%
+\or % TAP
+ \def\@journalName{ACM Transactions on Applied Perception}%
+\or % TCPS
+ \def\@journalName{ACM Transactions on Cyber-Physical Systems}%
+\or % TEAC
+ \def\@journalName{ACM Transactions on Economics and Computation}%
+\or % TECS
+ \def\@journalName{ACM Transactions on Embedded Computing Systems}%
+ \def\@journalNameShort{ACM Trans. Embedd. Comput. Syst.}%
+ \def\@permissionCodeOne{1539-9087}%
+\or % TIIS
+ \def\@journalName{ACM Transactions on Interactive Intelligent Systems}%
+ \def\@journalNameShort{ACM Trans. Interact. Intell. Syst.}%
+ \def\@permissionCodeOne{2160-6455}%
+\or % TISSEC
+ \def\@journalName{ACM Transactions on Information and System Security}%
+ \def\@journalNameShort{ACM Trans. Info. Syst. Sec.}%
+ \def\@permissionCodeOne{1094-9224}%
+\or % TIST
+ \def\@journalName{ACM Transactions on Intelligent Systems and Technology}%
+ \def\@journalNameShort{ACM Trans. Intell. Syst. Technol.}%
+ \def\@permissionCodeOne{2157-6904}%
+\or % TKDD
+ \def\@journalName{ACM Transactions on Knowledge Discovery from Data}%
+ \def\@journalNameShort{ACM Trans. Knowl. Discov. Data.}%
+ \def\@permissionCodeOne{1556-4681}%
+\or % TMIS
+ \def\@journalName{ACM Transactions on Management Information Systems}%
+ \def\@journalNameShort{ACM Trans. Manag. Inform. Syst.}%
+ \def\@permissionCodeOne{2158-656X}%
+\or % TOCE
+ \def\@journalName{ACM Transactions on Computing Education}%
+ \def\@journalNameShort{ACM Trans. Comput. Educ.}%
+ \def\@permissionCodeOne{1946-6226}%
+\or % TOCHI
+ \def\@journalName{ACM Transactions on Computer-Human Interaction}%
+ \def\@journalNameShort{ACM Trans. Comput.-Hum. Interact.}%
+ \def\@permissionCodeOne{1073-0516}%
+\or % TOCL
+ \def\@journalName{ACM Transactions on Computational Logic}%
+ \def\@journalNameShort{ACM Trans. Comput. Logic}%
+ \def\@permissionCodeOne{1529-3785}%
+\or % TOCS
+ \def\@journalName{ACM Transactions on Computer Systems}%
+ \def\@journalNameShort{ACM Trans. Comput. Syst.}%
+ \def\@permissionCodeOne{0734-2071}%
+\or % TOCT
+ \def\@journalName{ACM Transactions on Computation Theory}%
+ \def\@journalNameShort{ACM Trans. Comput. Theory}%
+ \def\@permissionCodeOne{1942-3454}%
+\or % TODAES
+ \def\@journalName{ACM Transactions on Design Automation of Electronic Systems}%
+ \def\@journalNameShort{ACM Trans. Des. Autom. Electron. Syst.}%
+ \def\@permissionCodeOne{1084-4309}%
+\or % TODS
+ \def\@journalName{ACM Transactions on Database Systems}%
+ \def\@journalNameShort{ACM Trans. Datab. Syst.}%
+ \def\@permissionCodeOne{0362-5915}%
+\or % TOG
+ \def\@journalName{ACM Transactions on Graphics}%
+ \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
+ \def\@journalName{ACM Transactions on Internet Technology}%
+ \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
+ \def\@journalName{ACM Transactions on Multimedia Computing, Communications and Applications}%
+ \def\@journalNameShort{ACM Trans. Multimedia Comput. Commun. Appl.}%
+ \def\@permissionCodeOne{1551-6857}%
+ \def\@permissionCodeTwo{0100}%
+\or % TOMPECS
+ \def\@journalName{ACM Transactions on Modeling and Performance Evaluation of Computing Systems}%
+ \def\@journalNameShort{ACM Trans. Model. Perform. Eval. Comput. Syst.}%
+ \def\@permissionCodeOne{2376-3639}%
+\or % TOMS
+ \def\@journalName{ACM Transactions on Mathematical Software}%
+ \def\@journalNameShort{ACM Trans. Math. Softw.}%
+ \def\@permissionCodeOne{0098-3500}%
+\or % TOPC
+ \def\@journalName{ACM Transactions on Parallel Computing}%
+ \def\@journalNameShort{ACM Trans. Parallel Comput.}%
+ \def\@permissionCodeOne{1539-9087}%
+\or % TOPS
+ \def\@journalName{ACM Transactions on Privacy and Security}%
+ \def\@journalNameShort{ACM Trans. Priv. Sec.}%
+ \def\@permissionCodeOne{2471-2566}%
+\or % TOPLAS
+ \def\@journalName{ACM Transactions on Programming Languages and Systems}%
+ \def\@journalNameShort{ACM Trans. Program. Lang. Syst.}%
+ \def\@permissionCodeOne{0164-0925}%
+\or % TOS
+ \def\@journalName{ACM Transactions on Storage}%
+ \def\@journalNameShort{ACM Trans. Storage}%
+ \def\@permissionCodeOne{1553-3077}%
+\or % TOSEM
+ \def\@journalName{ACM Transactions on Software Engineering and Methodology}%
+ \def\@journalNameShort{ACM Trans. Softw. Eng. Methodol.}%
+ \def\@permissionCodeOne{1049-331X}%
+\or % TOSN
+ \def\@journalName{ACM Transactions on Sensor Networks}%
+ \def\@journalNameShort{ACM Trans. Sensor Netw.}%
+ \def\@permissionCodeOne{1550-4859}%
+\or % TRETS
+ \def\@journalName{ACM Transactions on Reconfigurable Technology and Systems}%
+ \def\@journalNameShort{ACM Trans. Reconfig. Technol. Syst.}%
+ \def\@permissionCodeOne{1936-7406}%
+\or % TSAS
+ \def\@journalName{ACM Transactions on Spatial Algorithms and Systems}%
+ \def\@journalNameShort{ACM Trans. Spatial Algorithms Syst.}%
+ \def\@permissionCodeOne{2374-0353}%
+\or % TSC
+ \def\@journalName{ACM Transactions on Social Computing}%
+ \def\@journalNameShort{ACM Trans. Soc. Comput.}%
+ \def\@permissionCodeOne{2469-7818}%
+\or % TSLP
+ \def\@journalName{ACM Transactions on Speech and Language Processing}%
+ \def\@journalNameShort{ACM Trans. Speech Lang. Process.}%
+ \def\@permissionCodeOne{1550-4875}%
+\or % TWEB
+ \def\@journalName{ACM Transactions on the Web}%
+ \def\@journalNameShort{ACM Trans. Web}%
+ \def\@permissionCodeOne{1559-1131}%
+\fi
+\ClassInfo{\@classname}{Using journal code \@journalCode}%
+}{%
+ \ClassError{\@classname}{Incorrect journal #1}%
+}%
+\def\acmJournal#1{\setkeys{ACM}{acmJournal=#1}}
+\def\@journalCode@nr{0}
+\def\@journalName{}%
+\def\@journalNameShort{\@journalName}%
+\def\@permissionCodeOne{XXXX-XXXX}%
+\def\@permissionCodeTwo{}%
+\newcommand\acmConference[4][]{%
+ \gdef\acmConference@shortname{#1}%
+ \gdef\acmConference@name{#2}%
+ \gdef\acmConference@date{#3}%
+ \gdef\acmConference@venue{#4}%
+ \ifx\acmConference@shortname\@empty
+ \gdef\acmConference@shortname{#2}%
+ \fi}
+\acmConference[Conference'17]{ACM Conference}{July 2017}{Washington,
+ DC, USA}
+\def\subtitle#1{\def\@subtitle{#1}}
+\subtitle{}
+\newcount\num@authorgroups
+\num@authorgroups=0\relax
+\newif\if@insideauthorgroup
+\@insideauthorgroupfalse
+\renewcommand\author[2][]{%
+ \if@insideauthorgroup\else
+ \global\advance\num@authorgroups by 1\relax
+ \global\@insideauthorgrouptrue
+ \fi
+ \ifx\addresses\@empty
+ \if@ACM@anonymous
+ \gdef\addresses{\@author{Anonymous Author(s)}}%
+ \gdef\authors{Anonymous Author(s)}%
+ \else
+ \gdef\addresses{\@author{#2}}%
+ \gdef\authors{#2}%
+ \fi
+ \else
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\and\@author{#2}}%
+ \g@addto@macro\authors{\and#2}%
+ \fi
+ \fi
+ \if@ACM@anonymous
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{Anon.}%
+ \fi
+ \else
+ \def\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{#2}%
+ \else
+ \g@addto@macro\shortauthors{\and#2}%
+ \fi
+ \else
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{#1}%
+ \else
+ \g@addto@macro\shortauthors{\and#1}%
+ \fi
+ \fi
+ \fi}
+\newcommand{\affiliation}[2][]{%
+ \global\@insideauthorgroupfalse
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\affiliation{#1}{#2}}%
+ \fi}
+\renewcommand{\email}[2][]{%
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\email{#1}{#2}}%
+ \fi}
+\let\orcid\@gobble
+\def\@titlenotes{}
+\def\titlenote#1{%
+ \g@addto@macro\@title{\footnotemark}%
+ \if@ACM@anonymous
+ \g@addto@macro\@titlenotes{%
+ \stepcounter{footnote}\footnotetext{Title note}}%
+ \else
+ \g@addto@macro\@titlenotes{\stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\def\@subtitlenotes{}
+\def\subtitlenote#1{%
+ \g@addto@macro\@subtitle{\footnotemark}%
+ \if@ACM@anonymous
+ \g@addto@macro\@subtitlenotes{%
+ \stepcounter{footnote}\footnotetext{Subtitle note}}%
+ \else
+ \g@addto@macro\@subtitlenotes{%
+ \stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\def\@authornotes{}
+\def\authornote#1{%
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\@authornotemark}
+ \g@addto@macro\@authornotes{%
+ \stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\def\acmVolume#1{\def\@acmVolume{#1}}
+\acmVolume{1}
+\def\acmNumber#1{\def\@acmNumber{#1}}
+\acmNumber{1}
+\def\acmArticle#1{\def\@acmArticle{#1}}
+\acmArticle{1}
+\def\acmArticleSeq#1{\def\@acmArticleSeq{#1}}
+\acmArticleSeq{\@acmArticle}
+\def\acmYear#1{\def\@acmYear{#1}}
+\acmYear{2016}
+\def\acmMonth#1{\def\@acmMonth{#1}}
+\acmMonth{1}
+\def\@acmPubDate{\ifcase\@acmMonth\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or
+ December\fi~\@acmYear}
+\def\acmPrice#1{\def\@acmPrice{#1}}
+\acmPrice{15.00}
+\def\acmISBN#1{\def\@acmISBN{#1}}
+\acmISBN{978-x-xxxx-xxxx-x/YY/MM}
+\def\acmDOI#1{\def\@acmDOI{#1}}
+\acmDOI{10.1145/nnnnnnn.nnnnnnn}
+\newif\if@ACM@badge
+\@ACM@badgefalse
+\newlength\@ACM@badge@width
+\setlength\@ACM@badge@width{5pc}
+\newlength\@ACM@title@width
+\newlength\@ACM@badge@skip
+\setlength\@ACM@badge@skip{1pc}
+\newcommand\acmBadgeR[2][]{\@ACM@badgetrue
+ \def\@acmBadgeR@url{#1}%
+ \def\@acmBadgeR@image{#2}}
+\def\@acmBadgeR@url{}
+\def\@acmBadgeR@image{}
+\newcommand\acmBadgeL[2][]{\@ACM@badgetrue
+ \def\@acmBadgeL@url{#1}%
+ \def\@acmBadgeL@image{#2}}
+\def\@acmBadgeL@url{}
+\def\@acmBadgeL@image{}
+\def\startPage#1{\def\@startPage{#1}}
+\startPage{}
+\def\terms#1{\def\@terms{#1}}
+\terms{}
+\def\keywords#1{\def\@keywords{#1}}
+\keywords{}
+\renewenvironment{abstract}{\Collect@Body\@saveabstract}{}
+\long\def\@saveabstract#1{\long\gdef\@abstract{#1}}
+\@saveabstract{}
+\long\def\@lempty{}
+\define@boolkey+{@ACM@topmatter@}[@ACM@]{printcss}[true]{%
+ \if@ACM@printcss
+ \ClassInfo{\@classname}{Printing CSS}%
+ \else
+ \ClassInfo{\@classname}{Suppressing CSS}%
+ \fi}{\ClassError{\@classname}{printcss must be 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}}
+\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}}
+\def\settopmatter#1{\setkeys{@ACM@topmatter@}{#1}}
+\settopmatter{printcss=true, printacmref=true}
+\if@ACM@manuscript
+ \settopmatter{printfolios=true}
+\else
+ \if@ACM@journal
+ \settopmatter{printfolios=true}
+ \else
+ \settopmatter{printfolios=false}
+ \fi
+\fi
+\def\@received{}
+\newcommand\received[2][]{\def\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \ifx\@received\@empty
+ \gdef\@received{Received #2}%
+ \else
+ \g@addto@macro{\@received}{; revised #2}%
+ \fi
+ \else
+ \ifx\@received\@empty
+ \gdef\@received{#1 #2}%
+ \else
+ \g@addto@macro{\@received}{; #1 #2}%
+ \fi
+ \fi}
+\AtEndDocument{%
+ \ifx\@received\@empty\else
+ \par\bigskip\noindent\small\normalfont\@received\par
+ \fi}
+\RequirePackage{comment}
+\excludecomment{CCSXML}
+\let\@concepts\@empty
+\newcommand\ccsdesc[2][100]{%
+ \ccsdesc@parse#1~#2~}
+\def\ccsdesc@parse#1~#2~#3~{%
+ \expandafter\ifx\csname CCS@#2\endcsname\relax
+ \expandafter\gdef\csname CCS@#2\endcsname{\textbullet\textbf{#2} $\to$ }%
+ \g@addto@macro{\@concepts}{\csname CCS@#2\endcsname}\fi
+ \expandafter\g@addto@macro\expandafter{\csname CCS@#2\endcsname}{%
+ \ifnum#1>499\textbf{#3; }\else
+ \ifnum#1>299\textit{#3; }\else
+ #3; \fi\fi}}
+\newif\if@printcopyright
+\@printcopyrighttrue
+\newif\if@printpermission
+\@printpermissiontrue
+\newif\if@acmowned
+\@acmownedtrue
+\define@choicekey*{ACM@}{acmcopyrightmode}[%
+ \acm@copyrightinput\acm@copyrightmode]{none,acmcopyright,acmlicensed,%
+ rightsretained,usgov,usgovmixed,cagov,cagovmixed,%
+ licensedusgovmixed,licensedcagovmixed,othergov,licensedothergov}{%
+ \@printpermissiontrue
+ \@printcopyrighttrue
+ \@acmownedtrue
+ \ifnum\acm@copyrightmode=0\relax % none
+ \@printpermissionfalse
+ \@printcopyrightfalse
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=2\relax % acmlicensed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=3\relax % rightsretained
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=4\relax % usgov
+ \@printpermissiontrue
+ \@printcopyrightfalse
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=6\relax % cagov
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=8\relax % licensedusgovmixed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=9\relax % licensedcagovmixed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=10\relax % othergov
+ \@acmownedtrue
+ \fi
+ \ifnum\acm@copyrightmode=11\relax % licensedothergov
+ \@acmownedfalse
+ \fi}
+\def\setcopyright#1{\setkeys{ACM@}{acmcopyrightmode=#1}}
+\setcopyright{acmcopyright}
+\def\@copyrightowner{%
+ \ifcase\acm@copyrightmode\relax % none
+ \or % acmcopyright
+ ACM\@.
+ \or % acmlicensed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % rightsretained
+ Copyright held by the owner/author(s).
+ \or % usgov
+ \or % usgovmixed
+ ACM\@.
+ \or % cagov
+ Crown in Right of Canada.
+ \or %cagovmixed
+ ACM\@.
+ \or %licensedusgovmixed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or %licensedcagovmixed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % othergov
+ ACM\@.
+ \or % licensedothergov
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \fi}
+\def\@formatdoi#1{\url{http://dx.doi.org/#1}}
+\def\@copyrightpermission{%
+ \ifcase\acm@copyrightmode\relax % none
+ \or % acmcopyright
+ Permission to make digital or hard copies of all or part of this
+ work for personal or classroom use is granted without fee provided
+ that copies are not made or distributed for profit or commercial
+ advantage and that copies bear this notice and the full citation on
+ the first page. Copyrights for components of this work owned by
+ others than ACM must be honored. Abstracting with credit is
+ permitted. To copy otherwise, or republish, to post on servers or to
+ redistribute to lists, requires prior specific permission
+ and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % acmlicensed
+ Permission to make digital or hard copies of all or part of this
+ work for personal or classroom use is granted without fee provided
+ that copies are not made or distributed for profit or commercial
+ advantage and that copies bear this notice and the full citation on
+ the first page. Copyrights for components of this work owned by
+ others than the author(s) must be honored. Abstracting with credit
+ is permitted. To copy otherwise, or republish, to post on servers
+ or to redistribute to lists, requires prior specific permission
+ and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % rightsretained
+ Permission to make digital or hard copies of part or all of this work
+ for personal or classroom use is granted without fee provided that
+ copies are not made or distributed for profit or commercial advantage
+ and that copies bear this notice and the full citation on the first
+ page. Copyrights for third-party components of this work must be
+ honored. For all other uses, contact the
+ owner\hspace*{.5pt}/author(s).
+ \or % usgov
+ This paper is authored by an employee(s) of the United States
+ Government and is in the public domain. Non-exclusive copying or
+ redistribution is allowed, provided that the article citation is
+ given and the authors and agency are clearly identified as its
+ source.
+ \or % usgovmixed
+ ACM acknowledges that this contribution was authored or co-authored
+ by an employee, or contractor of the national government. As such,
+ the Government retains a nonexclusive, royalty-free right to
+ publish or reproduce this article, or to allow others to do so, for
+ Government purposes only. Permission to make digital or hard copies
+ for personal or classroom use is granted. Copies must bear this
+ notice and the full citation on the first page. Copyrights for
+ components of this work owned by others than ACM must be
+ honored. To copy otherwise, distribute, republish, or post,
+ requires prior specific permission and\hspace*{.5pt}/or a
+ fee. Request permissions from permissions@acm.org.
+ \or % cagov
+ This article was authored by employees of the Government of Canada.
+ As such, the Canadian government retains all interest in the
+ copyright to this work and grants to ACM a nonexclusive,
+ royalty-free right to publish or reproduce this article, or to allow
+ others to do so, provided that clear attribution is given both to
+ the authors and the Canadian government agency employing them.
+ Permission to make digital or hard copies for personal or classroom
+ use is granted. Copies must bear this notice and the full citation
+ on the first page. Copyrights for components of this work owned by
+ others than the Canadain Government must be honored. To copy
+ otherwise, distribute, republish, or post, requires prior specific
+ permission and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % cagovmixed
+ ACM acknowledges that this contribution was co-authored by an
+ affiliate of the national government of Canada. As such, the Crown
+ in Right of Canada retains an equal interest in the copyright.
+ Reprints must include clear attribution to ACM and the author's
+ government agency affiliation. Permission to make digital or hard
+ copies for personal or classroom use is granted. Copies must bear
+ this notice and the full citation on the first page. Copyrights for
+ components of this work owned by others than ACM must be honored.
+ To copy otherwise, distribute, republish, or post, requires prior
+ specific permission and\hspace*{.5pt}/or a fee. Request permissions
+ from permissions@acm.org.
+ \or % licensedusgovmixed
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of the United States government. As such, the
+ Government retains a nonexclusive, royalty-free right to publish or
+ reproduce this article, or to allow others to do so, for Government
+ purposes only.
+ \or % licensedcagovmixed
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of the national government of Canada. As such, the
+ Government retains a nonexclusive, royalty-free right to publish or
+ reproduce this article, or to allow others to do so, for Government
+ purposes only.
+ \or % othergov
+ ACM acknowledges that this contribution was authored or co-authored
+ by an employee, contractor or affiliate of a national government. As
+ such, the Government retains a nonexclusive, royalty-free right to
+ publish or reproduce this article, or to allow others to do so, for
+ Government purposes only.
+ \or % licensedothergov
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of a national government. As such, the Government
+ retains a nonexclusive, royalty-free right to publish or reproduce
+ this article, or to allow others to do so, for Government purposes
+ only.
+ \fi}
+\def\copyrightyear#1{\def\@copyrightyear{#1}}
+\copyrightyear{\@acmYear}
+\def\@teaserfigures{}
+\newenvironment{teaserfigure}{\Collect@Body\@saveteaser}{}
+\long\def\@saveteaser#1{\g@addto@macro\@teaserfigures{\@teaser{#1}}}
+\renewcommand{\thanks}[1]{%
+ \@ifnotempty{#1}{%
+ \if@ACM@anonymous
+ \g@addto@macro\thankses{\thanks{A note}}%
+ \else
+ \g@addto@macro\thankses{\thanks{#1}}%
+ \fi}}
+\newbox\mktitle@bx
+\def\maketitle{%
+ \if@ACM@anonymous
+ % Anonymize omission of \author-s
+ \ifnum\num@authorgroups=0\author{}\fi
+ \fi
+ \begingroup
+ \let\@footnotemark\@footnotemark@nolink
+ \let\@footnotetext\@footnotetext@nolink
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \@topnum\z@ % this prevents figures from falling at the top of page
+ % 1
+ \hsize=\textwidth
+ \def\@makefnmark{\hbox{\@textsuperscript{\@thefnmark}}}%
+ \@mktitle\if@ACM@sigchiamode\else\@mkauthors\fi\@mkteasers
+ \@printtopmatter
+ \if@ACM@sigchiamode\@mkauthors\fi
+ \setcounter{footnote}{0}%
+ \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}%
+ \@titlenotes
+ \@subtitlenotes
+ \@authornotes
+ \let\@makefnmark\relax \let\@thefnmark\relax
+ \let\@makefntext\noindent
+ \ifx\@empty\thankses\else
+ \footnotetextcopyrightpermission{%
+ \def\par{\let\par\@par}\parindent\z@\@setthanks}%
+ \fi
+ \footnotetextcopyrightpermission{\parindent\z@\parskip0.1\baselineskip
+ \if@ACM@authorversion\else
+ \if@printpermission\@copyrightpermission\par\fi
+ \fi
+ \if@ACM@manuscript\else
+ \if@ACM@journal\else % Print the conference short name
+ {\itshape \acmConference@shortname, \acmConference@venue}\par
+ \fi
+ \fi
+ \if@printcopyright
+ \copyright\ \@copyrightyear\ \@copyrightowner\
+ \else
+ \@copyrightyear.\
+ \fi
+ \if@ACM@manuscript
+ Manuscript submitted to ACM\\
+ \else
+ \if@ACM@authorversion
+ This is the author's version of the work. It is posted here for
+ your personal use. Not for redistribution. The definitive Version
+ of Record was published in
+ \if@ACM@journal
+ \emph{\@journalName}%
+ \else
+ \emph{Proceedings of \acmConference@name, \acmConference@date}%
+ \fi
+ \ifx\@acmDOI\@empty
+ .
+ \else
+ , \@formatdoi{\@acmDOI}.
+ \fi\\
+ \else
+ \if@ACM@journal
+ \@permissionCodeOne/\@acmYear/\@acmMonth-ART\@acmArticle\
+ \$\@acmPrice\\
+ DOI: \nolinkurl{\@acmDOI}%
+ \else % Conference
+ \@acmISBN
+ \ifx\@acmPrice\@empty.\else\dots\$\@acmPrice\fi\\
+ DOI: \nolinkurl{\@acmDOI}%
+ \fi
+ \fi
+ \fi}%
+ \endgroup
+ \setcounter{footnote}{0}%
+ \@mkabstract
+ \if@ACM@printcss
+ \ifx\@concepts\@empty\else\bgroup
+ {\@specialsection{CCS Concepts}%
+ \@concepts\par}\egroup
+ \fi
+ \fi
+ \if\@terms\@empty\else\bgroup
+ {\@specialsection{General Terms}%
+ \@terms\par}\egroup
+ \fi
+ \ifx\@keywords\@empty\else\bgroup
+ {\if@ACM@journal
+ \@specialsection{Additional Key Words and Phrases}%
+ \else
+ \@specialsection{Keywords}%
+ \fi
+ \@keywords}\par\egroup
+ \fi
+ \andify\authors
+ \andify\shortauthors
+ \global\let\authors=\authors
+ \global\let\shortauthors=\shortauthors
+ \if@ACM@printacmref
+ \@mkbibcitation
+ \fi
+ \hypersetup{pdfauthor={\authors},
+ pdftitle={\@title}, pdfkeywords={\@concepts}}%
+ \@printendtopmatter
+ \@afterindentfalse
+ \@afterheading
+}
+\def\@specialsection#1{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \par\medskip\small\noindent#1: %
+ \or % acmsmall
+ \par\medskip\small\noindent#1: %
+ \or % acmlarge
+ \par\medskip\small\noindent#1: %
+ \or % acmtog
+ \par\medskip\small\noindent#1: %
+ \or % sigconf
+ \section*{#1}%
+ \or % siggraph
+ \section*{#1}%
+ \or % sigplan
+ \paragraph*{#1}%
+ \or % sigchi
+ \section*{#1}%
+ \or % sigchi-a
+ \section*{#1}%
+ \fi}
+\def\@printtopmatter{%
+ \ifx\@startPage\@empty
+ \gdef\@startPage{1}%
+ \else
+ \setcounter{page}{\@startPage}%
+ \fi
+ \thispagestyle{firstpagestyle}%
+ \noindent
+ \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
+ \twocolumn[\box\mktitle@bx]%
+ \or % siggraph
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigplan
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigchi
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigchi-a
+ \par\box\mktitle@bx\par\bigskip
+ \if@ACM@badge
+ \marginpar{\noindent
+ \ifx\@acmBadgeL@image\@empty\else
+ \href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \ifx\@acmBadgeR@image\@empty\else
+ \href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}%
+ \fi}%
+ \fi
+ \fi
+}
+\def\@mktitle{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \@mktitle@i
+ \or % acmsmall
+ \@mktitle@i
+ \or % acmlarge
+ \@mktitle@i
+ \or % acmtog
+ \@mktitle@i
+ \or % sigconf
+ \@mktitle@iii
+ \or % siggraph
+ \@mktitle@iii
+ \or % sigplan
+ \@mktitle@iii
+ \or % sigchi
+ \@mktitle@iii
+ \or % sigchi-a
+ \@mktitle@iv
+ \fi
+}
+\def\@titlefont{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \LARGE\bfseries\sffamily
+ \or % acmsmall
+ \LARGE\bfseries\sffamily
+ \or % acmlarge
+ \LARGE\bfseries\sffamily
+ \or % acmtog
+ \Huge\sffamily
+ \or % sigconf
+ \Huge\sffamily\bfseries
+ \or % siggraph
+ \Huge\sffamily\bfseries
+ \or % sigplan
+ \Huge\bfseries
+ \or % sigchi
+ \Huge\sffamily\bfseries
+ \or % sigchi-a
+ \Huge\bfseries
+ \fi}
+\def\@subtitlefont{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \mdseries
+ \or % acmsmall
+ \mdseries
+ \or % acmlarge
+ \mdseries
+ \or % acmtog
+ \LARGE
+ \or % sigconf
+ \LARGE\mdseries
+ \or % siggraph
+ \LARGE\mdseries
+ \or % sigplan
+ \LARGE\mdseries
+ \or % sigchi
+ \LARGE\mdseries
+ \or % sigchi-a
+ \mdseries
+ \fi}
+\def\@mktitle@i{\hsize=\textwidth
+ \@ACM@title@width=\hsize
+ \ifx\@acmBadgeL@image\@empty\else
+ \advance\@ACM@title@width by -\@ACM@badge@width
+ \advance\@ACM@title@width by -\@ACM@badge@skip
+ \fi
+ \ifx\@acmBadgeR@image\@empty\else
+ \advance\@ACM@title@width by -\@ACM@badge@width
+ \advance\@ACM@title@width by -\@ACM@badge@skip
+ \fi
+ \setbox\mktitle@bx=\vbox{\noindent\@titlefont
+ \ifx\@acmBadgeL@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \parbox[t]{\@ACM@title@width}{\raggedright
+ \@titlefont\noindent
+ \@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent{\@subtitlefont\@subtitle}
+ \fi}%
+ \ifx\@acmBadgeR@image\@empty\else
+ \hskip\@ACM@badge@skip
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}}%
+ \fi
+ \par\bigskip}}%
+\def\@mktitle@iii{\hsize=\textwidth
+ \setbox\mktitle@bx=\vbox{\@titlefont\centering
+ \@ACM@title@width=\hsize
+ \if@ACM@badge
+ \advance\@ACM@title@width by -2\@ACM@badge@width
+ \advance\@ACM@title@width by -2\@ACM@badge@skip
+ \parbox[b]{\@ACM@badge@width}{\strut
+ \ifx\@acmBadgeL@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}}%
+ \fi}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \parbox[t]{\@ACM@title@width}{\centering\@titlefont
+ \@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent{\@subtitlefont\@subtitle}
+ \fi
+ }%
+ \if@ACM@badge
+ \hskip\@ACM@badge@skip
+ \parbox[b]{\@ACM@badge@width}{\strut
+ \ifx\@acmBadgeR@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}}%
+ \fi}%
+ \fi
+ \par\bigskip}}%
+\def\@mktitle@iv{\hsize=\textwidth
+ \setbox\mktitle@bx=\vbox{\raggedright\leftskip5pc\@titlefont
+ \noindent\leavevmode\leaders\hrule height 2pt\hfill\kern0pt\par
+ \noindent\@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent\@subtitlefont\@subtitle
+ \fi
+ \par\bigskip}}%
+\newbox\@ACM@commabox
+\def\@ACM@addtoaddress#1{%
+ \ifvmode\else
+ \setbox\@ACM@commabox=\hbox{, }%
+ \unskip\cleaders\copy\@ACM@commabox\hskip\wd\@ACM@commabox
+ \fi
+ #1}
+\if@ACM@journal
+ \let\position\@gobble
+ \def\institution#1{#1\ignorespaces}%
+ \let\department\@gobble
+ \let\streetaddress\@gobble
+ \let\city\@gobble
+ \let\state\@gobble
+ \let\postcode\@gobble
+ \let\country\@gobble
+\else
+ \def\position#1{#1\par}%
+ \def\institution#1{#1\par}%
+ \def\department#1{#1\par}%
+ \def\streetaddress#1{#1\par}%
+ \let\city\@ACM@addtoaddress
+ \let\state\@ACM@addtoaddress
+ \def\postcode#1{\unskip\space#1}%
+ \let\country\@ACM@addtoaddress
+\fi
+\def\@mkauthors{\begingroup
+ \hsize=\textwidth
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \@mkauthors@i
+ \or % acmsmall
+ \@mkauthors@i
+ \or % acmlarge
+ \@mkauthors@i
+ \or % acmtog
+ \@mkauthors@i
+ \or % sigconf
+ \@mkauthors@iii
+ \or % siggraph
+ \@mkauthors@iii
+ \or % sigplan
+ \@mkauthors@iii
+ \or % sigchi
+ \@mkauthors@iii
+ \or % sigchi-a
+ \@mkauthors@iv
+ \fi
+ \endgroup
+}
+\def\@authorfont{\Large\sffamily}
+\def\@affiliationfont{\normalsize\normalfont}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+ \def\@authorfont{\large\sffamily}
+ \def\@affiliationfont{\small\normalfont}
+\or % acmlarge
+\or % acmtog
+ \def\@authorfont{\LARGE\sffamily}
+ \def\@affiliationfont{\large}
+\or % sigconf
+ \def\@authorfont{\LARGE}
+ \def\@affiliationfont{\large}
+\or % siggraph
+ \def\@authorfont{\normalsize\normalfont}
+ \def\@affiliationfont{\normalsize\normalfont}
+\or % sigplan
+ \def\@authorfont{\Large\normalfont}
+ \def\@affiliationfont{\normalsize\normalfont}
+\or % sigchi
+ \def\@authorfont{\bfseries}
+ \def\@affiliationfont{\mdseries}
+\or % sigchi-a
+ \def\@authorfont{\bfseries}
+ \def\@affiliationfont{\mdseries}
+\fi
+\def\@typeset@author@line{%
+ \andify\@currentauthors\par\noindent
+ \@currentauthors\def\@currentauthors{}%
+ \ifx\@currentaffiliations\@empty\else
+ \andify\@currentaffiliations
+ \unskip, {\@currentaffiliations}\par
+ \fi
+ \def\@currentaffiliations{}}
+\def\@mkauthors@i{%
+ \def\@currentauthors{}%
+ \def\@currentaffiliations{}%
+ \global\let\and\@typeset@author@line
+ \def\@author##1{%
+ \ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\@authorfont\MakeUppercase{##1}}%
+ \else
+ \g@addto@macro{\@currentauthors}{\and\MakeUppercase{##1}}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{}%
+ \def\affiliation##1##2{%
+ \def\@tempa{##2}\ifx\@tempa\@empty\else
+ \ifx\@currentaffiliations\@empty
+ \gdef\@currentaffiliations{\@affiliationfont##2}%
+ \else
+ \g@addto@macro{\@currentaffiliations}{\and##2}%
+ \fi
+ \fi
+ \global\let\and\@typeset@author@line}
+ \global\setbox\mktitle@bx=\vbox{\noindent\box\mktitle@bx\par\medskip
+ \noindent\addresses\@typeset@author@line
+ \par\medskip}%
+}
+\newbox\author@bx
+\newdimen\author@bx@wd
+\newskip\author@bx@sep
+\author@bx@sep=1pc\relax
+\def\@typeset@author@bx{\bgroup\hsize=\author@bx@wd\def\and{\par}%
+ \global\setbox\author@bx=\vtop{\if@ACM@sigchiamode\else\centering\fi
+ \@authorfont\@currentauthors\par\@affiliationfont
+ \@currentaffiliation}\egroup
+ \box\author@bx\hspace{\author@bx@sep}%
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}}
+\def\@mkauthors@iii{%
+ \author@bx@wd=\textwidth\relax
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \ifcase\num@authorgroups
+ \relax % 0?
+ \or % 1=one author per row
+ \or % 2=two authors per row
+ \divide\author@bx@wd by \num@authorgroups\relax
+ \or % 3=three authors per row
+ \divide\author@bx@wd by \num@authorgroups\relax
+ \or % 4=two authors per row (!)
+ \divide\author@bx@wd by 2\relax
+ \else % three authors per row
+ \divide\author@bx@wd by 3\relax
+ \fi
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}%
+ \def\@author##1{\ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\par##1}%
+ \else
+ \g@addto@macro\@currentauthors{\par##1}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{\nolinkurl{##2}}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par\nolinkurl{##2}}%
+ \fi}%
+ \def\affiliation##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{##2}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par##2}%
+ \fi
+ \global\let\and\@typeset@author@bx
+}%
+ \hsize=\textwidth
+ \global\setbox\mktitle@bx=\vbox{\noindent
+ \box\mktitle@bx\par\medskip\leavevmode
+ \lineskip=1pc\relax\centering\hspace*{-1em}%
+ \addresses\let\and\@typeset@author@bx\and\par\bigskip}}
+\def\@mkauthors@iv{%
+ \author@bx@wd=\columnwidth\relax
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \ifcase\num@authorgroups
+ \relax % 0?
+ \or % 1=one author per row
+ \else % 2=two authors per row
+ \divide\author@bx@wd by 2\relax
+ \fi
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}%
+ \def\@author##1{\ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\par##1}%
+ \else
+ \g@addto@macro\@currentauthors{\par##1}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{\nolinkurl{##2}}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par\nolinkurl{##2}}%
+ \fi}%
+ \def\affiliation##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{##2}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par##2}%
+ \fi
+ \global\let\and\@typeset@author@bx}%
+ \bgroup\hsize=\columnwidth
+ \par\raggedright\leftskip=\z@
+ \lineskip=1pc\noindent
+ \addresses\let\and\@typeset@author@bx\and\par\bigskip\egroup}
+\def\@authornotemark{\g@addto@macro\@currentauthors{\footnotemark}}
+\def\@mkteasers{%
+ \ifx\@teaserfigures\@empty\else
+ \def\@teaser##1{\par\bigskip\bgroup
+ \captionsetup{type=figure}##1\egroup\par}
+ \global\setbox\mktitle@bx=\vbox{\noindent\box\mktitle@bx\par
+ \noindent\@teaserfigures\par\medskip}%
+ \fi}
+\def\@setaddresses{}
+\def\@mkabstract{\bgroup
+ \ifx\@abstract\@lempty\else
+ {\if@ACM@journal
+ \small\noindent
+ \else
+ \section*{Abstract}%
+ \fi
+ \phantomsection\addcontentsline{toc}{section}{Abstract}%
+ \ignorespaces\@abstract\par}%
+ \fi\egroup}
+\def\@mkbibcitation{\bgroup
+ \def\footnotemark{}%
+ \par\medskip\small\noindent{\bfseries ACM Reference format:}\par\nobreak
+ \noindent\authors. \@acmYear. \@title.
+ \if@ACM@journal
+ \textit{\@journalNameShort}
+ \@acmVolume, \@acmNumber, Article~\@acmArticle\ (\@acmPubDate),
+ \ref{TotPages}~pages.
+ \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 DOI: \nolinkurl{\@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
+ \fi
+}
+\def\@setthanks{\long\def\thanks##1{\par##1\@addpunct.}\thankses}
+\RequirePackage{fancyhdr}
+\if@ACM@review
+ \newsavebox{\ACM@linecount@bx}
+ \savebox{\ACM@linecount@bx}[4em][t]{\parbox[t]{4em}{%
+ \newlength\ACM@linecount@bxht\setlength{\ACM@linecount@bxht}{-\baselineskip}
+ \@tempcnta\@ne\relax
+ \loop{\color{ACMRed}\scriptsize\the\@tempcnta}\\
+ \advance\@tempcnta by \@ne
+ \addtolength{\ACM@linecount@bxht}{\baselineskip}
+ \ifdim\ACM@linecount@bxht<\textheight\repeat}}
+\fi
+\def\ACM@linecount{%
+ \if@ACM@review
+ \begin{picture}(0,0)%
+ \put(-26,-22){\usebox{\ACM@linecount@bx}}%
+ \end{picture}%
+ \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}
+\fancypagestyle{standardpagestyle}{%
+ \fancyhf{}%
+ \renewcommand{\headrulewidth}{\z@}%
+ \renewcommand{\footrulewidth}{\z@}%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \fancyhead[LE]{\ACM@linecount\if@ACM@printfolios\thepage\fi}%
+ \fancyhead[RO]{\if@ACM@printfolios\thepage\fi}%
+ \fancyhead[RE]{\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecount\shorttitle}%
+ \fancyfoot[RO,LE]{\footnotesize Manuscript submitted to ACM}%
+ \or % acmsmall
+ \fancyhead[LE]{\ACM@linecount\@headfootfont\@acmArticle\if@ACM@printfolios:\thepage\fi}%
+ \fancyhead[RO]{\@headfootfont\@acmArticle\if@ACM@printfolios:\thepage\fi}%
+ \fancyhead[RE]{\@headfootfont\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecount\@headfootfont\shorttitle}%
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \or % acmlarge
+ \fancyhead[LE]{\ACM@linecount\@headfootfont
+ \@acmArticle:\if@ACM@printfolios\thepage\quad\textbullet\quad\fi\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecount}%
+ \fancyhead[RO]{\@headfootfont
+ \shorttitle\quad\textbullet\quad\@acmArticle\if@ACM@printfolios:\thepage\fi}%
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \or % acmtog
+ \fancyhead[LE]{\ACM@linecount\@headfootfont
+ \@acmArticle:\if@ACM@printfolios\thepage\quad\textbullet\quad\fi\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecount}%
+ \fancyhead[RO]{\@headfootfont
+ \shorttitle\quad\textbullet\quad\@acmArticle\if@ACM@printfolios:\thepage\fi}%
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \else % Proceedings
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fancyhead[LO]{\ACM@linecount\@headfootfont\shorttitle}%
+ \fancyhead[RE]{\@headfootfont\@shortauthors}%
+ \fancyhead[LE]{\ACM@linecount\@headfootfont\acmConference@shortname,
+ \acmConference@date, \acmConference@venue}%
+ \fancyhead[RO]{\@headfootfont\acmConference@shortname,
+ \acmConference@date, \acmConference@venue}%
+ \fi
+ \if@ACM@sigchiamode
+ \fancyheadoffset[L]{\dimexpr(\marginparsep+\marginparwidth)}%
+ \fi
+}
+\pagestyle{standardpagestyle}
+\newdimen\@folio@wd
+\@folio@wd=\z@
+\newdimen\@folio@ht
+\@folio@ht=\z@
+\newdimen\@folio@voffset
+\@folio@voffset=\z@
+\def\@folio@max{1}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+ \@folio@wd=45.75pt\relax
+ \@folio@ht=1.25in\relax
+ \@folio@voffset=.2in\relax
+ \def\@folio@max{8}
+\or % acmlarge
+ \@folio@wd=43.25pt\relax
+ \@folio@ht=79pt\relax
+ \@folio@voffset=.55in\relax
+ \def\@folio@max{10}
+\fi
+\def\@folioblob{\@tempcnta=\@acmArticleSeq\relax
+ \loop
+ \ifnum\@tempcnta>\@folio@max\relax
+ \advance\@tempcnta by - \@folio@max
+ \repeat
+ \advance\@tempcnta by -1\relax
+ \@tempdima=\@folio@ht\relax
+ \multiply\@tempdima by \the\@tempcnta\relax
+ \advance\@tempdima by -\@folio@voffset\relax
+ \begin{picture}(0,0)
+ \makebox[\z@]{\raisebox{-\@tempdima}{%
+ \rlap{%
+ \raisebox{-0.45\@folio@ht}[\z@][\z@]{%
+ \rule{\@folio@wd}{\@folio@ht}}}%
+ \parbox{\@folio@wd}{%
+ \centering
+ \textcolor{white}{\LARGE\bfseries\sffamily\@acmArticle}}}}
+ \end{picture}}
+
+\fancypagestyle{firstpagestyle}{%
+ \fancyhf{}%
+ \renewcommand{\headrulewidth}{\z@}%
+ \renewcommand{\footrulewidth}{\z@}%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \fancyhead[L]{\ACM@linecount}%
+ \fancyfoot[RO,LE]{\if@ACM@printfolios\small\thepage\fi}%
+ \fancyfoot[RE,LO]{\footnotesize Manuscript submitted to ACM}%
+ \or % acmsmall
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fancyhead[LE]{\ACM@linecount\@folioblob}%
+ \fancyhead[LO]{\ACM@linecount}%
+ \fancyhead[RO]{\@folioblob}%
+ \fancyheadoffset[RO,LE]{0.6\@folio@wd}%
+ \or % acmlarge
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fancyhead[RO]{\@folioblob}%
+ \fancyhead[LE]{\ACM@linecount\@folioblob}%
+ \fancyhead[LO]{\ACM@linecount}%
+ \fancyheadoffset[RO,LE]{1.4\@folio@wd}%
+ \or % acmtog
+ \fancyfoot[RO,LE]{\footnotesize \@journalName, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fancyhead[L]{\ACM@linecount}%
+ \else % Conference proceedings
+ \fancyhead[L]{\ACM@linecount}%
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fi
+}
+\renewcommand\section{\@startsection{section}{1}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\@secfont}}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\@subsecfont}}
+\renewcommand\subsubsection{\@startsection{subsubsection}{3}{10pt}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@subsubsecfont\@adddotafter}}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\parindent}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@parfont\@adddotafter}}
+\renewcommand\part{\@startsection{part}{9}{\z@}%
+ {-10\p@ \@plus -4\p@ \@minus -2\p@}%
+ {4\p@}%
+ {\@parfont}}
+\def\section@raggedright{\@rightskip\@flushglue
+ \rightskip\@rightskip
+ \leftskip\z@skip
+ \parindent\z@}
+\def\@secfont{\sffamily\bfseries\section@raggedright\MakeUppercase}
+\def\@subsecfont{\sffamily\bfseries\section@raggedright}
+\def\@subsubsecfont{\sffamily\itshape}
+\def\@parfont{\itshape}
+\setcounter{secnumdepth}{3}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+ \def\@secfont{\sffamily\large\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\sffamily\large\section@raggedright}
+\or % acmtog
+ \def\@secfont{\sffamily\large\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\sffamily\large\section@raggedright}
+\or % sigconf
+ \def\@secfont{\bfseries\Large\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\bfseries\Large\section@raggedright}
+\or % siggraph
+ \def\@secfont{\bfseries\sffamily\Large\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\bfseries\sffamily\Large\section@raggedright}
+\or % sigplan
+ \def\@secfont{\bfseries\Large\section@raggedright}
+ \def\@subsecfont{\bfseries\section@raggedright}
+ \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\@subsubsecfont}}
+ \def\@subsubsecfont{\bfseries\section@raggedright}
+ \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@parfont\@addspaceafter}}
+ \def\@parfont{\bfseries\itshape}
+ \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\z@}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@subparfont\@addspaceafter}}
+ \def\@subparfont{\itshape}
+\or % sigchi
+ \setcounter{secnumdepth}{1}
+ \def\@secfont{\bfseries\sffamily\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\bfseries\sffamily\section@raggedright}
+\or % sigchi-a
+ \setcounter{secnumdepth}{0}
+ \def\@secfont{\bfseries\sffamily\section@raggedright\MakeUppercase}
+ \def\@subsecfont{\bfseries\sffamily\section@raggedright}
+\fi
+\def\@adddotafter#1{#1\@addpunct{.}}
+\def\@addspaceafter#1{#1\@addpunct{\enspace}}
+\def\@acmplainbodyfont{\itshape}
+\def\@acmplainindent{\parindent}
+\def\@acmplainheadfont{\scshape}
+\def\@acmplainnotefont{\@empty}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@acmplainbodyfont{\itshape}
+ \def\@acmplainindent{\z@}
+ \def\@acmplainheadfont{\bfseries}
+ \def\@acmplainnotefont{\normalfont}
+\or % sigchi
+\or % sigchi-a
+\fi
+\newtheoremstyle{acmplain}%
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space above
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space below
+ {\@acmplainbodyfont}% body font
+ {\@acmplainindent}% indent amount
+ {\@acmplainheadfont}% head font
+ {.}% punctuation after head
+ {.5em}% spacing after head
+ {\thmname{#1}\thmnumber{ #2}\thmnote{ {\@acmplainnotefont(#3)}}}% head spec
+\def\@acmdefinitionbodyfont{\normalfont}
+\def\@acmdefinitionindent{\parindent}
+\def\@acmdefinitionheadfont{\itshape}
+\def\@acmdefinitionnotefont{\@empty}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@acmdefinitionbodyfont{\normalfont}
+ \def\@acmdefinitionindent{\z@}
+ \def\@acmdefinitionheadfont{\bfseries}
+ \def\@acmdefinitionnotefont{\normalfont}
+\or % sigchi
+\or % sigchi-a
+\fi
+\newtheoremstyle{acmdefinition}%
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space above
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space below
+ {\@acmdefinitionbodyfont}% body font
+ {\@acmdefinitionindent}% indent amount
+ {\@acmdefinitionheadfont}% head font
+ {.}% punctuation after head
+ {.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}
+\def\@proofnamefont{\scshape}
+\def\@proofindent{\indent}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@proofnamefont{\itshape}
+ \def\@proofindent{\noindent}
+\or % sigchi
+\or % sigchi-a
+\fi
+\renewenvironment{proof}[1][\proofname]{\par
+ \pushQED{\qed}%
+ \normalfont \topsep6\p@\@plus6\p@\relax
+ \trivlist
+ \item[\@proofindent\hskip\labelsep
+ {\@proofnamefont #1\@addpunct{.}}]\ignorespaces
+}{%
+ \popQED\endtrivlist\@endpefalse
+}
+\specialcomment{acks}{%
+ \begingroup
+ \section*{Acknowledgments}
+ \phantomsection\addcontentsline{toc}{section}{Acknowledgments}
+}{%
+ \endgroup
+}
+\def\grantsponsor#1#2#3{#2}
+\newcommand\grantnum[3][]{#3%
+ \def\@tempa{#1}\ifx\@tempa\@empty\else\space(\url{#1})\fi}
+\if@ACM@screen
+ \includecomment{screenonly}
+ \excludecomment{printonly}
+\else
+ \excludecomment{screenonly}
+ \includecomment{printonly}
+\fi
+\if@ACM@anonymous
+ \excludecomment{anonsuppress}
+ \excludecomment{acks}
+\else
+ \includecomment{anonsuppress}
+\fi
+\newcommand\showeprint[2][arxiv]{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@empty\def\@tempa{arxiv}\fi
+ \def\@tempb{arxiv}%
+ \ifx\@tempa\@tempb
+ arXiv:\href{http://arxiv.org/abs/#2}{#2}\else arXiv:#2%
+ \fi}
+\normalsize\normalfont
+\endinput
+%%
+%% End of file `acmart.cls'.
diff --git a/scribble-lib/scribble/acmart/acmart.css b/scribble-lib/scribble/acmart/acmart.css
@@ -0,0 +1,13 @@
+/* Support for styles in scribble/sigplan */
+
+.SAuthorPlace, .SAuthorEmail,
+.SConferenceInfo, .SCopyrightYear, .SCopyrightData,
+.Sdoi, .SPexclusivelicense,
+.SCategory, .SCategoryPlus, .STerms, .SKeywords {
+ display: none;
+}
+
+.SSubtitle {
+ display: block;
+ font-size: smaller;
+}
diff --git a/scribble-lib/scribble/acmart/acmart.tex b/scribble-lib/scribble/acmart/acmart.tex
@@ -0,0 +1,24 @@
+
+% Support for styles in scribble/acmart
+
+% These are replaced by scribble/acmart/style.tex,
+% which is used in combination with acmart.cls
+
+\newcommand{\SAuthorPlace}[1]{#1}
+\newcommand{\SAuthorEmail}[1]{#1}
+
+\newcommand{\SConferenceInfo}[2]{}
+\newcommand{\SCopyrightYear}[1]{}
+\newcommand{\SCopyrightData}[1]{}
+\newcommand{\Sdoi}[1]{}
+\newcommand{\SPexclusivelicense}[0]{}
+
+\newcommand{\SCategory}[3]{}
+\newcommand{\SCategoryPlus}[4]{}
+\newcommand{\STerms}[1]{}
+\newcommand{\SKeywords}[1]{}
+
+% Normally gets re-written by the title macro:
+\newcommand{\SSubtitle}[1]{{\bf #1}}
+
+
diff --git a/scribble-lib/scribble/acmart/lang.rkt b/scribble-lib/scribble/acmart/lang.rkt
@@ -0,0 +1,136 @@
+#lang racket/base
+(require scribble/doclang
+ scribble/core
+ (except-in scribble/base author title)
+ scribble/acmart
+ scribble/latex-prefix
+ racket/list
+ "../private/defaults.rkt"
+ (for-syntax racket/base))
+(provide (except-out (all-from-out scribble/doclang) #%module-begin)
+ (all-from-out scribble/acmart)
+ (all-from-out scribble/base)
+ (rename-out [module-begin #%module-begin]))
+
+(define-syntax (module-begin stx)
+ (syntax-case stx ()
+ [(_ id . body)
+ (let ([format? #f]
+ [review? #f]
+ [screen? #f]
+ [natbib? #f]
+ [anonymous? #f]
+ [authorversion? #f])
+ (let loop ([stuff #'body])
+ (syntax-case* stuff (manuscript acmsmall acmlarge acmtog sigconf siggraph sigplan sigchi sigchi-a
+ review screen natbib anonymous authorversion)
+ (lambda (a b) (eq? (syntax-e a) (syntax-e b)))
+ [(ws . body)
+ ;; Skip intraline whitespace to find options:
+ (and (string? (syntax-e #'ws))
+ (regexp-match? #rx"^ *$" (syntax-e #'ws)))
+ (loop #'body)]
+
+ ; boolean options
+ [((review #t) . body)
+ (set! review? "review=true")
+ (loop #'body)]
+ [((review #f) . body)
+ (set! review? "review=false")
+ (loop #'body)]
+ [(review . body)
+ (set! review? "review=true")
+ (loop #'body)]
+ [((screen #t) . body)
+ (set! screen? "screen=true")
+ (loop #'body)]
+ [((screen #f) . body)
+ (set! screen? "screen=false")
+ (loop #'body)]
+ [(screen . body)
+ (set! screen? "screen=true")
+ (loop #'body)]
+ [((natbib #t) . body)
+ (set! natbib? "natbib=true")
+ (loop #'body)]
+ [((natbib #f) . body)
+ (set! natbib? "natbib=false")
+ (loop #'body)]
+ [(natbib . body)
+ (set! natbib? "natbib=true")
+ (loop #'body)]
+
+ [((anonymous #t) . body)
+ (set! anonymous? "anonymous=true")
+ (loop #'body)]
+ [((anonymous #f) . body)
+ (set! anonymous? "anonymous=false")
+ (loop #'body)]
+ [(anonymous . body)
+ (set! anonymous? "anonymous=true")
+ (loop #'body)]
+ [((authorversion #t) . body)
+ (set! authorversion? "authorversion=true")
+ (loop #'body)]
+ [((authorversion #f) . body)
+ (set! authorversion? "authorversion=false")
+ (loop #'body)]
+ [(authorversion . body)
+ (set! authorversion? "authorversion=true")
+ (loop #'body)]
+
+
+ ; format options
+ [(manuscript . body)
+ (set! format? "manuscript")
+ (loop #'body)]
+ [(acmsmall . body)
+ (set! format? "acmsmall")
+ (loop #'body)]
+ [(acmlarge . body)
+ (set! format? "acmlarge")
+ (loop #'body)]
+ [(acmtog . body)
+ (set! format? "acmtog")
+ (loop #'body)]
+ [(sigconf . body)
+ (set! format? "sigconf")
+ (loop #'body)]
+ [(sigconf . body)
+ (set! format? "siggraph")
+ (loop #'body)]
+ [(sigplan . body)
+ (set! format? "sigplan")
+ (loop #'body)]
+ [(sigchi . body)
+ (set! format? "sigchi")
+ (loop #'body)]
+ [(sigchi-a . body)
+ (set! format? "sigchi-a")
+ (loop #'body)]
+
+ [body
+ #`(#%module-begin id (post-process #,review? #,screen? #,natbib? #,anonymous? #,authorversion? #,format?) () . body)])))]))
+
+(define ((post-process . opts) doc)
+ (let ([options
+ (if (ormap values opts)
+ (format "[~a]" (apply string-append (add-between (filter values opts) ", ")))
+ "")])
+ (add-acmart-styles
+ (add-defaults doc
+ (string->bytes/utf-8
+ (format "\\documentclass~a{acmart}\n~a"
+ options
+ unicode-encoding-packages))
+ (scribble-file "acmart/style.tex")
+ (list (scribble-file "acmart/acmart.cls"))
+ #f
+ #:replacements (hash "scribble-load-replace.tex" (scribble-file "acmart/acmart-load.tex"))))))
+
+(define (add-acmart-styles doc)
+ ;; Ensure that "acmart.tex" is used, since "style.tex"
+ ;; re-defines commands.
+ (struct-copy part doc [to-collect
+ (cons '(terms) ; FIXME
+ (part-to-collect doc))]))
diff --git a/scribble-lib/scribble/acmart/lang/reader.rkt b/scribble-lib/scribble/acmart/lang/reader.rkt
@@ -0,0 +1,3 @@
+#lang s-exp scribble/base/reader
+scribble/acmart/lang
+#:wrapper1 (lambda (t) (cons 'doc (t)))
diff --git a/scribble-lib/scribble/acmart/style.tex b/scribble-lib/scribble/acmart/style.tex
@@ -0,0 +1,42 @@
+
+% Define \SXtitle to lift \SSubtitle out:
+\def\SXtitle#1{\title{\let\SSubtitle\SSubtitleDrop#1}\SExtractSubtitle#1\SExtractSubtitleDone}
+\def\SSubtitleDrop#1{}
+\def\SExtractSubtitleDone {}
+\def\SExtractSubtitle{\futurelet\next\SExtractSubtitleX}
+\def\SExtractSubtitleX#1{\ifx#1\SSubtitle \let\Snext\SWithSubtitle \else \let\Snext\SExtractSubtitleY \fi \Snext}
+\def\SExtractSubtitleY{\ifx\next\SExtractSubtitleDone \let\Snext\relax \else \let\Snext\SExtractSubtitle \fi \Snext}
+\def\SWithSubtitle#1{\subtitle{#1}\SExtractSubtitle}
+
+\renewcommand{\titleAndVersionAndAuthors}[3]{\SXtitle{#1}#3}
+\renewcommand{\titleAndEmptyVersionAndAuthors}[3]{\titleAndVersionAndAuthors{#1}{#2}{#3}}
+\renewcommand{\titleAndVersionAndEmptyAuthors}[3]{\SXtitle{#1}\author{Anonymous Author(s)}}
+\renewcommand{\titleAndEmptyVersionAndEmptyAuthors}[3]{\titleAndVersionAndEmptyAuthors{#1}{#2}{#3}}
+
+% Support plain `author' while enabling `authorinfo': for each
+% use of \SAuthor, check whether it contains an \SAuthorinfo form:
+\def\SAuthor#1{\author{#1}}
+
+\renewcommand{\SAuthorSep}[1]{}
+
+\renewcommand{\SConferenceInfo}[2]{\conferenceinfo{#1}{#2}}
+\renewcommand{\SCopyrightYear}[1]{\copyrightyear{#1}}
+\renewcommand{\SCopyrightData}[1]{\copyrightdata{#1}}
+%\renewcommand{\Sdoi}[1]{\doi{#1}}
+\renewcommand{\SPexclusivelicense}[0]{\exclusivelicense}
+
+\renewcommand{\SCategory}[3]{\category{#1}{#2}{#3}}
+\renewcommand{\SCategoryPlus}[4]{\category{#1}{#2}{#3}[#4]}
+\renewcommand{\STerms}[1]{\terms{#1}}
+\renewcommand{\SKeywords}[1]{\keywords{#1}}
+
+\newcommand{\StitleShort}[2]{\title[#1]{#2}}
+
+\newcommand{\SacmBadgeRURL}[2]{\acmBadgeR[#1]{#2}}
+\newcommand{\SacmBadgeLURL}[2]{\acmBadgeL[#1]{#2}}
+
+\newcommand{\SgrantnumURL}[3]{\grantnum[#1]{#2}{#3}}
+
+\newcommand{\SreceivedStage}[2]{\received[#1]{#2}}
+
+\newcommand{\SccsdescNumber}[2]{\ccsdesc[#1]{#2}}