\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{causets}[2023/03/06 v1.4 Package to draw causal set diagrams] %% Copyright 2020-2023 by C. Minz % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this licence or (at your option) any later version. % The latest version of this licence is in % http://www.latex-project.org/lppl.txt % % This work has the LPPL maintenance status "maintained". % % The current version of this package is 1.4. % % The current maintainer of this work is C. Minz. % https://github.com/c-minz % % This work consists of the files causets.sty, causets.tex, % causets.pdf, causet_tikz_example1.tex, causet_tikz_example1.pdf, % causet_tikz_example2.tex, causet_tikz_example2.pdf \RequirePackage{tikz} \usepgflibrary{arrows.meta} %% PGF keys and style macros: \def\tikzcausetsset#1{\pgfqkeys{/tikz/causets}{#1}} \pgfkeys{/tikz/causets/.search also={/tikz}} % Size options: \tikzcausetsset{% size unit/.store in=\causetTileSize, size unit/.value required, tile size/.store in=\causetTileSize, tile size/.value required, text font/.store in=\causetTextFont, text font/.value required, text scale/.store in=\causetTextScale, text scale/.value required, region line width/.initial=0.07*\causetTileSize, grid line width/.initial=0.04*\causetTileSize, event size/.initial=0.56*\causetTileSize, event outline/.initial=0.04*\causetTileSize, link width/.initial=0.14*\causetTileSize, broken link gap/.initial=0.42*\causetTileSize, tiny/.value forbidden, tiny/.style={% size unit=0.30ex, text font=\tiny, text scale=0.30}, very small/.value forbidden, very small/.style={% size unit=0.40ex, text font=\tiny, text scale=0.40}, small/.value forbidden, small/.style={% size unit=0.60ex, text font=\scriptsize, text scale=0.43}, normal/.value forbidden, normal/.style={% size unit=0.90ex, text font=\footnotesize, text scale=0.56}, large/.value forbidden, large/.style={% size unit=1.35ex, text font=\small, text scale=0.75}, very large/.value forbidden, very large/.style={% size unit=2.025ex, text font=\normalsize, text scale=1.02}, huge/.value forbidden, huge/.style={% size unit=2.70ex, text font=\Large, text scale=0.97} } % Colour options: \tikzcausetsset{% region color/.initial=black!75, grid color/.initial=black!25, tile color/.initial=black!10!white, event color/.initial=black, label color/.initial=black, link color/.initial=black!65!white, spatial link color/.initial=black!50!white, ulabel color/.initial=black!65!white, vlabel color/.initial=black!65!white, black colors/.style={% region color=black, grid color=black, tile color=white, event color=black, label color=black, link color=black, spatial link color=black, ulabel color=black, vlabel color=black}, gray colors/.style={% region color=black!75, grid color=black!25, tile color=black!10!white, event color=black, label color=black, link color=black!65!white, spatial link color=black!50!white, ulabel color=black!65!white, vlabel color=black!65!white}, blue colors/.style={% region color=black!75, grid color=black!25, tile color=cyan!25!black!25!white, event color=blue!50!black, label color=blue!50!black, link color=cyan!75!black, spatial link color=blue!75!white, ulabel color=black!50, vlabel color=black!50}, neon colors/.style={% region color=green, grid color=green, tile color=yellow, event color=blue, label color=blue, link color=cyan, spatial link color=red, ulabel color=magenta, vlabel color=magenta} } % Causet modification options: \tikzcausetsset{% padding/.store in=\causets@Padding, offset/.store in=\causet@Offset, every causet/.value forbidden, every causet/.style={baseline=(baseline point)}, local style/.style={#1}, set local style/.style={local style/.expand once={#1}} } % Graphic component switches: \newif\ifcausetsDrawPermutation \newif\ifcausetsDrawLinks \newif\ifcausetsBreakLinks \newif\ifcausetsDrawSpatialLinks \newif\ifcausetsDrawLabels \newif\ifcausetsDrawULabels \newif\ifcausetsDrawVLabels \tikzcausetsset{% show permutation/.is if=causetsDrawPermutation, show links/.is if=causetsDrawLinks, break links/.is if=causetsBreakLinks, show spatial links/.is if=causetsDrawSpatialLinks, show labels/.is if=causetsDrawLabels, show ulabels/.is if=causetsDrawULabels, show vlabels/.is if=causetsDrawVLabels, permutation/.code={\causetsDrawPermutationtrue}, linked/.code={\causetsDrawLinkstrue}, unlinked/.code={\causetsDrawLinksfalse}, brokenly linked/.code={\causetsBreakLinkstrue}, continuously linked/.code={\causetsBreakLinksfalse}, spatially linked/.code={\causetsDrawSpatialLinkstrue}, spatially unlinked/.code={\causetsDrawSpatialLinksfalse}, labeled/.code={\causetsDrawLabelstrue}, unlabeled/.code={\causetsDrawLabelsfalse}, labeled u/.code={\causetsDrawULabelstrue}, unlabeled u/.code={\causetsDrawULabelsfalse}, labeled v/.code={\causetsDrawVLabelstrue}, unlabeled v/.code={\causetsDrawVLabelsfalse} } % Permutation grid styles: \tikzcausetsset{% every region/.value forbidden, every region/.style={color=\pgfkeysvalueof{/tikz/causets/region color}, line width=\pgfkeysvalueof{/tikz/causets/region line width}}, region/.style={show permutation, every region/.append style={#1}}, every grid/.value forbidden, every grid/.style={color=\pgfkeysvalueof{/tikz/causets/grid color}, line width=\pgfkeysvalueof{/tikz/causets/grid line width}, step=\causetTileSize}, grid/.style={show permutation, every grid/.append style={#1}}, every tile/.value forbidden, every tile/.style={color=\pgfkeysvalueof{/tikz/causets/tile color}, line width=\pgfkeysvalueof{/tikz/causets/grid line width}, fill}, tiles/.style={show permutation, every tile/.append style={#1}} } % Label styles: \tikzcausetsset{% every label base/.value forbidden, every label base/.style={text opacity=1, scale=\causetTextScale, font=\causetTextFont, inner sep=0pt}, all labels/.style={every label base/.append style={#1}}, every label/.value forbidden, every label/.style={every label base, color=\pgfkeysvalueof{/tikz/causets/label color}, below left, at=south west}, labels/.style={show labels, every label/.append style={#1}}, every ulabel/.value forbidden, every ulabel/.style={every label base, color=\pgfkeysvalueof{/tikz/causets/ulabel color}, right, rotate=-45, inner sep=1pt, align=left}, ulabels/.style={show ulabels, every ulabel/.append style={#1}}, every vlabel/.value forbidden, every vlabel/.style={every label base, color=\pgfkeysvalueof{/tikz/causets/vlabel color}, left, rotate=45, inner sep=1pt, align=right}, vlabels/.style={show vlabels, every vlabel/.append style={#1}}, every replaced label/.value forbidden, every replaced label/.style={every label}, replaced labels/.style={every replaced label/.append style={#1}}, at/.initial=center, label/.store in=\causet@EventLabel, label/.value required } % Event styles: \tikzcausetsset{% every event/.value forbidden, every event/.style={color=\pgfkeysvalueof{/tikz/causets/event color}, circle, fill, inner sep=0pt, minimum size=\pgfkeysvalueof{/tikz/causets/event size}, line width=\pgfkeysvalueof{/tikz/causets/event outline}}, events/.value required, events/.style={every event/.append style={#1}}, every replaced event/.value forbidden, every replaced event/.style={every label base, circle, minimum size=\pgfkeysvalueof{/tikz/causets/event size}}, replaced events/.value required, replaced events/.style={every replaced event/.append style={#1}}, event/.store in=\causet@EventText, event/.value required } % Link styles: \tikzcausetsset{% Link Start/.tip={}, Link Pause/.tip={Triangle Cap[] . Fast Triangle[] . Fast Triangle[]}, Link Resume/.tip={Triangle Cap[reversed] . Fast Triangle[reversed] . Fast Triangle[reversed]}, Link End/.tip={}, every link/.value forbidden, every link/.style={color=\pgfkeysvalueof{/tikz/causets/link color}, line width=\pgfkeysvalueof{/tikz/causets/link width}, {Link Start[]}-{Link End[]}}, links/.style={show links, every link/.append style={#1}}, link starts/.value required, link starts/.style={Link Start/.tip={#1}}, link pauses/.value required, link pauses/.style={Link Pause/.tip={#1}}, link resumes/.value required, link resumes/.style={Link Resume/.tip={#1}}, link ends/.value required, link ends/.style={Link End/.tip={#1}}, cap links/.value forbidden, cap links/.style={link starts={Triangle Cap[reversed]}, link ends={Triangle Cap[]}}, arrow links/.value forbidden, arrow links/.style={link ends={Stealth[round, length=4*\pgfkeysvalueof{/tikz/causets/link width}, line width=\pgfkeysvalueof{/tikz/causets/link width}/3]}}, every spatial link/.value forbidden, every spatial link/.style={every link, color=\pgfkeysvalueof{/tikz/causets/spatial link color}, dashed}, spatial links/.style={show spatial links, every spatial link/.append style={#1}} } % Causet externalisation: \newif\ifcausets@External \newif\ifcausetsNameExternal \tikzcausetsset{% name/.store in=\causet@Name, name prefix/.store in=\causets@NamePrefix, set prefix/.style={name prefix=#1, /tikz/external/prefix=#1}, name external/.is if=causetsNameExternal } %% Package options: \tikzcausetsset{normal, offset=0, padding=\thinspace, name prefix={./}} \causetsDrawLinkstrue \causetsBreakLinkstrue \causetsDrawULabelstrue \causetsDrawVLabelstrue \causets@Externalfalse \DeclareOption{tiny}{\tikzcausetsset{tiny}} \DeclareOption{smaller}{\tikzcausetsset{very small}} \DeclareOption{small}{\tikzcausetsset{small}} \DeclareOption{large}{\tikzcausetsset{large}} \DeclareOption{larger}{\tikzcausetsset{very large}} \DeclareOption{huge}{\tikzcausetsset{huge}} \DeclareOption{gray}{\tikzcausetsset{gray colors}} \DeclareOption{black}{\tikzcausetsset{black colors}} \DeclareOption{blue}{\tikzcausetsset{blue colors}} \DeclareOption{neon}{\tikzcausetsset{neon colors}} \DeclareOption{linked}{\causetsDrawLinkstrue} \DeclareOption{unlinked}{\causetsDrawLinksfalse} \DeclareOption{caps}{\tikzcausetsset{cap links}} \DeclareOption{arrows}{\tikzcausetsset{arrow links}} \DeclareOption{continuous}{\causetsBreakLinksfalse} \DeclareOption{spatial}{\causetsDrawSpatialLinkstrue} \DeclareOption{permutation}{\causetsDrawPermutationtrue} \DeclareOption{labeled}{\causetsDrawLabelstrue} \DeclareOption{unlabeled}{\causetsDrawLabelsfalse} \DeclareOption{ulabeled}{\causetsDrawULabelstrue} \DeclareOption{uunlabeled}{\causetsDrawULabelsfalse} \DeclareOption{vlabeled}{\causetsDrawVLabelstrue} \DeclareOption{vunlabeled}{\causetsDrawVLabelsfalse} \DeclareOption{external}{\causets@Externaltrue} \DeclareOption*{\PackageWarning{causets}{The package causets does not support the option: \CurrentOption}} \ProcessOptions* \ifcausets@External \usetikzlibrary{external}% \tikzcausetsset{name prefix=causets/, name external=true}% \tikzexternalize[prefix=causets/] \fi %% Package functions: \newif\ifcauset@ItemFoundInList \newcommand*{\causets@setCausetName}[1]{% {% \def\causet@Name{}% \tikzcausetsset{#1}% \ifx\causet@Name\empty% \relax% \else% \expandafter\tikzsetnextfilename\expandafter{\causet@Name}% \fi% }% } \newcommand*{\causets@prepareCauset}[1]{% % Count the number of events (\causet@N), find the minimal value in the list % argument (\causet@Start), and define baseline point. \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \ifnum\causet@i=1 \pgfmathparse{int(\causet@E@i)} \else \pgfmathparse{int(min(\causet@Start, \causet@E@i))} \fi \xdef\causet@Start{\pgfmathresult} \xdef\causet@N{\causet@i} } \pgfmathsetmacro\causet@Start{int(\causet@Start + \causet@Offset)} \coordinate (baseline point) at (0, -0.707*\causetTileSize); } \newcommand*{\causets@drawEvent}[2][every event]{% % Draws an event tile and the event on top. \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} \pgfmathsetmacro\causet@u{\causet@E@i - \causet@Start} \pgfmathsetmacro\causet@v{\causet@i - 1.0} \ifcausetsDrawPermutation \path[causets/.cd, every tile] ( \causet@u * \causetTileSize, \causet@v * \causetTileSize ) rectangle +( \causetTileSize, \causetTileSize ); \fi \pgfmathsetmacro\causet@u{\causet@E@i - \causet@Start + 0.5} \pgfmathsetmacro\causet@v{\causet@i - 0.5} \node[causets/.cd, #1] (E\causet@E@i) at ( \causet@u * \causetTileSize, \causet@v * \causetTileSize ) {#2}; } \newcommand*{\causets@drawEvents}[1]{% % Draws a permutation tile and defines and draws an event node (E#) on top of % the tile, for each event number # in the list argument. \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \ifx\causet@E@i\causet@LocalStyle \causets@drawEvent{} \else \def\causet@EventText{} \tikzcausetsset{set local style=\causet@LocalStyle} \ifx\causet@EventText\empty \causets@drawEvent[every event, set local style=\causet@LocalStyle]{} \else \causets@drawEvent[every replaced event, set local style=\causet@LocalStyle]{\causet@EventText} \fi \fi } } \newcommand*{\causets@drawPermutation}[1]{% % Draws the permutation grid and adds the u- and v-coordinate labels. \ifcausetsDrawPermutation \draw[causets/.cd, every grid] ( 0, 0 ) grid ( \causet@N * \causetTileSize, \causet@N * \causetTileSize ); \draw[causets/.cd, every region] ( 0, 0 ) rectangle ( \causet@N * \causetTileSize, \causet@N * \causetTileSize ); \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} \ifcausetsDrawULabels \pgfmathsetmacro\causet@u{int(\causet@i + \causet@Start - 1)} \node[causets/.cd, every ulabel] (EUL\causet@E@i) at ( \causet@i * \causetTileSize - 0.5 * \causetTileSize, 0 ) {\causet@u}; \fi \ifcausetsDrawVLabels \node[causets/.cd, every vlabel] (EVL\causet@E@i) at ( 0, \causet@i * \causetTileSize - 0.5 * \causetTileSize ) {\causet@E@i}; \fi } \fi } \newcommand*{\causets@drawSpatialLinks}[1]{% % Draws the spatial links between the events (only for \drawpcauset and % \drawrcauset). \ifcausetsDrawSpatialLinks \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} % \causet@Bound stores the lower bound to find spatially linked events. \edef\causet@Bound{\causet@Offset} \foreach \causet@E@j/\causet@LocalStyle [count=\causet@j] in {#1}{% \ifnum\causet@j>\causet@i \pgfmathsetmacro\causet@E@j{int(\causet@E@j + \causet@Offset)} \ifnum\causet@E@j>\causet@Bound \ifnum\causet@E@i>\causet@E@j % Add spatial link and remember new lower bound: \draw[causets/.cd, every spatial link] (E\causet@E@j) -- (E\causet@E@i); \xdef\causet@Bound{\causet@E@j} \fi \fi \fi } } \fi } \newcommand*{\causets@drawEventLabel}[2][every label]{% % Draws an event label. \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} \node[causets/.cd, #1] (EL\causet@E@i) at (E\causet@E@i.\pgfkeysvalueof{/tikz/causets/at}) {#2}; } \newcommand*{\causets@drawEventLabels}[1]{% % Adds event labels to the events. \foreach \causet@E@i/\causet@LocalStyle in {#1}{% \ifx\causet@E@i\causet@LocalStyle \ifcausetsDrawLabels \causets@drawEventLabel{\causet@E@i} \fi \else \def\causet@EventLabel{} \tikzcausetsset{set local style=\causet@LocalStyle} \ifx\causet@EventLabel\empty \ifcausetsDrawLabels \causets@drawEventLabel{\causet@E@i} \fi \else \causets@drawEventLabel[every replaced label]{\causet@EventLabel} \fi \fi } } \newcommand*{\causets@drawContinuousLinks}[2][]{% % Draws the links in full even if they cross over events. \foreach \causet@From/\causet@To/\causet@LocalLinkStyle in {#2}{% \ifx\causet@To\causet@LocalLinkStyle \gdef\causet@LocalLinkStyle{#1} \fi \pgfmathsetmacro\causet@From{int(\causet@From + \causet@Offset)} \pgfmathsetmacro\causet@To{int(\causet@To + \causet@Offset)} \draw[causets/.cd, every link, set local style=\causet@LocalLinkStyle] (E\causet@From) -- (E\causet@To); } } \newcommand*{\causets@drawBrokenLinks}[3][]{% % Tests every link if it crosses over an unlinked event and breaks the link. \foreach \causet@From/\causet@To/\causet@LocalLinkStyle in {#3}{% \ifx\causet@To\causet@LocalLinkStyle \gdef\causet@LocalLinkStyle{#1} \fi % In this function, \causet@u and \causet@v store the link distance in % the u- and in the v-direction, respectively. Since these are coordinate % differences, they are computed without adding the offset. \pgfmathsetmacro\causet@u{int(\causet@To) - int(\causet@From)} \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#2}{% \ifnum\causet@E@i=\causet@From \xdef\causet@v{\causet@i} \fi \ifnum\causet@E@i=\causet@To \pgfmathparse{int(\causet@i - \causet@v)} \xdef\causet@v{\pgfmathresult} \breakforeach \fi } % Now add offset to events: \pgfmathsetmacro\causet@From{int(\causet@From + \causet@Offset)} \pgfmathsetmacro\causet@To{int(\causet@To + \causet@Offset)} % In this function, \causet@E@j stores the last breaking point and % \causet@j the index of \causet@From. \pgfmathsetmacro\causet@E@j{int(\causet@From - 1)} \edef\causet@j{0} \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#2}{% \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} \ifnum\causet@E@i=\causet@To \edef\causet@j{0} \breakforeach \fi \ifnum\causet@j>0 % If the u-/v-coordinate ratio is the same, the event \causet@E@i falls % along the link and the link needs to break. The ratios are compared % via cross-multiplication, which is faster and does not cause % rounding errors: \pgfmathequal{int((\causet@E@i - \causet@From) * \causet@v)}{int(\causet@u * (\causet@i - \causet@j)))} \ifnum\pgfmathresult=1 \ifnum\causet@E@j<\causet@From % Link is crossing over another event, so draw the link up to the % (first) breaking point: \draw[causets/.cd, every link, {Link Start}-{Link Pause}, shorten >=\pgfkeysvalueof{/tikz/causets/broken link gap}, set local style=\causet@LocalLinkStyle] (E\causet@From) -- (E\causet@E@i); \else % Link is crossing over yet another event, so continue from last % breaking point to next breaking point: \draw[causets/.cd, every link, {Link Resume}-{Link Pause}, shorten <=\pgfkeysvalueof{/tikz/causets/broken link gap}, shorten >=\pgfkeysvalueof{/tikz/causets/broken link gap}, set local style=\causet@LocalLinkStyle] (E\causet@E@j) -- (E\causet@E@i); \fi \xdef\causet@E@j{\causet@E@i} \fi \fi \ifnum\causet@E@i=\causet@From \xdef\causet@j{\causet@i} \fi } \ifnum\causet@E@j>\causet@From % Link did cross over another event, so finish the link from last % breaking point to final event: \draw[causets/.cd, every link, {Link Resume}-{Link End}, shorten <=\pgfkeysvalueof{/tikz/causets/broken link gap}, set local style=\causet@LocalLinkStyle] (E\causet@E@j) -- (E\causet@To); \else % Link does not cross over another event, so just draw it: \draw[causets/.cd, every link, set local style=\causet@LocalLinkStyle] (E\causet@From) -- (E\causet@To); \fi } } \newcommand*{\drawpcauset}[1]{% % Draws a causet from a permutation. \causets@prepareCauset{#1} \begin{scope}[rotate=45] \begin{scope}[xshift=-\causet@N * \causetTileSize / 2, yshift=-\causet@N * \causetTileSize / 2] \causets@drawEvents{#1} \causets@drawPermutation{#1} \causets@drawSpatialLinks{#1} \ifcausetsDrawLinks \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} % \causet@Bound stores the upper bound to find linked events. \pgfmathsetmacro\causet@Bound{int(\causet@N + \causet@Start)} \foreach \causet@E@j/\causet@LocalStyle [count=\causet@j] in {#1}{% \ifnum\causet@j>\causet@i \pgfmathsetmacro\causet@E@j{int(\causet@E@j + \causet@Offset)} \ifnum\causet@E@j<\causet@Bound \ifnum\causet@E@i<\causet@E@j % Add link and remember new upper bound: \draw[causets/.cd, every link] (E\causet@E@i) -- (E\causet@E@j); \xdef\causet@Bound{\causet@E@j} \fi \fi \fi } } \fi \causets@drawEventLabels{#1} \end{scope} \end{scope} } \newcommand*{\drawcauset}[2]{% % Draws a causet from a permutation and a link-pair list. \causets@prepareCauset{#1} \begin{scope}[rotate=45] \begin{scope}[xshift=-\causet@N * \causetTileSize / 2, yshift=-\causet@N * \causetTileSize / 2] \causets@drawEvents{#1} \causets@drawPermutation{#1} \ifcausetsDrawLinks \ifcausetsBreakLinks \causets@drawBrokenLinks{#1}{#2} \else \causets@drawContinuousLinks{#2} \fi \fi \causets@drawEventLabels{#1} \end{scope} \end{scope} } \newcommand*{\drawrcauset}[2]{% % Draws a causet from a permutation and ignoring links given in the second % list argument (of link-pairs). \causets@prepareCauset{#1} \begin{scope}[rotate=45] \begin{scope}[xshift=-\causet@N * \causetTileSize / 2, yshift=-\causet@N * \causetTileSize / 2] \causets@drawEvents{#1} \causets@drawPermutation{#1} \causets@drawSpatialLinks{#1} % Add omitted links as spatial links: \ifcausetsDrawSpatialLinks \foreach \causet@From/\causet@To/\causet@LocalLinkStyle in {#2}{% \ifx\causet@To\causet@LocalLinkStyle \pgfmathsetmacro\causet@From{int(\causet@From + \causet@Offset)} \pgfmathsetmacro\causet@To{int(\causet@To + \causet@Offset)} \draw[causets/.cd, every spatial link] (E\causet@From) -- (E\causet@To); \fi } \fi \ifcausetsDrawLinks \foreach \causet@E@i/\causet@LocalStyle [count=\causet@i] in {#1}{% \pgfmathsetmacro\causet@E@i{int(\causet@E@i + \causet@Offset)} % \causet@Bound stores the upper bound to find linked events. \pgfmathsetmacro\causet@Bound{int(\causet@N + \causet@Start)} \foreach \causet@E@j/\causet@LocalStyle [count=\causet@j] in {#1}{% \ifnum\causet@j>\causet@i \pgfmathsetmacro\causet@E@j{int(\causet@E@j + \causet@Offset)} \ifnum\causet@E@j<\causet@Bound \ifnum\causet@E@i<\causet@E@j % Check second list argument if the link has to be ignored: \global\causet@ItemFoundInListfalse \foreach \causet@From/\causet@To/\causet@LocalLinkStyle in {#2}{% \pgfmathparse{and(int(\causet@From + \causet@Offset) == int(\causet@E@i), int(\causet@To + \causet@Offset) == int(\causet@E@j))} \ifnum\pgfmathresult=1 \global\causet@ItemFoundInListtrue \fi } \ifcauset@ItemFoundInList \relax% Skip link as it is included in the second argument. \else % Draw link as it is not included in the second argument: \draw[causets/.cd, every link] (E\causet@E@i) -- (E\causet@E@j); \fi % Remember new upper bound: \xdef\causet@Bound{\causet@E@j} \fi \fi \fi } } \ifcausetsBreakLinks \causets@drawBrokenLinks[draw=none]{#1}{#2} \else \causets@drawContinuousLinks[draw=none]{#2} \fi \fi \causets@drawEventLabels{#1} \end{scope} \end{scope} } \newcommand*{\pcauset}[2][]{% % Inserts a TikZ picture with a causet, created from a permutation. \causets@Padding% \ifcausetsNameExternal% \causets@setCausetName{#1}% \fi% \begin{tikzpicture}[causets/.cd, every causet, #1]% \drawpcauset{#2}% \end{tikzpicture}% \causets@Padding% } \newcommand*{\causet}[3][]{% % Inserts a TikZ picture with a causet, created from a permutation and a % link-pair list. \causets@Padding% \ifcausetsNameExternal% \causets@setCausetName{#1}% \fi% \begin{tikzpicture}[causets/.cd, every causet, #1]% \drawcauset{#2}{#3}% \end{tikzpicture}% \causets@Padding% } \newcommand*{\rcauset}[3][]{% % Inserts a TikZ picture with a causet, created from a permutation and a % link-pair list of links to remove. \causets@Padding% \ifcausetsNameExternal% \causets@setCausetName{#1}% \fi% \begin{tikzpicture}[causets/.cd, every causet, #1]% \drawrcauset{#2}{#3}% \end{tikzpicture}% \causets@Padding% } %% Short-hand functions and external causets: \newcommand*{\causetfile}[2][]{% \causets@Padding% \includegraphics[#1]{\causets@NamePrefix#2}% \causets@Padding% } \newcommand*{\pcausetP}[2][]{% {\causetsDrawPermutationtrue\causetsDrawLabelsfalse\pcauset[#1]{#2}}} \newcommand*{\pcausetL}[2][]{% {\causetsDrawPermutationfalse\causetsDrawLabelstrue\pcauset[#1]{#2}}} \newcommand*{\pcausetX}[2][]{% {\causetsDrawPermutationtrue\causetsDrawLabelstrue\pcauset[#1]{#2}}} \newcommand*{\causetP}[3][]{% {\causetsDrawPermutationtrue\causetsDrawLabelsfalse\causet[#1]{#2}{#3}}} \newcommand*{\causetL}[3][]{% {\causetsDrawPermutationfalse\causetsDrawLabelstrue\causet[#1]{#2}{#3}}} \newcommand*{\causetX}[3][]{% {\causetsDrawPermutationtrue\causetsDrawLabelstrue\causet[#1]{#2}{#3}}} \newcommand*{\rcausetP}[3][]{% {\causetsDrawPermutationtrue\causetsDrawLabelsfalse\rcauset[#1]{#2}{#3}}} \newcommand*{\rcausetL}[3][]{% {\causetsDrawPermutationfalse\causetsDrawLabelstrue\rcauset[#1]{#2}{#3}}} \newcommand*{\rcausetX}[3][]{% {\causetsDrawPermutationtrue\causetsDrawLabelstrue\rcauset[#1]{#2}{#3}}} \newcommand*{\causetFence}[2][]{% \ifcase#2% \or%=1 \pcauset[#1]{1,2}% \or%=2 \pcauset[#1]{3,1,4,2}% \or%=3 \pcauset[#1]{5,3,6,1,4,2}% \or%=4 \pcauset[#1]{7,5,8,3,6,1,4,2}% \or%=5 \pcauset[#1]{9,7,10,5,8,3,6,1,4,2}% \or%=6 \pcauset[#1]{11,9,12,7,10,5,8,3,6,1,4,2}% \or%=7 \pcauset[#1]{13,11,14,9,12,7,10,5,8,3,6,1,4,2}% \or%=8 \pcauset[#1]{15,13,16,11,14,9,12,7,10,5,8,3,6,1,4,2}% \or%=9 \pcauset[#1]{17,15,18,13,16,11,14,9,12,7,10,5,8,3,6,1,4,2}% \or%=10 \pcauset[#1]{19,17,20,15,18,13,16,11,14,9,12,7,10,5,8,3,6,1,4,2}% \fi% } \newcommand*{\causetCrown}[2][]{% \ifcase#2% \or%=1 \pcauset[#1]{1,2}% \or%=2 \pcauset[#1]{2,1,4,3}% \or%=3 \rcauset[#1]{4,2,6,1,5,3}{2/5}% \or%=4 \rcauset[#1]{6,4,8,2,7,1,5,3}{2/5,4/7}% \or%=5 \rcauset[#1]{8,6,10,4,9,2,7,1,5,3}{2/5,4/7,6/9}% \or%=6 \rcauset[#1]{10,8,12,6,11,4,9,2,7,1,5,3}{2/5,4/7,6/9,8/11}% \or%=7 \rcauset[#1]{12,10,14,8,13,6,11,4,9,2,7,1,5,3}{2/5,4/7,6/9,8/11,10/13}% \or%=8 \rcauset[#1]{14,12,16,10,15,8,13,6,11,4,9,2,7,1,5,3}{2/5,4/7,6/9,8/11,10/13,12/15}% \or%=9 \rcauset[#1]{16,14,18,12,17,10,15,8,13,6,11,4,9,2,7,1,5,3}{2/5,4/7,6/9,8/11,10/13,12/15,14/17}% \or%=10 \rcauset[#1]{18,16,20,14,19,12,17,10,15,8,13,6,11,4,9,2,7,1,5,3}{2/5,4/7,6/9,8/11,10/13,12/15,14/17,16/19}% \fi% }