% luadraw.sty version 3.1 du 29/05/2026% %% ---------------------------------------% %% Copyright (C) 2026 Patrick Fradin% %% ---------------------------------------% % Ce package fournit un environnement de dessin avec lua% %% % \begin{luadraw}{}% ou \begin{luadraw*}{} % % % \end{luadraw}% %%%%%%%% ATTENTION : compilation avec lualatex uniquement !% %%%%%% Les options de l'environnement sont:% %% % name = : nom du fichier tkz créé SANS extension (il y a un nom par défaut: \jobname\luaDraw@progcount),% % exec = : (true ou false): exécute ou non le code lua, true par defaut,% % auto = : (true ou false, true par défaut)): inclut ou non automatiquement le fichier tikz lorsque exec est false% %% %%%% Les options globales du package sont au nombre de 3:% %% % noexec : redéfinit la valeur par défaut de l'option exec à la valeur false,% % par conséquent les environnements luadraw ne sont pas exécutés par lua% % sauf si l'option exec (ou exec=true) est mentionnée dans les options de l'environnement% % 3d : si cette option est utilisée alors la classe graph3d sera définie (ainsi que la classe graph), sinon seule la classe graph sera définie % cachdir = : sous-dossier où seront enregistrés les fichiers tkz, par défaut c'est le sous-dossier _luadraw. %% \RequirePackage{ifluatex}% \ifluatex% % Rien à faire, tout va bien% \else% \PackageError{luadraw}{This package needs LuaTeX (lualatex)}{}% \expandafter\endinput% \fi% %% \NeedsTeXFormat{LaTeX2e}% % \ProvidesPackage{luadraw}[2026/05/29 version 3.1, provides luadraw environment for drawing with lua]%% % \RequirePackage{luacode}%% \RequirePackage{verbatim,xkeyval}%% % \RequirePackage{tikz}%% \usetikzlibrary{patterns}%% \usetikzlibrary{plotmarks}%% \usetikzlibrary{arrows.meta}%% \usetikzlibrary{decorations.markings}%% \usetikzlibrary{backgrounds}%% % patch from Davd Carlisle to correct a bug in luacode % https://tex.stackexchange.com/questions/762807/the-linebreak-syntax-bug-with-luacode \renewcommand \luacode@strip@sp@look {% \expandafter\ifx\luacode@spaceother\@let@token \expandafter\@firstoftwo \else \expandafter\@secondoftwo \fi{% \afterassignment\luacode@strip@sp@peek \let\@let@token= }{% \luacode@strip@sp@def!% }}% \def \luacode@strip@sp@def #1\@nil{% \expandafter\def\expandafter\luacode@curr\expandafter{\@gobble#1}}% %%% end of patch \def\luadraw@TkzDir{_luadraw/}% répertoire de travail par défaut% \directlua{luadraw = {}} \directlua{luadraw.cachedir = ""} \newif\ifluaDraw@DefaultExec\luaDraw@DefaultExectrue%% \newif\ifluaDraw@DefaultThreeD\luaDraw@DefaultThreeDfalse%% \define@key{luadraw.sty}{noexec}[]{\luaDraw@DefaultExecfalse}%% \define@key{luadraw.sty}{3d}[]{\luaDraw@DefaultThreeDtrue}%% \define@key{luadraw.sty}{cachedir}[]{%% \def\luadraw@TkzDir{#1/}% \directlua{ luadraw.cachedir = \luastring{\luadraw@TkzDir} local lfs = require 'lfs' lfs.mkdir(luadraw.cachedir) }}%% \ProcessOptionsX%% % \define@key{luaDraw}{name}{%% \def\luaDraw@nom{\luadraw@TkzDir#1}%% \directlua{luadraw.graph_name = \luastring{\luaDraw@nom}..".tkz"}% }%% \define@boolkey{luaDraw}{exec}[true]{%% \ifKV@luaDraw@exec%% \def\luaDraw@dep{\luacode}%star}%% \def\luaDraw@depstar{\luacodestar}%% \def\luaDraw@enddep{\endluacode}%star}%% \def\luaDraw@enddepstar{\endluacodestar}%% \else%% \def\luaDraw@dep{\comment}%% \def\luaDraw@enddep{\endcomment}%% \fi%% }%% \define@boolkey{luaDraw}{auto}[true]{%% }%% % \newcounter{luaDraw@progcount}%% \setcounter{luaDraw@progcount}{0}%% % \ifluaDraw@DefaultExec%% \presetkeys{luaDraw}{name=\jobname\theluaDraw@progcount, exec, auto}{}%% \else%% \presetkeys{luaDraw}{name=\jobname\theluaDraw@progcount, exec=false, auto}{}%% \fi%% % \def\luaDraw@loading{}%% % \newenvironment*{luadraw}[2][]{%% \addtocounter{luaDraw@progcount}{1}%% \setkeys{luaDraw}{#2}%% \ifKV@luaDraw@exec% code lua exécuté% \directlua{% on efface l'ancien fichier tkz s'il existe% print() print("graph file = "..luadraw.graph_name) local file = io.open(luadraw.graph_name, "r") if not file then return else file:close() os.remove(luadraw.graph_name) end }%% \else% code lua non exécuté% \ifKV@luaDraw@auto% -- chargement automatique du fichier tkz% \def\luaDraw@loading{\input{\luaDraw@nom.tkz}}%% \else%% \def\luaDraw@loading{}%% \fi%% \fi%% \bgroup%% \luaDraw@dep%% }%% {%% \luaDraw@enddep%% \egroup%% \luaDraw@loading%% }%% %%%%% environnement étoilé \newenvironment*{luadraw*}[2][]{%% \addtocounter{luaDraw@progcount}{1}%% \setkeys{luaDraw}{#2}%% \ifKV@luaDraw@exec% code lua exécuté% \directlua{% on efface l'ancien fichier tkz s'il existe% print() print("graph file = "..luadraw.graph_name) local file = io.open(luadraw.graph_name, "r") if not file then return else file:close() os.remove(luadraw.graph_name) end }%% \else% code lua non exécuté% \ifKV@luaDraw@auto% -- chargement automatique du fichier tkz% \def\luaDraw@loading{\input{\luaDraw@nom.tkz}}%% \else%% \def\luaDraw@loading{}%% \fi%% \fi%% \bgroup%% \luaDraw@depstar%% }%% {%% \luaDraw@enddepstar%% \egroup%% \luaDraw@loading%% }%% % code exécuté au lancement \begin{luacode*} if luadraw.cachedir == "" then luadraw.cachedir = "_luadraw/" local lfs = require 'lfs' lfs.mkdir(luadraw.cachedir) end luadraw.graph = require 'luadraw_graph2d' -- définition de la classe graph luadraw.graph_name = "" -- nom du graphique (l'extension .tkz a été ajoutée) function luadraw.graph:Show() -- on écrit la méthode Show pour afficher et faire une sauvegarde du fichier tkz self:Sendtotex() self:Savetofile(luadraw.graph_name) end function luadraw.graph:Save() -- on écrit la méthode Save pour faire une sauvegarde du fichier tkz uniquement self:Savetofile(luadraw.graph_name) end \end{luacode*} \ifluaDraw@DefaultThreeD% \begin{luacode*} luadraw.graph3d = require 'luadraw_graph3d' -- définition de la classe graph3d require 'luadraw_central_perspective' -- chargement de la perspective centrale \end{luacode*} \fi% % \endinput%%