blob: 3dcf31522c4ca5ba653504be492cac7fd136bdb1 [file] [log] [blame]
% $Id$
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{jot}[%
2010/05/01 0.1
(c) 2010 Damien Pollet, Inria / Univ. Lille 1, France
]
\ProcessOptions\relax
\LoadClass[10pt,twoside]{article}
\RequirePackage{booktabs}
\RequirePackage{calc}
\RequirePackage{caption} % captionsetup
\RequirePackage{eso-pic} % banner on 1st page
\RequirePackage{geometry}
\RequirePackage{graphicx}
\RequirePackage{hyperref}
\RequirePackage{ifthen}
\RequirePackage{keyval}
\RequirePackage{listings}
\RequirePackage{placeins} % floats before appendices
\RequirePackage{ragged2e} % \RaggedRight... better ragged text
\RequirePackage{refcount} % number of last page
\RequirePackage{soul} % nice spaced small caps
\RequirePackage{wrapfig} % author pictures
\RequirePackage{xcolor}
% \RequirePackage[grid,texcoord]{eso-pic}
% \RequirePackage{varioref}
%%%% user commands
\@onlypreamble{\title} % \title{...}
\@onlypreamble{\author} % \author[affiliation={a1,a2}, photo=file.jpg]{First Last}{bio & contact info}
\@onlypreamble{\affiliation} % \affiliation{a1}{description}
\@onlypreamble{\jotdetails} % \jotdetails{key=value}
% possible keys:
% year, volume, number, doi, url, dates received/published/revised...
\@onlypreamble{\runningtitle} % override title/author for headers
\@onlypreamble{\runningauthor}
\@onlypreamble{\pdftitle} % override running title/author for PDF metadata
\@onlypreamble{\pdfauthor}
%%%% Publication information
\newcommand\jot@doiderefaddress{http://dx.doi.org/}
\newcommand\jot@doijournalprefix{10.5381}
\newcommand\jot@articledoiaddress{\jot@doiderefaddress\jot@doi}
\newcommand\jot@journaldoiaddress{\jot@doiderefaddress\jot@journaldoi} % not used
\newcommand\jot@journalname{Journal of Object Technology}
\newcommand\jot@journaladdress{http://www.jot.fm/}
\newcommand{\jot@cclicenseurl}{http://creativecommons.org/licenses/by/4.0/}
\newcommand{\jot@publisher}{AITO --- Association Internationale pour les Technologies Objets}
\newcommand{\jot@copyright}{\copyright\,JOT 2011}
\newcommand{\jot@licenseurl}{\jot@journaladdress/copyright.html}
% Initialize properties to default values
\let\jot@year\@empty
\let\jot@volume\@empty
\let\jot@number\@empty
\let\jot@articleno\@empty
\let\jot@received\@empty
\let\jot@published\@empty
\let\jot@revised\@empty
\let\jot@license\@empty
\newcommand{\jot@declaredfirstpage}{1}
\let\jot@doi\@empty
\newcommand{\jot@url}{\jot@journaladdress}
% Declare keys for \jotdetails
\define@key{jot@details@keys}{year}{\renewcommand{\jot@year}{#1}}
\define@key{jot@details@keys}{volume}{\renewcommand{\jot@volume}{#1}}
\define@key{jot@details@keys}{number}{\renewcommand{\jot@number}{#1}}
\define@key{jot@details@keys}{articleno}{\renewcommand{\jot@articleno}{#1}}
\define@key{jot@details@keys}{received}{\renewcommand{\jot@received}{#1}}
\define@key{jot@details@keys}{published}{\renewcommand{\jot@published}{#1}}
\define@key{jot@details@keys}{revised}{\renewcommand{\jot@revised}{#1}}
\define@key{jot@details@keys}{license}{\renewcommand{\jot@license}{#1}}
\define@key{jot@details@keys}{firstpage}{\renewcommand{\jot@declaredfirstpage}{#1}}
\define@key{jot@details@keys}{doi}{\renewcommand{\jot@doi}{#1}}
\define@key{jot@details@keys}{doisuffix}{\renewcommand{\jot@doi}{\jot@doijournalprefix/#1}}
\define@key{jot@details@keys}{url}{\renewcommand{\jot@url}{#1}}
% argument is a comma seperated list of the type "volume=6,year=8,..."
% If we have details of section we are interested in, process it
\newcommand{\jotdetails}[1]{\setkeys{jot@details@keys}{#1}}
%%%% Article metadata
% metadata setters, to override default values set by \author and \title
\newcommand{\runningtitle}[1]{\renewcommand\jot@runningtitle{#1}}
\newcommand{\runningauthor}[1]{\renewcommand\jot@runningauthor{#1}}
\newcommand{\pdftitle}[1]{\renewcommand{\jot@pdftitle}{#1}}
\newcommand{\pdfauthor}[1]{\renewcommand{\jot@pdfauthor}{#1}}
\newcommand\jot@pageprefix{%
\ifx\jot@articleno\@empty\@empty\else\jot@articleno:\fi}
\newcommand\jot@doiorurl{%
\ifx\jot@doi\@empty \jot@url \else \jot@articledoiaddress \fi}
\newcommand\jot@doiorurlhref{%
\ifx\jot@doi\@empty
Available at \url{\jot@url}%
\else
\href{\jot@articledoiaddress}{\nolinkurl{doi:\jot@doi}}
\fi}
\newcommand\jot@runningtitle{\jot@title}
\newcommand\jot@runningauthor{}
\newcommand\jot@firstpage{\getpagerefnumber{jot:firstpage}}
\newcommand\jot@lastpage{\getpagerefnumber{jot:lastpage}}
\newcommand\jot@runningcitation{%
\href{\jot@doiorurl}{\jot@journalname
\ifx\jot@volume\@empty \else , vol.~\jot@volume\fi
\ifx\jot@number\@empty \else , no.~\jot@number\fi
\ifx\jot@year\@empty \else , \jot@year\fi}}
% setting author info
% we're assembling the info into these token lists
\def\jot@authors{\@empty}
\def\jot@authorbios{\@empty}
\def\jot@affiliations{\@empty}
\def\jot@addto@authors{\g@addto@macro\jot@authors}
\def\jot@addto@authorbios{\g@addto@macro\jot@authorbios}
% setup counters for generating author/affiliation links
\newcounter{jot@numauthors}\setcounter{jot@numauthors}{0}
\newcounter{jot@numaffiliations}\setcounter{jot@numaffiliations}{0}
\newtoks\jot@tmp@aff
\newtoks\jot@tmp@pic
% parsing the key/val argument of \author
\newif\ifjot@authorbio@nowrap
\define@key{jot@author@keys}{affiliation}[\@empty]{\jot@tmp@aff\expandafter{#1}}
\define@key{jot@author@keys}{photo}[\@empty]{\jot@tmp@pic\expandafter{#1}}
\define@key{jot@author@keys}{nowrap}[true]{\csname jot@authorbio@nowrap#1\endcsname}
% Handle CC licensing
\newcommand{\jot@ccby}{ccby}
\newcommand{\jot@ccbynd}{ccbynd}
\newcommand{\jot@ccbyncnd}{ccbyncnd}
\newcommand\jot@expandedlicense{%
\ifx\jot@license\@empty%
\ClassWarning{jot.cls}{No license specified.}%
\else%
\ifx\jot@license\jot@ccby%
\href{http://creativecommons.org/licenses/by/4.0/}{Attribution 4.0 International (CC BY 4.0)}%
\else%
\ifx\jot@license\jot@ccbynd%
\href{http://creativecommons.org/licenses/by-nd/4.0/}{Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0)}%
\else%
\ifx\jot@license\jot@ccbyncnd%
\href{https://creativecommons.org/licenses/by-nc-nd/4.0/}{Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)}%
\else%
\ClassWarning{jot.cls}{Unknown license specified.}%
Unknown license.%
\fi%
\fi%
\fi%
\fi}
% declare an author: \author[photo=...,affiliation=...]{name}{bio}
\let\orig@author\author % original \author setter, for layout
\newcommand{\jot@needslong@author}[3][]{%
\addtocounter{jot@numauthors}{1}%
\edef\jot@tmp@id{\roman{jot@numauthors}}%
\ifnum 1<\value{jot@numauthors} % not the 1st
\g@addto@macro\jot@authors{\and}%
\g@addto@macro\jot@runningauthor{\running@and}%
\fi
\g@addto@macro\jot@runningauthor{#2}%
\jot@tmp@aff{\@empty}\jot@tmp@pic{\@empty}%
\jot@authorbio@nowrapfalse
\setkeys{jot@author@keys}{#1}%
\ifx\the\jot@tmp@aff\@empty \ClassWarning{jot.cls}{No affiliation given for #2}\fi
\ifx\the\jot@tmp@pic\@empty \ClassWarning{jot.cls}{No photo given for #2}\fi
% meh, I want proper quasi-quoting...
\jot@addto@authors{\jot@format@author}%
\expandafter\jot@addto@authors\expandafter{\expandafter{\jot@tmp@id}}%
\jot@addto@authors{{#2}}%
\expandafter\jot@addto@authors\expandafter{\expandafter{\the\jot@tmp@aff}}%
\jot@addto@authors{{#3}}
\ifjot@authorbio@nowrap
\jot@addto@authorbios{\jot@format@shortauthorbio}%
\else
\jot@addto@authorbios{\jot@format@authorbio}%
\fi
\expandafter\jot@addto@authorbios\expandafter{\expandafter{\jot@tmp@id}}%
\jot@addto@authorbios{{#2}}%
\expandafter\jot@addto@authorbios\expandafter{\expandafter{\the\jot@tmp@pic}}%
\jot@addto@authorbios{{#3}}%
}
\long\def\author{\jot@needslong@author}
\def\thanks{\ClassWarning{jot.cls}{Use the acknowledgments environment instead of \protect\thanks}\@gobble}
% declare an affiliation: \affiliation{id}{details}
\newcommand{\affiliation}[2]{%
\addtocounter{jot@numaffiliations}{1}%
\expandafter\def\csname jot@affiliation@#1\endcsname{#2}%
\expandafter\edef\csname jot@affiliationnum@#1\endcsname{\alph{jot@numaffiliations}}%
% \ClassWarning{jot.cls}{New affiliation \csname jot@affiliationnum@#1\endcsname: #1}
\g@addto@macro\jot@affiliations{\jot@format@affiliation{#1}}%
\define@key{jot@affiliation@keys}{#1}[#1]{\jot@ref@affiliation{#1}}%
}
% setting title
\let\orig@title\title
\renewcommand{\title}[2][\@empty]{%
\ifx#1\@empty
\renewcommand\jot@runningtitle{#2}
\else
\renewcommand\jot@runningtitle{#1}
\fi
\orig@title{#2}
}
%%%% Layout & typography
\geometry{
% showframe,
a4paper,
% letterpaper,
% asymmetric,
body={13cm,21cm}, %golden ratio 2x ratio: body={12cm,24cm},
top=3.5cm, centering,%inner=3cm,
ignoreall, marginpar=30mm, marginparsep=5mm, %marginpar=42mm, marginparsep=6mm,
head=10mm, headsep=15mm, foot=15mm,
columnsep=5mm
}
\setlength{\intextsep}{.5ex} % for wrapfig
\definecolor{internallinkcolor}{rgb}{0,0,0}
\definecolor{externallinkcolor}{rgb}{0,0,0}
\hypersetup{
breaklinks,
colorlinks,
urlcolor=externallinkcolor,
linkcolor=internallinkcolor,
filecolor=externallinkcolor,
citecolor=internallinkcolor,
}
\let\titlefamily\sffamily
% page headers & footers
\pagenumbering{arabic}
\newcommand\jot@headfootsetup{\let\thanks\@gobble\footnotesize}
\renewcommand{\ps@headings}{%
\renewcommand{\@oddhead}{\titlefamily
\hfil{\jot@headfootsetup\jot@runningtitle\quad\textperiodcentered\quad}\thepage}%
\renewcommand{\@evenhead}{\titlefamily
\thepage{\jot@headfootsetup\quad\textperiodcentered\quad\jot@runningauthor}\hfil}%
\renewcommand{\@oddfoot}{\titlefamily\hfil{\jot@headfootsetup\jot@runningcitation}\hfil}%
\renewcommand{\@evenfoot}{\titlefamily\hfil{\jot@headfootsetup\jot@runningcitation}\hfil}%
}
\renewcommand{\ps@plain}{%
\renewcommand{\@evenhead}{}
\renewcommand{\@oddhead}{}
\renewcommand{\@evenfoot}{}
\renewcommand{\@oddfoot}{%
\titlefamily
\hfil
\begin{minipage}[t]{\textwidth}\jot@headfootsetup\raggedright
\let\jot@format@author\jot@name@author
\let\and\running@and
\let\\\relax
\jot@authors.\quad
\emph{\jot@title}.\quad
Licensed under \jot@expandedlicense.\quad
In \jot@runningcitation, pages~\jot@pageprefix\jot@firstpage--\jot@lastpage.\quad
\jot@doiorurlhref
\end{minipage}%
\hfil
}%
}
\pagestyle{headings}
%% sectioning
\renewcommand\section{\@startsection{section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\titlefamily}}
\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\titlefamily}}
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-2.5ex\@plus -1ex \@minus -.2ex}%
{1ex \@plus .2ex}%
{\normalfont\normalsize\titlefamily}}
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{2.5ex \@plus1ex \@minus.2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
\renewcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
%% floats
\newenvironment{fullwidth}
{\list{}{%
\leftmargin-2cm
\rightmargin\leftmargin}
\item\relax}
{\endlist}
\captionsetup{
format=plain,
indention=1.5em,
labelsep=endash,
justification=RaggedRight,
font={normalfont,small},
labelfont=sf, % same as \titlefamily
}
\captionsetup[listings]{position=above}
\lstset{
basicstyle={\ttfamily},
columns=fullflexible,
captionpos=b,
abovecaptionskip=\medskipamount,
% gobble=4,
% escapeinside={_}{_},
% escapebegin={\rmfamily\textlangle\itshape},
% escapeend={\upshape\textrangle},
}
\lstdefinestyle{numbers}{
numbers=left,
numberstyle={\sffamily\footnotesize},
numbersep=5mm,
}
\lstdefinestyle{float}{
float=tb,
frame=tb,
% backgroundcolor=\color{lightgray}
}
%% title page and typesetting author info
%% short way to typeset \and for headers & metadata
\def\running@and{, }
\def\@mysplit#1/#2\@nil{%
\rlap{\hskip0.1ex\setkeys{jot@affiliation@keys}{#1}}
\ifx#2\@empty\else\rlap{\hskip0.2ex\raisebox{0.4em}{\footnotesize ,}\hskip0.2ex\setkeys{jot@affiliation@keys}{#2}}\fi}
\newcommand\jot@name@author[4]{#2}
\newcommand\jot@format@author[4]{% id, name, affiliations, bio
\ifx #4\relax % meh, {} is not \@empty ??
\relax #2%
\else
\hyperlink{jot:authorbio:#1}{#2}%
\fi
% list of footnote-like links to affiliations
\ifx#3\@empty\else\rlap{\setkeys{jot@affiliation@keys}{#3}}\fi}
\newcommand\jot@ref@affiliation[1]{%
\hyperlink{jot:affiliation:#1}{\strut\textsuperscript{\csname jot@affiliationnum@#1\endcsname}}}
\newcommand\jot@format@affiliation[1]{% id
\item[\csname jot@affiliationnum@#1\endcsname.\,]%
\hypertarget{jot:affiliation:#1}{\csname jot@affiliation@#1\endcsname}}
\newlength{\strutheight}
\newcommand\jot@format@authorbio[4]{%
\ifx #4\relax % meh, {} is not \@empty ??
\relax
\else
\settoheight{\strutheight}{\strut}%
\noindent
\ifx #3\@empty\relax\else
\begin{wrapfigure}{l}{2.5cm}%
\raisebox{\intextsep+\strutheight-\height}
[\strutheight]
[\height-\strutheight-\intextsep]
{\includegraphics[width=2.5cm]{#3}}%
\end{wrapfigure}%
\fi
\strut\hypertarget{jot:authorbio:#1}{\let\thanks\@gobble\textbf{#2}}\ \ignorespaces
#4\par
\bigskip
\fi
}
\newcommand\jot@format@shortauthorbio[4]{%
\ifx #4\relax % meh, {} is not \@empty ??
\relax
\else
\noindent
\ifx #3\@empty
\hypertarget{jot:authorbio:#1}{\let\thanks\@gobble\textbf{#2}}\ \ignorespaces
#4
\else
\raisebox{-\height}{\includegraphics[width=2.5cm]{#3}}%
\hspace{5mm}%
\raisebox{-\height}{\begin{minipage}[t]{\textwidth-3cm}
\noindent\strut
\hypertarget{jot:authorbio:#1}{\let\thanks\@gobble\textbf{#2}}\ \ignorespaces
#4
\end{minipage}}%
\fi
\par
\bigskip
\fi
}
\providecommand{\bibname}{References} % it's a babel addition
\let\orig@bibliography\bibliography
\renewcommand\bibliography[1]{
\phantomsection
\addcontentsline{toc}{section}{\bibname}
\orig@bibliography{#1}}
\def\@openbib@code{\itemsep\z@\RaggedRight}
\def\abouttheauthorsname{About the author\ifnum 1<\value{jot@numauthors}s\fi}
\newcommand{\abouttheauthors}{%
\phantomsection
\addcontentsline{toc}{section}{\abouttheauthorsname}
\section*{\abouttheauthorsname}
\jot@authorbios}
\newcommand\acknowledgmentsname{Acknowledgments}
\newenvironment{acknowledgments}
{\paragraph*{\acknowledgmentsname}}
{}
\renewcommand{\@maketitle}{%
\setcounter{page}{\jot@declaredfirstpage}%
\label{jot:firstpage}%
\AddToShipoutPicture*{%
\setlength\unitlength{1mm}%
\AtPageUpperLeft{%
% \put(8,-8){\makebox(0,0)[lt]{\includegraphics[scale=.75]{jot-sig}}}%
% \put(175,-30){\makebox(0,0)[cc]{\includegraphics[width=3cm]{jot-uml}}}%
\put(105,-18){\makebox(0,0)[ct]{\parbox{\textwidth}{\centering
{\Large
% \raisebox{.8ex-.5\height}{\includegraphics[height=.8\baselineskip]{jot-umlsquare}}\quad
\null\rmfamily\caps\jot@journalname}\\
\smallskip
\small\sffamily Published by \jot@publisher\\
\url{\jot@journaladdress}
}}}}}%
\null
\vskip 3em%
\begin{center}%
\let \footnote \thanks
{\Huge\titlefamily \@title \par}%
\vskip 1.5em%
{\large
\lineskip .75em%
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par}%
\vskip 1em%
\end{center}%
\list{}{%
\rightmargin \leftmargin
\advance\leftmargin 1.5em
\listparindent \z@
\itemindent \listparindent
\labelwidth 1em%
\labelsep .5em%
\parsep \z@
\itemsep 1ex}%
\jot@affiliations
\endlist
\par
\vskip 1.5em
}
\renewenvironment{abstract}
{\quotation\noindent{\titlefamily Abstract}\quad\ignorespaces}
{\endquotation}
\newcommand{\keywords}[1]{%
\begin{quotation}\noindent{\titlefamily Keywords}\quad\ignorespaces
#1%
\end{quotation}}
\newcommand{\backmatter}{%
\FloatBarrier
\appendix}
% document hooks
\AtBeginDocument{%
\let\jot@title\@title
\orig@author{\jot@authors}%
\hypersetup{% Embed PDF metadata after user has set it in preamble.
pdfauthor=\jot@runningauthor,
pdftitle=\jot@runningtitle,
pdfsubject=\jot@journalname,
}%
\date{}% should customize \maketitle
\maketitle
\raggedbottom
}
\AtEndDocument{%
\label{jot:lastpage}%
\vfill
% \centering
% \includegraphics[height=\baselineskip]{jot-umlsquare}%
}
% various convenience markup
\newcommand{\email}[1]{\href{mailto:#1}{\nolinkurl{#1}}}
%% varioref:
% \labelformat{section}{\textsection\,#1}
% \labelformat{subsection}{\textsection\,#1}
% \labelformat{subsubsection}{\textsection\,#1}
% \labelformat{figure}{figure\,#1}
% \labelformat{table}{table\,#1}