# Levi-Civita symbol: 3D matrix

During the current review of the tensors I have arrived at a page of Wikipedia where you can see the symbol of Levi-Civita in a beautiful three-dimensional matrix.

I hope that nobody will be angry with me if I do not produce any MWE but for me it would be nice to see the construction of a matrix so made and can be made available to other users.

• Nobody will be angry, don't worry. If I hadn't reached my 40-vote limit, you would have got my +1. Your question is very interesting (and hard).
– user156344
Mar 5, 2019 at 16:37
• @JouleV LOL LOL when I thought about what to write, I sincerely thought about you :-). Isn't it that you write to me that I'm 10k and I don't produce even a minimum MWE? Mar 5, 2019 at 16:39
• Well, I was thinking about how to solve this and I read that word ;-) lol I knew I had to write something :D
– user156344
Mar 5, 2019 at 16:40

More or less:

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning, matrix}
\usepackage{amsmath}

\newcommand{\arrayfilling}[2]{
\fill[#2!30, opacity=.5] ([shift={(1mm,1mm)}]#1.north west) coordinate(#1auxnw)--([shift={(1mm,1mm)}]#1.north east)coordinate(#1auxne) to[out=-75, in=75] ([shift={(1mm,-1mm)}]#1.south east)coordinate(#1auxse)--([shift={(1mm,-1mm)}]#1.south west)coordinate(#1auxsw) to[out=105, in=-105] cycle;
\fill[#2!80!black, opacity=1] (#1auxne) to[out=-75, in=75] (#1auxse) to[out=78, in=-78] cycle;
\fill[#2!80!black, opacity=1] (#1auxnw) to[out=-105, in=105] (#1auxsw) to[out=102, in=-102] cycle;
}

\begin{document}
\begin{tikzpicture}[font=\ttfamily,
mymatrix/.style={
matrix of math nodes, inner sep=0pt, color=#1,
column sep=-\pgflinewidth, row sep=-\pgflinewidth, anchor=south west,
nodes={anchor=center, minimum width=5mm,
minimum height=3mm, outer sep=0pt, inner sep=0pt,
text width=5mm, align=right,
draw=none, font=\small},
}
]

\matrix (C) [mymatrix=green] at (6mm,5mm)
{0 & 1 & 0 \\ -1 & 0 & 0\\ 0 & 0 & 0\\};
\arrayfilling{C}{green}

\matrix (B) [mymatrix=red] at (3mm,2.5mm)
{0 & 0 & -1 \\ 0 & 0 & 0\\ 1 & 0 & 0\\};
\arrayfilling{B}{red}

\matrix (A) [mymatrix=blue] at (0,0)
{0 & 0 & 0 \\ 0 & 0 & 1\\ 0 & -1 & 0\\};
\arrayfilling{A}{blue}

\foreach \i in {auxnw, auxne, auxse, auxsw}
\draw[brown, ultra thin] (A\i)--(C\i);

\node[below left=-1mm and 5mm of B.west] {$\epsilon_{ijk} =$};
\end{tikzpicture}
\end{document}


• Please see point (1) in my comment to the answer by @marmot. Mar 5, 2019 at 17:43
• @barbarabeeton Is it better now? Mar 5, 2019 at 17:56
• Yes, better. one might quibble that there is more space than necessary, compared with the space at the right. I think it's best to pay attention to what is actually present in each column, but that does require more attention. Mar 5, 2019 at 18:52
• In the same way as the comment that I have added to marmot I can not establish, given that they are two codes at the same level, which is the best. You have been very good. Thank you very much. Mar 6, 2019 at 20:47

Something like that?

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{mathtools}
\usetikzlibrary{matrix,backgrounds,3d}
\usepackage{tikz-3dplot}
%\definecolor{mygreen}{RGB}{12,252,12}
\begin{document}
\tdplotsetmaincoords{75}{20}
\begin{tikzpicture}[tdplot_main_coords]
\begin{scope}[canvas is xz plane at y=1,transform shape]
\node[inner sep=0pt,text=green!70!black,opacity=0.8] (mat1)
{$\displaystyle\begin{pmatrix*}[r] 0 & 1 & 0 \\ -1 & 0 & 0 \\ 0 & 0 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[green!70!black,opacity=0.2] ([xshift=8.5pt]mat1.south west)
coordinate (blb) to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat1.north west) coordinate (tlb) --
([xshift=-8.5pt]mat1.north east) coordinate (trb)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat1.south east)
coordinate (brb)
-- cycle;
\end{scope}
\end{scope}
%
\begin{scope}[canvas is xz plane at y=0,transform shape]
\node[inner sep=0pt,text=red,opacity=0.8] (mat2) {$\displaystyle \begin{pmatrix*}[r] 0 & 0 & -1 \\ 0 & 0 & 0 \\ 1 & 0 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[red,opacity=0.2] ([xshift=8.5pt]mat2.south west) to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat2.north west) -- ([xshift=-8.5pt]mat2.north east)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat2.south east) -- cycle;
\end{scope}
\end{scope}
%
\begin{scope}[canvas is xz plane at y=-1,transform shape]
\node[inner sep=0pt,text=blue,opacity=0.8] (mat3) {$\displaystyle \begin{pmatrix*}[r] 0 & 0 & 0 \\ 0 & 0 & 1 \\ 0 & -1 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[blue,opacity=0.2]
([xshift=8.5pt]mat3.south west) coordinate (blf)
to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat3.north west) coordinate (tlf)
-- ([xshift=-8.5pt]mat3.north east) coordinate (trf)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat3.south east)
coordinate (brf) -- cycle;
\end{scope}
\end{scope}
\foreach \X in {tl,tr,br}
{\draw[thin,orange] (\X f) -- (\X b);}
\begin{scope}[on background layer]
\draw[thin,orange] (blf) -- (blb);
\end{scope}
\node[left] at (mat3.west) {$\varepsilon_{ijk}=$};
\end{tikzpicture}
\end{document}


EDIT: Aligned the entries right, big thanks to Barbara Beeton. (I just wonder why no one complained that the Levi-Civita tensor is not a tensor, but a tensor density. ;-)

2nd EDIT: Response to Anush's comment (well-taken! ;-).

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{mathtools}
\usetikzlibrary{matrix,backgrounds,3d}
\usepackage{tikz-3dplot}
\begin{document}
\tdplotsetmaincoords{75}{20}
\begin{tikzpicture}[tdplot_main_coords]
\begin{scope}[canvas is xz plane at y=1,transform shape]
\node[inner sep=0pt,text=green!70!black,opacity=0.8] (mat1)
{$\displaystyle\begin{pmatrix*}[r] 0 & \hphantom{-}1 & \hphantom{-}0 \\ -1 & 0 & 0 \\ 0 & 0 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[green!70!black,opacity=0.2] ([xshift=8.5pt]mat1.south west)
coordinate (blb) to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat1.north west) coordinate (tlb) --
([xshift=-8.5pt]mat1.north east) coordinate (trb)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat1.south east)
coordinate (brb)
-- cycle;
\end{scope}
\end{scope}
%
\begin{scope}[canvas is xz plane at y=0,transform shape]
\node[inner sep=0pt,text=red,opacity=0.8] (mat2) {$\displaystyle \begin{pmatrix*}[r] \hphantom{-}0 & \hphantom{-}0 & -1 \\ 0 & 0 & 0 \\ 1 & 0 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[red,opacity=0.2] ([xshift=8.5pt]mat2.south west) to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat2.north west) -- ([xshift=-8.5pt]mat2.north east)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat2.south east) -- cycle;
\end{scope}
\end{scope}
%
\begin{scope}[canvas is xz plane at y=-1,transform shape]
\node[inner sep=0pt,text=blue,opacity=0.8] (mat3) {$\displaystyle \begin{pmatrix*}[r] \hphantom{-}0 & 0 & \hphantom{-}0 \\ 0 & 0 & 1 \\ 0 & -1 & 0 \\ \end{pmatrix*}$};
\begin{scope}[on background layer]
\fill[blue,opacity=0.2]
([xshift=8.5pt]mat3.south west) coordinate (blf)
to[out=140,in=-140,looseness=0.7]
([xshift=8.5pt]mat3.north west) coordinate (tlf)
-- ([xshift=-8.5pt]mat3.north east) coordinate (trf)
to[out=-40,in=40,looseness=0.7] ([xshift=-8.5pt]mat3.south east)
coordinate (brf) -- cycle;
\end{scope}
\end{scope}
\foreach \X in {tl,tr,br}
{\draw[thin,orange] (\X f) -- (\X b);}
\begin{scope}[on background layer]
\draw[thin,orange] (blf) -- (blb);
\end{scope}
\begin{scope}[canvas is xz plane at y=0,transform shape]
\node[left] at (mat2.west -| mat3.west) {$\varepsilon_{ijk}=$};
\end{scope}
\end{tikzpicture}
\end{document}


• Two main differences with the image in the question: (1) in the negative entries, the digits are not aligned (and the spacing between columns adjusted to make them visually uniform), and (2) the tops and bottoms of the parentheses are not connected. of these, (1) detracts more from the appearance, although the meaning isn't affected; I happen to velue graceful appearance. Mar 5, 2019 at 17:42
• @barbarabeeton Thanks! (1) can be addressed in a very simple way: loading mathtools and using \begin{pmatrix*}[r]. (2) I do not understand. In Sebastiano's screen shot there are these four lines. Of course, if you'd ask me what they are good for, I'd admit that this is a very good question. ;-) Will revise my answer to address (1), thanks again!
– user121799
Mar 5, 2019 at 17:46
• The $-1$ in the front bottom middle doesn’t look aligned with the $0$ and $1$ in the othe two arrays. In the OPs example they are all nicely lined up. Mar 6, 2019 at 8:02
• @Anush Yes, but this a question of what the OP wants. On can definitely convince LaTeX to typeset the matrices in the way you suggest. I was using some standard routine because it produces some standard output the community seems to have agreed upon. One reason why I wrote the solution in this way is that anyone can adjust the matrices without knowing anything about TikZ, and also because this way one can use orthographic projections, which we cannot subject a tikz matrix to (at least not in straightforward way). I guess Wikipedia would have used orthographic projections if they could.
– user121799
Mar 6, 2019 at 16:37
• @marmot Yes. I have to say your solution is so lovely I am trying to think of an excuse to use it now! Mar 6, 2019 at 17:09