\NeedsTeXFormat{LaTeX2e}[2005/12/01] \def\P@banner{The Art, Science, and Engineering of Programming} \ProvidesClass{programming}% [2017/11/16 v1.3a ^^J Articles for \P@banner^^J] %% % `ifplatform` raises a confusing warning when an info would suffice. % We hack the warning out to not confuse users. % begin: hack \RequirePackage{infwarerr} \let\P@PWNL\PackageWarningNoLine\relax% \long\def\PackageWarningNoLine#1#2{% \def\tempa{ifplatform}\def\tempb{#1}% \ifx\tempa\tempb\@PackageInfoNoLine{#1}{#2}% \else\@PackageWarningNoLine{#1}{#2}\fi}% \RequirePackage{hardwrap} \let\PackageWarningNoLine\P@PWNL\relax% % end: hack \GenerateLogMacros{class}[P]{programming} \RequirePackage{etoolbox} \RequirePackage{scrbase}[2014/10/28] \@ifpackagelater{scrbase}{2014/10/28}{}{% \P@error{KOMA-Script too old}{Please upgrade to at least TeXLive 2015 or similar, or upgrade your MiKTeX 2.9 packages.}} %% \RequirePackage{ifthen,ifpdf,ifluatex,ifxetex} \ifthenelse{\boolean{luatex}}% {\IfFileExists{luatex85.sty}% {\RequirePackage{luatex85} \@ifpackagelater{luatex85}{2016/06/15}% {}% creationdate-problem fixed {{\outputmode=1 \xdef\pdfcreationdate{\pdffeedback creationdate}}}} {}}% {} %%%% %% DATA %%%% \newcommand*\P@@DOI@Prefix{10.22152/programming-journal.org/} \providecommand*\P@DOI{} \newcommand*\P@@DOI@Setup{% \xdef\P@DOI{\P@@DOI@Prefix \P@Year/\P@Volume/\P@ArticleNumber}} %% OPTIONS % from scrkbase \DefineFamily{programming} \def\P@Family{\DefineFamilyMember{programming}} \P@Family% \newcommand*{\P@Key}[1][.\@currname.\@currext]{% \DefineFamilyKey[#1]{programming}} \newcommand*{\P@ExecuteOptions}[1][.\@currname.\@currext]{% \FamilyExecuteOptions[#1]{programming}} \newcommand*{\P@Options}{\FamilyOptions{programming}} \let\paperdetails\P@Options \newcommand*{\AfterP@Options}{} \let\AfterP@Options\AtEndOfFamilyOptions \newcommand*{\P@Option}{\FamilyOption{programming}} \newcommand*{\P@newif}{\P@Family\FamilyBoolKey{programming}} \newcommand*{\P@setif}{\FamilySetBool{programming}} \newcommand*{\P@newnum}{\P@Family\FamilyNumericalKey{programming}} \newcommand*{\P@setnum}{\FamilySetNumerical{programming}} \newcommand*{\P@newifStd}[1]{% \newbool{P@#1} \P@newif{#1}{P@#1}} \newcommand*{\P@curropt}{} \newcommand*{\P@StdOption}[3][]{% \let\P@curropt\CurrentOption \DeclareOption{#2}{ #1% \P@ExecuteOptions{#3}} \let\CurrentOption\P@curropt } \newbool{P@submission} \P@Key{phase}[final]{% \ifstr{#1}{final}{\boolfalse{P@submission}}{} \ifstr{#1}{submission}{\booltrue{P@submission}}{} \FamilyKeyStateProcessed} \P@StdOption{submission}{phase=submission} \P@StdOption{crc}{phase=final} \providecommand*{\P@SubmissionKey}{} \def\P@SubmissionKey#1#2{\P@Key{#1}{% \AfterP@Options{\ifthenelse{\boolean{P@submission}}% {#2}{}}}} \providecommand*{\P@CRCKey}{} \def\P@CRCKey#1#2{\P@Key{#1}{% \AfterP@Options{\ifthenelse{\boolean{P@submission}}% {}{#2}}}} \providecommand*\P@codefont{sf} \P@Key{code}{ \P@setnum{code}{@tempa}{% {sf}{0},{sans}{0},{sansserif}{0},% {tt}{1},{mono}{1},{monospace}{1},% {ttx}{2},{monoextended}{2},{monospaceexended}{2},% }{#1} \ifcase \@tempa\relax \renewcommand*\P@codefont{sf} \or \renewcommand*\P@codefont{tt} \or \renewcommand*\P@codefont{ttx} \fi \FamilyKeyStateProcessed} \providecommand*\P@license{by} \newcommand*\P@set@license[1]{% \renewcommand*\P@license{#1} \if@atdocument \setkeys{doclicense}{modifier=#1} \else% \PassOptionsToPackage{doclicense}{modifier=#1}% \fi} \P@Key{license}{ \P@setnum{license}{@tempa}{% {ccby}{0},{cc-by}{0},% {ccbync}{1},{cc-by-nc}{1},% }{#1} \ifcase \@tempa\relax \P@set@license{by} \or \P@set@license{by-nc} \fi \FamilyKeyStateProcessed} \P@StdOption{ccby}{license=ccby} \P@StdOption{ccbync}{license=ccbync} % for paperdetails \providecommand*\P@area{% \P@warning@noline{No area specified}% {\larger\textbf{No area specified. Please add a \texttt{area=..} option to \string\paperdetails{...}.}}} \P@SubmissionKey{area}{\gdef\P@area{#1}\FamilyKeyStateProcessed} \providecommand*\P@perspective{% \P@warning@noline{No perspective selected}% {\larger\textbf{No perspective selected. Please add a \texttt{perspective=...} option to \string\paperdetails{...}.}}}% \P@SubmissionKey{perspective}{ \P@setnum{perspective}{@tempa}{% {art}{0},{theart}{0},% {sciencetheoretical}{1},{theoreticalscience}{1},% {theoretical}{1},{science-theoretical}{1},% {theoretical-science}{1},% {scienceempirical}{2},{empiricalscience}{2},% {empirical}{2},{science-empirical}{2},% {empirical-science}{2},% {engineering}{3},% }{#1} \ifcase \@tempa\relax \renewcommand*\P@perspective{The Art of Programming} \or \renewcommand*\P@perspective{The Theoretical Science of Programming} \or \renewcommand*\P@perspective{The Empirical Science of Programming} \or \renewcommand*\P@perspective{The Engineering of Programming} \fi \FamilyKeyStateProcessed} \P@StdOption{art}{perspective=art} \P@StdOption{theart}{perspective=theart} \P@StdOption{empirical}{perspective=empirical} \P@StdOption{science-empirical}{perspective=science-empirical} \P@StdOption{empirical-science}{perspective=empirical-science} \P@StdOption{theoretical}{perspective=theoretical} \P@StdOption{science-theoretical}{perspective=science-theoretical} \P@StdOption{theoretical-science}{perspective=theoretical-science} \P@StdOption{engineering}{perspective=engineering} \providecommand*\P@Year{} \providecommand*\P@Volume{} \providecommand*\P@Issue{} \providecommand*\P@ArticleNumber{} \newcommand*\P@DOI@BASE{https://doi.org/} \P@CRCKey{year}{\renewcommand*\P@Year{#1}\P@@DOI@Setup\FamilyKeyStateProcessed} \P@CRCKey{volume}{\renewcommand*\P@Volume{#1}\P@@DOI@Setup\FamilyKeyStateProcessed} \P@CRCKey{issue}{\renewcommand*\P@Issue{#1}\P@@DOI@Setup\FamilyKeyStateProcessed} \P@CRCKey{articlenumber}{\renewcommand*\P@ArticleNumber{#1}\P@@DOI@Setup\FamilyKeyStateProcessed} \P@CRCKey{submitted}{\DTMsavedate{P@date@submitted}{#1}\FamilyKeyStateProcessed} \P@CRCKey{published}{\DTMsavedate{P@date@published}{#1}\FamilyKeyStateProcessed} \P@ExecuteOptions{phase=final,code=sf} \FamilyProcessOptions{programming}\relax %% %% CLASS LOADING % \PassOptionsToPackage{latest}{latexrelease} \IfFileExists{latexrelease.sty}% % % Hack. we want the latest, but it spits out a warning that should be an info. % {\bgroup\let\PackageWarningNoLine\@gobbletwo\relax % \RequirePackage{latexrelease}\egroup}% {\PreventPackageFromLoading*[% \typeout{avoid fixltx2e if it does nothing in the first place}]% {fixltx2e}} {\RequirePackage{fixltx2e}}% % don't be too noisy. \PassOptionsToPackage{log-declarations=false}{xparse} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Fixes for intermediate versions. % TL 2015 \@ifpackagelater{scrbase}{2015/09/29}% {}% newer, ok {\def\set@pdftextpagesize{\set@pdftexpagesize}} % TL 2016 \@ifpackagelater{scrbase}{2015/11/22}% {\@ifpackagelater{scrbase}{2016/06/09}% {}% new enough, ok. {% There's a bug in tocbasic that got fixed post TL2016. % see https://sourceforge.net/p/koma-script/code/2475/ % workaround by specifying tocdepths manually. \@namedef{subsectiontocdepth}{2}% \@namedef{subsubsectiontocdepth}{3}% \@namedef{subparagraphtocdepth}{5}}}% {}% old enough, ok \LoadClass{scrartcl} \KOMAoptions{ fontsize=11pt, paper=a4, pagesize=automedia, DIV=9, twoside=semi, twocolumn=false, titlepage=false, footinclude=false, headinclude=false, headings=normal, numbers=noenddot, } \KOMAoption{captions}{nooneline,tableheading} \newcommand*\P@settopbottommargins{% \setlength{\topmargin}{-15pt}% \setlength{\headsep}{20pt}% \setlength{\headheight}{17pt}% \setlength{\footheight}{\headheight}% \setlength{\footskip}{49pt}% \setlength{\marginparpush}{6pt}% \setlength{\marginparwidth}{48pt}% } \AfterCalculatingTypearea{\P@settopbottommargins} \AfterSettingArea{\P@settopbottommargins} \AtEndPreamble{\areaset[current]{\textwidth}{1.61803399\textwidth}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \RequirePackage{babel} \RequirePackage[LGR,OT1,LY1,T1]{fontenc} \ifthenelse{\boolean{xetex}\OR\boolean{luatex}}{}{% %% \RequirePackage[utf8]{inputenx} %% \input{ix-utf8enc.dfu} \RequirePackage{alphabeta}} \RequirePackage{textcomp,textcase,relsize} %%% Clashes with mathdesign \PreventPackageFromLoading{amssymb,amsfont} % % Mathdesign spuriously redefines things it should not. {{{ \csedef{P@MDback@fboxrule}{\the\fboxrule} \csedef{P@MDback@fboxsep}{\the\fboxsep} \csedef{P@MDback@arrayrulewidth}{\the\arrayrulewidth} \cslet{P@MDback@bfdefault}{\bfdefault} \cslet{P@MDback@footnoterule}{\footnoterule} \cslet{P@MDback@hrulefill}{\hrulefill} % \RequirePackage[charter,expert]{mathdesign} % \setlength{\fboxrule}{\csuse{P@MDback@fboxrule}} \setlength{\fboxsep}{\csuse{P@MDback@fboxsep}} \setlength{\arrayrulewidth}{\csuse{P@MDback@arrayrulewidth}} \letcs{\bfdefault}{P@MDback@bfdefault} \letcs{\footnoterule}{P@MDback@footnoterule} \letcs{\hrulefill}{P@MDback@hrulefill} % cleanup \csundef{P@MDback@fboxrule} \csundef{P@MDback@fboxsep} \csundef{P@MDback@arrayrulewidth} \csundef{P@MDback@bfdefault} \csundef{P@MDback@footnoterule} \csundef{P@MDback@hrulefill} % }}} \ifthenelse{\boolean{xetex}\OR\boolean{luatex}}% {\@ifpackagelater{scrbase}{2015/11/22}% {% >= TL 2016; not much is tuenc ready. \PassOptionsToPackage{euenc}{fontspec}} {} \RequirePackage{fontspec}[2013/05/20] \ifthenelse{\boolean{xetex}}% {\setmainfont[Numbers=OldStyle,SmallCapsFeatures={Letters=SmallCaps,LetterSpace=5}]{XCharter}\relax}% {\setmainfont[Numbers=OldStyle]{XCharter}\relax} \def\P@fontscale{MatchLowercase}}% {\RequirePackage[osfI,sups]{XCharter} \def\P@fontscale{.92}} \RequirePackage[scaled=\P@fontscale,semibold]{FiraSans} \ifdefstring{\P@codefont}{sf}% {\global\let\ttfamily\sffamily} {\ifdefstring{\P@codefont}{tt}% {\RequirePackage[scaled=\P@fontscale,lining,nomap]{FiraMono}} {}} \linespread{1.05} \defcaptionname{english}{\figureautorefname}{figure} \defcaptionname{english}{\tableautorefname}{table} \defcaptionname{english}{\lstlistingautorefname}{listing} \defcaptionname{english}{\lstnumberautorefname}{line} \defcaptionname{english}{\subsectionautorefname}{\sectionautorefname} \defcaptionname{english}{\subsubsectionautorefname}{\sectionautorefname} \defcaptionname{english}{\appendixautorefname}{appendix} %%%%%%%%%%%%%%%%%%%%%%%%%%%% \ifthenelse{\boolean{luatex}}% {\RequirePackage[final]{microtype}[2013/05/23]}% {\RequirePackage[final,babel=true]{microtype}[2013/05/23]} \ifthenelse{\boolean{xetex}}% {\let\textls\undefined \DeclareRobustCommand{\textls}[2][80]{% {{\addfontfeature{LetterSpace=\the\numexpr#1/10\relax}#2}}}}% {} \ifthenelse{\boolean{xetex}}% {}% see above {\microtypesetup{letterspace=50} \ifthenelse{\boolean{luatex}}{}{\microtypesetup{tracking}} \DisableLigatures{encoding = *, family = tt* }} \newcommand*\P@CodeSetup{% \ifthenelse{\boolean{xetex}\or\boolean{luatex}}% {\addfontfeatures{Ligatures={NoCommon}}% \ifthenelse{\boolean{luatex}}% {\addfontfeatures{RawFeature={-tlig,-trep}}}% {\addfontfeatures{Mapping=}}}% {}} \AtBeginEnvironment{verbatim}{\microtypesetup{activate=false}\P@CodeSetup} \AfterPackage{url}{ \urlstyle{sf} % path is tt-only and actually, urls are better. \DeclareUrlCommand\path{}% fool emacs: } } \PassOptionsToPackage{log-declarations=false}{xparse} \PassOptionsToPackage{hyphens}{url} \PassOptionsToPackage{all}{hypcap} \PassOptionsToPackage{% final,% unicode=true,% plainpages=false,% pdfpagelabels=true,% breaklinks=true, pdfborder={0 0 0}, bookmarksnumbered = true, pdfpagemode = UseOutlines, }{hyperref} \AtEndPreamble{% \RequirePackage{hyperref}% \RequirePackage{hyperxmp} \RequirePackage{hypcap} \RequirePackage{accsupp} } \RequirePackage[table,svgnames,dvipsnames,x11names]{xcolor} \definecolor{P@Blue}{named}{RoyalBlue} \definecolor{P@ColorOnBlue}{gray}{.95} \definecolor{P@GrayFG}{named}{darkgray} \definecolor{P@GrayBG}{gray}{.90} \newlength{\doclicenseimagewidth} \setlength{\doclicenseimagewidth}{2.7cm} \RequirePackage[ type={CC}, modifier=\P@license, version={4.0}, imagewidth=\doclicenseimagewidth, ]{doclicense} % Fixes for intermediate versions. % TL 2015 % this is actually an installation bug for TL 2015, % but we cannot reliably test that, so we resort to the check % if the package is new enough for TL 2016. \@ifpackagelater{doclicense}{2016/04/24}% {\let\P@doclicenseImage\doclicenseImage}% we're good. {\def\P@doclicenseImage{% \makebox[\doclicenseimagewidth]{% \setlength{\fboxsep}{5pt}% \raisebox{.5\baselineskip}{\colorbox{P@GrayBG}{\Huge\selectfont\doclicenseIcon}}}}} \RequirePackage[tbtags,fleqn]{amsmath} \PassOptionsToPackage{final}{graphicx} \RequirePackage{graphicx,grffile,grfext} % prefer pdf over png \PrependGraphicsExtensions{.pdf,.PDF} % ai's are just pdfs. \ifthenelse{\boolean{xetex}}{ \DeclareGraphicsRule{.ai}{QTm}{*}{} }{ \DeclareGraphicsRule{.ai}{pdf}{*}{} } \AppendGraphicsExtensions{.ai,.AI} \RequirePackage{multirow,tabularx,booktabs,threeparttable} \RequirePackage[figuresright]{rotating} \RequirePackage{caption,subcaption} % subfig \RequirePackage{totpages} \RequirePackage[useregional]{datetime2} \ifthenelse{\boolean{xetex}\or\boolean{luatex}}% {\newfontfamily\firaoldstylemono [ Numbers = {Monospaced,OldStyle}, UprightFont = *-Book , ItalicFont = *-BookItalic , BoldFont = *-Bold , BoldItalicFont = *-BoldItalic , ] {FiraSans}}{} \newcommand*\P@listingnumbersfont{% \sffamily\small\color{P@GrayFG!40}% \ifthenelse{\boolean{xetex}\or\boolean{luatex}}% {\firaoldstylemono} {\tbfigures}}% \RequirePackage{listings} \lstset{% basicstyle=\small\ttfamily,% columns=fullflexible, extendedchars=true, upquote=true, captionpos=t, backgroundcolor=\color{P@GrayBG},% breaklines=true, postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{P@Blue}\hookrightarrow\space}}, numbers=left, numberstyle=\P@listingnumbersfont, numbersep=.5em, frame=single, framerule=0pt} \lst@AddToHook{FontAdjust}{\P@CodeSetup} \lst@AddToHook{DisplayStyle}{\def\baselinestretch{1}\@currsize} \lst@AddToHook{TextStyle}{\lstset{breaklines=false}} % work around listings being too smart \lst@AddToHook{Init}{\let\ttdefault\f@family} \AtEndPreamble{\RequirePackage{siunitx}} \AfterPackage{siunitx}{% \sisetup{ binary-units, detect-all, free-standing-units, space-before-unit, use-xspace, unit-optional-argument, parse-units = false} \AtEndPreamble{ \@ifpackageloaded{pgf}{\SendSettingsToPgf }{} \addto\extrasenglish{\sisetup{locale = US}}}} \PassOptionsToPackage{style=numeric,sortcites}{biblatex} \AfterPackage{biblatex}{ \setcounter{biburllcpenalty}{7000} \setcounter{biburlucpenalty}{8000} \ExecuteBibliographyOptions{ url=true,% abbreviate=false,% maxnames=20} \@ifpackagelater{biblatex}{2016/09/10}% {\ExecuteBibliographyOptions{urldate=edtf,seconds=true}}% {\ExecuteBibliographyOptions{urldate=iso8601}} \PreventPackageFromLoading[\message{% ^^J^^JERROR: You tried to load the cite package that is not compatible with biblatex.^^J^^J% }]{cite} } \AtEndPreamble{ \@ifpackageloaded{biblatex}{}{ % normal bibtex \bibliographystyle{plainurl}}} \setfootnoterule{4cc} \setkomafont{footnoterule}{\color{P@GrayFG}} \setlength{\skip\footins}{2\baselineskip} \setlength{\footskip}{0pt} \addtokomafont{footnote}{\small} \deffootnote[1em]{1.5em}{1em}{\textsuperscript{\thefootnotemark}\,} \RequirePackage{fnpct} \setfnpct{after-punct-space={-.2em}} % koma-hacks \RequirePackage{etoolbox} \AtEndPreamble{\RequirePackage{scrhack}} \setkomafont{pageheadfoot}{\firamedium} \newkomafont{listlabel}{\sffamily\mdseries\color{P@GrayFG}} \addtokomafont{descriptionlabel}{\sffamily\color{P@GrayFG}} \setlength\leftmargini {1.2\parindent} \setlength\leftmarginii {1.2em} \setlength\leftmarginiii{1.2em} \setlength\leftmarginiv {1.2em} \setlength\leftmarginv {1.2em} \setlength\leftmarginvi {1.2em} \setlength{\leftmargin}{\leftmargini} \newcommand*\P@Bullet{\color{P@GrayFG}\rule[1.5pt]{3pt}{3pt}} \renewcommand*\labelenumi{\usekomafont{listlabel}\theenumi.} \renewcommand*\labelenumii{\usekomafont{listlabel}\theenumii.} \renewcommand*\labelenumiii{\usekomafont{listlabel}\theenumiii.} \renewcommand*\labelenumiv{\usekomafont{listlabel}\theenumiv.} \renewcommand*\labelitemi{\usekomafont{listlabel}\P@Bullet}% \renewcommand*\labelitemii{\usekomafont{listlabel}--}% \renewcommand*\labelitemiii{\usekomafont{listlabel}\raisebox{-0.3ex}{\textasteriskcentered}}% \renewcommand*\labelitemiv{\usekomafont{listlabel}\textperiodcentered}% \renewcommand*{\@list@extra}{% \topsep 2pt\parsep\parskip\itemsep 2pt } \AtEndPreamble{% \RedeclareSectionCommand[% beforeskip=-2\baselineskip, afterskip=1\baselineskip]{section} \RedeclareSectionCommand[% beforeskip=-1\baselineskip, afterskip=1\baselineskip]{subsection} \RedeclareSectionCommand[% beforeskip=-1\baselineskip, afterskip=1sp plus -1sp minus 1sp]{subsubsection} \RedeclareSectionCommand[% beforeskip=1\baselineskip]{paragraph} \RedeclareSectionCommand[% beforeskip=1\baselineskip]{subparagraph} } \providecommand*\hairspace{\ifmmode\mskip1mu\else\kern0.08em\fi} \providecommand*\email[1]{\href{mailto:#1}{\nolinkurl{#1}}\xspace} \newenvironment{wide} {\list{}{% \leftmargin-1.5cm \rightmargin\leftmargin} \item\relax} {\endlist} \newcommand*\acks{\paragraph*{Acknowledgements}} \renewcommand*{\sectionformat}{% \colorbox{P@Blue}{% {\hspace*{.15em}% \color{P@ColorOnBlue}% \large\thesection\autodot% \hspace*{.17em}}}% \quad} \usepackage{scrlayer-scrpage} \pagestyle{scrheadings} \clearpairofpagestyles \newlength{\P@corebaselineskip} \setlength{\P@corebaselineskip}{\baselineskip} \newcommand*\P@pagemarkseparator{\kern.06667em :\kern.06667em\relax} \AtBeginDocument{% \setlength{\P@corebaselineskip}{\baselineskip}} \RequirePackage{comment} \excludecomment{CCSXML} \let\@ACMccs\@empty \newcommand*\ccsdesc[2][100]{% \@@ACMccs#2[#1]} \def\@@ACMccs#1~#2[#3]{% \def\@tempa{\relax}% \ifnum#3>299\def\@tempa{\itshape}\fi% \ifnum#3>499\def\@tempa{\bfseries}\fi% % \ifcsdef{@ACMccs@#1}{}{% \def\@tempb{\item{}\begingroup} \eappto{\@tempb}{\expandonce\@tempa} \appto{\@tempb}{#1 → } \global\cslet{@ACMccs@#1}\@tempb \gappto\@ACMccs{\csuse{@ACMccs@#1}\endgroup}}% \csgappto{@ACMccs@#1}{#2; }} \let\P@keywords\@empty \newcommand*\keywords[1]{\gdef\P@keywords{#1}} \addtokomafont{caption}{\small} \addtokomafont{captionlabel}{\sffamily\bfseries} \renewcommand*{\captionformat}{\quad} \newcommand*\P@BlueBox{% \kern0.05em{\color{P@Blue}\rule{0.73em}{0.73em}}% \hspace*{0.67em}} \DeclareCaptionLabelFormat{withbox}{% \P@BlueBox\bothIfFirst{#1}{~}#2} \captionsetup{labelformat=withbox} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% %%%% Authors and Affiliation \newkomafont{affiliation}{\footnotesize} \providecommand*\P@last@author{} \providecommand*\P@authors{} \newcounter{P@authors} \providecommand*\P@affiliations{} \newcounter{P@affiliations} \providecommand*\P@authorinfos{} \newcommand*\P@author@link[1]{% \texorpdfstring% {\hyperlink{P:authorinfo:\detokenize{#1}}{#1}}% {#1}}% \newcommand*\P@author@[2][]{% \gdef\P@last@author{#2}% \listgadd\P@authors{% \P@author@link{#2}\ignorespaces% \P@affil{#1}\relax}% \stepcounter{P@authors}% \P@author@serialize% } \newcommand*\P@author@@{% \addtocounter{P@affiliations}{1}% \edef\@tempa{\alph{P@affiliations}}% \addtocounter{P@affiliations}{-1}% \expandafter\P@author@\expandafter[\@tempa]} \renewcommand*\author{% \@ifnextchar[ %] \P@author@% \P@author@@} % Long. \newcommand\authorinfo[2][]{% \expandafter\listgadd% \expandafter\P@authorinfos% \expandafter{% \expandafter{\P@last@author}{#1}{#2}}} \newlength{\P@authorinfo@imagewidth} \newlength{\P@current@parindent} \setlength{\P@authorinfo@imagewidth}{2.5cm} \newcommand\P@makeauthorinfo[3]{% \begingroup% \setlength\P@current@parindent\parindent \noindent% \begin{minipage}[t]{\dimexpr\linewidth - \P@authorinfo@imagewidth - 2\columnsep\relax} \setlength\parindent\P@current@parindent \vspace*{0pt}% \noindent% \strut\hypertarget{P:authorinfo:\detokenize{#1}}{\textbf{#1}}\space\ignorespaces #3\par \end{minipage}% \hspace*{1.5\columnsep}% \begin{minipage}[t]{\P@authorinfo@imagewidth}% \vspace*{0pt} \ifstrempty{#2}{\hfil}{% \includegraphics[width=\P@authorinfo@imagewidth]{#2}}% \end{minipage}% \par\vspace{\baselineskip} \endgroup} \providecommand*\abouttheauthorsname{% About the author\ifnum 1<\value{P@authors}s\fi} \newcommand*\P@printauthorinfos{% \ifdefvoid{\P@authorinfos}{}\P@@printauthorinfos} \newcommand*\P@@printauthorinfos{% \begingroup \clearpage% \phantomsection \addcontentsline{toc}{section}{\abouttheauthorsname} \section*{\abouttheauthorsname} \renewcommand\do[1]{\P@makeauthorinfo##1} \dolistloop{\P@authorinfos} \endgroup} \AtEndDocument{\P@printauthorinfos} \newcommand*\affiliation[2][]{% \begingroup \def\@tempa{#1} \stepcounter{P@affiliations}% \ifdefempty{\@tempa}{\edef\@tempa{\alph{P@affiliations}}}{}% \expandafter\listgadd% \expandafter\P@affiliations% \expandafter{% \expandafter{\@tempa}{#2}} \endgroup} \newcommand*\printaffiliations{% \begin{list}{}{% \setlength{\topsep}{0pt}% \setlength{\partopsep}{0pt}% \setlength{\parskip}{0pt}% \setlength{\labelsep}{0pt}% \setlength{\labelwidth}{1.5em}% \setlength{\leftmargin}{\labelwidth}} \def\makelabel##1{\rlap{##1}\hss} \def\@tempa##1##2{\item[##1]{##2}} \renewcommand*{\do}[1]{\@tempa##1} \dolistloop{\P@affiliations} \end{list}\ignorespaces} \newcommand*\P@and{,\space} \newcommand*\P@midand{\space and\space} \newcommand*\P@lastand{, and\space} \let\and\P@and \let\midand\P@midand \let\lastand\P@lastand \let\P@affil\@gobble \newcommand\P@author@serialize{% \gdef\@author{} \def\P@i{1} \forlistloop{% \ifnumequal{1}{\P@i}% {}% nothing {\ifnumless{\P@i}{\value{P@authors}}% {\xappto\@author\and}% {\ifnumequal{2}{\P@i}% {\xappto\@author\midand}% {\xappto\@author\lastand}}} \edef\P@i{\number\expandafter\numexpr\P@i + 1\relax} \gappto\@author}{\P@authors}} \newtoks\authorrunning \newtoks\titlerunning \providecommand*\@authorrunning{\@author} \providecommand*\@titlerunning{\@title} \rohead{\usekomafont{pageheadfoot}\@authorrunning} \lehead{\usekomafont{pageheadfoot}\@titlerunning} \setkomafont{pagenumber}{\firamedium} \cfoot{% \ifdefvoid\P@ArticleNumber{}{% \usekomafont{pagenumber}\mdseries\P@ArticleNumber\P@pagemarkseparator}% \pagemark} %% %% \newcommand*\P@firstpage{\pageref{P:firstpage}} \newcommand*\P@lastpage{\pageref{TotPages}} \defpagestyle{P@titlepage}{{}{}{}}{% {}{% \begin{minipage}[b][0pt][b]{\textwidth} \null\noindent% \normalfont% \hspace{-1mm}\P@doclicenseImage% \hfill% \begin{minipage}[b]% {\dimexpr\linewidth - \doclicenseimagewidth - 1\columnsep\relax}% \ignorespaces \scriptsize% \textcopyright\ {\@author}\\ \doclicenseText\\ \ifthenelse{\boolean{P@submission}}% {Submitted to \textit{\P@banner}.}% {In \textit{\P@banner}\ignorespaces% \ifcsvoid{P@Volume}{}{, vol.\,\P@Volume\ignorespaces}% \ifcsvoid{P@Issue}{}{, no.\,\P@Issue\ignorespaces}% \ifcsvoid{P@Year}{}{, \P@Year\ignorespaces}% \ifcsvoid{P@ArticleNumber}{}{, article \P@ArticleNumber}% ; \P@lastpage\space pages.}% \end{minipage}% \end{minipage} }{} } \renewcommand*{\titlepagestyle}{P@titlepage} \addtokomafont{title}{\Large\sffamily\bfseries\mathversion{bold}} \addtokomafont{author}{\large} \renewcommand*\@maketitle{% \label{P:firstpage}% \unskip% just in case \begingroup \parindent\z@ \raggedright% \normalfont% \raggedright% {\usekomafont{title}\@title\par}% \ifdefvoid\@subtitle{}{% {\usekomafont{subtitle}\selectfont% \vskip .5\baselineskip% \@subtitle \par}} \bigskip% % {\let\P@affil\textsuperscript \usekomafont{author}\@author \par} \smallskip% % {\usekomafont{affiliation}% \printaffiliations}% \endgroup % \if!\the\authorrunning!\relax\else \xdef\@authorrunning{\the\authorrunning}\fi \if!\the\titlerunning!\else\relax \xdef\@titlerunning{\the\titlerunning}\fi \begingroup \let\@@author\@author \def\and{, }\def\midand{, }\def\lastand{, } \P@author@serialize \hypersetup{pdfauthor=\@author} \global\let\@author\@@author \hypersetup{pdfkeywords = {\P@keywords}} \ifdefvoid{\@subtitle}% {\hypersetup{pdftitle={\@title}}}% {\hypersetup{pdftitle={\@title: \@subtitle}}}% \relax% \hypersetup{pdfcreator={programming},pdfproducer={programming}}% WOAMI \ifthenelse{\boolean{pdf}}% {\ifthenelse{\boolean{luatex}}% {\gdef\P@aftertitle{\directlua{pdf.setsuppressoptionalinfo(15)}}}% {\gdef\P@aftertitle{\ifx\pdfsuppressptexinfo\undefined\relax\else\global\pdfsuppressptexinfo=-1\fi}}}% {\gdef\P@aftertitle{}}% \aftergroup\P@aftertitle\relax \endgroup% \global\let\P@affil\@gobble% } \newcommand*\P@headersection[1]{% \par\vspace*{.5\baselineskip}% \footnotesize\sffamily% \noindent{\bfseries\color{P@GrayFG} #1}\enspace} \newkomafont{abstract}{\fontsize{8.5}{10}\selectfont} \renewenvironment{abstract}% {\par\smallskip% \begingroup \newcommand\P@gobblepar[1]{\@ifnextchar\par{\P@gobblepar}{}} {\P@headersection{\abstractname}} \begingroup\usekomafont{abstract} \@ifnextchar\par{\P@gobblepar}{}% }{% \par \endgroup \begingroup \raggedright \ifcsvoid{@ACMccs}{}{% {\P@headersection{ACM CCS 2012} \begin{itemize}\@ACMccs\end{itemize}% \vspace{-\topsep}}}% \ifcsvoid{P@keywords}{}{% {\P@headersection{Keywords} \P@keywords}}% \par% \vfill% \noindent\null\begin{minipage}[t][6\P@corebaselineskip][t]{\linewidth}{}% \vspace*{0pt}% \ifthenelse{\value{page} > 1}{\P@warning{% Your abstract seems to extend over the first page. Please consider adding \string\smaller\ right after \string\begin{abstract}. }}{}% {\microtypesetup{activate=false}% \Large\selectfont \P@banner\par} {\color{P@Blue}\rule{\linewidth}{.5\P@corebaselineskip}\par}% \sffamily \ifthenelse{\boolean{P@submission}}{% {{\P@headersection{\rlap{Perspective}\phantom{Area of Submission}}}{\normalsize\P@perspective}}\strut% {{\P@headersection{Area of Submission}}{\normalsize\P@area}}\strut% }{% \DTMifsaveddate{P@date@submitted}{% {{\P@headersection{{Submitted}}} \DTMUsedate{P@date@submitted}}}{}\strut% \DTMifsaveddate{P@date@published}{% {{{\P@headersection{\rlap{Published}\phantom{Submitted}}} \DTMUsedate{P@date@published}}}}{}\strut% \ifcsvoid{P@DOI}{}{% {{\P@headersection{\rlap{\textsc{doi}}\phantom{Submitted}}} \href{\P@DOI@BASE\P@DOI}{\P@DOI}}}% }\par \vfill \end{minipage} % \setlength{\skip\footins}{.5\baselineskip} \endgroup \endgroup \clearpage \ignorespaces} % From the TeX FAQ \renewcommand{\topfraction}{.85} \renewcommand{\bottomfraction}{.7} \renewcommand{\textfraction}{.15} \renewcommand{\floatpagefraction}{.66} \renewcommand{\dbltopfraction}{.66} \renewcommand{\dblfloatpagefraction}{.66} \setcounter{topnumber}{9} \setcounter{bottomnumber}{9} \setcounter{totalnumber}{20} \setcounter{dbltopnumber}{9} % \emergencystretch=1em \clubpenalty10000 \widowpenalty10000 \displaywidowpenalty=10000 \frenchspacing \raggedbottom \tolerance=100 \emergencystretch=2pt \endinput % EOF