%% %% This is file `luasseq.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% luasseq.dtx (with options: `package') %% %% IMPORTANT NOTICE: %% %% For the copyright see the source file. %% %% Any modified versions of this file must be renamed %% with new filenames distinct from luasseq.sty. %% %% For distribution of the original source see the terms %% for copying and modification in the file luasseq.dtx. %% %% This generated file may be distributed as long as the %% original source files, as listed above, are part of the %% same distribution. (The sources need not necessarily be %% in the same archive or directory.) \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{luasseq}[2023/01/10] \RequirePackage{ifthen,calc,pifont} \RequirePackage{pgf}[2006/01/01] \RequirePackage{xkeyval} \usepgflibrary{snakes} \newboolean{debug} \setboolean{debug}{false} \DeclareOption{ps}{\errmessage{sseq: ps/nops is deprecated}} \DeclareOption{nops}{\errmessage{sseq: ps/nops is deprecated}} \DeclareOption{dvips}{\errmessage{sseq: deprecated option dvips ignored}} \DeclareOption{xdvi}{\errmessage{sseq: deprecated option xdvi ignored}} \DeclareOption{color}{\errmessage{sseq: deprecated option color ignored}} \DeclareOption{nocolor}{\errmessage{sseq: deprecated option nocolor ignored}} \DeclareOption{debug}{\setboolean{debug}{true}} \ProcessOptions \directlua0{dofile(kpse.find_file("luasseq.lua","lua"))} \definecolor{sseqgr}{gray}{0.65} \definecolor{sslightgr}{gray}{0.9} \definecolor{ssred}{rgb}{1,0,0} \definecolor{ssblack}{rgb}{0,0,0} \newcommand{\ssconncolor}{ssblack} \newcommand{\sslabelcolor}{ssblack} \newcommand{\ssplacecolor}{ssblack} %% ^^A Initialization \newcount\sseqxstart \sseqxstart=0 \newcount\sseqystart \sseqystart=0 \newdimen\sseq@dimen % ^^A To convert dimensions to scaled points (in TeX) \newbox\sseqbox % ^^A To compute the size of dropped objects (in TeX) \long\def\for #1=#2\to#3\do#4\od{#1=#2 \sseq@for #1\to #3\do #4\od} \long\def\sseq@for #1\to #2\do #3\od{% \ifnum #1>#2 \else #3\relax \advance #1 by 1 \def\tempcmd{\sseq@for #1\to #2\do #3\od}% \expandafter\tempcmd \fi } \def\@eval#1#2{% \edef\tempcmd{\noexpand#1#2}% \tempcmd } \def\ss@placespecial#1#2#3#4#5{ \directlua0{sseq_drop_object(#1,#2,[[#3]],[[#4]],[[#5]],[[\ssplacecolor]])}} \newcommand{\ssplace}[3]{ \ss@placespecial{#1}{#2}{rectangle}{discard}{#3} } \newcommand{\ssplaceboxed}[3]{ \ss@placespecial{#1}{#2}{rectangle}{stroke}{\ensuremath{#3}} } \newcommand{\ssplacecircled}[3]{ \ss@placespecial{#1}{#2}{circle}{stroke}{\ensuremath{#3}} } \newcommand{\ssmoveto}[2]{\directlua0{sseq_moveto(#1,#2)}} \newcommand{\ssmove}[2]{\directlua0{sseq_move(#1,#2)}} \define@key{sseqdrop}{circled}[true]{\newif\ifKV@sseqdrop@circled\csname KV@sseqdrop@circled#1\endcsname} \define@key{sseqdrop}{boxed}[true]{\newif\ifKV@sseqdrop@boxed\csname KV@sseqdrop@boxed#1\endcsname} \define@key{sseqdrop}{color}{\def\sseq@color{#1}} \define@key{sseqdrop}{name}{\def\sseq@name{#1}} \def\ssdrop{\@ifnextchar[\sseq@drop{\sseq@drop[]}} \def\sseq@drop[#1]#2{ \presetkeys{sseqdrop}{circled=false,boxed=false,color=\ssplacecolor,name=\relax}{} \setkeys{sseqdrop}{#1} \ifKV@sseqdrop@circled \directlua0{sseq_drop_object_here("circle","stroke",[[#2]],"\sseq@color")} \else \ifKV@sseqdrop@boxed \directlua0{sseq_drop_object_here("rectangle","stroke",[[#2]],"\sseq@color")} \else \directlua0{sseq_drop_object_here("rectangle","discard",[[#2]],"\sseq@color")} \fi \fi \def\temp{\relax} \ifx\sseq@name\temp \else \@eval\ssname{{\sseq@name}} \fi } \newcommand{\ssdropbull}{\ssdrop{\bullet}} \newcommand{\ssdropboxed}[1]{\ssdrop[boxed]{#1}} \newcommand{\ssdropcircled}[1]{\ssdrop[circled]{#1}} \def\ssname#1{\directlua0{sseq_name("#1")}} \newcommand{\ssgoto}[1]{\directlua0{sseq_goto("#1")}} \newcommand{\ssprefix}[1]{\directlua0{sseq_prefix("#1")}} \newcommand{\ssbeginprefixcontext}{\directlua0{sseq_begin_prefix_context()}} \newcommand{\ssendprefixcontext}{\directlua0{sseq_end_prefix_context()}} \newcommand{\ssresetprefix}{\directlua0{sseq_reset_prefix()}} \newcommand{\ssabsgoto}[1]{\directlua0{sseq_abs_goto("#1")}} \define@key{sseqlabel}{color}{\def\sseq@color{#1}} \define@key{sseqlabel}{pos}{\def\sseq@position{#1}} \define@key{sseqlabel}{U}[]{\def\sseq@position{U}} \define@key{sseqlabel}{LU}[]{\def\sseq@position{LU}} \define@key{sseqlabel}{L}[]{\def\sseq@position{L}} \define@key{sseqlabel}{LD}[]{\def\sseq@position{LD}} \define@key{sseqlabel}{D}[]{\def\sseq@position{D}} \define@key{sseqlabel}{RD}[]{\def\sseq@position{RD}} \define@key{sseqlabel}{R}[]{\def\sseq@position{R}} \define@key{sseqlabel}{RU}[]{\def\sseq@position{RU}} \def\ssdroplabel{\@ifnextchar[\sseq@droplabel{\sseq@droplabel[]}} \def\sseq@droplabel[#1]#2{ \def\sseq@position{L} \presetkeys{sseqlabel}{color=\ssplacecolor}{} \setkeys{sseqlabel}{#1} \directlua0{sseq_drop_label("\sseq@position","\sseq@color",[[#2]])} } \define@key{sseqdropext}{circled}[true]{\newif\ifKV@sseqdrop@circled\csname KV@sseqdrop@circled#1\endcsname} \define@key{sseqdropext}{boxed}[true]{\newif\ifKV@sseqdrop@boxed\csname KV@sseqdrop@boxed#1\endcsname} \define@key{sseqdropext}{color}{\def\ssplacecolor{#1}} \define@key{sseqdropext}{name}{\def\sseq@name{#1}} \def\ssdropextension{\@ifnextchar[\sseq@dropextension{\sseq@dropextension[]}} \def\sseq@dropextension[#1]{ \edef\sseq@savecolor{\ssplacecolor} \def\sseq@name{\relax} \presetkeys{sseqdropext}{circled=false,boxed=false}{} \setkeys{sseqdrop}{#1} \ifKV@sseqdrop@boxed \directlua0{sseq_drop_extension("rectangle","stroke","\sseq@color")} \else \directlua0{sseq_drop_extension("circle","stroke","\sseq@color")} \fi \def\temp{\relax} \ifx\sseq@name\temp \else \@eval\ssname{{\sseq@name}} \fi } \define@key{sseqstroke}{color}{\def\sseq@color{#1}} \define@key{sseqstroke}{curve}{\def\sseq@curve{#1}} \define@key{sseqstroke}{dashed}[{{2pt}{2pt}}]{\def\sseq@dashing{#1}} \define@key{sseqstroke}{dotted}[{{.5pt}{2pt}}]{\def\sseq@dashing{#1}} \define@key{sseqstroke}{arrowfrom}[\sseq@defaultarrowstyle]{\def\sseq@arrowfrom{\ssinversearrowhead[#1]}} \define@key{sseqstroke}{arrowto}[\sseq@defaultarrowstyle]{\def\sseq@arrowto{\ssarrowhead[#1]}} \define@key{sseqstroke}{void}[true]{\newif\ifKV@sseqstroke@void\csname KV@sseqstroke@void#1\endcsname} \def\ssstroke{\@ifnextchar[\sseq@stroke{\sseq@stroke[]}} \def\sseq@stroke[#1]{ \def\sseq@dashing{} \def\sseq@curve{} \def\sseq@arrowfrom{} \def\sseq@arrowto{} \presetkeys{sseqstroke}{void=false,color=\ssconncolor}{} \setkeys{sseqstroke}{#1} \ifKV@sseqstroke@void % ^^A a void line \directlua0{sseq_late_connection("\sseq@dashing","\sseq@curve","\sseq@color",false,true)} \else \directlua0{sseq_late_connection("\sseq@dashing","\sseq@curve","\sseq@color",false,false)} \fi \sseq@arrowfrom \sseq@arrowto } \newcommand{\sscurve}[1]{\sseq@stroke[curve=#1]} \newcommand{\ssdashedstroke}{\sseq@stroke[dashed]} \newcommand{\ssdashedcurve}[1]{\sseq@stroke[dashed,curve=#1]} \newcommand{\ssdottedstroke}{\sseq@stroke[dotted]} \newcommand{\ssdottedcurve}[1]{\sseq@stroke[dotted,curve=#1} \newcommand{\ssarrowhead}[1][\sseq@defaultarrowstyle]{\directlua0{sseq_add_arrow("arrowto","#1")}} \newcommand{\ssinversearrowhead}[1][\sseq@defaultarrowstyle]{\directlua0{sseq_add_arrow("arrowfrom","#1")}} \define@key{sseqline}{color}{\def\sseq@color{#1}} \define@key{sseqline}{curve}{\def\sseq@curve{#1}} \define@key{sseqline}{dashed}[{{2pt}{2pt}}]{\def\sseq@dashing{#1}} \define@key{sseqline}{dotted}[{{.5pt}{2pt}}]{\def\sseq@dashing{#1}} \define@key{sseqline}{arrowfrom}[\sseq@defaultarrowstyle]{\def\sseq@arrowfrom{\ssinversearrowhead[#1]}} \define@key{sseqline}{arrowto}[\sseq@defaultarrowstyle]{\def\sseq@arrowto{\ssarrowhead[#1]}} \define@key{sseqline}{void}[true]{\newif\ifKV@sseqline@void\csname KV@sseqline@void#1\endcsname} \def\ssline{\@ifnextchar[\sseq@line{\sseq@line[]}} \def\sseq@line[#1]#2#3{ \def\sseq@dashing{} \def\sseq@curve{} \edef\sseq@arrowfrom{} \edef\sseq@arrowto{} \presetkeys{sseqline}{void=false,color=\ssconncolor}{} \setkeys{sseqline}{#1} \ifKV@sseqline@void % ^^A a void line \directlua0{sseq_assert_source(); sseq_finish_pos(); sseq_move(#2,#3); sseq_late_connection("\sseq@dashing","\sseq@curve","\sseq@color",false,true)} \else \directlua0{sseq_open_connection("\sseq@dashing","\sseq@curve","\sseq@color",false,false); sseqposx = sseqposx+#2; sseqposy = sseqposy+#3} \fi \sseq@arrowfrom \sseq@arrowto } \newcommand{\sscurvedline}[3]{\ssline[curve=#3]{#1}{#2}} \newcommand{\ssdashedline}[2]{\ssline[dashed]{#1}{#2}} \newcommand{\sscurveddashedline}[3]{\ssline[curve=#3,dashed]{#1}{#2}} \newcommand{\ssarrow}[3][]{ \ssline[arrowto,#1]{#2}{#3} } \newcommand{\sscurvedarrow}[3]{\ssline[arrowto,curve=#3]{#1}{#2}} \newcommand{\ssdashedarrow}[2]{\ssline[arrowto,dashed]{#1}{#2}} \newcommand{\sscurveddashedarrow}[3]{\ssline[arrowto,dashed,curve=#3]{#1}{#2}} \def\ssvoidline{\@ifnextchar[\sseq@voidline{\sseq@voidline[]}} \def\sseq@voidline[#1]#2#3{ \def\sseq@dashing{} \def\sseq@curve{} \edef\sseq@arrowfrom{} \edef\sseq@arrowto{} \presetkeys{sseqline}{color=\ssconncolor}{} \setkeys{sseqline}{#1} \directlua0{sseq_void_line("\sseq@dashing","\sseq@curve","\sseq@color",#2,#3)} \sseq@arrowfrom \sseq@arrowto } \newcommand{\ssvoidarrow}[2]{\ssvoidline{#1}{#2}\ssarrowhead} \newcommand{\ssinversevoidarrow}[2]{\ssvoidline{#1}{#2}\ssinversearrowhead} \newcommand{\ssbullstring}[3]{ \directlua0{sseq_bullstring(#1,#2,#3,[[\ssplacecolor]])} } \newcommand{\ssinfbullstring}[3]{ \ssbullstring{#1}{#2}{#3} \ssvoidarrow{#1}{#2} } \newcommand{\ssgrayout}[1][gray]{\directlua0{sseq_grayout("#1")}} \define@key{sseq}{grid}{ \directlua0{sseqgriddrawer = sseq_grid_#1} } \define@key{sseq}{entrysize}{ \sseq@dimen=#1 \directlua0{sseqentrysize=\number\sseq@dimen} % In LUA, it's all in scaled points. } \define@key{sseq}{labels}{ \setkeys{sseq}{xlabels=#1,ylabels=#1} } \define@key{sseq}{xlabels}{ \def\temp{#1} \def\temptwo{none} \ifx\temp\temptwo \directlua0{sseqxlabels = sseq_parse_label_list("")} \else \def\temptwo{numbers} \ifx\temp\temptwo \directlua0{sseqxlabels = sseq_parse_label_list("&n")} \else \directlua0{sseqxlabels = sseq_parse_label_list([[#1]])} \fi \fi } \define@key{sseq}{ylabels}{ \def\temp{#1} \def\temptwo{none} \ifx\temp\temptwo \directlua0{sseqylabels = sseq_parse_label_list("")} \else \def\temptwo{numbers} \ifx\temp\temptwo \directlua0{sseqylabels = sseq_parse_label_list("&n")} \else \directlua0{sseqylabels = sseq_parse_label_list([[#1]])} \fi \fi } \define@key{sseq}{xlabelstep}{ \directlua0{sseqxstep=#1} } \define@key{sseq}{ylabelstep}{ \directlua0{sseqystep=#1} } \define@key{sseq}{labelstep}{\setkeys{sseq}{xlabelstep=#1}\setkeys{sseq}{ylabelstep=#1}} \define@key{sseq}{gapsize}{\setkeys{sseq}{xgapsize=#1}\setkeys{sseq}{ygapsize=#1}} \define@key{sseq}{xgapsize}{ \sseq@dimen=#1 \directlua0{sseqxgap=\number\sseq@dimen} } \define@key{sseq}{ygapsize}{ \sseq@dimen=#1 \directlua0{sseqygap=\number\sseq@dimen} } \define@key{sseq}{leak}{\setkeys{sseq}{xleak=#1}\setkeys{sseq}{yleak=#1}} \define@key{sseq}{xleak}{ \sseq@dimen=#1 \directlua0{sseqxleak=\number\sseq@dimen} } \define@key{sseq}{yleak}{ \sseq@dimen=#1 \directlua0{sseqyleak=\number\sseq@dimen} } \define@key{sseq}{gridstroke}{ \sseq@dimen=#1 \directlua0{sseqgridstrokethickness=\number\sseq@dimen} } \define@key{sseq}{arrows}{ \def\sseq@defaultarrowstyle{#1} \directlua0{sseqdefaultarrowstyle="#1"} } \define@key{sseq}{packing}{ \directlua0{sseqpacking = sseq_pack_#1} } \def\sseq@defaultarrowstyle{to} \directlua0{sseq_set_defaults()} \newenvironment{sseq}[3][]{% \begingroup \directlua0{sseq_init()} \begin{pgfpicture} \setkeys{sseq}{#1} \directlua0{sseq_setup_ranges("#2","#3",\the\sseqxstart,\the\sseqystart)} \directlua0{sseq_drawgrid()} \directlua0{sseq_drawlabels()} \directlua0{sseqboxno = \the\sseqbox} % ^^A Needed to measure the size of entries } { \relax \ssmoveto 0 0 \directlua0{sseq_position_objects(); sseq_dump_code()} \end{pgfpicture} \endgroup } \endinput %% %% End of file `luasseq.sty'.