summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-09-27 23:10:22 +0000
committerKarl Berry <karl@freefriends.org>2017-09-27 23:10:22 +0000
commitc4cbae8dd671567ad2dd25123f2895d0be874308 (patch)
treeaa39a60c8d902c12ba74f21d958a34714055f612 /Master/texmf-dist/tex/latex
parenta6daf9145cb996a42b356383ca5aea32b817b896 (diff)
istgame (26sep17)
git-svn-id: svn://tug.org/texlive/trunk@45417 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rw-r--r--Master/texmf-dist/tex/latex/istgame/istgame.sty790
1 files changed, 790 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/istgame/istgame.sty b/Master/texmf-dist/tex/latex/istgame/istgame.sty
new file mode 100644
index 00000000000..f7fdd51d801
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/istgame/istgame.sty
@@ -0,0 +1,790 @@
+%% file: istgame.sty
+%%
+%% Drawing Game Trees with TikZ
+%%
+%% (C) Copyright 2015-2017 In-Sung Cho <ischo at ktug.org>
+%%
+%% This work may be distributed and/or modified
+%% under the conditions of the LaTeX Project Public License,
+%% either version 1.3c of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt.
+%%
+%% -------------------------------------------------
+\ProvidesPackage{istgame-ktug}[2017/09/04 v1.0]
+
+% expl3,xparse: LPPL
+% tikz: LPPL and/or GNU GPL
+\RequirePackage{expl3,xparse,tikz}
+\usetikzlibrary{calc,arrows,shapes,positioning,patterns,trees,fit,backgrounds,quotes}
+
+
+%% prefixes for macros and defaults
+% \ist<...> stands for "an insung's simple tree" (or "it's a simple tree")
+% \xt<...> stands for "extensive tree"
+% \istdefault@<...>
+% \xtdefault@<...>
+
+
+%% node styles
+
+% basics (in node styles)
+\def\istdefault@nodeinnersep{1pt} %% default node inner sep
+\def\istdefault@nodeoutersep{0pt} %% default node outer sep
+\def\istdefault@nodedrawcolor{black} %% default node color
+\def\istdefault@nodebgcolor{white} %% default node background color
+\newcommand*\setistdefaultnodeinnersep[1]{\renewcommand*\istdefault@nodeinnersep{#1}}
+\newcommand*\setistdefaultnodeoutersep[1]{\renewcommand*\istdefault@nodeoutersep{#1}}
+\newcommand*\setistdefaultnodebgcolor[1]{\renewcommand*\istdefault@nodebgcolor{#1}}
+\newcommand*\setistdefaultnodedrawcolor[1]{\renewcommand*\istdefault@nodedrawcolor{#1}}
+
+% plain node: definition
+\def\istplainnodeinnersep{\istdefault@nodeinnersep} % 1pt by default
+\def\istplainnodeoutersep{\istdefault@nodeoutersep} % 0pt by default
+
+\NewDocumentCommand\setistPlainNodeStyle
+ {G{\istdefault@nodeinnersep}G{\istdefault@nodeinnersep}}
+ {
+ \renewcommand*\istplainnodeinnersep{#1} % 0pt (mandatory)
+ \renewcommand*\istplainnodeoutersep{#2}
+ }
+\tikzstyle{plain node}=[%
+ inner sep=\istplainnodeinnersep,outer sep=\istplainnodeoutersep,
+ draw=none]
+
+% null node: definition
+\def\istnullnodedrawcolor{\istdefault@nodedrawcolor} % (#1) black
+\def\istnullnodebgcolor{\istdefault@nodedrawcolor} % (#2) <= black
+\def\istdefault@nullnodesize{.2pt} % null node defaultsize
+\def\istnullnodesize{\istdefault@nullnodesize} % (#3)
+\def\istnullnodebgopacity{1} % (#4)
+
+\NewDocumentCommand\setistNullNodeStyle
+ {O{\istdefault@nodedrawcolor}mO{\istdefault@nodedrawcolor}O{1}}
+ {
+ \renewcommand*\istnullnodedrawcolor{#1}
+ \renewcommand*\istnullnodesize{#2} % mandatory
+ \renewcommand*\istnullnodebgcolor{#3} % same as {#1}
+ \renewcommand*\istnullnodebgopacity{#4}
+ }
+\tikzstyle{null node}=[circle,draw,minimum size=\istnullnodesize,%
+ draw=\istnullnodedrawcolor,fill=\istnullnodedrawcolor,fill opacity=\istnullnodebgopacity,%
+ inner sep=0pt,outer sep=\istdefault@nodeoutersep]
+
+% solid node: definition
+\def\istsolidnodedrawcolor{\istdefault@nodedrawcolor} % (#1) black
+\def\istsolidnodebgcolor{\istdefault@nodedrawcolor} % (#2) <= black
+\def\istdefault@solidnodesize{2.4pt} % (#3)
+\def\istsolidnodesize{\istdefault@solidnodesize} % (#3)
+\def\istsolidnodebgopacity{1} % (#4)
+
+\NewDocumentCommand\setistSolidNodeStyle
+ {O{\istdefault@nodedrawcolor}G{\istdefault@solidnodesize}O{\istdefault@nodedrawcolor}O{1}}
+ {
+ \renewcommand*\istsolidnodedrawcolor{#1}
+ \renewcommand*\istsolidnodesize{#2} % mandatory
+ \renewcommand*\istsolidnodebgcolor{#3} % same as {#1}
+ \renewcommand*\istsolidnodebgopacity{#4}
+ }
+\tikzstyle{solid node}=[circle,draw,minimum size=\istsolidnodesize,%
+ draw=\istsolidnodedrawcolor,fill=\istsolidnodedrawcolor,fill opacity=\istsolidnodebgopacity,%
+ inner sep=0pt,outer sep=\istdefault@nodeoutersep]
+
+% decision node & terminal node
+\let\setistDecisionNodeStyle\setistSolidNodeStyle
+\let\setistTerminalNodeStyle\setistSolidNodeStyle
+
+% hollow node: definition
+\def\isthollownodedrawcolor{\istdefault@nodedrawcolor} % (#1) black
+\def\isthollownodebgcolor{\istdefault@nodebgcolor} % (#2) white
+\def\istdefault@hollownodesize{2.8pt} % (#3)
+\def\isthollownodesize{\istdefault@hollownodesize} % (#3)
+\def\isthollownodebgopacity{1} % (#4)
+
+\NewDocumentCommand\setistHollowNodeStyle
+ {O{\istdefault@nodedrawcolor}G{\istdefault@hollownodesize}O{\istdefault@nodebgcolor}O{1}}
+ {
+ \renewcommand*\isthollownodedrawcolor{#1}
+ \renewcommand*\isthollownodesize{#2} % mandatory
+ \renewcommand*\isthollownodebgcolor{#3}
+ \renewcommand*\isthollownodebgopacity{#4}
+ }
+\tikzstyle{hollow node}=[circle,draw,minimum size=\isthollownodesize,%
+ draw=\isthollownodedrawcolor,fill=\isthollownodebgcolor,fill opacity=\isthollownodebgopacity,%
+ inner sep=0pt,outer sep=\istdefault@nodeoutersep]
+
+% initial node & chance node
+\let\setistInitialNodeStyle\setistHollowNodeStyle
+\let\setistChanceNodeStyle\setistHollowNodeStyle
+
+% rectangle node: definition
+\def\istrectanglenodedrawcolor{\istdefault@nodedrawcolor} %(#1) black
+\def\istdefault@rectanglenodesize{4pt} % (#2)
+\def\istrectanglenodesize{\istdefault@rectanglenodesize} % (#2)
+\def\istrectanglenodebgcolor{\istdefault@nodebgcolor} % (#3) white
+\def\istrectanglenodebgopacity{1} % (#4)
+
+\NewDocumentCommand\setistRectangleNodeStyle
+ {O{\istdefault@nodedrawcolor}G{\istdefault@rectanglenodesize}O{\istdefault@nodebgcolor}O{1}}
+ {
+ \renewcommand*\istrectanglenodedrawcolor{#1}
+ \renewcommand*\istrectanglenodesize{#2} % mandatory
+ \renewcommand*\istrectanglenodebgcolor{#3}
+ \renewcommand*\istrectanglenodebgopacity{#4}
+ }
+\tikzstyle{rectangle node}=[rectangle,draw,minimum size=\istrectanglenodesize,%
+ draw=\istrectanglenodedrawcolor,fill=\istrectanglenodebgcolor,fill opacity=\istrectanglenodebgopacity,%
+ inner sep=2pt,outer sep=\istdefault@nodeoutersep]
+
+% box node & square node
+\let\setistBoxNodeStyle\setistRectangleNodeStyle
+\let\setistSquareNodeStyle\setistRectangleNodeStyle
+
+% ellipse node: definition
+\def\istellipsenodedrawcolor{\istdefault@nodedrawcolor} % (#1) black
+\def\istdefault@ellipsenodesize{5pt} % (#2)
+\def\istellipsenodesize{\istdefault@ellipsenodesize} % (#2)
+\def\istellipsenodebgcolor{\istdefault@nodebgcolor} % (#3) white
+\def\istellipsenodebgopacity{1} % (#4)
+
+\NewDocumentCommand\setistEllipseNodeStyle
+ {O{\istdefault@nodedrawcolor}G{\istdefault@ellipsenodesize}O{\istdefault@nodebgcolor}O{1}}
+ {
+ \renewcommand*\istellipsenodedrawcolor{#1}
+ \renewcommand*\istellipsenodesize{#2} % mandatory
+ \renewcommand*\istellipsenodebgcolor{#3}
+ \renewcommand*\istellipsenodebgopacity{#4}
+ }
+\tikzstyle{ellipse node}=[ellipse,draw,minimum size=\istellipsenodesize,%
+ draw=\istellipsenodedrawcolor,fill=\istellipsenodebgcolor,fill opacity=\istellipsenodebgopacity,%
+ inner sep=1.5pt,outer sep=\istdefault@nodeoutersep]
+
+% oval node
+\let\setistOvalNodeStyle\setistEllipseNodeStyle
+
+
+%% aliases: node styles
+\tikzstyle{initial node}=[hollow node]
+\tikzstyle{chance node}=[hollow node]
+\tikzstyle{decision node}=[solid node] % decision nodes
+\tikzstyle{terminal node}=[solid node] % terminal nodes
+\tikzstyle{box node}=[rectangle node]
+\tikzstyle{square node}=[rectangle node]
+\tikzstyle{oval node}=[ellipse node]
+
+
+% node anchors
+\let\istparentanchor\tikzparentanchor % empty by default
+\let\istchildanchor\tikzchildanchor % empty by default
+\newcommand*\setistparentanchor[1]{\renewcommand*\istparentanchor{.#1}}
+\newcommand*\setistchildanchor[1]{\renewcommand*\istchildanchor{.#1}}
+
+\NewDocumentCommand\setistbranchanchors{mG{center}}
+ {\def\istparentanchor{.#1} \def\istchildanchor{.#2}
+ }
+
+
+% istgame environment
+\def\istgamefontsize{\normalsize}
+\NewDocumentCommand\setistgamefontsize {m}
+ {\renewcommand*{\istgamefontsize}{#1}
+ }
+
+\NewDocumentEnvironment{istgame}{O{}} % accepts tikzpicture options
+ {\begin{tikzpicture}[font=\istgamefontsize,>=stealth,#1]
+ }
+ {\end{tikzpicture}
+ }
+
+%% to resolve a conflict with tikz-qtree
+
+%\RenewDocumentEnvironment{istgame}{O{}} % accepts tikzpicture options
+% {\begin{tikzpicture}[%
+% edge from parent path={(\tikzparentnode\istparentanchor) --
+% (\tikzchildnode\istchildanchor)}, % tikz-qtree conflict resolved
+% font=\istgamefontsize,>=stealth,#1
+% ]
+% }
+% {\end{tikzpicture}
+% }
+
+
+%% istgame macros
+
+
+%% basics (in child)
+% -- used in the definition of \istb
+\def\xtndot{node[solid node]{}} %% within child (node dot)
+\def\xttndot{node[terminal node]{}} %% within child (terminal node dot)
+\def\xtshowtndot{} %% (default: no terminal nodes printed)
+\def\xtshowendpoint{} %% (default: no endpoints printed)
+
+% show and hide endpoints
+\NewDocumentCommand\xtShowEndPoints{O{solid node}}
+ {
+ \def\xtshowendpoint{node[#1]{}}
+ \def\xtshowtndot{node[#1]{}}
+ }
+\NewDocumentCommand\xtHideEndPoints{}
+ {
+ \renewcommand*\xtshowendpoint{}
+ \renewcommand*\xtshowtndot{}
+ }
+
+% show and hide terminal nodes
+\NewDocumentCommand\xtShowTerminalNodes{O{terminal node}}
+ {
+ \def\xtshowtndot{node[#1]{}}
+ }
+\NewDocumentCommand\xtHideTerminalNodes{}
+ {
+ \renewcommand*\xtshowtndot{}
+ }
+
+% moves and payoffs
+\def\xtpayoffstyle#1{$#1$}
+\newcommand*\xtpayoff[2]{node [inner sep=0pt, outer sep=0pt, label={#1:{\xtpayoffstyle{#2}}}] {}}
+
+\def\xtactionstyle#1{$#1$}
+\newcommand*\xtmove[3]{edge from parent [#1] node [#2] {\xtactionstyle{#3}}}
+
+
+%% main macros: \xtdistance, \istRoot, \istCntmRoot
+% \xtdistance
+\def\xtdefault@levdist{15mm} %% (default) level distance
+\def\xtdefault@sibdist{15mm} %% (default) sibling distance
+\newcommand*\xtlevdist{\xtdefault@levdist}
+\newcommand*\xtsibdist{\xtdefault@sibdist}
+
+%\NewDocumentCommand\xtdistance{O{1}mG{\setdefaultsibdist}}
+\NewDocumentCommand\xtdistance{O{1}mG{\xtdefault@sibdist}}
+ {
+ \renewcommand*\xtlevdist{#2}
+ \renewcommand*\xtsibdist{#3}
+ \tikzstyle{level #1}= [level distance=\xtlevdist,sibling distance=\xtsibdist]
+ }
+
+%% counterclockwise (grow=) or clockwise (grow'=)
+
+% default: growing south counterclockwise
+\def\xtgrow{grow}
+\def\xtgrowprime{grow'}
+\def\istdefault@grow{south} % tree growing direction
+
+% \setistgrowkey
+\NewDocumentCommand\setistgrowkey{m}
+{ \renewcommand*\xtgrow{#1}
+}
+
+% \setistgrowdirection
+\NewDocumentCommand\setistgrowdirection{t'm}
+{\IfBooleanTF {#1}
+ { \renewcommand*\xtgrow{grow'}
+ \renewcommand*\istdefault@grow{#2}
+ }
+ { \renewcommand*\xtgrow{grow}
+ \renewcommand*\istdefault@grow{#2}
+ }
+}
+
+
+% \istRoot
+\NewDocumentCommand\istRoot{t'O{south}r()D(){0,0}O{}D<>{}G{}D+.{\xtlevdist}D.+{\xtsibdist}}
+{
+ \IfBooleanTF {#1}
+ {
+ \tikzstyle{level 1}=[level distance=#8,sibling distance=#9]
+ \node (#3) at (#4) [decision node,#5,{label={#6:{#7}}}] {} [\xtgrowprime=#2]
+ }
+ {
+ \tikzstyle{level 1}=[level distance=#8,sibling distance=#9]
+ \node (#3) at (#4) [decision node,#5,{label={#6:{#7}}}] {} [\xtgrow=#2]
+ }
+}
+
+% \istRootO (oval version)
+\NewDocumentCommand\istRootO{t'O{south}r()D(){0,0}O{}D<>{}G{}D+.{\xtlevdist}D.+{\xtsibdist}}
+{
+ \IfBooleanTF {#1}
+ {
+ \tikzstyle{level 1}=[level distance=#8,sibling distance=#9]
+ \node (#3) at (#4) [oval node,#5] {#7} [\xtgrowprime=#2]
+ }
+ {
+ \tikzstyle{level 1}=[level distance=#8,sibling distance=#9]
+ \node (#3) at (#4) [oval node,#5] {#7} [\xtgrow=#2]
+ }
+}
+
+
+%% continuum of branches
+
+\def\cntmdefault@levdist{8mm}
+\def\cntmdefault@sibdist{3*\cntmdefault@levdist}
+\newcommand*\cntmlevdist{\cntmdefault@levdist}
+\newcommand*\cntmsibdist{\cntmdefault@sibdist}
+
+% \cntmdistance (internal use only)
+\NewDocumentCommand\cntmdistance{mG{\cntmdefault@sibdist}}
+{
+\renewcommand*\cntmlevdist{#1}
+\renewcommand*\cntmsibdist{#2}
+}
+
+
+% \istCntmRoot
+\NewDocumentCommand\istCntmRoot{t'O{south}r()D(){0,0}O{black!25}G{.5}D+.{\cntmdefault@levdist}D.+{\cntmdefault@sibdist}}
+{
+ \IfBooleanTF {#1}
+ {
+ \cntmdistance{#7}{#8}
+ \tikzstyle{level 1}=[level distance=\cntmlevdist,sibling distance=\cntmsibdist]
+ \setistNullNodeStyle[#5]{\istdefault@nullnodesize}[#5]
+ \node (#3) at (#4) [null node] {} [\xtgrowprime=#2] child child;
+ \draw [#5,fill=#5] (#3) -- (#3-1) -- (#3-2) -- (#3);
+ \setistNullNodeStyle{\istdefault@nullnodesize}
+ }
+ {
+ \cntmdistance{#7}{#8}
+ \tikzstyle{level 1}=[level distance=\cntmlevdist,sibling distance=\cntmsibdist]
+ \setistNullNodeStyle[#5]{\istdefault@nullnodesize}[#5]
+ \node (#3) at (#4) [null node] {} [\xtgrow=#2] child child;
+ \draw [#5,fill=#5] (#3) -- (#3-1) -- (#3-2) -- (#3);
+ \setistNullNodeStyle{\istdefault@nullnodesize}
+ }
+}
+
+
+% \istCntmRootArc (arc version)
+\NewDocumentCommand\istCntmRootArc{t'O{south}r()D(){0,0}O{}G{.5}D+.{\cntmdefault@levdist}D.+{\cntmdefault@sibdist}}
+{
+ \IfBooleanTF {#1}
+ {
+ \cntmdistance{#7}{#8}
+ \tikzstyle{level 1}=[level distance=\cntmlevdist,sibling distance=\cntmsibdist]
+ \node (#3) at (#4) [null node] {} [\xtgrowprime=#2] child child;
+ \draw [bend right,#5] ($(#3)!#6!(#3-1)$) to ($(#3)!#6!(#3-2)$);
+ }
+ {
+ \cntmdistance{#7}{#8}
+ \tikzstyle{level 1}=[level distance=\cntmlevdist,sibling distance=\cntmsibdist]
+ \node (#3) at (#4) [null node] {} [\xtgrow=#2] child child;
+ \draw [bend right,#5] ($(#3)!#6!(#3-1)$) to ($(#3)!#6!(#3-2)$);
+ }
+}
+
+
+%% subgames
+
+% \xtSubgameBox
+\def\xtdefaultsubrootshiftbox{0,-.3}
+\NewDocumentCommand\xtSubgameBox{ s r() m O{} }
+{ \IfBooleanTF #1
+ {
+ \coordinate (xtsubroot) at ($(#2)+(\xtdefaultsubrootshiftbox)$);
+ \begin{scope}[on background layer]
+ \node [rectangle,fill,red!20,inner sep=20pt,rounded corners=15pt,#4]
+ [fit=(xtsubroot) #3] {};
+ \end{scope}
+ }
+ {
+ \coordinate (xtsubroot) at ($(#2)+(0,-.3)$);
+ \begin{scope}[on background layer]
+ \node [rectangle,draw,dashed,inner sep=20pt,rounded corners=15pt,black!50,#4]
+ [fit=(xtsubroot) #3] {};
+ \end{scope}
+ }
+}
+
+% \xtSubgameOval
+\def\xtdefaultsubrootshiftoval{0,-.7}
+\NewDocumentCommand\xtSubgameOval{ s r() m O{}}
+{ \IfBooleanTF #1
+ {
+ \coordinate (xtsubroot) at ($(#2)+(\xtdefaultsubrootshiftoval)$);
+ \begin{scope}[on background layer]
+ \node [ellipse,fill,red!20,inner sep=15pt,#4]
+ [fit=(xtsubroot) #3] {};
+ \end{scope}
+ }
+ {
+ \coordinate (xtsubroot) at ($(#2)+(0,-.7)$);
+ \begin{scope}[on background layer]
+ \node [ellipse,draw,dashed,inner sep=15pt,black!50,#4]
+ [fit=(xtsubroot) #3] {};
+ \end{scope}
+ }
+}
+
+%% fine tuning: labels
+\newcommand*\xtALxShift{0pt} % default xshift
+\newcommand*\xtALyShift{0pt} % default yshift
+
+\NewDocumentCommand\xtALPush{mm}
+ {
+ \renewcommand*\xtALxShift{#1}
+ \renewcommand*\xtALyShift{#2}
+ }
+
+\newcommand*\istactionlabelxshift{1pt} % default horizontal push (alternatively, .67pt)
+\newcommand*\istactionlabelyshift{2pt} % default vertical push (alternatively, 2.5pt)
+
+\NewDocumentCommand\xtALShift{G{\istactionlabelxshift}G{\istactionlabelyshift}}
+ {
+ \renewcommand*\istactionlabelxshift{#1}
+ \renewcommand*\istactionlabelyshift{#2}
+ }
+
+
+%% xparse so far
+%%
+%% expl3 from here
+
+
+\ExplSyntaxOn
+
+\tl_new:N \ischo_game_tl
+
+% action
+\cs_new:Npn \ist_move:nnn #1 #2 #3
+{
+ \str_case:nnF { #2 }
+ {
+ { al } { edge~from~parent [#1] node
+ [above~left,xshift=\istactionlabelxshift,yshift=-\istactionlabelyshift,text~depth=.25ex] { $#3$ }
+ }
+ { ar } { edge~from~parent [#1] node
+ [above~right,xshift=-\istactionlabelxshift,yshift=-\istactionlabelyshift,text~depth=.25ex] { $#3$ }
+ }
+ { bl } { edge~from~parent [#1] node
+ [below~left,xshift=\istactionlabelxshift,yshift=\istactionlabelyshift,text~depth=.25ex] { $#3$ }
+ }
+ { br } { edge~from~parent [#1] node
+ [below~right,xshift=-\istactionlabelxshift,yshift=\istactionlabelyshift,text~depth=.25ex] { $#3$ }
+ }
+ { l } { edge~from~parent [#1] node [left,xshift=-\xtALxShift,text~depth=.25ex] { $#3$ } }
+ { r } { edge~from~parent [#1] node [right,xshift=\xtALxShift,text~depth=.25ex] { $#3$ } }
+ { a } { edge~from~parent [#1] node [above,yshift=\xtALyShift,text~depth=.25ex] { $#3$ } }
+ { b } { edge~from~parent [#1] node [below,yshift=-\xtALyShift,text~depth=.25ex] { $#3$ } }
+ }
+ {
+ edge~from~parent [#1] node [text~depth=.25ex,#2] {$#3$} % \xtmove{#1}{#2}{#3}
+ }
+}
+
+% payoff
+\cs_new:Npn \ist_payoff:nn #1 #2
+{
+ \str_case_x:nnF { #1 }
+ {
+ { al } { \xtpayoff { above~left } { #2 } }
+ { ar } { \xtpayoff { above~right } { #2 } }
+ { bl } { \xtpayoff { below~left } { #2 } }
+ { br } { \xtpayoff { below~right } { #2 } }
+ { l } { \xtpayoff { left } { #2 } }
+ { r } { \xtpayoff { right } { #2 } }
+ { a } { \xtpayoff { above} { #2 } }
+ { b } { \xtpayoff { below } { #2 } }
+ }
+ {
+ \xtpayoff {#1}{#2}
+ }
+}
+
+
+%% core macros: \istroot, \istb, \endist
+
+% \istroot(') -- standard version
+\NewDocumentCommand \istroot
+{ t' O{\istdefault@grow} r() D(){0,0} O{} D<>{above} G{} D+.{\xtlevdist} D.+{\xtsibdist} }
+{
+ \tl_clear:N \ischo_game_tl
+ \xdef\istgrowdirection{#2} % used in \istb to specify [payoff direction]
+
+ \IfBooleanTF {#1}
+ {
+ \tl_put_right:Nx \ischo_game_tl
+ { % { } needed for #8 and #9 with decimal dim
+ \istRoot' [ \istgrowdirection ] ( #3 ) ( #4 ) [ #5 ] { #7 } + {#8} .. {#9} +
+ }
+ }
+ {
+ \tl_put_right:Nx \ischo_game_tl
+ { % { } needed for #8 and #9 with decimal dim
+ \istRoot [ \istgrowdirection ] ( #3 ) ( #4 ) [ #5 ] < #6 > { #7 } + {#8} .. {#9} +
+ }
+ }
+}
+
+% \istrooto(') -- oval version
+\NewDocumentCommand \istrooto
+{ t' O{\istdefault@grow} r() D(){0,0} O{} D<>{above} G{} D+.{\xtlevdist} D.+{\xtsibdist} }
+{
+ \tl_clear:N \ischo_game_tl
+ \xdef\istgrowdirection{#2} % used in \istb to specify [payoff direction]
+
+ \IfBooleanTF {#1}
+ {
+ \tl_put_right:Nx \ischo_game_tl
+ { % { } needed for #8 and #9 with decimal dim
+ \istRootO' [ \istgrowdirection ] ( #3 ) ( #4 ) [ #5 ] { #7 } + {#8} .. {#9} +
+ }
+ }
+ {
+ \tl_put_right:Nx \ischo_game_tl
+ { % { } needed for #8 and #9 with decimal dim
+ \istRootO [ \istgrowdirection ] ( #3 ) ( #4 ) [ #5 ] { #7 } + {#8} .. {#9} +
+ }
+ }
+}
+
+% \istb(*)(.)
+\NewDocumentCommand \istb
+{ s t. D<>{} O{} G{} O{} g O{\istgrowdirection} }
+{ % \istb* (starred version)
+ \IfBooleanTF {#1} % (starred version T/F)
+ {
+ \IfValueTF { #7 } % if payoff exists
+ {%*
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtndot
+ \ist_payoff:nn { #8 } { #7 }
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ {%*
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtndot
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ } % end of Boolean True {#1}
+ {
+ \IfBooleanTF {#2} % (dot version T/F)
+ { % \istb. (period version)
+ \IfValueTF { #7 } % if payoff exists
+ {%.
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtshowtndot
+ \ist_payoff:nn { #8 } { #7 }
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ {%.
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtshowtndot
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ } % end of Boolean True {#2}
+ { % \istb
+ \IfValueTF { #7 } % if payoff exists
+ {
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtshowendpoint
+ \ist_payoff:nn { #8 } { #7 }
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ {
+ \tl_put_right:Nn \ischo_game_tl
+ { child [ #3 ] { \xtshowendpoint
+ \ist_move:nnn { #4 } { #6 } { #5 } }
+ }
+ }
+ } % end of Boolean False {#2}
+ } % end of Boolean False {#1}
+}
+
+% \endist
+\NewDocumentCommand \endist { }
+ {
+ \tl_put_right:Nn \ischo_game_tl { ; }
+ \tl_use:N \ischo_game_tl
+ }
+
+
+%% continuum of branches
+
+% \istcntm(')
+\NewDocumentCommand \istcntm
+{ t' O{\istdefault@grow} r() D(){0,0} O{black!25} G{} D+.{\cntmdefault@levdist}D.+{\cntmdefault@sibdist} }
+{
+ \IfBooleanTF {#1}
+ {
+ \istCntmRoot' [ #2 ] ( #3 ) ( #4 ) [ #5 ] + #7 .. #8 +
+ }
+ {
+ \istCntmRoot [ #2 ] ( #3 ) ( #4 ) [ #5 ] + #7 .. #8 +
+ }
+}
+
+% \istcntmarc(') -- arc version
+\NewDocumentCommand \istcntmarc
+{ t' O{\istdefault@grow} r() D(){0,0} O{} G{.5} D+.{\cntmdefault@levdist}D.+{\cntmdefault@sibdist} }
+{
+ \IfBooleanTF {#1}
+ {
+ \istCntmRootArc' [ #2 ] ( #3 ) ( #4 ) [ #5 ] { #6 } + #7 .. #8 +
+ }
+ {
+ \istCntmRootArc [ #2 ] ( #3 ) ( #4 ) [ #5 ] { #6 }+ #7 .. #8 +
+ }
+}
+
+
+%% supplement macros
+
+% \xtInfoset
+\def\xtdefault@infosep{4pt}
+\newcommand*\setxtdefaultinfosep[1]{\renewcommand*\xtdefault@infosep{#1}}
+
+\NewDocumentCommand\xtInfoset{t'O{}r()r()G{}O{}D(){\xtdefault@infosep}}
+{
+ \IfBooleanTF {#1}
+ {%'
+ \draw [semithick, dotted,#2]
+ (#4) to (#3)
+ node at ($(#4)!.5!(#3)$) [above,#6] {#5};
+ }
+ {
+ \draw [semithick, dotted,#2]
+ (#3) to (#4)
+ node~at ($(#3)!.5!(#4)$) [above,#6] {#5};
+ }
+}
+
+
+% \xtInfosetO -- oval version
+\NewDocumentCommand\xtInfosetO{t'O{}r()r()G{}O{}D(){\xtdefault@infosep}}
+{
+ \IfBooleanTF {#1}
+ {%'
+ \begin{scope}[on~background~layer]
+ \draw [-,semithick,densely~dotted,rounded~corners=#7,#2]
+ ($(#4)+(-#7,#7)$) rectangle ($(#3)+(#7,-#7)$)
+ node at ($(#4)!.5!(#3)$) [#6] {#5};
+ \end{scope}
+ }
+ {%
+ \begin{scope}[on~background~layer]
+ \draw [-,semithick,densely~dotted,rounded~corners=#7,#2]
+ ($(#3)+(-#7,#7)$) rectangle ($(#4)+(#7,-#7)$)
+ node at ($(#3)!.5!(#4)$) [#6] {#5};
+ \end{scope}
+ }
+}
+
+
+
+% \xInfosetOwner (with abbreviations)
+\NewDocumentCommand\xtInfosetOwner{t'r()r()mO{}}
+{\IfBooleanTF{#1}
+ { \str_case_x:nnF { #5 }
+ {
+ { al } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [above~left] {#4}; }
+ { ar } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [above~right] {#4}; }
+ { bl } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [below~left] {#4}; }
+ { br } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [below~right] {#4}; }
+ { l } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [left] {#4}; }
+ { r } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [right] {#4}; }
+ { a } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [above] {#4}; }
+ { b } { \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [below] {#4}; }
+ }
+ {
+ \draw [draw=none] (#3) to (#2) node at ($(#3)!.5!(#2)$) [#5] {#4};
+ }
+ }
+ { \str_case_x:nnF { #5 }
+ {
+ { al } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [above~left] {#4}; }
+ { ar } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [above~right] {#4}; }
+ { bl } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [below~left] {#4}; }
+ { br } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [below~right] {#4}; }
+ { l } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [left] {#4}; }
+ { r } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [right] {#4}; }
+ { a } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [above] {#4}; }
+ { b } { \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [below] {#4}; }
+ }
+ {
+ \draw [draw=none] (#2) to (#3) node at ($(#2)!.5!(#3)$) [#5] {#4};
+ }
+ }
+}
+
+% \xtOwner (with abbreviations)
+\NewDocumentCommand\xtOwner{ r() m O{above} }
+{
+ \str_case_x:nnF { #3 }
+ {
+ { al } { \node [ above~left ] at (#1) {#2}; }
+ { ar } { \node [ above~right ] at (#1) {#2}; }
+ { bl } { \node [ below~left ] at (#1) {#2}; }
+ { br } { \node [ below~right ] at (#1) {#2}; }
+ { l } { \node [ left ] at (#1) {#2}; }
+ { r } { \node [ right ] at (#1) {#2}; }
+ { a } { \node [ above ] at (#1) {#2}; }
+ { b } { \node [ below ] at (#1) {#2}; }
+ }
+ {
+ \node [#3] at (#1) {#2};
+ }
+}
+
+% \xtActionLabel (with abbreviations)
+\NewDocumentCommand\xtActionLabel{ r() r() m O{} }
+{
+ \str_case_x:nnF { #4 }
+ {
+ { al } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$)
+ [above~left,xshift=\istactionlabelxshift,yshift=-\istactionlabelyshift,black] { $#3$ }; }
+ { ar } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$)
+ [above~right,xshift=-\istactionlabelxshift,yshift=-\istactionlabelyshift,black] { $#3$} ; }
+ { bl } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$)
+ [below~left,xshift=\istactionlabelxshift,yshift=\istactionlabelyshift,black] { $#3$ }; }
+ { br } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$)
+ [below~right,xshift=-\istactionlabelxshift,yshift=\istactionlabelyshift,black] { $#3$ }; }
+ { l } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$) [left,xshift=-\xtALxShift,black] { $#3$ }; }
+ { r } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$) [right,xshift=\xtALxShift,black] { $#3$ }; }
+ { a } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$) [above,yshift=\xtALyShift,black] { $#3$ }; }
+ { b } { \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$) [below,yshift=-\xtALyShift,black] { $#3$ }; }
+ }
+ {
+ \draw [draw=none] (#1) to (#2) node at ($(#1)!.5!(#2)$) [#4] ~{ $#3$ };
+ }
+}
+
+% \xtPayoff (with abbreviations)
+\NewDocumentCommand\xtPayoff{ r() m O{below} }
+{
+ \str_case_x:nnF { #3 }
+ {
+ { al } { \node [ above~left ] at (#1) {$#2$}; }
+ { ar } { \node [ above~right ] at (#1) {$#2$}; }
+ { bl } { \node [ below~left ] at (#1) {$#2$}; }
+ { br } { \node [ below~right ] at (#1) {$#2$}; }
+ { l } { \node [ left ] at (#1) {$#2$}; }
+ { r } { \node [ right ] at (#1) {$#2$}; }
+ { a } { \node [ above ] at (#1) {$#2$}; }
+ { b } { \node [ below ] at (#1) {$#2$}; }
+ }
+ {
+ \node [#3] at (#1) {$#2$};
+ }
+}
+
+
+%% \xtNode(*)
+\NewDocumentCommand\xtNode{ s O{} r() O{} G{} }
+{\IfBooleanTF #1
+ {
+ \istrooto (#3) (#3) [plain~node] {#5} \endist
+ }
+ {
+ \node [-,#2] at (#3) [solid~node,#4] {#5};
+ }
+}
+
+\ExplSyntaxOff
+
+\endinput \ No newline at end of file