tame/design/tpl/tpl.sty

269 lines
7.4 KiB
TeX
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

% The TAME Programming Language LaTeX style and macros
%
% Copyright (C) 2021 Ryan Specialty, LLC.
%
% Licensed under the Creative Commons Attribution-ShareAlike 4.0
% International License.
%%
%%
% Package Imports
%%
\usepackage[letterpaper]{geometry} % US Letter paper
\usepackage[amsfonts,amssymb]{concmath} % Fonts used by the text
\usepackage{euler} % Concrete Mathematics
\usepackage{makeidx} % Indexing
\usepackage[backend=biber]{biblatex} % BibTeX replacement
\usepackage[colorlinks=true,
linkcolor=href,
citecolor=cite,
urlcolor=href,
draft=false]{hyperref} % Hyperlinks (even in draft mode)
\usepackage{xcolor} % Colors (for hyperlinks)
\usepackage{amsmath,amsthm} % AMS macros, including theorems
\usepackage{suffix} % To aid in defining star macros
\usepackage{marginnote} % Notes in the margin
\usepackage{ccicons} % CC license icons
\usepackage{manfnt} % Dangerous Bend symbols
\usepackage{rotating} % Rotating objects
\addbibresource{tpl.bib}
%%
% Colors
%
% Colors from Tango Icon Theme
% https://en.wikipedia.org/wiki/Tango_Desktop_Project
\definecolor{href}{HTML}{204a87}
\definecolor{cite}{HTML}{4e9a06}
%%
% Common typesetting
%%
% TAME
\newcommand\tame{\textsc{Tame}}
\newcommand\tamer{\textsc{Tamer}}
\newcommand\tameparam[1]{\texttt{#1}}
\newcommand\tameclass[1]{\texttt{#1}}
\newcommand\tameconst[1]{\texttt{#1}}
\newcommand\tametrue{\tameconst{TRUE}}
\newcommand\tamefalse{\tameconst{FALSE}}
\let\tamepkg\texttt
% XML
\let\xml\texttt
\newcommand\xmlnl{\\[-3mm]}
\newcommand\xmlnll{\\[-1mm]}
\newcommand\xpath[1]{\texttt{#1}}
\newcommand\xmlnode[1]{\texttt{#1}}
\newcommand\xmlattr[1]{{@\texttt{#1}}}
%%
% Mathematics
%%
% Boolean
\newcommand\true{\ensuremath\top}
\newcommand\false{\ensuremath\bot}
\newcommand\Bool{\ensuremath{\mathbb{B}}}
% Numbers
\newcommand\Int{\ensuremath{\mathbb{Z}}}
\newcommand\Real{\ensuremath{\mathbb{R}}}
% Sets and families
\newcommand\Set[1]{\ensuremath{\left\{#1\right\}}}
\newcommand\Fam[3]{\ensuremath{\left\{#1_{#2}\right\}_{#2\in #3}}}
\newcommand\len[1]{\ensuremath{\left|#1\right|}}
\newcommand\rank[1]{\ensuremath{\left\|#1\right\|}}
\newcommand\PSet[1]{\mathcal{P}\left(#1\right)}
\newcommand\PSetcard[2]{\mathcal{P}_{#1}\left(#2\right)}
\let\union\cup
\let\Union\bigcup
\let\intersect\cap
% Vectors and matrices with family notations
\newcommand\Vectors{\ensuremath{\mathcal{V}}}
\newcommand\Vector[1]{\ensuremath{\left\langle#1\right\rangle}}
\newcommand\VFam[3]{\ensuremath{\Vector{#1_{#2}}_{#2\in #3}}}
\newcommand\Matrices{\ensuremath{\Vectors^{\Vectors^\Real}}}
\newcommand\MFam[5]{\ensuremath{%
\Vector{{#1_{#2}}_#4}_{\underset{#4\in {#5_#2}}{#2\in #3}}
}}
\newcommand\eleundef{\boxtimes}
% Variable subscripts
\let\varsubscript\imath
\newcommand\varsub[1]{{#1}_{\varsubscript}}
% Logic
\let\infer\vdash
\newcommand\Forall{\@ifstar\@Forallstar\@Forall}
\newcommand\@Forall[2]{\forall #1\left(#2\right)}
\newcommand\@Forallstar[2]{\forall #1 #2}
\newcommand\Exists{\@ifstar\@Existsstar\@Exists}
\newcommand\@Exists[2]{\exists #1\left(#2\right)}
\newcommand\@Existsstar[2]{\exists #1 #2}
% Equivalent, but some syntatic inference involved (e.g. equivalent by
% index, as in classification matches).
\newcommand\equivish{\equiv_{\varsubscript}}
% Group theory
\newcommand\Monoid[3]{\left({#1},{#2},{#3}\right)}
\let\monoidop\bullet
\newcommand\monoidops{\monoidop\cdots\monoidop}
% Closed binary function
\newcommand\cbif[1]{#1\times#1\rightarrow#1}
% Binary function composition
\newcommand\bicomp[1]{{#1}^\circ}
% Grammar
\let\emptystr\epsilon
% TAME Classification
\DeclareMathOperator*\Classify{%
\mathchoice{\vcenter{\hbox{\huge$\mathfrak{C}$}}}
{\vcenter{\hbox{\Large$\mathfrak{C}$}}}
{\frak{C}}
{\frak{C}}
}
% Convenience variants
\DeclareMathOperator*\Classifyland{%
\mathchoice{\vcenter{\hbox{\huge$\mathfrak{C}^\land$}}}
{\vcenter{\hbox{\Large$\mathfrak{C}\land$}}}
{\frak{C^\land}}
{\frak{C^\land}}
}
\DeclareMathOperator*\Classifylor{%
\mathchoice{\vcenter{\hbox{\huge$\mathfrak{C}^\lor$}}}
{\vcenter{\hbox{\Large$\mathfrak{C}\lor$}}}
{\frak{C^\lor}}
{\frak{C^\lor}}
}
%%
% Theorem environments
%%
\numberwithin{equation}{section} % number by section
% Create a new theorem environment along with a set of label/ref/pref
% commands.
\newcommand\newtheoremwithlabel[3]{%
\newtheorem{#1}{#2}[section]
\expandafter\def\csname #1autorefname\endcsname{#2}
\expandafter\newcommand\csname #3label\endcsname[1]{\label{#1:##1}}
\expandafter\newcommand\csname #3ref\endcsname[1]{\autoref{#1:##1}}
\expandafter\newcommand\csname #3pref\endcsname[1]{\spref{#1:##1}}
}
\theoremstyle{definition}
\newtheoremwithlabel{definition}{Definition}{dfn}
\newtheoremwithlabel{axiom}{Axiom}{axm}
\theoremstyle{plain}
\newtheoremwithlabel{corollary}{Corollary}{cor}
\newtheoremwithlabel{lemma}{Lemma}{lem}
\newtheoremwithlabel{theorem}{Theorem}{thm}
\theoremstyle{remark}
\newtheoremwithlabel{remark}{Remark}{rem}
%%
% Optional page reference
%%
% "Smart" page reference changing the text depending on what page the
% reference appears relative to the current.
\newcount\@sprefn
\newcommand\spref[1]{%
% We use labels to get the current page from the previous run, since
% \thepage can be inaccurate except right after a \newpage.
\advance\@sprefn by 1\relax%
\label{__:#1SELF\the\@sprefn}%
\xdef\@@realp{\getpagerefnumber{__:#1SELF\the\@sprefn}}%
\autoref{#1}%
\xdef\@pref{\getpagerefnumber{#1}}%
\ifnum\@pref=\@@realp
% Output nothing; it'd read really awkwardly, for example, if we output
% a figure using [h] and then say "Figure X on this page" in the
% paragraph that's _right_ below it. Even if we didn't use [h]. I
% noticed this awkward effect in Specifying Systems.
\else
\space
\newcount\@p\@p=\@@realp
\advance\@p by 1\relax
\ifnum\@p=\@pref
on the next page%
\else
\advance\@p by -2\relax
\ifnum\@p=\@pref
on the previous page%
\else
on \autopageref{#1}%
\fi
\fi
\fi
}
%%
% General typesetting
%%
\newcommand\pref[1]{\ref{#1} on page~\pageref{#1}}
\newcommand\seclabel[1]{\label{sec:#1}}
\newcommand\secref[1]{Section~\ref{sec:#1}}
\newcommand\secpref[1]{Section~\pref{sec:#1}}
% Definitions (introduction of terms)
\let\dfn\textsl
\newcommand\todo[1]{%
\marginnote{\underline{\textsc{Todo:}}\\
\textsl{#1}}%
}
\newcommand\mremark[1]{\marginnote{\textsl{#1}}}
% A really obnoxious notice making clear to the reader that this portion of
% the work is unfinished, to the point where it's probably even
% incorrect. Uses dangerous bend symbol from manfnt, which is admittedly a
% misuse given that it's often used to represent difficult problems. Though
% I suppose an unfinished work is a difficult problem.
\newcommand\INCOMPLETE[1]{%
\bigskip
\par
\todo{This is incomplete!}
\hfill\textdbend\textbf{\textsl{#1}}\textdbend\hfill
\bigskip
}
%%
% Indexing
%%
% Symbols appear at the beginning of the index
\newcommand\indexsym[2]{\index{__sym_#2@{\ensuremath{#1}}|see {#2}}}
%%
% Dynamic Configuration
%%
\newif\iftplappendix
\InputIfFileExists{./conf.tex}%
{\message{Loaded `./conf.tex'.}}%
{\message{`./conf.tex' not found (did you run `./configure'?).
Using defaults.}%
}