6

This relates to an earlier question I got an answer to the first part and followed some links for the second and came up with a mishmash of code to get it doing what I want but I didn't understand much of what is in the examples with for-loops so they are not the best starting point for me.

Here is a small example of the circle code

\documentclass[paper=a4, fontsize=12pt]{scrartcl}       
\usepackage{amsmath,amsfonts,amsthm}     
\usepackage{graphicx} 

\usepackage{float}
\setlength\parindent{0pt} 
\usepackage{tikz}
\usetikzlibrary{arrows,%
                plotmarks}


\begin{document}
 \begin{figure}[H]

 \makeatletter
\tikzset{
    dot diameter/.store in=\dot@diameter,
    dot diameter=3pt,
    dot spacing/.store in=\dot@spacing,
    dot spacing=10pt,
    dots/.style={
        line width=\dot@diameter,
        line cap=round,
        dash pattern=on 0pt off \dot@spacing
    }
}
\makeatother
 \centering
\label{fig:circle}
   \begin{tikzpicture}
    % Axis
    \draw[thick,->,black] (-4,0)--(4,0) node[below] {$n_x$}; 
    \draw[thick,->,black] (0,-4)--(0,4) node[left] {$n_y$}; 
    \draw[black,thick] (0,0) circle (3.5cm);

    %dots
    \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (0pt,3.5) -- (0pt,6pt) ; 
    \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (0pt,0) -- (110pt,0) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (10pt,3.5) -- (10pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (20pt,3.5) -- (20pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (30pt,3.5) -- (30pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (40pt,3.5) -- (40pt,6pt);  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (50pt,3.5) -- (50pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (60pt,3.5) -- (60pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (70pt,3.5) -- (70pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (80pt,3.5) -- (80pt,6pt) ;  

   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (90pt,3.5) -- (90pt,6pt) ;  
   \draw [black, dot diameter=4pt, dot spacing=10pt, dots] (100pt,3.5) -- (100pt,6pt) ;  


   \end{tikzpicture}

\caption{Two dimensional (2D) n-space of radius n and thickness dn. The density of states at an energy $\epsilon$ is the number of n-states per unit area, $A=L^2$}
\end{figure}
\end{document}

enter image description here

3
  • 1
    use foreach and style. Mar 8, 2013 at 20:28
  • I guessed that much but I don't know how to implement for loops in latex
    – Magpie
    Mar 8, 2013 at 20:29
  • type texdoc pgf to bring the pgf documentation up and read page 35 (about foreach) and 28 (about style). Mar 8, 2013 at 20:31

3 Answers 3

4

TikZ solution

\documentclass[paper=a4, fontsize=12pt]{scrartcl}       
\usepackage{amsmath,amsfonts,amsthm}     
\usepackage{graphicx} 

\usepackage{float}
\setlength\parindent{0pt} 
\usepackage{tikz}
\usetikzlibrary{arrows,%
                plotmarks}


\begin{document}
 \begin{figure}[H]

 \makeatletter
\tikzset{
    dot diameter/.store in=\dot@diameter,
    dot diameter=3pt,
    dot spacing/.store in=\dot@spacing,
    dot spacing=10pt,
    dots/.style={
        line width=\dot@diameter,
        line cap=round,
        dash pattern=on 0pt off \dot@spacing
    }
}
\makeatother
 \centering
\label{fig:circle}
   \begin{tikzpicture}
        [
            mystyle/.style={black, dot diameter=4pt, dot spacing=10pt, dots}
        ]
    % Axis
    \draw[thick,->,black] (-4,0)--(4,0) node[below] {$n_x$}; 
    \draw[thick,->,black] (0,-4)--(0,4) node[left] {$n_y$}; 
    \draw[black,thick] (0,0) circle (3.5cm);

    %dots
    \draw [mystyle] (0pt,0) -- (110pt,0) ; 
    \foreach \x in {0,10,...,100}{\draw [mystyle] (\x pt,3.5) -- (\x pt,6pt); }

   \end{tikzpicture}

\caption{Two dimensional (2D) n-space of radius n and thickness dn. The density of states at an energy $\epsilon$ is the number of n-states per unit area, $A=L^2$}
\end{figure}
\end{document}

PSTricks solution

If you really have to reduce the number of keystrokes, I present the following.

enter image description here

\documentclass[pstricks]{standalone}
\usepackage{pst-plot}
\begin{document}
\begin{pspicture}(-4.5,-4.5)(4.5,4.5)
\psaxes[labels=none,ticks=none]{->}(0,0)(-4,-4)(4,4)[$n_x$,-90][$n_y$,180]
\pscircle{3.5}
\multips(0,0.35){11}{\multips(0.35,0){11}{\psdots(0,0)}}
\end{pspicture}
\end{document}

TikZ solution (with the same result as PSTricks solution)

\documentclass[tikz,margin=5mm]{standalone}       
\begin{document}
\begin{tikzpicture}[thick]
  \draw[-stealth] (-4,0)--(4,0) node[below] {$n_x$}; 
  \draw[-stealth] (0,-4)--(0,4) node[left] {$n_y$}; 
  \draw (0,0) circle (3.5);
  \foreach \x in {0,...,10}{
    \foreach \y in {0,...,10}{
      \fill (\x*.35,\y*.35) circle(.06);
    }
  }
\end{tikzpicture}
\end{document}

Latest edit

The following explanation is for responding the questioner's additional question in his/her comments.

Use standalone document class to produce a tight diagram.

% the name of this file is circle-grid.tex
\documentclass[tikz,margin=5mm]{standalone}       
\begin{document}
\begin{tikzpicture}[thick]
  \draw[-stealth] (-4,0)--(4,0) node[below] {$n_x$}; 
  \draw[-stealth] (0,-4)--(0,4) node[left] {$n_y$}; 
  \draw (0,0) circle (3.5);
  \foreach \x in {0,...,10}{
    \foreach \y in {0,...,10}{
      \fill (\x*.35,\y*.35) circle(.06);
    }
  }
\end{tikzpicture}
\end{document}

Compile the diagram (circle-grid.tex) with pdflatex.exe to get a circle-grid.pdf.

From your main TeX document (you can name it as main.tex, for example), you can import circle-grid.pdf using \includegraphics[]{circle-grid} (this command is provided by graphicx package).

The main TeX document, for example, looks like the following.

% This filename is Main.tex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
Some texts go here \ldots
\begin{figure}
\centering
\includegraphics[]{circle-grid}
\caption{Circle and grid}
\label{fig:circle-grid}
\end{figure}
Other texts go here!
\end{document}

And finally compile the main.tex with pdflatex.exe to get main.pdf.

7
  • Feel free to edit my answer as I am not familiar with TikZ. Mar 8, 2013 at 20:44
  • I answered with the similar tikz solution earlier but deleted it. I thought you weren't going to write it but was surprised that you did, you being a pstricks person. :)
    – hpesoj626
    Mar 8, 2013 at 21:37
  • @hpesoj626: Oh, sorry about that. :-) Mar 8, 2013 at 21:43
  • They are all good answered but I felt the last tikz example on here was most deserving. However I am wondering how you could add this to a document without it all going wrong?
    – Magpie
    Mar 9, 2013 at 17:38
  • @Magpie: Could you explain more about "adding this to a document without it all going wrong?"? Mar 9, 2013 at 17:43
7

Given your output, I would actually use pgfplots which is based on tikz and has a number of useful environments and commands to ease such a graphic

enter image description here

\documentclass{standalone}       
\usepackage{pgfplots}
\pgfplotsset{mydotstyle/.style={color=black,only marks,mark size=1pt}}

\begin{document}

   \begin{tikzpicture}
    \begin{axis}[axis lines=middle,
                             axis equal,
                             xmin=-1.1,xmax=1.1,
                             ymin=-1.1,ymax=1.1,
                             xtick={-2},
                             ytick={-2},
                             xlabel=$n_x$,
                             ylabel=$n_y$,
                             xlabel style={anchor=north},
                             ylabel style={anchor=east},
                             ]
            \addplot[black, samples=100]({cos(deg(x))},{sin(deg(x))});
            \pgfplotsinvokeforeach{0,0.1,...,1.1}
            {
                \addplot[mydotstyle,samples at={0,0.1,...,1.1}]{#1};
                }
    \end{axis}
   \end{tikzpicture}
\end{document}

If you have a lot of these types of pictures, you might want to use something like

\pgfplotsset{mydotstyle/.style={color=black,only marks,mark size=1pt},
                         every axis/.append style={
                         axis lines=middle,
                             axis equal,
                             xmin=-1.1,xmax=1.1,
                             ymin=-1.1,ymax=1.1,
                             xtick={-2},
                             ytick={-2},
                             xlabel=$n_x$,
                             ylabel=$n_y$,
                             xlabel style={anchor=north},
                             ylabel style={anchor=east},
                         }}

in which case you can just use

\begin{tikzpicture}
    \begin{axis}
      \addplot...
    \end{axis}
   \end{tikzpicture}
5
  • I would go with a scatter type of plot with black circle markers to reduce the plot count. Then you need 10 addplots instead of 100.
    – percusse
    Mar 8, 2013 at 21:16
  • @percusse thanks for the feedback :) I'm afraid I don't really understand- could you elaborate?
    – cmhughes
    Mar 8, 2013 at 21:30
  • Sure. I mean; think of every horizontal dotted line as a constant function decorated with black circles with samples=10 or something like that (domain=0:1 etc.). Then you only need to draw y=0, y=1 up to 10 or so which pgfplots doesn't even blink to draw. But single points and 100 of them seems like a waste of compilation time (of course vertical lines work too).
    – percusse
    Mar 8, 2013 at 21:34
  • Thinking of it maybe even a 2D function is better.
    – percusse
    Mar 8, 2013 at 21:37
  • @percusse thanks, nice idea- see the update :)
    – cmhughes
    Mar 8, 2013 at 21:52
5
\documentclass[paper=a4, fontsize=12pt]{scrartcl}       
\usepackage{amsmath,amsfonts,amsthm}     
\usepackage{graphicx} 

\usepackage{float}
\setlength\parindent{0pt} 
\usepackage{tikz}
\usetikzlibrary{arrows,%
                plotmarks}

\begin{document}

\begin{figure}[H]
    \centering
    \label{fig:circle}
    \begin{tikzpicture}
        % Axis
        \pgfmathsetmacro{\D}{3.5}
        \draw[thick,->,black] (-4,0)--(4,0) node[below] {$n_x$}; 
        \draw[thick,->,black] (0,-4)--(0,4) node[left] {$n_y$}; 
        \draw[black,thick] (0,0) circle (\D);

        \pgfmathsetmacro{\dx}{\D/10}
        \pgfmathsetmacro{\lastx}{\D+0.0001}
        \foreach \x in {0,\dx,...,\lastx}{
            \foreach \y in {0,\dx,...,\lastx}{
                \fill[black] (\x,\y) circle(.06);
            }
        }
       \end{tikzpicture}

    \caption{Two dimensional (2D) n-space of radius n and thickness dn.
    The density of states at an energy $\epsilon$ is the number of n-states per unit area, $A=L^2$}
\end{figure}

\end{document}

enter image description here

2
  • The combination of \draw[fill] results in a circle that has a radius of 0.06cm + 0.2pt (half the line width). Use \fill instead. Mar 8, 2013 at 20:58
  • @Qrrbrbirlbel Fixed.
    – jub0bs
    Mar 8, 2013 at 20:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.