Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
% (find-angg "LATEX/2018dednat6-extras.tex") % (defun c () (interactive) (find-LATEXsh "lualatex -record 2018dednat6-extras.tex")) % (defun d () (interactive) (find-xpdfpage "~/LATEX/2018dednat6-extras.pdf")) % (defun e () (interactive) (find-LATEX "2018dednat6-extras.tex")) % (defun l () (interactive) (find-LATEX "2018tug-dednat6.lua")) % (defun u () (interactive) (find-latex-upload-links "2018dednat6-extras")) % (find-xpdfpage "~/LATEX/2018dednat6-extras.pdf") % (find-sh0 "cp -v ~/LATEX/2018dednat6-extras.pdf /tmp/") % (find-sh0 "cp -v ~/LATEX/2018dednat6-extras.pdf /tmp/pen/") % file:///home/edrx/LATEX/2018dednat6-extras.pdf % file:///tmp/2018dednat6-extras.pdf % file:///tmp/pen/2018dednat6-extras.pdf % http://angg.twu.net/LATEX/2018dednat6-extras.pdf % «.verbatim» (to "verbatim") % % «.title» (to "title") % «.what-is-this» (to "what-is-this") % «.downloading» (to "downloading") % «.dednat6.zip-test» (to "dednat6.zip-test") % «.preamble» (to "preamble") % «.tree-bars» (to "tree-bars") % «.tree-hacks» (to "tree-hacks") % «.abbrevs» (to "abbrevs") % «.renaming» (to "renaming") % «.arrow-modifiers» (to "arrow-modifiers") % «.strange-modules» (to "strange-modules") % «.barr» (to "barr") % «.a-few-samples» (to "a-few-samples") % «.repl» (to "repl") % «.other-back-ends» (to "other-back-ends") \documentclass[oneside]{article} \usepackage[colorlinks]{hyperref} % (find-es "tex" "hyperref") \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{pict2e} \usepackage{color} % (find-LATEX "edrx15.sty" "colors") \usepackage{colorweb} % (find-es "tex" "colorweb") %\usepackage{tikz} % % (find-dn6 "preamble6.lua" "preamble0") \usepackage{proof} % For derivation trees ("%:" lines) \input diagxy % For 2D diagrams ("%D" lines) \xyoption{curve} % For the ".curve=" feature in 2D diagrams \catcode`\^^J=10 % (find-es "luatex" "spurious-omega") \directlua{dofile "dednat6load.lua"} % (find-LATEX "dednat6load.lua") \def\expr#1{\directlua{output(tostring(#1))}} \def\eval#1{\directlua{#1}} % \usepackage{edrx15} % (find-angg "LATEX/edrx15.sty") \input edrxaccents.tex % (find-angg "LATEX/edrxaccents.tex") \input edrxchars.tex % (find-LATEX "edrxchars.tex") \input edrxheadfoot.tex % (find-dn4ex "edrxheadfoot.tex") \input edrxgac2.tex % (find-LATEX "edrxgac2.tex") % \begin{document} \catcode`\^^J=10 \directlua{dofile "edrxtikz.lua"} % (find-LATEX "edrxtikz.lua") \directlua{dofile "edrxpict.lua"} % (find-LATEX "edrxpict.lua") %L V.__tostring = function (v) return format("(%.3f,%.3f)", v[1], v[2]) end \def\ASCII{ASCII} % \co: a low-level way to typeset code; a poor man's "\verb" \def\co#1{{% \def\%{\char37}% \def\\{\char92}% \def\^{\char94}% \def\~{\char126}% \tt#1% }} \def\qco#1{`\co{#1}'} \def\qqco#1{``\co{#1}''} % «verbatim» (to ".verbatim") % (find-LATEX "2018tug-dednat6.tex" "verbatim") \directlua{dofile "2018tug-dednat6.lua"} % (find-LATEX "2018tug-dednat6.lua") \def\myhbox#1#2#3{\setbox0=\hbox{#3}\ht0=#1\dp0=#2\box0} \def\verbahbox#1{\myhbox{7pt}{2pt}{{\tt#1}}} \def\bgbox#1{\bgcolorhbox{YellowOrangeLight}{#1}} \def\bgcolorhbox#1#2{{% \setbox0\hbox{#2}% \setbox0\vbox{\vskip\fboxsep\box0\vskip\fboxsep}% \setbox0\hbox{\kern\fboxsep\box0\kern\fboxsep}% {\color{#1}{\smashedvrule{\wd0}{\ht0}{\dp0}}}% \box0% }} % \long\def\ColorRed #1{{\color{Red}#1}} \long\def\ColorViolet#1{{\color{MagentaVioletLight}#1}} \long\def\ColorGreen #1{{\color{SpringDarkHard}#1}} \long\def\ColorGreen #1{{\color{SpringGreenDark}#1}} \long\def\ColorGray #1{{\color{GrayLight}#1}} % \catcode`𝐚=13 \def𝐚{\color{SpringGreenDark}} \catcode`𝐛=13 \def𝐛{\color{black}} \catcode`𝐠=13 \def𝐠{\color{SpringGreenDark}} \catcode`𝐫=13 \def𝐫{\color{Red}} \catcode`𝐧=13 \def𝐧{\color{blue}} \catcode`𝐮=13 \def𝐮{\color{blue}} \catcode`𝐜=13 \def𝐜{\color{pink}} \catcode`𝐰=13 \def𝐰{\color{YellowOrangeLight}} \def\myvcenter#1{\begin{matrix}#1\end{matrix}} \catcode`\^^O=13 \def*{{\color{red}*}} % _____ _ _ _ % |_ _(_) |_| | ___ % | | | | __| |/ _ \ % | | | | |_| | __/ % |_| |_|\__|_|\___| % % «title» (to ".title") % (find-es "tex" "title") % (dnep 1) \title{Dednat6: Some Extra Features} \author{Eduardo Ochs} \maketitle % $$\bfig % \morphism(2400,0)|l|/{@{>}@`{c,(3000,0),(2700,2800),p}}/<-1200,2800>[A`B;ab] % \morphism(0,0)|l|/{@{>}@`{c,(3000,0),(2700,2800),p}}/<400,200>[C`D;cd] % \morphism(0,0)|l|/{@{>}@`{c,(1000,0),(600,200),p}}/<400,200>[C`D;cd] % \efig % $$ % % \end{document} % __ ___ _ _ _ _ _ % \ \ / / |__ __ _| |_ (_)___ | |_| |__ (_)___ % \ \ /\ / /| '_ \ / _` | __| | / __| | __| '_ \| / __| % \ V V / | | | | (_| | |_ | \__ \ | |_| | | | \__ \ % \_/\_/ |_| |_|\__,_|\__| |_|___/ \__|_| |_|_|___/ % % «what-is-this» (to ".what-is-this") % \section{What this document is} At this moment the documentation of Dednat6 consists of: \begin{itemize} \item An article about Dednat6 for TUGBoat, called ``Dednat6: An extensible (semi-)preprocessor for Lua\LaTeX\ that understands diagrams in \ASCII\ art'', that explains all the main concepts and how they are implemented. Link: \url{http://angg.twu.net/LATEX/2018tugboat-rev1.pdf} \item The slides for a presentation with the same title (on the TUG2018 conference). Link: \url{http://angg.twu.net/LATEX/2018tug-dednat6.pdf} \item {\sl This document}, that complements the article and the slides --- with installation instructions, plus lots of details and technicalities. Link: \url{http://angg.twu.net/LATEX/2018dednat6-extras.pdf} \\ \end{itemize} See also: % (find-TH "math-b" "tug-2018") \url{http://angg.twu.net/dednat6.html} \url{http://angg.twu.net/math-b.html\#tug-2018} \section{Hey!} The slides for the TUG talk end with this call for feedback: \msk I've stopped trying to document Dednat6 because 1) I don't have a mental image of who I am writing for, 2) I get {\sl far too little feedback}, 3) all of the feedback that I got came from people who felt that I was not writing for them --- my approach, tone and choice of pre-requisites were all wrong. If you would like to try Dednat6, get in touch, {\bf let's chat} --- {\sl please}! {\sl Maybe I can typeset in 20 minutes a diagram that took you a day, maybe I can implement an extension that you need... } \msk This still holds! I'm \co{eduardoochs@gmail.com}, get in touch! Index of sections: {\makeatletter \renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}} \@starttoc{toc} } % ____ _ _ _ % | _ \ _____ ___ __ | | ___ __ _ __| (_)_ __ __ _ % | | | |/ _ \ \ /\ / / '_ \| |/ _ \ / _` |/ _` | | '_ \ / _` | % | |_| | (_) \ V V /| | | | | (_) | (_| | (_| | | | | | (_| | % |____/ \___/ \_/\_/ |_| |_|_|\___/ \__,_|\__,_|_|_| |_|\__, | % |___/ % «downloading» (to ".downloading") \section{Downloading} You can download the current version of dednat6 from \url{http://angg.twu.net/dednat6.html}, or from here: \url{http://angg.twu.net/dednat6.zip}. The .zip file contains documentation in PDF and source form. To download it, delete the PDFs and recompile them, do this: % «dednat6.zip-test» (to ".dednat6.zip-test") % (find-es "dednat" "dednat6.zip-test") %V rm -Rfv /tmp/dn6-test/ %V mkdir /tmp/dn6-test/ %V cd /tmp/dn6-test/ %V wget http://angg.twu.net/dednat6.zip %V unzip dednat6.zip %V rm -v *.pdf %V lualatex 2018tugboat-rev1.tex %V lualatex 2018tugboat-rev1.tex %V lualatex 2018tug-dednat6.tex %V lualatex 2018tug-dednat6.tex %V lualatex 2018dednat6-extras.tex %V lualatex 2018dednat6-extras.tex %V lualatex 2018dednat6-minimal.tex %V lualatex 2018dednat6-no-lua.tex %V mkdir no-lua/ %V cd no-lua/ %V cp -v ../2018dednat6-no-lua.tex ../2018dednat6-no-lua.dnt . %V pdflatex 2018dednat6-no-lua.tex % %L verbdef "foo" % $\pu\foo$ Dednat6 itself consists of just the contents of the \co{dednat6/} directory plus the file \co{dednat6load.lua}. You can run the code below to check that that's what is needed to compile \co{2018dednat6-minimal.tex}: %V rm -Rfv /tmp/dn6-test-min/ %V mkdir /tmp/dn6-test-min/ %V cd /tmp/dn6-test-min/ %V wget http://angg.twu.net/dednat6.zip %V unzip dednat6.zip "dednat6/**" dednat6load.lua 2018dednat6-minimal.tex %V lualatex 2018dednat6-minimal.tex % %L verbdef "foo" % $\pu\footnotesize\foo$ %V lualatex 2018dednat6-minimal.tex % ____ _ _ % | _ \ _ __ ___ __ _ _ __ ___ | |__ | | ___ % | |_) | '__/ _ \/ _` | '_ ` _ \| '_ \| |/ _ \ % | __/| | | __/ (_| | | | | | | |_) | | __/ % |_| |_| \___|\__,_|_| |_| |_|_.__/|_|\___| % % «preamble» (to ".preamble") \section{The preamble} It {\sl should} be possible to load Dednat6 from a .tex file with a single command, like this: \msk %V \documentclass{article} %V \directlua{dofile "dednat6load.lua"} %V \begin{document} %V (...) %V \end{document} % %L verbdef "foo" % $\pu\foo$ \msk \noindent but due to some quirks this is not possible at this moment, and we have to do this (the indented lines): \msk %V \documentclass{article} %V \usepackage{proof} %V \input diagxy %V \xyoption{curve} %V \begin{document} %V \catcode`\^^J=10 %V \directlua{dofile "dednat6load.lua"} %V (...) %V \end{document} % %L verbdef "foo" % $\pu\foo$ \msk % (find-es "luatex" "spurious-omega") The `\co{\\catcode}' is needed to make the newlines in the \TeX{} code generated by dednat6 be interpreted as newlines and not as `$Ω$'s (the ``spurious omega problem''); `\co{\\usepackage\{proof\}}' loads a package for typesetting proof trees, `\co{\\input diagxy}' loads \Xy Pic and the \co{diagxy} extension (sec.\ref{diagxy}), and \co{\\xyoption{curve}} loads an extension for \co{diagxy} that allows drawing curved arrows. % (find-dn6 "preamble6.lua" "preamble1") One of the things that \co{\\directlua\{dofile "dednat6load.lua"\}} does is that it runs this from Lua: % $$\co{output(preamble1)}$$ % \co{preamble1} is a chunk of \TeX{} code defined in the file \co{dednat6/preamble.lua}, that contains material like this: \msk %V \def\defdiag#1#2{\expandafter\def\csname diag-#1\endcsname{\bfig#2\efig}} %V \def\ifdiagundefined#1{\expandafter\ifx\csname diag-#1\endcsname\relax} %V \def\diag#1{\ifdiagundefined{#1} %V \errmessage{UNDEFINED DIAGRAM: #1} %V \else %V \csname diag-#1\endcsname %V \fi %V } %V % %V \def\expr#1{\directlua{output(tostring(#1))}} %V \def\eval#1{\directlua{#1}} %V \def\pu{\directlua{pu()}} % %L verbdef "foo" % $\pu\footnotesize\foo$ The file \co{dednat6/preamble.lua} also defines a `\co{preamble0}' with the \qco{\\usepackage}s and \qco{\\input}s that would have to be run before the \qco{\\begin\{document\}}, and it explains in comments why this currently doesn't work. See the source. % _ _ _ % | \ | | ___ | | _ _ __ _ % | \| |/ _ \ | | | | | |/ _` | % | |\ | (_) | | |__| |_| | (_| | % |_| \_|\___/ |_____\__,_|\__,_| % % «no-lua» (to ".no-lua") \section{Producing a .tex/.dnt pair that doesn't need Lua\LaTeX} Here is a trick for dealing with situations in which we need to generate code that compiles with just \co{pdflatex}, without \co{lualatex} --- for example, when we need to produce \LaTeX{} code acceptable by Arxiv. The file \co{2018dednat6-no-lua.tex} in the .zip package is an example of that trick. To prepare a version of it that only needs \co{pdflatex}, do this: \msk %V rm -Rfv /tmp/dn6-test-no-lua/ %V mkdir /tmp/dn6-test-no-lua/ %V cd /tmp/dn6-test-no-lua/ %V wget http://angg.twu.net/dednat6.zip %V unzip dednat6.zip "dednat6/**" dednat6load.lua 2018dednat6-no-lua.tex %V lualatex 2018dednat6-no-lua.tex %V mkdir no-lua/ %V cd no-lua/ %V cp -v ../2018dednat6-no-lua.tex ../2018dednat6-no-lua.dnt . %V pdflatex 2018dednat6-no-lua.tex %V xpdf 2018dednat6-no-lua.pdf % %L verbdef "foo" % $\pu\footnotesize\foo$ \msk The line \qqco{lualatex 2018dednat6-no-lua.tex} generates a \co{.dnt} file; the commands after that create a directory with just the \co{.tex} and the \co{.dnt}, and compiles the \co{.tex} with \co{pdflatex}. A \co{.tex} file that supports being compiled in this was has this structure: \msk %V \documentclass[oneside]{book} %V \usepackage{ifluatex} %V \usepackage{proof} %V \input diagxy %V \xyoption{curve} %V \begin{document} %V %V \ifluatex %V \catcode`\^^J=10 %V \directlua{dofile "dednat6load.lua"} %V \else %V \input\jobname.dnt %V \def\pu{} %V \fi %V %V (...) %V %V %L write_dnt_file() %V \pu %V %V \end{document} % %L verbdef "foo" % {\pu\foo} \msk Note the \qqco{\\usepackage\{ifluatex\}}, the \co{\\ifluatex} / \co{\\else} / \co{\\fi} block, and the \qqco{\%L write\_dnt\_file()} followed by a \co{\\pu}. % _____ _ % |_ _| __ ___ ___ | |__ __ _ _ __ ___ % | || '__/ _ \/ _ \ | '_ \ / _` | '__/ __| % | || | | __/ __/ | |_) | (_| | | \__ \ % |_||_| \___|\___| |_.__/ \__,_|_| |___/ % % «tree-bars» (to ".tree-bars") \section{Other inference bars} % (find-es "tex" "proof") % (find-LATEXfile "2010hyps.tex" "\\DeduceSym") All the examples of deduction trees in the TUGBoat article use `\co{-}'s for the inference bars in the ASCII art representation. If we use `\co{=}'s instead of `\co{-}'s we get double bars, and if we use `\co{:}'s we get a line of vertical dots instead of a bar: %: %: Γ Γ [P]^1 Γ\;\;[Q]^1 %: : :::::::: :::::::::: %: Γ,P⊢R Γ,Q⊢R P∨Q R R %: ============ --------------------1 %: Γ,P∨Q⊢R R %: %: ^or-1 ^or-2 %: $$\pu \ded{or-1} \quad\Longrightarrow\quad \ded{or-2}$$ You can change the number of vertical dots by redefining the macro `\co{\\DeduceSym}'. For example: \msk %V \makeatletter %V % Original with 4 dots (from proof.sty): %V % \def\DeduceSym{\vtop{\baselineskip4\p@ \lineskiplimit\z@ %V % \vbox{\hbox{.}\hbox{.}\hbox{.}}\hbox{.}}} %V % New, with 3 dots: %V \def\DeduceSym{\vtop{\baselineskip4\p@ \lineskiplimit\z@ %V \vbox{\hbox{.}\hbox{.}}\hbox{.}}} %V \makeatother % %L verbdef "foo" % $\pu\foo$ % _____ _ _ % |_ _| __ ___ ___ | |__ __ _ ___| | _____ % | || '__/ _ \/ _ \ | '_ \ / _` |/ __| |/ / __| % | || | | __/ __/ | | | | (_| | (__| <\__ \ % |_||_| \___|\___| |_| |_|\__,_|\___|_|\_\___/ % % «tree-hacks» (to ".tree-hacks") \section{Changing how tree nodes are \LaTeX'ed} The trees below were produced by changing {\sl temporarily} the function that converts each tree node from ascii to \TeX{} code. TO DO: explain this; for the moment look at the source code of this section. % The functions that generate \TeX{} code for deduction trees are in % the file \co{dednat6/treetex.lua}. Dednat6 uses Makoto Tatsuta's % \co{proof.sty} by default, and the functions that generate code % using \co{proof.sty}'s macros are \co{TeX\_subtree\_tatsuta} and % \co{TeX\_deftree\_tatsuta}. They call \co{unabbrev\_tatsuta} to % generate \TeX{} code for each node, % (find-dn6 "treetex.lua" "unabbrev_tatsuta") %L unabbrev_syntree = function (str) %L if str:match"^<.*>$" %L then return "\\langle\\text{"..str:sub(2, -2).."}\\rangle" %L else return "\\co{"..str:gsub("[\\]", "\\%1").."}" %L end %L end %L unabbrev_tatsuta = unabbrev_syntree %L -- To deactivate the hack do: %L -- unabbrev_tatsuta = unabbrev % \POS(1500,1000)*+ % !!<0ex,.75ex> % {T_{n-1}}\ar@{-}|!{(1000,500);(1500,500)}\hole(1167,334) % \POS(1167,334)\ar|!{(1000,500);(1000,0)}\hole_<>(.6){h_{n-1}} % (500,0)*+!!<0ex,.75ex>{S_n} %: %: %: %: %: 1500 1000 %: -------- -------- %: ( <factor> , <factor> ) + <empty> %: ----------------------- ------- ------ %: <vector> <addop> <size> %: ------- --------------- %: <coord> <modifier> <object1> %: ------- -------------------------------------- %: <pos> * <object> %: ---------------- %: \POS <coord> %: ------------ %: <command> %: %: ^command %: %: %: 0ex .75ex %: ------- ------- %: < <dimen> , <dimen> > %: --------------------- %: ! <vector> %: --------------- %: ! <modifier> <object2> %: ---------- ------------------- %: <modifier> <object> %: ------------------------ %: <object1> %: %: ^object1 %: %: %: %: %: %: ----------------- %: <object2> %: %: ^object2 %: \pu $$\ded{command}$$ $$\ded{object1}$$ %-- Revert: %L unabbrev_tatsuta = unabbrev % _ _ _ % / \ | |__ | |__ _ __ _____ _____ % / _ \ | '_ \| '_ \| '__/ _ \ \ / / __| % / ___ \| |_) | |_) | | | __/\ V /\__ \ % /_/ \_\_.__/|_.__/|_| \___| \_/ |___/ % % «abbrevs» (to ".abbrevs") % (find-dn6file "dednat6.lua" "abbrevs") % (find-dn6 "abbrevs.lua") \section{Abbrevs} The first Dednats did not support UTF-8, and the way to write a tree node that would display as `$a→b$' was to write it as `\co{a->b}' after running \co{addabbrevs("->", "\\to ")}. The module \co{abbrevs.lua} implements this, and \co{unabbrev(str)} parses \co{str} from left to right, at each point looking for the longest string starting at that point that is an abbrev and replacing it by its expansion, or leaving that character untouched if it doesn't have an expansion. Here is an example: %V %L addabbrevs("->", "\\to ") %V %: %V %: [a]^1 a->b %V %: ----------- %V %: b b->c %V %: ------------ %V %: c %V %: ----1 %V %: a->c %V %: %V %: ^a->c %V %: %V $$\pu \ded{a->c}$$ %L %L verbdef "abbrevcode" %L addabbrevs("->", "\\to ") %: %: [a]^1 a->b %: ----------- %: b b->c %: ------------ %: c %: ----1 %: a->c %: %: ^a->c %: %$$\pu \ded{a->c}$$ $$\pu \myvcenter{\abbrevcode} %\abbrevcode \qquad \to \qquad \cded{a->c} $$ % (turp 2) Abbrevs are also used in 2D diagrams, in a more complex way. Section 2.2 of the TUGBoat article explains how the grid words create a table \co{nodes}, but it doesn't explain how the fields \co{.tex} and \co{.TeX} in a node affect how it is displayed. The code below creates nodes whose {\sl tags} are \co{"A"}, \co{"B"}, \co{"C"}, \co{"D"}, and then changes the fields \co{.tex} and \co{.TeX} in some of these nodes. The \TeX{} code for each node is calculated by the function \co{node\_to\_TeX}, that expects a node (a table) and returns a string. If \co{node\_to\_TeX} receives a node that has a \co{.TeX} field then it returns that field unchanged, surrounded by `\co{\{\}}'s; if it doesn't have a \co{.TeX} field but it has a \co{.tex} field then it returns the result of running \co{unabbrev} on that field and surrounding it with `\co{\{\}}'s; otherwise it returns the result of running \co{unabbrev} on the tag surrounding it with `\co{\{\}}'s. For example: %V %D diagram nodes-and-abbrevs %V %D 2Dx 100 +40 %V %D 2D 100 A -> B %V %D 2D | | %V %D 2D v v %V %D 2D +30 C -> D %V %D 2D %V %D (( B .tex= (a->b) %V %D C .TeX= (a->b) %V %D D .tex= (a->b) .TeX= (a->b) %V %L print("nodes:"); print(nodes) %V %L print("A:", node_to_TeX(nodes["A"])) %V %L print("B:", node_to_TeX(nodes["B"])) %V %L print("C:", node_to_TeX(nodes["C"])) %V %L print("D:", node_to_TeX(nodes["D"])) %V %D A B -> A C -> B D -> C D -> %V %D )) %V %D enddiagram %L %L verbdef "abbrevdiag" %D diagram nodes-and-abbrevs %D 2Dx 100 +40 %D 2D 100 A -> B %D 2D | | %D 2D v v %D 2D +30 C -> D %D 2D %D (( B .tex= (a->b) %D C .TeX= (a->b) %D D .tex= (a->b) .TeX= (a->b) %L print("nodes:"); print(nodes) %L print("A:", node_to_TeX(nodes["A"])) %L print("B:", node_to_TeX(nodes["B"])) %L print("C:", node_to_TeX(nodes["C"])) %L print("D:", node_to_TeX(nodes["D"])) %D A B -> A C -> B D -> C D -> %D )) %D enddiagram %D $$\pu \myvcenter{\abbrevdiag} \quad \to \quad \diag{nodes-and-abbrevs} $$ The output of the \co{print()}s is: {\footnotesize \begin{verbatim} nodes: { 1={"noden"=1, "tag"="A", "x"=100, "y"=100}, 2={"noden"=2, "tag"="B", "x"=140, "y"=100, "tex"="(a->b)"}, 3={"noden"=3, "tag"="C", "x"=100, "y"=130, "TeX"="(a->b)"}, 4={"noden"=4, "tag"="D", "x"=140, "y"=130, "tex"="(a->b)", "TeX"="(a->b)"}, "A"={"noden"=1, "tag"="A", "x"=100, "y"=100}, "B"={"noden"=2, "tag"="B", "x"=140, "y"=100, "tex"="(a->b)"}, "C"={"noden"=3, "tag"="C", "x"=100, "y"=130, "TeX"="(a->b)"}, "D"={"noden"=4, "tag"="D", "x"=140, "y"=130, "tex"="(a->b)", "TeX"="(a->b)"} } A: {A} B: {(a\to b)} C: {(a->b)} D: {(a->b)} \end{verbatim} } % ____ _ % | _ \ ___ _ __ __ _ _ __ ___ (_)_ __ __ _ % | |_) / _ \ '_ \ / _` | '_ ` _ \| | '_ \ / _` | % | _ < __/ | | | (_| | | | | | | | | | | (_| | % |_| \_\___|_| |_|\__,_|_| |_| |_|_|_| |_|\__, | % |___/ % «renaming» (to ".renaming") % (find-dn6 "diagforth.lua" "dxyren") \section{Renaming} The word \co{ren} in the language for 2D diagrams eats the rest of the line, splits it at the `\co{==>}', and splits the material before the `\co{==>}' into a list of {\sl tags}, $A_1, \ldots, A_n$, and the material after `\co{==>}' into a list of {\sl texs}, $B_1, \ldots, B_n$; these two lists must have the same length, and then \co{ren} runs \co{nodes[$A_i$].tex = $B_i$} for each $i$ in $1,\ldots,n$. For example: %V %D diagram ren %V %D 2Dx 100 +30 %V %D 2D 100 A1 <-| A2 %V %D 2D | | %V %D 2D v v %V %D 2D +30 A3 |-> A4 %V %D 2D %V %D ren A1 A2 ==> A{\times}B A %V %D ren A3 A4 ==> C B{\to}C %V %D %V %D (( A1 A2 <-| .plabel= a ({\times}B) %V %D A1 A3 -> A2 A4 -> %V %D A3 A4 |-> .plabel= b (B{\to}) %V %D )) %V %D enddiagram %L %L verbdef "diagren" %D diagram ren %D 2Dx 100 +30 %D 2D 100 A1 <-| A2 %D 2D | | %D 2D v v %D 2D +30 A3 |-> A4 %D 2D %D ren A1 A2 ==> A{\times}B A %D ren A3 A4 ==> C B{\to}C %D %D (( A1 A2 <-| .plabel= a ({\times}B) %D A1 A3 -> A2 A4 -> %D A3 A4 |-> .plabel= b (B{\to}) %D )) %D enddiagram %D $$\pu \myvcenter{\diagren} \quad \to \quad \diag{ren} $$ % _ % _ __ ___ ___ __| |_____ % | '_ ` _ \ / _ \ / _` |_____| % _| | | | | | (_) | (_| |_____| % (_)_| |_| |_|\___/ \__,_| % % «arrow-modifiers» (to ".arrow-modifiers") \section{Arrow modifiers} % (find-es "diagxy" "shape") % (find-dn6 "diagtex.lua" "arrow_to_TeX") % (find-dn6 "diagtex.lua" "arrow_to_TeX" "arrow_to_TeX_pshL =") The language for 2D diagrams in dednat6 has some words for curving and sliding arrows: % %V %D diagram curve-slide %V %D 2Dx 100 +40 %V %D 2D 100 A B %V %D 2D %V %D 2D +40 D C %V %D 2D %V %D (( A B -> .plabel= b \text{one} %V %D A B -> .slide= 5pt .plabel= a \text{two} %V %D A B -> .slide= 20pt .plabel= a \text{three} %V %D B C -> .curve= _10pt .plabel= l \text{four} %V %D B C -> .curve= ^5pt .plabel= r \text{five} %V %D C D -> %V %D C D -> .curve= _5pt %V %D C D -> .curve= _5pt .slide= -5pt %V %D .plabel= a \text{six} %V %D )) %V %D enddiagram %L %L verbdef "curveslide" % %D diagram curve-slide %D 2Dx 100 +40 %D 2D 100 A B %D 2D %D 2D +40 D C %D 2D %D (( A B -> .plabel= b \text{one} %D A B -> .slide= 5pt .plabel= a \text{two} %D A B -> .slide= 20pt .plabel= a \text{three} %D B C -> .curve= _10pt .plabel= l \text{four} %D B C -> .curve= ^5pt .plabel= r \text{five} %D C D -> %D C D -> .curve= _5pt %D C D -> .curve= _5pt .slide= -5pt %D .plabel= a \text{six} %D )) %D enddiagram %D $$\pu \myvcenter{\footnotesize\curveslide} \quad \to \quad \diag{curve-slide} $$ % (find-dn6 "diagforth.lua" "arrows") % (find-dn6 "diagforth.lua" "arrows" "sl^^") The words \qco{sl\^\^}, \qco{sl\^}, \qco{sl\_}, and \qco{sl\_\_} are abbreviations for \qqco{.slide= 5pt}, \qqco{.slide= 2.5pt}, \qqco{.slide= -2.5pt}, \qqco{.slide= -5pt} respectively. %L forths[".mod="] = function () %L ds:pick(0).modifier = getword() or error() %L end % %D diagram ?? % %D 2Dx 100 +40 % %D 2D 100 A B % %D 2D % %D 2D +40 D C % %D 2D % %D (( A B -> .plabel= a 1 .mod= @<-5pt>@/_5pt/ % %D % %D )) % %D enddiagram % %D % $$\pu % \diag{??} % $$ % ____ _ _ _ % / ___|| |_ _ __ _ __ __ _ _ __ ___ ___ __| |_ _| | ___ ___ % \___ \| __| '__| '_ \ / _` | | '_ ` _ \ / _ \ / _` | | | | |/ _ \/ __| % ___) | |_| | | | | | (_| | | | | | | | (_) | (_| | |_| | | __/\__ \ % |____/ \__|_| |_| |_|\__, | |_| |_| |_|\___/ \__,_|\__,_|_|\___||___/ % |___/ % % «strange-modules» (to ".strange-modules") \section{Strange modules} % (find-dn6 "dednat6.lua") % (find-dn6 "dednat6.lua" "requires" "picture") % (find-dn6 "picture.lua") % (find-dn6 "zhas.lua") % (find-dn6 "zhas.lua" "MixedPicture") The code of Dednat6 --- inside the directory \co{dednat6/} --- is made of several \co{.lua} files that are {\sl all} loaded by \co{dednat6.lua}; there is no provision yet for loading only the modules that are used in a given \co{.tex} file. This means that some modules that are only useful to the author of Dednat6 (Eduardo Ochs, a.k.a. ``me'') are always loaded. Most of these extra modules were written to handle the objects described in my series of papers about ``Planar Heyting Algebras'', at: \url{http://angg.twu.net/math-b.html#zhas-for-children-2} \msk % An object \co{foo} of the class \co{MixedPicture} has both an % \co{AsciiPicture} object and an \co{LPicture} object; %L tcg_big = {scale="10pt", meta="p", dv=2, dh=3, ev=0.32, eh=0.2} %L tcg_med = {scale= "8pt", meta="p s", dv=1, dh=2, ev=0.32, eh=0.25} %L tcgnew = function (opts, def, str) %L return TCG.new(opts, def, unpack(split(str, "[ %d]+"))) %L end %L tcgbig = function (def, spec) return tcgnew(tcg_big, def, spec or tcg_spec) end %L tcgmed = function (def, spec) return tcgnew(tcg_med, def, spec or tcg_spec) end %L %L tcg_bigq = {scale="10pt", meta="p", dv=2, dh=3, ev=0.32, eh=0.2, dq=1.4} %L tcg_medq = {scale= "8pt", meta="p s", dv=1, dh=2, ev=0.32, eh=0.25, dq=1.4} %L tcg_Medq = {scale="10pt", meta="p", dv=1, dh=3, ev=0.32, eh=0.25, dq=1.4} %L %L tcgbigq = function (def, spec) return tcgnew(tcg_bigq, def, spec or tcg_spec) end %L tcgmedq = function (def, spec) return tcgnew(tcg_medq, def, spec or tcg_spec) end %L tcgMedq = function (def, spec) return tcgnew(tcg_Medq, def, spec or tcg_spec) end %L -- (find-dn6 "zhas.lua" "TCG") %L -- (find-dn6 "zhas.lua" "TCG" "lrs =") %L %L TCG.__index.QL = function (tcg, y) return v(0 -tcg.lp.dq, tcg.dv*y) end %L TCG.__index.QR = function (tcg, y) return v(tcg.dh+tcg.lp.dq, tcg.dv*y) end %L TCG.__index.putql = function (tcg, y, str) tcg.lp:put(tcg:QL(y), str) end %L TCG.__index.putqr = function (tcg, y, str) tcg.lp:put(tcg:QR(y), str) end %L TCG.__index.qmarks = function (tcg, lstr, rstr) %L for y=1,tcg.l do tcg:putql(y, lstr:sub(y, y)) end %L for y=1,tcg.r do tcg:putqr(y, rstr:sub(y, y)) end %L return tcg %L end %L mp = mpnew({def="ZQuot"}, "12345RR4321"):addlrs():addcuts("c 4321/0 0123|45|6"):output() %L mp = mpnew({def="ZQuotients"}, "1R2R3212RL1"):addlrs():addcuts("c 4321/0 0123|45|6"):output() %L mp:print() %L %L tcg_bigq = {scale="10pt", meta="p", dv=2, dh=3, ev=0.32, eh=0.2, dq=1.4} %L %L tcg_spec = "4, 6; 11 22 34 45, 25" %L local tcg = tcgbigq("tcgP"); PP(tcg) %L tcg:lrs():hs():vs() %L tcg:qmarks("!???", "???!?!") %L tcg:output() % \def\squigbij{\;\; \diagxyto/<~>/<300> \;\;} Here's an example of what they produce: $$\pu \ZQuotients \squigbij \tcgP $$ \bsk Even though these modules are not useful to other people some {\sl ideas} in them may be. (TO DO: give examples!) % ____ % | __ ) __ _ _ __ _ __ % | _ \ / _` | '__| '__| % | |_) | (_| | | | | % |____/ \__,_|_| |_| % % «barr» (to ".barr") \section{Versions of diagxy} \label{diagxy} Diagxy comes in two versions: the original one, \co{diagxy.tex}, that is loaded with \co{\\input diagxy}, and another one, \co{xybarr.tex}, that is a module of xypic and is loaded with \co{\\usepackage[barr,pdf]\{xy\}}. If you have a recent texlive, installed with, say, \url{https://www.tug.org/texlive/quickinstall.html} \noindent then you should have these .tex files and their documentation files at places like these: % (find-angg ".emacs" "diagxy" "2018:") % (find-tl2018sh "find * | sort | grep xy | grep barr") % (find-tl2018sh "find * | sort | grep xy | grep dia") \begin{verbatim} /usr/local/texlive/2018/texmf-dist/tex/generic/barr/diagxy.tex /usr/local/texlive/2018/texmf-dist/doc/generic/barr/diaxydoc.pdf /usr/local/texlive/2018/texmf-dist/tex/generic/xypic/xybarr.tex /usr/local/texlive/2018/texmf-dist/doc/generic/xypic/barrdoc.pdf \end{verbatim} You can access their docs online at these URLs: {\footnotesize \url{http://www.math.mcgill.ca/barr/papers/diaxydoc.pdf} \url{http://tug.ctan.org/tex-archive/macros/latex/contrib/xypic/doc/barrdoc.pdf} } \msk It seems that loading diagxy with \co{\\usepackage[barr,pdf]\{xy\}} is incompatible with lualatex, and thus with Dednat6. Until we get that fixed please use \co{\\input diagxy} instead. % _ __ _ % / \ / _| _____ __ ___ __ _ _ __ ___ _ __ | | ___ ___ % / _ \ | |_ / _ \ \ /\ / / / __|/ _` | '_ ` _ \| '_ \| |/ _ \/ __| % / ___ \ | _| __/\ V V / \__ \ (_| | | | | | | |_) | | __/\__ \ % /_/ \_\ |_| \___| \_/\_/ |___/\__,_|_| |_| |_| .__/|_|\___||___/ % |_| % % «a-few-samples» (to ".a-few-samples") \section{``A few samples''} The file \co{barrdoc.pdf} has a section called ``A few samples'' (5.9), that shows how to produce a certain big diagram in two ways; one, that we will not discuss, using \qco{\\morphism}, and another one, that we will call ``Barr's diagram'', that uses \qco{\\node} and \qco{\\arrow} instead. In the next two pages we will compare Barr's diagram to an approximate translation of it to Dednat6. Note: I don't quite understand Barr's code for the two outermost curved arrows --- it {\sl seems} that he resorts to low-level \Xy Pic code in the ``modifier'' part of the shape parameter to create splined arrows, but I couldn't figure out the exact meaning of \qqco{@`\{c,(3000,0),(2700,2800),p\}} in the \Xy Pic reference manual... \newpage %V % Source code for Barr's diagram: %V % %V $$\bfig %V \def\f{\bar f} %V \def\g{\bar g} %V \def\h{\bar h} %V \let\t\tau %V \node A11(0,2800)[(\h(\g\f))\t_A] %V \node A13(1200,2800)[((\h\g)\f)\t_A] %V \node A21(0,2400)[\h((\g\f)\t_A)] %V \node A22(600,2400)[\h(\g\f\t_A)] %V \node A23(1200,2400)[(\h\g(\f\t_A))] %V \node A32(600,2000)[\h(\g(\t_Bf))] %V \node A33(1200,2000)[(\h\g)(\t_Bf)] %V \node A34(1800,2000)[((\h\g)\t_B)f] %V \node A42(600,1600)[\h((\g\t_B)f)] %V \node A44(1800,1600)[(\h(\g\t_B))f] %V \node A52(600,1200)[\h((\t_C)g)f] %V \node A54(1800,1200)[(\h(\t_Cg))f] %V \node A62(600,800)[\h(\t_C(gf))] %V \node A63(1200,800)[(\h\t_C)(gf)] %V \node A64(1800,800)[\h(\t_C(gf))] %V \node A73(1200,400)[(\t_Dh)(gf)] %V \node A74(1800,400)[((\t_D)h)g] %V \node A75(2400,400)[(\t_D(hg))f] %V \node A83(1200,0)[\t_D(h(gf))] %V \node A85(2400,0)[\t_D((hg)f)] %V \arrow[A11`A13;] %V \arrow[A21`A11;] %V \arrow[A21`A22;] %V \arrow[A22`A23;] %V \arrow[A23`A13;] %V \arrow[A32`A22;\h(\g\t_f)] %V \arrow[A32`A33;] %V \arrow[A33`A23;(\h\g)\t_f] %V \arrow[A33`A34;] %V \arrow[A42`A44;] %V \arrow[A42`A32;] %V \arrow[A44`A34;] %V \arrow[A52`A42;\h(\t_gf)] %V \arrow[A52`A54;] %V \arrow[A54`A44;(\h\t_g)f] %V \arrow[A62`A52;] %V \arrow[A62`A63;] %V \arrow[A63`A64;] %V \arrow[A73`A63;\t_h(gf)] %V \arrow[A73`A74;] %V \arrow[A74`A64;\t_{(hg)f}] %V \arrow[A74`A75;] %V \arrow[A83`A73;] %V \arrow[A83`A85;] %V \arrow[A85`A75;] %V \arrow|r|/{@{>}@/_15pt/}/[A75`A34;\t_{hg}f] %V \arrow|l|/{@{>}@/^15pt/}/[A62`A21;\h(\t_C(gf))] %V \arrow|l|/{@{>}@`{c,(3000,0),(2700,2800),p}}/[A85`A13;\t_{hg}f] %V \arrow|r|/{@{>}@`{c,(-300,0),(-600,2400),p}}/[A83`A11;\t_{h(fg)}] %V \efig %V $$ %L %L verbdef "barrorig" %V % Source code for its translation to Dednat6: %V % %V %D diagram barr-dednat6 %V %D 2Dx 100 +40 +40 +40 +40 %V %D 2D 100 A11 --------> A13 %V %D 2D ^ ^ %V %D 2D | | %V %D 2D +27 A21 -> A22 -> A23 %V %D 2D ^ ^ ^ %V %D 2D | | | %V %D 2D +27 | A32 -> A33 -> A34 %V %D 2D | ^ ^ ^ %V %D 2D | | | \ %V %D 2D +27 | A42 --------> A44 \ %V %D 2D | ^ ^ \ %V %D 2D \ | | | %V %D 2D +27 \ A52 --------> A54 | %V %D 2D \ ^ | %V %D 2D \ | | %V %D 2D +27 A62 -> A63 -> A64 | %V %D 2D ^ ^ | %V %D 2D | | | %V %D 2D +27 A73 -> A74 -> A75 %V %D 2D ^ ^ %V %D 2D | | %V %D 2D +27 A83 --------> A85 %V %D 2D %V %D ren A11 A13 ==> (\h(\g\f))\t_A ((\h\g)\f)\t_A %V %D ren A21 A22 A23 ==> \h((\g\f)\t_A) \h(\g\f\t_A) (\h\g(\f\t_A)) %V %D ren A32 A33 A34 ==> \h(\g(\t_Bf)) (\h\g)(\t_Bf) ((\h\g)\t_B)f %V %D ren A42 A44 ==> \h((\g\t_B)f) (\h(\g\t_B))f %V %D ren A52 A54 ==> \h((\t_C)g)f (\h(\t_Cg))f %V %D ren A62 A63 A64 ==> \h(\t_C(gf)) (\h\t_C)(gf) \h(\t_C(gf)) %V %D ren A73 A74 A75 ==> (\t_Dh)(gf) ((\t_D)h)g (\t_D(hg))f %V %D ren A83 A85 ==> \t_D(h(gf)) \t_D((hg)f) %V %D %V %D (( # Horizontal arrows: %V %D A11 A13 -> %V %D A21 A22 -> A22 A23 -> %V %D A32 A33 -> A33 A34 -> %V %D A42 A44 -> %V %D A52 A54 -> %V %D A62 A63 -> A63 A64 -> %V %D A73 A74 -> A74 A75 -> %V %D A83 A85 -> %V %D %V %D # Simple vertical arrows: %V %D A11 A21 <- A13 A23 <- %V %D A22 A32 <- .plabel= r \h(\g\t_f) A23 A33 <- .plabel= r (\h\g)\t_f %V %D A32 A42 <- A34 A44 <- %V %D A42 A52 <- .plabel= r \h(\t_gf) A44 A54 <- .plabel= r (\h\t_g)f %V %D A52 A62 <- %V %D A63 A73 <- .plabel= r \t_h(gf) A64 A74 <- .plabel= r \t_{(hg)f} %V %D A73 A83 <- A75 A85 <- %V %D %V %D # Curved vertical arrows: %V %D A75 A34 -> .curve= _15pt .plabel= r \t_{hg}f %V %D A62 A21 -> .curve= ^15pt .plabel= l \h(\t_C(gf)) %V %D A83 A11 -> .mod= @`{c,(-300,-2835),(-800,-100),p} .plabel= r \t_{h(fg)} %V %D A85 A13 -> .mod= @`{c,(3000,-2000),(2700,-500),p} .plabel= l \t_{hg}f %V %D %V %D )) %V %D enddiagram %V %D %V $$\pu %V \def\f{\bar f} %V \def\g{\bar g} %V \def\h{\bar h} %V \let\t\tau %V \diag{barr-dednat6} %V $$ %L %L verbdef "barrdednatsix" { \pu \def\B#1{\resizebox{!}{6in}{#1}} \hskip-8em \B{\barrorig} \;\; \B{\barrdednatsix} } \newpage % (find-es "diagxy" "shape") % (find-barrdocpage 33 "5.9 A few samples") % (find-barrdoctext 33 "5.9 A few samples") % (find-angg ".emacs.papers" "xypic") % (find-xyreferpage 12 "Figure 3: hobjectis") % (find-xyrefertext 12 "Figure 3: hobjectis") % (find-xyreferpage 22 "show control points") % (find-xyrefertext 22 "show control points") % (find-xyreferpage 39 "Figure 14: hpathis") % (find-xyrefertext 39 "Figure 14: hpathis") % (find-xyreferpage 21 "control points") % (find-xyrefertext 21 "control points") Barr's diagram: \msk \resizebox{!}{1.5in}{ $\bfig \def\f{\bar f} \def\g{\bar g} \def\h{\bar h} \let\t\tau \node A11(0,2800)[(\h(\g\f))\t_A] \node A13(1200,2800)[((\h\g)\f)\t_A] \node A21(0,2400)[\h((\g\f)\t_A)] \node A22(600,2400)[\h(\g\f\t_A)] \node A23(1200,2400)[(\h\g(\f\t_A))] \node A32(600,2000)[\h(\g(\t_Bf))] \node A33(1200,2000)[(\h\g)(\t_Bf)] \node A34(1800,2000)[((\h\g)\t_B)f] \node A42(600,1600)[\h((\g\t_B)f)] \node A44(1800,1600)[(\h(\g\t_B))f] \node A52(600,1200)[\h((\t_C)g)f] \node A54(1800,1200)[(\h(\t_Cg))f] \node A62(600,800)[\h(\t_C(gf))] \node A63(1200,800)[(\h\t_C)(gf)] \node A64(1800,800)[\h(\t_C(gf))] \node A73(1200,400)[(\t_Dh)(gf)] \node A74(1800,400)[((\t_D)h)g] \node A75(2400,400)[(\t_D(hg))f] \node A83(1200,0)[\t_D(h(gf))] \node A85(2400,0)[\t_D((hg)f)] \arrow[A11`A13;] \arrow[A21`A11;] \arrow[A21`A22;] \arrow[A22`A23;] \arrow[A23`A13;] \arrow[A32`A22;\h(\g\t_f)] \arrow[A32`A33;] \arrow[A33`A23;(\h\g)\t_f] \arrow[A33`A34;] \arrow[A42`A44;] \arrow[A42`A32;] \arrow[A44`A34;] \arrow[A52`A42;\h(\t_gf)] \arrow[A52`A54;] \arrow[A54`A44;(\h\t_g)f] \arrow[A62`A52;] \arrow[A62`A63;] \arrow[A63`A64;] \arrow[A73`A63;\t_h(gf)] \arrow[A73`A74;] \arrow[A74`A64;\t_{(hg)f}] \arrow[A74`A75;] \arrow[A83`A73;] \arrow[A83`A85;] \arrow[A85`A75;] \arrow|r|/{@{>}@/_15pt/}/[A75`A34;\t_{hg}f] \arrow|l|/{@{>}@/^15pt/}/[A62`A21;\h(\t_C(gf))] \arrow|l|/{@{>}@`{c,(3000,0),(2700,2800),p}}/[A85`A13;\t_{hg}f] \arrow|r|/{@{>}@`{c,(-300,0),(-600,2400),p}}/[A83`A11;\t_{h(fg)}] \efig $} \bsk \bsk %D diagram barr-dednat6 %D 2Dx 100 +40 +40 +40 +40 %D 2D 100 A11 --------> A13 %D 2D ^ ^ %D 2D | | %D 2D +27 A21 -> A22 -> A23 %D 2D ^ ^ ^ %D 2D | | | %D 2D +27 | A32 -> A33 -> A34 %D 2D | ^ ^ ^ %D 2D | | | \ %D 2D +27 | A42 --------> A44 \ %D 2D | ^ ^ \ %D 2D \ | | | %D 2D +27 \ A52 --------> A54 | %D 2D \ ^ | %D 2D \ | | %D 2D +27 A62 -> A63 -> A64 | %D 2D ^ ^ | %D 2D | | | %D 2D +27 A73 -> A74 -> A75 %D 2D ^ ^ %D 2D | | %D 2D +27 A83 --------> A85 %D 2D %D ren A11 A13 ==> (\h(\g\f))\t_A ((\h\g)\f)\t_A %D ren A21 A22 A23 ==> \h((\g\f)\t_A) \h(\g\f\t_A) (\h\g(\f\t_A)) %D ren A32 A33 A34 ==> \h(\g(\t_Bf)) (\h\g)(\t_Bf) ((\h\g)\t_B)f %D ren A42 A44 ==> \h((\g\t_B)f) (\h(\g\t_B))f %D ren A52 A54 ==> \h((\t_C)g)f (\h(\t_Cg))f %D ren A62 A63 A64 ==> \h(\t_C(gf)) (\h\t_C)(gf) \h(\t_C(gf)) %D ren A73 A74 A75 ==> (\t_Dh)(gf) ((\t_D)h)g (\t_D(hg))f %D ren A83 A85 ==> \t_D(h(gf)) \t_D((hg)f) %D %D (( # Horizontal arrows: %D A11 A13 -> %D A21 A22 -> A22 A23 -> %D A32 A33 -> A33 A34 -> %D A42 A44 -> %D A52 A54 -> %D A62 A63 -> A63 A64 -> %D A73 A74 -> A74 A75 -> %D A83 A85 -> %D %D # Simple vertical arrows: %D A11 A21 <- A13 A23 <- %D A22 A32 <- .plabel= r \h(\g\t_f) A23 A33 <- .plabel= r (\h\g)\t_f %D A32 A42 <- A34 A44 <- %D A42 A52 <- .plabel= r \h(\t_gf) A44 A54 <- .plabel= r (\h\t_g)f %D A52 A62 <- %D A63 A73 <- .plabel= r \t_h(gf) A64 A74 <- .plabel= r \t_{(hg)f} %D A73 A83 <- A75 A85 <- %D %D # Curved vertical arrows: %D A75 A34 -> .curve= _15pt .plabel= r \t_{hg}f %D A62 A21 -> .curve= ^15pt .plabel= l \h(\t_C(gf)) %D A83 A11 -> .mod= @`{c,(-300,-2835),(-800,-100),p} .plabel= r \t_{h(fg)} %D A85 A13 -> .mod= @`{c,(3000,-2000),(2700,-500),p} .plabel= l \t_{hg}f %D %D )) %D enddiagram %D My approximate translation of it to dednat6: \msk \resizebox{!}{1.5in}{ $\pu \def\f{\bar f} \def\g{\bar g} \def\h{\bar h} \let\t\tau \diag{barr-dednat6} $ } \newpage % ____ _ % | _ \ ___ _ __ | | % | |_) / _ \ '_ \| | % | _ < __/ |_) | | % |_| \_\___| .__/|_| % |_| % % «repl» (to ".repl") \section{The REPL} % (turp 5) Section 5 of the TUGBoat article --- called ``A read-eval-print-loop (REPL)'' --- describes a way to start a Lua REPL in the middle of the compilation of a \co{.tex} file. The .zip file for dednat6 includes a file \co{2018dednat6-repl.tex} that lets you play with the REPL by running just this: % $$\text{\co{lualatex 2018dednat6-repl.tex}}$$ The REPL can be used to inspect \qco{\\def}s, among other things. See the ongoing discussing here: % $$\text{\url{http://tug.org/pipermail/luatex/2019-January/007034.html}}$$ % ____ _ _ % | __ ) __ _ ___| | __ ___ _ __ __| |___ % | _ \ / _` |/ __| |/ /____ / _ \ '_ \ / _` / __| % | |_) | (_| | (__| <_____| __/ | | | (_| \__ \ % |____/ \__,_|\___|_|\_\ \___|_| |_|\__,_|___/ % % «other-back-ends» (to ".other-back-ends") \section{Other back-ends} Dednat6 can be seen as a front-end for \co{proof.sty} and for (the \qco{\\morphism} flavor of) \co{diagxy.tex}. It shouldn't be hard to make it generate, say, code for Tikz instead of for diagxy, and code for Sam Buss's \co{bussproofs.sty} instead of for \co{proof.sty}. If you are interested in this, and you know Tikz/bussproofs/whatever enough to give me examples of how the output should look, get in touch! {\sl Update:} of all other possible back-ends for 2D diagrams the easiest one to implement seems to be the \qco{\\node}s and \qco{\\arrow}s flavor of diagxy --- I guess it would be just a few hours of work. If you think that this would be useful to you, drop me a line! \end{document} % Local Variables: % coding: utf-8-unix % End: