A few months ago, Adam Townsend went to lunch and had a conversation. I wasn’t there, but I imagine the conversation went something like this:
Adam: Hello.
Smitha: Hello.
Adam: How are you?
Smitha: Not bad. I’ve had a funny idea, actually.
Adam: Yes?
Smitha: You know how the\hat command in LaTeΧ puts a caret above a letter?… Well I was thinking it would be funny if someone made a package that made the \hat command put a picture of an actual hat on the symbol instead?
Adam: (After a few hours of laughter.) I’ll see what my flatmate is up to this weekend…
Jeff: What on Earth are you two talking about?!
As anyone who has been anywhere near maths at a university in the last ∞ years will be able to tell you, LaTeΧ (or $\LaTeX$) is a piece of maths typesetting software. It’s a bit like a version of Word that runs in terminal and makes PDFs with really pretty equations.
By default, LaTeΧ can’t do very much, but features can easily added by importing packages: importing the
Changing the behaviour of \hat
By default, the LaTeΧ command
After Adam’s conversation, we had a go at redefining the \hat command by putting the following at the top of our LaTeΧ file.
\renewcommand{\hat}[1]{
% We put our new definition here
}
After a fair amount of fiddling with the code, we eventually got it to produce the following result:
We were now ready to put our code into a package so others could use it.
How to write a package
A LaTeΧ package is made up of:
- a
sty file, containing a collection of commands like the one we wrote above; - a PDF of documentation showing users how to use your package;
- a README file with a basic description of your package.
It’s quite common to make the first two of these by making a
The
\input{docstrip.tex}
\keepsilent
\usedir{tex/latex/realhats}
\preamble
*License goes here*
\endpreamble
\askforoverwritefalse
\generate{
\file{realhats.sty}{\from{realhats.dtx}{realhats}}
}
\endbatchfile
The most important command in this file is \generate
: this says that that the file
realhats.sty
should be made from the file realhats.dtx
taking all the lines that are marked as part of realhats
. The following is part of our dtx
file:
%\lstinline{realhats} is a package for \LaTeX{} that makes the \lstinline{\hat}
%command put real hats on symbols.
%For example, the input \lstinline@\hat{a}=\hat{b}@ will produce the output:
%[\hat{a}=\hat{b}]
%To make a vector with a hat, the input \lstinline@\hat{\mathbf{a}}@ produces:
%[\hat{\mathbf{a}}]
%
%\iffalse
%<*documentation>
\documentclass{article}
\usepackage{realhats}
\usepackage{doc}
\usepackage{listings}
\title{realhats}
\author{Matthew W.~Scroggs \& Adam K.~Townsend}
\begin{document}
\maketitle
\DocInput{realhats.dtx}
\end{document}
%</documentation>
%\fi
%\iffalse
%<*realhats>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{realhats}[2019/02/02 realhats]
\RequirePackage{amsmath}
\RequirePackage{graphicx}
\RequirePackage{ifthen}
\renewcommand{\hat}[1]{
% We put our new definition here
}
%</realhats>
%\fi
The lines near the end between
The rest of this file will make the PDF documentation when the dtx
file is compiled.
The command \DocInput
tells LaTeΧ to include the dtx
again, but with the
%
s that make lines into comments removed. In this way all the comments that describe the functionality will end up
in the PDF. The lines that define the package will not be included in the PDF as they are between \iffalse
and
\fi
.
Writing both the commands and the documentation in the same file like this means that the resulting file is quite a mess, and really quite ugly. But this is apparently the standard way of writing LaTeΧ packages, so rest assured that it’s not just our code that ugly and confusing.
What to do with your package
Once you’ve written a package, you’ll want to get it out there for other people to use. After all, what’s the point of being able to put real hats on top of symbols if the whole world can’t do the same?
First, we put the source code of our package on GitHub, so that Adam and I had an easy way to both work on the same code. This also allows other LaTeΧ lovers to see the source and contribute to it, although none have chosen to add anything yet.
Next, we submitted our package to CTAN, the Comprehensive TeΧ Archive Network.
CTAN is an archive of thousands of LaTeΧ packages, and putting
We figured that the packaged needed a website too, so we made one. We also figured that the website should look as horrid as possible.
How to use realhats
So if you want to end fake hats and put real hats on top of your symbols, you can simply write \usepackage{realhats}
at the top of your LaTeΧ file.
I have seen “crown” hat symbol to signify that the given object is important (like, a with “crown” is more important than other a’s), and I like using this convention myself too. A simple crown that is easy to draw on a blackboard, but a real crown would be nice too.