readme2tex
Renders LaTeX for Github Readmes
Make sure that pdflatex is installed on your system.
readme2tex
is a Python script that "texifies" your readme. It takes in Github Markdown and
replaces anything enclosed between dollar signs with rendered .
In addition, while other Github TeX renderers tend to give a jumpy look to the compiled text,
`readme2tex` ensures that inline mathematical expressions are properly aligned with the rest of the text to give a more natural look to the document. For example, this equation is preprocessed so that it lines up at the correct baseline for the text. This is the one salient feature of this package compared to the others out there.Installation
Make sure that you have Python 2.7 or above and pip
installed. In addition, you'll need to have the programs latex
and dvisvgm
on your PATH
. In addition, you'll need to pre-install the geometry
package in .
To install readme2tex
, you'll need to run
sudo pip install readme2tex
To compile INPUT.md
and render all of its equations, run
python -m readme2tex --output README.md INPUT.md
If you want to do this automatically for every commit of INPUT.md, you can use the --add-git-hook
command once to
set up the post-commit hook, like so
git stash --include-untracked
git branch svgs # if this isn't already there
python -m readme2tex --output README.md --branch svgs --usepackage tikz INPUT.md --add-git-hook
# modify INPUT.md
git add INPUT.md
git commit -a -m "updated readme"
git stash pop
and every git commit
that touches INPUT.md
from now on will allow you to automatically run readme2tex
on it, saving
you from having to remember how readme2tex
works. The caveat is that if you use a GUI to interact with git, things
might get a bit wonky. In particular, readme2tex
will just assume that you're fine with all of the changes and won't
prompt you for verification like it does on the terminal.
Examples:
Here's a display level equation
The code that was used to render this equation is just
$$
\frac{n!}{k!(n-k)!} = {n \choose k}
$$
Note: you can escape $ so that they don't render.
Here's an inline equation.
The code that was used to render this is:
It is well known that if $ax^2 + bx + c = 0$, then $x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$.
Notice that the equations line up with the baseline of the text, even when the height of these two images are different.
Sometimes, you might run into equations that are bottom-heavy, like . Here, readme2tex
can compute the correct offset to align this equation to the baseline of your paragraph of text as well.
http://www.texample.net/)
Tikz (Courtesy ofDid you notice the picture at the top of this page? That was also generated by . readme2tex
is capable of
handling Tikz code. For reference, the picture
is given by the tikz code
\begin{tikzpicture}
\newcounter{density}
\setcounter{density}{20}
\def\couleur{red}
\path[coordinate] (0,0) coordinate(A)
++( 60:6cm) coordinate(B)
++(-60:6cm) coordinate(C);
\draw[fill=\couleur!\thedensity] (A) -- (B) -- (C) -- cycle;
\foreach \x in {1,...,15}{%
\pgfmathsetcounter{density}{\thedensity+10}
\setcounter{density}{\thedensity}
\path[coordinate] coordinate(X) at (A){};
\path[coordinate] (A) -- (B) coordinate[pos=.15](A)
-- (C) coordinate[pos=.15](B)
-- (X) coordinate[pos=.15](C);
\draw[fill=\couleur!\thedensity] (A)--(B)--(C)--cycle;
}
\end{tikzpicture}
We can see a few other examples, such as this graphical proof of the Pythagorean Theorem.
How about a few snowflakes?
Usage
python -m readme2tex --output README.md [READOTHER.md]
It will then look for a file called readother.md
and compile it down to a readable Github-ready
document.
In addition, you can specify other arguments to render.py
, such as:
--readme READOTHER.md
The raw readme to process. Defaults toREADOTHER.md
.--output README.md
The processed readme.md file. Defaults toREADME_GH.md
.--usepackage tikz
Addition packages to use during compilation. You can specify this multiple times.--svgdir svgs/
The directory to store the output svgs. The default issvgs/
--branch master
Experimental Which branch to store the svgs into, the default is just master.--username username
Your github username. This is optional, andrender.py
will try to infer this for you.--project project
The current github project. This is also optional.--nocdn
Ticking this will use relative paths for the output images. Defaults to False.--htmlize
Ticking this will output amd.html
file so you can preview what the output looks like. Defaults to False.--valign
Ticking this will use thevalign
trick (detailed below) instead. See the caveats section for tradeoffs.--rerender
Ticking this will force a recompilation of all equations even if they are already cached.--bustcache
Ticking this will ensure that Github renews its image cache. Github may sometimes take up to an hour for changed images to reappear. This is usually not necessary unless you've made stylistic changes.--add-git-hook
Ticking this will generate a post-commit hook for git that runs readme2tex with the rest of the specified arguments after eachgit commit
.
My usual workflow is to create a secondary branch just for the compiled svgs. You can accomplish this via
python -m readme2tex --branch svgs --output README.md
However, be careful with this command, since it will switch over to the svgs
branch without any input from you.
Technical Tricks
How can you tell where the baseline of an image is?
By prepending every inline equation with an anchor. During post-processing, we can isolate the anchor, which is fixed at the baseline, and crop it out. It's super clowny, but it does the job.
Caveats
Github does not allow you to pass in custom style attributes to your images. While this is useful for security purposes,
it makes it incredibly difficult to ensure that images will align correctly to the text. readme2tex
circumvents this
using one of two tricks:
- In Chrome, the attribute
valign=offset
works forimg
tags as well. This allows us to shift the image directly. Unfortunately, this is not supported within any of the other major browsers, therefore this mode is not enabled by default. - In every (reasonably modern) browser, the
align=middle
attribute will vertically center an image. However, the definition of the vertical "center" is different. In particular, for Chrome, Firefox, (and probably Safari), that center is the exact middle of the image. For IE and Edge however, the center is about 5 pixels (the height of a lower-case character) above the exact center. Since this looks great for non-IE browsers, and reasonably good on Edge, this is the default rendering method. The trick here is to pad either the top or the bottom of the image with extra spaces until the baseline of the equation is at the center. For most equations, this works great. However, if you have a tall equation, like , you'll notice that there might be a lot of slack vertical spacing between these lines. If this is a deal-breaker for you, you can always try the--valign True
mode. For most inline equations, this is usually a non-issue.
How to compile this document
python -m readme2tex --usepackage "tikz" --usepackage "xcolor" --output README.md --branch svgs
and of course
python -m readme2tex --usepackage "tikz" --usepackage "xcolor" --output README.md --branch svgs --add-git-hook