Commands
\drawCaesarsDisk
that works with a number of letters (only A to Z)
\drawCaesarsList
that works with one list for both rings or two different lists
Keys
inner radius
/middle radius
/outer radius
- Improvements: Specify inner radius and add
inner height
and outer height
respectively to calculate the actual radii.
- Improvements: With these heights, scale the letters so that they fit right into one ring segment.
number of letters
(only \drawCaesarsDisk
)
inner letters
and outer letters
(only \drawCaesarsList
): If only inner letters
is specified the letters in the outer ring will be the same as in the inner ring.
shift
Parameters (both commands)
- First (optional): Key=Values for the disk.
- Second (mandatory): where the Disk is placed.
Improvement:
- Radii/font-size calculation (see above)
- Starting with the first letter at the north position or right of it (possible style)
- Adding styles for circles, separators, letters, etc.
Bug: The List command breaks with
! Dimension too large. <recently read> \pgfmath@x
when 46 or more letters are specified.
I forgot something …
Code
\documentclass[tikz]{standalone}
\usetikzlibrary{backgrounds}
\makeatletter
\tikzset{
/caesar/.cd,
inner radius/.store in=\qrr@caesar@innerR,
middle radius/.store in=\qrr@caesar@middleR,
outer radius/.store in=\qrr@caesar@outerR,
inner letters/.store in=\qrr@caesar@innerL,
outer letters/.store in=\qrr@caesar@outerL,
number of letters/.code=\pgfmathtruncatemacro\qrr@caesar@number{#1},
shift/.store in=\qrr@caesar@shift,
% defaults:
outer letters=,
shift=0
}
\newcommand*{\drawCaesarsDisk}[2][]{%
\begingroup
\pgfqkeys{/caesar}{#1}%
\foreach \radius in {\qrr@caesar@innerR,\qrr@caesar@middleR,\qrr@caesar@outerR}
\draw (#2) circle [radius=\radius];
\foreach \step in {0,...,\numexpr\qrr@caesar@number-1}{
\draw[shift={(#2)}] (\step*360/\qrr@caesar@number:\qrr@caesar@innerR) -- (\step*360/\qrr@caesar@number:\qrr@caesar@outerR);
\node[shift={(#2)},rotate=(\step+.5)*360/\qrr@caesar@number-90] at ({(\step+.5)*360/\qrr@caesar@number}:{.5*(\qrr@caesar@innerR)+.5*(\qrr@caesar@middleR)} ) {\@Alph{\numexpr26-\step}};
\pgfmathtruncatemacro\pgf@temp{mod(\step+\qrr@caesar@shift,\qrr@caesar@number)}%
\node[shift={(#2)},rotate=(\step+.5)*360/\qrr@caesar@number-90] at ({(\step+.5)*360/\qrr@caesar@number}:{.5*(\qrr@caesar@outerR)+.5*(\qrr@caesar@middleR)} ) {\@Alph{\numexpr26-\pgf@temp}};
}
\endgroup
}
\newcount\qrr@caesar@c
\newcommand*{\drawCaesarsList}[2][]{%
\begingroup
\pgfqkeys{/caesar}{#1}%
\foreach \radius in {\qrr@caesar@innerR,\qrr@caesar@middleR,\qrr@caesar@outerR}
\draw (#2) circle [radius=\radius];
\qrr@caesar@c=0\relax
\foreach \element in \qrr@caesar@innerL {\global\advance\qrr@caesar@c1}
\ifx\pgfutil@empty\qrr@caesar@outerL
\let\qrr@caesar@outerL\qrr@caesar@innerL
\fi
\edef\qrr@caesar@number{\number\qrr@caesar@c}%
\foreach \innerLetter[count=\step from 0] in \qrr@caesar@innerL {
\draw[shift={(#2)}] (\step*360/\qrr@caesar@number:\qrr@caesar@innerR) -- (\step*360/\qrr@caesar@number:\qrr@caesar@outerR);
\node[shift={(#2)},rotate=-(\step+.5)*360/\qrr@caesar@number-90] at ({-(\step+.5)*360/\qrr@caesar@number}:{.5*(\qrr@caesar@innerR)+.5*(\qrr@caesar@middleR)} ) {\innerLetter};
}
\foreach \outerLetter[count=\step@ from 0] in \qrr@caesar@outerL {
\ifnum\step@=\qrr@caesar@number\breakforeach\fi
\pgfmathtruncatemacro\step{mod(\step@+\qrr@caesar@shift,\qrr@caesar@number)}%
\node[shift={(#2)},rotate=-(\step+.5)*360/\qrr@caesar@number-90] at ({-(\step+.5)*360/\qrr@caesar@number}:{.5*(\qrr@caesar@outerR)+.5*(\qrr@caesar@middleR)} ) {\outerLetter};
}
\endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}
\drawCaesarsDisk[
inner radius=2cm,
middle radius=2cm+1.3em,
outer radius=2cm+3em,
number of letters=26,
shift=13,
]{0,0}
\end{tikzpicture}
\begin{tikzpicture}
\drawCaesarsList[
inner radius=.5cm,
middle radius=.5cm+1.3em,
outer radius=.5cm+3em,
inner letters={a,b,c,d,e,f,g},
outer letters={A,B,C,D,E,F,G}
]{2,0}
\end{tikzpicture}
\begin{tikzpicture}
\drawCaesarsList[
inner radius=2cm,
middle radius=2cm+1.3em,
outer radius=2cm+3em,
inner letters={a,...,z,A,B,...,T},%,U,V,W,X,Y,Z},
shift=26,
]{0,0}
\end{tikzpicture}
\end{document}
Output



TeX
? en.wikipedia.org/wiki/Enigma_machine