# Typesetting inline Penrose/Cvitanovic tensor diagrams (birdtracks)

In the 50's, Roger Penrose invented a private graphical notation for tensors, which he later published. Wikipedia has a short description. It's basically a directed graph with some labels on it and some external edges. Predrag Cvitanovic has a modified version which is more amenable to typesetting, because he uses arrows rather than depending on "gravity" to give the direction of the edges, so it's easier to lay out as an inline or displayed equation. Penrose uses geometrical shapes for the nodes his diagrams, but I would be just as happy using letters. With Cvitanovic's convention I can do simple examples as inline tex math, e.g., \rightarrow\bigoplus\rightarrow\bigodot\leftarrow, or \rightarrow u\rightarrow v\leftarrow. (For the geometrical versions, it would be nice to have large squares, circles, and triangles, the size of \bigoplus --- is there any way to produce these? Things like \nabla seem too small.)

What would really be nice would be a way to typeset slightly more complex examples as latex math. Here are two examples using letters in the nodes:

Examples like the top one are clearly doable with symbols like \rightleftarrow. I'm wondering if it's possible to get some of the fancier features such as the circle and loop in the second diagram, or the kinds of crossbars and wiggly crossbars shown in the WP article. The diagrams are somewhat related to Feynman diagrams, so it seems like maybe it could be done with one of the packages used for drawing those, but those seem more oriented toward drawing larger and more inescapably 2-D diagrams, and it's also not obvious to me which package is the best and most modern.

-
I later found this very nice page on this topic: elishapeterson.wikidot.com/tikz:diagrams – Ben Crowell Mar 10 '13 at 19:18

## 1 Answer

I figured out enough about tikz to produce the following:

My code is below. Comments would be appreciated, since I don't really know what I'm doing with tikz. Is there a good way to avoid hardcoding the distances between nodes and the size of the circle?

\documentclass{article}
\RequirePackage{tikz}
\begin{document}

\pgfdeclarelayer{nodelayer}
\pgfdeclarelayer{edgelayer}
\pgfsetlayers{edgelayer,nodelayer,main}
\tikzstyle{plain}=[rectangle,fill=none,draw=black,scale=1.0,inner sep=1.8pt] % circle also works
\tikzstyle{arrow}=[draw=black,arrows=-latex]

The notation
\begin{tikzpicture}[baseline=(n0.base),thick]
\begin{pgfonlayer}{nodelayer}
\node [style=plain] (n0) at (0, 0) {$u$};
\node [style=plain] (n1) at +(2.3em, 0) {$v$};
\end{pgfonlayer}
\begin{pgfonlayer}{edgelayer}
\draw [style=arrow] (n0) to (n1);
\end{pgfonlayer}
\end{tikzpicture}
means the inner product $u_a v^a$.

The following displayed picture represents the tensor expression $u^a_{abc}\nabla_d v^{bc}$:

\begin{tikzpicture}[thick]
\begin{pgfonlayer}{nodelayer}
\node [style=plain] (n0) at (0, 0) {$u$};
\node [style=plain] (n1) at (3.1em, 0) {$v$};
\node [style=circle,draw=black,minimum size=2.1\baselineskip] (c1) at (n1) {};
\end{pgfonlayer}
\begin{pgfonlayer}{edgelayer}
\draw [style=arrow,out=10,in=170] (n0) to (n1);
\draw [style=arrow,out=-10,in=190] (n0) to (n1);
\draw [style=arrow,out=30,in=150, distance=1.8\baselineskip, loop] (n0) to ();
\draw [style=arrow] (c1.east) to +(1.4em,0);
\end{pgfonlayer}
\end{tikzpicture}

\end{document}

-
Since there seem to be no objections to your code you should probably accept your answer – Tobias Kienzler May 2 '13 at 6:36