blob: fd598a56e404eb5befaa7bba74bedecb29c3bddf [file] [log] [blame]
\documentclass[10pt,letterpaper]{pfbook} % book class customized for perfbook
% For arxiv.org, must be on or before line 5:
\pdfoutput=1
% To accomodate change in Ghostscript 9.26 (default output: PDF 1.7)
\pdfminorversion=7
% Suppress warning emitted when multiple figures drawn by inkscape appear
% within a page. See: https://tex.stackexchange.com/questions/183149/
\ifdefined\pdfsuppresswarningpagegroup \pdfsuppresswarningpagegroup=1 \fi
% standard packages
% A more pleasant font
\usepackage[full]{textcomp} % use symbols in TS1 encoding
\usepackage{lmodern}
\usepackage[scale=0.9]{tgheros}
\usepackage[T1]{fontenc} % use postscript type 1 fonts
\usepackage[table,svgnames]{xcolor} % newtxtext v1.73 loads xcolor without options
\usepackage[defaultsups,helvratio=0.9]{newtxtext} % use nice, standard fonts for roman
% Improves the text layout
\usepackage{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
\usepackage{etoolbox}
%\usepackage{fixltx2e} % for \textsubscript, nop since Tex Live 2015
\usepackage{float}
\floatstyle{ruled}
\newfloat{listing}{tbp}{lst}[chapter]
\floatname{listing}{Listing}
\usepackage{lscape}
\usepackage{epsfig}
\usepackage{subfig}
\newsubfloat{listing}
\captionsetup{labelfont=bf}
\captionsetup[listing]{font=small,labelsep=colon}
\captionsetup[subfloat]{font=small}
% \usepackage{breakurl}
\usepackage{graphicx}
\usepackage{rotating}
\usepackage{setspace}
\usepackage[shortlabels,inline]{enumitem}
\setlist[description]{style=unboxed}
\newlist{sequence}{enumerate}{10}
\setlist[sequence]{label*=\arabic*}
%\usepackage{enumerate}
\usepackage{ifthen}
\usepackage[shortcuts]{extdash}
\usepackage{changepage}
\usepackage{listings}
\lstset{basicstyle=\ttfamily}
% \usepackage[strings]{underscore}
% \usepackage{underscore}
\usepackage{pifont} % symbols for qqz reference points and carriagereturn
\usepackage{gensymb} % symbols for both text and math modes such as \degree and \micro
\usepackage{verbatimbox}[2014/01/30] % for centering verbatim listing in figure environment
\usepackage{amsmath} % lineno v5.0 (loaded via fvextra) needs amsmath in front
\usepackage{fancyvrb}
\usepackage{fvextra}[2016/09/02]
\usepackage[bottom]{footmisc} % place footnotes under floating figures/tables
\usepackage{tabularx}
\usepackage[hyphens]{url}
\usepackage{threeparttable}
\usepackage{titlesec}[2016/03/21] % Suppress number in paragraph heading
\usepackage{fmtcount}
\usepackage{draftwatermark}[2015/02/19]
\SetWatermarkAngle{0.0}
\SetWatermarkFontSize{8pt}
\SetWatermarkScale{1.0}
\SetWatermarkLightness{.6}
\SetWatermarkHorCenter{.85\paperwidth}
\SetWatermarkVerCenter{.95\paperheight}
\SetWatermarkText{\texttt{\commitid}}
\usepackage[breakable,skins]{tcolorbox}
\usepackage[split,makeindex]{splitidx}
\usepackage[nottoc]{tocbibind}
\usepackage[columns=3,totoc,indentunit=12pt,justific=raggedright,font=small,columnsep=.15in]{idxlayout}
\usepackage{parnotes} % for footnotes in tabularx
\usepackage[bookmarks=true,bookmarksnumbered=true,pdfborder={0 0 0},linktoc=all,pdfusetitle]{hyperref}
\usepackage{footnotebackref} % to enable cross-ref of footnote
\usepackage[all]{hypcap} % for going to the top of figure and table
\usepackage{mfirstuc}[=v2.07] % v2.08 or later is not compatible with our
% indexing macros
% rollback glossaries related packages as well
\usepackage[toc,nopostdot,acronym]{glossaries}[=v4.49]
\usepackage{glossaries-extra}[=v1.48]
\usepackage[longragged]{glossaries-extra-stylemods}[=v1.48]
\usepackage{epigraph}[2020/01/02] % latest version prevents orphaned epigraph
\setlength{\epigraphwidth}{2.6in}
\usepackage[xspace]{ellipsis}
\usepackage{braket} % for \ket{} macro in QC section
\usepackage{siunitx} % for \num{} macro
\sisetup{group-minimum-digits=4,group-separator={,},group-digits=integer}
\usepackage{multirow}
\usepackage{noindentafter}
\NoIndentAfterCmd{\epigraph}
\usepackage[all]{nowidow}
\titleformat{\paragraph}[runin]{\normalfont\normalsize\bfseries}{}{0pt}{}
% custom packages
\newboolean{qqzbg}
\setboolean{qqzbg}{true} % overriden by target specific setting
\newcommand{\IfQqzBg}[2]{\ifthenelse{\boolean{qqzbg}}{#1}{#2}}
\newboolean{noqqz}
\setboolean{noqqz}{false}
\newcommand{\IfNoQqz}[2]{\ifthenelse{\boolean{noqqz}}{#1}{#2}}
\input{autodate} % need to input here to reflect tag state
\usepackage{qqz}
\usepackage{origpub}
% custom booleans
\newboolean{inbook}
\setboolean{inbook}{true}
\newcommand{\IfInBook}[2]{\ifthenelse{\boolean{inbook}}{#1}{#2}}
\newboolean{twocolumn}
\setboolean{twocolumn}{true}
\newcommand{\IfTwoColumn}[2]{\ifthenelse{\boolean{twocolumn}}{#1}{#2}}
\newboolean{hardcover}
\setboolean{hardcover}{false}
\newcommand{\IfHardCover}[2]{\ifthenelse{\boolean{hardcover}}{#1}{#2}}
\newboolean{ebooksize}
\setboolean{ebooksize}{false}
\newcommand{\IfEbookSize}[2]{\ifthenelse{\boolean{ebooksize}}%
{\ignorespaces#1\ignorespaces}{\ignorespaces#2\ignorespaces}}
\newboolean{afourpaper}
\setboolean{afourpaper}{false}
\newcommand{\IfAfourPaper}[2]{\ifthenelse{\boolean{afourpaper}}{#1}{#2}}
\newboolean{sansserif}
\setboolean{sansserif}{false}
\newcommand{\IfSansSerif}[2]{\ifthenelse{\boolean{sansserif}}%
{\ignorespaces#1\ignorespaces}{\ignorespaces#2\ignorespaces}}
\newboolean{lmttforcode}
\setboolean{lmttforcode}{true}
\newcommand{\IfLmttForCode}[2]{\ifthenelse{\boolean{lmttforcode}}{#1}{#2}}
\newboolean{tblcptop}
\setboolean{tblcptop}{true}
\newcommand{\IfTblCpTop}[2]{\ifthenelse{\boolean{tblcptop}}{#1}{#2}}
\newboolean{nimbusavail}
\setboolean{nimbusavail}{false}
\newcommand{\IfNimbusAvail}[2]{\ifthenelse{\boolean{nimbusavail}}{#1}{#2}}
\newboolean{colorlinks}
\setboolean{colorlinks}{false}
\newcommand{\IfColorLinks}[2]{\ifthenelse{\boolean{colorlinks}}{#1}{#2}}
\newboolean{toarxiv}
\setboolean{toarxiv}{false}
\newcommand{\IfToArxiv}[2]{\ifthenelse{\boolean{toarxiv}}{#1}{#2}}
\newboolean{indexon}
\setboolean{indexon}{true}
\newcommand{\IfIndexOn}[2]{\ifthenelse{\boolean{indexon}}{#1}{#2}}
\newboolean{indexhl}
\setboolean{indexhl}{false}
\newcommand{\IfIndexHl}[2]{\ifthenelse{\boolean{indexhl}}{#1}{#2}}
\newboolean{indexhier}
\setboolean{indexhier}{true}
\newcommand{\IfIndexHier}[2]{\ifthenelse{\boolean{indexhier}}{#1}{#2}}
% Tweak width params of TOC
\makeatletter
\IfEbookSize{ % for ebook size build (more than 1000 pages)
\renewcommand*\@pnumwidth{2.2em}
}{}
% default params defined in book.sty:
% width of chapter (two digits): 1.5em
% indent of section: 1.5em
% width of section (three digits + one periods): 2.3em
% indent of subsection: 3.8em
% width of subsection (four digits + two periods): 3.2em
\IfSansSerif{ % sans serif (Helvetica clone)
% to cover section "E.10" and subsection "15.5.10",
% width of section: 2.4em
% width of subsection: 3.7em
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.4em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{3.9em}{3.7em}}
}{ % serif (Times Roman clone)
% to cover subsection "15.5.10",
% width of subsection: 3.4em
\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.4em}}
}
\makeatother
\IfEbookSize{
\usepackage[section]{placeins}
}{
\usepackage{placeins}
}
% Custom commands for index
\newindex[API Index]{api} % index for API
\newindex[People Name Index]{ppl} % index for People Name
\newcommand{\categapi}[1]{~{\scriptsize (#1)}}
\IfIndexHl{
\newcommand{\hlindex}[1]{\textcolor{DarkGreen}{#1}}
}{
\newcommand{\hlindex}[1]{#1}
}
% For consistent index entries of capitalization of "Index entry"
\newcommand{\ucindex}[1]{%
\lowercase{\def\temp{#1}}%
\expandafter\index\expandafter{\temp@\makefirstuc{\temp}}%
}
\newcommand{\ucindexh}[2]{%
\lowercase{\def\temp{#1}}%
\lowercase{\def\tempb{#2}}%
\expandafter\index\expandafter{\temp@\makefirstuc{\temp}!\tempb}%
}
\newcommand{\ucindexhm}[2]{%
\lowercase{\def\temp{#1}}%
\expandafter\index\expandafter{\temp@\makefirstuc{\temp}!#2}%
}
\newcommand{\indexhraw}[2]{%
\expandafter\index\expandafter{#1!#2}%
}
\IfIndexHier{
\newcommand{\indexh}[3]{\ucindexh{#2}{#3}}
\newcommand{\indexhr}[3]{\indexhraw{#2}{#3}}
\newcommand{\indexhmr}[3]{\ucindexhm{#2}{#3}}
}{
\newcommand{\indexh}[3]{\ucindex{#3 #2}}
\newcommand{\indexhr}[3]{\index{#1}}
\newcommand{\indexhmr}[3]{\index{#1}}
}
\newcommand{\IX}[1]{\ucindex{#1}\hlindex{#1}} % put with first letter capitalized into general index
\newcommand{\IXr}[1]{\index{#1}\hlindex{#1}} % put as is into general index
\newcommand{\IXpl}[1]{\ucindex{#1}\hlindex{#1s}} % put with first letter capitalized into general index for plural
\newcommand{\IXplr}[1]{\index{#1}\hlindex{#1s}} % put as is into general index for plural
\newcommand{\IXplx}[2]{\ucindex{#1}\hlindex{#1#2}} % put as is into general index for plural of exeptional form
\newcommand{\IXalt}[2]{\ucindex{#2}\hlindex{#1}} % put alternative with first letter capitalized into general index
\newcommand{\IXaltr}[2]{\index{#2}\hlindex{#1}} % put alternative as is into general index
\newcommand{\IXh}[2]{\indexh{#1 #2}{#2}{#1}\hlindex{#1 #2}}
\newcommand{\IXhpl}[2]{\indexh{#1 #2}{#2}{#1}\hlindex{#1 #2s}}
\newcommand{\IXhr}[2]{\indexhr{#1 #2}{#2}{#1}\hlindex{#1 #2}}
\newcommand{\IXhrpl}[2]{\indexhr{#1 #2}{#2}{#1}\hlindex{#1 #2s}}
\newcommand{\IXhmr}[2]{\indexhmr{#1 #2}{#2}{#1}\hlindex{#1 #2}}
\newcommand{\IXhmrpl}[2]{\indexhmr{#1 #2}{#2}{#1}\hlindex{#1 #2s}}
\newcommand{\IXalth}[3]{\indexh{#1}{#3}{#2}\hlindex{#1}}
\newcommand{\IXalthr}[3]{\indexhr{#1}{#3}{#2}\hlindex{#1}}
\newcommand{\IXalthmr}[3]{\indexhmr{#1}{#3}{#2}\hlindex{#1}}
% page number in bold face
\newcommand{\BF}[1]{\textbf{#1}}
\newcommand{\IXB}[1]{\ucindex{#1|BF}\hlindex{#1}} % put with first letter capitalized into general index
\newcommand{\IXBr}[1]{\index{#1|BF}\hlindex{#1}} % put as is into general index
\newcommand{\IXBpl}[1]{\ucindex{#1|BF}\hlindex{#1s}} % put with first letter capitalized into general index for plural
\newcommand{\IXBplr}[1]{\index{#1|BF}\hlindex{#1s}} % put as is into general index for plural
\newcommand{\IXBplx}[2]{\ucindex{#1|BF}\hlindex{#1#2}} % put as is into general index for plural of exeptional form
\newcommand{\IXBalt}[2]{\ucindex{#2|BF}\hlindex{#1}} % put alternative with first letter capitalized into general index
\newcommand{\IXBaltr}[2]{\index{#2|BF}\hlindex{#1}} % put alternative as is into general index
\newcommand{\IXBh}[2]{\indexh{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2}}
\newcommand{\IXBhpl}[2]{\indexh{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2s}}
\newcommand{\IXBhr}[2]{\indexhr{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2}}
\newcommand{\IXBhrpl}[2]{\indexhr{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2s}}
\newcommand{\IXBhmr}[2]{\indexhmr{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2}}
\newcommand{\IXBhmrpl}[2]{\indexhmr{#1 #2|BF}{#2|BF}{#1}\hlindex{#1 #2s}}
\newcommand{\IXBalth}[3]{\indexh{#1|BF}{#3|BF}{#2}\hlindex{#1}}
\newcommand{\IXBalthr}[3]{\indexhr{#1|BF}{#3|BF}{#2}\hlindex{#1}}
\newcommand{\IXBalthmr}[3]{\indexhmr{#1|BF}{#3|BF}{#2}\hlindex{#1}}
% page number for Glossary items or the likes
\newcommand{\GL}[1]{\underline{#1}}
\newcommand{\IXG}[1]{\ucindex{#1|GL}\hlindex{#1}} % put with first letter capitalized into general index
\newcommand{\IXGr}[1]{\index{#1|GL}\hlindex{#1}} % put as is into general index
\newcommand{\IXGpl}[1]{\ucindex{#1|GL}\hlindex{#1s}} % put with first letter capitalized into general index for plural
\newcommand{\IXGplr}[1]{\index{#1|GL}\hlindex{#1s}} % put as is into general index for plural
\newcommand{\IXGplx}[2]{\ucindex{#1|GL}\hlindex{#1#2}} % put as is into general index for plural of exeptional form
\newcommand{\IXGalt}[2]{\ucindex{#2|GL}\hlindex{#1}} % put alternative with first letter capitalized into general index
\newcommand{\IXGaltr}[2]{\index{#2|GL}\hlindex{#1}} % put alternative as is into general index
\newcommand{\IXGh}[2]{\indexh{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2}}
\newcommand{\IXGhpl}[2]{\indexh{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2s}}
\newcommand{\IXGhr}[2]{\indexhr{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2}}
\newcommand{\IXGhrpl}[2]{\indexhr{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2s}}
\newcommand{\IXGhmr}[2]{\indexhmr{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2}}
\newcommand{\IXGhmrpl}[2]{\indexhmr{#1 #2|GL}{#2|GL}{#1}\hlindex{#1 #2s}}
\newcommand{\IXGalth}[3]{\indexh{#1|GL}{#3|GL}{#2}\hlindex{#1}}
\newcommand{\IXGalthr}[3]{\indexhr{#1|GL}{#3|GL}{#2}\hlindex{#1}}
\newcommand{\IXGalthmr}[3]{\indexhmr{#1|GL}{#3|GL}{#2}\hlindex{#1}}
%
\newcommand{\apic}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{c}}}
\newcommand{\apig}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{g}}}
\newcommand{\apipx}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{px}}}
\newcommand{\apik}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{k}}}
\newcommand{\apikh}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{kh}}}
\newcommand{\apipf}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{pf}}}
\newcommand{\apiur}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}\categapi{ur}}}
\newcommand{\api}[1]{\hlindex{\co{#1}}\sindex[api]{#1@\co{#1}}}
\newcommand{\apialtc}[2]{\hlindex{\co{#1}}\sindex[api]{#2@\co{#2}\categapi{c}}}
\newcommand{\apialtg}[2]{\hlindex{\co{#1}}\sindex[api]{#2@\co{#2}\categapi{g}}}
\newcommand{\apialtk}[2]{\hlindex{\co{#1}}\sindex[api]{#2@\co{#2}\categapi{k}}}
\newcommand{\ppl}[2]{\hlindex{#1 #2}\index{#2, #1}} % forename surname in text, "surname, forename" into ppl index
\newcommand{\pplmdl}[2]{\hlindex{#1~#2}\index{#2, #1}} % for abbreviated middle name
\newcommand{\pplsur}[2]{\hlindex{#2}\index{#2, #1}} % surname in text, "surname, givenname" into ppl index
\newcommand{\pplalt}[2]{\hlindex{#1}\index{#2}} % put 1st arg in text, put 2nd arg into ppl index
\IfTwoColumn{}{
\setboolean{colorlinks}{true}
\IfEbookSize{}{
\renewcommand\footnotelayout{%
\advance\leftskip 0.0in
\advance\rightskip 0.7in
}
}}
\IfColorLinks{
\hypersetup{colorlinks=true,allcolors=MediumBlue}
}{}
\IfToArxiv{
\hypersetup{
colorlinks=true,
linkcolor=black,
citecolor=black,
filecolor=black,
urlcolor=black,
}
}{}
\IfNimbusAvail{
\usepackage{nimbusmononarrow}
}{}
\renewcommand*\ttdefault{lmtt}
%msfontstub
\IfEbookSize{
\newcommand{\OneColumnHSpace}[1]{}
}{
\newcommand{\OneColumnHSpace}[1]{\IfTwoColumn{}{\hspace*{#1}}}
}
\IfSansSerif{
\renewcommand{\familydefault}{\sfdefault}
\normalfont
\usepackage[slantedGreek,scaled=.96]{newtxsf}
% Silence inevitable warnings on missing slanted shape
\RequirePackage[save]{silence}
\WarningFilter[sansslant]{latexfont}{Font shape `T1/qhv/m/sl'}
\ActivateWarningFilters[sansslant]
}{
\usepackage[slantedGreek]{newtxmath} % math package to be used with newtxtext
% Poor person's slanted shape for roman --- newtxtext lacks slanted shape
\AtBeginDocument{%
\DeclareFontShape{\encodingdefault}{\rmdefault}{m}{sl}{<-> ptmro7t}{}%
\DeclareFontShape{\encodingdefault}{\rmdefault}{b}{sl}{<-> ptmbo7t}{}%
\DeclareFontShape{\encodingdefault}{\rmdefault}{bx}{sl}{<->ssub * ptm/b/sl}{}%
}
}
\usepackage{biolinum}
% restore \sfdefault of newtxtext
\renewcommand{\sfdefault}{qhv}
\newcommand{\LstLineNo}{\makebox[5ex][r]{\arabic{VerbboxLineNo}\hspace{2ex}}}
\usepackage{bm} % for bold math mode fonts --- should be after math mode font choice
\usepackage{booktabs}
\usepackage{arydshln}
\definecolor{lightgray}{gray}{0.9} % for coloring alternate rows in table
\fvset{fontsize=\scriptsize,obeytabs=true}
\IfTwoColumn{
\fvset{tabsize=2}
}{
\fvset{tabsize=8}
}
\DefineVerbatimEnvironment{VerbatimL}{Verbatim}%
{numbers=left,numbersep=5pt,xleftmargin=9pt}
\AfterEndEnvironment{VerbatimL}{\vspace*{-9pt}}
\DefineVerbatimEnvironment{VerbatimLL}{Verbatim}% for snippet inside list
{numbers=left,numbersep=5pt,xleftmargin=9pt}
\AfterEndEnvironment{VerbatimLL}{\vspace*{-5pt}}
\DefineVerbatimEnvironment{VerbatimN}{Verbatim}%
{numbers=left,numbersep=3pt,xleftmargin=5pt,xrightmargin=5pt,frame=single}
\DefineVerbatimEnvironment{VerbatimU}{Verbatim}%
{numbers=none,xleftmargin=5pt,xrightmargin=5pt,samepage=true,frame=single}
\IfLmttForCode{
\AtBeginEnvironment{verbatim}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{verbbox}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{table}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{table*}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{sidewaystable*}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{minipage}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{listing}{\renewcommand{\ttdefault}{lmtt}}
\AtBeginEnvironment{listing*}{\renewcommand{\ttdefault}{lmtt}}
\fvset{fontfamily=lmtt}
}{}
\IfTblCpTop{
\floatstyle{plaintop}
\restylefloat{table}
\addtolength{\abovecaptionskip}{-2.5pt}
\setlength{\abovetopsep}{-2pt}
}{}
\captionsetup{hangindent=20pt}
\captionsetup[listing]{hangindent=20pt}
\usepackage[capitalise,noabbrev,nosort]{cleveref}
\crefname{subsubsubappendix}{Appendix}{Appendices}
\crefname{sublisting}{Listing}{Listings}
\crefname{sequencei}{step}{steps}
\Crefname{sequencei}{Step}{Steps}
\crefname{enumi}{item}{items}
\Crefname{enumi}{Item}{Items}
\crefname{page}{page}{pages}
\Crefname{page}{Page}{Pages}
\Crefformat{equation}{Equation~#2#1#3}
\crefformat{equation}{Eq.~#2#1#3}
\newcommand{\crefrangeconjunction}{--}
\newcommand{\creflastconjunction}{, and~}
% Define \crefthro{} for "Sections~m.n through~m.p"
\newcommand{\crefthro}[2]{%
\namecrefs{#1}~\ref{#1} through~\ref{#2}%
}
\newcommand{\Crefthro}[2]{%
\nameCrefs{#1}~\ref{#1} through~\ref{#2}%
}
% Define \clnref{} and \Clnref{} for reference to line labels
\newcounter{lblcount}
\newcommand{\clnrefp}[2]{%
\setcounter{lblcount}{0}% Restart label count
\renewcommand*{\do}[1]{\stepcounter{lblcount}}% Count label
\docsvlist{#1}% Process list and count labels
\def\nextitem{\def\nextitem{, }}% Separator
\ifnum\value{lblcount}=1 #2~\lnref{#1}%
\else\ifnum\value{lblcount}=2 {#2}s~%
\renewcommand*{\do}[1]{%
\addtocounter{lblcount}{-1}%
\ifnum\value{lblcount}=0 { }and~\else\nextitem\fi\lnref{##1}}% How to process each label
\else {#2}s~%
\renewcommand*{\do}[1]{%
\addtocounter{lblcount}{-1}%
\ifnum\value{lblcount}=0 , and~\else\nextitem\fi\lnref{##1}}% How to process each label
\fi%
\docsvlist{#1}% Process list
\fi%
}
\newcommand{\clnrefpraw}[2]{%
\setcounter{lblcount}{0}% Restart label count
\renewcommand*{\do}[1]{\stepcounter{lblcount}}% Count label
\docsvlist{#1}% Process list and count labels
\def\nextitem{\def\nextitem{, }}% Separator
\ifnum\value{lblcount}=1 #2~\lnrefraw{#1}%
\else\ifnum\value{lblcount}=2 {#2}s~%
\renewcommand*{\do}[1]{%
\addtocounter{lblcount}{-1}%
\ifnum\value{lblcount}=0 { }and~\else\nextitem\fi\lnrefraw{##1}}% How to process each label
\else {#2}s~%
\renewcommand*{\do}[1]{%
\addtocounter{lblcount}{-1}%
\ifnum\value{lblcount}=0 , and~\else\nextitem\fi\lnrefraw{##1}}% How to process each label
\fi%
\docsvlist{#1}% Process list
\fi%
}
\newcommand{\clnref}[1]{\clnrefp{#1}{line}}
\newcommand{\Clnref}[1]{\clnrefp{#1}{Line}}
\newcommand{\clnrefr}[1]{\clnrefpraw{#1}{line}}
\newcommand{\Clnrefr}[1]{\clnrefpraw{#1}{Line}}
\newcommand{\clnrefrange}[2]{lines~\lnref{#1}\==\lnref{#2}}
\newcommand{\Clnrefrange}[2]{Lines~\lnref{#1}\==\lnref{#2}}
\newcommand{\clnrefthro}[2]{lines~\lnref{#1} through~\lnref{#2}}
\newcommand{\Clnrefthro}[2]{Lines~\lnref{#1} through~\lnref{#2}}
\newcommand{\pararef}[1]{Paragraph ``\nameref{#1}'' on Page~\pageref{#1}}
\newcommand{\Pararef}[1]{Paragraph ``\nameref{#1}'' on Page~\pageref{#1}}
% geometry setting
\newlength{\twocolumnwidth}
\newlength{\onecolumntextwidth}
\setlength{\onecolumntextwidth}{4.75in}
\setlength{\twocolumnwidth}{3.125in}
\IfTwoColumn{
\renewcommand\floatpagefraction{.75}
\IfHardCover{
\usepackage[papersize={8.25in,10.75in},body={6.5in,8.25in},twocolumn,columnsep=0.25in]{geometry}
}{
\IfAfourPaper{
\usepackage[a4paper,body={6.5in,8.25in},twocolumn,columnsep=0.25in]{geometry}
}{
\usepackage[letterpaper,body={6.5in,8.25in},twocolumn,columnsep=0.25in]{geometry}
}}
% Adjust indents/margins set in book.cls for twocolumn
\setlength{\parindent}{1em}
\setlength{\leftmargini}{2em}
\setlength{\leftmarginv}{.5em}
\setlength{\leftmarginvi}{.5em}
\sloppy % prefer wide inter-word spaces to occasional horizontal overfulls
}{ % One Column
\IfEbookSize {
% From https://tex.stackexchange.com/questions/16735/latex-options-for-kindle
\usepackage[papersize={4.5in,6.3in},margin=0.2in,footskip=0.2in,
headsep=0.0335in,headheight=0.1665in,onecolumn,twoside=false]{geometry}
\sloppy % prefer wide inter-word spaces to occasional horizontal overfulls
\setlength{\onecolumntextwidth}{4.1in}
\usepackage{fancyhdr}
\fancypagestyle{plain}{%
\fancyhf{} % clear all header and footer fields
\renewcommand{\headrulewidth}{0pt}
\rhead{\textcolor{Grey}{\scriptsize\thepage}}
}
\pagestyle{plain}
%\pagestyle{empty}
%\usepackage[scaled]{helvet}
%\renewcommand{\familydefault}{\sfdefault}
% Smaller font and tighter space for chapter title
\titleformat{\chapter}[display]{\normalfont\bfseries}
{\Large\chaptertitlename~\thechapter}{0pt}{\LARGE}
\titlespacing*{\chapter}{0pt}{*1}{*2}
}{
\IfHardCover{
\usepackage[papersize={8.25in,10.75in},body={4.75in,8.25in},onecolumn]{geometry}
}{
\IfAfourPaper{
\usepackage[a4paper,body={4.75in,8.25in},onecolumn]{geometry}
}{
\usepackage[letterpaper,body={4.75in,8.25in},onecolumn]{geometry}
}}}
\geometry{hcentering=true} % horizontal centering for 1c layouts
}
\IfAfourPaper{
\geometry{vcentering=true} % vertical centering for A4 paper
}{
\geometry{vmarginratio=3:4}
}
\setcounter{topnumber}{3}
\renewcommand\topfraction{.75}
\setcounter{bottomnumber}{2}
\renewcommand\bottomfraction{.3}
\setcounter{totalnumber}{5}
\renewcommand\textfraction{.15}
\renewcommand\floatpagefraction{.6}
\setcounter{dbltopnumber}{3}
\renewcommand\dbltopfraction{.75}
\renewcommand\dblfloatpagefraction{.5}
\IfAfourPaper{
\SetWatermarkVerCenter{.92\paperheight}
}{}
\IfHardCover{
\SetWatermarkVerCenter{.95\paperheight}
}{}
\IfEbookSize{
\SetWatermarkHorCenter{.8\paperwidth}
\SetWatermarkVerCenter{.99\paperheight}
\newsavebox\ebbox
\newcommand{\ebresizewidth}[1]{\resizebox{\textwidth}{!}{#1}}
\newcommand{\ebresizewidthsw}[1]{\resizebox{.95\textheight}{!}{#1}}
\newcommand{\ebresizeverb}[2]{%
\begin{lrbox}{\ebbox}%
\begin{minipage}{\textwidth}%
{#2}%
\end{minipage}%
\end{lrbox}%
\resizebox{#1\textwidth}{!}{\usebox{\ebbox}}%
}
\newcommand\ebFloatBarrier{\FloatBarrier}
}{
\newcommand{\ebresizewidth}[1]{#1}
\newcommand{\ebresizewidthsw}[1]{#1}
\newcommand{\ebresizeverb}[2]{#2}
\newcommand\ebFloatBarrier{}
}
\IfTwoColumn{
\newcommand{\tcresizewidth}[1]{\resizebox{\columnwidth}{!}{#1}}
}{
\newcommand{\tcresizewidth}[1]{#1}
}
% Glossaries dictionary and custom settings
\input{glsdict}
\begin{document}
%%HTMLSKIP
\lstset{
literate={\_}{}{0\discretionary{\_}{}{\_}}%
{\_\_}{}{0\discretionary{\_\_}{}{\_\_}}%
{->}{}{0\discretionary{->}{}{->}}%
}
%%HTMLNOSKIP
\newcommand{\co}[1]{\lstinline[breaklines=true,breakatwhitespace=true]{#1}}
\newcommand{\nbco}[1]{\hbox{\lstinline[breaklines=false,breakatwhitespace=false]{#1}}} % no break lines for short snippet
\newcommand{\qco}[1]{``\nbco{#1}''} % \nbco with quotation marks
\newcommand{\tco}[1]{\texttt{\detokenize{#1}}} % for code in tabular environment
% \tco{} will break at spaces but not at underscores
\newcommand{\qtco}[1]{``\hbox{\tco{#1}}''} % \tco with quotation marks
\newcommand{\lopt}[1]{\tco{-}\tco{-}\tco{#1}} % to avoid "--" to endash conversion
\newcommand{\nf}[1]{\textnormal{#1}} % to return to normal font
\newcommand{\qop}[1]{{\sffamily #1}} % QC operator such as H, T, S, etc.
\DeclareRobustCommand{\euler}{\ensuremath{\mathrm{e}}}
\DeclareRobustCommand{\O}[1]{\ensuremath{\mathcal{O}\left(#1\right)}}
\DeclareRobustCommand{\Node}[1]{Node~{\ensuremath{#1}}}
\newcommand{\Power}[1]{POWER#1}
\newcommand{\ARM}[1]{Arm{#1}}
\newcommand{\ARMv}[1]{Armv{#1}}
\newcommand{\GNUC}{GNU~C}
\newcommand{\GCC}{GCC}
%\newcommand{\GCC}{\co{gcc}} % For those who prefer "gcc"
\newcommand{\IRQ}{IRQ}
%\newcommand{\IRQ}{irq} % For those who prefer "irq"
\newcommand{\rt}{\mbox{-rt}} % to prevent line break behind "-"
\let\epigraphorig\epigraph
\renewcommand{\epigraph}[2]{\epigraphorig{\biolinum\emph{#1}}{\biolinum\scshape\footnotesize #2}}
\IfEbookSize{
\newcommand{\Epigraph}[2]{\epigraph{#1}{#2}}
\raggedbottom
}{
\newcommand{\Epigraph}[2]{\epigraphhead[65]{\epigraph{#1}{#2}}}
}
\input{ushyphex} % Hyphenation exceptions for US English from hyphenex package
\input{pfhyphex} % Hyphenation exceptions for perfbook
\title{
Is Parallel Programming Hard, And, If So, \\
What Can You Do About It?}
\author{
Edited by: \\
\\
Paul E. McKenney \\
Meta Platforms, Inc. \\
\href{mailto:paulmck@kernel.org}{paulmck@kernel.org} \\
} % end author
% \date{\ }
\setcounter{secnumdepth}{4} % Enable counter for paragraph
%\fvset{fontsize=\scriptsize,numbers=left,numbersep=5pt,xleftmargin=9pt,obeytabs=true,tabsize=2}
\newcommand{\lnlblbase}{}
\newcommand{\lnlbl}[1]{\phantomsection\label{\lnlblbase:#1}}
\newlength{\lnlblraise}
\setlength{\lnlblraise}{6pt}
\AtBeginEnvironment{VerbatimN}{%
\renewcommand{\lnlbl}[1]{%
\raisebox{\lnlblraise}{\phantomsection\label{\lnlblbase:#1}}}%
}
\newcommand{\lnrefbase}{}
\newcommand{\lnref}[1]{\ref{\lnrefbase:#1}}
\newcommand{\lnrefraw}[1]{\ref{#1}}
\newenvironment{fcvlabel}[1][]{\renewcommand{\lnlblbase}{#1}%
\ignorespaces}{\ignorespacesafterend}
\newenvironment{fcvref}[1][]{\renewcommand{\lnrefbase}{#1}%
\ignorespaces}{\ignorespacesafterend}
\frontmatter
\IfEbookSize{\hypersetup{pageanchor=false}}{}
\maketitle
\IfEbookSize{\hypersetup{pageanchor=true}}{}
\IfTwoColumn{
\onecolumn\begin{adjustwidth*}{.95in}{.8in}
\addtolength{\parindent}{6pt}
}{}
\input{legal}
\tableofcontents
\IfTwoColumn{
\end{adjustwidth*}\twocolumn
}{}
\mainmatter
\input{howto/howto}
\input{intro/intro}
\input{cpu/cpu}
\input{toolsoftrade/toolsoftrade}
\input{count/count.tex}
\input{SMPdesign/SMPdesign}
\input{locking/locking.tex}
\input{owned/owned.tex}
\input{defer/defer.tex}
\input{datastruct/datastruct.tex}
\input{debugging/debugging}
\input{formal/formal}
\input{together/together.tex}
\input{advsync/advsync.tex}
\input{memorder/memorder.tex}
\input{easy/easy.tex}
\input{future/future.tex}
\input{summary.tex}
\appendix
\input{appendix/appendix.tex}
\backmatter
% Glossary
%% Reset footnote count
\setcounter{footnote}{0}
\input{glossary.tex}
% Bibliograpy
\IfTwoColumn{
\onecolumn\begin{adjustwidth*}{.8in}{.7in}
%\bibliographystyle{alpha} % Use genuine alpha style (In case of build failure, use this instead)
\bibliographystyle{alphapf} % Use alpha style customized by urlbst with --inlinelinks option
}{
\bibliographystyle{alphapf} % Use alpha style customized by urlbst with --inlinelinks option
}
\IfColorLinks{}{
\hypersetup{pdfborder=0 0 1,urlbordercolor=0.4 1 1}
}
\bibliography{bib/RCU,bib/WFS,bib/hw,bib/os,bib/parallelsys,bib/patterns,bib/perfmeas,bib/refs,bib/syncrefs,bib/search,bib/swtools,bib/realtime,bib/TM,bib/standards,bib/OSS,bib/maze,bib/energy,bib/QC,bib/NP,bib/memorymodel}
\IfColorLinks{}{
\hypersetup{pdfborder=0 0 0}
}
\IfTwoColumn{
\end{adjustwidth*}\twocolumn
}{
}
% Credits
\setcounter{secnumdepth}{-1} % surpress section numbering in backmatter
\input{ack}
% Index if enabled
\IfIndexOn{
\IfIndexHier{
\input{indexsee}
}{}
\phantomsection
\IfEbookSize{
\idxlayout{columns=2}
}{
\newgeometry{body={6.5in,8.25in},centering=true,twocolumn,columnsep=0.25in}
}
\printglossary[type=\acronymtype]
\phantomsection
\setindexprenote{%
\hfill\begin{minipage}{1in}
\footnotesize%
\BF{Bold}: Major reference.
\GL{Underline}: Definition.
\vspace*{1ex}
\end{minipage}
}
\printindex
\phantomsection
\setindexprenote{%
\hfill\begin{minipage}{2.6in}
\footnotesize (c):~Cxx standard, (g):~GCC extension,
(k):~Linux kernel, (kh):~Linux kernel historic, (pf):~perfbook CodeSamples,
(px):~POSIX, (ur):~userspace RCU\@.
\vspace*{1ex}
\end{minipage}
}
\printindex[api]
\IfEbookSize{}{
\restoregeometry
}
}{}
% page-layout dimensions
% \cleardoublepage
% ~ \\
% paperheight: \the\paperheight \\
% paperwidth: \the\paperwidth \\
% topmargin: \the\topmargin \\
% headheight: \the\headheight \\
% headsep: \the\headsep \\
% textheight: \the\textheight \\
% textwidth: \the\textwidth \\
% oddsidemargin: \the\oddsidemargin \\
% evensidemargin: \the\evensidemargin \\
% footskip: \the\footskip \\
% topskip: \the\topskip \\
\end{document}