9

I am trying to draw an Indian Flag using ideas from here and others including an Ashok-chakra symbol from overleaf example. I want to have the proper coding with correct dimensions mentioned at wikipedia. I have a doubt on the size of Ashok-Chakra. Any one help me please! My MWE is given below:

\documentclass[tikz]{standalone}


\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra

\tikzstyle{bharat}=[draw=navyblue,fill=navyblue]

\begin{document}
\begin{tikzpicture}
    \fill[saffron] (0,400mm) rectangle (900mm,600mm);
    \fill[white] (0,200mm) rectangle (900mm,400mm);
    \fill[indiegreen] (0,0) rectangle (900mm,200mm);
    \node at (450mm,300mm)[scale=0.09]{%
    \begin{tikzpicture}
        \draw[bharat, even odd rule] (0,0) circle (92.5) (0,0) circle (80); 
        \draw[bharat] (0,0) circle (16);
        \foreach \x in {0,..., 23}{
            \draw[bharat] (7.5+15*\x:80) circle (3.5); 
            \draw[bharat, rotate=15*\x] (0,0)--(5.38:32)--(80,0)--(-5.38:32)--cycle; 
        }
    \end{tikzpicture}
    };
\end{tikzpicture}
\end{document}

Output looks like: enter image description here

3 Answers 3

9

To enforce the nine different measurements one can use the .is choice key handler from the pgfkeys stuff. I have reimplemented the flag code (which probably needs more fiddling to get the details of Ashoka Chakra exactly right). Note, that for the larger sizes of the flag, the x and y vectors need to be changed to avoid dimension too large errors:

\documentclass[tikz,border=5]{standalone}
\definecolor{saffron}{HTML}{FF9933}
\definecolor{white}{HTML}{FFFFFF}
\definecolor{indiegreen}{HTML}{138808}
\definecolor{navyblue}{HTML}{000080}
\tikzset{%
  flag width/.store in=\flagwidth,
  flag height/.store in=\flagheight,
  flag size/.style args={#1x#2}{flag width=#1, flag height=#2},
  Ashoka Chakra/.store in=\AshokaChakra,
  size/.is choice,
  size/.cd,
    1/.style={flag size=6300x4200, Ashoka Chakra=1295},
    2/.style={flag size=3600x2400, Ashoka Chakra=740},
    3/.style={flag size=2700x1800, Ashoka Chakra=555},
    4/.style={flag size=1800x1200, Ashoka Chakra=370},
    5/.style={flag size=1350x900, Ashoka Chakra=280},
    6/.style={flag size=900x600, Ashoka Chakra=185},
    7/.style={flag size=450x300, Ashoka Chakra=90},
    8/.style={flag size=225x150, Ashoka Chakra=40},
    9/.style={flag size=150x100, Ashoka Chakra=25},
  /tikz/.cd,
  Flag of India/.pic={%
    \begin{scope}[#1,
    local bounding box/.expanded=\pgfkeysvalueof{/tikz/name prefix}]%
    \foreach \stripecolor [count=\i from 0] in {indiegreen, white, saffron}
      \path [fill=\stripecolor]
      (-\flagwidth/2, \i/3*\flagheight-\flagheight/2)
      rectangle ++(\flagwidth, 1/3*\flagheight);
    \tikzset{scale=\AshokaChakra/2}
    \path [fill=navyblue, even odd rule]
      circle [radius=1] circle [radius=22/25] circle [radius=1/5];
    \foreach \i in {0,...,23}
       \path [fill=navyblue] (15/2+15*\i:22/25) circle [radius=1/20] 
       [rotate=15*\i] (0:0) -- (21/4:1/3) -- (0:7/8)-- (-21/4:1/3)--cycle;
     \end{scope}
 },
 Flag of India/.default={size=9}  
}
\begin{document}
\begin{tikzpicture}[x=1mm, y=1mm]
\coordinate (flag);
\foreach \size in {5,...,9}
  \pic at (flag.south) (flag)
    {Flag of India={size=\size, shift=(270:\flagheight*3/4)}};
\end{tikzpicture}
\end{document}

enter image description here

8

You have more problems:

  • put pic in own tikzpicture is wrong approach
  • Due to scalebox you need for pic use coordinates multiplied with inverse of scaling factor.

enter image description here

\documentclass[tikz, border=3mm]{standalone}

\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra


\tikzset{
    estilo/.style = {draw=navyblue,fill=navyblue},% moved here
  ashokchakra/.pic ={
\scalebox{0.1}{
%\begin{tikzpicture} % <-- had to be deleted
    \draw[estilo, even odd rule] (0,0) circle (92.5) (0,0) circle (80);
    \draw[estilo] (0,0) circle (16);
    \foreach \x in {0,..., 23}{
        \draw[estilo] (7.5+15*\x:80) circle (3.5);
        \draw[estilo, rotate=15*\x] (0,0)--(5.38:32)--(80,0)--(-5.38:32)--cycle;
    \node{ \tikzpictext};
    }
%\end{tikzpicture} % <-- had to be deleted
}}}

\begin{document}
\begin{tikzpicture}
    \fill[saffron]      (0,40) rectangle (90,60);
    \fill[white]        (0,20) rectangle (90,40);
    \fill[indiegreen]   (0, 0) rectangle (90,20);
    \pic at (450,300) {ashokchakra};% <-- since you use scalebox
\end{tikzpicture}
\end{document}

Better result you obtain, if you not use scalebox and manually scale all coordinates in pic figures:

\documentclass[tikz, border=3mm]{standalone}
\definecolor{saffron}{HTML}{FF9933} % top stripe
\definecolor{white}{HTML}{FFFFFF} % middle stripe
\definecolor{indiegreen}{HTML}{138808} % bottom stripe
\definecolor{navyblue}{HTML}{000080} % ashok chakra

\begin{document}
\begin{tikzpicture}[
    estilo/.style = {draw=navyblue,fill=navyblue},% moved here
  ashokchakra/.pic ={
    \draw[estilo, even odd rule] (0,0) circle (9.25) (0,0) circle (8);
    \draw[estilo] (0,0) circle (1.6);
    \foreach \x in {0,..., 23}
    {
    \draw[estilo] (0.75+15*\x:8.0) circle (0.35);
    \draw[estilo, rotate=15*\x] (0,0)--(0.538:3.2)--(8.0,0)--(-5.38:3.2)--cycle;
    }
    }%end of pic
                ]
    \fill[saffron]      (0,40) rectangle (90,60);
    \fill[white]        (0,20) rectangle (90,40);
    \fill[indiegreen]   (0, 0) rectangle (90,20);
    \pic at (45,30) {ashokchakra};% <-- since you use scalebox
\end{tikzpicture}
\end{document}

In above MWE the styles for ashokchakra is moved in tikzpicture

enter image description here

2
  • Thank you Zarko. I appreciate your idea. I still have to learn a lot in tikz. I modified earlier code and put the Ashok-chakra in proper place now using node in the meantime. I want to have proper dimensions as specified by the Union Government here! Detail sizes are mentioned at https://en.wikipedia.org/wiki/Flag_of_India
    – Khaaba
    Nov 20, 2016 at 8:30
  • 3
    My starting point was your first version of question and in answer I solved your basic LaTeX problem exposed in it: make code works as expected. Regarding dimension of Indian flag: this is up to you. In my answer I assume, that the copied code from ` overleaf example` consider correct measures.
    – Zarko
    Nov 20, 2016 at 8:43
0

inspired by one of the solutions here, without nested tikzpicture's and with a slight change of the wheel. Scales nicely too.

\documentclass[tikz]{standalone}

\definecolor{kesara}{HTML}{FF9933} % top stripe
\definecolor{madhya}{HTML}{FFFFFF} % middle stripe
\definecolor{harita}{HTML}{138808} % bottom stripe
\definecolor{ashokaneela}{HTML}{000080} % ashok chakra

\usetikzlibrary{calc,fit}
\tikzset{
  bharat/.style={ draw=ashokaneela,fill=ashokaneela }
}

\begin{document}
\begin{tikzpicture}[scale=.9]
  \fill [kesara] (0,400mm) rectangle (900mm,600mm);
  \node (mid) [fit={ (0,200mm) (900mm,400mm) }, rectangle, inner sep=0, fill=madhya] {};
  \fill [harita] (0,0) rectangle (900mm,200mm);
  \fill (mid) [ashokaneela] circle (93mm) ;
  \fill (mid) [white] circle (80mm) ;
  \fill (mid) [ashokaneela] circle (16mm) ;
  \foreach \x in {0,..., 23}{
  \fill [ashokaneela] ($ (mid) + (7.5+15*\x:80mm) $) circle (4mm) ; 
  \fill [ashokaneela, rotate around = {15*\x:(mid)}] 
        ($ (mid) + (10mm,0) $) -- +(26mm,-3mm) -- 
        ($ (mid) + (92mm,0) $) -- +(-56mm,3mm) -- cycle ; 
  }
\end{tikzpicture}
\end{document}

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .