diff options
Diffstat (limited to 'graphics/pgf/contrib/commutative-diagrams/tikzlibrarycommutative-diagrams.koinos.code.tex')
-rw-r--r-- | graphics/pgf/contrib/commutative-diagrams/tikzlibrarycommutative-diagrams.koinos.code.tex | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/graphics/pgf/contrib/commutative-diagrams/tikzlibrarycommutative-diagrams.koinos.code.tex b/graphics/pgf/contrib/commutative-diagrams/tikzlibrarycommutative-diagrams.koinos.code.tex new file mode 100644 index 0000000000..c2b378f38a --- /dev/null +++ b/graphics/pgf/contrib/commutative-diagrams/tikzlibrarycommutative-diagrams.koinos.code.tex @@ -0,0 +1,168 @@ +% +% 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. +% + +% κοινός • (koinós) +% 1. shared +% 2. common +% 3. public + +% Koinos implements or aliases commonplace macros. + +%==[ catcode manipulation ]===================================================== + +\newcount\kDEscapecharCounter + +\def\kDEscapecharDisable{\kDEscapecharCounter\escapechar \escapechar=-1} +\def\kDEscapecharEnable{\escapechar\kDEscapecharCounter} + +\def\kDStoreCatcodeOf#1% + {\kDEscapecharDisable + \expandafter\edef\csname kDRestoreCatcodeOf\string#1\endcsname{\catcode`\string#1=\the\catcode\expandafter`\string#1}% + % NOTE: setting a default catcode is disabled; might come in handy someday, though. + % \catcode\expandafter`\string#1=12\relax + \kDEscapecharEnable} + +\def\kDRestoreCatcodeOf#1% + {\kDEscapecharDisable + \csname kDRestoreCatcodeOf\string#1\endcsname + \kDEscapecharEnable} + +%==[ forward checks and gobbling ]============================================== + +% This macro is the blank space token. +\bgroup +\def\:{\global\let\kDBlankSpace= }\: +\egroup + +% Save catcode of @ to restore it later. +\kDStoreCatcodeOf @ +\catcode`@=11\relax + +% The next two macros both implement token gobbling. + +% This "hard" version gobbles any token, ignoring whitespace. +\let\kDGobbleHardTok\pgfutil@gobble + +% This "soft" version gobbles only whitespace. +% NOTE: this is just the identity macro. Fun fact. +\def\kDGobbleSoftTok#1{#1} + +% The next two macros both implement the following logical condition: +% if next token is #1 then #2 else #3 + +% This "hard" version ignores whitespace. +\let\kDIfNextHardCh\pgfutil@ifnextchar + +% This "soft" version does not ignore whitespace. +\long\def\kDIfNextSoftCh#1#2#3{% + \let\kDINCToken= #1% <- MEMO: this space is crucial + \def\kDINCTrue{#2}\def\kDINCFalse{#3}% + \futurelet\kDINCTok\kDINC} + +\def\kDINC{\ifx\kDINCTok\kDINCToken\let\kDINCFalse\kDINCTrue\fi\kDINCFalse} + +% Restore catcode of @. +\kDRestoreCatcodeOf @ + +%==[ token lists parsing and manipulation ]===================================== + +% This macro appends token list #1 to token list #2. +\def\kDAppend#1#2{\edef\kDAct{\noexpand#2={\the#2\the#1}}\kDAct} + +% This macro tokenizes the stream into \kDOptTok +% until a group preceeding a ';' character is found; +% then it puts the group into \kDGrpTok and gobbles the ';'. +\def\kDFetchOptAndGrpThen#1% + {\kDOptTok={}\kDGrpTok={}\kDFetchTilGrpThen{#1}} + +\newtoks\kDOptTok +\newtoks\kDGrpTok + +\def\kDFetchGrpThen#1#2{% + \def\kDExit{#1}% + \def\kDLoop{\kDFetchTilGrpThen{#1}}% + \kDTmpTok={{#2}}% + \kDIfNextHardCh; + {\kDGrpTok\the\kDTmpTok\expandafter\kDExit\kDGobbleHardTok} + {\kDAppend\kDTmpTok\kDOptTok\kDLoop}} + +\newtoks\kDTmpTok + +\def\kDFetchTilGrpThen#1#2#{% + \kDTmpTok={#2}% + \kDAppend\kDTmpTok\kDOptTok + \kDFetchGrpThen{#1}} + +% This macro removes trailing whitespace from token list #1. +\def\kDTrimTrailingSpace#1{% + \kDDetectTrailingSpace#1 + \ifkDDTSHasTrail + \def\kDRTS##1 \kD{#1={##1}}% + \edef\kDRTSAct{\noexpand\kDRTS\the#1\noexpand\kD} + \kDRTSAct + \fi} + +\def\kDDetectTrailingSpace#1{% + \kDDTSPrevSpacefalse + \edef\kDAct{\noexpand\kDDTSGob\the#1\noexpand\kD}% + \kDAct} + +\newif\ifkDDTSHasTrail + +\def\kDDTSGob% + {\kDIfNextSoftCh\kD + {\message{A}\ifkDDTSPrevSpace\kDDTSHasTrailtrue\else\kDDTSHasTrailfalse\fi\kDGobbleHardTok} + {\message{B}\kDIfNextSoftCh\kDBlankSpace + {\message{Y}\kDDTSPrevSpacetrue\expandafter\kDDTSGob\kDGobbleSoftTok} + {\message{N}\kDDTSPrevSpacefalse\expandafter\kDDTSGob\kDGobbleHardTok}}} + +\newif\ifkDDTSPrevSpace + +% This macro removes leading whitespace from token list #1. +\def\kDTrimLeadingSpace#1{% + \def\kDAct##1\kD{#1={##1}}% + \expandafter\kDGobbleSpaceThen + \expandafter\kDAct\the#1\kD} + +\def\kDGobbleSpaceThen#1% + {\kDIfNextHardCh\bgroup + {\kDGSGroupThen#1} + {\kDGSOtherThen#1}} + +\def\kDGSGroupThen#1#2{#1{#2}} + +\def\kDGSOtherThen#1#2{#1#2} + +%==[ environment checks ]======================================================= + +\newif\ifConTeXt +% Trick stolen from iftex. The second line is expanded inside the group so +% the global scope isn't polluted by \csname defining the token. +\begingroup\expandafter\expandafter\expandafter\endgroup\expandafter + \ifx\csname starttext\endcsname\relax\ConTeXtfalse\else\ConTeXttrue\fi + +%==[ dumping, debugging and testing ]=========================================== + +% macros for dumping, debugging and testing +% TODO: not sure I want to depend on these being in the sourcecode instead of +% some external package integrated with a TeX unit testing suite. +% I'll work in that direction. + +\newif\ifkDDumping +\kDDumpingfalse + +\newwrite\kDDumpFile + +\def\kDDumpOpen% +{\ifkDDumping\immediate\openout\kDDumpFile=\jobname.yml\fi} + +\def\kDDump#1% +{\ifkDDumping\immediate\write\kDDumpFile{#1}\fi} + +\def\kDDumpClose% +{\ifkDDumping\closeout\kDDumpFile\fi} |