% Title: lua-tikz3dtools.sty % Author: Jasper Nice % Date: April 28, 2026 \NeedsTeXFormat{LaTeX2e}[1994/06/01] \ProvidesExplPackage{lua-tikz3dtools}{2026/04/28}{v3.1.0}{ LuaLaTeX package for 3D illustrations in TikZ. } \RequirePackage{tikz} \RequirePackage{xcolor} \NewDocumentCommand{\luatikztdtoolsset}{o}{\tikzset{/lua-tikz3dtools/.cd, #1}} \tikzset{ /lua-tikz3dtools/.is~family % abbreviated "td" ,/lua-tikz3dtools/.cd ,/lua-tikz3dtools/parametric/.cd % appreviated "p" ,/lua-tikz3dtools/parametric/object/.cd % abbreviated "m" ,object/.code = {\protected@edef\luatikztdtools@p@m@object{#1}} ,name/.code = {\protected@edef\luatikztdtools@p@m@name{#1}} ,/lua-tikz3dtools/parametric/light/.cd % abbreviated "la" ,v/.code = {\protected@edef\luatikztdtools@p@la@v{#1}} % Points are better drawn as oriended disks using \appendsurface % ,/lua-tikz3dtools/parametric/point/.cd % abbreviated "p" % ,v/.code = {\protected@edef\luatikztdtools@p@p@v{#1}} % ,fill~options/.estore~in = \luatikztdtools@p@p@filloptions % ,fill~options/.initial = {} % ,transformation/.code = {\protected@edef\luatikztdtools@p@p@transformation{#1}} % ,transformation/.initial = return~Matrix.identity() % ,filter/.code = {\protected@edef\luatikztdtools@p@p@filter{#1}} % ,filter/.initial = return~true ,/lua-tikz3dtools/parametric/label/.cd % abbreviated "l" ,v/.code = {\protected@edef\luatikztdtools@p@l@v{#1}} ,text/.code = {\def\luatikztdtools@p@l@text{#1}} ,transformation/.code = {\protected@edef\luatikztdtools@p@l@transformation{#1}} ,transformation/.initial = return~Matrix.identity() ,filter/.code = {\protected@edef\luatikztdtools@p@l@filter{#1}} ,filter/.initial = return~true ,/lua-tikz3dtools/parametric/curve/.cd % abbreviated "c" ,uparams/.code = {\protected@edef\luatikztdtools@p@c@uparams{#1}} ,uparams/.initial = return~Vector:new{0,1,10} ,ustart/.code = {\protected@edef\luatikztdtools@p@c@ustart{#1}} ,ustop/.code = {\protected@edef\luatikztdtools@p@c@ustop{#1}} ,usamples/.code = {\protected@edef\luatikztdtools@p@c@usamples{#1}} ,v/.code = {\protected@edef\luatikztdtools@p@c@v{#1}} ,transformation/.code = {\protected@edef\luatikztdtools@p@c@transformation{#1}} ,transformation/.initial = return~Matrix.identity() ,draw~options/.estore~in = \luatikztdtools@p@c@drawoptions ,draw~options/.initial = {} ,arrow~tip/.code = {\protected@edef\luatikztdtools@p@c@arrowtip{#1}} ,arrow~tail/.code = {\protected@edef\luatikztdtools@p@c@arrowtail{#1}} ,filter/.code = {\protected@edef\luatikztdtools@p@c@filter{#1}} ,filter/.initial = return~true ,/lua-tikz3dtools/parametric/surface/.cd % abbreviated "s" ,uparams/.code = {\protected@edef\luatikztdtools@p@s@uparams{#1}} ,uparams/.initial = return~Vector:new{0,1,10} ,ustart/.code = {\protected@edef\luatikztdtools@p@s@ustart{#1}} ,ustop/.code = {\protected@edef\luatikztdtools@p@s@ustop{#1}} ,usamples/.code = {\protected@edef\luatikztdtools@p@s@usamples{#1}} ,vparams/.code = {\protected@edef\luatikztdtools@p@s@vparams{#1}} ,vparams/.initial = return~Vector:new{0,1,10} ,vstart/.code = {\protected@edef\luatikztdtools@p@s@vstart{#1}} ,vstop/.code = {\protected@edef\luatikztdtools@p@s@vstop{#1}} ,vsamples/.code = {\protected@edef\luatikztdtools@p@s@vsamples{#1}} ,v/.code = {\protected@edef\luatikztdtools@p@s@v{#1}} ,transformation/.code = {\protected@edef\luatikztdtools@p@s@transformation{#1}} ,transformation/.initial = return~Matrix.identity() ,fill~options/.code = {\protected@edef\luatikztdtools@p@s@filloptions{#1}} ,fill~options/.initial = {} ,filter/.code = {\protected@edef\luatikztdtools@p@s@filter{#1}} ,filter/.initial = return~true ,curve/.code = {\protected@edef\luatikztdtools@p@s@curve{#1}} ,/lua-tikz3dtools/parametric/triangle/.cd % abbreviated "t" ,m/.code = {\protected@edef\luatikztdtools@p@t@m{#1}} ,transformation/.code = {\protected@edef\luatikztdtools@p@t@transformation{#1}} ,transformation/.initial = return~Matrix.identity() ,fill~options/.code = {\protected@edef\luatikztdtools@p@t@filloptions{#1}} ,fill~options/.initial = {} ,filter/.code = {\protected@edef\luatikztdtools@p@t@filter{#1}} ,filter/.initial = return~true ,/lua-tikz3dtools/parametric/solid/.cd % abbreviated "solid" ,uparams/.code = {\protected@edef\luatikztdtools@p@solid@uparams{#1}} ,uparams/.initial = return~Vector:new{0,1,10} ,ustart/.code = {\protected@edef\luatikztdtools@p@solid@ustart{#1}} ,ustop/.code = {\protected@edef\luatikztdtools@p@solid@ustop{#1}} ,usamples/.code = {\protected@edef\luatikztdtools@p@solid@usamples{#1}} ,vparams/.code = {\protected@edef\luatikztdtools@p@solid@vparams{#1}} ,vparams/.initial = return~Vector:new{0,1,10} ,vstart/.code = {\protected@edef\luatikztdtools@p@solid@vstart{#1}} ,vstop/.code = {\protected@edef\luatikztdtools@p@solid@vstop{#1}} ,vsamples/.code = {\protected@edef\luatikztdtools@p@solid@vsamples{#1}} ,wparams/.code = {\protected@edef\luatikztdtools@p@solid@wparams{#1}} ,wparams/.initial = return~Vector:new{0,1,10} ,wstart/.code = {\protected@edef\luatikztdtools@p@solid@wstart{#1}} ,wstop/.code = {\protected@edef\luatikztdtools@p@solid@wstop{#1}} ,wsamples/.code = {\protected@edef\luatikztdtools@p@solid@wsamples{#1}} ,v/.code = {\protected@edef\luatikztdtools@p@solid@v{#1}} ,transformation/.code = {\protected@edef\luatikztdtools@p@solid@transformation{#1}} ,transformation/.initial = return~Matrix.identity() ,fill~options/.estore~in = \luatikztdtools@p@solid@filloptions ,fill~options/.initial = {} ,filter/.code = {\protected@edef\luatikztdtools@p@solid@filter{#1}} ,filter/.initial = return~true }% end tikzset \lua_load_module:n { lua-tikz3dtools-implementation } % Points are better drawn as oriended disks using \appendsurface % \NewDocumentCommand { \appendpoint } {o} { % \group_begin: % \tikzset{ % /lua-tikz3dtools/parametric/point/.search~also = {/tikz} % ,/lua-tikz3dtools/parametric/point/.cd % ,#1 % } % \__lua_tikztdtools_appendpoint: % \group_end: % } \NewDocumentCommand { \appendlabel } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/label/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/label/.cd ,#1 } \__lua_tikztdtools_appendlabel: \group_end: } \NewDocumentCommand { \appendlight } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/light/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/light/.cd ,#1 } \__lua_tikztdtools_appendlight: \group_end: } \NewDocumentCommand { \appendcurve } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/curve/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/curve/.cd ,#1 } \__lua_tikztdtools_appendcurve: \group_end: } \NewDocumentCommand { \appendsurface } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/surface/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/surface/.cd ,#1 } \__lua_tikztdtools_appendsurface: \group_end: } \NewDocumentCommand { \appendtriangle } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/triangle/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/triangle/.cd ,#1 } \__lua_tikztdtools_appendtriangle: \group_end: } \NewDocumentCommand { \appendsolid } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/solid/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/solid/.cd ,#1 } \__lua_tikztdtools_appendsolid: \group_end: } \NewDocumentCommand { \displaysimplices } {} { \group_begin: \__lua_tikztdtools_displaysimplices: \group_end: } \NewDocumentCommand { \setobject } {o} { \group_begin: \tikzset{ /lua-tikz3dtools/parametric/object/.search~also = {/tikz} ,/lua-tikz3dtools/parametric/object/.cd ,#1 } \__lua_tikztdtools_setobject: \group_end: }