diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/penrose/penrose_code.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/penrose/penrose_code.dtx | 3126 |
1 files changed, 0 insertions, 3126 deletions
diff --git a/Master/texmf-dist/source/latex/penrose/penrose_code.dtx b/Master/texmf-dist/source/latex/penrose/penrose_code.dtx deleted file mode 100644 index cdc63569659..00000000000 --- a/Master/texmf-dist/source/latex/penrose/penrose_code.dtx +++ /dev/null @@ -1,3126 +0,0 @@ -% \iffalse meta-comment -%<*internal> -\iffalse -%</internal> -%<*readme> ----------------------------------------------------------------- -penrose --- TikZ library for producing Penrose tilings -E-mail: loopspace@mathforge.org -Released under the LaTeX Project Public License v1.3c or later -See http://www.latex-project.org/lppl.txt ----------------------------------------------------------------- - -This package is for the creation of Penrose tilings using either kite-and-dart or rhombuses, and either by manual placement or automatic generation. -%</readme> -%<*internal> -\fi -\def\nameofplainTeX{plain} -\ifx\fmtname\nameofplainTeX\else - \expandafter\begingroup -\fi -%</internal> -%<*install> -\input l3docstrip.tex -\keepsilent -\askforoverwritefalse -\preamble ----------------------------------------------------------------- -penrose --- TikZ library for producing Penrose tilings -E-mail: loopspace@mathforge.org -Released under the LaTeX Project Public License v1.3c or later -See http://www.latex-project.org/lppl.txt ----------------------------------------------------------------- - -\endpreamble -\postamble - -Copyright (C) 2014-2019 by Andrew Stacey <loopspace@mathforge.org> - -This work may be distributed and/or modified under the -conditions of the LaTeX Project Public License (LPPL), either -version 1.3c of this license or (at your option) any later -version. The latest version of this license is in the file: - -http://www.latex-project.org/lppl.txt - -This work is "maintained" (as per LPPL maintenance status) by -Andrew Stacey. - -This work consists of the files penrose_code.dtx - penrose.tex -and the derived files penrose.ins - penrose_code.pdf - penrose.pdf - tikzlibrarypenrose.code.tex - README.txt - -\endpostamble -\usedir{tex/latex/penrose} -\generate{ - \file{tikzlibrarypenrose.code.tex}{\from{\jobname.dtx}{package}} -} -%</install> -%<install>\endbatchfile -%<*internal> -\usedir{source/latex/penrose} -\generate{ - \file{\jobname.ins}{\from{\jobname.dtx}{install}} -} -\nopreamble\nopostamble -\usedir{doc/latex/penrose} -\generate{ - \file{README.txt}{\from{\jobname.dtx}{readme}} -} -\ifx\fmtname\nameofplainTeX - \expandafter\endbatchfile -\else - \expandafter\endgroup -\fi -%</internal> -%<*driver> -\documentclass{l3doc} -\usepackage[T1]{fontenc} -\usepackage{lmodern} -\usepackage{tikz} -%\usepackage{trace} -\usetikzlibrary{penrose} -%\traceoff -%\usepackage[numbered]{hypdoc} -\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9} - -\usepackage{listings} -\lstloadlanguages{[LaTeX]TeX} -\lstset{breakatwhitespace=true,breaklines=true,language=TeX} - -\usepackage{fancyvrb} - -\newenvironment{example} - {\VerbatimEnvironment - \begin{VerbatimOut}[gobble=2]{example.out}} - {\end{VerbatimOut} - \begin{center} -% \setlength{\parindent}{0pt} - \fbox{\begin{minipage}{.9\linewidth} - \lstset{breakatwhitespace=true,breaklines=true,language=TeX,basicstyle=\small} - \lstinputlisting[]{example.out} - \end{minipage}} - - \fbox{\begin{minipage}{.9\linewidth} - \input{example.out} - \end{minipage}} -\end{center} -} -\EnableCrossrefs -\CodelineIndex -\RecordChanges -\begin{document} - \DocInput{\jobname.dtx} -\end{document} -%</driver> -% \fi -% -% \CheckSum{2944} -% -% \CharacterTable -% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z -% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z -% Digits \0\1\2\3\4\5\6\7\8\9 -% Exclamation \! Double quote \" Hash (number) \# -% Dollar \$ Percent \% Ampersand \& -% Acute accent \' Left paren \( Right paren \) -% Asterisk \* Plus \+ Comma \, -% Minus \- Point \. Solidus \/ -% Colon \: Semicolon \; Less than \< -% Equals \= Greater than \> Question mark \? -% Commercial at \@ Left bracket \[ Backslash \\ -% Right bracket \] Circumflex \^ Underscore \_ -% Grave accent \` Left brace \{ Vertical bar \| -% Right brace \} Tilde \~} -% -% -% \changes{1.0}{2014/05/07}{Converted to DTX file} -% \changes{1.2}{2019/02/23}{Added general tile creation code} -% \changes{1.4}{2021/01/22}{Adapted to latest version of spath3} -% -% \DoNotIndex -% { -% \begingroup, -% \catcode, -% \active, -% \csname, -% \endcsname, -% }% -% -% -% \providecommand*{\url}{\texttt} -% \GetFileInfo{tikzlibrarypenrose.code.tex} -% \title{The \textsf{Penrose} package} -% \author{Andrew Stacey\texorpdfstring{\\ \url{loopspace@mathforge.org}}{}} -% \date{\fileversion~from \filedate} -% -% -% \maketitle -% -% \tableofcontents -% -% \begin{documentation} -% -% \section{Introduction} -% -% This is a TikZ library for drawing Penrose tiles (kite/dart, rhombus, and pentagon versions). -% It provides two methods of drawing: one in which an automatic pattern is built, and one where the tiles can be placed ``by hand''. -% The tiles can be shaped and (hopefully!) still fit together. -% For full user documentation, see the \Verb+penrose.pdf+ file. -% -% -% \end{documentation} -% -% \begin{implementation} -% -% \section{Implementation} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% \begin{macrocode} -%<@@=penrose> -% \end{macrocode} -% -% \subsection{Initialisation} -% -% -% We use the \Verb+spath3+ library for manipulating the paths that will make up the tiles. -% -% \begin{macrocode} -\ProvidesExplFile {tikzlibrarypenrose.code.tex} {2021/01/22} {1.4} {TikZ pics for Penrose and other tiles} -\RequirePackage{spath3} -\usetikzlibrary{spath3} -% \end{macrocode} -% Now we move in to the realm of \LaTeX3. -% \begin{macrocode} -\ExplSyntaxOn -% \end{macrocode} -% -% Start with some basic paths (lines) for the sides of the tiles so that we know that we have well-defined tiles at the outset. -% These are globally defined as we will frequently want to define them in one tikzpicture and use them in another. -% -% \begin{macrocode} -\tl_new:N \g_@@_side_a_tl -\tl_new:N \g_@@_side_b_tl -\tl_new:N \g_@@_side_c_tl -\tl_new:N \g_@@_side_d_tl -\tl_new:N \g_@@_side_e_tl -\tl_new:N \g_@@_side_A_tl -\tl_new:N \g_@@_side_B_tl -\tl_new:N \g_@@_side_C_tl -\tl_new:N \g_@@_side_D_tl -\tl_new:N \g_@@_side_E_tl -\tl_gset:Nn \g_@@_side_a_tl -{ - \pgfsyssoftpath@movetotoken{0pt}{0pt} - \pgfsyssoftpath@linetotoken{1pt}{0pt} -} -\tl_gset_eq:NN \g_@@_side_b_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_c_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_d_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_e_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_A_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_B_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_C_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_D_tl \g_@@_side_a_tl -\tl_gset_eq:NN \g_@@_side_E_tl \g_@@_side_a_tl -% \end{macrocode} -% -% \begin{variable}{\l_@@_tmpa_fp, \l_@@_tmpb_fp, \l_@@_tmpc_fp, \l_@@_tmpa_tl, \l_@@_tmpb_tl, \l_@@_tmpc_tl, \l_@@_tmpd_tl, \l_@@_tmpa_int, \l_@@_tmpb_int, \l_@@_xa_dim, \l_@@_ya_dim, \l_@@_xb_dim, \l_@@_yb_dim, \l_@@_tmpa_prop} -% We need a few temporary variables to hold intermediate calculations. -% -% \begin{macrocode} -\fp_new:N \l_@@_tmpa_fp -\fp_new:N \l_@@_tmpb_fp -\fp_new:N \l_@@_tmpc_fp -\str_new:N \l_@@_tmpa_str -\str_new:N \l_@@_tmpb_str -\tl_new:N \l_@@_tmpa_tl -\tl_new:N \l_@@_tmpb_tl -\tl_new:N \l_@@_tmpc_tl -\tl_new:N \l_@@_tmpd_tl -\tl_new:N \l_@@_tmp_tile_path_tl -\tl_new:N \g_@@_smuggle_tl -\int_new:N \l_@@_tmpa_int -\int_new:N \l_@@_tmpb_int -\dim_new:N \l_@@_xa_dim -\dim_new:N \l_@@_ya_dim -\dim_new:N \l_@@_xb_dim -\dim_new:N \l_@@_yb_dim -\prop_new:N \l_@@_tmpa_prop -% \end{macrocode} -% \end{variable} -% -% \subsection{Creating the Tiles} -% -% \begin{macro}[internal]{\@@_normalise_path:Nn} -% When defining the path for a side, we normalise so that it starts at the origin and ends at \Verb+(1pt,0pt)+. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_normalise_path:Nn #1#2 -{ -% \end{macrocode} -% Get the initial point of the path and convert to floating point. -% \begin{macrocode} - \group_begin: - \spath_initialpoint:Nn \l_@@_tmpa_tl {#2} - \fp_set:Nn \l_@@_tmpa_fp {\tl_head:N \l_@@_tmpa_tl} - \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} - \fp_set:Nn \l_@@_tmpb_fp {\tl_head:N \l_@@_tmpa_tl} -% \end{macrocode} -% Get the final point of the path, and compute the difference of the final and initial points. -% -% The resulting numbers, say \(a\) and \(b\), will be put into a matrix to rotate and scale the path. -% The formula for the matrix is: -%^^A -% \[ -% \frac{1}{a^2 + b^2} -% \begin{bmatrix} a & b \\ -b & a \end{bmatrix} -% \] -% -% \begin{macrocode} - \spath_finalpoint:Nn \l_@@_tmpa_tl {#2} - \fp_set:Nn \l_@@_tmpa_fp - {\tl_head:N \l_@@_tmpa_tl - \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} - \fp_set:Nn \l_@@_tmpb_fp - {\tl_head:N \l_@@_tmpa_tl - \l_@@_tmpb_fp} -% \end{macrocode} -% Now compute the square of the length of the path for scaling. -% \begin{macrocode} - \fp_set:Nn \l_@@_tmpc_fp - {\l_@@_tmpa_fp^2 + \l_@@_tmpb_fp^2} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_tmpa_fp/\l_@@_tmpc_fp} - \fp_set:Nn \l_@@_tmpb_fp {\l_@@_tmpb_fp/\l_@@_tmpc_fp} - \fp_set:Nn \l_@@_tmpc_fp {-\l_@@_tmpb_fp} -% \end{macrocode} -% Now construct the matrix. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpb_tl - { - {\fp_use:N \l_@@_tmpa_fp} - {\fp_use:N \l_@@_tmpc_fp} % swapped - {\fp_use:N \l_@@_tmpb_fp} % swapped - {\fp_use:N \l_@@_tmpa_fp} - } -% \end{macrocode} -% Get the initial point back again for the translation part. -% \begin{macrocode} - \spath_initialpoint:Nn \l_@@_tmpa_tl {#2} -% \end{macrocode} -% But we need to premultiply by the matrix because of how the transformations are applied. -% \begin{macrocode} - \fp_set:Nn \l_@@_tmpa_fp - { - (-1) * \l_@@_tmpa_fp * \tl_head:N \l_@@_tmpa_tl - + (-1) * \l_@@_tmpb_fp * \tl_tail:N \l_@@_tmpa_tl - } - \fp_set:Nn \l_@@_tmpb_fp - { - (-1) * \l_@@_tmpa_fp * \tl_tail:N \l_@@_tmpa_tl - + \l_@@_tmpb_fp * \tl_head:N \l_@@_tmpa_tl - } -% \end{macrocode} -% Finally, we apply the transformation to the path. -% \begin{macrocode} - \tl_put_right:Nx \l_@@_tmpb_tl { - {\fp_to_dim:N \l_@@_tmpa_fp} - {\fp_to_dim:N \l_@@_tmpb_fp} - } - \spath_transform:NnV \l_@@_tmpa_tl {#2} \l_@@_tmpb_tl - \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmpa_tl - \group_end: - \tl_set_eq:NN #1 \g_@@_smuggle_tl - \tl_gclear:N \g_@@_smuggle_tl -} -\cs_generate_variant:Nn \@@_normalise_path:Nn {NV, cn, cV} -\cs_new_protected_nopar:Npn \@@_normalise_path:N #1 -{ - \@@_normalise_path:NV #1#1 -} -\cs_generate_variant:Nn \@@_normalise_path:N {c} -% \end{macrocode} -% \end{macro} -% -% \begin{function}{\SetPenrosePath} -% This sets the path corresponding to a particular side to the current path, and normalises it. -% \begin{macrocode} -\NewDocumentCommand \SetPenrosePath { m } -{ - \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl - \@@_normalise_path:N \l_@@_tmpa_tl - \tl_gset_eq:cN {g_@@_side_#1_tl} \l_@@_tmpa_tl -} -% \end{macrocode} -% \end{function} -% -% \begin{macro}[internal]{\tikz_scan_point:n} -% This is a wrapper around \Verb+\tikz@scan@one@point+ to make it easier to use with \LaTeX3 variables. -% \begin{macrocode} -\cs_new_nopar:Npn \tikz_scan_point:n #1 -{ - \tikz@scan@one@point\pgfutil@firstofone#1\relax -} -\cs_generate_variant:Nn \tikz_scan_point:n {V} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[internal]{\@@_make_tile:nnn} -% This builds the tile path from its pieces. -% The arguments are the name of the tile, the descriptions of the sides, and a token list of the coordinates. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_make_tile:nnn #1#2#3 -{ -% \end{macrocode} -% Get the first coordinate and initialise the path with a move to this point. -% \begin{macrocode} - \group_begin: - \tl_set:Nn \l_@@_tmpa_tl {#3} - \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl} - \tl_set:Nn \l_@@_tmpa_tl {\pgfsyssoftpath@movetotoken} - \tikz_scan_point:V \l_@@_tmpb_tl - \tl_put_right:Nx \l_@@_tmpa_tl - { - {\dim_use:N \pgf@x}{\dim_use:N \pgf@y} - } - \tl_set_eq:NN \l_@@_tmp_tile_path_tl \l_@@_tmpa_tl -% \end{macrocode} -% Now we have our path initialised, we can start appending the side paths according to the specification in the second argument. -% -% We append the initial coordinate to the end of the list to make a closed cycle. -% \begin{macrocode} - \tl_set:Nn \l_@@_tmpa_tl {#3} - \tl_put_right:Nx \l_@@_tmpa_tl {{\tl_head:N \l_@@_tmpa_tl}} -% \end{macrocode} -% Now we walk through the description of the sides, adding the specified paths to our tile path. -% \begin{macrocode} - \tl_map_inline:nn {#2} { -% \end{macrocode} -% Clone the path for this side. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl {\tl_head:n {##1}} - \tl_set_eq:Nc \l_@@_tmpd_tl {g_@@_side_ \tl_use:N \l_@@_tmpc_tl _tl} -% \end{macrocode} -% Strip off the next coordinate, and convert it to a point. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl} - \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} - \tikz_scan_point:V \l_@@_tmpb_tl -% \end{macrocode} -% Store the resulting coordinate. -% \begin{macrocode} - \fp_set:Nn \l_@@_tmpa_fp { \pgf@x } - \fp_set:Nn \l_@@_tmpb_fp { \pgf@y } -% \end{macrocode} -% Now get the next coordinate. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl} - \tikz_scan_point:V \l_@@_tmpb_tl -% \end{macrocode} -% We want the difference between the two coordinates. -% \begin{macrocode} - \fp_set:Nn \l_@@_tmpa_fp {\pgf@x - \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpb_fp {\pgf@y - \l_@@_tmpb_fp} -% \end{macrocode} -% This is converted into a transformation matrix. -% \begin{macrocode} - \fp_set:Nn \l_@@_tmpc_fp {-\l_@@_tmpb_fp} - \tl_set:Nx \l_@@_tmpb_tl - { - {\fp_use:N \l_@@_tmpa_fp} - {\fp_use:N \l_@@_tmpb_fp} % not swapped - {\fp_use:N \l_@@_tmpc_fp} % not swapped - {\fp_use:N \l_@@_tmpa_fp} - {0} - {0} - } -% \end{macrocode} -% The transformation is applied to the cloned path. -% \begin{macrocode} - \spath_transform:NV \l_@@_tmpd_tl \l_@@_tmpb_tl -% \end{macrocode} -% And this is welded to the tile path. -% \begin{macrocode} - \spath_weld:NV \l_@@_tmp_tile_path_tl \l_@@_tmpd_tl - } -% \end{macrocode} -% At the end we close the path. -% \begin{macrocode} - \spath_close:N \l_@@_tmp_tile_path_tl - \tl_gset_eq:NN \g_@@_smuggle_tl \l_@@_tmp_tile_path_tl - \group_end: - \tl_gclear_new:c {g_@@_tile_#1_tl} - \tl_gset_eq:cN {g_@@_tile_#1_tl} \g_@@_smuggle_tl - \tl_gclear:N \g_@@_smuggle_tl -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[internal]{\@@_make_tile:nn} -% A wrapper around the above which allows us to specify the second two arguments as two items in a token list. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_make_tile:nn #1#2 -{ - \@@_make_tile:nnn {#1} #2 -} -\cs_generate_variant:Nn \@@_make_tile:nn {nV} -% \end{macrocode} -% \end{macro} -% -% \subsection{Specifying the Tiles} -% -% The tile specifications are contained in a \Verb+prop+. -% \begin{macrocode} -\prop_new:N \g_@@_tiles_prop -% \end{macrocode} -% -% \begin{macro}[internal]{\@@_add_coordinate:Nnn, \@@_add_coordinate:w} -% Process a coordinate through \Verb+fp+ and adds it to a token list. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_add_coordinate:Nnn #1#2#3 { - \fp_set:Nn \l_@@_tmpa_fp{#2} - \fp_set:Nn \l_@@_tmpb_fp{#3} - \tl_put_right:Nx #1 - { - {(\fp_use:N \l_@@_tmpa_fp, \fp_use:N \l_@@_tmpb_fp)} - } -} -% \end{macrocode} -% Wrapper around the add coordinate command to split at a comma. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_add_coordinate:w #1#2,#3 \q_stop -{ - \@@_add_coordinate:Nnn \l_@@_tmpa_tl {#2}{#3} -} -% \end{macrocode} -% \end{macro} -% -% Now we specify the tiles. -% The specification is a clockwise list of the vertices together with the labels of the corresponding sides. -% There are three basic paths, \Verb+a+, \Verb+b+, \Verb+c+, and their complements (which are capitalised). -% -% \begin{itemize} -% \item Thin Rhombus. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(18)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)} - -\prop_gput:Nnx \g_@@_tiles_prop {thin~ rhombus} -{{a A B b} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Thick Rhombus. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)} - -\prop_gput:Nnx \g_@@_tiles_prop {thick~ rhombus} -{{B a A b} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Dart. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{2*sind(18)*cosd(108)}{2*sind(18)*sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*sind(18)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{2*sind(18)*cosd(108)}{-2*sind(18)*sind(108)} - -\prop_gput:Nnx \g_@@_tiles_prop {dart} -{{c a A C} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Kite. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)} - -\prop_gput:Nnx \g_@@_tiles_prop {kite} -{{a c C A} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Golden Triangle. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)} - -\prop_gput:Nnx \g_@@_tiles_prop {golden~ triangle} -{{a c b} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Reverse Golden Triangle. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)} - -\prop_gput:Nnx \g_@@_tiles_prop {reverse~ golden~ triangle} -{{B C A} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Golden Gnomon -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0} - -\prop_gput:Nnx \g_@@_tiles_prop {golden~ gnomon} -{{C b A} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Reverse Golden Gnomon -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(36)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(36)}{-sind(36)} -\prop_gput:Nnx \g_@@_tiles_prop {reverse~ golden~ gnomon} -{{a B c} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Primary Pentagon (pentagon 5) -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{1+cosd(72)+cosd(144)}{sind(72)+sind(144)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1+cosd(72)}{sind(72)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0} -\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 5} -{{a a a a a} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Secondary Pentagon (pentagon 3) -% \begin{macrocode} -\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 3} -{{A b a a b} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Tertiary Pentagon (pentagon 2) -% \begin{macrocode} -\prop_gput:Nnx \g_@@_tiles_prop {pentagon~ 2} -{{d A e c A} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Pentagram -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1-cosd(36)}{-sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{1-cosd(36)-cosd(108)}{-sind(36)-sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{-sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{-1+3*cosd(108)+cosd(36)}{-sind(36)-sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{-1+2*cosd(108)+cosd(36)}{-sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {-1+2*cosd(108)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(108)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\prop_gput:Nnx \g_@@_tiles_prop {pentagram} -{{C E C E C E C E C E} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Boat -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {-1+2*cosd(108)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(108)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(108)}{sind(108)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {1-cosd(36)}{-sind(36)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl -{-1+2*cosd(108)+cosd(36)}{-sind(36)} -\prop_gput:Nnx \g_@@_tiles_prop {boat} -{{C E C E B D B} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \item Diamond. -% \begin{macrocode} -\tl_clear:N \l_@@_tmpa_tl -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {0}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{sind(18)} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {2*cosd(18)}{0} -\@@_add_coordinate:Nnn \l_@@_tmpa_tl {cosd(18)}{-sind(18)} -\prop_gput:Nnx \g_@@_tiles_prop {diamond} -{{D B B D} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% -% \end{itemize} -% -% \begin{function}{\BakePenroseTile} -% This is the user wrapper around the tile creation macros. -% \begin{macrocode} -\NewDocumentCommand \BakePenroseTile {m} -{ - \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl - \@@_make_tile:nV {#1} \l_@@_tmpa_tl -} -% \end{macrocode} -% For backwards compatibility. -% \begin{macrocode} -\cs_set_eq:NN \MakePenroseTile \BakePenroseTile -% \end{macrocode} -% \end{function} -% -% \begin{function}{\UsePenroseTile} -% This is the command that actually places a tile on the page. -% The first argument is optional and is for styling. -% \begin{macrocode} -\NewDocumentCommand \UsePenroseTile {O{} m} -{ -% \end{macrocode} -% We need to transform the tile to correspond to the current transformation matrix. -% To ensure that we only transform the current tile, we clone it first. -% \begin{macrocode} - \tl_set_eq:Nc \l_@@_tmp_tile_path_tl {g_@@_tile_#2_tl} -% \end{macrocode} -% The transformation matrix returned by PGF appears to be transposed from what it should be. -% (This needs a little more investigation, it might be that I've implemented the multiplication incorrectly here.) -% \begin{macrocode} - \pgfgettransform \l_@@_tmpa_tl -% \tl_clear:N \l_@@_tmpb_tl -% \tl_set:Nx \l_@@_tmpb_tl {{\tl_head:N \l_@@_tmpa_tl}} -% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} -% \tl_put_right:Nx \l_@@_tmpb_tl -% { -% {\tl_item:Nn \l_@@_tmpa_tl {1}} -% } -% \tl_put_right:Nx \l_@@_tmpb_tl -% { -% {\tl_item:Nn \l_@@_tmpa_tl {2}} -% } -% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} -% \tl_set:Nx \l_@@_tmpa_tl {\tl_tail:N \l_@@_tmpa_tl} -% \tl_put_right:NV \l_@@_tmpb_tl \l_@@_tmpa_tl -% \end{macrocode} -% Apply the transformation, protocol the path, and render it. -% \begin{macrocode} - \spath_transform:NV \l_@@_tmp_tile_path_tl \l_@@_tmpa_tl - \spath_tikz_path:nV {#1} \l_@@_tmp_tile_path_tl -} -% \end{macrocode} -% \end{function} -% -% \begin{macro}{save Penrose path} -% This is a style for a user to take a path and make it into the path for one of the sides. -% It needs to store both that side and the reverse. -% \begin{macrocode} -\tikzset{ - save~ Penrose~ path/.code={ - \tikz@addmode{ -% \end{macrocode} -% Get the current path. -% \begin{macrocode} - \pgfsyssoftpath@getcurrentpath\l_@@_tmpa_tl -% \end{macrocode} -% Normalise the path and save. -% \begin{macrocode} - \@@_normalise_path:N \l_@@_tmpa_tl - \tl_gclear_new:c {g_@@_side_#1_tl} - \tl_gset_eq:cN {g_@@_side_#1_tl} \l_@@_tmpa_tl -% \end{macrocode} -% Now create the reverse path. -% The name is the upper case version. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpb_tl {\str_uppercase:n {#1}} -% \end{macrocode} -% Reverse the path, and relocate to the interval \([0,1]\). -% \begin{macrocode} - \spath_reverse:N \l_@@_tmpa_tl - \spath_transform:Nnnnnnn \l_@@_tmpa_tl {-1} {0} {0} {-1} {1} {0} - \tl_gclear_new:c {g_@@_side_ \tl_use:N \l_@@_tmpb_tl _tl} - \tl_gset_eq:cN {g_@@_side_ \tl_use:N \l_@@_tmpb_tl _tl} \l_@@_tmpa_tl - } - }, - clone~ Penrose~ side~ path/.style~ 2~ args={ - spath/set~ name=Penrose~side, - spath/clone~ global={#1}{#2} - }, - spath/prefix/Penrose~side/.style={ - spath/set~ prefix=g_@@_side_, - }, - spath/suffix/Penrose~side/.style={ - spath/set~ suffix=_tl, - }, - clone~ Penrose~ tile~ path/.style~ 2~ args={ - spath/set~ name=Penrose~tile, - spath/clone~ global={#1}{#2} - }, - spath/prefix/Penrose~tile/.style={ - spath/set~ prefix=g_@@_tile_, - }, - spath/suffix/Penrose~tile/.style={ - spath/set~ suffix=_tl, - }, - expand~ key/.code={ - \exp_args:NV \pgfkeysalso #1 - } -} -% \end{macrocode} -% \end{macro} -% -% Create the basic tile shapes. -% \begin{macrocode} -\BakePenroseTile {thin~ rhombus} -\BakePenroseTile {thick~ rhombus} -\BakePenroseTile {dart} -\BakePenroseTile {kite} -\BakePenroseTile {golden~ triangle} -\BakePenroseTile {reverse~ golden~ triangle} -\BakePenroseTile {golden~ gnomon} -\BakePenroseTile {reverse~ golden~ gnomon} -\BakePenroseTile {pentagon~ 5} -\BakePenroseTile {pentagon~ 3} -\BakePenroseTile {pentagon~ 2} -\BakePenroseTile {pentagram} -\BakePenroseTile {boat} -\BakePenroseTile {diamond} -% \end{macrocode} -% -% -% \subsection{User-Definable Tiles} -% -% The commands in this section are for enabling a user to define their own tile. -% -% -% \begin{macro}[internal]{\@@_transform_side:nn} -% Apply a transformation to make a given side lie on the x-axis. -% First argument is the tile, second is the side. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_transform_side:nn #1#2 -{ -% \end{macrocode} -% Get our tile data. -% \begin{macrocode} - \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl -% \end{macrocode} -% Start with the edge list. -% -% Initialise the counter. -% \begin{macrocode} - \int_zero:N \l_@@_tmpb_int - \int_incr:N \l_@@_tmpb_int -% \end{macrocode} -% Get the path type list. -% -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl {\tl_head:N \l_@@_tmpa_tl} -% \end{macrocode} -% -% Iterate through the path type list, looking for the requested path. -% \begin{macrocode} - \tl_map_inline:Nn \l_@@_tmpc_tl { - \str_if_eq:nnT {##1} {#2} { - \tl_map_break: - } - \int_incr:N \l_@@_tmpb_int - } -% \end{macrocode} -% Get the coordinate list. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpa_tl} -% \end{macrocode} -% Strip off the outer braces. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl {\tl_item:Nn \l_@@_tmpc_tl {1}} -% \end{macrocode} -% Add the first coordinate at the end. -% \begin{macrocode} - \tl_put_right:Nx \l_@@_tmpc_tl - {{\tl_item:Nn \l_@@_tmpc_tl {1}}} -% \end{macrocode} -% Get the coordinates for this edge. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpa_tl - {\tl_item:Nn \l_@@_tmpc_tl {\int_use:N \l_@@_tmpb_int}} - \tl_set:Nx \l_@@_tmpb_tl - {\tl_item:Nn \l_@@_tmpc_tl {\int_use:N \l_@@_tmpb_int + 1}} -% \end{macrocode} -% Translate second to origin. -% \begin{macrocode} - \tikz_scan_point:V \l_@@_tmpb_tl - \dim_set_eq:Nc \l_@@_xa_dim {pgf@x} - \dim_set_eq:Nc \l_@@_ya_dim {pgf@y} -% \end{macrocode} -% Rotate and scale first to unit x-vector. -% \begin{macrocode} - \tikz_scan_point:V \l_@@_tmpa_tl - \dim_set_eq:Nc \l_@@_xb_dim {pgf@x} - \dim_set_eq:Nc \l_@@_yb_dim {pgf@y} - - \dim_sub:Nn \l_@@_xb_dim {\l_@@_xa_dim } - \dim_sub:Nn \l_@@_yb_dim {\l_@@_ya_dim } -% \end{macrocode} -% And normalise the vector along it. -% \begin{macrocode} - \pgfpointnormalised{\pgfpoint{\l_@@_xb_dim}{\l_@@_yb_dim}} - \dim_set_eq:Nc \l_@@_xb_dim {pgf@x} - \dim_set_eq:Nc \l_@@_yb_dim {pgf@y} -% \end{macrocode} -% Now rotate so that the \(x\)--axis lies along the edge. -% \begin{macrocode} - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\l_@@_xb_dim}{-\l_@@_yb_dim}} - {\pgfpoint{\l_@@_yb_dim}{\l_@@_xb_dim}} - - \pgftransformshift{\pgfpoint{-\l_@@_xa_dim}{-\l_@@_ya_dim}} - -} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\cs_generate_variant:Nn \tl_if_eq:nnT {nVT} -\cs_generate_variant:Nn \@@_transform_side:nn {nx,nV} -% \end{macrocode} -% -% \begin{macro}[internal]{\TransformAlongSide} -% Make this available outside the \LaTeX3 environment. -% \begin{macrocode} -\DeclareDocumentCommand \TransformAlongSide {m m} -{ - \@@_transform_side:nx {#1}{#2} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[internal]{\@@_coordinates_at_vertices:n} -% This places TikZ coordinates at the vertices of the tile. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_coordinates_at_vertices:n #1 -{ -% \end{macrocode} -% Get our tile data -% \begin{macrocode} - \prop_get:NnN \g_@@_tiles_prop {#1} \l_@@_tmpa_tl -% \end{macrocode} -% Start with the edge list -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpb_tl {\tl_head:N \l_@@_tmpa_tl} -% \end{macrocode} -% Get the coordinate list -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpa_tl} -% \end{macrocode} -% Strip off the outer braces -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl - {\tl_item:Nn \l_@@_tmpc_tl {1}} -% \end{macrocode} -% Add the first coordinate at the end -% \begin{macrocode} - \tl_put_right:Nx \l_@@_tmpc_tl - {{\tl_item:Nn \l_@@_tmpc_tl {1}}} -% \end{macrocode} -% Get the first coordinate -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpa_tl {\tl_head:N \l_@@_tmpc_tl} - \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl} -% \end{macrocode} -% Iterate through the path type list, looking for the requested path -% \begin{macrocode} - \tl_map_inline:Nn \l_@@_tmpb_tl { - \tl_set:Nx \l_@@_tmpd_tl { - \exp_not:N \coordinate - (-edge~ ##1~ start)~ at \tl_use:N \l_@@_tmpa_tl; - } - \tl_use:N \l_@@_tmpd_tl - \tl_set:Nx \l_@@_tmpa_tl {\tl_head:N \l_@@_tmpc_tl} - \tl_set:Nx \l_@@_tmpc_tl {\tl_tail:N \l_@@_tmpc_tl} - \tl_set:Nx \l_@@_tmpd_tl { - \exp_not:N \coordinate - (-edge~ ##1~ end)~ at \tl_use:N \l_@@_tmpa_tl; - } - \tl_use:N \l_@@_tmpd_tl - } -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[internal]{\CoordinatesAtVertices} -% User-accessible wrapper around the above. -% \begin{macrocode} -\DeclareDocumentCommand \CoordinatesAtVertices {m} -{ - \@@_coordinates_at_vertices:n {#1} -} -% \end{macrocode} -% \end{macro} -% -% \begin{function}{\DefineTile} -% This is the user function for defining a tile. -% \begin{macrocode} -\DeclareDocumentCommand \DefineTile { m m m } -{ -% \end{macrocode} -% Clear the temporary variable. -% \begin{macrocode} - \tl_clear:N \l_@@_tmpa_tl -% \end{macrocode} -% The 3rd parameter is a list of coordinates at vertices, iterate through them and add them to the list. -% \begin{macrocode} - \tl_map_inline:nn {#3} { - \@@_add_coordinate:w \l_@@_tmpa_tl ##1 \q_stop - } -% \end{macrocode} -% Now we make a list of the edge types (from the 2nd parameter), using a prop to keep track of whether an edge is repeated. -% \begin{macrocode} - \prop_clear:N \l_@@_tmpa_prop - \tl_map_inline:nn {#2} { - \prop_if_in:NnTF \l_@@_tmpa_prop {##1} - { - \prop_put:Nnn \l_@@_tmpa_prop {##1} {1} - } - { - \prop_put:Nnn \l_@@_tmpa_prop {##1} {0} - } - } -% \end{macrocode} -% Having established their multiplicity, we now create the edges with their names, appending numbers to their names if used more than once. -% \begin{macrocode} - \tl_clear:N \l_@@_tmpb_tl - \tl_map_inline:nn {#2} - { - \tl_clear:N \l_@@_tmpc_tl - \tl_put_right:Nn \l_@@_tmpc_tl {##1} - \int_compare:nF {\prop_item:Nn \l_@@_tmpa_prop {##1} == 0} { - \tl_put_right:Nx \l_@@_tmpc_tl - {\prop_item:Nn \l_@@_tmpa_prop {##1}} - \prop_put:Nnx \l_@@_tmpa_prop {##1} - {\int_eval:n {\prop_item:Nn \l_@@_tmpa_prop {##1} + 1}} - } - \tl_put_right:Nx \l_@@_tmpb_tl {{ \l_@@_tmpc_tl }} - } -% \end{macrocode} -% Finally, we can create our tile and add it to the global tile prop. -% \begin{macrocode} - \prop_gput:Nnx \g_@@_tiles_prop {#1} - {{\tl_use:N \l_@@_tmpb_tl} {\tl_use:N \l_@@_tmpa_tl}} -% \end{macrocode} -% Having created the tile, we make a TikZ pic to place it on the page. -% \begin{macrocode} - \tikzset{ - #1/.pic={ - \begin{scope} -% \end{macrocode} -% Were we given a tile to align ourselves against? -% \begin{macrocode} - \pgfkeysgetvalue{/tikz/Penrose/alignment~ location}{\prloc} - \ifx\prloc\pgfutil@empty - \else -% \end{macrocode} -% Yes, we were. -% So we adjust our position accordingly. -% The first job is to transform so that we're along the edge of the receiving tile. -% \begin{macrocode} - \begingroup -% \end{macrocode} -% We get the locations of the start and end of the receiving tile. -% As \Verb+pic+ sets the node prefix, we have to temporarily suspend that (hence working in a group). -% \begin{macrocode} - \tikzset{name~ prefix~ ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge~ \pgfkeysvalueof{/tikz/Penrose/alignment~ edge}~ start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge~ \pgfkeysvalueof{/tikz/Penrose/alignment~ edge}~ end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup -% \end{macrocode} -% We store the initial points in \Verb+\pgf@xa+ and \Verb+\pgf@ya+ but we want \Verb+\pgf@xb+ and \Verb+\pgf@yb+ to be a vector along the edge. -% \begin{macrocode} - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya -% \end{macrocode} -% We shift to the start of the edge. -% \begin{macrocode} - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% -% \end{macrocode} -% And normalise the vector along it. -% \begin{macrocode} - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y -% \end{macrocode} -% Now rotate so that the \(x\)--axis lies along the edge. -% \begin{macrocode} - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}} -% \end{macrocode} -% The next job is to shift and rotate the current tile so that the correct edge ends up against the receiving tile. -% \begin{macrocode} - \str_set:Nx \l_@@_tmpa_str - {\pgfkeysvalueof{/tikz/Penrose/alignment~ edge}} - \str_set:Nx \l_@@_tmpa_str {\str_head:N \l_@@_tmpa_str} - \str_put_right:Nx \l_@@_tmpa_str - {\pgfkeysvalueof{/tikz/Penrose/alignment~ new~ edge}} - \str_set:Nx \l_@@_tmpb_str {\str_lowercase:f { \l_@@_tmpa_str}} - \str_if_eq:NNT \l_@@_tmpa_str \l_@@_tmpb_str - { - \str_set:Nx \l_@@_tmpb_str - {\str_uppercase:f { \l_@@_tmpa_str}} - } - - \@@_transform_side:nV {#1} \l_@@_tmpb_str - \fi -% \end{macrocode} -% Now that the transformation is finalised, we can render the tile. -% We clip against the tile path so that the tiles don't ``bleed''. -% If we didn't do this, drawing the tile would result in overlaps which can look a bit ugly. -% On the other hand, tight clipping can lead to ``gaps'' between the tiles so we make this optional by enclosing it in a style. -% \begin{macrocode} - \UsePenroseTile[ - every~ Penrose~ tile~ clip/.try, - every~ #1~ clip/.try - ]{#1} - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ #1/.try, - pic~ actions - ]{#1} -% Lastly, we put coordinates at each vertex, labelled by which edge they are. -% \begin{macrocode} - \@@_coordinates_at_vertices:n {#1} - \end{scope} - }, -% \end{macrocode} -% This is a shortcut for installing the \Verb+pic+ type. -% \begin{macrocode} - #1/.style={ - every~ Penrose~ pic/.try, - pic~ type=#1, - }, - } -} -% \end{macrocode} -% \end{function} -% -% -% \subsection{Lindenmayer System} -% -% This is an implementation of the Lindenmayer System description of Penrose tilings as a way of generating tilings from a specific starting seed. -% -% The implementation uses \Verb+prop+s to store \emph{rules} and \emph{actions}. -% The rules are used to expand the starting seed to a certain level, after which the actions are carried out. -% The syntax is based on the PGF library, but as we're already using \LaTeX3 it is reimplemented in that. -% -% These are the rules for generating rhombus tilings. -% \begin{macrocode} -\prop_new:N \g_@@_rhombus_lms_rule_prop -\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {T} {[f*sT][f>g]} -\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {t} {[f_st][f>G]} -\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {G} {[f+sG][sf>g][sf*sT]} -\prop_gput:Nnn \g_@@_rhombus_lms_rule_prop {g} {[f-sg][sf>G][sf_st]} -% \end{macrocode} -% -% These are the rules for generating kite and dart tilings. -% \begin{macrocode} -\prop_new:N \g_@@_kite_lms_rule_prop -\prop_gput:Nnn \g_@@_kite_lms_rule_prop {T} {[f*sT][f>st][+sg]} -\prop_gput:Nnn \g_@@_kite_lms_rule_prop {t} {[f_st][f>sT][-sG]} -\prop_gput:Nnn \g_@@_kite_lms_rule_prop {G} {[f*+sG][sT]} -\prop_gput:Nnn \g_@@_kite_lms_rule_prop {g} {[f-_sg][st]} -% \end{macrocode} -% -% These are the rules for generating pentagon tilings. -% \begin{macrocode} -\prop_new:N \g_@@_pentagon_lms_rule_prop -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {P} -{[s>P][1sF+Q][1+sF+Q][1*sF+Q][1-sF+Q][1_sF+Q]} % pentagon 5 -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {Q} -{[s>P][1+sFR][1*sF*R][1-sF+Q][1_sF+Q][1sF+Q][->fsD]} % pentagon 3 -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {R} -{[s>P][1-sF+Q][1+sF*R][1*sFR][1_sF*R][1sFR][_>fsD][>fsD]} % pentagon 2 -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {G} -{ - [s>G] - [se[>d+R][e1B]] - [+se[>d+R][e1B]] - [-se[>d+R][e1B]] - [*se[>d+R][e1B]] - [_se[>d+R][e1B]] -} % pentagram -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {B} -{ - [s>G] - [se[>d+R][e1B]] - [+se[>d+R][e1B]] - [-se[>d+R][e1B]] -} % boat -\prop_gput:Nnn \g_@@_pentagon_lms_rule_prop {D} -{[s>d+R][s>eG][se1B]} % diamond -% \end{macrocode} -% -% Each of the standard tilings can also be drawn using triangles using the same rules. -% \begin{macrocode} -\prop_gset_eq:NN \g_@@_rtriangle_lms_rule_prop -\g_@@_rhombus_lms_rule_prop -\prop_gset_eq:NN \g_@@_ktriangle_lms_rule_prop -\g_@@_kite_lms_rule_prop -% \end{macrocode} -% -% These hold the various actions. -% \begin{macrocode} -\prop_new:N \g_@@_default_lms_action_prop -\prop_new:N \g_@@_rhombus_lms_action_prop -\prop_new:N \g_@@_kite_lms_action_prop -\prop_new:N \g_@@_rtriangle_lms_action_prop -\prop_new:N \g_@@_ktriangle_lms_action_prop -\prop_new:N \g_@@_pentagon_lms_action_prop -% \end{macrocode} -% -% We need some parameters. -% \begin{macrocode} -\dim_new:N \l_@@_step_dim -\dim_set:Nn \l_@@_step_dim {1cm} -% \end{macrocode} -% -% These are the defaults, which will be used in all the rule sets. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_default_lms_action_prop {[} {\group_begin:} -\prop_gput:Nnn \g_@@_default_lms_action_prop {]} {\group_end:} -\prop_gput:Nnn \g_@@_default_lms_action_prop {f} -{\pgftransformxshift{\l_@@_step_dim}} -\prop_gput:Nnn \g_@@_default_lms_action_prop {s} { - \fp_set:Nn \l_@@_tmpa_fp { 2 * sind(18) * \l_@@_step_dim } - \dim_set:Nn \l_@@_step_dim {\fp_to_dim:N \l_@@_tmpa_fp} -} -% \end{macrocode} -% -% The rhombus rules need a variety of turns. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {+} -{\pgftransformrotate{144}} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {*} -{\pgftransformrotate{108}} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {-} -{\pgftransformrotate{216}} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {_} -{\pgftransformrotate{252}} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {>} -{\pgftransformrotate{180}} -% \end{macrocode} -% -% Up to now, the actions for the rhombus and its triangle replacement are the same. -% \begin{macrocode} -\prop_gset_eq:NN \g_@@_rtriangle_lms_action_prop -\g_@@_rhombus_lms_action_prop -% \end{macrocode} -% -% Now we do the actions that actually draw something. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {T} { - \group_begin: -% \end{macrocode} -% As we go through, we keep track of how many tiles we've drawn. -% \begin{macrocode} - \int_gincr:N \g_@@_tile_int -% \end{macrocode} -% Set up the position, size, and angle correctly. -% \begin{macrocode} - \pgftransformrotate{198} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*2*cosd(18)} - \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} -% \end{macrocode} -% Now we draw the thin rhombus, applying every style we can possibly imagine. -% The \Verb+Penrose tile+ style gets the current tile and total tile numbers passed to it. -% \begin{macrocode} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ thin~ rhombus/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{thin~rhombus} - \group_end: -} -% \end{macrocode} -% -% Same for the thick rhombus. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rhombus_lms_action_prop {G} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ thick~ rhombus/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{thick~rhombus} - \group_end: -} -% \end{macrocode} -% -% Now we do the same for the kite and dart tiling. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {+} {\pgftransformrotate{36}} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {*} {\pgftransformrotate{108}} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {-} {\pgftransformrotate{-36}} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {_} -{\pgftransformrotate{-108}} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {>} {\pgftransformrotate{180}} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gset_eq:NN \g_@@_ktriangle_lms_action_prop -\g_@@_kite_lms_action_prop -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {T} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{36} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ kite/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{kite} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_kite_lms_action_prop {g} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{144} - \pgftransformxshift{-\l_@@_step_dim * 2 * sin(18)} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ dart/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{dart} - \group_end: -} -% \end{macrocode} -% -% Now we set up the actions for the triangle variations. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {T} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{18} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ reverse~ golden~ triangle/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{reverse~ golden~ triangle} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {t} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{-18} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ golden~ triangle/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{golden~ triangle} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {G} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{180} - \pgftransformxshift{-\l_@@_step_dim} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ reverse~ golden~ gnomon/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{reverse~ golden~ gnomon} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_rtriangle_lms_action_prop {g} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{180} - \pgftransformxshift{-\l_@@_step_dim} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ golden~ gnomon/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{golden~ gnomon} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {T} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{18} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ reverse~ golden~ triangle/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{reverse~ golden~ triangle} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {t} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{-18} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ golden~ triangle/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{golden~ triangle} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {G} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{180} - \pgftransformxshift{-\l_@@_step_dim} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ reverse~ golden~ gnomon/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{reverse~ golden~ gnomon} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_ktriangle_lms_action_prop {g} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{180} - \pgftransformxshift{-\l_@@_step_dim} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)/(2*cosd(36))} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ golden~ gnomon/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{golden~ gnomon} - \group_end: -} -% \end{macrocode} -% -% Now we do the same for the pentagonal tilings. -% -% The rules need a variety of turns. -% \begin{macrocode} -\int_new:N \l_@@_pentagon_parity_int -\seq_new:N \l_@@_pentagon_parity_seq -\seq_set_from_clist:Nn \l_@@_pentagon_parity_seq {odd,even} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {1} { - \int_set:Nn \l_@@_pentagon_parity_int - {3 - \l_@@_pentagon_parity_int} - } -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {+} -{\pgftransformrotate{72}} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {*} -{\pgftransformrotate{144}} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {-} -{\pgftransformrotate{288}} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {_} -{\pgftransformrotate{216}} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {>} -{\pgftransformrotate{180}} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {|} -{\pgftransformxscale{-1}} -% \end{macrocode} -% The scale factor is different. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {s} { - \fp_set:Nn \l_@@_tmpa_fp - { - 1/(2 + 2 * cosd(72) ) * \l_@@_step_dim - } - \dim_set:Nn \l_@@_step_dim {\fp_to_dim:N \l_@@_tmpa_fp} -} -% \end{macrocode} -% And we tend to work better vertically. -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {f} { - \fp_set:Nn \l_@@_tmpa_fp { tand(54)/2 * \l_@@_step_dim } - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} -} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {F} { - \fp_set:Nn \l_@@_tmpa_fp { tand(54) * \l_@@_step_dim } - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} -} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {d} { - \fp_set:Nn \l_@@_tmpa_fp - { - (tand(54)/2 - tand(72)/2 + sind(36) ) * \l_@@_step_dim - } - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} -} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {e} { - \fp_set:Nn \l_@@_tmpa_fp - { - tand(54) * cosd(36) * \l_@@_step_dim - } - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {P} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2} - \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2} - \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ pentagon/.try, - every~ - \seq_item:Nn \l_@@_pentagon_parity_seq - {\l_@@_pentagon_parity_int} - \space pentagon/.try, - every~ pentagon~ 5/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{pentagon~5} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {Q} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2} - \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2} - \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ pentagon/.try, - every~ - \seq_item:Nn \l_@@_pentagon_parity_seq - {\l_@@_pentagon_parity_int} - \space pentagon/.try, - every~ pentagon~ 3/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{pentagon~3} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {R} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/2} - \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)/2} - \pgftransformyshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ pentagon/.try, - every~ - \seq_item:Nn \l_@@_pentagon_parity_seq - {\l_@@_pentagon_parity_int} - \space pentagon/.try, - every~ pentagon~ 2/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{pentagon~2} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {G} { - \group_begin: - \int_gincr:N \g_@@_tile_int -% \pgftransformrotate{198} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(72)} - \pgftransformxshift{\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)*cosd(72)} - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ pentagram/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{pentagram} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {B} { - \group_begin: - \int_gincr:N \g_@@_tile_int -% \pgftransformrotate{198} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(72)} - \pgftransformxshift{\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*tand(54)*cosd(72)} - \pgftransformyshift{\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ boat/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{boat} - \group_end: -} -% \end{macrocode} -% -% \begin{macrocode} -\prop_gput:Nnn \g_@@_pentagon_lms_action_prop {D} { - \group_begin: - \int_gincr:N \g_@@_tile_int - \pgftransformrotate{90} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim*cosd(18)} - \pgftransformxshift{-\fp_to_dim:N \l_@@_tmpa_fp} - \fp_set:Nn \l_@@_tmpa_fp {\l_@@_step_dim/(1cm)} - \pgftransformscale{\fp_use:N \l_@@_tmpa_fp} - \tl_set:Nx \l_@@_tmpc_tl - { - {\int_use:N \g_@@_tile_int} - {\int_use:N \g_@@_tiles_int} - } - \UsePenroseTile[ - every~ Penrose~ tile/.try, - every~ diamond/.try, - Penrose~ tile~ \int_use:N \g_@@_tile_int/.try, - Penrose~ tile/.try/.expand~ once=\l_@@_tmpc_tl - ]{diamond} - \group_end: -} -% \end{macrocode} -% -% \begin{macro}[internal]{\@@_make_lms:Nnnn} -% This creates the token list of actions, starting with the seed. -% The arguments are: a token list to store the result in, the name of the system, the number of iterations, and the initial state. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_make_lms:Nnnn #1#2#3#4 -{ - \group_begin: -% \end{macrocode} -% On the first time round, we start with the given seed. -% \begin{macrocode} - \tl_set:Nn \l_@@_tmpb_tl {#4} -% \end{macrocode} -% We repeat the specified number of times. -% \begin{macrocode} - \prg_replicate:nn {#3} { -% \end{macrocode} -% Duplicate the current state. -% \begin{macrocode} - \tl_set_eq:NN \l_@@_tmpa_tl \l_@@_tmpb_tl -% \end{macrocode} -% Clear the receiving token list. -% \begin{macrocode} - \tl_clear:N \l_@@_tmpb_tl -% \end{macrocode} -% Walk through the current list, appending to the receiving list according to the rules. -% \begin{macrocode} - \tl_map_inline:Nn \l_@@_tmpa_tl - { -% \end{macrocode} -% If a rule exists, copy that. -% \begin{macrocode} - \prop_if_in:cnTF {g_@@_#2_lms_rule_prop} {##1} - { - \tl_put_right:Nx \l_@@_tmpb_tl - {\prop_item:cn {g_@@_#2_lms_rule_prop} {##1} } - } - { -% \end{macrocode} -% Otherwise, just copy the token. -% \begin{macrocode} - \tl_put_right:Nn \l_@@_tmpb_tl {##1} - } - } - } -% \end{macrocode} -% We've done all this inside a group, now pass the result outside. -% \begin{macrocode} - \tl_set:Nn \l_@@_tmpa_tl { - \group_end: - \tl_set:Nn #1 - } - \tl_put_right:Nx \l_@@_tmpa_tl {{\tl_use:N \l_@@_tmpb_tl}} - \tl_use:N \l_@@_tmpa_tl -} -\cs_generate_variant:Nn \@@_make_lms:Nnnn {Nnnx} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[internal]{\@@_invoke_lms:Nn} -% This carries out the actions specified by the resulting rules. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_invoke_lms:Nn #1#2 -{ - \group_begin: -% \end{macrocode} -% Walk through the given list, carrying out the corresponding action if it exists. -% If not, look at the default. -% Otherwise, just do nothing. -% \begin{macrocode} - \tl_map_inline:Nn #1 { - \prop_if_in:cnTF {g_@@_#2_lms_action_prop} {##1} - { - \prop_item:cn {g_@@_#2_lms_action_prop} {##1} - } - { - \prop_if_in:cnT {g_@@_default_lms_action_prop} {##1} - { - \prop_item:cn {g_@@_default_lms_action_prop} {##1} - } - } - } - \group_end: -} -% \end{macrocode} -% \end{macro} -% -% We keep track of the number of tiles. -% \begin{macrocode} -\int_new:N \g_@@_tile_int -\int_new:N \g_@@_tiles_int -% \end{macrocode} -% -% \begin{function}{\PenroseDecomposition} -% This is the user macro to invoke the decomposition. -% The arguments are: optional styles, the name, number of iterations, and starting seed. -% \begin{macrocode} -\NewDocumentCommand \PenroseDecomposition { O{} m m m } -{ - \group_begin: - \tikzset{#1} - \@@_make_lms:Nnnx \l_@@_tmpa_tl {#2} {#3} {#4} - \@@_count_lms:N \l_@@_tmpa_tl - \int_gzero:N \g_@@_tile_int - \int_set:Nn \l_@@_pentagon_parity_int {2} - \@@_invoke_lms:Nn \l_@@_tmpa_tl {#2} - \group_end: -} -% \end{macrocode} -% \end{function} -% -% \begin{macro}[internal]{\@@_count_lms:N} -% This counts the number of tiles in the string. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_count_lms:N #1 -{ - \int_gzero:N \g_@@_tiles_int - \tl_map_inline:Nn #1 - { - \tl_if_eq:nnT {##1} {T} - { - \int_gincr:N \g_@@_tiles_int - } - \tl_if_eq:nnT {##1} {t} - { - \int_gincr:N \g_@@_tiles_int - } - \tl_if_eq:nnT {##1} {G} - { - \int_gincr:N \g_@@_tiles_int - } - \tl_if_eq:nnT {##1} {g} - { - \int_gincr:N \g_@@_tiles_int - } - } -} -% \end{macrocode} -% \end{macro} -% -% This is a \Verb+\tikzset+ mechanism for setting the dimensions of the tiling. -% \begin{macrocode} -\tikzset{ - Penrose~ step/.code={ - \dim_set:Nn \l_@@_step_dim {#1} - } -} -% \end{macrocode} -% -% We're done with \LaTeX3, so turn off the syntax. -% \begin{macrocode} -\ExplSyntaxOff -% \end{macrocode} -% -% \subsection{TikZ Pictures} -% -% New in TikZ3.0 is the ability to make pictures that can be reused. -% Penrose tiles seems an obvious use for this. -% These pictures can be placed alongside other tiles, matching by edge type. -% -% There are a variety of constants that are frequently used and reused, so we define them all here. -% These are the PGF versions. -% -% \begin{macrocode} -\pgfmathsetmacro\pr@chphi{cos(18)} -\pgfmathsetmacro\pr@shphi{sin(18)} -\pgfmathsetmacro\pr@cphi{cos(36)} -\pgfmathsetmacro\pr@sphi{sin(36)} -\pgfmathsetmacro\pr@invphi{2/(sqrt(5)+1)} -\pgfmathsetmacro\pr@phi{(sqrt(5)+1)/2} -\pgfmathsetmacro\pr@invphisq{\pr@invphi*\pr@invphi} -\pgfmathsetmacro\pr@ominvphisq{\pr@invphi - \pr@invphisq} -\pgfmathsetmacro\pr@ominvphi{1 - \pr@invphi} -% \end{macrocode} -% -% \begin{macrocode} -\newif\if@edgealign -\def\pr@getfirst#1#2\pr@stop{#1}% -\def\test@edgealign#1{% - \pgfkeysgetvalue{/tikz/Penrose/alignment edge}{\@penrose@tmpa}% - \edef\@penrose@tmpb{#1}% - \edef\@penrose@tmpa{\expandafter\pr@getfirst\@penrose@tmpa.\pr@stop}% - \ifx\@penrose@tmpa\@penrose@tmpb - \@edgealigntrue - \else - \@edgealignfalse - \fi -}% -% \end{macrocode} -% -% \begin{macrocode} -\newif\if@newedge -\def\test@newedge#1{% - \pgfkeysgetvalue{/tikz/Penrose/alignment new edge}{\@penrose@tmpa}% - \edef\@penrose@tmpb{#1}% - \edef\@penrose@tmpa{\@penrose@tmpa}% - \ifx\@penrose@tmpa\@penrose@tmpb - \@newedgetrue - \else - \@newedgefalse - \fi -}% -% \end{macrocode} -% -% The implementation is essentially the same for each, so only the first will be commented. -% \begin{macrocode} -\tikzset{ -% \end{macrocode} -% The key \Verb+align with=<tile> along <edge>+ is used to set the parameters for placing a tile next to an existing one. -% For most tiles, that's enough to specify how the new tile should be placed. -% Some, though, need more information. -% For those, use \Verb+align with=<tile> along <edge> using <number>+. -% \begin{macrocode} - align with/.code args={#1 along #2}{% - \pgfutil@in@{ using }{#2} - \ifpgfutil@in@% - \tikzset{ - Penrose/alignment location=#1, - Penrose/alignment set edges=#2, - }% - \else - \tikzset{ - Penrose/alignment location=#1, - Penrose/alignment edge=#2, - }% - \fi - }, - Penrose/alignment set edges/.code args={#1 using #2}{% - \tikzset{ - Penrose/alignment edge=#1, - Penrose/alignment new edge=#2 - }, - }, - Penrose/alignment location/.initial={}, - Penrose/alignment edge/.initial=a, - Penrose/alignment new edge/.initial={}, -% \end{macrocode} -% Default clipping style. -% \begin{macrocode} - every Penrose tile clip/.style={clip}, -% \end{macrocode} -% This is the code for setting up a \Verb+pic+. -% \begin{macrocode} - thin rhombus/.pic={ - \begin{scope} -% \end{macrocode} -% Were we given a tile to align ourselves against? -% \begin{macrocode} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else -% \end{macrocode} -% Yes, we were. -% So we adjust our position accordingly. -% The first job is to transform so that we're along the edge of the receiving tile. -% \begin{macrocode} - \begingroup -% \end{macrocode} -% We get the locations of the start and end of the receiving tile. -% As \Verb+pic+ sets the node prefix, we have to temporarily suspend that (hence working in a group). -% \begin{macrocode} - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup -% \end{macrocode} -% We store the initial points in \Verb+\pgf@xa+ and \Verb+\pgf@ya+ but we want \Verb+\pgf@xb+ and \Verb+\pgf@yb+ to be a vector along the edge. -% \begin{macrocode} - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya -% \end{macrocode} -% We shift to the start of the edge. -% \begin{macrocode} - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% -% \end{macrocode} -% And normalise the vector along it. -% \begin{macrocode} - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y -% \end{macrocode} -% Now rotate so that the \(x\)--axis lies along the edge. -% \begin{macrocode} - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}} -% \end{macrocode} -% The next job is to shift and rotate the current tile so that the correct edge ends up against the receiving tile. -% \begin{macrocode} - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}b\relax - \pgftransformrotate{-18}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{\pr@shphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}B\relax - \pgftransformrotate{18}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \pgftransformrotate{198}% - \pgftransformshift{\pgfpoint{-2*\pr@chphi cm}{0 cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{162}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{-\pr@shphi cm}}% - \fi\fi\fi\fi - \fi -% \end{macrocode} -% Now that the transformation is finalised, we can render the tile. -% We clip against the tile path so that the tiles don't ``bleed''. -% If we didn't do this, drawing the tile would result in overlaps which can look a bit ugly. -% On the other hand, tight clipping can lead to ``gaps'' between the tiles so we make this optional by enclosing it in a style. -% \begin{macrocode} - \UsePenroseTile[ - every Penrose tile clip/.try, - every thin rhombus clip/.try - ]{thin rhombus} - \UsePenroseTile[ - every Penrose tile/.try, - every thin rhombus/.try, - pic actions - ]{thin rhombus} -% \end{macrocode} -% These draw the arcs that designate the joining rules. -% We draw full circles so that it doesn't matter what shape the tiles are. -% \begin{macrocode} - \UsePenroseTile[ - every Penrose arc clip/.try, - every thin rhombus arc clip/.try - ]{thin rhombus} - \path[every circle arc/.try] (18:1) circle[radius=1/4]; - \path[every long arc/.try] (-18:1) circle[radius=1/4]; -% \end{macrocode} -% Lastly, we put coordinates at each vertex, labelled by which edge they are. -% \begin{macrocode} -\coordinate (-edge a start) at (0,0); -\coordinate (-edge a end) at (18:1); -\coordinate (-edge A start) at (18:1); -\coordinate (-edge A end) at (2*\pr@chphi,0); -\coordinate (-edge B start) at (2*\pr@chphi,0); -\coordinate (-edge B end) at (-18:1); -\coordinate (-edge b start) at (-18:1); -\coordinate (-edge b end) at (0,0); - \end{scope} - }, -% \end{macrocode} -% This is a shortcut for installing the \Verb+pic+ type. -% \begin{macrocode} - thin rhombus/.style={ - every Penrose pic/.try, - pic type=thin rhombus, - }, -% \end{macrocode} -% Same again, but for the thick rhombus. -% \begin{macrocode} - thick rhombus/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}} - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}b\relax - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{-\pr@sphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}B\relax - \pgftransformrotate{36}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \pgftransformrotate{-36}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{\pr@sphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{216}% - \pgftransformshift{\pgfpoint{-2*\pr@cphi cm}{0 cm}}% - \fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every thick rhombus clip/.try - ]{thick rhombus} - \UsePenroseTile[ - every Penrose tile/.try, - every thick rhombus/.try, - pic actions - ]{thick rhombus} - \UsePenroseTile[ - every Penrose arc clip/.try, - every thick rhombus arc clip/.try - ]{thick rhombus} -\path[every circle arc/.try] (2*\pr@cphi,0) circle[radius=1/4]; -\path[every long arc/.try] (0,0) circle[radius=3/4]; -\coordinate (-edge B start) at (0,0); -\coordinate (-edge B end) at (36:1); -\coordinate (-edge a start) at (36:1); -\coordinate (-edge a end) at (2*\pr@cphi,0); -\coordinate (-edge A start) at (2*\pr@cphi,0); -\coordinate (-edge A end) at (-36:1); -\coordinate (-edge b start) at (-36:1); -\coordinate (-edge b end) at (0,0); - \end{scope} - }, - thick rhombus/.style={ - every Penrose pic/.try, - pic type=thick rhombus, - }, -% \end{macrocode} -% Now the kite. -% \begin{macrocode} - kite/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}c\relax - \pgftransformrotate{-72}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{\pr@sphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}C\relax - \pgftransformrotate{-108}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \pgftransformrotate{36}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{-\pr@sphi cm}}% - \fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every kite clip/.try - ]{kite} - \UsePenroseTile[ - every Penrose tile/.try, - every kite/.try, - pic actions - ]{kite} - \UsePenroseTile[ - every Penrose arc clip/.try, - every kite arc clip/.try - ]{kite} -\path[every circle arc/.try] (0,0) circle[radius=\pr@invphi]; -\path[every long arc/.try] (1,0) circle[radius=\pr@invphisq]; -\coordinate (-edge a start) at (0,0); -\coordinate (-edge a end) at (36:1); -\coordinate (-edge c start) at (36:1); -\coordinate (-edge c end) at (1,0); -\coordinate (-edge C start) at (1,0); -\coordinate (-edge C end) at (-36:1); -\coordinate (-edge A start) at (-36:1); -\coordinate (-edge A end) at (0,0); - \end{scope} - }, -% \end{macrocode} -% The dart is next. -% \begin{macrocode} - dart/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}c\relax - \pgftransformrotate{108}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}C\relax - \pgftransformrotate{72}% - \pgftransformshift% - {\pgfpoint{\pr@invphi*\pr@shphi cm}{-\pr@invphi*\pr@chphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \pgftransformrotate{-36}% - \pgftransformshift% - {\pgfpoint{\pr@invphi*\pr@shphi cm}{\pr@invphi*\pr@chphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{216}% - \pgftransformshift{\pgfpoint{-\pr@invphi cm}{0 cm}}% - \fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every dart clip/.try - ]{dart} - \UsePenroseTile[ - every Penrose tile/.try, - every dart/.try, - pic actions - ]{dart} - \UsePenroseTile[ - every Penrose arc clip/.try, - every dart arc clip/.try - ]{dart} -\path[every circle arc/.try] (\pr@invphi,0) circle[radius=\pr@ominvphi]; -\path[every long arc/.try] (0,0) circle[radius=\pr@ominvphisq]; -\coordinate (-edge c start) at (0,0); -\coordinate (-edge c end) at (108:\pr@invphi); -\coordinate (-edge a start) at (108:\pr@invphi); -\coordinate (-edge a end) at (\pr@invphi,0); -\coordinate (-edge A start) at (\pr@invphi,0); -\coordinate (-edge A end) at (-108:\pr@invphi); -\coordinate (-edge C start) at (-108:\pr@invphi); -\coordinate (-edge C end) at (0,0); - \end{scope} - }, - kite/.style={ - every Penrose pic/.try, - pic type=kite, - }, - dart/.style={ - every Penrose pic/.try, - pic type=dart, - }, -% \end{macrocode} -% The golden triangle. -% \begin{macrocode} - golden triangle/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}B\relax - \pgftransformrotate{18}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}C\relax - \pgftransformrotate{-90}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{\pr@shphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{162}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{-\pr@shphi cm}}% - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every golden triangle clip/.try - ]{golden triangle} - \UsePenroseTile[ - every Penrose tile/.try, - every golden triangle/.try, - pic actions - ]{golden triangle} -\coordinate (-edge a start) at (0,0); -\coordinate (-edge a end) at (18:1); -\coordinate (-edge c start) at (18:1); -\coordinate (-edge c end) at (-18:1); -\coordinate (-edge b start) at (-18:1); -\coordinate (-edge b end) at (0,0); - \end{scope} - }, - golden triangle/.style={ - every Penrose pic/.try, - pic type=golden triangle, - }, -% \end{macrocode} -% The reverse golden triangle (is there a better name?). -% \begin{macrocode} - reverse golden triangle/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}b\relax - \pgftransformrotate{162}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{-\pr@shphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}c\relax - \pgftransformrotate{-90}% - \pgftransformshift{\pgfpoint{-\pr@chphi cm}{\pr@shphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \pgftransformrotate{18}% - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every reverse golden triangle clip/.try - ]{reverse golden triangle} - \UsePenroseTile[ - every Penrose tile/.try, - every reverse golden triangle/.try, - pic actions - ]{reverse golden triangle} -\coordinate (-edge B start) at (0,0); -\coordinate (-edge B end) at (18:1); -\coordinate (-edge C start) at (18:1); -\coordinate (-edge C end) at (-18:1); -\coordinate (-edge A start) at (-18:1); -\coordinate (-edge A end) at (0,0); - \end{scope} - }, - reverse golden triangle/.style={ - every Penrose pic/.try, - pic type=reverse golden triangle, - }, -% \end{macrocode} -% The golden gnomon. -% \begin{macrocode} - golden gnomon/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}c\relax - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{-\pr@sphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}B\relax - \pgftransformrotate{-144}% - \pgftransformshift{\pgfpoint{-2*\pr@cphi cm}{0 cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}a\relax - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every golden gnomon clip/.try - ]{golden gnomon} - \UsePenroseTile[ - every Penrose tile/.try, - every golden gnomon/.try, - pic actions - ]{golden gnomon} -\coordinate (-edge C start) at (0,0); -\coordinate (-edge C end) at (36:1); -\coordinate (-edge b start) at (36:1); -\coordinate (-edge b end) at (2*\pr@cphi,0); -\coordinate (-edge A start) at (2*\pr@cphi,0); -\coordinate (-edge A end) at (0,0); - \end{scope} - }, - golden gnomon/.style={ - every Penrose pic/.try, - pic type=golden gnomon, - }, -% \end{macrocode} -% The reverse golden gnomon. -% \begin{macrocode} - reverse golden gnomon/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}C\relax - \pgftransformrotate{36}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}b\relax - \pgftransformrotate{-36}% - \pgftransformshift{\pgfpoint{-\pr@cphi cm}{\pr@sphi cm}}% - \else - \if\pgfkeysvalueof{/tikz/Penrose/alignment edge}A\relax - \pgftransformrotate{180}% - \pgftransformshift{\pgfpoint{-2*\pr@cphi cm}{0 cm}}% - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every reverse golden gnomon clip/.try - ]{reverse golden gnomon} - \UsePenroseTile[ - every Penrose tile/.try, - every reverse golden gnomon/.try, - pic actions - ]{reverse golden gnomon} -\coordinate (-edge a start) at (0,0); -\coordinate (-edge a end) at (2*\pr@cphi,0); -\coordinate (-edge B start) at (2*\pr@cphi,0); -\coordinate (-edge B end) at (-36:1); -\coordinate (-edge c start) at (-36:1); -\coordinate (-edge c end) at (0,0); - \end{scope} - }, - reverse golden gnomon/.style={ - every Penrose pic/.try, - pic type=reverse golden gnomon, - }, -% \end{macrocode} -% The primary pentagon. -% \begin{macrocode} - pentagon 5/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@newedge{1}% - \if@newedge - \pgftransformrotate{180}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \test@newedge{2}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm}{0 cm}}% - \pgftransformrotate{108}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \test@newedge{3}% - \if@newedge - \pgftransformshift% - {\pgfpoint{\pr@phi * \pr@shphi cm}{- \pr@phi * \pr@chphi cm}}% - \pgftransformrotate{36}% - \else - \test@newedge{4}% - \if@newedge - \pgftransformshift{\pgfpoint{- \pr@shphi cm}{-\pr@chphi cm}}% - \pgftransformrotate{-36}% - \else - \test@newedge{5}% - \if@newedge - \pgftransformrotate{-108}% - \fi\fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every pentagon clip/.try, - every pentagon 5 clip/.try - ]{pentagon 5} - \UsePenroseTile[ - every Penrose tile/.try, - every pentagon/.try, - every pentagon 5/.try, - pic actions - ]{pentagon 5} -\coordinate (-edge a1 start) at (0,0); -\coordinate (-edge a1 end) at (1,0); -\coordinate (-edge a2 start) at (1,0); -\coordinate (-edge a2 end) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge a3 start) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge a3 end) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge a4 start) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge a4 end) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge a5 start) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge a5 end) at (0,0); - \end{scope} - }, - pentagon 5/.style={ - every Penrose pic/.try, - pic type=pentagon 5, - }, -% \end{macrocode} -% The secondary pentagon. -% \begin{macrocode} - pentagon 3/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@edgealign{a}% - \if@edgealign - \pgftransformrotate{180}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \test@edgealign{B}% - \if@edgealign% - \test@newedge{1}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm}{0 cm}}% - \pgftransformrotate{108}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \pgftransformrotate{-108}% - \fi - \else - \test@newedge{1}% - \if@newedge - \pgftransformshift% - {\pgfpoint{\pr@phi * \pr@shphi cm}{- \pr@phi * \pr@chphi cm}}% - \pgftransformrotate{36}% - \else - \pgftransformshift{\pgfpoint{- \pr@shphi cm}{-\pr@chphi cm}}% - \pgftransformrotate{-36}% - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every pentagon clip/.try, - every pentagon 3 clip/.try - ]{pentagon 3} - \UsePenroseTile[ - every Penrose tile/.try, - every pentagon/.try, - every pentagon 3/.try, - pic actions - ]{pentagon 3} -\coordinate (-edge A start) at (0,0); -\coordinate (-edge A end) at (1,0); -\coordinate (-edge b1 start) at (1,0); -\coordinate (-edge b1 end) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge a1 start) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge a1 end) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge a2 start) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge a2 end) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge b2 start) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge b2 end) at (0,0); - \end{scope} - }, - pentagon 3/.style={ - every Penrose pic/.try, - pic type=pentagon 3, - }, -% \end{macrocode} -% The tertiary pentagon. -% \begin{macrocode} - pentagon 2/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@edgealign{D}% - \if@edgealign - \pgftransformrotate{180}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \test@edgealign{a}% - \if@edgealign% - \test@newedge{1}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm}{0 cm}}% - \pgftransformrotate{108}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \pgftransformrotate{-108}% - \fi - \else - \test@newedge{1}% - \if@newedge - \pgftransformshift% - {\pgfpoint{\pr@phi * \pr@shphi cm}{- \pr@phi * \pr@chphi cm}}% - \pgftransformrotate{36}% - \else - \pgftransformshift{\pgfpoint{- \pr@shphi cm}{-\pr@chphi cm}}% - \pgftransformrotate{-36}% - \fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every pentagon clip/.try, - every pentagon 2 clip/.try - ]{pentagon 2} - \UsePenroseTile[ - every Penrose tile/.try, - every pentagon/.try, - every pentagon 2/.try, - pic actions - ]{pentagon 2} -\coordinate (-edge d start) at (0,0); -\coordinate (-edge d end) at (1,0); -\coordinate (-edge A1 start) at (1,0); -\coordinate (-edge A1 end) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge c1 start) at (1+\pr@shphi,\pr@chphi); -\coordinate (-edge c1 end) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge c2 start) at (\pr@cphi-\pr@shphi,\pr@sphi+\pr@chphi); -\coordinate (-edge c2 end) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge A2 start) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge A2 end) at (0,0); - \end{scope} - }, - pentagon 2/.style={ - every Penrose pic/.try, - pic type=pentagon 2, - }, -% \end{macrocode} -% The pentagram. -% \begin{macrocode} - pentagram/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@newedge{2}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm}{0 cm}}% - \pgftransformrotate{72}% - \else - \test@newedge{3}% - \if@newedge - \pgftransformrotate{-72}% - \pgftransformshift{\pgfpoint{2 * \pr@shphi cm}{0 cm}}% - \else - \test@newedge{4}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm + 2 * \pr@shphi cm}{0 cm}}% - \else - \test@newedge{5}% - \if@newedge - \pgftransformrotate{216}% - \pgftransformshift{\pgfpoint{\pr@cphi cm}{\pr@sphi cm}}% - \else - \test@newedge{6}% - \if@newedge - \pgftransformshift{\pgfpoint{1cm}{0cm}}% - \pgftransformrotate{-72}% - \pgftransformshift{\pgfpoint{\pr@cphi cm}{\pr@sphi cm}}% - \else - \test@newedge{7}% - \if@newedge - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{\pr@shphi cm}{\pr@chphi cm}}% - \else - \test@newedge{8}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm + 2*\pr@shphi cm}{0cm}}% - \pgftransformrotate{216}% - \pgftransformshift{\pgfpoint{\pr@cphi cm}{\pr@sphi cm}}% - \else - \test@newedge{9}% - \if@newedge - \pgftransformshift{\pgfpoint{-2*\pr@shphi cm}{0cm}}% - \pgftransformrotate{72}% - \else - \test@newedge{10}% - \if@newedge - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every pentagram clip/.try - ]{pentagram} - \UsePenroseTile[ - every Penrose tile/.try, - every pentagram/.try, - pic actions - ]{pentagram} -\coordinate (-edge C1 start) at (1,0); -\coordinate (-edge C1 end) at (0,0); -\coordinate (-edge C2 start) at (0,0); -\coordinate (-edge C2 end) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge C3 start) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge C3 end) at (-2*\pr@shphi,0); -\coordinate (-edge C4 start) at (-2*\pr@shphi,0); -\coordinate (-edge C4 end) at (-1-2*\pr@shphi,0); -\coordinate (-edge C5 start) at (-1-2*\pr@shphi,0); -\coordinate (-edge C5 end) at (-\pr@cphi,-\pr@sphi); -\coordinate (-edge C6 start) at (-\pr@cphi,-\pr@sphi); -\coordinate (-edge C6 end) at (-\pr@cphi-\pr@shphi,-\pr@sphi-\pr@chphi); -\coordinate (-edge C7 start) at (-\pr@cphi-\pr@shphi,-\pr@sphi-\pr@chphi); -\coordinate (-edge C7 end) at (-\pr@shphi,-\pr@chphi); -\coordinate (-edge C8 start) at (-\pr@shphi,-\pr@chphi); -\coordinate (-edge C8 end) at (1-\pr@cphi+\pr@shphi,-\pr@sphi-\pr@chphi); -\coordinate (-edge C9 start) at (1-\pr@cphi+\pr@shphi,-\pr@sphi-\pr@chphi); -\coordinate (-edge C9 end) at (1-\pr@cphi,-\pr@sphi); -\coordinate (-edge C10 start) at (1-\pr@cphi,-\pr@sphi); -\coordinate (-edge C10 end) at (1,0); - \end{scope} - }, - pentagram/.style={ - every Penrose pic/.try, - pic type=pentagram, - }, -% \end{macrocode} -% The boat. -% \begin{macrocode} - boat/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@edgealign{d}% - \if@edgealign - \pgftransformrotate{180}% - \pgftransformshift{\pgfpoint{\pr@cphi cm - 1cm}{\pr@sphi cm}}% - \else - \test@edgealign{b}% - \if@edgealign% - \test@newedge{2}% - \if@newedge - \pgftransformrotate{144}% - \pgftransformshift{\pgfpoint{-1 cm}{0 cm}}% - \else - \pgftransformrotate{216}% - \pgftransformshift{\pgfpoint{\pr@cphi cm}{\pr@sphi cm}}% - \fi - \else - \test@edgealign{c}% - \if@edgealign% - \test@newedge{2}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm}{0 cm}}% - \pgftransformrotate{72}% - \else - \test@newedge{3}% - \if@newedge - \pgftransformrotate{-72}% - \pgftransformshift{\pgfpoint{2 * \pr@shphi cm}{0 cm}}% - \else - \test@newedge{4}% - \if@newedge - \pgftransformshift{\pgfpoint{1 cm + 2 * \pr@shphi cm}{0 cm}}% - \else - \fi\fi\fi\fi\fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every boat clip/.try - ]{boat} - \UsePenroseTile[ - every Penrose tile/.try, - every boat/.try, - pic actions - ]{boat} -\coordinate (-edge C1 start) at (1,0); -\coordinate (-edge C1 end) at (0,0); -\coordinate (-edge C2 start) at (0,0); -\coordinate (-edge C2 end) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge C3 start) at (-\pr@shphi,\pr@chphi); -\coordinate (-edge C3 end) at (-2*\pr@shphi,0); -\coordinate (-edge C4 start) at (-2*\pr@shphi,0); -\coordinate (-edge C4 end) at (-1-2*\pr@shphi,0); -\coordinate (-edge B1 start) at (-1-2*\pr@shphi,0); -\coordinate (-edge B1 end) at (-\pr@cphi,-\pr@sphi); -\coordinate (-edge D start) at (-\pr@cphi,-\pr@sphi); -\coordinate (-edge D end) at (1-\pr@cphi,-\pr@sphi); -\coordinate (-edge B2 start) at (1-\pr@cphi,-\pr@sphi); -\coordinate (-edge B2 end) at (1,0); - \end{scope} - }, - boat/.style={ - every Penrose pic/.try, - pic type=boat, - }, -% \end{macrocode} -% The diamond. -% \begin{macrocode} - diamond/.pic={ - \begin{scope} - \pgfkeysgetvalue{/tikz/Penrose/alignment location}{\prloc} - \ifx\prloc\pgfutil@empty - \else - \begingroup - \tikzset{name prefix ..}% - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} start)% - \global\pgf@xa=\pgf@x - \global\pgf@ya=\pgf@y - \tikz@scan@one@point\pgfutil@firstofone% - (\prloc-edge \pgfkeysvalueof{/tikz/Penrose/alignment edge} end)% - \global\pgf@xb=\pgf@x - \global\pgf@yb=\pgf@y - \endgroup - \advance\pgf@xb by -\pgf@xa - \advance\pgf@yb by -\pgf@ya - \pgftransformshift{\pgfpoint{\pgf@xa}{\pgf@ya}}% - \pgfpointnormalised{\pgfpoint{\pgf@xb}{\pgf@yb}} - \pgf@xb=\pgf@x - \pgf@yb=\pgf@y - \pgftransformtriangle% - {\pgfpoint{0pt}{0pt}}% - {\pgfpoint{\pgf@xb}{\pgf@yb}}% - {\pgfpoint{-\pgf@yb}{\pgf@xb}}% - \test@edgealign{d}% - \if@edgealign% - \test@newedge{2}% - \if@newedge - \pgftransformshift{\pgfpoint{1cm}{0cm}}% - \pgftransformrotate{-162}% - \else - \pgftransformrotate{-18}% - \fi - \else - \test@newedge{2}% - \if@newedge - \pgftransformrotate{162}% - \pgftransformshift{\pgfpoint{- 2 * \pr@chphi cm}{0cm}}% - \else - \pgftransformshift{\pgfpoint{- \pr@cphi cm}{-\pr@sphi cm}}% - \pgftransformrotate{18}% - \fi\fi - \fi - \UsePenroseTile[ - every Penrose tile clip/.try, - every diamond clip/.try - ]{diamond} - \UsePenroseTile[ - every Penrose tile/.try, - every diamond/.try, - pic actions - ]{diamond} -\coordinate (-edge D1 start) at (0,0); -\coordinate (-edge D1 end) at (\pr@chphi,\pr@shphi); -\coordinate (-edge B1 start) at (\pr@chphi,\pr@shphi); -\coordinate (-edge B1 end) at (2*\pr@chphi,0); -\coordinate (-edge B2 start) at (2*\pr@chphi,0); -\coordinate (-edge B2 end) at (\pr@chphi,-\pr@shphi); -\coordinate (-edge D2 start) at (\pr@chphi,-\pr@shphi); -\coordinate (-edge D2 end) at (0,0); - \end{scope} - }, - diamond/.style={ - every Penrose pic/.try, - pic type=diamond, - }, -} -% \end{macrocode} -% -% \begin{macrocode} -%</package> -% \end{macrocode} -% -% \end{implementation} -% -%\Finale -\endinput |