summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex')
-rw-r--r--Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex207
1 files changed, 207 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex b/Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex
new file mode 100644
index 00000000000..211ade2f4c8
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/commutative-diagrams/tikzlibrarycommutative-diagrams.mitra.code.tex
@@ -0,0 +1,207 @@
+%
+% CoDi: Commutative Diagrams for TeX
+% Copyright (c) 2015-2020 Paolo Brasolin <paolo.brasolin@gmail.com>
+% SPDX-License-Identifier: MIT
+%
+% This file is part of CoDi 1.0.0, released on 2020/06/06 under MIT license.
+%
+
+% μήτρα • (mítra)
+% 1. womb
+% 2. matrix
+% 3. mold
+
+% Mitra is an alternative parsing mechanism for TiKz matrices of nodes.
+% It couples with ozos to ensure the node contents always pass through the TikZ key.
+
+\usetikzlibrary{matrix}
+\usetikzlibrary{commutative-diagrams.koinos}
+
+%==[ TikZ/pgf layer ]===========================================================
+
+\pgfkeys{
+ /mitra/every node/.style={},
+ /mitra/every matrix/.style={
+ /tikz/matrix,
+ /tikz/cells={
+ /tikz/anchor=base
+ }
+ },
+ % NOTE: the alias key *cannot* be put along with global node styles
+ % because of execution order.
+ /mitra/matrix coordinates alias/.style={
+ /tikz/alias=\tikzmatrixname-\the\pgfmatrixcurrentrow-\the\pgfmatrixcurrentcolumn
+ }
+}
+
+%==[ main macro ]===============================================================
+
+\def\kDMitra
+ {\kDMitraFetchMatrixThen
+ {\kDMitraParseMatrixTableThen
+ \kDMitraOutput}}
+
+% General purpose scratch register.
+\newtoks\kDMitraTmpTok
+
+%==[ fetching routine ]=========================================================
+
+% I use the general one implemented by koinos.
+\let\kDMitraFetchMatrixThen\kDFetchOptAndGrpThen
+
+%==[ parsing routine: /table ]==================================================
+
+\newtoks\kDMitraMatOutTok
+
+\def\kDMitraParseMatrixTableThen#1{%
+ \kDMitraMatOutTok={}%
+ \expandafter\kDMitraParseTable\the\kDGrpTok\kD
+ #1}
+
+\def\kDMitraParseTable
+ {\kDMitraParseAllRowsThen\relax}
+
+\def\kDMitraParseAllRowsThen#1{%
+ \def\kDExit{#1}%
+ \kDIfNextHardCh\kD
+ {\expandafter\kDExit\kDGobbleHardTok}%
+ {\kDMitraParseOneRowThen{\kDMitraParseAllRowsThen{#1}}}}
+
+%==[ parsing routine: /table/row ]==============================================
+
+\def\kDMitraParseOneRowThen#1%
+ {\kDMitraMarkRowEndBefore
+ {\kDMitraParseAllColsThen
+ {\kDMitraParseRowEndThen
+ {#1}}}}
+
+\kDStoreCatcodeOf &
+\ifConTeXt\catcode`&=12\else\catcode`&=4\fi
+\def\kDMitraMarkRowEndBefore#1#2\\{#1#2&\kD\\}
+\kDRestoreCatcodeOf &
+
+\def\kDMitraParseAllColsThen#1{%
+ \def\kDExit{#1}%
+ \kDIfNextHardCh\kD
+ {\expandafter\kDExit\kDGobbleHardTok}%
+ {\kDMitraParseOneColThen{\kDMitraParseAllColsThen{#1}}}}
+
+\def\kDMitraParseRowEndThen#1%
+ {\kDMitraFetchRowEndThen
+ {\kDMitraPrintRowEndThen
+ {#1}}}
+
+\def\kDMitraFetchRowEndThen#1\\{\kDMitraMaybeFetchRowOptionsThen{#1}}
+
+\newtoks\kDMitraRowOptTok
+
+\def\kDMitraPrintRowEndThen#1{%
+ \edef\kDAct{\noexpand\kDMitraTmpTok={\noexpand\\\the\kDMitraRowOptTok}}%
+ \kDAct
+ \kDAppend\kDMitraTmpTok\kDMitraMatOutTok
+ #1}
+
+\def\kDMitraMaybeFetchRowOptionsThen#1{%
+ \kDMitraRowOptTok={}%
+ \kDIfNextHardCh[%
+ {\kDMitraFetchRowOptionsThen{#1}}%
+ {#1}}
+
+\def\kDMitraFetchRowOptionsThen#1[#2]{\kDMitraRowOptTok={[#2]}#1}
+
+%==[ parsing routine: /table/row/column ]=======================================
+
+\def\kDMitraParseOneColThen#1%
+ {\kDMitraParseCellThen
+ {\kDMitraParseColEndThen
+ {#1}}}
+
+\def\kDMitraParseColEndThen#1%
+ {\kDMitraMaybeFetchColOptionsThen
+ {\kDMitraMaybePrintColEndThen
+ {#1}}}
+
+\newtoks\kDMitraColOptTok
+
+\def\kDMitraMaybeFetchColOptionsThen#1{%
+ \kDMitraColOptTok={}%
+ \kDIfNextHardCh[%
+ {\kDMitraFetchColOptionsThen{#1}}%
+ {#1}}
+
+\def\kDMitraFetchColOptionsThen#1[#2]{\kDMitraColOptTok={[#2]}#1}
+
+\def\kDMitraMaybePrintColEndThen#1{%
+ \kDIfNextHardCh\kD
+ {#1}%
+ {% NOTE: we use \pgfmatrixnextcell instead of & to avoid catcode juggling
+ \edef\kDAct{\noexpand\kDMitraTmpTok={\noexpand\pgfmatrixnextcell\the\kDMitraColOptTok}}%
+ \kDAct
+ \kDAppend\kDMitraTmpTok\kDMitraMatOutTok
+ #1%
+ }}
+
+%==[ parsing routine: /table/row/column/cell ]==================================
+
+\def\kDMitraParseCellThen#1%
+ {\kDMitraMaybeFetchCellOptionsThen
+ {\kDMitraFetchCellContentThen
+ {\kDMitraPrintCellThen
+ {#1}}}}
+
+\newtoks\kDMitraCelOptTok
+
+\def\kDMitraMaybeFetchCellOptionsThen#1{%
+ \kDMitraCelOptTok={}%
+ \kDIfNextHardCh|%
+ {\kDMitraFetchCellOptionsThen{#1}}
+ {#1}}
+
+\def\kDMitraFetchCellOptionsThen#1|#2|{\kDMitraCelOptTok={#2}#1}
+
+\newtoks\kDMitraCelCntTok
+
+\kDStoreCatcodeOf &
+\ifConTeXt\catcode`&=12\else\catcode`&=4\fi
+\def\kDMitraFetchCellContentThen#1#2&{%
+ \kDMitraCelCntTok={#2}%
+ \kDTrimLeadingSpace\kDMitraCelCntTok
+ \kDTrimTrailingSpace\kDMitraCelCntTok
+ #1}
+\kDRestoreCatcodeOf &
+
+\def\kDMitraMaybeDoCellThen#1{%
+ \kDIfNextHardCh\kD
+ {#1}%
+ {\kDMitraParseOneColThen{#1}}}
+
+\def\kDMitraPrintCellThen#1{%
+ \edef\kDAct{%
+ \noexpand\kDMitraTmpTok={%
+ \noexpand\node
+ [/mitra/every node]
+ \the\kDMitraCelOptTok
+ [node contents={\the\kDMitraCelCntTok},/mitra/matrix coordinates alias];
+ \kDMitraMaybeDumpCell}}%
+ \kDAct
+ \kDAppend\kDMitraTmpTok\kDMitraMatOutTok
+ #1}
+
+%==[ dumping routine ]==========================================================
+
+\def\kDMitraMaybeDumpCell{\noexpand\pgfextra{%
+ \noexpand\kDDump{'\noexpand\the\noexpand\pgfmatrixcurrentrow-\noexpand\the\noexpand\pgfmatrixcurrentcolumn':}%
+ \noexpand\kDDump{\space\space options: '\the\kDMitraCelOptTok'}%
+ \noexpand\kDDump{\space\space content: '\the\kDMitraCelCntTok'}}}
+
+%==[ output routine ]===========================================================
+
+\def\kDMitraOutput{%
+ \edef\kDAct{%
+ \noexpand\kDMitraTmpTok={%
+ \noexpand\matrix
+ [/mitra/every matrix]%
+ \the\kDOptTok
+ {\the\kDMitraMatOutTok};}}%
+ \kDAct
+ \the\kDMitraTmpTok}