diff --git a/tex/dtrt.sty b/tex/dtrt.sty new file mode 100644 index 0000000..552228c --- /dev/null +++ b/tex/dtrt.sty @@ -0,0 +1,1059 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% 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