From 5c99135c06494b236cce7fd76e346851cf8c4408 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Wed, 7 Jun 2023 03:04:09 +0000 Subject: CTAN sync 202306070304 --- FILES.byname | 212 +- FILES.byname.gz | Bin 2532839 -> 2532808 bytes FILES.last07days | 136 +- biblio/ctan-bibdata/ctan.bib | 31 +- biblio/ctan-bibdata/ctan.pdf | Bin 3678600 -> 3680800 bytes graphics/pgf/contrib/penrose/README | 8 - graphics/pgf/contrib/penrose/penrose.pdf | Bin 557513 -> 0 bytes graphics/pgf/contrib/penrose/penrose.tex | 794 ----- graphics/pgf/contrib/penrose/penrose_code.dtx | 3126 -------------------- graphics/pgf/contrib/penrose/penrose_code.pdf | Bin 464179 -> 0 bytes macros/latex/contrib/censor/censor.pdf | Bin 246320 -> 247256 bytes macros/latex/contrib/censor/censor.sty | 11 +- macros/latex/contrib/counterz/README.txt | 2 +- macros/latex/contrib/counterz/counterz.dtx | 200 +- macros/latex/contrib/counterz/counterz.ins | 4 +- macros/latex/contrib/counterz/counterz.pdf | Bin 315915 -> 317154 bytes macros/latex/contrib/texshade/README | 2 +- macros/latex/contrib/texshade/texshade.dtx | 20 +- macros/latex/contrib/texshade/texshade.pdf | Bin 1565024 -> 1235875 bytes obsolete/graphics/pgf/contrib/penrose/README | 8 + obsolete/graphics/pgf/contrib/penrose/penrose.pdf | Bin 0 -> 557513 bytes obsolete/graphics/pgf/contrib/penrose/penrose.tex | 794 +++++ .../graphics/pgf/contrib/penrose/penrose_code.dtx | 3126 ++++++++++++++++++++ .../graphics/pgf/contrib/penrose/penrose_code.pdf | Bin 0 -> 464179 bytes .../latexindent/LatexIndent/TrailingComments.pm | 10 +- support/latexindent/LatexIndent/Version.pm | 4 +- support/latexindent/README | 2 +- support/latexindent/bin/linux/latexindent | Bin 6165455 -> 6165486 bytes support/latexindent/bin/macos/latexindent | Bin 6394677 -> 6394708 bytes support/latexindent/defaultSettings.yaml | 5 +- support/latexindent/documentation/contributors.bib | 17 + .../documentation/latexindent-yaml-schema.json | 2 +- support/latexindent/documentation/latexindent.pdf | Bin 1246969 -> 1250364 bytes support/latexindent/documentation/latexindent.tex | 59 +- support/latexindent/latexindent.pl | 3 +- .../texlive/tlnet/tlpkg/installer/ctan-mirrors.pl | 9 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb | 170 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 | 2 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 | 2 +- .../texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc | 16 +- systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz | Bin 2452964 -> 2453392 bytes timestamp | 2 +- 42 files changed, 4436 insertions(+), 4341 deletions(-) delete mode 100644 graphics/pgf/contrib/penrose/README delete mode 100644 graphics/pgf/contrib/penrose/penrose.pdf delete mode 100644 graphics/pgf/contrib/penrose/penrose.tex delete mode 100644 graphics/pgf/contrib/penrose/penrose_code.dtx delete mode 100644 graphics/pgf/contrib/penrose/penrose_code.pdf create mode 100644 obsolete/graphics/pgf/contrib/penrose/README create mode 100644 obsolete/graphics/pgf/contrib/penrose/penrose.pdf create mode 100644 obsolete/graphics/pgf/contrib/penrose/penrose.tex create mode 100644 obsolete/graphics/pgf/contrib/penrose/penrose_code.dtx create mode 100644 obsolete/graphics/pgf/contrib/penrose/penrose_code.pdf diff --git a/FILES.byname b/FILES.byname index c74780e559..3e52d96b4e 100644 --- a/FILES.byname +++ b/FILES.byname @@ -2056,12 +2056,12 @@ 2023/04/13 | 1675 | biblio/citation-style-language/README.md 2023/04/13 | 11957 | biblio/citation-style-language/vancouver.csl 2023/04/13 | 4516625 | biblio/citation-style-language.zip -2023/06/05 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2023/06/06 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx -2023/06/05 | 2788130 | biblio/ctan-bibdata/ctan.bib -2023/06/05 | 3677738 | biblio/ctan-bibdata/ctan.pdf +2023/06/06 | 2788844 | biblio/ctan-bibdata/ctan.bib +2023/06/06 | 3678600 | biblio/ctan-bibdata/ctan.pdf 2023/01/16 | 1489 | biblio/ctan-bibdata/README -2023/06/05 | 4077217 | biblio/ctan-bibdata.zip +2023/06/06 | 4077069 | biblio/ctan-bibdata.zip 2023/02/23 | 3126 | biblio/pbibtex/pbibtex-base/cpp.awk 2023/02/23 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh 2023/02/23 | 22362 | biblio/pbibtex/pbibtex-base/jabbrv.bst @@ -2218,7 +2218,7 @@ 1989/12/11 | 6196 | biblio/tib/tib.man 1989/03/29 | 23265 | biblio/tib/vitaMake 2005/12/15 | 366385 | biblio/tib.zip -2023/05/19 | 18462 | CTAN.sites +2023/06/06 | 18463 | CTAN.sites 1990/10/03 | 5032 | dviware/beebe/00readme.txt 1990/10/03 | 479 | dviware/beebe/doc/00dir.cmd 1990/10/03 | 1209 | dviware/beebe/doc/00dir.lst @@ -5417,7 +5417,7 @@ 1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp 1990/10/02 | 812 | dviware/vutex/vaxvms.ins 1990/10/02 | 127576 | dviware/vutex/vutex.web -2023/06/05 | 60454 | FILES.last07days +2023/06/06 | 66564 | FILES.last07days 2021/07/24 | 1139410 | fonts/aboensis/Aboensis.glyphs 2021/07/24 | 18907382 | fonts/aboensis/aboensis.pdf 2021/07/24 | 137860 | fonts/aboensis/Aboensis-Regular.otf @@ -159656,12 +159656,6 @@ 2023/03/02 | 414 | graphics/pgf/contrib/outilsgeomtikz/README.md 2023/05/22 | 30671 | graphics/pgf/contrib/outilsgeomtikz/tex/OutilsGeomTikz.sty 2023/05/22 | 426966 | graphics/pgf/contrib/outilsgeomtikz.zip -2021/01/22 | 98018 | graphics/pgf/contrib/penrose/penrose_code.dtx -2021/01/22 | 464179 | graphics/pgf/contrib/penrose/penrose_code.pdf -2021/01/22 | 557513 | graphics/pgf/contrib/penrose/penrose.pdf -2021/01/22 | 26060 | graphics/pgf/contrib/penrose/penrose.tex -2021/01/22 | 472 | graphics/pgf/contrib/penrose/README -2021/01/23 | 1034990 | graphics/pgf/contrib/penrose.zip 2021/07/26 | 75132 | graphics/pgf/contrib/pfdicons/pfdicons-changelog.pdf 2021/07/27 | 1259 | graphics/pgf/contrib/pfdicons/pfdicons-changelog.tex 2021/07/26 | 971597 | graphics/pgf/contrib/pfdicons/pfdicons-doc.pdf @@ -216515,11 +216509,11 @@ 2022/01/04 | 1424 | macros/latex/contrib/cellspace/README 2022/01/05 | 343092 | macros/latex/contrib/cellspace.zip 2010/12/14 | 12474 | macros/latex/contrib/cell.zip -2022/04/21 | 246320 | macros/latex/contrib/censor/censor.pdf -2022/04/21 | 9840 | macros/latex/contrib/censor/censor.sty -2022/04/21 | 29232 | macros/latex/contrib/censor/censor.tex +2023/06/05 | 247256 | macros/latex/contrib/censor/censor.pdf +2023/06/05 | 10127 | macros/latex/contrib/censor/censor.sty +2023/06/05 | 29232 | macros/latex/contrib/censor/censor.tex 2021/12/23 | 1258 | macros/latex/contrib/censor/README -2022/04/21 | 238816 | macros/latex/contrib/censor.zip +2023/06/06 | 239824 | macros/latex/contrib/censor.zip 2022/10/10 | 826 | macros/latex/contrib/centeredline/centeredline.sty 2022/10/10 | 2836 | macros/latex/contrib/centeredline/README.md 2022/10/10 | 2231 | macros/latex/contrib/centeredline.zip @@ -217852,11 +217846,11 @@ 2011/09/01 | 599 | macros/latex/contrib/coseoul/cosexamp.tex 2011/09/01 | 2431 | macros/latex/contrib/coseoul/README 2011/09/06 | 163357 | macros/latex/contrib/coseoul.zip -2023/05/30 | 58484 | macros/latex/contrib/counterz/counterz.dtx -2023/05/30 | 2659 | macros/latex/contrib/counterz/counterz.ins -2023/05/30 | 315915 | macros/latex/contrib/counterz/counterz.pdf -2023/05/30 | 715 | macros/latex/contrib/counterz/README.txt -2023/05/30 | 324514 | macros/latex/contrib/counterz.zip +2023/06/05 | 57782 | macros/latex/contrib/counterz/counterz.dtx +2023/06/05 | 2659 | macros/latex/contrib/counterz/counterz.ins +2023/06/05 | 317154 | macros/latex/contrib/counterz/counterz.pdf +2023/06/05 | 715 | macros/latex/contrib/counterz/README.txt +2023/06/06 | 325858 | macros/latex/contrib/counterz.zip 2012/08/31 | 7031 | macros/latex/contrib/counttexruns/counttexruns.dtx 2012/08/31 | 694 | macros/latex/contrib/counttexruns/counttexruns.ins 2012/08/31 | 231467 | macros/latex/contrib/counttexruns/counttexruns.pdf @@ -238571,11 +238565,11 @@ 2004/07/27 | 2154 | macros/latex/contrib/texpower/tpslifonts/tpslifonts.ins 2006/03/21 | 29103 | macros/latex/contrib/texpower/tpslifonts.zip 2006/03/20 | 418227 | macros/latex/contrib/texpower.zip -2023/05/29 | 5122 | macros/latex/contrib/texshade/README -2023/05/29 | 1478681 | macros/latex/contrib/texshade/texshade.dtx +2023/06/06 | 5122 | macros/latex/contrib/texshade/README +2023/06/06 | 1478694 | macros/latex/contrib/texshade/texshade.dtx 2023/05/29 | 2545 | macros/latex/contrib/texshade/texshade.ins -2023/05/29 | 1565024 | macros/latex/contrib/texshade/texshade.pdf -2023/05/29 | 1507451 | macros/latex/contrib/texshade.zip +2022/08/30 | 1235875 | macros/latex/contrib/texshade/texshade.pdf +2023/06/06 | 1428346 | macros/latex/contrib/texshade.zip 2021/07/09 | 1113 | macros/latex/contrib/texsurgery/README.md 2021/07/09 | 135676 | macros/latex/contrib/texsurgery/texsurgery.pdf 2021/07/09 | 5240 | macros/latex/contrib/texsurgery/texsurgery.sty @@ -264502,6 +264496,12 @@ 1995/04/05 | 42569 | obsolete/graphics/metapost/MetaPost4OS2/tangle.zip 1995/04/05 | 27419 | obsolete/graphics/metapost/MetaPost4OS2/tftopl.zip 1995/04/05 | 46384 | obsolete/graphics/metapost/MetaPost4OS2/web2c.zip +2021/01/22 | 98018 | obsolete/graphics/pgf/contrib/penrose/penrose_code.dtx +2021/01/22 | 464179 | obsolete/graphics/pgf/contrib/penrose/penrose_code.pdf +2021/01/22 | 557513 | obsolete/graphics/pgf/contrib/penrose/penrose.pdf +2021/01/22 | 26060 | obsolete/graphics/pgf/contrib/penrose/penrose.tex +2021/01/22 | 472 | obsolete/graphics/pgf/contrib/penrose/README +2021/01/23 | 1034990 | obsolete/graphics/pgf/contrib/penrose.zip 2019/11/05 | 73317 | obsolete/graphics/pgf/contrib/pgf-cmykshadings/pgf-cmykshadings.dtx 2019/11/05 | 2684 | obsolete/graphics/pgf/contrib/pgf-cmykshadings/pgf-cmykshadings.ins 2019/11/05 | 522385 | obsolete/graphics/pgf/contrib/pgf-cmykshadings/pgf-cmykshadings.pdf @@ -282255,61 +282255,61 @@ 2018/04/15 | 1313 | support/latex-git-log/po/de.po 2020/02/26 | 3353 | support/latex-git-log/README.md 2020/02/27 | 87742 | support/latex-git-log.zip -2023/05/20 | 6165455 | support/latexindent/bin/linux/latexindent -2023/05/20 | 6394677 | support/latexindent/bin/macos/latexindent -2023/05/20 | 8705088 | support/latexindent/bin/windows/latexindent.exe -2023/05/20 | 22955 | support/latexindent/defaultSettings.yaml -2023/05/20 | 5908 | support/latexindent/documentation/contributors.bib -2023/05/20 | 7161 | support/latexindent/documentation/figure-schematic.png -2023/05/20 | 4402 | support/latexindent/documentation/latex-indent.bib -2023/05/20 | 1246969 | support/latexindent/documentation/latexindent.pdf -2023/05/20 | 434846 | support/latexindent/documentation/latexindent.tex -2023/05/20 | 54385 | support/latexindent/documentation/latexindent-yaml-schema.json -2023/05/20 | 44096 | support/latexindent/documentation/logo.png -2023/05/20 | 68057 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm -2023/05/20 | 24410 | support/latexindent/LatexIndent/Arguments.pm -2023/05/20 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm -2023/05/20 | 4816 | support/latexindent/LatexIndent/BlankLines.pm -2023/05/20 | 12646 | support/latexindent/LatexIndent/Braces.pm -2023/05/20 | 5390 | support/latexindent/LatexIndent/Check.pm -2023/05/20 | 10620 | support/latexindent/LatexIndent/Command.pm -2023/05/20 | 25007 | support/latexindent/LatexIndent/Document.pm -2023/05/20 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm -2023/05/20 | 6271 | support/latexindent/LatexIndent/Else.pm -2023/05/20 | 6807 | support/latexindent/LatexIndent/Environment.pm -2023/05/20 | 11300 | support/latexindent/LatexIndent/FileContents.pm -2023/05/20 | 8762 | support/latexindent/LatexIndent/FileExtension.pm -2023/05/20 | 54582 | support/latexindent/LatexIndent/GetYamlSettings.pm -2023/05/20 | 11142 | support/latexindent/LatexIndent/Heading.pm -2023/05/20 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm -2023/05/20 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm -2023/05/20 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm -2023/05/20 | 20797 | support/latexindent/LatexIndent/Indent.pm -2023/05/20 | 6717 | support/latexindent/LatexIndent/Item.pm -2023/05/20 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm -2023/05/20 | 9839 | support/latexindent/LatexIndent/Lines.pm -2023/05/20 | 13072 | support/latexindent/LatexIndent/LogFile.pm -2023/05/20 | 2320 | support/latexindent/LatexIndent/Logger.pm -2023/05/20 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm -2023/05/20 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm -2023/05/20 | 1558 | support/latexindent/latexindent-module-installer.pl -2023/05/20 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm -2023/05/20 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm -2023/05/20 | 3413 | support/latexindent/latexindent.pl -2023/05/20 | 2690 | support/latexindent/LatexIndent/Preamble.pm -2023/05/20 | 3747 | support/latexindent/LatexIndent/Replacement.pm -2023/05/20 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm -2023/05/20 | 20766 | support/latexindent/LatexIndent/Sentence.pm -2023/05/20 | 13890 | support/latexindent/LatexIndent/Special.pm -2023/05/20 | 2701 | support/latexindent/LatexIndent/Switches.pm -2023/05/20 | 3339 | support/latexindent/LatexIndent/Tokens.pm -2023/05/20 | 6882 | support/latexindent/LatexIndent/TrailingComments.pm -2023/05/20 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm -2023/05/20 | 27328 | support/latexindent/LatexIndent/Verbatim.pm -2023/05/20 | 838 | support/latexindent/LatexIndent/Version.pm -2023/05/20 | 34366 | support/latexindent/LatexIndent/Wrap.pm -2023/05/20 | 2008 | support/latexindent/README -2023/05/20 | 11170289 | support/latexindent.zip +2023/06/01 | 6165486 | support/latexindent/bin/linux/latexindent +2023/06/01 | 6394708 | support/latexindent/bin/macos/latexindent +2023/06/01 | 8705120 | support/latexindent/bin/windows/latexindent.exe +2023/06/01 | 23138 | support/latexindent/defaultSettings.yaml +2023/06/01 | 6405 | support/latexindent/documentation/contributors.bib +2023/06/01 | 7161 | support/latexindent/documentation/figure-schematic.png +2023/06/01 | 4402 | support/latexindent/documentation/latex-indent.bib +2023/06/01 | 1250364 | support/latexindent/documentation/latexindent.pdf +2023/06/01 | 436097 | support/latexindent/documentation/latexindent.tex +2023/06/01 | 54383 | support/latexindent/documentation/latexindent-yaml-schema.json +2023/06/01 | 44096 | support/latexindent/documentation/logo.png +2023/06/01 | 68057 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm +2023/06/01 | 24410 | support/latexindent/LatexIndent/Arguments.pm +2023/06/01 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm +2023/06/01 | 4816 | support/latexindent/LatexIndent/BlankLines.pm +2023/06/01 | 12646 | support/latexindent/LatexIndent/Braces.pm +2023/06/01 | 5390 | support/latexindent/LatexIndent/Check.pm +2023/06/01 | 10620 | support/latexindent/LatexIndent/Command.pm +2023/06/01 | 25007 | support/latexindent/LatexIndent/Document.pm +2023/06/01 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm +2023/06/01 | 6271 | support/latexindent/LatexIndent/Else.pm +2023/06/01 | 6807 | support/latexindent/LatexIndent/Environment.pm +2023/06/01 | 11300 | support/latexindent/LatexIndent/FileContents.pm +2023/06/01 | 8762 | support/latexindent/LatexIndent/FileExtension.pm +2023/06/01 | 54582 | support/latexindent/LatexIndent/GetYamlSettings.pm +2023/06/01 | 11142 | support/latexindent/LatexIndent/Heading.pm +2023/06/01 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm +2023/06/01 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm +2023/06/01 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm +2023/06/01 | 20797 | support/latexindent/LatexIndent/Indent.pm +2023/06/01 | 6717 | support/latexindent/LatexIndent/Item.pm +2023/06/01 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm +2023/06/01 | 9839 | support/latexindent/LatexIndent/Lines.pm +2023/06/01 | 13072 | support/latexindent/LatexIndent/LogFile.pm +2023/06/01 | 2320 | support/latexindent/LatexIndent/Logger.pm +2023/06/01 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm +2023/06/01 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm +2023/06/01 | 1558 | support/latexindent/latexindent-module-installer.pl +2023/06/01 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm +2023/06/01 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm +2023/06/01 | 3413 | support/latexindent/latexindent.pl +2023/06/01 | 2690 | support/latexindent/LatexIndent/Preamble.pm +2023/06/01 | 3747 | support/latexindent/LatexIndent/Replacement.pm +2023/06/01 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm +2023/06/01 | 20766 | support/latexindent/LatexIndent/Sentence.pm +2023/06/01 | 13890 | support/latexindent/LatexIndent/Special.pm +2023/06/01 | 2701 | support/latexindent/LatexIndent/Switches.pm +2023/06/01 | 3339 | support/latexindent/LatexIndent/Tokens.pm +2023/06/01 | 6923 | support/latexindent/LatexIndent/TrailingComments.pm +2023/06/01 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm +2023/06/01 | 27328 | support/latexindent/LatexIndent/Verbatim.pm +2023/06/01 | 836 | support/latexindent/LatexIndent/Version.pm +2023/06/01 | 34366 | support/latexindent/LatexIndent/Wrap.pm +2023/06/01 | 2006 | support/latexindent/README +2023/06/06 | 11173071 | support/latexindent.zip 2021/10/26 | 16439 | support/latex-make/figlatex.dtx 2021/10/26 | 238535 | support/latex-make/figlatex.pdf 2001/06/07 | 302 | support/latexmake/latexmake.diz @@ -291554,7 +291554,7 @@ 2020/03/04 | 408 | systems/texlive/tlnet/archive/collection-langpolish.r54074.tar.xz 2023/05/16 | 400 | systems/texlive/tlnet/archive/collection-langportuguese.r67125.tar.xz 2020/03/07 | 380 | systems/texlive/tlnet/archive/collection-langspanish.r54141.tar.xz -2023/05/23 | 6888 | systems/texlive/tlnet/archive/collection-latexextra.r67187.tar.xz +2023/06/06 | 6896 | systems/texlive/tlnet/archive/collection-latexextra.r67285.tar.xz 2022/06/10 | 700 | systems/texlive/tlnet/archive/collection-latex.r63515.tar.xz 2023/01/11 | 744 | systems/texlive/tlnet/archive/collection-latexrecommended.r65512.tar.xz 2023/05/09 | 992 | systems/texlive/tlnet/archive/collection-luatex.r67055.tar.xz @@ -291743,8 +291743,8 @@ 2019/02/28 | 7688 | systems/texlive/tlnet/archive/context-simplefonts.r47085.tar.xz 2023/05/12 | 849560 | systems/texlive/tlnet/archive/context-simpleslides.doc.r67070.tar.xz 2023/05/12 | 29160 | systems/texlive/tlnet/archive/context-simpleslides.r67070.tar.xz -2023/06/05 | 1632 | systems/texlive/tlnet/archive/context-sudoku.doc.r67279.tar.xz -2023/06/05 | 7692 | systems/texlive/tlnet/archive/context-sudoku.r67279.tar.xz +2023/06/06 | 1632 | systems/texlive/tlnet/archive/context-sudoku.doc.r67289.tar.xz +2023/06/06 | 7604 | systems/texlive/tlnet/archive/context-sudoku.r67289.tar.xz 2023/04/24 | 1052 | systems/texlive/tlnet/archive/context-texlive.r66924.tar.xz 2019/02/28 | 23088 | systems/texlive/tlnet/archive/context-title.doc.r47085.tar.xz 2019/02/28 | 2208 | systems/texlive/tlnet/archive/context-title.r47085.tar.xz @@ -298782,8 +298782,8 @@ 2019/02/28 | 1860 | systems/texlive/tlnet/archive/postcards.r21641.tar.xz 2019/02/28 | 93292 | systems/texlive/tlnet/archive/poster-mac.doc.r18305.tar.xz 2019/02/28 | 3152 | systems/texlive/tlnet/archive/poster-mac.r18305.tar.xz -2023/06/02 | 432700 | systems/texlive/tlnet/archive/postit.doc.r67254.tar.xz -2023/06/02 | 2228 | systems/texlive/tlnet/archive/postit.r67254.tar.xz +2023/06/06 | 488752 | systems/texlive/tlnet/archive/postit.doc.r67284.tar.xz +2023/06/06 | 3728 | systems/texlive/tlnet/archive/postit.r67284.tar.xz 2023/02/22 | 997696 | systems/texlive/tlnet/archive/postnotes.doc.r66019.tar.xz 2023/02/22 | 7232 | systems/texlive/tlnet/archive/postnotes.r66019.tar.xz 2023/02/22 | 21856 | systems/texlive/tlnet/archive/postnotes.source.r66019.tar.xz @@ -298853,6 +298853,8 @@ 2022/04/27 | 2748 | systems/texlive/tlnet/archive/proflabo.r63147.tar.xz 2023/06/04 | 1955816 | systems/texlive/tlnet/archive/proflycee.doc.r67275.tar.xz 2023/06/04 | 40732 | systems/texlive/tlnet/archive/proflycee.r67275.tar.xz +2023/06/06 | 169160 | systems/texlive/tlnet/archive/profmaquette.doc.r67285.tar.xz +2023/06/06 | 12148 | systems/texlive/tlnet/archive/profmaquette.r67285.tar.xz 2019/02/28 | 49880 | systems/texlive/tlnet/archive/program.doc.r44214.tar.xz 2019/02/28 | 11780 | systems/texlive/tlnet/archive/program.r44214.tar.xz 2019/02/28 | 86236 | systems/texlive/tlnet/archive/progressbar.doc.r33822.tar.xz @@ -300302,8 +300304,8 @@ 2020/03/24 | 9720 | systems/texlive/tlnet/archive/stanli.r54512.tar.xz 2019/02/28 | 494536 | systems/texlive/tlnet/archive/starfont.doc.r19982.tar.xz 2019/02/28 | 179532 | systems/texlive/tlnet/archive/starfont.r19982.tar.xz -2023/05/21 | 220368 | systems/texlive/tlnet/archive/starray.doc.r67173.tar.xz -2023/05/21 | 8772 | systems/texlive/tlnet/archive/starray.r67173.tar.xz +2023/06/06 | 220152 | systems/texlive/tlnet/archive/starray.doc.r67286.tar.xz +2023/06/06 | 9152 | systems/texlive/tlnet/archive/starray.r67286.tar.xz 2019/02/28 | 511988 | systems/texlive/tlnet/archive/startex.doc.r35718.tar.xz 2019/02/28 | 10172 | systems/texlive/tlnet/archive/startex.r35718.tar.xz 2019/02/28 | 25196 | systems/texlive/tlnet/archive/startex.source.r35718.tar.xz @@ -301006,7 +301008,7 @@ 2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz -2023/06/05 | 427044 | systems/texlive/tlnet/archive/texlive-scripts.doc.r67277.tar.xz +2023/06/06 | 427072 | systems/texlive/tlnet/archive/texlive-scripts.doc.r67283.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.aarch64-linux.r53577.tar.xz 2020/01/27 | 924 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-freebsd.r53577.tar.xz 2020/01/27 | 916 | systems/texlive/tlnet/archive/texlive-scripts-extra.amd64-netbsd.r53577.tar.xz @@ -301028,7 +301030,7 @@ 2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz -2023/06/05 | 114068 | systems/texlive/tlnet/archive/texlive-scripts.r67277.tar.xz +2023/06/06 | 114060 | systems/texlive/tlnet/archive/texlive-scripts.r67283.tar.xz 2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz 2023/05/14 | 60312 | systems/texlive/tlnet/archive/texlive-scripts.windows.r67095.tar.xz 2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz @@ -302892,16 +302894,16 @@ 2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz 2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz 2023/03/12 | 125532 | systems/texlive/tlnet/install-tl -2023/06/05 | 5735744 | systems/texlive/tlnet/install-tl-unx.tar.gz -2023/06/05 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 -2023/06/05 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2023/06/06 | 5735436 | systems/texlive/tlnet/install-tl-unx.tar.gz +2023/06/06 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2023/06/06 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2023/05/13 | 5083 | systems/texlive/tlnet/install-tl-windows.bat -2023/06/05 | 21036567 | systems/texlive/tlnet/install-tl-windows.exe -2023/06/05 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2023/06/05 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2023/06/05 | 26025297 | systems/texlive/tlnet/install-tl.zip -2023/06/05 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2023/06/05 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2023/06/06 | 21036620 | systems/texlive/tlnet/install-tl-windows.exe +2023/06/06 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2023/06/06 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2023/06/06 | 26025289 | systems/texlive/tlnet/install-tl.zip +2023/06/06 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2023/06/06 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc 2023/03/19 | 1229 | systems/texlive/tlnet/README.md 2023/03/19 | 0 | systems/texlive/tlnet/TEXLIVE_2023 2023/01/17 | 8401 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg @@ -302911,7 +302913,7 @@ 2023/01/17 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg 2023/01/17 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess 2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt -2023/06/04 | 7427 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl +2023/06/05 | 7380 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2023/05/31 | 215902 | systems/texlive/tlnet/tlpkg/installer/curl/curl-ca-bundle.crt 2020/04/15 | 2606592 | systems/texlive/tlnet/tlpkg/installer/curl/curl.exe 2017/04/16 | 2629 | systems/texlive/tlnet/tlpkg/installer/installer-options.txt @@ -302953,12 +302955,12 @@ 2023/02/21 | 20371 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm 2021/12/21 | 5429 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm 2023/04/08 | 28167 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm -2023/06/05 | 18118934 | systems/texlive/tlnet/tlpkg/texlive.tlpdb -2023/06/05 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2023/06/06 | 18120072 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2023/06/06 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2023/02/20 | 86803 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm -2023/06/05 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 -2023/06/05 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2023/06/05 | 2452292 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2023/06/06 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2023/06/06 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2023/06/06 | 2452964 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2023/02/20 | 58928 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm 2023/02/26 | 42350 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm 2023/02/21 | 16138 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm @@ -313471,7 +313473,7 @@ 2014/07/05 | 611 | systems/win32/yandy/README 2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz 2014/07/05 | 1012416 | systems/win32/yandy.zip -2023/06/06 | 186 | timestamp +2023/06/07 | 186 | timestamp 2002/08/26 | 61898 | usergrps/dante/antrag.pdf 2002/08/26 | 118217 | usergrps/dante/antrag.ps 2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib diff --git a/FILES.byname.gz b/FILES.byname.gz index 9bb3976e01..35d7ed5695 100644 Binary files a/FILES.byname.gz and b/FILES.byname.gz differ diff --git a/FILES.last07days b/FILES.last07days index c5d3550bce..2da0582bc6 100644 --- a/FILES.last07days +++ b/FILES.last07days @@ -1,3 +1,39 @@ +2023/06/06 | 9152 | systems/texlive/tlnet/archive/starray.r67286.tar.xz +2023/06/06 | 7604 | systems/texlive/tlnet/archive/context-sudoku.r67289.tar.xz +2023/06/06 | 6896 | systems/texlive/tlnet/archive/collection-latexextra.r67285.tar.xz +2023/06/06 | 5735436 | systems/texlive/tlnet/install-tl-unx.tar.gz +2023/06/06 | 5122 | macros/latex/contrib/texshade/README +2023/06/06 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +2023/06/06 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +2023/06/06 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc +2023/06/06 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc +2023/06/06 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc +2023/06/06 | 488752 | systems/texlive/tlnet/archive/postit.doc.r67284.tar.xz +2023/06/06 | 427072 | systems/texlive/tlnet/archive/texlive-scripts.doc.r67283.tar.xz +2023/06/06 | 4077069 | biblio/ctan-bibdata.zip +2023/06/06 | 3728 | systems/texlive/tlnet/archive/postit.r67284.tar.xz +2023/06/06 | 3678600 | biblio/ctan-bibdata/ctan.pdf +2023/06/06 | 325858 | macros/latex/contrib/counterz.zip +2023/06/06 | 2788844 | biblio/ctan-bibdata/ctan.bib +2023/06/06 | 26025289 | systems/texlive/tlnet/install-tl.zip +2023/06/06 | 2452964 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz +2023/06/06 | 239824 | macros/latex/contrib/censor.zip +2023/06/06 | 220152 | systems/texlive/tlnet/archive/starray.doc.r67286.tar.xz +2023/06/06 | 21036620 | systems/texlive/tlnet/install-tl-windows.exe +2023/06/06 | 18463 | CTAN.sites +2023/06/06 | 18120072 | systems/texlive/tlnet/tlpkg/texlive.tlpdb +2023/06/06 | 169160 | systems/texlive/tlnet/archive/profmaquette.doc.r67285.tar.xz +2023/06/06 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx +2023/06/06 | 1632 | systems/texlive/tlnet/archive/context-sudoku.doc.r67289.tar.xz +2023/06/06 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 +2023/06/06 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 +2023/06/06 | 1478694 | macros/latex/contrib/texshade/texshade.dtx +2023/06/06 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 +2023/06/06 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +2023/06/06 | 1428346 | macros/latex/contrib/texshade.zip +2023/06/06 | 12148 | systems/texlive/tlnet/archive/profmaquette.r67285.tar.xz +2023/06/06 | 114060 | systems/texlive/tlnet/archive/texlive-scripts.r67283.tar.xz +2023/06/06 | 11173071 | support/latexindent.zip 2023/06/05 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex 2023/06/05 | 97640 | macros/latex/contrib/l3kernel/l3seq.dtx 2023/06/05 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex @@ -15,10 +51,11 @@ 2023/06/05 | 78297 | macros/latex/contrib/l3kernel/l3names.dtx 2023/06/05 | 77774 | macros/latex/contrib/l3kernel/l3msg.dtx 2023/06/05 | 7732 | systems/texlive/tlnet/archive/bibcop.r67278.tar.xz -2023/06/05 | 7692 | systems/texlive/tlnet/archive/context-sudoku.r67279.tar.xz 2023/06/05 | 7472 | macros/latex/contrib/l3kernel/l3fp-assign.dtx 2023/06/05 | 73835 | macros/latex/contrib/l3kernel/l3fp-trig.dtx +2023/06/05 | 7380 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2023/06/05 | 7352030 | macros/latex/contrib/l3kernel/source3.pdf +2023/06/05 | 715 | macros/latex/contrib/counterz/README.txt 2023/06/05 | 7079 | macros/latex/contrib/l3kernel/l3term-glossary.tex 2023/06/05 | 70780 | macros/latex/contrib/l3kernel/expl3.dtx 2023/06/05 | 70679 | macros/latex/contrib/l3kernel/l3fp.dtx @@ -33,7 +70,7 @@ 2023/06/05 | 6224 | macros/latex/contrib/l3kernel/l3.ins 2023/06/05 | 6152 | systems/texlive/tlnet/archive/bibcop.source.r67278.tar.xz 2023/06/05 | 612029 | graphics/pgf/contrib/tilings/tilings.pdf -2023/06/05 | 5735744 | systems/texlive/tlnet/install-tl-unx.tar.gz +2023/06/05 | 57782 | macros/latex/contrib/counterz/counterz.dtx 2023/06/05 | 56559 | macros/latex/contrib/l3kernel/l3prop.dtx 2023/06/05 | 558448 | macros/latex/contrib/l3kernel/l3doc.pdf 2023/06/05 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex @@ -45,43 +82,36 @@ 2023/06/05 | 4937 | macros/latex/contrib/l3kernel/l3news01.tex 2023/06/05 | 49311 | macros/latex/contrib/l3kernel/l3fp-expo.dtx 2023/06/05 | 491142 | macros/latex/contrib/postit.zip -2023/06/05 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 2023/06/05 | 4890 | macros/latex/contrib/l3kernel/l3news.tex -2023/06/05 | 488 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc -2023/06/05 | 488 | systems/texlive/tlnet/install-tl.zip.sha512.asc -2023/06/05 | 488 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc -2023/06/05 | 488 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc 2023/06/05 | 47216 | macros/latex/contrib/l3kernel/l3fp-aux.dtx 2023/06/05 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex 2023/06/05 | 46204 | macros/latex/contrib/l3kernel/l3prefixes.csv 2023/06/05 | 4574 | macros/latex/contrib/l3kernel/l3legacy.dtx 2023/06/05 | 43225 | macros/latex/contrib/l3kernel/l3debug.dtx -2023/06/05 | 427044 | systems/texlive/tlnet/archive/texlive-scripts.doc.r67277.tar.xz 2023/06/05 | 41283 | graphics/pgf/contrib/tilings/tilings.tex -2023/06/05 | 4077217 | biblio/ctan-bibdata.zip 2023/06/05 | 40728 | macros/latex/contrib/l3kernel/l3sort.dtx 2023/06/05 | 395887 | macros/latex/contrib/l3kernel/l3news.pdf 2023/06/05 | 39448 | systems/texlive/tlnet/archive/nicematrix.r67280.tar.xz -2023/06/05 | 3677738 | biblio/ctan-bibdata/ctan.pdf 2023/06/05 | 359132 | systems/texlive/tlnet/archive/bibcop.doc.r67278.tar.xz 2023/06/05 | 35441 | macros/latex/contrib/l3kernel/l3quark.dtx 2023/06/05 | 35188 | macros/latex/contrib/l3kernel/l3sys.dtx 2023/06/05 | 33709 | macros/latex/contrib/l3kernel/l3cctab.dtx 2023/06/05 | 32935 | macros/latex/contrib/l3kernel/l3unicode.dtx +2023/06/05 | 317154 | macros/latex/contrib/counterz/counterz.pdf 2023/06/05 | 3116 | macros/latex/contrib/l3kernel/README.md 2023/06/05 | 30508 | macros/latex/contrib/l3kernel/l3intarray.dtx 2023/06/05 | 304307 | macros/latex/contrib/l3kernel/l3regex.dtx 2023/06/05 | 296797 | macros/latex/contrib/l3kernel/l3styleguide.pdf +2023/06/05 | 29232 | macros/latex/contrib/censor/censor.tex 2023/06/05 | 2821 | macros/latex/contrib/l3kernel/l3prefixes.tex -2023/06/05 | 2788130 | biblio/ctan-bibdata/ctan.bib 2023/06/05 | 27270 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx +2023/06/05 | 2659 | macros/latex/contrib/counterz/counterz.ins 2023/06/05 | 2644 | systems/texlive/tlnet/archive/jourrr.r67281.tar.xz -2023/06/05 | 26025297 | systems/texlive/tlnet/install-tl.zip 2023/06/05 | 25249 | macros/latex/contrib/l3kernel/l3deprecation.dtx 2023/06/05 | 250136 | macros/latex/contrib/l3kernel/l3news09.pdf 2023/06/05 | 24896 | macros/latex/contrib/l3kernel/source3body.tex +2023/06/05 | 247256 | macros/latex/contrib/censor/censor.pdf 2023/06/05 | 24568 | macros/latex/contrib/postit/tex/postit.sty -2023/06/05 | 2452292 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz 2023/06/05 | 243431 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf 2023/06/05 | 2390 | macros/latex/contrib/l3kernel/l3docstrip.dtx 2023/06/05 | 23866 | macros/latex/contrib/l3kernel/l3luatex.dtx @@ -89,7 +119,6 @@ 2023/06/05 | 23011 | macros/latex/contrib/l3kernel/l3fp-logic.dtx 2023/06/05 | 2229 | macros/latex/contrib/l3kernel/source3.tex 2023/06/05 | 218589 | macros/latex/contrib/l3kernel/l3term-glossary.pdf -2023/06/05 | 21036567 | systems/texlive/tlnet/install-tl-windows.exe 2023/06/05 | 2089668 | systems/texlive/tlnet/archive/nicematrix.doc.r67280.tar.xz 2023/06/05 | 204998 | macros/latex/contrib/l3kernel/l3news12.pdf 2023/06/05 | 20464 | macros/latex/contrib/l3kernel/l3text-purify.dtx @@ -99,26 +128,19 @@ 2023/06/05 | 19237 | macros/latex/contrib/l3kernel/l3pdf.dtx 2023/06/05 | 18930 | macros/latex/contrib/postit/doc/postit-doc.tex 2023/06/05 | 18532 | macros/latex/contrib/l3kernel/l3fp-round.dtx -2023/06/05 | 18118934 | systems/texlive/tlnet/tlpkg/texlive.tlpdb 2023/06/05 | 1722452 | macros/latex/contrib/l3kernel/interface3.pdf 2023/06/05 | 1700 | systems/texlive/tlnet/archive/collection-publishers.r67281.tar.xz 2023/06/05 | 170073 | macros/latex/contrib/l3kernel/l3news11.pdf -2023/06/05 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx 2023/06/05 | 16709 | macros/latex/contrib/l3kernel/l3candidates.dtx 2023/06/05 | 16633 | macros/latex/contrib/l3kernel/l3text-map.dtx 2023/06/05 | 163457 | macros/latex/contrib/l3kernel/l3news08.pdf -2023/06/05 | 1632 | systems/texlive/tlnet/archive/context-sudoku.doc.r67279.tar.xz 2023/06/05 | 155620 | macros/latex/contrib/l3kernel/l3doc.dtx -2023/06/05 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512 -2023/06/05 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512 2023/06/05 | 152256 | macros/latex/contrib/l3kernel/l3docstrip.pdf 2023/06/05 | 151568 | macros/latex/contrib/l3kernel/l3news06.pdf 2023/06/05 | 150674 | macros/latex/contrib/l3kernel/l3news02.pdf 2023/06/05 | 150283 | macros/latex/contrib/l3kernel/l3news10.pdf 2023/06/05 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex 2023/06/05 | 148700 | macros/latex/contrib/l3kernel/l3news03.pdf -2023/06/05 | 145 | systems/texlive/tlnet/install-tl.zip.sha512 -2023/06/05 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 2023/06/05 | 141613 | macros/latex/contrib/l3kernel/l3tl.dtx 2023/06/05 | 140307 | macros/latex/contrib/l3kernel/l3file.dtx 2023/06/05 | 13993568 | install/macros/latex/contrib/l3kernel.tds.zip @@ -133,7 +155,6 @@ 2023/06/05 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex 2023/06/05 | 11781 | macros/latex/contrib/l3kernel/l3fparray.dtx 2023/06/05 | 114586 | macros/latex/contrib/l3kernel/l3news04.pdf -2023/06/05 | 114068 | systems/texlive/tlnet/archive/texlive-scripts.r67277.tar.xz 2023/06/05 | 113435 | macros/latex/contrib/l3kernel/l3str-convert.dtx 2023/06/05 | 112483 | macros/latex/contrib/l3kernel/l3news05.pdf 2023/06/05 | 112274 | macros/latex/contrib/l3kernel/l3color.dtx @@ -142,10 +163,10 @@ 2023/06/05 | 105012 | macros/latex/contrib/l3kernel/l3fp-parse.dtx 2023/06/05 | 10328 | macros/latex/contrib/l3kernel/l3flag.dtx 2023/06/05 | 101624 | systems/texlive/tlnet/archive/jourrr.doc.r67281.tar.xz +2023/06/05 | 10127 | macros/latex/contrib/censor/censor.sty 2023/06/04 | 958 | biblio/bibtex/utils/bibcop/bibcop.1 2023/06/04 | 911018 | macros/latex/contrib/nicematrix/nicematrix-code.pdf 2023/06/04 | 82561 | macros/latex/contrib/jourrr/jourrr.pdf -2023/06/04 | 7427 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl 2023/06/04 | 59767 | macros/latex/contrib/starray/latex/starray.sty 2023/06/04 | 596415 | macros/latex/contrib/nicematrix/nicematrix.pdf 2023/06/04 | 59278 | macros/latex/contrib/profmaquette/latex/ProfMaquette.sty @@ -242,7 +263,6 @@ 2023/06/02 | 452319 | macros/latex/contrib/revtex/auguide/auguide4-2.pdf 2023/06/02 | 44803 | macros/latex/contrib/covington/covington.sty 2023/06/02 | 4379 | macros/latex/contrib/movement-arrows/movement-arrows.sty -2023/06/02 | 432700 | systems/texlive/tlnet/archive/postit.doc.r67254.tar.xz 2023/06/02 | 42603 | macros/latex/contrib/revtex/ltxdocext.dtx 2023/06/02 | 4082 | support/TeX4ht/source/update-htfonts 2023/06/02 | 396057 | macros/latex/contrib/revtex/sample/sor/sorsamp.pdf @@ -296,7 +316,6 @@ 2023/06/02 | 230858 | macros/latex/contrib/revtex/auguide/summary4-2.pdf 2023/06/02 | 224890 | support/TeX4ht/source/ChangeLog 2023/06/02 | 22384 | macros/latex/contrib/revtex/auguide/summary4-2.tex -2023/06/02 | 2228 | systems/texlive/tlnet/archive/postit.r67254.tar.xz 2023/06/02 | 221552 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex 2023/06/02 | 217239 | fonts/simpleicons/tex/simpleiconsglyphs-xeluatex.tex 2023/06/02 | 2136700 | macros/latex/contrib/proflycee.zip @@ -347,49 +366,93 @@ 2023/06/02 | 1119 | fonts/simpleicons/map/simpleicons.map 2023/06/02 | 10780 | systems/texlive/tlnet/archive/counterz.source.r67253.tar.xz 2023/06/02 | 1053310 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf +2023/06/01 | 9839 | support/latexindent/LatexIndent/Lines.pm +2023/06/01 | 8829 | support/latexindent/LatexIndent/IfElseFi.pm +2023/06/01 | 8762 | support/latexindent/LatexIndent/FileExtension.pm +2023/06/01 | 8705120 | support/latexindent/bin/windows/latexindent.exe 2023/06/01 | 86017 | language/greek/greek-fontenc/test-tuenc-greek.pdf 2023/06/01 | 84855 | language/greek/greek-fontenc/textalpha-doc-tu.pdf +2023/06/01 | 836 | support/latexindent/LatexIndent/Version.pm 2023/06/01 | 830477 | info/install-latex-guide-zh-cn.zip 2023/06/01 | 791513 | info/install-latex-guide-zh-cn/install-latex-guide-zh-cn.pdf 2023/06/01 | 78966 | language/greek/greek-fontenc/lgrenc.def.html 2023/06/01 | 77830 | macros/latex/contrib/babel-contrib/greek/babel-greek.dtx 2023/06/01 | 74860 | language/greek/greek-fontenc/alphabeta-doc-tu.pdf +2023/06/01 | 7428 | support/latexindent/LatexIndent/BackUpFileProcedure.pm +2023/06/01 | 7280 | support/latexindent/LatexIndent/MandatoryArgument.pm +2023/06/01 | 7161 | support/latexindent/documentation/figure-schematic.png 2023/06/01 | 70729 | macros/xetex/latex/exam-zh/tex/exam-zh.cls +2023/06/01 | 6923 | support/latexindent/LatexIndent/TrailingComments.pm 2023/06/01 | 6815 | info/install-latex-guide-zh-cn/appendix/updateinfo.tex +2023/06/01 | 6807 | support/latexindent/LatexIndent/Environment.pm +2023/06/01 | 68057 | support/latexindent/LatexIndent/AlignmentAtAmpersand.pm +2023/06/01 | 6717 | support/latexindent/LatexIndent/Item.pm 2023/06/01 | 67160 | language/greek/greek-fontenc/greek-fontenc-doc.html +2023/06/01 | 6522 | support/latexindent/LatexIndent/OptionalArgument.pm +2023/06/01 | 6405 | support/latexindent/documentation/contributors.bib +2023/06/01 | 6394708 | support/latexindent/bin/macos/latexindent +2023/06/01 | 6271 | support/latexindent/LatexIndent/Else.pm +2023/06/01 | 6165486 | support/latexindent/bin/linux/latexindent 2023/06/01 | 60576 | macros/xetex/latex/exam-zh/tex/exam-zh-question.sty +2023/06/01 | 5808 | support/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm 2023/06/01 | 57177 | macros/latex/contrib/babel-contrib/greek/babel-greek-doc.html 2023/06/01 | 549976 | macros/latex/contrib/babel-contrib/greek/babel-greek.pdf +2023/06/01 | 54582 | support/latexindent/LatexIndent/GetYamlSettings.pm +2023/06/01 | 54383 | support/latexindent/documentation/latexindent-yaml-schema.json +2023/06/01 | 5429 | support/latexindent/LatexIndent/KeyEqualsValuesBraces.pm +2023/06/01 | 5390 | support/latexindent/LatexIndent/Check.pm 2023/06/01 | 53597 | language/greek/greek-fontenc/textalpha.sty.html 2023/06/01 | 53113 | macros/xetex/latex/exam-zh/tex/exam-zh-symbols.sty 2023/06/01 | 52190 | language/greek/greek-fontenc/greek-fontenc.def.html 2023/06/01 | 500770 | language/greek/greek-fontenc/textalpha-doc.pdf +2023/06/01 | 4816 | support/latexindent/LatexIndent/BlankLines.pm 2023/06/01 | 466409 | macros/latex/contrib/babel-contrib/greek/test-greek.pdf +2023/06/01 | 44096 | support/latexindent/documentation/logo.png +2023/06/01 | 4402 | support/latexindent/documentation/latex-indent.bib +2023/06/01 | 4365 | support/latexindent/LatexIndent/RoundBrackets.pm +2023/06/01 | 436097 | support/latexindent/documentation/latexindent.tex +2023/06/01 | 4339 | support/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm 2023/06/01 | 43364 | language/greek/greek-fontenc/lgrenc.def 2023/06/01 | 433268 | language/greek/greek-fontenc/alphabeta-doc.pdf 2023/06/01 | 398308 | language/greek/greek-fontenc/test-licr-input.pdf 2023/06/01 | 37582 | macros/latex/contrib/babel-contrib/greek/test-case-changing.tex +2023/06/01 | 3747 | support/latexindent/LatexIndent/Replacement.pm 2023/06/01 | 35485 | language/greek/greek-fontenc/test-tuenc-greek.tex +2023/06/01 | 3482 | support/latexindent/LatexIndent/HorizontalWhiteSpace.pm 2023/06/01 | 34627 | macros/xetex/latex/exam-zh/doc/xdyydoc.cls +2023/06/01 | 34366 | support/latexindent/LatexIndent/Wrap.pm +2023/06/01 | 3413 | support/latexindent/latexindent.pl +2023/06/01 | 3339 | support/latexindent/LatexIndent/Tokens.pm 2023/06/01 | 3286 | info/install-latex-guide-zh-cn/install-latex-guide-zh-cn.tex 2023/06/01 | 327665 | language/greek/greek-fontenc/test-lgrenc.pdf 2023/06/01 | 2976133 | macros/xetex/latex/exam-zh.zip 2023/06/01 | 296813 | language/greek/greek-fontenc/hyperref-with-greek.pdf 2023/06/01 | 29348 | macros/latex/contrib/babel-contrib/greek/test-greek.tex +2023/06/01 | 27328 | support/latexindent/LatexIndent/Verbatim.pm 2023/06/01 | 2703394 | language/greek/greek-fontenc.zip +2023/06/01 | 2701 | support/latexindent/LatexIndent/Switches.pm +2023/06/01 | 2690 | support/latexindent/LatexIndent/Preamble.pm +2023/06/01 | 25007 | support/latexindent/LatexIndent/Document.pm 2023/06/01 | 24863 | macros/xetex/latex/exam-zh/tex/exam-zh-choices.sty 2023/06/01 | 24824 | macros/xetex/latex/exam-zh/tex/exam-zh-textfigure.sty +2023/06/01 | 24410 | support/latexindent/LatexIndent/Arguments.pm 2023/06/01 | 23839 | language/greek/greek-fontenc/greek-fontenc-doc.rst 2023/06/01 | 23270 | language/greek/greek-fontenc/textalpha.sty +2023/06/01 | 2320 | support/latexindent/LatexIndent/Logger.pm 2023/06/01 | 23159 | macros/xetex/latex/exam-zh/examples/example-multiple.tex +2023/06/01 | 23138 | support/latexindent/defaultSettings.yaml 2023/06/01 | 22293 | language/greek/greek-fontenc/greek-fontenc.def 2023/06/01 | 21738 | language/greek/greek-fontenc/test-lgrenc.tex +2023/06/01 | 20797 | support/latexindent/LatexIndent/Indent.pm +2023/06/01 | 20766 | support/latexindent/LatexIndent/Sentence.pm 2023/06/01 | 20721 | macros/xetex/latex/exam-zh/tex/exam-zh-chinese-english.sty 2023/06/01 | 20635 | macros/xetex/latex/exam-zh/tex/exam-zh-font.sty 2023/06/01 | 2061 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.tex 2023/06/01 | 204466 | language/greek/greek-fontenc/test-diacritics.pdf 2023/06/01 | 2011 | macros/xetex/latex/exam-zh/doc/exam-zh-doc-setup.tex +2023/06/01 | 2006 | support/latexindent/README 2023/06/01 | 19106 | macros/xetex/latex/exam-zh/LICENSE +2023/06/01 | 18522 | support/latexindent/LatexIndent/ModifyLineBreaks.pm 2023/06/01 | 18368 | macros/latex/contrib/babel-contrib/greek/babel-greek-doc.rst 2023/06/01 | 178616 | macros/latex/contrib/babel-contrib/greek/test-athnum.pdf 2023/06/01 | 1752641 | macros/latex/contrib/babel-contrib/greek.zip @@ -397,11 +460,21 @@ 2023/06/01 | 160183 | macros/xetex/latex/exam-zh/examples/example-multiple.pdf 2023/06/01 | 1595118 | macros/xetex/latex/exam-zh/doc/exam-zh-doc.pdf 2023/06/01 | 15664 | macros/latex/contrib/proflycee/tex/proflycee-tools-graphiques.tex +2023/06/01 | 1558 | support/latexindent/latexindent-module-installer.pl 2023/06/01 | 15066 | language/greek/greek-fontenc/test-diacritics.tex +2023/06/01 | 1485 | support/latexindent/LatexIndent/DoubleBackSlash.pm +2023/06/01 | 13890 | support/latexindent/LatexIndent/Special.pm 2023/06/01 | 134468 | macros/xetex/latex/exam-zh/examples/example-single.pdf +2023/06/01 | 13419 | support/latexindent/LatexIndent/HiddenChildren.pm +2023/06/01 | 13072 | support/latexindent/LatexIndent/LogFile.pm +2023/06/01 | 12646 | support/latexindent/LatexIndent/Braces.pm +2023/06/01 | 1250364 | support/latexindent/documentation/latexindent.pdf 2023/06/01 | 1211 | macros/latex/contrib/babel-contrib/greek/README.md 2023/06/01 | 11537 | macros/xetex/latex/exam-zh/README.md 2023/06/01 | 11463 | macros/xetex/latex/exam-zh/examples/example-single.tex +2023/06/01 | 11300 | support/latexindent/LatexIndent/FileContents.pm +2023/06/01 | 11142 | support/latexindent/LatexIndent/Heading.pm +2023/06/01 | 10620 | support/latexindent/LatexIndent/Command.pm 2023/06/01 | 10386 | macros/xetex/latex/exam-zh/CHANGELOG.md 2023/05/31 | 991 | graphics/circuit_macros/examples/Byte.m4 2023/05/31 | 988 | graphics/circuit_macros/examples/dpv/VariableDPV.m4 @@ -906,16 +979,3 @@ 2023/05/31 | 1017 | graphics/circuit_macros/doc/arrowex.m4 2023/05/31 | 10172 | graphics/circuit_macros/examples/Makefile 2023/05/31 | 1003 | graphics/circuit_macros/examples/ex15.m4 -2023/05/30 | 797217 | macros/luatex/latex/luacas.zip -2023/05/30 | 7248 | graphics/pgf/contrib/pgf-periodictable/myGroupColors.tex -2023/05/30 | 715 | macros/latex/contrib/counterz/README.txt -2023/05/30 | 6952517 | graphics/pgf/contrib/pgf-periodictable/pgf-PeriodicTableManual.pdf -2023/05/30 | 61848 | systems/texlive/tlnet/archive/texshade.r67243.tar.xz -2023/05/30 | 58484 | macros/latex/contrib/counterz/counterz.dtx -2023/05/30 | 365 | macros/latex/contrib/postit/README.md -2023/05/30 | 324514 | macros/latex/contrib/counterz.zip -2023/05/30 | 315924 | systems/texlive/tlnet/archive/texshade.source.r67243.tar.xz -2023/05/30 | 315915 | macros/latex/contrib/counterz/counterz.pdf -2023/05/30 | 2659 | macros/latex/contrib/counterz/counterz.ins -2023/05/30 | 1884 | graphics/pgf/contrib/pgf-periodictable/README -2023/05/30 | 1302448 | systems/texlive/tlnet/archive/texshade.doc.r67243.tar.xz diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib index f405927226..9cca9c3d85 100644 --- a/biblio/ctan-bibdata/ctan.bib +++ b/biblio/ctan-bibdata/ctan.bib @@ -1,7 +1,7 @@ %% bib file of all CTAN packages %% (C) Herbert Voß %% -%% created at 06-06-2023, 02:00:59 +%% created at 07-06-2023, 02:00:16 %% %% This file is provided under the terms of the LPPL v1.3 or @@ -11350,8 +11350,8 @@ title = {The \texttt{censor} package}, subtitle = {Tools for producing redacted documents}, author = {Steven B. Segletes}, - date = {2022-04-21}, - version = {4.2}, + date = {2023-06-06}, + version = {4.3}, license = {lppl1.3}, mirror = {https://mirror.ctan.org/macros/latex/contrib/censor}, url = {https://ctan.org/pkg/censor}, @@ -15558,8 +15558,8 @@ title = {The \texttt{counterz} package}, subtitle = {Additional tools for counters}, author = {Christopher McClain}, - date = {2023-05-30}, - version = {1.1.0}, + date = {2023-06-06}, + version = {1.1.1}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/counterz}, url = {https://ctan.org/pkg/counterz}, @@ -51822,10 +51822,10 @@ title = {The \texttt{penrose} package}, subtitle = {A TikZ library for producing Penrose tilings}, author = {Andrew Stacey}, - date = {2023-06-05}, + date = {2023-06-06}, version = {1.4}, license = {lppl1.3c}, - mirror = {https://mirror.ctan.org/graphics/pgf/contrib/penrose}, + mirror = {https://mirror.ctan.org/obsolete/graphics/pgf/contrib/penrose}, url = {https://ctan.org/pkg/penrose}, } @@ -54409,7 +54409,7 @@ title = {The \texttt{profmaquette} package}, subtitle = {Use exercises in different types of documents}, author = {Christophe Poulain}, - date = {2023-06-05}, + date = {2023-06-06}, version = {0.15}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/macros/latex/contrib/profmaquette}, @@ -67941,8 +67941,8 @@ title = {The \texttt{texshade} package}, subtitle = {Package for setting nucleotide and peptide alignments}, author = {Eric Beitz}, - date = {2023-05-29}, - version = {1.26b}, + date = {2023-06-06}, + version = {1.26c}, license = {gpl2}, mirror = {https://mirror.ctan.org/macros/latex/contrib/texshade}, url = {https://ctan.org/pkg/texshade}, @@ -69679,20 +69679,13 @@ @manual{ctan-tilings, title = {The \texttt{tilings} package}, - subtitle = {A TikZ library for producing tilings,such as Penrose tilings - and aperiodical polykite tilings}, + subtitle = {A TikZ library for drawing tiles and tilings}, author = {Andrew Stacey}, - date = {2023-06-05}, + date = {2023-06-06}, version = {2.0}, license = {lppl1.3c}, mirror = {https://mirror.ctan.org/graphics/pgf/contrib/tilings}, url = {https://ctan.org/pkg/tilings}, - annotation = {This package provides a library - for working with tiles, tilings, and tessellations. - Using it, one can define tiles, place tiles, deform tiles, and - - in some cases - apply replacement rules to generate tessellations. - It has pre-defined tiles for most of the Penrose tile sets and - the aperiodical polykite tiles.}, } @manual{ctan-timbreicmc, diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf index 2e812772f2..ebbf522251 100644 Binary files a/biblio/ctan-bibdata/ctan.pdf and b/biblio/ctan-bibdata/ctan.pdf differ diff --git a/graphics/pgf/contrib/penrose/README b/graphics/pgf/contrib/penrose/README deleted file mode 100644 index 43c2298f5f..0000000000 --- a/graphics/pgf/contrib/penrose/README +++ /dev/null @@ -1,8 +0,0 @@ ----------------------------------------------------------------- -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. diff --git a/graphics/pgf/contrib/penrose/penrose.pdf b/graphics/pgf/contrib/penrose/penrose.pdf deleted file mode 100644 index 67ea7a9309..0000000000 Binary files a/graphics/pgf/contrib/penrose/penrose.pdf and /dev/null differ diff --git a/graphics/pgf/contrib/penrose/penrose.tex b/graphics/pgf/contrib/penrose/penrose.tex deleted file mode 100644 index be44311844..0000000000 --- a/graphics/pgf/contrib/penrose/penrose.tex +++ /dev/null @@ -1,794 +0,0 @@ -%\immediate\write18{tex penrose_code.dtx} -\documentclass{ltxdoc} -\usepackage[T1]{fontenc} -\usepackage{trace} -\usepackage{lmodern} -\usepackage{morefloats} -\usepackage[svgnames]{xcolor} -\usepackage{tikz} -\usetikzlibrary{penrose} -\usepackage[numbered]{hypdoc} -\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9} - -\usepackage{listings} -\lstloadlanguages{[LaTeX]TeX} -\lstset{ - breakatwhitespace=true, - breaklines=true, - language=[LaTeX]TeX, - basicstyle=\small\ttfamily, - keepspaces=true, - columns=fullflexible -} - -\usepackage{fancyvrb} - -\newenvironment{example} - {\VerbatimEnvironment - \begin{VerbatimOut}{example.out}} - {\end{VerbatimOut} - \begin{center} - \setlength{\parindent}{0pt} - \fbox{\begin{minipage}{.9\linewidth} - \lstinputlisting[]{example.out} - \end{minipage}} - - \fbox{\begin{minipage}{.9\linewidth} - \centering - \input{example.out} - \end{minipage}} -\end{center} -} - -\newenvironment{justexample} - {\VerbatimEnvironment - \begin{VerbatimOut}{example.out}} - {\end{VerbatimOut} - \begin{center} - \setlength{\parindent}{0pt} - \fbox{\begin{minipage}{.9\linewidth} - \lstinputlisting[]{example.out} - \end{minipage}} -\end{center} -} - -\colorlet{thinRhombus}{DarkOrchid} -\colorlet{thickRhombus}{DarkSlateGray} -\colorlet{circleArc}{RosyBrown} -\colorlet{longArc}{LawnGreen} - -\colorlet{kite}{HotPink} -\colorlet{dart}{Fuchsia} - -\colorlet{goldenTriangle}{Gold} -\colorlet{reverseGoldenTriangle}{Magenta} -\colorlet{goldenGnomon}{Cyan} -\colorlet{reverseGoldenGnomon}{LimeGreen} - -\makeatletter -\tikzset{ - tint fill colour/.code={% - \edef\@temp{% - \def\noexpand\tikz@fillcolor{\tikz@fillcolor!#1}% - \noexpand\tikz@addoption{\noexpand\pgfsetfillcolor{\tikz@fillcolor!#1}}% - }% - \@temp - } -} -\makeatother - -\providecommand*{\url}{\texttt} -\GetFileInfo{tikzlibrarypenrose.code.tex} - -\title{The \textsf{Penrose} Package: Documentation} -\author{Andrew Stacey\texorpdfstring{\\ \url{loopspace@mathforge.org}}{}} - \date{\fileversion~from \filedate} - -\begin{document} -\maketitle - -\tableofcontents - -\section{Introduction} - -The \textsf{Penrose} package is a TikZ library for drawing Penrose tiles. -It currently supports natively the kite/dart, rhombus, and pentagon tile sets, but has provision for defining new tiles. -There are two main methods for their placement: one that automatically generates a tiling, and one that allows for ``by hand'' placement. -Furthermore, the tiles themselves can be deformed and will still (hopefully!) fit together in the correct fashion. - -\section{Initialisation} - -To use this package, load the \Verb+tikz+ package and load \Verb+penrose+ as a TikZ library. -Specifically, your preamble should contain: - -\begin{verbatim} -\usepackage{tikz} -\usetikzlibrary{penrose} -\end{verbatim} - -\section{Usage} - -Using this package splits into several components. -There are the two main ways of getting tiles on to the page, and then there are the ways of deforming or styling the tiles once they are there. - -\subsection{Placing Tiles ``By Hand''} - -It is possible to use the tiles as \Verb+pic+s. -These are mini-drawings introduced in TikZ3.0 that are node-like in style, but a little more geared towards repeatable \emph{drawings} than boxes containing text. -This package defines several \Verb+pic+ types: - -\tikzset{ - every Penrose pic/.style={draw,ultra thick}, - every circle arc/.style={draw,thin}, - every long arc/.style={draw,thin}, -} - -\begin{itemize} -\item Kite \tikz[baseline=-.5ex] \pic[draw,kite]; -\item Dart \tikz[baseline=-.5ex] \pic[draw,dart]; -\item Thin Rhombus \tikz[baseline=-.5ex] \pic[draw,thin rhombus]; -\item Thick Rhombus \tikz[baseline=-.5ex] \pic[draw,thick rhombus]; -\item Pentagon \tikz[baseline=-.5ex] \pic[draw, pentagon 5]; -(Actually, there are three pentagons: \Verb+pentagon 5+, \Verb+pentagon 3+, and \Verb+pentagon 2+. -The number signifies how many pentagons it goes next to.) -\item Pentagram \tikz[baseline=-.5ex] \pic[draw, pentagram]; -\item Boat \tikz[baseline=-.5ex] \pic[draw, boat]; -\item Diamond \tikz[baseline=-.5ex] \pic[draw, diamond]; -\item Golden Triangle \tikz[baseline=-.5ex] \pic[draw,golden triangle]; -\item Reverse Golden Triangle \tikz[baseline=-.5ex] \pic[draw,reverse golden triangle]; -\item Golden Gnomon \tikz[baseline=-.5ex] \pic[draw,golden gnomon]; -\item Reverse Golden Gnomon \tikz[baseline=-.5ex] \pic[draw,reverse golden gnomon]; -\end{itemize} - -The main tiles can have arcs drawn on them to illustrate the matching rules. -The triangles and gnomon are not true Penrose tiles but rather can be used to build tilings so they do not have the arcs. -The two types of each triangle and gnomon are actually different in that they have different matching rules. -This is best illustrated by deforming the paths (see Section~\ref{sec:pathdeform}). - -There are two ways in TikZ to specify the \Verb+pic+ type: either as the ``contents'' of the pic or as the argument to the \Verb+pic type+ key. -Each of the tiles comes with a shorthand key which specifies the \Verb+pic type+ and also invokes the key \Verb+every Penrose tile+. -That is, the key \Verb+dart+ calls the \Verb+every Penrose tile+ key and specifies the \Verb+pic type+ as \Verb+dart+. - -The tiles can be placed using standard TikZ methods. -One important thing to note is that by default, \Verb+pic+s are like \Verb+nodes+ in that they only respond to ambient translations, and not to rotations and scaling. -To make them notice this, use the key \Verb+transform shape+ or specify the transformation to the \Verb+pic+ directly. -If the shortcut keys are used to specify the tiles, this can be put in the \Verb+every Penrose pic+ style. - -TikZ \Verb+pic+s can be named, using the \Verb+name=+ key. -When a Penrose tile has been named then it can be used for positioning other tiles. -Each edge is assigned a label from \Verb+a b c d e A B C D E+ and a new tile can be aligned with an old one along a matching edge (\Verb+a+ matches with \Verb+A+ and so on). - -The edge labels are as follows. -For the \Verb+pentagon 5+, for example, the edges are all the same and the numbers are used to distinguish between them. - -\foreach \tile/\edges in { - kite/{a,A,c,C}, - dart/{a,A,c,C}, - thin rhombus/{a,A,b,B}, - thick rhombus/{a,A,b,B}, - pentagon 5/{a1,a2,a3,a4,a5}, - pentagon 3/{A,b1,a1,a2,b2}, - pentagon 2/{d,A1,c1,c2,A2}, - pentagram/{C1,C2,C3,C4,C5,C6,C7,C8,C9,C10}, - boat/{C1,C2,C3,C4,B1,D,B2}, - diamond/{D1,B1,B2,D2}, - golden triangle/{a,b,c}, - reverse golden triangle/{A,B,C}, - golden gnomon/{A,b,C}, - reverse golden gnomon/{a,B,c}} { - -\begin{tikzpicture} -\pic[draw,\tile,name=tile]; -\foreach \e in \edges { - \path (tile-edge \e\space start) -- node {\e} (tile-edge \e\space end); -} -\end{tikzpicture} - -} - -To align a tile with an existing one, use the following key: -% -\begin{verbatim} -align with= along -\end{verbatim} -% -where \Verb++ is the name given to an existing tile, and \Verb++ is the label on the existing tile. -If the tile being placed has edges that are identical (for example, \Verb+pentagon 5+), this syntax extends to -% -\begin{verbatim} -align with= along using -\end{verbatim} -% -to specify which of the edges on the new tile to use. - -\begin{example} -\begin{tikzpicture} -\pic[kite,name=tile]; -\pic[dart,align with=tile along c]; -\pic[pentagon 5,name=ptile,at={(3,0)}]; -\pic[pentagon 3,align with=ptile along a1 using 2]; -\end{tikzpicture} -\end{example} - -With judicious use of loops, quite complicated pictures can be rendered using simple code. -(Note that the \Verb+transform shape+ is \emph{not} needed to apply the transformations needed to place a tile using this syntax.) - -\begin{example} -\begin{tikzpicture}[ - every rhombus/.style={ - draw=black, - ultra thick, - }, - every thin rhombus/.style={ - every rhombus/.try, - fill=thinRhombus, - }, - every thick rhombus/.style={ - every rhombus/.try, - fill=thickRhombus, - }, - every circle arc/.style={ - draw=circleArc - }, - every long arc/.style={ - draw=longArc - } -] -\pic[rotate=18,thick rhombus,name=a0]; -\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} -{ - \pic[thick rhombus,name=a\k,align with={a\kmo} along A]; -} -\foreach \k in {0,...,4} -{ - \pic[thin rhombus,name=b\k,align with={a\k} along B]; - \pic[thick rhombus,name=c\k,align with={b\k} along A]; - \pic[thick rhombus,name=d\k,align with={b\k} along a]; - \pic[thick rhombus,name=e\k,align with={c\k} along A]; - \foreach \l/\a in {{0/b},{1/B}} - \pic[thin rhombus,name=f\k\l,align with={e\k} along \a]; -} -\pic[thin rhombus,name=g0,align with={f10} along a]; -\pic[thin rhombus,name=g1,align with={f21} along A]; -\foreach \l/\a in {{0/a},{1/A}} - \pic[thick rhombus,name=h\l,align with={g\l} along \a]; -\pic[thick rhombus,name=i,align with=g0 along B]; -\foreach \l/\a in {{0/a},{1/A}} - \pic[thick rhombus,name=j\l,align with=i along \a]; -\end{tikzpicture} -\end{example} - -The tiles can be styled, either directly or using various keys. -Each tile has the following styles applied (in this order): -% -\begin{enumerate} -\item \Verb+every Penrose Tile+ -\item \Verb+every + -\item \Verb+pic actions+ -\end{enumerate} -% -The \Verb+pic actions+ are any actions given directly to the tile, as in \Verb+\pic[draw,thin rhombus];+. -The kite, dart, and rhombus tiles also have arcs drawn on them and these are styled as \Verb+every circle arc+ and \Verb+every long arc+. -The names come from the way the arcs look on the rhombus shapes. - -One other point is important to note about the tiles. -They are actually clipped against themselves. -This ensures that the tiles do not overstep their bounds and so when placed alongside each other then they do not go over each other. -In practical terms, this means that if drawn then the line width is half that which might be expected (but when placed next to another tile, the two halves combine to the expected width). - -\subsection{Placing Tiles Automatically} - -There is a way to specify a Penrose tiling using \emph{Lindenmayer systems}. -In brief, this takes a golden triangle or gnomon (or one of the reverse ones) and repeatedly decomposes it into smaller triangles and gnomon. -Once a desired level has been reached, the resulting triangles and gnomon are glued together in pairs to create either darts and kites or rhombuses (of both types). -This library contains an implementation of this for each of the tilings. - -The user command is: -% -\begin{verbatim} -\PenroseDecomposition{}{}{} -\end{verbatim} -% -where \Verb++ is one of: -% -\begin{itemize} -\item \Verb+kite+ for the kite and dart tiling, -\item \Verb+rhombus+ for the rhombus tiling, -\item \Verb+pentagon+ for the pentagon tiling. -\item \Verb+ktriangle+ for the triangular decomposition used to form the kite and dart tiling but with the individual triangles -\item \Verb+rtriangle+ for the triangular decomposition used to form the rhombus tiling but with the individual triangles. -\end{itemize} - -The \Verb++ is a ``word'' that will be used to initiate the Lindenmayer system. -The key letters in the alphabet for the kite/darts and rhombuses are \Verb+T+, \Verb+t+, \Verb+G+, and \Verb+g+. -These actually correspond to the two triangles and two gnomons. -For the pentagons, the key letters are \Verb+P+, \Verb+Q+, \Verb+R+, \Verb+G+, \Verb+B+, \Verb+D+. -These correspond to the three pentagons, the pentagram, the boat, and the diamond. -Other permitted letters are \Verb+[+, \Verb+]+, \Verb+s+, \Verb+f+, \Verb!+!, \Verb+*+, \Verb+-+, \Verb+_+, \Verb+>+. -These refer to various transformations (for details, see the implementation). - -The \Verb++ controls how far to take the iteration. -The code is not particularly optimised for speed, and once \Verb++ gets to about \(5\) or \(6\) then we are at the ``make a cup of tea while compiling'' stage, depending on the processor. - -\begin{example} -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - Penrose step=2cm, -] -\PenroseDecomposition{kite}{0}{T} -\end{tikzpicture} -\end{example} - -The same styling keys as for the \Verb+pic+ tiles apply, together with some additional ones. -These allow styling the tiles by their number: a count is kept of the number of tiles and each tile knows its own number. -Specifically, two keys are tried: -% -\begin{enumerate} -\item \Verb+Penrose tile +, and -\item \Verb+Penrose tile={}{}+ -\end{enumerate} -% -A word of warning is in order on the second of these. -The \Verb++ is not guaranteed to be correct. -It is done by a quick count at the start of the process and counts those letters which \emph{might} result in a rendered tile. -Not every letter in the resulting word actually does. -Nevertheless, this can be used to style a tile based on what proportion of tiles have been rendered. - -Lastly, \Verb+Penrose step+ is used to control the size of the resulting picture. - -\begin{example} -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - Penrose step=4cm, - Penrose tile/.code 2 args={ - \pgfmathsetmacro\tint{100*#1/#2} - \pgfkeysalso{fill=black!\tint} - } -] -\PenroseDecomposition{rhombus}{3}{T} -\end{tikzpicture} -\end{example} - -\section{Deforming Paths} -\label{sec:pathdeform} - -This package provides the ability to deform the various tiles. -The various tiles can be built from four paths (labelled \Verb+a+, \Verb+b+, \Verb+c+, and \Verb+d+) together with their reverses. -By changing these paths, one can get a wide variety of different tiles with the same fundamental matching rules. -Indeed, by using asymmetric paths, the matching rules can be enforced without the need for additional decoration. - -Internally, the \Verb+penrose+ library uses the \Verb+spath3+ package for storing and manipulating the paths. - -To create a new edge path, use the key \Verb+save Penrose path=+ where \Verb++ is a symbol used in the edge description of a tile. -There are no constraints on the size of the path as all paths are scaled and transformed to fit the tiles. -Once the edge paths have been specified, they are welded together into the tiles using the following command: -% -\begin{verbatim} -\BakePenroseTile{} -\end{verbatim} -% -Here, \Verb++ is one of the names of the tiles. -This has global effect, as does the definition of the edge paths. -Paths, both sides and tiles, can be cloned via: -% -\begin{verbatim} -\tikzset{clone Penrose side path={target}{source} -\tikzset{clone Penrose tile path={target}{source} -\end{verbatim} -% -and restored with the same command (but names switched). - -The initial version of this package used \Verb!\MakePenroseTile! for this command. -That command is still available for backwards compatibility. - -\begin{example} -\begin{tikzpicture} -\pic[draw,dart,name=dart]; -\pic[draw,kite,align with=dart along c]; -\pic[draw,kite,align with=dart along C]; -\tikzset{clone Penrose tile path={original kite}{kite}} -\tikzset{clone Penrose tile path={original dart}{dart}} -\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); -\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); -\BakePenroseTile{kite} -\BakePenroseTile{dart} -\pic[xshift=2cm,draw,dart,name=dart]; -\pic[draw,kite,align with=dart along c]; -\pic[draw,kite,align with=dart along C]; -\tikzset{clone Penrose tile path={kite}{original kite}} -\tikzset{clone Penrose tile path={dart}{original dart}} -\pic[xshift=4cm,draw,dart,name=dart]; -\pic[draw,kite,align with=dart along c]; -\pic[draw,kite,align with=dart along C]; -\end{tikzpicture} -\end{example} - -With deformed tiles, there is no guarantee that the inner arcs will match up perfectly. - -\section{Defining New Tiles} - -This package includes the capability to define new tiles. -The command to do this is: -% -\begin{verbatim} -\DefineTile{}{}{} -\end{verbatim} -% -For example, -% -\begin{verbatim} -\DefineTile {square}{a A a A} -{ - {0,0} - {1,0} - {1,1} - {0,1} -} -\end{verbatim} -% -The \Verb!! is a list of sides for matching rules. -Each letter used matches against its opposite case (so it is possible to create a side that matches against itself by using a symbol that \TeX\ regards as having the same upper as lower case; not all symbols work, I've used \Verb+!+ successfully). -These are also used in path replacing, both a letter and its opposite case are replaced by the corresponding path (but in opposite directions) when the tile is ``baked''. -The coordinates are passed to the \Verb!fp! module of \LaTeX3 so can involve complicated expressions. -Note that the trigonometric functions for angles in degrees are \Verb!cosd!, \Verb!sind!, and \Verb!tand!. - -Note that the tile must be baked via the command \Verb!\BakePenroseTile! before it can be used. - -The new tile can be used with all the same features as the pre-defined Penrose tiles, except for the Lindenmayer systems. - -\begin{example} -\DefineTile {square}{a A a A} -{ - {0,0} - {1,0} - {1,1} - {0,1} -} - -\begin{tikzpicture} -\path[save Penrose path=a] (0,0) to[out=45,in=135] (1,0); -\BakePenroseTile{square} -\pic[square,name=A,fill=green]; -\pic[square,align with=A along a1 using 2,name=B,fill=red]; -\pic[square,align with=A along A1 using 2,fill=red]; -\pic[square,align with=A along A2 using 1,fill=red]; -\pic[square,align with=B along a1 using 2,fill=green]; -\pic[square,align with=B along a2 using 1,fill=green]; -\end{tikzpicture} -\end{example} - -\section{More Examples} - -Let's set some aesthetically pleasing shapes. - -\begin{justexample} -\begin{tikzpicture} -\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); -\path[save Penrose path=b] (0,0) to[out=0,in=140] (1,0); -\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); -\BakePenroseTile{thin rhombus} -\BakePenroseTile{thick rhombus} -\BakePenroseTile{golden triangle} -\BakePenroseTile{reverse golden triangle} -\BakePenroseTile{golden gnomon} -\BakePenroseTile{reverse golden gnomon} -\BakePenroseTile{kite} -\BakePenroseTile{dart} -\end{tikzpicture} -\end{justexample} - -\begin{tikzpicture} -\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); -\path[save Penrose path=b] (0,0) to[out=0,in=140] (1,0); -\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); -\BakePenroseTile{thin rhombus} -\BakePenroseTile{thick rhombus} -\BakePenroseTile{golden triangle} -\BakePenroseTile{reverse golden triangle} -\BakePenroseTile{golden gnomon} -\BakePenroseTile{reverse golden gnomon} -\BakePenroseTile{kite} -\BakePenroseTile{dart} -\end{tikzpicture} - - -Styling the first tile. -Note that as the pattern is formed by repeating two different initial seeds \(5\) times, there are \(10\) ``first tiles'' in each overall pattern. - -\begin{example} -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - Penrose tile 1/.style={fill=yellow}, -] -\foreach \tp/\pos in {rhombus/0cm,rtriangle/2.5cm,kite/5cm,ktriangle/7.5cm} -{ -\begin{scope}[xshift=\pos] -\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { - \begin{scope}[rotate=\mk*36] - \PenroseDecomposition{\tp}{1}{\ax} - \end{scope} -} -\end{scope} -} -\end{tikzpicture} -\end{example} - -A more detailed decomposition, with more and more tinting applied to teach tile. -Roughly half of the counted tiles are rendered, and the ordering in which they are rendered is not at first an obvious one (though it is in general from ``outside in''). - -Note that the key \Verb+tint fill colour+ is not a TikZ native. -It is defined as: - -\begin{verbatim} -\makeatletter -\tikzset{ - tint fill colour/.code={% - \edef\@temp{% - \def\noexpand\tikz@fillcolor{\tikz@fillcolor!#1}% - \noexpand\tikz@addoption{% - \noexpand\pgfsetfillcolor{\tikz@fillcolor!#1}% - }% - }% - \@temp - } -} -\makeatother -\end{verbatim} - -\begin{example} -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - every kite/.style={fill=reverseGoldenTriangle}, - every dart/.style={fill=goldenTriangle}, - Penrose tile/.code 2 args={ - \pgfmathsetmacro\tint{100*(1 - 1.5*#1/#2))} - \pgfkeysalso{tint fill colour=\tint} - } -] -\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { - \begin{scope}[rotate=\mk*36] - \PenroseDecomposition[Penrose step=5cm]{kite}{4}{\ax} - \end{scope} -} -\end{tikzpicture} -\end{example} - -An example with ``manual placement''. - -\begin{example} -\begin{tikzpicture}[ - every Penrose pic/.style={ - draw=black, - ultra thick, - }, - every kite/.style={ - fill=kite, - }, - every dart/.style={ - fill=dart, - }, - every circle arc/.style={ - draw=circleArc - }, - every long arc/.style={ - draw=longArc - } -] -\pic[dart,name=a0]; -\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} { - \pic[dart,name=a\k,align with={a\kmo} along a]; -} -\foreach \k in {0,...,4} { - \foreach \l/\e/\ee in {0/c/a,1/C/A} { - \pic[kite,name=b\l\k,align with={a\k} along \e]; - \pic[dart,name=c\l\k,align with={b\l\k} along \ee]; - \pic[kite,name=d\l\k,align with={c\l\k} along \e]; - } - \pic[kite,name=e\k,align with={c0\k} along C]; - \pic[dart,name=f\k,align with={c0\k} along a]; - \foreach \e in {c,C} { - \pic[kite,name=g\k,align with={f\k} along \e]; - } -} -\end{tikzpicture} -\end{example} - - -The decomposition rules for the Lindenmayer system can be illustrated by drawing each tile together with the result of one decomposition superimposed on top. - -\begin{example} -\foreach \ax in {T,t,G,g} { - -\begin{tikzpicture} -\foreach \tp/\pos in {rhombus/0cm,rtriangle/2cm,kite/4cm,ktriangle/6cm} -{ -\begin{scope}[xshift=\pos] - \PenroseDecomposition[every path/.style={draw=red,ultra thick}]{\tp}{0}{\ax} - \PenroseDecomposition[every path/.style={fill=gray!50,fill opacity=.5,draw=black}]{\tp}{1}{\ax} -\end{scope} -} -\end{tikzpicture} - -} -\end{example} - -The tiles can make interesting forms by themselves. - -\begin{example} -\begin{tikzpicture}[ - scale=2, - every Penrose pic/.style={ - transform shape, - }, - every golden triangle/.style={ - draw=black, - ultra thick, - fill=goldenTriangle, - }, - every reverse golden triangle/.style={ - draw=black, - ultra thick, - fill=reverseGoldenTriangle, - }, - every golden gnomon/.style={ - draw=black, - ultra thick, - fill=goldenGnomon, - }, - every reverse golden gnomon/.style={ - draw=black, - ultra thick, - fill=reverseGoldenGnomon, - }, -] -\pic[golden triangle,name=a]; -\pic[reverse golden triangle,align with=a along a]; -\pic[reverse golden triangle,align with=a along b]; -\pic[reverse golden triangle,align with=a along c]; -\begin{scope}[xshift=2cm] -\pic[reverse golden triangle,name=a]; -\pic[golden triangle,align with=a along A]; -\pic[golden triangle,align with=a along B]; -\pic[golden triangle,align with=a along C]; -\end{scope} -\begin{scope}[yshift=-3cm] -\pic[golden gnomon,name=a]; -\pic[reverse golden gnomon,align with=a along C]; -\pic[reverse golden gnomon,align with=a along b]; -\pic[reverse golden gnomon,align with=a along A]; -\begin{scope}[xshift=2cm] -\pic[reverse golden gnomon,name=a]; -\pic[golden gnomon,align with=a along c]; -\pic[golden gnomon,align with=a along B]; -\pic[golden gnomon,align with=a along a]; -\end{scope} -\end{scope} -\end{tikzpicture} -\end{example} - -\begin{example} -\begin{tikzpicture}[ - every rhombus/.style={ - draw=black, - ultra thick, - }, - every thin rhombus/.style={ - every rhombus/.try, - fill=thinRhombus, - }, - every thick rhombus/.style={ - every rhombus/.try, - fill=thickRhombus, - }, - every circle arc/.style={ - draw=circleArc - }, - every long arc/.style={ - draw=longArc - } -] -\pic[rotate=18,thick rhombus,name=a0]; -\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} -{ - \pic[thick rhombus,name=a\k,align with={a\kmo} along A]; -} -\foreach \k in {0,...,4} -{ - \pic[thin rhombus,name=b\k,align with={a\k} along B]; - \pic[thick rhombus,name=c\k,align with={b\k} along A]; - \pic[thick rhombus,name=d\k,align with={b\k} along a]; - \pic[thick rhombus,name=e\k,align with={c\k} along A]; - \foreach \l/\a in {{0/b},{1/B}} - \pic[thin rhombus,name=f\k\l,align with={e\k} along \a]; -} -\pic[thin rhombus,name=g0,align with={f10} along a]; -\pic[thin rhombus,name=g1,align with={f21} along A]; -\foreach \l/\a in {{0/a},{1/A}} - \pic[thick rhombus,name=h\l,align with={g\l} along \a]; -\pic[thick rhombus,name=i,align with=g0 along B]; -\foreach \l/\a in {{0/a},{1/A}} - \pic[thick rhombus,name=j\l,align with=i along \a]; -\end{tikzpicture} -\end{example} - -Lastly, here's an example that generates full page patterns. - -\begin{justexample} -\foreach \tp/\lvl in {rhombus/5,rhombus/6,kite/5,kite/6} -{ -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - remember picture, - overlay, - scale=20 -] -\coordinate (a) at (current page.center); -\begin{scope}[shift={(a)}] -\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { - \begin{scope}[rotate=\mk*36] - \PenroseDecomposition{\tp}{\lvl}{\ax} - \end{scope} -} -\end{scope} -\end{tikzpicture} -\newpage -} -\end{justexample} - -\begin{tikzpicture} -\path[save Penrose path=a] (0,0) -- (1,0); -\path[save Penrose path=b] (0,0) -- (1,0); -\path[save Penrose path=c] (0,0) -- (1,0); -\BakePenroseTile{thin rhombus} -\BakePenroseTile{thick rhombus} -\BakePenroseTile{golden triangle} -\BakePenroseTile{reverse golden triangle} -\BakePenroseTile{golden gnomon} -\BakePenroseTile{reverse golden gnomon} -\BakePenroseTile{kite} -\BakePenroseTile{dart} -\end{tikzpicture} - -\newpage - -\foreach \tp/\lvl in {rhombus/5,rhombus/6,kite/5,kite/6} -{ -\begin{tikzpicture}[ - every Penrose tile/.style={draw}, - remember picture, - overlay, - scale=20 -] -\coordinate (a) at (current page.center); -\begin{scope}[shift={(a)}] -\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { - \begin{scope}[rotate=\mk*36] - \PenroseDecomposition{\tp}{\lvl}{\ax} - \end{scope} -} -\end{scope} -\end{tikzpicture} -\newpage -} - - -%% \foreach \lvl in {5,6} -%% { -%% \begin{tikzpicture}[ -%% every Penrose tile/.style={draw}, -%% remember picture, -%% overlay, -%% scale=180 -%% ] -%% \coordinate (a) at (current page.center); -%% \PenroseDecomposition{pentagon}{\lvl}{D} -%% \end{tikzpicture} -%% \newpage -%% } - - -\end{document} - -% Local Variables: -% tex-output-type: "pdf18" -% End: diff --git a/graphics/pgf/contrib/penrose/penrose_code.dtx b/graphics/pgf/contrib/penrose/penrose_code.dtx deleted file mode 100644 index cdc6356965..0000000000 --- a/graphics/pgf/contrib/penrose/penrose_code.dtx +++ /dev/null @@ -1,3126 +0,0 @@ -% \iffalse meta-comment -%<*internal> -\iffalse -% -%<*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. -% -%<*internal> -\fi -\def\nameofplainTeX{plain} -\ifx\fmtname\nameofplainTeX\else - \expandafter\begingroup -\fi -% -%<*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 - -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}} -} -% -%\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 -% -%<*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} -% -% \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= along + 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= along using +. -% \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} -% -% \end{macrocode} -% -% \end{implementation} -% -%\Finale -\endinput diff --git a/graphics/pgf/contrib/penrose/penrose_code.pdf b/graphics/pgf/contrib/penrose/penrose_code.pdf deleted file mode 100644 index 59579b2524..0000000000 Binary files a/graphics/pgf/contrib/penrose/penrose_code.pdf and /dev/null differ diff --git a/macros/latex/contrib/censor/censor.pdf b/macros/latex/contrib/censor/censor.pdf index 637c75f820..cd519b7d55 100644 Binary files a/macros/latex/contrib/censor/censor.pdf and b/macros/latex/contrib/censor/censor.pdf differ diff --git a/macros/latex/contrib/censor/censor.sty b/macros/latex/contrib/censor/censor.sty index 2232bc0c63..3a45aae3ed 100644 --- a/macros/latex/contrib/censor/censor.sty +++ b/macros/latex/contrib/censor/censor.sty @@ -1,6 +1,6 @@ % censor.sty -\def\censorversionnumber{4.2} -\def\censorversiondate{2022/04/21} +\def\censorversionnumber{4.3} +\def\censorversiondate{2023/06/05} \ProvidesPackage{censor} [\censorversiondate\ \censorversionnumber\ Provides capability for redaction of sensitive information] @@ -21,10 +21,12 @@ \newlength\censorruledepth \newlength\censorruleheight +\newif\ifcensor \censorruledepth=-0.3ex% -0.3ex DEFAULT \censorruleheight=2.1ex% 2.1ex DEFAULT \def\censordot{\censor{.}}% versus \def\censordot{.}% +\censortrue% DEFAULT \newcommand\censorrule[1]{\protect\rule[\censorruledepth]{#1}{\censorruleheight}} @@ -37,11 +39,13 @@ \newcommand\un@cenword[1]{#1} \newcommand\StopCensoring{% + \censorfalse% \let\censor\un@censor% \let\censorbox\un@censorbox% \renewcommand\censpace{ }% } \newcommand\RestartCensoring{% + \censortrue% \renewcommand\censor{\@ifstar{\@cenlen}{\@cenword}}% \renewcommand\censorbox{\@ifstar{\censor@dim}{\censor@box}}% \let\censpace\sv@censpace% @@ -257,4 +261,7 @@ VERSION: - Made \censor and \censorbox robust, which will allow censoring to occur across, for example, section headers, tocs, etc. - Revisited the documentation, bringing it up to date. +4.3 - Introduced \ifcensor condition, default true, set false via + \StopCensoring and set true via \RestartCensoring. Thus, the current + state of censoring can be determined by the user. diff --git a/macros/latex/contrib/counterz/README.txt b/macros/latex/contrib/counterz/README.txt index 00daf51728..15934f7732 100644 --- a/macros/latex/contrib/counterz/README.txt +++ b/macros/latex/contrib/counterz/README.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- -`counterz' --- 2023/05/30 Version 1.1.0 +`counterz' --- 2023/06/05 Version 1.1.1 Copyright (C) 2023 by Christopher McClain E-mail: christopher.mcclain@mail.wvu.edu diff --git a/macros/latex/contrib/counterz/counterz.dtx b/macros/latex/contrib/counterz/counterz.dtx index 2efbfa056d..20cf2cf08d 100644 --- a/macros/latex/contrib/counterz/counterz.dtx +++ b/macros/latex/contrib/counterz/counterz.dtx @@ -7,7 +7,7 @@ %<*readme> ---------------------------------------------------------------------- -`counterz' --- 2023/05/30 Version 1.1.0 +`counterz' --- 2023/06/05 Version 1.1.1 Copyright (C) 2023 by Christopher McClain E-mail: christopher.mcclain@mail.wvu.edu @@ -38,7 +38,7 @@ random counters and save such counter values for future typesetting. \preamble ---------------------------------------------------------------------- -`counterz' --- 2023/05/30 Version 1.1.0 Additional tools for counters +`counterz' --- 2023/06/05 Version 1.1.1 Additional tools for counters E-mail: christopher.mcclain@mail.wvu.edu Released under the LaTeX Project Public License v1.3c or later See https://www.latex-project.org/lppl.txt @@ -138,6 +138,7 @@ and the derived files counterz.ins, % %\changes{v1.0.0}{2023/05/19}{First public release} %\changes{v1.1.0}{2023/05/30}{New and revised commands and error reports} +%\changes{v1.1.1}{2023/06/05}{Bug fixes} % % %\begin{abstract} @@ -148,9 +149,7 @@ and the derived files counterz.ins, % random counters and save such counter values for future typesetting. %\end{abstract} % -%\begin{multicols}{2} -% \tableofcontents -%\end{multicols} +%\tableofcontents % %\section{Introduction} % @@ -687,7 +686,18 @@ and the derived files counterz.ins, % %\subsection{Random Counters} % -% We first define random versions of \cs{setcounter} and \cs{addtocounter}. +% In order to effectively manage the options of randomizing counter values or +%\DescribeMacro{\randomizectr} +% reusing counter values, the commands \cs{randomizectr} and \cs{norandomizectr} +% are used to toggle an internal boolean variable. The internal boolean +%\DescribeMacro{\norandomizectr} +% is initialized as TRUE when the \textsf{counterz} package is loaded. A +% conditional command \cs{ifrandomizectr}\marg{foo}\marg{bar} executes +%\DescribeMacro{\ifrandomizectr} +% \meta{foo} when the boolean is TRUE and otherwise executes \meta{bar}. +% +% We next define random versions of \cs{setcounter} and \cs{addtocounter}. +% These commands will only execute when the document is set to randomize. % The command \cs{randsetcounter}\marg{counter}\marg{min}\marg{max} assigns %\DescribeMacro{\randsetcounter} % to \meta{counter} a random integer value between \meta{min} and \meta{max}. @@ -699,10 +709,11 @@ and the derived files counterz.ins, % \meta{counter} a random integer value between \meta{min} and \meta{max}. %\DescribeMacro{\xrandaddtocounter} % \cs{xrandaddtocounter} is a prefix version of \cs{randaddtocounter}. -% The following code may be used to produce an expression in the form -% $ax+b$, where $a$ and $b$ are random integers between $-10$ and $10$: +% The following code produces an expression in the form $ax+b$, where $a$ +% and $b$ are random integers between $-10$ and $10$: % %\begin{verbatim} +%\randomizectr %\xprovidecounter{a} %\xprovidecounter{b} %\xrandsetcounter{a}{-10}{10} @@ -711,17 +722,14 @@ and the derived files counterz.ins, %\end{verbatim} % % \noindent -% Organized in the following table are sixty instances of output that are +% Organized in the following table are fifty instances of output that are % randomly generated by the typesetting of this document: % % \bigskip %\noindent %\xprovidecounter{a} %\xprovidecounter{b} -%\begin{tabular}{rrrrrr} -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & +%\begin{tabular}{rrrrr} %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & @@ -751,9 +759,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -769,9 +774,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -787,9 +789,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -805,9 +804,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -823,9 +819,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -841,9 +834,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -859,9 +849,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -877,9 +864,6 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} @@ -895,23 +879,10 @@ and the derived files counterz.ins, %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & %\xrandsetcounter{a}{-10}{10} %\xrandsetcounter{b}{-10}{10} -%$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ & -%\xrandsetcounter{a}{-10}{10} -%\xrandsetcounter{b}{-10}{10} %$\xcoef{a}\ifctrzero{a}{\xarabic{b}}{x \xsignednz{b}}$ \\ %\end{tabular} % % \bigskip -% In order to effectively manage the options of randomizing counter values or -%\DescribeMacro{\randomizectr} -% reusing counter values, the commands \cs{randomizectr} and \cs{norandomizectr} -% are used to toggle an internal boolean variable. The internal boolean -%\DescribeMacro{\norandomizectr} -% is initialized as TRUE when the \textsf{counterz} package is loaded. A -% conditional command \cs{ifrandomizectr}\marg{foo}\marg{bar} executes -%\DescribeMacro{\ifrandomizectr} -% \meta{foo} when the boolean is true and otherwise executes \meta{bar}. -% % If our document contains randomly generated counters, but we wish to typeset % the document again without changing those values, then we need a way to save %\DescribeMacro{\opencountersfile} @@ -1067,7 +1038,7 @@ and the derived files counterz.ins, % \begin{macrocode} %<*package> \ProvidesPackage{counterz}[% - 2023/05/30 v1.1.0 Additional tools for counters + 2023/06/05 v1.1.1 Additional tools for counters ]% \RequirePackage{etoolbox,makecmds} % \end{macrocode} @@ -1503,60 +1474,6 @@ and the derived files counterz.ins, % %\subsection{Random Counters} % -% The commands \cs{randsetcounter} and \cs{randaddtocounter} use the pdf\TeX\ -% primitive \cs{pdfuniformdeviate} to provide random versions of -% \cs{setcounter} and \cs{addtocounter}. The commands \cs{xrandsetcounter} and -% \cs{xrandaddtocounter} are prefix versions of \cs{randsetcounter} and -% \cs{randaddtocounter}, respectively. -% -%\begin{macro}{\randsetcounter} -%\changes{v1.1.0}{2023/05/30}{new} -%\begin{macro}{\xrandsetcounter} -%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randsetcounter}} -% -% \cs{randsetcounter}\marg{counter}\marg{min}\marg{max} assigns to -% \meta{counter} a random integer value between \meta{min} and \meta{max}. -% -% \begin{macrocode} -\newcommand{\randsetcounter}[3]{% - \setcounter{#1}{% - \the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax - }% -}% -\newcommand{\xrandsetcounter}[3]{% - \randsetcounter{\@counterz@counterprefix#1}{#2}{#3} -}% -% \end{macrocode} -% -%\end{macro} -%\end{macro} -% -%\begin{macro}{\randaddtocounter} -%\changes{v1.1.0}{2023/05/30}{new} -%\begin{macro}{\xrandaddtocounter} -%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randaddtocounter}} -% -% \cs{randaddtocounter}\marg{counter}\marg{min}\marg{max} adds to \meta{counter} -% a random integer value between \meta{min} and \meta{max}. -% -% \begin{macrocode} -\newcommand{\randaddtocounter}[3]{% - \addtocounter{#1}{% - \the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax - }% -}% -\newcommand{\xrandaddtocounter}[3]{% - \randaddtocounter{\@counterz@counterprefix#1}{#2}{#3} -}% -% \end{macrocode} -% -%\end{macro} -%\end{macro} -% The following commands are designed to provide a means by which authors can -% generate random values for counters but also preserve those values for future -% typesettings. This is accomplished by storing counters and their values in an -% external file and then inputting the file before a subsequent typesetting. -% %\begin{macro}{\randomizectr} %\begin{macro}{\norandomizectr} % @@ -1579,7 +1496,7 @@ and the derived files counterz.ins, %\begin{macro}{\ifrandomizectr} % % \cs{ifrandomizectr}\marg{foo}\marg{bar} executes \meta{foo} if the boolean -% \textit{@counterz@random} is true and otherwise executes \meta{bar}. +% \textit{@counterz@random} is TRUE and otherwise executes \meta{bar}. % % \begin{macrocode} \newcommand{\ifrandomizectr}[2]{% @@ -1611,6 +1528,73 @@ and the derived files counterz.ins, % %\end{macro} % +% The commands \cs{randsetcounter} and \cs{randaddtocounter} use the pdf\TeX\ +% primitive \cs{pdfuniformdeviate} to provide random versions of +% \cs{setcounter} and \cs{addtocounter}. The commands \cs{xrandsetcounter} and +% \cs{xrandaddtocounter} are prefix versions of \cs{randsetcounter} and +% \cs{randaddtocounter}, respectively. Each of these four commands will generate +% random counter values only when the boolean \textit{@counterz@random} is TRUE. +% +%\begin{macro}{\randsetcounter} +%\changes{v1.1.0}{2023/05/30}{new} +%\changes{v1.1.1}{2023/06/05}{bug fix} +%\begin{macro}{\xrandsetcounter} +%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randsetcounter}} +% +% \cs{randsetcounter}\marg{counter}\marg{min}\marg{max} assigns to +% \meta{counter} a random integer value between \meta{min} and \meta{max}, +% if \textit{@counterz@random} is TRUE. +% +% \begin{macrocode} +\newcommand{\randsetcounter}[3]{% + \ifrandomizectr{% + \setcounter{#1}{% + \the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax + }% + }{% + % Do Nothing + }% +}% +\newcommand{\xrandsetcounter}[3]{% + \randsetcounter{\@counterz@counterprefix#1}{#2}{#3} +}% +% \end{macrocode} +% +%\end{macro} +%\end{macro} +% +%\begin{macro}{\randaddtocounter} +%\changes{v1.1.0}{2023/05/30}{new} +%\changes{v1.1.1}{2023/06/05}{bug fix} +%\begin{macro}{\xrandaddtocounter} +%\changes{v1.1.0}{2023/05/30}{now based on a new \cs{randaddtocounter}} +% +% \cs{randaddtocounter}\marg{counter}\marg{min}\marg{max} adds to \meta{counter} +% a random integer value between \meta{min} and \meta{max}, +% if \textit{@counterz@random} is TRUE. +% +% \begin{macrocode} +\newcommand{\randaddtocounter}[3]{% + \ifrandomizectr{% + \addtocounter{#1}{% + \the \numexpr #2+\pdfuniformdeviate \numexpr #3-#2+1 \relax + }% + }{% + % Do Nothing + }% +}% +\newcommand{\xrandaddtocounter}[3]{% + \randaddtocounter{\@counterz@counterprefix#1}{#2}{#3} +}% +% \end{macrocode} +% +%\end{macro} +%\end{macro} +% The following commands are designed to provide a means by which authors can +% generate random values for counters but also preserve those values for future +% typesettings. This is accomplished by storing counters and their values in an +% external file and then inputting the file before a subsequent typesetting. +% %\begin{macro}{\opencountersfile} %\changes{v1.1.0}{2023/05/30}{new error reports} % @@ -1743,7 +1727,7 @@ and the derived files counterz.ins, % % \cs{randprovidecounter}\marg{counter}\marg{min}\marg{max} creates % \meta{counter} if it does not already exist, and if the boolean -% \textit{@counterz@random} is true then \meta{counter} is assigned a +% \textit{@counterz@random} is TRUE then \meta{counter} is assigned a % random integer value between \meta{min} and \meta{max} and then saved. % % \begin{macrocode} @@ -1772,7 +1756,7 @@ and the derived files counterz.ins, % % \cs{xrandprovidecounter}\marg{counter}\marg{min}\marg{max} creates % \meta{counter} if it does not already exist, and if the boolean -% \textit{@counterz@random} is true then \meta{counter} is assigned a +% \textit{@counterz@random} is TRUE then \meta{counter} is assigned a % random integer value between \meta{min} and \meta{max} and then saved. % % \begin{macrocode} diff --git a/macros/latex/contrib/counterz/counterz.ins b/macros/latex/contrib/counterz/counterz.ins index 73c612db3d..48fdb1b2ed 100644 --- a/macros/latex/contrib/counterz/counterz.ins +++ b/macros/latex/contrib/counterz/counterz.ins @@ -6,7 +6,7 @@ %% %% counterz.dtx (with options: `install') %% ---------------------------------------------------------------------- -%% `counterz' --- 2023/05/30 Version 1.1.0 Additional tools for counters +%% `counterz' --- 2023/06/05 Version 1.1.1 Additional tools for counters %% E-mail: christopher.mcclain@mail.wvu.edu %% Released under the LaTeX Project Public License v1.3c or later %% See https://www.latex-project.org/lppl.txt @@ -22,7 +22,7 @@ \preamble ---------------------------------------------------------------------- -`counterz' --- 2023/05/30 Version 1.1.0 Additional tools for counters +`counterz' --- 2023/06/05 Version 1.1.1 Additional tools for counters E-mail: christopher.mcclain@mail.wvu.edu Released under the LaTeX Project Public License v1.3c or later See https://www.latex-project.org/lppl.txt diff --git a/macros/latex/contrib/counterz/counterz.pdf b/macros/latex/contrib/counterz/counterz.pdf index 66820f93e8..09f8e97b1a 100644 Binary files a/macros/latex/contrib/counterz/counterz.pdf and b/macros/latex/contrib/counterz/counterz.pdf differ diff --git a/macros/latex/contrib/texshade/README b/macros/latex/contrib/texshade/README index f6063602bf..a57f0eac62 100644 --- a/macros/latex/contrib/texshade/README +++ b/macros/latex/contrib/texshade/README @@ -1,4 +1,4 @@ - TeXshade v1.26b + TeXshade v1.26c >> >> A LaTeX package for setting nucleotide and peptide alignments. >> diff --git a/macros/latex/contrib/texshade/texshade.dtx b/macros/latex/contrib/texshade/texshade.dtx index 44fad1c38f..da16105ddf 100644 --- a/macros/latex/contrib/texshade/texshade.dtx +++ b/macros/latex/contrib/texshade/texshade.dtx @@ -418,9 +418,9 @@ % structure meme paper was added; % `par' line endings now treated correctly.} % -% \changes{1.26b}{2023-05-28}{% -% Corrections: shading, tinting, emphasizing, lower casing -% of motifs now works with set domains.} +% \changes{1.26b/c}{2023-05-28/2023-06-04}{% +% Corrections: shading, tinting, emphasizing, lower casing, +% and framing of motifs now works with set domains.} % % % @@ -461,7 +461,7 @@ % for further information, updates and on-line documentation % see my homepage at % \texttt{www.pharmazie.uni-kiel.de/chem/Prof\_Beitz/biotex.html} }} -% \date{\small v1.26b; 2023/05/28\\[2pt]} +% \date{\small v1.26c; 2023/06/04\\[2pt]} % \maketitle % \begin{abstract} % Setting alignments of nucleotides and peptides for publication @@ -545,12 +545,12 @@ % % \subsection{Version History} % -% \textbf{v1.26(a, b) 2021/04/01 (2022/08/29, 2023/05/28)} +% \textbf{v1.26(a-c) 2021/04/01 (2022/08/29-2023/06/04)} % \medskip % % \emph{Corrections}: Frames at line ends remain open to indicate % continuity of the marked region, and |\par| line endings are now treated -% correctly; motifs are now properly located in set domains for shading etc. +% correctly. % % \emph{Introductions:} % Chimera command file export option for 'structure memes' @@ -6614,8 +6614,8 @@ % \begin{macrocode} %<*texshade> \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{texshade}[2023/05/28 LaTeX TeXshade (v1.26b)] -\message{Package `texshade', Version 1.26b of 2023/05/28.} +\ProvidesPackage{texshade}[2023/06/04 LaTeX TeXshade (v1.26c)] +\message{Package `texshade', Version 1.26c of 2023/06/04.} \PassOptionsToPackage{dvips}{color} \PassOptionsToPackage{dvips}{graphicx} @@ -10282,6 +10282,7 @@ \def\test@fill#1:#2:#3&{% \xdef\last@{#1[,][,]&}\expandafter\arrow@col@width\last@% + \xdef\second@@{\fourth@ &}\ifx\second@@\ampers@nd\xdef\fourth@{///}\fi% \xdef\second@@{\fourth@}% \xdef\last@{///}% \ifx\fourth@\last@% @@ -12478,7 +12479,7 @@ \xdef\f@@color{\f@color} \def\f@text@{#5} \xdef\f@color{\f@@color} - \xdef\temp@{#4&} + \xdef\temp@{\second@@&} \ifx\temp@\ampers@nd \xdef\list@{#3,&} \xdef\style@{&} @@ -15823,7 +15824,6 @@ \getregion@fromframestack@first \else \ifnum\frame@on=0 - \xdef\frame@on{1} \xdef\frame@{1} \expandafter\xdef\csname fr@style\the\loopcount\endcsname{% \csname framestyle\the\loopcount\endcsname} diff --git a/macros/latex/contrib/texshade/texshade.pdf b/macros/latex/contrib/texshade/texshade.pdf index d2088ac9b2..01730abc59 100644 Binary files a/macros/latex/contrib/texshade/texshade.pdf and b/macros/latex/contrib/texshade/texshade.pdf differ diff --git a/obsolete/graphics/pgf/contrib/penrose/README b/obsolete/graphics/pgf/contrib/penrose/README new file mode 100644 index 0000000000..43c2298f5f --- /dev/null +++ b/obsolete/graphics/pgf/contrib/penrose/README @@ -0,0 +1,8 @@ +---------------------------------------------------------------- +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. diff --git a/obsolete/graphics/pgf/contrib/penrose/penrose.pdf b/obsolete/graphics/pgf/contrib/penrose/penrose.pdf new file mode 100644 index 0000000000..67ea7a9309 Binary files /dev/null and b/obsolete/graphics/pgf/contrib/penrose/penrose.pdf differ diff --git a/obsolete/graphics/pgf/contrib/penrose/penrose.tex b/obsolete/graphics/pgf/contrib/penrose/penrose.tex new file mode 100644 index 0000000000..be44311844 --- /dev/null +++ b/obsolete/graphics/pgf/contrib/penrose/penrose.tex @@ -0,0 +1,794 @@ +%\immediate\write18{tex penrose_code.dtx} +\documentclass{ltxdoc} +\usepackage[T1]{fontenc} +\usepackage{trace} +\usepackage{lmodern} +\usepackage{morefloats} +\usepackage[svgnames]{xcolor} +\usepackage{tikz} +\usetikzlibrary{penrose} +\usepackage[numbered]{hypdoc} +\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9} + +\usepackage{listings} +\lstloadlanguages{[LaTeX]TeX} +\lstset{ + breakatwhitespace=true, + breaklines=true, + language=[LaTeX]TeX, + basicstyle=\small\ttfamily, + keepspaces=true, + columns=fullflexible +} + +\usepackage{fancyvrb} + +\newenvironment{example} + {\VerbatimEnvironment + \begin{VerbatimOut}{example.out}} + {\end{VerbatimOut} + \begin{center} + \setlength{\parindent}{0pt} + \fbox{\begin{minipage}{.9\linewidth} + \lstinputlisting[]{example.out} + \end{minipage}} + + \fbox{\begin{minipage}{.9\linewidth} + \centering + \input{example.out} + \end{minipage}} +\end{center} +} + +\newenvironment{justexample} + {\VerbatimEnvironment + \begin{VerbatimOut}{example.out}} + {\end{VerbatimOut} + \begin{center} + \setlength{\parindent}{0pt} + \fbox{\begin{minipage}{.9\linewidth} + \lstinputlisting[]{example.out} + \end{minipage}} +\end{center} +} + +\colorlet{thinRhombus}{DarkOrchid} +\colorlet{thickRhombus}{DarkSlateGray} +\colorlet{circleArc}{RosyBrown} +\colorlet{longArc}{LawnGreen} + +\colorlet{kite}{HotPink} +\colorlet{dart}{Fuchsia} + +\colorlet{goldenTriangle}{Gold} +\colorlet{reverseGoldenTriangle}{Magenta} +\colorlet{goldenGnomon}{Cyan} +\colorlet{reverseGoldenGnomon}{LimeGreen} + +\makeatletter +\tikzset{ + tint fill colour/.code={% + \edef\@temp{% + \def\noexpand\tikz@fillcolor{\tikz@fillcolor!#1}% + \noexpand\tikz@addoption{\noexpand\pgfsetfillcolor{\tikz@fillcolor!#1}}% + }% + \@temp + } +} +\makeatother + +\providecommand*{\url}{\texttt} +\GetFileInfo{tikzlibrarypenrose.code.tex} + +\title{The \textsf{Penrose} Package: Documentation} +\author{Andrew Stacey\texorpdfstring{\\ \url{loopspace@mathforge.org}}{}} + \date{\fileversion~from \filedate} + +\begin{document} +\maketitle + +\tableofcontents + +\section{Introduction} + +The \textsf{Penrose} package is a TikZ library for drawing Penrose tiles. +It currently supports natively the kite/dart, rhombus, and pentagon tile sets, but has provision for defining new tiles. +There are two main methods for their placement: one that automatically generates a tiling, and one that allows for ``by hand'' placement. +Furthermore, the tiles themselves can be deformed and will still (hopefully!) fit together in the correct fashion. + +\section{Initialisation} + +To use this package, load the \Verb+tikz+ package and load \Verb+penrose+ as a TikZ library. +Specifically, your preamble should contain: + +\begin{verbatim} +\usepackage{tikz} +\usetikzlibrary{penrose} +\end{verbatim} + +\section{Usage} + +Using this package splits into several components. +There are the two main ways of getting tiles on to the page, and then there are the ways of deforming or styling the tiles once they are there. + +\subsection{Placing Tiles ``By Hand''} + +It is possible to use the tiles as \Verb+pic+s. +These are mini-drawings introduced in TikZ3.0 that are node-like in style, but a little more geared towards repeatable \emph{drawings} than boxes containing text. +This package defines several \Verb+pic+ types: + +\tikzset{ + every Penrose pic/.style={draw,ultra thick}, + every circle arc/.style={draw,thin}, + every long arc/.style={draw,thin}, +} + +\begin{itemize} +\item Kite \tikz[baseline=-.5ex] \pic[draw,kite]; +\item Dart \tikz[baseline=-.5ex] \pic[draw,dart]; +\item Thin Rhombus \tikz[baseline=-.5ex] \pic[draw,thin rhombus]; +\item Thick Rhombus \tikz[baseline=-.5ex] \pic[draw,thick rhombus]; +\item Pentagon \tikz[baseline=-.5ex] \pic[draw, pentagon 5]; +(Actually, there are three pentagons: \Verb+pentagon 5+, \Verb+pentagon 3+, and \Verb+pentagon 2+. +The number signifies how many pentagons it goes next to.) +\item Pentagram \tikz[baseline=-.5ex] \pic[draw, pentagram]; +\item Boat \tikz[baseline=-.5ex] \pic[draw, boat]; +\item Diamond \tikz[baseline=-.5ex] \pic[draw, diamond]; +\item Golden Triangle \tikz[baseline=-.5ex] \pic[draw,golden triangle]; +\item Reverse Golden Triangle \tikz[baseline=-.5ex] \pic[draw,reverse golden triangle]; +\item Golden Gnomon \tikz[baseline=-.5ex] \pic[draw,golden gnomon]; +\item Reverse Golden Gnomon \tikz[baseline=-.5ex] \pic[draw,reverse golden gnomon]; +\end{itemize} + +The main tiles can have arcs drawn on them to illustrate the matching rules. +The triangles and gnomon are not true Penrose tiles but rather can be used to build tilings so they do not have the arcs. +The two types of each triangle and gnomon are actually different in that they have different matching rules. +This is best illustrated by deforming the paths (see Section~\ref{sec:pathdeform}). + +There are two ways in TikZ to specify the \Verb+pic+ type: either as the ``contents'' of the pic or as the argument to the \Verb+pic type+ key. +Each of the tiles comes with a shorthand key which specifies the \Verb+pic type+ and also invokes the key \Verb+every Penrose tile+. +That is, the key \Verb+dart+ calls the \Verb+every Penrose tile+ key and specifies the \Verb+pic type+ as \Verb+dart+. + +The tiles can be placed using standard TikZ methods. +One important thing to note is that by default, \Verb+pic+s are like \Verb+nodes+ in that they only respond to ambient translations, and not to rotations and scaling. +To make them notice this, use the key \Verb+transform shape+ or specify the transformation to the \Verb+pic+ directly. +If the shortcut keys are used to specify the tiles, this can be put in the \Verb+every Penrose pic+ style. + +TikZ \Verb+pic+s can be named, using the \Verb+name=+ key. +When a Penrose tile has been named then it can be used for positioning other tiles. +Each edge is assigned a label from \Verb+a b c d e A B C D E+ and a new tile can be aligned with an old one along a matching edge (\Verb+a+ matches with \Verb+A+ and so on). + +The edge labels are as follows. +For the \Verb+pentagon 5+, for example, the edges are all the same and the numbers are used to distinguish between them. + +\foreach \tile/\edges in { + kite/{a,A,c,C}, + dart/{a,A,c,C}, + thin rhombus/{a,A,b,B}, + thick rhombus/{a,A,b,B}, + pentagon 5/{a1,a2,a3,a4,a5}, + pentagon 3/{A,b1,a1,a2,b2}, + pentagon 2/{d,A1,c1,c2,A2}, + pentagram/{C1,C2,C3,C4,C5,C6,C7,C8,C9,C10}, + boat/{C1,C2,C3,C4,B1,D,B2}, + diamond/{D1,B1,B2,D2}, + golden triangle/{a,b,c}, + reverse golden triangle/{A,B,C}, + golden gnomon/{A,b,C}, + reverse golden gnomon/{a,B,c}} { + +\begin{tikzpicture} +\pic[draw,\tile,name=tile]; +\foreach \e in \edges { + \path (tile-edge \e\space start) -- node {\e} (tile-edge \e\space end); +} +\end{tikzpicture} + +} + +To align a tile with an existing one, use the following key: +% +\begin{verbatim} +align with= along +\end{verbatim} +% +where \Verb++ is the name given to an existing tile, and \Verb++ is the label on the existing tile. +If the tile being placed has edges that are identical (for example, \Verb+pentagon 5+), this syntax extends to +% +\begin{verbatim} +align with= along using +\end{verbatim} +% +to specify which of the edges on the new tile to use. + +\begin{example} +\begin{tikzpicture} +\pic[kite,name=tile]; +\pic[dart,align with=tile along c]; +\pic[pentagon 5,name=ptile,at={(3,0)}]; +\pic[pentagon 3,align with=ptile along a1 using 2]; +\end{tikzpicture} +\end{example} + +With judicious use of loops, quite complicated pictures can be rendered using simple code. +(Note that the \Verb+transform shape+ is \emph{not} needed to apply the transformations needed to place a tile using this syntax.) + +\begin{example} +\begin{tikzpicture}[ + every rhombus/.style={ + draw=black, + ultra thick, + }, + every thin rhombus/.style={ + every rhombus/.try, + fill=thinRhombus, + }, + every thick rhombus/.style={ + every rhombus/.try, + fill=thickRhombus, + }, + every circle arc/.style={ + draw=circleArc + }, + every long arc/.style={ + draw=longArc + } +] +\pic[rotate=18,thick rhombus,name=a0]; +\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} +{ + \pic[thick rhombus,name=a\k,align with={a\kmo} along A]; +} +\foreach \k in {0,...,4} +{ + \pic[thin rhombus,name=b\k,align with={a\k} along B]; + \pic[thick rhombus,name=c\k,align with={b\k} along A]; + \pic[thick rhombus,name=d\k,align with={b\k} along a]; + \pic[thick rhombus,name=e\k,align with={c\k} along A]; + \foreach \l/\a in {{0/b},{1/B}} + \pic[thin rhombus,name=f\k\l,align with={e\k} along \a]; +} +\pic[thin rhombus,name=g0,align with={f10} along a]; +\pic[thin rhombus,name=g1,align with={f21} along A]; +\foreach \l/\a in {{0/a},{1/A}} + \pic[thick rhombus,name=h\l,align with={g\l} along \a]; +\pic[thick rhombus,name=i,align with=g0 along B]; +\foreach \l/\a in {{0/a},{1/A}} + \pic[thick rhombus,name=j\l,align with=i along \a]; +\end{tikzpicture} +\end{example} + +The tiles can be styled, either directly or using various keys. +Each tile has the following styles applied (in this order): +% +\begin{enumerate} +\item \Verb+every Penrose Tile+ +\item \Verb+every + +\item \Verb+pic actions+ +\end{enumerate} +% +The \Verb+pic actions+ are any actions given directly to the tile, as in \Verb+\pic[draw,thin rhombus];+. +The kite, dart, and rhombus tiles also have arcs drawn on them and these are styled as \Verb+every circle arc+ and \Verb+every long arc+. +The names come from the way the arcs look on the rhombus shapes. + +One other point is important to note about the tiles. +They are actually clipped against themselves. +This ensures that the tiles do not overstep their bounds and so when placed alongside each other then they do not go over each other. +In practical terms, this means that if drawn then the line width is half that which might be expected (but when placed next to another tile, the two halves combine to the expected width). + +\subsection{Placing Tiles Automatically} + +There is a way to specify a Penrose tiling using \emph{Lindenmayer systems}. +In brief, this takes a golden triangle or gnomon (or one of the reverse ones) and repeatedly decomposes it into smaller triangles and gnomon. +Once a desired level has been reached, the resulting triangles and gnomon are glued together in pairs to create either darts and kites or rhombuses (of both types). +This library contains an implementation of this for each of the tilings. + +The user command is: +% +\begin{verbatim} +\PenroseDecomposition{}{}{} +\end{verbatim} +% +where \Verb++ is one of: +% +\begin{itemize} +\item \Verb+kite+ for the kite and dart tiling, +\item \Verb+rhombus+ for the rhombus tiling, +\item \Verb+pentagon+ for the pentagon tiling. +\item \Verb+ktriangle+ for the triangular decomposition used to form the kite and dart tiling but with the individual triangles +\item \Verb+rtriangle+ for the triangular decomposition used to form the rhombus tiling but with the individual triangles. +\end{itemize} + +The \Verb++ is a ``word'' that will be used to initiate the Lindenmayer system. +The key letters in the alphabet for the kite/darts and rhombuses are \Verb+T+, \Verb+t+, \Verb+G+, and \Verb+g+. +These actually correspond to the two triangles and two gnomons. +For the pentagons, the key letters are \Verb+P+, \Verb+Q+, \Verb+R+, \Verb+G+, \Verb+B+, \Verb+D+. +These correspond to the three pentagons, the pentagram, the boat, and the diamond. +Other permitted letters are \Verb+[+, \Verb+]+, \Verb+s+, \Verb+f+, \Verb!+!, \Verb+*+, \Verb+-+, \Verb+_+, \Verb+>+. +These refer to various transformations (for details, see the implementation). + +The \Verb++ controls how far to take the iteration. +The code is not particularly optimised for speed, and once \Verb++ gets to about \(5\) or \(6\) then we are at the ``make a cup of tea while compiling'' stage, depending on the processor. + +\begin{example} +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + Penrose step=2cm, +] +\PenroseDecomposition{kite}{0}{T} +\end{tikzpicture} +\end{example} + +The same styling keys as for the \Verb+pic+ tiles apply, together with some additional ones. +These allow styling the tiles by their number: a count is kept of the number of tiles and each tile knows its own number. +Specifically, two keys are tried: +% +\begin{enumerate} +\item \Verb+Penrose tile +, and +\item \Verb+Penrose tile={}{}+ +\end{enumerate} +% +A word of warning is in order on the second of these. +The \Verb++ is not guaranteed to be correct. +It is done by a quick count at the start of the process and counts those letters which \emph{might} result in a rendered tile. +Not every letter in the resulting word actually does. +Nevertheless, this can be used to style a tile based on what proportion of tiles have been rendered. + +Lastly, \Verb+Penrose step+ is used to control the size of the resulting picture. + +\begin{example} +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + Penrose step=4cm, + Penrose tile/.code 2 args={ + \pgfmathsetmacro\tint{100*#1/#2} + \pgfkeysalso{fill=black!\tint} + } +] +\PenroseDecomposition{rhombus}{3}{T} +\end{tikzpicture} +\end{example} + +\section{Deforming Paths} +\label{sec:pathdeform} + +This package provides the ability to deform the various tiles. +The various tiles can be built from four paths (labelled \Verb+a+, \Verb+b+, \Verb+c+, and \Verb+d+) together with their reverses. +By changing these paths, one can get a wide variety of different tiles with the same fundamental matching rules. +Indeed, by using asymmetric paths, the matching rules can be enforced without the need for additional decoration. + +Internally, the \Verb+penrose+ library uses the \Verb+spath3+ package for storing and manipulating the paths. + +To create a new edge path, use the key \Verb+save Penrose path=+ where \Verb++ is a symbol used in the edge description of a tile. +There are no constraints on the size of the path as all paths are scaled and transformed to fit the tiles. +Once the edge paths have been specified, they are welded together into the tiles using the following command: +% +\begin{verbatim} +\BakePenroseTile{} +\end{verbatim} +% +Here, \Verb++ is one of the names of the tiles. +This has global effect, as does the definition of the edge paths. +Paths, both sides and tiles, can be cloned via: +% +\begin{verbatim} +\tikzset{clone Penrose side path={target}{source} +\tikzset{clone Penrose tile path={target}{source} +\end{verbatim} +% +and restored with the same command (but names switched). + +The initial version of this package used \Verb!\MakePenroseTile! for this command. +That command is still available for backwards compatibility. + +\begin{example} +\begin{tikzpicture} +\pic[draw,dart,name=dart]; +\pic[draw,kite,align with=dart along c]; +\pic[draw,kite,align with=dart along C]; +\tikzset{clone Penrose tile path={original kite}{kite}} +\tikzset{clone Penrose tile path={original dart}{dart}} +\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); +\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); +\BakePenroseTile{kite} +\BakePenroseTile{dart} +\pic[xshift=2cm,draw,dart,name=dart]; +\pic[draw,kite,align with=dart along c]; +\pic[draw,kite,align with=dart along C]; +\tikzset{clone Penrose tile path={kite}{original kite}} +\tikzset{clone Penrose tile path={dart}{original dart}} +\pic[xshift=4cm,draw,dart,name=dart]; +\pic[draw,kite,align with=dart along c]; +\pic[draw,kite,align with=dart along C]; +\end{tikzpicture} +\end{example} + +With deformed tiles, there is no guarantee that the inner arcs will match up perfectly. + +\section{Defining New Tiles} + +This package includes the capability to define new tiles. +The command to do this is: +% +\begin{verbatim} +\DefineTile{}{}{} +\end{verbatim} +% +For example, +% +\begin{verbatim} +\DefineTile {square}{a A a A} +{ + {0,0} + {1,0} + {1,1} + {0,1} +} +\end{verbatim} +% +The \Verb!! is a list of sides for matching rules. +Each letter used matches against its opposite case (so it is possible to create a side that matches against itself by using a symbol that \TeX\ regards as having the same upper as lower case; not all symbols work, I've used \Verb+!+ successfully). +These are also used in path replacing, both a letter and its opposite case are replaced by the corresponding path (but in opposite directions) when the tile is ``baked''. +The coordinates are passed to the \Verb!fp! module of \LaTeX3 so can involve complicated expressions. +Note that the trigonometric functions for angles in degrees are \Verb!cosd!, \Verb!sind!, and \Verb!tand!. + +Note that the tile must be baked via the command \Verb!\BakePenroseTile! before it can be used. + +The new tile can be used with all the same features as the pre-defined Penrose tiles, except for the Lindenmayer systems. + +\begin{example} +\DefineTile {square}{a A a A} +{ + {0,0} + {1,0} + {1,1} + {0,1} +} + +\begin{tikzpicture} +\path[save Penrose path=a] (0,0) to[out=45,in=135] (1,0); +\BakePenroseTile{square} +\pic[square,name=A,fill=green]; +\pic[square,align with=A along a1 using 2,name=B,fill=red]; +\pic[square,align with=A along A1 using 2,fill=red]; +\pic[square,align with=A along A2 using 1,fill=red]; +\pic[square,align with=B along a1 using 2,fill=green]; +\pic[square,align with=B along a2 using 1,fill=green]; +\end{tikzpicture} +\end{example} + +\section{More Examples} + +Let's set some aesthetically pleasing shapes. + +\begin{justexample} +\begin{tikzpicture} +\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); +\path[save Penrose path=b] (0,0) to[out=0,in=140] (1,0); +\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); +\BakePenroseTile{thin rhombus} +\BakePenroseTile{thick rhombus} +\BakePenroseTile{golden triangle} +\BakePenroseTile{reverse golden triangle} +\BakePenroseTile{golden gnomon} +\BakePenroseTile{reverse golden gnomon} +\BakePenroseTile{kite} +\BakePenroseTile{dart} +\end{tikzpicture} +\end{justexample} + +\begin{tikzpicture} +\path[save Penrose path=a] (0,0) to[out=-30,in=100] (1,0); +\path[save Penrose path=b] (0,0) to[out=0,in=140] (1,0); +\path[save Penrose path=c] (0,0) to[out=-40,in=140] (1,0); +\BakePenroseTile{thin rhombus} +\BakePenroseTile{thick rhombus} +\BakePenroseTile{golden triangle} +\BakePenroseTile{reverse golden triangle} +\BakePenroseTile{golden gnomon} +\BakePenroseTile{reverse golden gnomon} +\BakePenroseTile{kite} +\BakePenroseTile{dart} +\end{tikzpicture} + + +Styling the first tile. +Note that as the pattern is formed by repeating two different initial seeds \(5\) times, there are \(10\) ``first tiles'' in each overall pattern. + +\begin{example} +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + Penrose tile 1/.style={fill=yellow}, +] +\foreach \tp/\pos in {rhombus/0cm,rtriangle/2.5cm,kite/5cm,ktriangle/7.5cm} +{ +\begin{scope}[xshift=\pos] +\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { + \begin{scope}[rotate=\mk*36] + \PenroseDecomposition{\tp}{1}{\ax} + \end{scope} +} +\end{scope} +} +\end{tikzpicture} +\end{example} + +A more detailed decomposition, with more and more tinting applied to teach tile. +Roughly half of the counted tiles are rendered, and the ordering in which they are rendered is not at first an obvious one (though it is in general from ``outside in''). + +Note that the key \Verb+tint fill colour+ is not a TikZ native. +It is defined as: + +\begin{verbatim} +\makeatletter +\tikzset{ + tint fill colour/.code={% + \edef\@temp{% + \def\noexpand\tikz@fillcolor{\tikz@fillcolor!#1}% + \noexpand\tikz@addoption{% + \noexpand\pgfsetfillcolor{\tikz@fillcolor!#1}% + }% + }% + \@temp + } +} +\makeatother +\end{verbatim} + +\begin{example} +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + every kite/.style={fill=reverseGoldenTriangle}, + every dart/.style={fill=goldenTriangle}, + Penrose tile/.code 2 args={ + \pgfmathsetmacro\tint{100*(1 - 1.5*#1/#2))} + \pgfkeysalso{tint fill colour=\tint} + } +] +\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { + \begin{scope}[rotate=\mk*36] + \PenroseDecomposition[Penrose step=5cm]{kite}{4}{\ax} + \end{scope} +} +\end{tikzpicture} +\end{example} + +An example with ``manual placement''. + +\begin{example} +\begin{tikzpicture}[ + every Penrose pic/.style={ + draw=black, + ultra thick, + }, + every kite/.style={ + fill=kite, + }, + every dart/.style={ + fill=dart, + }, + every circle arc/.style={ + draw=circleArc + }, + every long arc/.style={ + draw=longArc + } +] +\pic[dart,name=a0]; +\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} { + \pic[dart,name=a\k,align with={a\kmo} along a]; +} +\foreach \k in {0,...,4} { + \foreach \l/\e/\ee in {0/c/a,1/C/A} { + \pic[kite,name=b\l\k,align with={a\k} along \e]; + \pic[dart,name=c\l\k,align with={b\l\k} along \ee]; + \pic[kite,name=d\l\k,align with={c\l\k} along \e]; + } + \pic[kite,name=e\k,align with={c0\k} along C]; + \pic[dart,name=f\k,align with={c0\k} along a]; + \foreach \e in {c,C} { + \pic[kite,name=g\k,align with={f\k} along \e]; + } +} +\end{tikzpicture} +\end{example} + + +The decomposition rules for the Lindenmayer system can be illustrated by drawing each tile together with the result of one decomposition superimposed on top. + +\begin{example} +\foreach \ax in {T,t,G,g} { + +\begin{tikzpicture} +\foreach \tp/\pos in {rhombus/0cm,rtriangle/2cm,kite/4cm,ktriangle/6cm} +{ +\begin{scope}[xshift=\pos] + \PenroseDecomposition[every path/.style={draw=red,ultra thick}]{\tp}{0}{\ax} + \PenroseDecomposition[every path/.style={fill=gray!50,fill opacity=.5,draw=black}]{\tp}{1}{\ax} +\end{scope} +} +\end{tikzpicture} + +} +\end{example} + +The tiles can make interesting forms by themselves. + +\begin{example} +\begin{tikzpicture}[ + scale=2, + every Penrose pic/.style={ + transform shape, + }, + every golden triangle/.style={ + draw=black, + ultra thick, + fill=goldenTriangle, + }, + every reverse golden triangle/.style={ + draw=black, + ultra thick, + fill=reverseGoldenTriangle, + }, + every golden gnomon/.style={ + draw=black, + ultra thick, + fill=goldenGnomon, + }, + every reverse golden gnomon/.style={ + draw=black, + ultra thick, + fill=reverseGoldenGnomon, + }, +] +\pic[golden triangle,name=a]; +\pic[reverse golden triangle,align with=a along a]; +\pic[reverse golden triangle,align with=a along b]; +\pic[reverse golden triangle,align with=a along c]; +\begin{scope}[xshift=2cm] +\pic[reverse golden triangle,name=a]; +\pic[golden triangle,align with=a along A]; +\pic[golden triangle,align with=a along B]; +\pic[golden triangle,align with=a along C]; +\end{scope} +\begin{scope}[yshift=-3cm] +\pic[golden gnomon,name=a]; +\pic[reverse golden gnomon,align with=a along C]; +\pic[reverse golden gnomon,align with=a along b]; +\pic[reverse golden gnomon,align with=a along A]; +\begin{scope}[xshift=2cm] +\pic[reverse golden gnomon,name=a]; +\pic[golden gnomon,align with=a along c]; +\pic[golden gnomon,align with=a along B]; +\pic[golden gnomon,align with=a along a]; +\end{scope} +\end{scope} +\end{tikzpicture} +\end{example} + +\begin{example} +\begin{tikzpicture}[ + every rhombus/.style={ + draw=black, + ultra thick, + }, + every thin rhombus/.style={ + every rhombus/.try, + fill=thinRhombus, + }, + every thick rhombus/.style={ + every rhombus/.try, + fill=thickRhombus, + }, + every circle arc/.style={ + draw=circleArc + }, + every long arc/.style={ + draw=longArc + } +] +\pic[rotate=18,thick rhombus,name=a0]; +\foreach[evaluate=\k as \kmo using int(\k-1)] \k in {1,...,4} +{ + \pic[thick rhombus,name=a\k,align with={a\kmo} along A]; +} +\foreach \k in {0,...,4} +{ + \pic[thin rhombus,name=b\k,align with={a\k} along B]; + \pic[thick rhombus,name=c\k,align with={b\k} along A]; + \pic[thick rhombus,name=d\k,align with={b\k} along a]; + \pic[thick rhombus,name=e\k,align with={c\k} along A]; + \foreach \l/\a in {{0/b},{1/B}} + \pic[thin rhombus,name=f\k\l,align with={e\k} along \a]; +} +\pic[thin rhombus,name=g0,align with={f10} along a]; +\pic[thin rhombus,name=g1,align with={f21} along A]; +\foreach \l/\a in {{0/a},{1/A}} + \pic[thick rhombus,name=h\l,align with={g\l} along \a]; +\pic[thick rhombus,name=i,align with=g0 along B]; +\foreach \l/\a in {{0/a},{1/A}} + \pic[thick rhombus,name=j\l,align with=i along \a]; +\end{tikzpicture} +\end{example} + +Lastly, here's an example that generates full page patterns. + +\begin{justexample} +\foreach \tp/\lvl in {rhombus/5,rhombus/6,kite/5,kite/6} +{ +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + remember picture, + overlay, + scale=20 +] +\coordinate (a) at (current page.center); +\begin{scope}[shift={(a)}] +\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { + \begin{scope}[rotate=\mk*36] + \PenroseDecomposition{\tp}{\lvl}{\ax} + \end{scope} +} +\end{scope} +\end{tikzpicture} +\newpage +} +\end{justexample} + +\begin{tikzpicture} +\path[save Penrose path=a] (0,0) -- (1,0); +\path[save Penrose path=b] (0,0) -- (1,0); +\path[save Penrose path=c] (0,0) -- (1,0); +\BakePenroseTile{thin rhombus} +\BakePenroseTile{thick rhombus} +\BakePenroseTile{golden triangle} +\BakePenroseTile{reverse golden triangle} +\BakePenroseTile{golden gnomon} +\BakePenroseTile{reverse golden gnomon} +\BakePenroseTile{kite} +\BakePenroseTile{dart} +\end{tikzpicture} + +\newpage + +\foreach \tp/\lvl in {rhombus/5,rhombus/6,kite/5,kite/6} +{ +\begin{tikzpicture}[ + every Penrose tile/.style={draw}, + remember picture, + overlay, + scale=20 +] +\coordinate (a) at (current page.center); +\begin{scope}[shift={(a)}] +\foreach[evaluate=\k as \mk using {\k+Mod(\k,2)},evaluate=\k as \ax using {Mod(\k,2) == 0 ? "T" : "t"}] \k in {0,...,9} { + \begin{scope}[rotate=\mk*36] + \PenroseDecomposition{\tp}{\lvl}{\ax} + \end{scope} +} +\end{scope} +\end{tikzpicture} +\newpage +} + + +%% \foreach \lvl in {5,6} +%% { +%% \begin{tikzpicture}[ +%% every Penrose tile/.style={draw}, +%% remember picture, +%% overlay, +%% scale=180 +%% ] +%% \coordinate (a) at (current page.center); +%% \PenroseDecomposition{pentagon}{\lvl}{D} +%% \end{tikzpicture} +%% \newpage +%% } + + +\end{document} + +% Local Variables: +% tex-output-type: "pdf18" +% End: diff --git a/obsolete/graphics/pgf/contrib/penrose/penrose_code.dtx b/obsolete/graphics/pgf/contrib/penrose/penrose_code.dtx new file mode 100644 index 0000000000..cdc6356965 --- /dev/null +++ b/obsolete/graphics/pgf/contrib/penrose/penrose_code.dtx @@ -0,0 +1,3126 @@ +% \iffalse meta-comment +%<*internal> +\iffalse +% +%<*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. +% +%<*internal> +\fi +\def\nameofplainTeX{plain} +\ifx\fmtname\nameofplainTeX\else + \expandafter\begingroup +\fi +% +%<*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 + +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}} +} +% +%\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 +% +%<*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} +% +% \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= along + 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= along using +. +% \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} +% +% \end{macrocode} +% +% \end{implementation} +% +%\Finale +\endinput diff --git a/obsolete/graphics/pgf/contrib/penrose/penrose_code.pdf b/obsolete/graphics/pgf/contrib/penrose/penrose_code.pdf new file mode 100644 index 0000000000..59579b2524 Binary files /dev/null and b/obsolete/graphics/pgf/contrib/penrose/penrose_code.pdf differ diff --git a/support/latexindent/LatexIndent/TrailingComments.pm b/support/latexindent/LatexIndent/TrailingComments.pm index bbae745d94..748d005f98 100644 --- a/support/latexindent/LatexIndent/TrailingComments.pm +++ b/support/latexindent/LatexIndent/TrailingComments.pm @@ -67,16 +67,16 @@ sub remove_trailing_comments { $logger->trace("*Storing trailing comments") if $is_t_switch_active; my $notPreceededBy = qr/${${$mainSettings{fineTuning}}{trailingComments}}{notPreceededBy}/; + my $afterComment = qr/${${$mainSettings{fineTuning}}{trailingComments}}{afterComment}/; # perform the substitution ${$self}{body} =~ s/ - $notPreceededBy # not preceded by a \ - % # % + $notPreceededBy # not preceded by a \ + % # % ( - \h*? # followed by possible horizontal space - .*? # and anything else + $afterComment # anything else ) - $ # up to the end of a line + $ # up to the end of a line / # increment comment counter and store comment $commentCounter++; diff --git a/support/latexindent/LatexIndent/Version.pm b/support/latexindent/LatexIndent/Version.pm index 59ed17e3e0..f7ed57cf8d 100644 --- a/support/latexindent/LatexIndent/Version.pm +++ b/support/latexindent/LatexIndent/Version.pm @@ -20,6 +20,6 @@ use warnings; use Exporter qw/import/; our @EXPORT_OK = qw/$versionNumber $versionDate/; -our $versionNumber = '3.21.1'; -our $versionDate = '2023-05-20'; +our $versionNumber = '3.22'; +our $versionDate = '2023-06-01'; 1 diff --git a/support/latexindent/README b/support/latexindent/README index 88398cdba9..df74dc160c 100644 --- a/support/latexindent/README +++ b/support/latexindent/README @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - latexindent.pl, version 3.21.1, 2023-05-20 + latexindent.pl, version 3.22, 2023-06-01 PERL script to indent code within environments, and align delimited environments in .tex files. diff --git a/support/latexindent/bin/linux/latexindent b/support/latexindent/bin/linux/latexindent index 449615d057..a41e6ae191 100644 Binary files a/support/latexindent/bin/linux/latexindent and b/support/latexindent/bin/linux/latexindent differ diff --git a/support/latexindent/bin/macos/latexindent b/support/latexindent/bin/macos/latexindent index c77592e6f6..acc4fe2571 100644 Binary files a/support/latexindent/bin/macos/latexindent and b/support/latexindent/bin/macos/latexindent differ diff --git a/support/latexindent/defaultSettings.yaml b/support/latexindent/defaultSettings.yaml index a3582b934b..9d16992e36 100644 --- a/support/latexindent/defaultSettings.yaml +++ b/support/latexindent/defaultSettings.yaml @@ -1,5 +1,5 @@ # -# latexindent.pl, version 3.21.1, 2023-05-20 +# latexindent.pl, version 3.22, 2023-06-01 # # defaultSettings.yaml, the default settings for latexindent.pl # @@ -648,6 +648,7 @@ fineTuning: between: _|\^|\* trailingComments: notPreceededBy: (? { 'China' => { 'https://mirror.bjtu.edu.cn/CTAN/' => 1, + 'https://mirrors.aliyun.com/CTAN/' => 1, 'https://mirrors.bfsu.edu.cn/CTAN/' => 1, 'https://mirrors.cloud.tencent.com/CTAN/' => 1, 'https://mirrors.cqu.edu.cn/CTAN/' => 1, 'https://mirrors.hit.edu.cn/CTAN/' => 1, 'https://mirrors.jlu.edu.cn/CTAN/' => 1, 'https://mirrors.nju.edu.cn/CTAN/' => 1, + 'https://mirrors.pku.edu.cn/ctan/' => 1, + 'https://mirrors.sjtug.sjtu.edu.cn/ctan/' => 1, 'https://mirrors.sustech.edu.cn/CTAN/' => 1, 'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1, 'https://mirrors.ustc.edu.cn/CTAN/' => 1, @@ -90,7 +93,6 @@ $mirrors = { }, 'Germany' => { 'ftp://ftp.fu-berlin.de/tex/CTAN/' => 1, - 'http://mirror.funkfreundelandshut.de/latex/' => 1, 'http://sendinnsky.selfhost.co/tex-archive/' => 1, 'http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/' => 1, 'https://ctan.ebinger.cc/tex-archive/' => 1, @@ -134,11 +136,9 @@ $mirrors = { 'Poland' => { 'https://ctan.gust.org.pl/tex-archive/' => 1, 'https://polish-mirror.evolution-host.com/ctan/' => 1, - 'https://repo.skni.umcs.pl/ctan/' => 1, 'https://sunsite.icm.edu.pl/pub/CTAN/' => 1, }, 'Portugal' => { - 'https://ftp.eq.uc.pt/software/TeX/' => 1, 'https://mirrors.up.pt/pub/CTAN/' => 1, }, 'Romania' => { @@ -182,9 +182,6 @@ $mirrors = { 'https://mirror.quantum5.ca/CTAN/' => 1, 'https://muug.ca/mirror/ctan/' => 1, }, - 'Costa Rica' => { - 'https://mirrors.ucr.ac.cr/CTAN/' => 1, - }, 'USA' => { 'http://bay.uchicago.edu/CTAN/' => 1, 'http://mirrors.ibiblio.org/pub/mirrors/CTAN/' => 1, diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb index 4992cf4d66..8a39d121b4 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb @@ -26,11 +26,11 @@ depend container_split_src_files/1 depend frozen/0 depend minrelease/2016 depend release/2023 -depend revision/67288 +depend revision/67297 name 00texlive.image category TLCore -revision 67289 +revision 67297 shortdesc TeX Live files only in the source repository longdesc The files here are not copied by the installer and containers longdesc are not built for them; they exist only in the source @@ -3292,7 +3292,6 @@ runfiles size=13037 tlpkg/tlpsrc/pecha.tlpsrc tlpkg/tlpsrc/pedigree-perl.tlpsrc tlpkg/tlpsrc/penlight.tlpsrc - tlpkg/tlpsrc/penrose.tlpsrc tlpkg/tlpsrc/perception.tlpsrc tlpkg/tlpsrc/perfectcut.tlpsrc tlpkg/tlpsrc/perltex.tlpsrc @@ -4265,6 +4264,7 @@ runfiles size=13037 tlpkg/tlpsrc/tikztosvg.tlpsrc tlpkg/tlpsrc/tikzviolinplots.tlpsrc tlpkg/tlpsrc/tile-graphic.tlpsrc + tlpkg/tlpsrc/tilings.tlpsrc tlpkg/tlpsrc/timbreicmc.tlpsrc tlpkg/tlpsrc/times.tlpsrc tlpkg/tlpsrc/timetable.tlpsrc @@ -4752,7 +4752,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd name 00texlive.installer category TLCore -revision 67283 +revision 67291 shortdesc TeX Live standalone installer package longdesc This package defines the files to go into the installer longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the @@ -52947,7 +52947,7 @@ catalogue-version 1.1 name censor category Package -revision 63126 +revision 67293 shortdesc Tools for producing redacted documents relocated 1 longdesc This package provides simple tools for creating redacted @@ -52956,10 +52956,10 @@ longdesc creating documents in a restricted environment (for redacted longdesc release in an unrestricted environment) as well as in an longdesc unrestricted environment (for eventual transfer and completion longdesc in the restricted environment). -containersize 3004 -containerchecksum d4f70727850c311cff4f7bbfd2962bb9510590791cb3e00a247f6c708477f9b0b7bd35f771e3145ad760f18284b7e8779bf302b55fbba3f25f11ed57ee896306 -doccontainersize 234832 -doccontainerchecksum 3d1d7f5828ef75c26b8e172c6fbe0d48d15842a11d720574f022684a154c6dc864241a8a320fc4cf42c31ed67eced0bf1c728e321b9d8e4cb08a96811e7f80c1 +containersize 3100 +containerchecksum 9f61a4830737a7ec59797489ce4fef44d5d270d1ef84b4971eda0d91bd9fb6aca0efae6a7a0d056919d090325592e459de7b9182321cf1025251a81ee9127a90 +doccontainersize 235780 +doccontainerchecksum 3cf23b7cfac9f992890f67fc86f3e53cadef7cbe2725b4a19bab144766c4f1e60a3675685513d062d5ad81b3f13b4b6864c1daf83f76761275aa51b07a130c60 docfiles size=70 RELOC/doc/latex/censor/README details="Readme" RELOC/doc/latex/censor/censor.pdf details="Package documentation" @@ -52969,7 +52969,7 @@ runfiles size=3 catalogue-ctan /macros/latex/contrib/censor catalogue-license lppl1.3 catalogue-topics security -catalogue-version 4.2 +catalogue-version 4.3 name centeredline category Package @@ -72532,7 +72532,7 @@ containerchecksum 951e172129275fa2cb7ccea6bf23f27484503533ebee4c3bef7d2f4ddda594 name collection-pictures category Collection -revision 67254 +revision 67297 shortdesc Graphics, pictures, diagrams relocated 1 longdesc Including TikZ, pict, etc., but MetaPost and PStricks are @@ -72638,7 +72638,6 @@ depend nndraw depend numericplots depend outilsgeomtikz depend pb-diagram -depend penrose depend petri-nets depend pgf depend pgf-blur @@ -72756,6 +72755,7 @@ depend tikzsymbols depend tikztosvg depend tikzviolinplots depend tile-graphic +depend tilings depend timing-diagrams depend tipfr depend tkz-base @@ -72782,7 +72782,7 @@ depend xistercian depend xpicture depend xypic containersize 1596 -containerchecksum f7804f3242b9054637a6e4fe2a7249506589c85c20feb235667cfe512abc0e36734f8832c3ab93b8c1cf14a8acb1fbccf715494c1ec887226d3b835344a56313 +containerchecksum 76d88fa2e5fa2f0e9adcb2a7b8aba440bf1bd5eb2dbef35a637667e9af1d2eb6ab2725169e64a33954a125ab5f0f84a4e8947120fe214f363511e641437fdd4d name collection-plaingeneric category Collection @@ -171563,7 +171563,7 @@ catalogue-topics macro-supp layout latex3 pre-release name l3kernel category Package -revision 67219 +revision 67294 shortdesc LaTeX3 programming conventions relocated 1 longdesc The l3kernel bundle provides an implementation of the LaTeX3 @@ -171573,11 +171573,11 @@ longdesc LaTeX3 kernel and other future code are built: it is an API for longdesc TeX programmers. The packages are set up so that the LaTeX3 longdesc conventions can be used with regular LaTeX2e packages. depend l3backend -containersize 172608 -containerchecksum 61d01ad0010065fc3e70873397907f88a3199f3f3dc904c4b3c79d2a6ccb02584256878fee779f755259904678aa4aacf68b85a8fcc3af6f628323f4c1caa19b -doccontainersize 11889472 -doccontainerchecksum f21622e02d931f525d33af33986718c439ef97d01506cad994b36ba85a480aba041a9016291c31b9b88a4e67c2ee0bd26b2338dc9a0401607b7173b5985254db -docfiles size=3389 +containersize 172708 +containerchecksum d349b25da65cb93ed329c3ad195c4360e08f4f14c12e32fb6984fc493e0b2c94bd85fc2e0769ee9a8f03ab9fa4f30f5d05b674b34baf2be3425646c24708ed1a +doccontainersize 11993904 +doccontainerchecksum f535553cfac0c1538d0c7e0bab99ae14f329495a9aec535a456a8338cc6d4821aa97233439ca9d8224aa48041da241514febdc1a64625efacbcfda3fbe02613a +docfiles size=3419 RELOC/doc/latex/l3kernel/CHANGELOG.md RELOC/doc/latex/l3kernel/README.md details="Readme" RELOC/doc/latex/l3kernel/expl3.pdf details="The LaTeX3 Programming Language" @@ -171624,9 +171624,9 @@ docfiles size=3389 RELOC/doc/latex/l3kernel/source3.pdf RELOC/doc/latex/l3kernel/source3.tex RELOC/doc/latex/l3kernel/source3body.tex -srccontainersize 595984 -srccontainerchecksum b7293a527a0f83d4509a77695e80a61897d567d186352ec9e20a832ea044c1e8f62263191c0ca3eacf6249db9014dcbeb849766e3d39fd004b58124ea3decbae -srcfiles size=916 +srccontainersize 596384 +srccontainerchecksum 0cb93827de1d96a983581b4bc3e94e9680190a539b1b0e37037a3376ab468e6a0fc41273c3486574431be8f74ddb36623c7526fa840772f04ae0393e18d22c8f +srcfiles size=917 RELOC/source/latex/l3kernel/expl3.dtx RELOC/source/latex/l3kernel/l3.ins RELOC/source/latex/l3kernel/l3basics.dtx @@ -171685,7 +171685,7 @@ srcfiles size=916 RELOC/source/latex/l3kernel/l3tl.dtx RELOC/source/latex/l3kernel/l3token.dtx RELOC/source/latex/l3kernel/l3unicode.dtx -runfiles size=351 +runfiles size=352 RELOC/tex/latex/l3kernel/expl3-code.tex RELOC/tex/latex/l3kernel/expl3-generic.tex RELOC/tex/latex/l3kernel/expl3.ltx @@ -177253,17 +177253,17 @@ catalogue-topics version-control doc-mgmt name latexindent category Package -revision 67174 +revision 67296 shortdesc Indent a LaTeX document, highlighting the programming structure longdesc The Perl script processes a LaTeX file, indenting parts so as longdesc to highlight the structure for the reader. Included are also longdesc binary (executable) files for Windows, Ubuntu Linux, and macOS. depend latexindent.ARCH -containersize 73992 -containerchecksum 448ffc38f094cd791dd1c8ae985e62df8de1c80b6b9975d9005c6aeb3b1ba9886ed6991ac349d6ebe94be1c5eb365e99f26ce5f27fb7a886b8219a9130a873ef -doccontainersize 1321804 -doccontainerchecksum 9bb3b379a5b03146cbd7dd4051131b2b7240f3eed64a97f0c933fe7b5bb84777e32570f10e9c1d2cf1ca24ab8ee36b970f1a809c82391a7eebe3f7d7a148f393 -docfiles size=445 +containersize 74032 +containerchecksum 206e78308e3f8501e393dc19288b9c1ac8897841c0275fd4990573c94eb6e0f6bf036e5f8f80516724bf83b05ab88cac1e94a72c760a057ada9d6af46a0b4145 +doccontainersize 1325036 +doccontainerchecksum 91aea5ff221895a3653b285ebcf7413f6482ade453fe09e87a89a440f5af2494e8aefadee427d0ee012c203140b07eacc84f2dae83a1cffcf0555ee760b693f8 +docfiles size=446 texmf-dist/doc/support/latexindent/README details="Readme" texmf-dist/doc/support/latexindent/contributors.bib texmf-dist/doc/support/latexindent/figure-schematic.png @@ -177322,7 +177322,7 @@ catalogue-contact-repository https://github.com/cmhughes/latexindent.pl catalogue-ctan /support/latexindent catalogue-license gpl3 catalogue-topics code-layout -catalogue-version 3.21.1 +catalogue-version 3.22 name latexindent.aarch64-linux category Package @@ -177407,10 +177407,10 @@ binfiles arch=universal-darwin size=1 name latexindent.windows category Package -revision 67174 +revision 67296 shortdesc windows files of latexindent -containersize 3548004 -containerchecksum b2314bbaafa8cfca88029ea178e29e95c12952329fb3574acb68837df1338667f6a2eedff3c34bb3f0156fed7fc87794dfe28adcb0e3579a857340a3b3dbc767 +containersize 3547800 +containerchecksum bd5cf43a1827e71a8bae1a04d4870ed44e4c2195cc3da844ea182af935a5cec2b8b7de234b5f12cd19af33ea7389a7ed5e9f5139b2d27cdfa165c8ea9e0a868a binfiles arch=windows size=2126 bin/windows/latexindent.exe @@ -245789,42 +245789,6 @@ catalogue-ctan /macros/luatex/generic/penlight catalogue-license mit catalogue-topics luatex -name penrose -category Package -revision 57508 -shortdesc A TikZ library for producing Penrose tilings -relocated 1 -longdesc This package provides a TikZ library for drawing Penrose tiles. -longdesc It currently supports the kite/dart, rhombus, and pentagon tile -longdesc sets. There are two main methods for their placement: one that -longdesc automatically generates a tiling, and one that allows for "by -longdesc hand" placement. Furthermore, the tiles themselves can be -longdesc deformed and will still (hopefully!) fit together in the -longdesc correct fashion. -containersize 7448 -containerchecksum b8572b376e006126dfb925758e907f3993c7eb0a157a57a6a36c99103f3ed7ac58ae406f6888b7303fcea4c43b67e50162af0235d7d923e79c497c60403a3e2a -doccontainersize 966168 -doccontainerchecksum a02fb2976c23ec8dc51ecc70fb6e702f62ff6c8e14de437e2bb3a478a432034e1a87f92266930e5c56931e4db8d2bb0bb8ab1c464ee4c8ccd15cea0df8624e61 -docfiles size=260 - RELOC/doc/latex/penrose/README details="Readme" - RELOC/doc/latex/penrose/README.txt - RELOC/doc/latex/penrose/penrose.pdf details="User documentation" - RELOC/doc/latex/penrose/penrose.tex - RELOC/doc/latex/penrose/penrose_code.pdf details="Code documentation" -srccontainersize 13256 -srccontainerchecksum d40b7a787431ac7ad6af14de17bdf749ec5743f3a95226f084bbf3bdf4ad720b43b597dc432c9831d871f030eee049e08e8bad9d2efae63e9d588db31ae15178 -srcfiles size=25 - RELOC/source/latex/penrose/penrose_code.dtx - RELOC/source/latex/penrose/penrose_code.ins -runfiles size=19 - RELOC/tex/latex/penrose/tikzlibrarypenrose.code.tex -catalogue-contact-bugs https://github.com/loopspace/penrose/issues -catalogue-contact-repository https://github.com/loopspace/penrose -catalogue-ctan /graphics/pgf/contrib/penrose -catalogue-license lppl1.3c -catalogue-topics maths pgf-tikz -catalogue-version 1.4 - name perception category Package revision 48861 @@ -312962,7 +312926,7 @@ docfiles size=376 name texlive-scripts category TLCore -revision 67283 +revision 67291 shortdesc TeX Live infrastructure programs longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for longdesc tlmgr to run but still ours. Not included in tlcritical. @@ -312970,10 +312934,10 @@ depend texlive-scripts.ARCH depend texlive.infra execute addMap mathpple.map postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat -containersize 114060 -containerchecksum cf055c9f2707346846879e6eb8bb47d4cd9b548a9fe95a5f415e3035745a9923715906e9451db3effc3fe3f8dd00413c0860746c3da612a82a0a4f4bb92b31e3 -doccontainersize 427072 -doccontainerchecksum 87c62d681e19e7cb2bb1f5eac2b3982e2ff2994a347a46a63f2264437ab788b3a0c51d92321031573d4103616632920738afa0dba0047660358e2a71a536c93a +containersize 114020 +containerchecksum 680f3c4bd1af2fb396dd877b49bd364e0d2c2c4635aa13e4aafc392ca707459ebca93c90d96fceaf0307ebca57c95925013fac09559d9c41a419e26a5c7cbf66 +doccontainersize 427064 +doccontainerchecksum e1948fd5cf14ce206238331b478916c9b4ced5059f810b021d9e95a6746f6ecd61df21c5ba4ce5e5fecadbb1cac26fead7e099dbdee5c7874bb46ccf44a8beba docfiles size=545 doc.html texmf-dist/doc/man/man1/fmtutil-sys.1 @@ -315549,7 +315513,7 @@ catalogue-version 1.4 name texshade category Package -revision 67243 +revision 67295 shortdesc Package for setting nucleotide and peptide alignments relocated 1 longdesc TeXshade is alignment shading software completely written in @@ -315562,11 +315526,11 @@ longdesc legends; it even allows the user to define completely new longdesc shading modes. TeXshade combines highest flexibility with TeX longdesc output quality -- all in a bundle that does not demand longdesc excessive development time of the user. -containersize 61848 -containerchecksum 8831e74f99a0fb61c5fdd305e415520d98d41126488498c7ad8907683cea038cfbb6554c9facf414b3156d8dcc16a1f9fee4d6659cfc2c8dbc2b00b7d6376b67 -doccontainersize 1302448 -doccontainerchecksum 80e410c13f3f8853e99eee375e02de55b8d8c1d84b0bbb2ba9b659b431fbec6911ee5dd9ae77306f3e1ac84fe4faee7882f31000aaf6ccd7b4d7c0af36f12e31 -docfiles size=522 +containersize 62008 +containerchecksum cee15af218fd0bb6be633f7806eb6395e2dd320dc6a7e04a6238506a7ee2ef07d68d5de3faf93a566304b8e5b1addff2ec991ea81eecdafebaa52ce9374648e2 +doccontainersize 1247400 +doccontainerchecksum a3f414fe0397034c051ab1d75cb99986294b7e0a2ca8ea84b713bb9ce3cd4b502c1c86e9998553cfa73a46e7539e8c9cc5138d489d08c02d05d26d1e3177cd22 +docfiles size=441 RELOC/doc/latex/texshade/AQP1.phd RELOC/doc/latex/texshade/AQP1.top RELOC/doc/latex/texshade/AQP2spec.ALN @@ -315582,8 +315546,8 @@ docfiles size=522 RELOC/doc/latex/texshade/meme.eps RELOC/doc/latex/texshade/standard.cod RELOC/doc/latex/texshade/texshade.pdf details="Package documentation" language="en" -srccontainersize 315924 -srccontainerchecksum 39317ad145ae822ec4be8594be2654baf4750cc170938950204ffb86c0a001d121460d4e801a9dec8daa57579677bbcd88fc23dba4a913756b5f80f4ecf0321f +srccontainersize 315428 +srccontainerchecksum 8fa990a1e4381b41d89ae943968d006c738de845dce8f7a3b33de0d6608190d33e678e03cd7b33fd8c1efeb29c14d672c88b8a93b2af745e7569852975d40695 srcfiles size=363 RELOC/source/latex/texshade/texshade.dtx RELOC/source/latex/texshade/texshade.ins @@ -315594,7 +315558,7 @@ catalogue-contact-home https://www.pharmazie.uni-kiel.de/en/pharmceitica/prof-dr catalogue-ctan /macros/latex/contrib/texshade catalogue-license gpl2 catalogue-topics chemistry molbio -catalogue-version 1.26b +catalogue-version 1.26c name texsis category Package @@ -320642,6 +320606,46 @@ catalogue-ctan /macros/latex/contrib/tile-graphic catalogue-license lppl1.2 catalogue-topics graphics-subpic +name tilings +category Package +revision 67292 +shortdesc A TikZ library for drawing tiles and tilings +relocated 1 +longdesc This package provides a TikZ library for working with tiles, +longdesc tilings, and tessellations. Using it, one can define tiles, +longdesc place tiles, deform tiles, and -- in some cases -- apply +longdesc replacement rules to generate tessellations. It has pre-defined +longdesc tiles for most of the Penrose tile sets and the aperiodical +longdesc polykite tiles. This is a replacement for the penrose package, +longdesc renamed as it now deals with more extensive tiles than just the +longdesc Penrose tile sets. +containersize 10648 +containerchecksum f0164d69df56b1b981aec352326eacdf0f79366852bba6eb010a3842c338c678f1f38d3a5b1043ac4ff681595cc4a14a127a40b383f7d5388d9c52776352ac13 +doccontainersize 1004588 +doccontainerchecksum 13ac6a6e02a39420f0ed5e74d3f242561de4cd1e410fd6845e82b893c63d2becbf21064a676be29eed0c4b38251a78da55f43164eb2acccfb9f8d94fc72d6462 +docfiles size=291 + RELOC/doc/latex/tilings/README details="Readme" + RELOC/doc/latex/tilings/README.txt + RELOC/doc/latex/tilings/tilings.pdf details="User documentation" + RELOC/doc/latex/tilings/tilings.tex + RELOC/doc/latex/tilings/tilings_code.pdf details="Code documentation" +srccontainersize 17676 +srccontainerchecksum d6ff1a0f7453df40b7873a5b64a6d449990a3f8459901a3aaa41a5977fa0049a6203bf1cc4802b3d7383d6c68b55abed99c13ff5c5e7ffef4dcfae0e36ed43d9 +srcfiles size=28 + RELOC/source/latex/tilings/tilings_code.dtx + RELOC/source/latex/tilings/tilings_code.ins +runfiles size=24 + RELOC/tex/latex/tilings/tikzlibrarypenrose.code.tex + RELOC/tex/latex/tilings/tikzlibrarytilings.code.tex + RELOC/tex/latex/tilings/tikzlibrarytilings.penrose.code.tex + RELOC/tex/latex/tilings/tikzlibrarytilings.polykite.code.tex +catalogue-contact-bugs https://github.com/loopspace/tilings/issues +catalogue-contact-repository https://github.com/loopspace/tilings +catalogue-ctan /graphics/pgf/contrib/tilings +catalogue-license lppl1.3c +catalogue-topics maths pgf-tikz expl3 +catalogue-version 2.0 + name timbreicmc category Package revision 49740 diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 index 018b5b4b8e..c2b5befe1d 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 @@ -1 +1 @@ -e7ffd89b9497c4ad056649ccb416e1ba texlive.tlpdb +70c23261809acc7c123495e3bf3a3591 texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 index 7fa98b7b2c..d2afbe985f 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 @@ -1 +1 @@ -b5bdb9b228668705ce2e5fbff98d77200f57d9938a9d7948fd4c9913baaab5e4ef94ffd3361923ad802d5a34a1c0fc5fd010864db4f61d24f01aaf8c8478792a texlive.tlpdb +e56fb989a7ced3a0163880bc1de7fd1bb6d52d671e7a28fb6f00f49fcc1647abd0a9903f8b995ead39c4eabe1f9ed666e14254f7ad0ef39a5116b893ecaebc5d texlive.tlpdb diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc index fec5ec42b4..110ee16f99 100644 --- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc +++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc @@ -1,11 +1,11 @@ -----BEGIN PGP SIGNATURE----- -iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmR+c1sACgkQTOGHfhlD -jHAWRAf+MWSgq4GGyzZsO7wvUZBw6tIYhJldMixIBX56PFYAlM4xTbmNHhU5X/0k -wRAfmHwopOugTLjT1LyG0SQfibd6zMwH1vBz64Sj3yJpKNHo6JgVoG0kQwDTbvuZ -JxnD19PqIYj/smy0MIe9382nw9TwWOf8DHD8us62f1JT6iajbLkK/zFs+58GdjW4 -uVDrAFA6GIyjdJ/TK+ZAglu5laB8KURZwkQ5ApesWevjIgGvE+n2BcwXXWCj2Q8K -XExBK07eY1X6FjMW2mk0DA2ZCBF59lSZHBbPtpd8TKu8f0ctcXakaqEESEfNWmCD -paJIVNV3OEJj9IOz+BjWrvwDiS/13w== -=n5K0 +iQEzBAEBCgAdFiEE2PL4YFeoV+QqiBBqTOGHfhlDjHAFAmR/xOgACgkQTOGHfhlD +jHB8EwgAjY1qDei+K2RNiVXHLR9dZAPcqZ/grJdJVjaMYJhSgIk/CcjkURcKyMXX +fCmg/sXz/cT62WRYRLci4KHHCnjuRLByAQoJS/C3Dfv7/YBIQANc3ZPqlfbMkITW +0fT3NM0+GgkNfqlX2zkiCKyC+V+88+wKUgVKPBdz6/qThm1t/kwXVlxb5C6ZvRHv +vCMyDUl6B7Exi9wFILuEKQD6mGa4vzgXT7siKmzMvcBYJQm4t3Kw6SSrMtlLmnH4 +NsZ80xPZMUAZ3yCZKahmq/84oWAUPNhiZoV8p73IQNgLdXqbMkd0DzZWsJKtyleL +uAcOQv7LC20oa9vTb3Ws9Utu2d9NQA== +=zCYJ -----END PGP SIGNATURE----- diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz index fdeeab01fa..296ed0f70d 100644 Binary files a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz and b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz differ diff --git a/timestamp b/timestamp index 999edf2486..09d9230dd3 100644 --- a/timestamp +++ b/timestamp @@ -2,4 +2,4 @@ # The source CTAN of this site's material: dante.ctan.org # The year-month-day-hour-minute of this site's material: -2023-06-06-02-02 +2023-06-07-02-02 -- cgit v1.2.3