[Tex/LaTex] Root systems and weight lattices with PStricks

pstrickstikz-pgf

(Edit: See below)

I am trying to draw a simple picture containing a root system, Weyl chambers and root/weight lattice using pstricks. I am essentially trying to construct something like figures 6.5, 6.6 and 6.7 (pages 193-196) in these lecture notes. I have been able to do most of it:

\begin{pspicture}[showgrid=false](-3.5,-3.5)(3.5,3.5)\psset{unit=1.3}
    \psset{linewidth=1.5pt}
        %Weyl Chambers
        \pscustom[linewidth=0pt,fillstyle=solid,fillcolor=lightgray]{
            \psline(0,3)(0,0)
            \psline(0,0)(2.6,1.5)
        }
            \psline[linestyle=dotted,linewidth=1pt](0,-3)(0,3)
            \psline[linestyle=dotted,linewidth=1pt](-2.6,-1.5)(2.6,1.5)
            \psline[linestyle=dotted,linewidth=1pt](2.6,-1.5)(-2.6,1.5)

        %Roots
        \psline{->}(0,0)(2,0) \psline{->}(0,0)(-2,0)
        \psline{->}(0,0)(-1,1.732) \psline{->}(0,0)(1,-1.732)
        \psline{->}(0,0)(1,1.732) \psline{->}(0,0)(-1,-1.732)

        %Fundamental Weights
        \psline[linewidth=1pt]{->}(0,0)(0,1)
        \psline[linewidth=1pt]{->}(0,0)(0.866,0.5)

\end{pspicture}

enter image description here

but I have problems constructing the weight lattice, like the ones in the lecture notes. Is there a simple way to include this? (It's the lattice spanned by the fundamental weights, the small arrows).


A small bonus question (sorry for asking two questions at once). Many people seem to like TikZ, but I have never used it. Would such a drawing be simpler to draw using TikZ?


Edit: cmhughes has given a very good and useful answer, but as I have written in the comment I still have a small problem with it. What I want is, given two vectors $a = (a_1, a_2)$ and $b = (b_1,b_2)$, to construct the lattice $n_1 a + n_2 b$ where $n_1$ and $n_2$ are integers. Using multido, I can only make this work if the components of $a$ and $b$ are integers and can be decomposed into square lattices (as in cmhughes example). In other words, figure 6.5 seems to be harder to construct in a simple way than figure 6.6. Is there a simple way to do this?

Best Answer

Below is a replication of Figure 6.6 in your linked document. Note the use of multido

\documentclass{article}

\usepackage{pstricks}
\usepackage{multido}

\begin{document}

\begin{pspicture}(0,0)(16,16)
\psset{unit=0.7}
%\psgrid % very useful when constructing!
    \psline[linestyle=dashed,linecolor=blue](0,0)(16,16)
    \psline[linestyle=dashed,linecolor=blue](0,16)(16,0)
    \psline[linestyle=dashed,linecolor=blue](0,8)(16,8)
    \psline[linestyle=dashed,linecolor=blue](8,0)(8,16)
    \multido{\nx=5+2}{4}{\psdot[linecolor=red,dotstyle=o,dotsize=0.2](\nx,15)}%
    \multido{\nx=4+2}{5}{\psdot[linecolor=red,dotsize=0.2](\nx,14)}%
    \multido{\nx=3+2}{6}{\psdot[linecolor=red,dotstyle=o,dotsize=0.2](\nx,13)}%
    \multido{\ny=4+2}{5}{%
        \multido{\nx=2+2}{7}{\psdot[linecolor=red,dotsize=0.2](\nx,\ny)}%
        }
    \multido{\ny=5+2}{4}{%
        \multido{\nx=1+2}{8}{\psdot[linecolor=red,dotstyle=o,dotsize=0.2](\nx,\ny)}%
        }
    \multido{\nx=2+2}{7}{\psdot[linecolor=red,dotsize=0.2](\nx,4)}%
    \multido{\nx=3+2}{6}{\psdot[linecolor=red,dotstyle=o,dotsize=0.2](\nx,3)}%
    \multido{\nx=4+2}{5}{\psdot[linecolor=red,dotsize=0.2](\nx,2)}%
    \multido{\nx=5+2}{4}{\psdot[linecolor=red,dotstyle=o,dotsize=0.2](\nx,1)}%
    \rput(3,15){$\rho_1$}
    \rput(1,13){$\rho_{12}$}
    \rput(1,3){$\rho_{121}$}
    \rput(3,1){$\rho_{1212}=\rho_{2121}$}
    \rput(13,1){$\rho_{212}$}
    \rput(15,3){$\rho_{21}$}
    \rput(15,14){$\rho_{2}$}
    \psline[linecolor=black,arrows=->](8,8)(8,10)
    \psline[linecolor=black,arrows=->](8,8)(9,9)
    \psline[linecolor=gray,arrows=->](8,8)(10,8)
    \psline[linecolor=gray,arrows=->](8,8)(6,10)
    \uput[270](10,8){$\alpha_2$}
    \uput[0](9,9){$\lambda_1$}
    \uput[45](8,10){$\lambda_2$}
    \uput[45](6,10){$\alpha_2$}
\end{pspicture}

\end{document}

enter image description here

If you need the arrows to be on top of the dots, simply change their ordering in the code.

UPDATE

I have recreated Figure 6.5 below. As previously, I imagine that there are more clever/elegant/robust ways to achieve it; I've often found that trying to shortcut can cost me more time than going the long way round. Here is the process I used:

  • found the equation of the lines that the dots lie on
  • plotted the dots on the lines
  • clipped everything outside of the hexagon

AFAIK, \psdot can not take algebraic expressions, so I had to use RPN. If someone knows better, please let me know.

enter image description here

\documentclass{article}

\usepackage{pstricks}
\usepackage{multido}
\usepackage{pst-plot}

\begin{document}

\begin{pspicture}(-5,-5)(5,5)
 \tiny
\psset{unit=0.7}
%\psgrid % very useful when constructing!

% plot the lines
\psset{algebraic=true}
\psplot[linestyle=dashed,linecolor=blue]{-5}{5}{0.5*x}
\psplot[linestyle=dashed,linecolor=blue]{-5}{5}{-0.5*x}
\psline[linestyle=dashed,linecolor=blue](0,-5)(0,5)

% shaded region
\pscustom[linestyle=none,fillstyle=solid,fillcolor=blue]{
            \psline(0,0)(0,4)
            \psline(0,4)(4,2)
            \psline(4,2)(0,0)}

 % clip everything outside of the hexagon
\begin{psclip}{\pspolygon[linestyle=none](-4.5,-2.5)(-4.5,2.5)(0,4.5)(4.5,2.5)(4.5,-2.5)(0,-4.5)}
% plot the HOLLOW dots
\multido{\nx=-4+1}{9}%
{%
    \multido{\nb=-4+1}{10}%
    {%
        % ordered pair: (\nx, 0.5\nx + \nb)
        \psdot[linecolor=red,dotsize=0.4,dotstyle=o](!\nx\space dup 0.5 mul \nb\space add)
    }%
}%

% plot the SOLID dots
\multido{\nx=-4+1}{9}%
{%
    \multido{\nb=-6+3}{5}%
    {%
        % ordered pair: (\nx, 3/2*\nx+\nb)
        \psdot[linecolor=red,dotsize=0.4](!\nx\space dup 2 div 3 mul \nb\space add)
    }%
}%
\end{psclip}

% other stuff
\psline[linecolor=gray,arrows=->](0,0)(2,0)
\psline[linecolor=gray,arrows=->](0,0)(-1,1.5)
\psline[linecolor=black,arrows=->](0,0)(0,1)
\psline[linecolor=black,arrows=->](0,0)(1,0.5)
\rput(-3,-4){$\rho_{121}=\rho_{212}$}
\rput(3,-4){$\rho_{21}$}
\rput(5,0){$\rho_2$}
\rput(-5,0){$\rho_{12}$}
\rput(-3,4){$\rho_{1}$}
\uput[270](1,0.5){$\lambda_1$}
\uput[315](0,1){$\lambda_2$}
\uput[225](2,0){$\alpha_1$}
\uput[0](-1,1.5){$\alpha_2$}

\end{pspicture}

\end{document}    
Related Question