%
% CoDi: Commutative Diagrams for TeX
% Copyright (c) 2015-2024 Paolo Brasolin <
[email protected]>
% SPDX-License-Identifier: MIT
%
% This file is part of CoDi 1.1.2, released on 2024/04/22 under MIT license.
%
% ράμμα • (rámma)
% 1. suture
% 2. catgut
% 3. stitch
% Ramma ties together the lower level libraries to define
% the user level functionality. NOTE: strictly no aesthetics, see mandyas.
\usetikzlibrary[commutative-diagrams.bapto]
\usetikzlibrary[commutative-diagrams.ektropi]
\usetikzlibrary[commutative-diagrams.katharizo]
\usetikzlibrary[commutative-diagrams.koinos]
\usetikzlibrary[commutative-diagrams.ozos]
\usetikzlibrary[commutative-diagrams.mitra]
\usetikzlibrary[commutative-diagrams.velos]
%==[ core concept ]=============================================================
\pgfqkeys{/codi}{% TODO: is this the best scope to put the key into?
self naming/.style={
/tikz/node contents/.forward to=/bapto/input,
/bapto/trigger/.forward to=/katharizo/input,
/katharizo/output/.forward to=/bapto/dispatcher
}
}
%==[ baseline setup ]===========================================================
% Some mischief with handlers and baseline math/labeling functionality.
\pgfqkeys{/codi}{
.search also=/bapto,
.search also=/katharizo,
every thing/.style={
/ektropi/restore,
/ektropi/add=/codi,
/ektropi/add=/bapto,
/ektropi/add=/katharizo
},
every diagram/.style={% NOTE: restore hopefully unnecessary
/codi/every thing,
/ektropi/add=/codi/diagrams
},
every layout/.style={% NOTE: restore actually unnecessary
/codi/every thing,
/ektropi/add=/codi/layouts,
/mitra/every node/.append style={/codi/every object}
},
every object/.style={% NOTE: needed when inside matrices
/codi/every thing,
/ektropi/add=/codi/objects,
execute at begin node=$,%
execute at end node=$,%
/codi/self naming
},
every arrow/.style={% NOTE: restore unnecessary
/codi/every thing,
/ektropi/add=/codi/arrows
},
every label/.style={% NOTE: restore needed because inside edge
/codi/every thing,
/ektropi/add=/codi/labels,
execute at begin node=$,%
execute at end node=$,%
/codi/self naming
}
}
% The user level keys are bound to the underlying parsers.
\pgfkeys{
/mitra/every matrix/.append style=/codi/every layout,
/ozos/every node/.append style=/codi/every object,
/velos/every path/.append style={
/tikz/every edge/.append style=/codi/every arrow,
/tikz/every edge quotes/.append style=/codi/every label
}
}
% I merge the macro syntax for objects and matrices. Convenient!
\newif\ifkDRammaObjIsMatrix
\def\kDRammaObjDecideWhetherIsMatrixThen#1{%
\def\kDRammaObjDWIM{\kDRammaObjDWIMSightThen{\kDRammaObjDWIMGobThen{#1}}}%
\expandafter\kDRammaObjDWIM\the\kDGrpTok\\\kD}
\def\kDRammaObjDWIMSightThen#1#2\\%
{\kDIfNextHardCh\kD
{\kDRammaObjIsMatrixfalse#1}%
{\kDRammaObjIsMatrixtrue#1}}
\def\kDRammaObjDWIMGobThen#1#2\kD{#1}
\def\kDRammaObjOutput
{\ifkDRammaObjIsMatrix
\kDMitraParseMatrixTableThen\kDMitraOutput\else
\kDOzosOutput\fi}
\def\kDRammaObj
{\kDFetchOptAndGrpThen
{\kDRammaObjDecideWhetherIsMatrixThen
\kDRammaObjOutput}}
% Just an identity.
\let\kDRammaMor\kDVelos
%==[ TikZ/pgf layer ]===========================================================
% I envelope the CoDi main macros in a simple key for maximal flexibility.
\tikzset{
codi/.code={%
\ifConTeXt\catcode`\|=12\fi% TODO: is it sufficient? investigate
\let\obj\kDRammaObj
\let\mor\kDRammaMor
},
codi/.append style={/codi/every diagram}
}
%==[ main macro ]===============================================================
\def\kDRamma
{\kDRammaMaybeFetchOptionsThen
\kDRammaOutput}
\let\kDRammaOpen\kDRamma
\let\kDRammaShut\endtikzpicture
%==[ fetching routine ]=========================================================
\newtoks\kDRammaOptTok
\newtoks\kDRammaTmpTok
\def\kDRammaMaybeFetchOptionsThen#1{%
\kDRammaOptTok={}%
\kDIfNextHardCh[%
{\kDRammaFetchOptionsThen{#1}}%
{#1}}
\def\kDRammaFetchOptionsThen#1[#2]{\kDRammaOptTok={#2}#1}
%==[ output routine ]===========================================================
\def\kDRammaOutput{%
\edef\kDAct{%
\noexpand\kDRammaTmpTok={%
\noexpand\tikzpicture[codi, \the\kDRammaOptTok]}}%
\kDAct
\the\kDRammaTmpTok}