%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PREPARING A CAMERA-READY VERSION? Passing the [camera] option to this package % will turn off author notes and other effects that you may be worried about. % % % This LaTeX package will Do The Right Thing, as defined ad hoc by its author and % implemented in arbitrarily kludgy ways. See https://github.com/leisec/dtrt for an % overview and the latest version. % % Author and margin notes: % + Define a \dtnote[author]{text} command for nicely formatted author notes with % margin marks (author name is optional), and similarly % \dtcolornote[author]{color}{text}. % + Define a \later macro that, when preceding a \dtnote, marks it as a "note for later". % These can be turned off by option "[later=false]". % + Define a \done macro that, when preceding a \dtnote, marks it as a "note for done" % These can be turned off by option "[done=false]". % + Define \XXX[text], which is similar to \dtnote{text} but aborts compilation % if notes are disabled. % + Define \ignore[comment]{text} which ignores the text but (in draft mode) adds % a mark and an optional comment in the margin. % + Defines a \sidenote{text} command which creates a margin note that work % reasonably even inside footnotes, tabulars, titles and (sometimes) math, % and can be disabled using "sidenotes=false". % + Notes have the string "\NOTE" invisibly placed nearby, to make them easy to search % when rendered to PDF. \XXX notes also have "\XXX" invisibly placed. Broken references % also have "\ERROR". % % Page formatting: % - Designate drafts as such, including time of compilation ("[draft]" option). % + Enables page numbering on all pages except first. % - Add a head at the top of every page with either the current chapter and section % or current the section and subsection ("[head=...]" option). % - Set page geometry as fraction of page width and height, in a % package-independent way ("[width=...]" and "[height=...]" options). % % Local formatting: % + Define a \parhead{text} command for paragraph-level headings (well-formatted % bold text at beginning of paragraph) that always work. Periods are appended % unless the header text already ends with a punctuation mark. % + Define a "\footnotesymb{symbol}{text}" command for footnote with explicitly % given symbol (possibly empty). % + Define a "nestedbar" environment for indenting text and marking it with a vertical % bar on the left. % - Remove space after comma when used as decimal separator in math mode (option "[smartcomma]"). % - Add a horizontal line above figure captions (option "[captionrule]"). % % Hyperlinks, references and TOC: % + Define an "\emailref{user@host}" command for creating hyperlinked email addresses, % and "\httpref{user@host}" command for creating hyperlinked URLs without rendering % the "mailto://" or "http://". % + Generate TOC entries and PDF bookmarks for "\section*", "\subsection*" etc. % (including References), and also for the abstract. % + Apply nice formatting to PDF bookmarks. % + Allow footnotes in section titles without strange effects in TOC. % + Define a "\dtbookmark{level}{text}" command for creating custom PDF bookmarks. % + Automatic margin marks and highlights for broken references % + Patch HyperRef's \autoref so that if \sectionautorefname etc. are redefined to % a section mark ("\S") then they won't be followed by a space. % % Misc: % + Patch LLNCS: fix TOC, PDF bookmarks, and the ", and" in the author list. % - For LLNCS: add a \date{} feature to title block, similar to the article class. % - For LLNCS: add a QED square at the end of llncs proof environments % - For LLNCS: put subsubsection captions on dedicated lines, and number them % - When asked to generate a standard-compliant submission, disable all relevant % effects ("[camera]" option). % % (Above, featured marked by "+" are enabled by default, "-" require explicit activation.) % % Package options (use as follows: " \usepackage[foo,bar=baz]{dtrt} "): % camera -- Disable most effects of this package (for camera-ready % versions). Formatting tweaks and LLNCS overrides are disabled, % and explicitly-invoked macros are still defined but have the least % possible effect (e.g., \parhead works, \dtnote is ignored). % draft -- Write "DRAFT" and time of compilation at page bottoms. % notes=false -- Disable display of \dtnote{...} author notes, \XXX and \ignore marks. % notes=xxx -- Disable display of \dtnote{...} author notes and \ignore marks. Keep \XXX. % later=false -- Disable display of \later\dtnote{...} notes (but still leave a % mark in the margin, unless also notes=false). % done=false -- Disable display of \done\dtnote{...} notes (but still leave a mark, ditto) % showignore=false -- Don't show \ignore marks even if notes=true % sidenotes=false -- Discard all \sidenote{}s. % % geometry -- Alter page geometry. % width=0.75 -- Specify width of text relative to physical page. % height=0.70 -- Specify height of text relative to physical page. % blankpages=true -- Add blank even or odd pages to align Sections, Parts etc. % blankpages=false -- Don't use color in \dtnote, \XXX and draft marks. % bindshift=1cm -- Prepare for two-sided printing and shift pages away from % spine by the given distance. % head=... -- Add a head at the top of every page, containing either the % current chapter and section ("head=chaptersection") or the % current section and subsection ("head=sectionsubsection"). % llncsdate -- add a \date{} feature to title block for the LLNCS class, % similar to that of the 'article' class. % llncsqed -- add a QED square at the end of LLNCS proof environments. % llncssubsub -- make LLNCS subsubsection caption be be numbered and followed by a linebreak % smartcomma -- Remove spaces after commas used as decimal separators. % captionrule -- Add a horizontal line ("rule") above figure's caption % % Written by Eran Tromer except where noted otherwise. % Distributed under the LaTeX Project Public License v1.3a or later; see % http://www.latex-project.org/lppl.txt for details and (lack of) warranty. % If you make corrections or improvements, please share them with the author. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ProvidesPackage{dtrt}[2021/09/08 v0.95020] \usepackage{amssymb} \usepackage{keyval} \usepackage{ifpdf} \usepackage{url} \usepackage{ifthen} \usepackage{etoolbox} \usepackage{xpatch} \usepackage{xcolor} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Package options (documented above): \newcommand{\dt@width}{0.7} \newcommand{\dt@height}{0.75} \newcommand{\dt@paper}{letterpaper} % must be a name supported by the 'geometry' package \newcommand{\dt@head}{} % must be one of '', 'chaptersection' or 'sectionsubsection' \newcommand{\dt@firstpagestyle}{empty} % must be a valid page style such as 'empty' or 'plain' \newcommand{\dt@draftfootnote}{DRAFT --- compiled at \dt@datetime \@ifundefined{OSUserName}{}{ by \texttt{\OSUserName}}; not for distribution} \@ifundefined{dt@linkcolor}{ \definecolor{dt@linkcolor}{rgb}{0.8 0.8 1} }{} \newif\ifdt@camera \dt@camerafalse \newif\ifdt@smartcomma \dt@smartcommafalse \newif\ifdt@notes \dt@notestrue \newif\ifdt@later \dt@latertrue \newif\ifdt@done \dt@donetrue \newif\ifdt@showignore \dt@showignoretrue \newif\ifdt@sidenotes \dt@sidenotestrue \newif\ifdt@draft\dt@draftfalse \newif\ifdt@geometry\dt@geometryfalse \newif\ifdt@blankpages \dt@blankpagesfalse \newif\ifdt@colornotes \dt@colornotestrue \newif\ifdt@llncsdate \dt@llncsdatefalse \newif\ifdt@llncsqed \dt@llncsqedfalse \newif\ifdt@llncssubsub \dt@llncssubsubfalse \newif\ifdt@llncs \@ifclassloaded{llncs}{\dt@llncstrue}{\dt@llncsfalse} \newif\ifdt@acmart \@ifclassloaded{acmart}{\dt@acmarttrue}{\dt@acmartfalse} \newif\ifdt@marginpars \dt@marginparstrue \newif\ifdt@captionrule \dt@captionrulefalse \newif\ifdt@xxxanyway \dt@xxxanywayfalse % show \XXX even if notes=false \newcommand{\dt@notesxxx}{\dt@notesfalse\dt@xxxanywaytrue} \newcommand{\dt@notesXXX}{\dt@notesfalse\dt@xxxanywaytrue} % Some classes don't work well with marginpar \@ifclassloaded{sig-alternate}{\dt@marginparsfalse}{} \@ifclassloaded{sig-alternate-05-2015}{\dt@marginparsfalse}{} \@ifclassloaded{acm_proc_article-sp}{\dt@marginparsfalse}{} \define@key{dt@KV}{smartcomma}[true]{\csname dt@smartcomma#1\endcsname} \define@key{dt@KV}{notes}[true]{\csname dt@notes#1\endcsname} \define@key{dt@KV}{later}[true]{\csname dt@later#1\endcsname} \define@key{dt@KV}{done}[true]{\csname dt@done#1\endcsname} \define@key{dt@KV}{geometry}[true]{\csname dt@geometry#1\endcsname} \define@key{dt@KV}{draft}[true]{\csname dt@draft#1\endcsname} \define@key{dt@KV}{showignore}[true]{\csname dt@showignore#1\endcsname} \define@key{dt@KV}{sidenotes}[true]{\csname dt@sidenotes#1\endcsname} \define@key{dt@KV}{width}{\def\dt@width{#1}\dt@geometrytrue} \define@key{dt@KV}{height}{\def\dt@height{#1}\dt@geometrytrue} % \define@key{dt@KV}{linkcolor}{\def\dt@linkcolor{#1}} % Broken -- can't pass {r g b} via keyval. % Use \newcommand{\dt@linkcolor}{{0.6 0.6 1.0}} before \usepackage{dtrt} instead. \define@key{dt@KV}{bindshift}{\def\dt@bindshift{#1}} \define@key{dt@KV}{blankpages}[true]{\csname dt@blankpages#1\endcsname} \define@key{dt@KV}{firstpagestyle}{\renewcommand{\dt@firstpagestyle}{#1}} \define@key{dt@KV}{colornotes}[true]{\csname dt@colornotes#1\endcsname} \define@key{dt@KV}{marginpar}[true]{\csname dt@marginpars#1\endcsname} \define@key{dt@KV}{llncsdate}[true]{\csname dt@llncsdate#1\endcsname} \define@key{dt@KV}{llncsqed}[true]{\csname dt@llncsqed#1\endcsname} \define@key{dt@KV}{llncssubsub}[true]{\csname dt@llncssubsub#1\endcsname} \define@key{dt@KV}{captionrule}[true]{\csname dt@captionrule#1\endcsname} \define@key{dt@KV}{head}{\renewcommand{\dt@head}{#1}} \define@key{dt@KV}{draftfootnote}{\renewcommand{\dt@draftfootnote}{#1}} \define@key{dt@KV}{camera}[true]{\csname dt@camera#1\endcsname \ifdt@camera \dt@notesfalse \dt@draftfalse \dt@geometryfalse \fi} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Process package options (code copied from Walter Schmidt's "helvet.sty", % http://www.tug.org/tex-archive/help/Catalogue/entries/psnfss.html). \def\ProcessOptionsWithKV#1{% \let\@tempc\relax \let\dt@tempa\@empty \@for\CurrentOption:=\@classoptionslist\do{% \@ifundefined{KV@#1@\CurrentOption}% {}% {\edef\dt@tempa{\dt@tempa,\CurrentOption,}}% }% \edef\dt@tempa{% \noexpand\setkeys{#1}{% \dt@tempa\@ptionlist{\@currname.\@currext}% }% }% \dt@tempa } \ProcessOptionsWithKV{dt@KV} \AtEndOfPackage{\let\@unprocessedoptions\relax} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Functionality that's available only if camera=false: \ifdt@camera % Got "camera" option, so just define some empty macros and do sanity checks \newcommand{\dtbookmark}[2]{} % Sanity check for LLNCS font size: \ifdt@llncs \ifthenelse{\equal{\@ptsize}{0}}{}{ \@latex@error{LLNCS needs default 10pt for camera-ready, you seem to use 1\@ptsize pt. Fix your documentclass}\@ehd } \fi%dt@llncs \else%dt@camera % Not camera-ready, tweak stuff freely: % Number all pages except title page: \pagestyle{plain} \AtBeginDocument{% \thispagestyle{\dt@firstpagestyle}% } % Define a "\dtbookmark{level}{text}" command for custom PDF bookmarks: \ifpdf \newcounter{dtrtbk} \newcommand{\dtbookmark}[2]{\pdfbookmark[#1]{#2}{\arabic{dtrtbk}}\addtocounter{dtrtbk}{1}} \else%pdf \newcommand{\dtbookmark}[2]{} \fi%pdf % set the Abstract bookmark higher up, at the title \xpretocmd{\maketitle}{\dtbookmark{1}{Abstract}}{}{} % Configure PDF bookmarks and links: \ifpdf % Configure PDF with colored links and nice bookmarks: % Color the letters (but also in printout): % \usepackage{color} % \definecolor{LinkBlue}{rgb}{0,0,0.8} % \usepackage[pdfpagemode=UseOutlines,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2,pdfstartview=FitH,colorlinks,linkcolor=LinkBlue,citecolor=LinkBlue,urlcolor=LinkBlue,pagecolor=LinkBlue]{hyperref} % Color the border (doesn't show in printout): \usepackage[hyperindex=true]{hyperref} \hypersetup{pdfpagemode=UseOutlines,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2,pdfstartview=FitH,pdfborder={0 0 1},linkbordercolor=dt@linkcolor,citebordercolor=dt@linkcolor,urlbordercolor=dt@linkcolor} % Make PDF bookmarks for title+abstract: \let\dt@oldtitle=\title \renewcommand{\title}[1]{% \hypersetup{pdftitle={#1}}% \dt@oldtitle{#1}% } % Marks broken citations and make them searchable in PDF by "\NOTE" or "\ERROR" \newcommand{\dt@brokenrefmark}[1]{% % \smash{\rlap{\dt@colorize\LARGE$\bigcirc$}}% % hard to place this right, since \G@refundefinedtrue is invoked after the "?" % force a \marginnote, even though \sidenote renders nicer, because many broken citations with \sidenote can cause `"Too many unprocessed floats" errors. \marginnote% [\dt@colorize\normalfont\smash{\large$\not\curvearrowleft $}\dt@invisibletiny{\textbackslash{}NOTE\textbackslash{}ERROR}% \newline\baselineskip=0.5\baselineskip{\tiny{#1}}]% {\dt@colorize\normalfont\smash{\dt@invisibletiny{\textbackslash{}NOTE\textbackslash{}ERROR}\large$\not\curvearrowright$}% \newline\baselineskip=0.5\baselineskip{\tiny{#1}}}% } \newbool{dt@markundef} \booltrue{dt@markundef} \xpretocmd{\G@refundefinedtrue}{\ifbool{dt@markundef}{\dt@brokenrefmark{\@ifundefined{@citeb}{}{\@citeb}}}{}}{}{} \let\dt@old@setref=\@setref \renewcommand{\@setref}[3]{% \ifx#1\relax \dt@brokenrefmark{#3}\fi% \dt@markundeffalse% \dt@old@setref{#1}{#2}{#3}% \dt@markundeftrue% } %Rewrote above but maybe broken because parameters: %\xpretocmd{\@setref}{\ifx#1\relax \dt@brokenrefmark{#3}\fi \boolfalse{dt@markundef}} %\xapptocmd{\@setref}{\booltrue{dt@markundef}} % \let\dt@old@pagesetref=\@pagesetref % \renewcommand{\@pagesetref}[3]{% \ifx#1\relax% % \sidenote{\dt@colorize\centering\reset@font\LARGE$\not\curvearrowright$}% % \fi\dt@old@pagesetref{#1}{#2}{#3}} \else%pdf %\usepackage[hyperindex=true]{hyperref} \usepackage{hyperref} \hypersetup{hyperindex=false} \fi%pdf \iftrue % Add unnumbered sections (\section*, \subsection*, \subsubsection*, bibliography), to the % TOC and bookmarks. LaTeX by default includes only non-starred sections. % Hook into \@startsection to learn the section type and level: \def\dt@lastsecttype{DTRT-UNINIT-SECT-TYPE} \def\dt@lastsectlevel{0} \let\dt@old@startsection=\@startsection \renewcommand{\@startsection}[6]{% {name}{level}{indent}{beforeskip}{afterskip}{style} \def\dt@lastsecttype{#1}% \def\dt@lastsectlevel{#2}% \dt@old@startsection{#1}{#2}{#3}{#4}{#5}{#6}% } % Hook into \tableofcontents so we'll know to ignore its own \chapter* command \newif\ifdt@inTOC \dt@inTOCfalse % inside a table of contents? \@ifundefined{tableofcontents}{}{ \let\dt@oldtableofcontents=\tableofcontents \renewcommand{\tableofcontents}{{\dt@inTOCtrue \dt@oldtableofcontents}} } % Hook into IEEEtran's appendix generation command (\@IEEEprocessthesectionargument), which create a \section* but also call \addcontentsline \newbool{dt@inIEEEappendix}\boolfalse{dt@inIEEEappendix} \xpretocmd{\@IEEEprocessthesectionargument}{\booltrue{dt@inIEEEappendix}}{}{} \xapptocmd{\@IEEEprocessthesectionargument}{\boolfalse{dt@inIEEEappendix}}{}{} % Hook into IEEEtran's \thebibliography to avoid duplicate \addcontentsline for its \section*{References}: \newbool{dt@inIEEEthebibliography}\boolfalse{dt@inIEEEthebibliography} \@ifclassloaded{IEEEtran}{ \xpretocmd{\thebibliography}{\booltrue{dt@inIEEEthebibliography}}{}{} \xapptocmd{\thebibliography}{\boolfalse{dt@inIEEEthebibliography}}{}{} }{} % Hook into \@ssect to add the TOC entry (\@ssect implements \section*, \subsection*, \subsubsection*) \ifdt@acmart % skip if acmart.cls loaded, it already takes care of TOC lines and bookmarks for its favorite \section*s \else \let\dt@old@ssect=\@ssect \renewcommand{\@ssect}[5]{% {indent}{beforeskip}{afterskip}{style}{text} \ifthenelse{ \( \equal{\dt@lastsecttype}{section} \and \equal{#5}{Abstract} \) \or \boolean{dt@inIEEEappendix} \or \boolean{dt@inIEEEthebibliography} }{% \dt@old@ssect{#1}{#2}{#3}{#4}{#5}% The \section*{Abstract}, and some IEEEtrans \section*s, are are handled elsewhere so don't try to add duplicate TOC entries }{% \dt@old@ssect{#1}{#2}{#3}{#4}{% \phantomsection% \ifthenelse{\boolean{dt@inTOC} \or \equal{\dt@lastsecttype}{DTRT-UNINIT-SECT-TYPE}}{% \dtbookmark{\dt@lastsectlevel}{#5}% just a bookmark }{% \addcontentsline{toc}{\dt@lastsecttype}{#5}% contents line + bookmark }% #5}% }% % no need for "\dtbookmark{\dt@lastsectlevel}{#5}", the above already does it. % TODO: respect TOC depth limit, like hyperref. % TODO: give a way to disable TOC for some starred sections % TODO: hyperref will increase depth by at most 1, so \section->{\subsubsection*,\subsubsection\*} % will get depths 1,2,3 (see twirl.pdf). % TODO: fix: the anchor is right after the title, instead of its beginning } \fi%dt@acmart % Handle \chapter* (in book.cls) too: % Hook into \@makeschapterhead to add the TOC entry: \@ifclassloaded{book}{ \@ifundefined{@makeschapterhead}{}{ \xpretocmd{\@makeschapterhead}{% \phantomsection% \ifthenelse{\boolean{dt@inTOC}}{% \dtbookmark{1}{\contentsname}% just a bookmark }{% \addcontentsline{toc}{chapter}{#1}% contents line + bookmark }% %\chaptermark{#1}% }{}{} } }{} \fi%true % Ignore footnotes inside TOC entries \let\dt@oldaddcontentsline=\addcontentsline \renewcommand{\addcontentsline}[3]{% \let\dt@oldfootnote=\footnote% \renewcommand{\footnote}[1]{}% \dt@oldaddcontentsline{#1}{#2}{#3}% \let\footnote=\dt@oldfootnote% } % Some LLNCS-specific fixes: \ifdt@llncs % Fix the spurious comma in the default authors list: "Joe, John, and Jill". % (Overrides LLNCS's \lastandauthor at the last moment since babel may restore it.) \let\dt@oldauthor=\author \renewcommand{\author}{% \def\lastandname{ and}% \dt@oldauthor% } % Bring back the PDF section bookmarks: \setcounter{tocdepth}{3} % Avoid llncs's author and title bookmarks: \let\dt@@oldaddcontentsline=\addcontentsline \renewcommand{\addcontentsline}[3]{% {table}{type}{text} \ifthenelse{\equal{#2}{title}}{}{% don't use \or, it's buggy \ifthenelse{\equal{#2}{author}}{}{% \dt@@oldaddcontentsline{#1}{#2}{#3}% }% }% } \fi%dt@llncs \fi%dt@camera %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Page geometry % Invoke geometry package (in v2 compatibility mode, if >v2): \ifdt@geometry % Set internal flags: \@ifundefined{@twosidefalse}{}{\ifdt@blankpages\@twosidetrue\else\@twosidefalse\fi} \@ifundefined{@twosidefalse}{}{\ifdt@blankpages\@mparswitchtrue\else\@mparswitchfalse\fi} % Use geometry v2 interface: \usepackage{geometry} \@ifundefined{Gm@compatiitrue}{\def\dt@geomoptcompat{}}{\def\dt@geomoptcompat{compat2,}} \@ifundefined{dt@bindshift}{\def\dt@geomoptbindshift{}}{\def\dt@geomoptbindshift{twosideshift=\dt@bindshift,}} \edef\dt@makegeometry{\noexpand\geometry{ \dt@geomoptcompat \dt@paper, % verbose, twoside=\ifdt@blankpages true\else false\fi, % twosideshift=0pt, <-- don't do this, it turns on @mparswitch \dt@geomoptbindshift hscale=\dt@width, vscale=\dt@height, voffset=1.5ex, % shift down to re-center despite page numbers headheight=0pt, reversemp=false, % true = put margins on left (inner) side marginparsep=1.5em, marginparwidth=0.07\paperwidth, headsep=0pt, includemp=false }} \dt@makegeometry % Set internal flags again: % Using twosideshift turns on \@iftwoside, but we don't want blank even/odd pages: \ifdt@blankpages\else \@ifundefined{@twosidefalse}{}{\@mparswitchfalse} \renewcommand{\cleardoublepage}{\clearpage} \@ifundefined{@endpart}{}{ \let\old@endpart=\@endpart \renewcommand{\@endpart}{\if@twoside \@twosidefalse \old@endpart \@twosidetrue \else \old@endpart \fi} } \fi \fi%dt@geometry %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Smart comma for mathmode: if a comma is immediately followed by a digit, % then it's probably a decimal separator so don't put a space after the comma. % Based on Walter Schmidt's "icomma" package, (http://www.ctan.org/pkg/icomma) % but modified to checks if next char is a digit rather than a non-space. \ifdt@smartcomma {\catcode`,=\active\gdef,{\futurelet\@let@token\dt@smartcomma}} \def\dt@smartcomma{% \ifx\@let@token0\mathord\fi \ifx\@let@token1\mathord\fi% \ifx\@let@token2\mathord\fi \ifx\@let@token3\mathord\fi% \ifx\@let@token4\mathord\fi \ifx\@let@token5\mathord\fi% \ifx\@let@token6\mathord\fi \ifx\@let@token7\mathord\fi% \ifx\@let@token8\mathord\fi \ifx\@let@token9\mathord\fi% \dt@mathcomma% } \AtBeginDocument{% \@ifundefined{sm@rtcomma}{}{% \@latex@error{Package dtry cannot coexist with package icomma}\@ehd}% \mathchardef\dt@mathcomma\mathcode`\,% \mathcode`\,="8000 % } \fi%dt@smartcomma %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \sidenote{text}: a margin note that works even in footnotes, tabulars, etc. % We use \marginpar by default, since it provides better layout. But in many % contexts (foonotes, tabulars, floats, etc.) we have to use the \marginnote instead. % % Like \marginnote and \marginpar, you can optionally specify text to use if the note % ends up on the left margin: % \sidenote[left-text]{right-text} \ifdt@sidenotes \usepackage[quiet]{marginnote} \usepackage{morefloats} % our side notes are floats that eat up some of TeX's capacity % The following handles various environments that don't support marginpar. % We keep a flag for each of them, and whenever any of the flags % is set, \sidenote uses \marginnote instead of \marginpar. % Are we in a footnote? \newbool{dt@infootnote}\boolfalse{dt@infootnote} \let\dt@old@footnote=\footnote \renewcommand{\footnote}[1]{{\booltrue{dt@infootnote}\dt@old@footnote{#1}\boolfalse{dt@infootnote}}} % Are we in a tabular? \newbool{dt@intabular}\boolfalse{dt@intabular} \BeforeBeginEnvironment{tabular}{\booltrue{dt@intabular}} \AfterEndEnvironment{tabular}{\boolfalse{dt@intabular}} % Are we in a minipage? \newbool{dt@inminipage}\boolfalse{dt@inminipage} \BeforeBeginEnvironment{minipage}{\booltrue{dt@inminipage}} \AfterEndEnvironment{minipage}{\boolfalse{dt@inminipage}} % Are we in a @float or @dblfloat environment? (This usually includes figure and table environments, but we keep them explicitly below, in case they're redefined to not use @float/@dblfloat) \newbool{dt@in@float}\boolfalse{dt@in@float} %\BeforeBeginEnvironment{@float}{\booltrue{dt@in@float}} %\BeforeBeginEnvironment{@xfloat}{\booltrue{dt@in@float}} %\AfterEndEnvironment{@float}{\boolfalse{dt@in@float}} \xpretocmd{\@xfloat}{\booltrue{dt@in@float}}{}{} \xapptocmd{\end@float}{\boolfalse{dt@in@float}}{}{} \newbool{dt@in@dblfloat}\boolfalse{dt@in@dblfloat} %\BeforeBeginEnvironment{@dblfloat}{\booltrue{dt@in@dblfloat}} %\AfterEndEnvironment{@dblfloat}{\boolfalse{dt@in@dblfloat}} % Are we in a figure or figure*? \newbool{dt@infigure}\boolfalse{dt@infigure} %\BeforeBeginEnvironment{figure}{\booltrue{dt@infigure}} %\AfterEndEnvironment{figure}{\boolfalse{dt@infigure}} %\BeforeBeginEnvironment{figure*}{\booltrue{dt@infigure}} %\AfterEndEnvironment{figure*}{\boolfalse{dt@infigure}} % Are we in a table? \newbool{dt@intable}\boolfalse{dt@intable} %\BeforeBeginEnvironment{table}{\booltrue{dt@intable}} %\AfterEndEnvironment{table}{\boolfalse{dt@intable}} % Are we in a \maketitle{}? \newbool{dt@inmaketitle}\boolfalse{dt@inmaketitle} \xpretocmd{\maketitle}{\booltrue{dt@inmaketitle}}{}{} \xapptocmd{\maketitle}{\boolfalse{dt@inmaketitle}}{}{} % Are we in a top float or a bottom float? (Based on code from fancyhdr) \let\dt@old@makecol\@makecol \def\@makecol{\let\dt@topfloat\@toplist\let\dt@botfloat\@botlist\dt@old@makecol} \def\ifdt@intopfloat#1#2{\ifx\dt@topfloat\empty #2\else #1\fi} \def\ifdt@inbotfloat#1#2{\ifx\dt@botfloat\empty #2\else #1\fi} % Are we in a 'framed' environment of the 'framed' package? \newbool{dt@inframed}\boolfalse{dt@inframed} \AtBeginDocument{% \xpretocmd{\MakeFramed}{\booltrue{dt@inframed}}{}{}% \xapptocmd{\endMakeFramed}{\boolfalse{dt@inframed}}{}{}% } % Are we in an 'algorithm' environment of the 'algorithm' package? \newbool{dt@inalgorithm}\boolfalse{dt@inalgorithm} \AtBeginDocument{% \BeforeBeginEnvironment{algorithm}{\booltrue{dt@inalgorithm}} \AfterEndEnvironment{algorithm}{\boolfalse{dt@inalgorithm}} } \newcommand{\sidenote}{% % Convert top/bottom float detection to regular "if" so it will work reliably in the following. \newif\ifdt@xinbotfloat \ifdt@inbotfloat\dt@xinbotfloatfalse\dt@xinbotfloattrue% \newif\ifdt@xintopfloat \ifdt@intopfloat\dt@xintopfloatfalse\dt@xintopfloattrue% % % Create either a \marginpar if it will work, otherwise a \marginnote \ifthenelse{\boolean{mmode} \OR \boolean{inner} \OR \boolean{dt@infootnote} \OR \boolean{dt@intabular} \OR \boolean{dt@in@float} \OR \boolean{dt@in@dblfloat} \OR \boolean{dt@infigure} \OR \boolean{dt@intable} \OR \boolean{dt@inmaketitle} \OR \boolean{dt@inminipage} \OR \boolean{dt@xintopfloat} \OR \boolean{dt@xinbotfloat} \OR \boolean{dt@inframed} \OR \not{\boolean{dt@marginpars}} \OR \boolean{dt@inalgorithm}}% {\marginnote}% \marginnote will then consume the [left-text]{right-text} arguments that follow \sidenote {\marginpar}% \marginpar will then consume the [left-text]{right-text} arguments that follow \sidenote } % Silence superfluous ``Marginpar on page ... moved'' warnings \usepackage{silence} \WarningFilter*{latex}{Marginpar on page \thepage\space moved} \else%dt@sidenotes \newcommand{\sidenote}[2][]{} \fi%dt@sidenotes % Define the \dt@colorize command: % \dt@colorize{text} colors in dt@color (only if dt@colornotes is true) % \dt@colorize[magenta]{text} colors in magenta (only if dt@colornotes is true) \ifdt@colornotes \usepackage{xcolor} \definecolor{dt@notecolor}{rgb}{0.7,0,0} \newcommand{\dt@colorize}[1][dt@notecolor]{\color{#1}} \else \newcommand{\dt@colorize}[1][]{} \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define: % \dtnote[author][color]{text} command for nicely formatted author notes (can be disabled by notes=false).. % \dtcolornote[author]{color}{text} is similar but also lets you set the color. % Also define \XXX[text], which yields an error if notes are disabled. \usepackage{amssymb} \usepackage{pifont} % for \ding{51} \usepackage{relsize} \newcommand{\dt@rendernote}[2]{% \dt@rendernote{color}{text} -- render inline note in designated style { \dt@colorize[#1]\smaller\sffamily\bfseries\boldmath[#2] }% } \newcommand{\dt@invisibletiny}[1]{% % \dt@invisibletiny[foo] puts foo in the PDF in invisible, tiny that can still searched in PDF \ifpdf{\tiny\makebox[1pt][c]{\pdfliteral page{q 3 Tr}#1\pdfliteral page{Q}}}\fi% } \ifdt@notes \newbool{dt@nextnoteislater} % Is the next \dtcolornote preceded by a \later? \boolfalse{dt@nextnoteislater} \newcommand{\later}{\booltrue{dt@nextnoteislater}\ignorespaces} \newbool{dt@nextnoteisdone} % Is the next \dtcolornote preceded by a \done? \boolfalse{dt@nextnoteisdone} \newcommand{\done}{\booltrue{dt@nextnoteisdone}\ignorespaces} \newbool{dt@inlinenote} \newcommand{\dtcolornote}[3][]{% \dtcolornote[authorname]{color}{text} -- add an inline note with mark at margin % Is the current note supposed to put anything inline (inside the text)? \ifthenelse{ \( \boolean{dt@later} \OR \NOT \boolean{dt@nextnoteislater} \) \AND \( \boolean{dt@done} \OR \NOT \boolean{dt@nextnoteisdone} \) }{\booltrue{dt@inlinenote}}{\boolfalse{dt@inlinenote}}% \ifbool{dt@inlinenote}{ \mbox{} }{}% % Put a mark in the margins: \sidenote{\dt@colorize[#2]\centering\normalfont\footnotesize% \ifthenelse{\boolean{dt@nextnoteislater}}{$\diamondsuit$}{% diamondsuit in margin for later \ifthenelse{\boolean{dt@nextnoteisdone}}{\ding{51}}{% vee checkmark for done $\bigstar$}}% star for regular notes \dt@invisibletiny{\textbackslash{}NOTE} % add invisible "\NOTE" text that can be searched in PDF } % Emit the inline part: \ifbool{dt@inlinenote}{% \ifmmode\expandafter\mbox\fi{% \ifthenelse{\equal{#1}{}}{% \dt@rendernote{#2}{\ignorespaces #3}% anonymous author comment }{% \dt@rendernote{#2}{\ignorespaces #3{\mdseries\itshape~---\ignorespaces#1}}% named author comment }% }% }{}% % Turn off flags that were supposed to affect only one note \boolfalse{dt@nextnoteislater}% \boolfalse{dt@nextnoteisdone}% % Absorb subsequent spaces, to avoid a double space if the inline part is turned off \ifbool{dt@inlinenote}{}{\ignorespaces}% } \newcommand{\dtnote}[2][]{% \dtnote[authorname]{text} (color is fixed) \dtcolornote[#1]{dt@notecolor}{#2}% } \else % Define empty versions of note commands. % We use \ignorespaces to avoid a double space in "before \dtcolornote{red}{note} after" rendered as "before after" \newcommand{\dtcolornote}[3][]{\ignorespaces} \newcommand{\dtnote}[2][]{\ignorespaces} \newcommand{\later}{\ignorespaces} \newcommand{\done}{\ignorespaces} \fi%dt@notes \ifthenelse{\boolean{dt@notes} \OR \boolean{dt@xxxanyway}}{ \newcommand{\XXX}[1][XXX]{% \XXX or \XXX[text] -- a note that cannot be ignored by setting notes=false % Triangle in margin, and invisible "\NOTE\XXX" text that can be searched in PDF \sidenote[\mbox{\dt@colorize\centering\normalfont\Large$\rhd$\hskip-0.6em$\blacktriangleright$}\dt@invisibletiny{\textbackslash{}NOTE\textbackslash{}XXX}]% {\mbox{\dt@colorize\centering\normalfont\Large$\lhd$\hskip-0.6em$\blacktriangleleft $}\dt@invisibletiny{\textbackslash{}NOTE\textbackslash{}XXX}}% \ifmmode% \;\mbox{\dt@rendernote{dt@notecolor}{#1}}\;% \else \mbox{}{\dt@rendernote{dt@notecolor}{#1}}% \fi } }{ % Don't let \XXX be silently turned off. \newcommand{\XXX}[1][XXX]{% \@latex@error{You have an "\\XXX" command but you said "notes=false" to dtrt. This won't end well, aborting. Use "notes=xxx" instead to override.}\@ehd% } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Write "DRAFT" and time of compilation at page bottoms (larger on first page): % To include the username (optional), run: % latex "\def\OSUserName{`whoami`}\input MYFILE.tex" \ifdt@draft \usepackage{scrtime} \usepackage{prelim2e} \newcommand{\dt@datetime}{\the\year-\ifthenelse{\the\month < 10}{0}{}\the\month-\ifthenelse{\the\day < 10}{0}{}\the\day{} \thistime} \renewcommand{\PrelimText}{% \dt@colorize\normalfont\sffamily \ifthenelse{\equal{\thepage}{1}}{\bfseries}{\tiny}% [\dt@draftfootnote]% } \fi%dt@draft %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define \ignore which puts an "ignored" mark and optional comment in margin (unless already defined): \ifdt@notes% \ifdt@showignore% \newcommand{\dtignore}[2][]{% first argument is optional \sidenote[\dt@colorize\centering{\normalfont\Large\boldmath \mbox{}\lower1ex\hbox{$\looparrowright$}}\\ \scriptsize\textsc{#1}] {\dt@colorize\centering{\normalfont\Large\boldmath \mbox{}\lower1ex\hbox{$\looparrowleft $}}\\ \scriptsize\textsc{#1}}% } \else% \newcommand{\dtignore}[2][]{\ignorespaces}% \fi \else% \newcommand{\dtignore}[2][]{\ignorespaces}% \fi% % if \ignore not defined by anyone, make it an alias to \dtignore \AtBeginDocument{% \@ifundefined{ignore}{\let\ignore=\dtignore}{}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define \parhead (paragraph-level headings): % First, a macro for adding a period at the end of a string if it doesn't already end with a punctuation mark (based on code by Uwe Lueck at http://tug.org/mailman/htdig/texhax/2010-January/014189.html): \def\dt@TestPunct#1{\ifx\dt@TestPunct#1\dt@TestPunct\else\dt@Puncttrue\fi} \def\dt@TestDot#1.\dt@TestEnd#2\dt@TestStop{\dt@TestPunct{#2}} \def\dt@TestQuestM#1?\dt@TestEnd#2\dt@TestStop{\dt@TestPunct{#2}} \def\dt@TestExclaM#1!\dt@TestEnd#2\dt@TestStop{\dt@TestPunct{#2}} \def\dt@TestColonM#1:\dt@TestEnd#2\dt@TestStop{\dt@TestPunct{#2}} \newif\ifdt@Punct \def\dt@MaybeAddPunct#1{% \dt@Punctfalse% \dt@TestDot#1\dt@TestEnd.\dt@TestEnd\dt@TestStop% \dt@TestQuestM#1\dt@TestEnd?\dt@TestEnd\dt@TestStop% \dt@TestExclaM#1\dt@TestEnd!\dt@TestEnd\dt@TestStop% \dt@TestColonM#1\dt@TestEnd:\dt@TestEnd\dt@TestStop% #1\ifdt@Punct \else .\fi% } % Macros for ignoring spaces and paragraphs. The first ignores all spaces and implicit paragraphs (empty separation line), the second also explicit \par. % (Source: http://tex.stackexchange.com/questions/23100/looking-for-an-ignorespacesandpars) \def\dt@ignorespacesandimplicitepars{% \begingroup \catcode13=10 \@ifnextchar\relax {\endgroup}% {\endgroup}% } \def\dt@ignorespacesandallpars{% \begingroup \catcode13=10 \@ifnextchar\par {\endgroup\expandafter\ignorespacesandallpars\@gobble}% {\endgroup}% } % \parheadnoperiod{text} generates a parhead without any extra punctuation. Useful, e.g., if you put a footnote at the end of your parhead text. \newcommand{\parheadnoperiod}[1]{\smallskip \noindent {\bfseries\boldmath\ignorespaces {#1}}\hskip 0.9em plus 0.3em minus 0.3em \dt@ignorespacesandimplicitepars} % \parhead{text} automatically appends a period if the text doesn't already end with punctuation. You should usually use this one. \newcommand{\parhead}[1]{\parheadnoperiod{\dt@MaybeAddPunct{#1}}\dt@ignorespacesandimplicitepars} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define \footnotesymb{symbol}{text} -- footnote with explicitly given symbol % (can be empty} \newcommand{\footnotesymb}[2]{% \def\@tempa{#1}% \ifx\@tempa\@empty% \let\dt@oldmakefntext=\@makefntext \long\def\@makefntext##1{\parindent 1em\noindent##1}% {\unrestored@protected@xdef\@thefnmark{}}% \@footnotetext{#2}% \let\@makefntext=\dt@oldmakefntext \else {\unrestored@protected@xdef\@thefnmark{#1}}% \@footnotemark% \@footnotetext{#2}% \fi } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Define an "\emailref{user@host}" command for creating hyperlinked email addresses without rendering the "mailto://", % and "\httpref{user@host}" command for creating hyperlinked URLs without rendering the "http://". \ifdt@camera % We're in camera=true mode, so don't load hyperref. If it's already loaded, use it. Otherwise use lightweight versions. \AtBeginDocument{ \ifthenelse{\isundefined{\href} \OR \isundefined{\nolinkurl}}{% \newcommand{\emailref}[1]{#1}% \newcommand{\httpref}[1]{\texttt{#1}}% }{% \newcommand{\emailref}[1]{\href{mailto:#1}{\nolinkurl{#1}}}% \newcommand{\httpref}[1]{\href{http://#1}{\nolinkurl{#1}}}% } } \else \newcommand{\emailref}[1]{\href{mailto:#1}{\nolinkurl{#1}}} \newcommand{\httpref}[1]{\href{http://#1}{\nolinkurl{#1}}} \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % If HyperRef is loaded, patch its \autoref so that if \sectionautorefname etc. are % redefined to \S then they won't be followed by a space. \@ifundefined{test@reftype}{}{ \let\dt@oldtest@reftype=\test@reftype \def\test@reftype#1.#2\\{% \dt@oldtest@reftype#1.#2\\% \ifthenelse{\equal{\@currentHtag}{\S~}} {\def\@currentHtag{\S}} {}% } } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Page heads: % % If head=chaptersection then add chapter and section name at the top of every page. % By default the chapter and section name as shown on one line. % If there's no room for both, you can move the section to its own line as follows: % \twolinehdrsection % \section{Long section name} % % If head=sectionsubsection then add section and subsection name at the top of every page. % By default the section and subsection name as shown on one line. % If there's no room for both, you can move the subsection to its own line as follows: % \twolinehdrsubsection % \subsection{Long subsection name} \ifthenelse{\equal{\dt@head}{}}{}{ \usepackage{fancyhdr}\pagestyle{fancy}\headsep=3.9ex \voffset=-0.38in % shift up \headheight=26.4542pt % otherwise will be enlarged halfway through document \def\dt@thechapterhead{} \def\dt@thesectionhead{} \def\dt@thesectionheadprefix@pending{} \def\dt@thesubsectionhead{} \def\dt@thesubsectionheadprefix@pending{} \renewcommand{\sectionmark}[1]{ \def\dt@thesectionhead{\thesection.\ #1} \def\dt@thesubsectionhead{} \def\dt@thesubsectionheadprefix{} \markheads } \newcommand{\twolinehdrsection}{ \def\dt@thesectionheadprefix@pending{\\ \mbox{}} } \renewcommand{\subsectionmark}[1]{ \def\dt@thesubsectionhead{\thesubsection.\ #1} \let\dt@thesubsectionheadprefix=\dt@thesubsectionheadprefix@pending \def\dt@thesubsectionheadprefix@pending{} \markheads } \newcommand{\twolinehdrsubsection}{ \def\dt@thesubsectionheadprefix@pending{\\ \mbox{}} } } % Specific to head=chaptersection: \ifthenelse{\equal{\dt@head}{chaptersection}}{ \def\markheads{\markboth{}{\small \dt@thechapterhead \dt@thesectionheadprefix \hfill \dt@thesectionhead}} \renewcommand{\chaptermark}[1]{ \def\dt@thechapterhead{\thechapter.\ #1} \def\dt@thesectionhead{} \def\dt@thesectionheadprefix{} \def\dt@thesubsectionhead{} \def\dt@thesubectionheadprefix{} \markheads } \newcommand{\chapterstarmark}[1]{ \def\dt@thechapterhead{#1} \def\dt@thesectionhead{} \def\dt@thesectionheadprefix{} \def\dt@thesubsectionhead{} \def\dt@thesubectionheadprefix{} \markheads } }{} % Specific to head=sectionsubsection: \ifthenelse{\equal{\dt@head}{sectionsubsection}}{ \def\markheads{\markboth{}{\small \dt@thesectionhead \dt@thesubsectionheadprefix \hfill \dt@thesubsectionhead}} }{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Teach llncs about dates. % The following code is copied from llncs, except the strongly indented lines. \ifdt@llncsdate \ifdt@llncs \def\@maketitle{\newpage \markboth{}{}% \def\lastand{\ifnum\value{@inst}=2\relax \unskip{} \andname\ \else \unskip \lastandname\ \fi}% \def\and{\stepcounter{@auth}\relax \ifnum\value{@auth}=\value{@inst}% \lastand \else \unskip, \fi}% \begin{center}% \let\newline\\ {\Large \bfseries\boldmath \pretolerance=10000 \@title \par}\vskip .8cm \if!\@subtitle!\else {\large \bfseries\boldmath \vskip -.65cm \pretolerance=10000 \@subtitle \par}\vskip .8cm\fi \setbox0=\vbox{\setcounter{@auth}{1}\def\and{\stepcounter{@auth}}% \def\thanks##1{}\@author}% \global\value{@inst}=\value{@auth}% \global\value{auco}=\value{@auth}% \setcounter{@auth}{1}% {\lineskip .5em \noindent\ignorespaces \@author\vskip.35cm}% {\small\institutename} {\ifthenelse{\equal{\@date}{}}{}{\vskip 2em\large% \vskip -.65cm% \pretolerance=10000% \normalsize \@date \par}\vskip 1em}% \end{center}% } \fi%dt@llncs \fi%dt@llncsdate %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % For the LLNCS class, add a QED square at the end of llncs proof environments. \ifdt@llncsqed \ifdt@llncs \let\oldendproof=\endproof \renewcommand{\endproof}{\qed\oldendproof} \fi%dt@llncs \fi%dt@llncsqed %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % For the LLNCS class, make \subsubsection generate captions with subsubsection % numbers and followed by linebreaks. (Default is similar to our \parhead.) \ifdt@llncssubsub \ifdt@llncs \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% {-4\p@ \@plus -2\p@ \@minus -2\p@}% {3\p@ \@plus 1\p@ \@minus 1\p@}% {\normalfont\normalsize\bfseries\boldmath \rightskip=\z@ \@plus 8em\pretolerance=10000 }} \setcounter{secnumdepth}{3} \fi%dt@llncs \fi%dt@llncssubsub %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Add a horizontal line ("rule") above figure captions. % Tested with llncs, should work with most classes. \@ifclassloaded{sigplanconf}{\dt@captionrulefalse}{} % sigplanconf already has caption rules \ifdt@captionrule \xpretocmd{\@makecaption}{ \hrule width \hsize height .33pt \vspace{4pt} \@ifundefined{abovecaptionskip}{}{% \setlength\abovecaptionskip{0pt}% } }{}{} \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Defines the "nestedbar" environment, which indents the text and puts % a vertical bar to its left (with little corners at top and bottom). % Useful for nested theorem/proof environments.. % This is a subtler version of the 'leftbar'/'oframed' environment from package 'framed'. % Copies some code from 'framed', to add a degree of freedom. % http://www.ctan.org/pkg/framed \usepackage{framed} % \dt@CustomFBox tweaks the \CustomFBox of 'framed' by adding % parameter: length of the top/bottom rules, and space between % left rule and text. % Parameter #1 is inserted (in vmode) right after the top rule % (useful for a title or assignments), and #2 is similar, but % inserted right above the bottom rule. % The thicknesses of the top, bottom, left, and right rules are % given as parameters #3,#4,#5,#6 respectively. They should be % \fboxrule or \z@ (or some other thickness). % Argument #7 is the length of the bottom and right rules. % is the width % The text argument is #8. % An instance of this can be used for the frame of \fcolorbox by % locally defining \fbox before \fcolorbox; e.g., % \def\fbox{\CustomFBox{}{}\z@\z@\fboxrule\fboxrule}\fcolorbox \long\def\dt@CustomFBox#1#2#3#4#5#6#7#8#9{% \leavevmode\begingroup \setbox\@tempboxa\hbox{% \color@begingroup \kern\fboxsep{#9}\kern\fboxsep \color@endgroup}% \hbox{% % Here we calculate and shift for the depth. Done in % a group because one of the arguments might be \@tempdima % (we could use \dimexpr instead without grouping). \begingroup \@tempdima#4\relax \advance\@tempdima\fboxsep \advance\@tempdima\dp\@tempboxa \expandafter\endgroup\expandafter \lower\the\@tempdima\hbox{% \vbox{% \hrule\@height#3\@width#7\relax #1% \hbox{% \vrule\@width#5\relax \hspace{#8} \vbox{% \vskip\fboxsep % maybe these should be parameters too \copy\@tempboxa \vskip\fboxsep}% \vrule\@width#6\relax}% #2% \hrule\@height#4\@width#7\relax}% }% }% \endgroup } \newcommand{\dt@nestedbar@hrule@length}{1em} \newcommand{\dt@nestedbar@ident@from@vrule}{0.4em} \def\dt@OpenFBox#1#2{\fboxsep=\FrameSep \dt@CustomFBox{}{}{#1}{#2}\FrameRule\z@\dt@nestedbar@hrule@length\dt@nestedbar@ident@from@vrule} \newenvironment{nestedbar}[1][\hsize]{ % \def\FrameCommand{% % {\color{black}\vrule width 0.4pt}% % \hspace{1.4em}\fboxsep=\FrameSep% % }% \@ifundefined{OuterFrameSep}{% \@latex@error{To use nestedbar, update framed.sty to a recent version.}\@ehd}{}% \def\FrameCommand{\dt@OpenFBox\FrameRule\FrameRule}% \def\FirstFrameCommand{\dt@OpenFBox\FrameRule\z@}% \def\MidFrameCommand{\dt@OpenFBox\z@\z@}% \def\LastFrameCommand{\dt@OpenFBox\z@\FrameRule}% \OuterFrameSep=1ex% if you get an "Undefined control sequence" error here, upgrade your framed.sty \FrameSep=0pt% \MakeFramed{\hsize#1\advance\hsize-\width\FrameRestore}% }{ \endMakeFramed } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Misc useful macros %\newcommand{\Nth}{\hspace{0.1em}\textsuperscript{th}} %\newcommand{\Nnd}{\hspace{0.1em}\textsuperscript{nd}} %\newcommand{\Nrd}{\hspace{0.1em}\textsuperscript{rd}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %TODO: The [DRAFT ...] text is not centered on text but on text+marginnotes. %TODO: something like \def\nobreakpar[1]{\bigskip\begin{minipage}{\textwidth}\bigskip}{#1}\end{minipage} (use \par?) %TODO: Add optional ``table of comments'', sorted by \XXX, \later, \done flags. \endinput