Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
% tug-slides.tex: the .tex source for the slides for the presentation
% about Dednat6 at the TUG2018 meeting (slightly modified to need
% fewer dependencies).
%
% (find-angg "dednat6/tug-slides.tex")
% (defun c () (interactive) (find-dednat6sh "lualatex -record tug-slides.tex"))
% (defun d () (interactive) (find-pdf-page "~/dednat6/tug-slides.pdf"))
% (defun e () (interactive) (find-dednat6 "tug-slides.tex"))
% (defun l () (interactive) (find-dednat6 "myverbatim.lua"))
% (defun u () (interactive) (find-latex-upload-links "tug-slides"))
% (find-pdf-page   "~/dednat6/tug-slides.pdf")
% (find-sh0 "cp -v  ~/dednat6/tug-slides.pdf /tmp/")
% (find-sh0 "cp -v  ~/dednat6/tug-slides.pdf /tmp/pen/")
%   file:///home/edrx/dednat6/tug-slides.pdf
%                 file:///tmp/tug-slides.pdf
%             file:///tmp/pen/tug-slides.pdf
% http://angg.twu.net/dednat6/tug-slides.pdf

% «.defs»			(to "defs")
% «.pbsymbol»			(to "pbsymbol")
% «.verbatim»			(to "verbatim")
% «.myhbox»			(to "myhbox")
% «.bgcolorhbox»		(to "bgcolorhbox")
%
% «.title-page»			(to "title-page")
% «.dednat.icn»			(to "dednat.icn")
% «.dednat.icn-2»		(to "dednat.icn-2")
% «.dednat.icn-3»		(to "dednat.icn-3")
% «.dednat.icn-4»		(to "dednat.icn-4")
% «.dednat4.lua»		(to "dednat4.lua")
% «.dednat4.lua-diagram»	(to "dednat4.lua-diagram")
%   «.BCC»			(to "BCC")
% «.dednat4.lua-diagram-2»	(to "dednat4.lua-diagram-2")
% «.dednat4.lua-diagram-3»	(to "dednat4.lua-diagram-3")
% «.dednat4.lua-diagram-4»	(to "dednat4.lua-diagram-4")
% «.dednat4.lua-diagram-5»	(to "dednat4.lua-diagram-5")
% «.dednat6»			(to "dednat6")
% «.dednat6-2»			(to "dednat6-2")
% «.dednat6-3»			(to "dednat6-3")
% «.download-test»		(to "download-test")
% «.extensions»			(to "extensions")
% «.hacking»			(to "hacking")
% «.eepitch-blocks»		(to "eepitch-blocks")
% «.repls»			(to "repls")
% «.repls-2»			(to "repls-2")
% «.hey»			(to "hey")

\documentclass[oneside]{book}
\usepackage[colorlinks,urlcolor=brown]{hyperref} % (find-es "tex" "hyperref")
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{pict2e}
\usepackage{color}                % (find-dednat6 "edrx15.sty" "colors")
\usepackage{colorweb}             % (find-es "tex" "colorweb")
\usepackage{svgcolor}             % (find-es "tex" "svgcolor")
\usepackage{graphicx}
%
% (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
%
%
% (find-angg ".emacs.papers" "latexgeom")
% (find-dednat6file "2016-2-GA-VR.tex" "{geometry}")
% (find-latexgeomtext "total={6.5in,8.75in},")
\usepackage[paperwidth=11cm, paperheight=8.5cm,
            %total={6.5in,4in},
            %textwidth=4in,  paperwidth=4.5in,
            %textheight=5in, paperheight=4.5in,
            %a4paper,
            top=1.5cm, bottom=.5cm, left=1cm, right=1cm, includefoot
           ]{geometry}
%
\begin{document}

\catcode`\^^J=10
\directlua{dofile "dednat6load.lua"}  % (find-dednat6 "dednat6load.lua")




% «defs»  (to ".defs")
% I usually include these usepackages and inputs in my header:
%  \usepackage{edrx15}              % (find-LATEX "edrx15.sty")
%  \input edrxaccents.tex           % (find-LATEX "edrxaccents.tex")
%  \input edrxchars.tex             % (find-LATEX "edrxchars.tex")
%  \input edrxgac2.tex              % (find-LATEX "edrxgac2.tex")
%  \input edrxheadfoot.tex          % (find-LATEX "edrxheadfoot.tex")
% but I commented them out, and copied the relevant definitions
% here:

\def\noedrxfooter{}
\def\bsk{\bigskip}
\def\msk{\medskip}
\def\ssk{\smallskip}
\def\orange#1{{\color{orange}#1}}
\def\yellow#1{{\color{yellow}#1}}
\def\smashedvrule#1#2#3{\vrule width#1 height#2 depth#3 \kern-#1}
\def\bicolorhbox#1{{%
  \setbox0\hbox{#1}%
  \yellow{\smashedvrule{\wd0}{\ht0}{0pt}}%
  \orange{\smashedvrule{\wd0}{0pt}{\dp0}}%
  \box0%
  }}
\def\bhbox{\bicolorhbox}
\catcode`×=13 \def×{\times}
\catcode`Σ=13 \defΣ{\Sigma}
\catcode`λ=13 \defλ{\lambda}
\catcode`←=13 \def←{\ot}
\catcode`→=13 \def→{\to}
\catcode`♮=13 \def♮{\natural}
\def\id{\mathrm{id}}
\def\catA{\mathbf{A}}
\def\catB{\mathbf{B}}
\def\ot{\leftarrow}

% «pbsymbol»  (to ".pbsymbol")
\def\pbsymbol#1{%
  \begin{picture}(#1,#1)
    \put(0,0){\line(1,0){#1}}
    \put(#1,#1){\line(0,-1){#1}}
  \end{picture}}

% «verbatim» (to ".verbatim")
\directlua{dofile "myverbatim.lua"} % (find-dednat6 "myverbatim.lua")
\def\verbahbox#1{\hbox{\tt#1}}

% «myhbox» (to ".myhbox")
% (find-es "tex" "hbox")
\def\myhbox#1#2#3{\setbox0=\hbox{#3}\ht0=#1\dp0=#2\box0}
% \bhbox{\myhbox{7pt}{2pt}{\tt pb}}

\def\verbahbox#1{\myhbox{7pt}{2pt}{{\tt#1}}}

% «colors» (to ".colors")
% (find-dednat6 "2017ebl-slides.tex" "colors")
% (find-dednat6 "2017ebl-slides.tex" "colors" "\\def\\ColorGreen")
\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}}

% (find-dednat6file "istanbulglyphs.el" "Bold:")
\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}}

% «bgcolorhbox» (to ".bgcolorhbox")
% (find-dednat6 "edrx15.sty" "colors")
% (find-es "tex" "fbox")
\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%
  }}

%\bgcolorhbox{blue}{Hello}
%\bgcolorhbox{YellowOrangeLight}{Hello}

\def\bgbox#1{\bgcolorhbox{YellowOrangeLight}{#1}}

\def\myvcenter#1{\begin{matrix}#1\end{matrix}}

\catcode`\^^O=13 \def*{{\color{red}*}}









\setlength{\parindent}{0em}

%  _____ _ _   _                               
% |_   _(_) |_| | ___   _ __   __ _  __ _  ___ 
%   | | | | __| |/ _ \ | '_ \ / _` |/ _` |/ _ \
%   | | | | |_| |  __/ | |_) | (_| | (_| |  __/
%   |_| |_|\__|_|\___| | .__/ \__,_|\__, |\___|
%                      |_|          |___/      
%
% «title-page» (to ".title-page")
% (tugp 1)
% (find-es "tex" "huge")
% (find-kopkadaly4page (+ 12 63) "\\Huge")

\begin{tabular}[b]{c}
{\huge {\bf Dednat6: an extensible}} \\
{\LARGE {\bf (\ColorGreen{semi-})preprocessor for}} \\[1.5pt]
{\Large Lua\LaTeX{} that understands} \\
{\large diagrams \ColorGreen{in ASCII art}} \\
\\
%\includegraphics[width=2cm]{2018tug-edrx-hoop.png}\\
Eduardo Ochs - UFF \\
TUG 2018 - Rio de Janeiro, 20-22 jul 2018 \\
% \url{https://www.tug.org/tug2018/} \\
\url{http://angg.twu.net/dednat6.html} \\
% \url{http://angg.twu.net/math-b.html} \\
\end{tabular}

% https://www.tug.org/tug2018/ TUG2018



\newpage

\noedrxfooter


%      _          _             _         _            
%   __| | ___  __| |_ __   __ _| |_      (_) ___ _ __  
%  / _` |/ _ \/ _` | '_ \ / _` | __|     | |/ __| '_ \ 
% | (_| |  __/ (_| | | | | (_| | |_   _  | | (__| | | |
%  \__,_|\___|\__,_|_| |_|\__,_|\__| (_) |_|\___|_| |_|
%                                                      
% «dednat.icn» (to ".dednat.icn")
% (tugp 2)

{\bf Prehistory: dednat.icn}

My master's thesis was partly about Natural Deduction,

and it had lots of tree diagrams like these:

%L addabbrevs("->", "→")
%
%:  [x]^1  f     [a]^1  a->b
%:  --------     -----------
%:     f(x)   g       b       b->c
%:     --------       ------------
%:     g(f(x))             c
%:   ----------1         ----1
%:   λx.g(f(x))          a->c
%:
%:   ^x.g(f(x))          ^x.g(f(x)).t
%:
\pu
$$\ded{x.g(f(x))} \qquad \ded{x.g(f(x)).t}$$

I used \ColorGreen{\tt proof.sty} to typeset them, but the code

for each diagram was so opaque that I had to keep

a 2D ascii art version of each diagram in comments

so that I wouldn't get lost...


\newpage

% «dednat.icn-3» (to ".dednat.icn-3")
% (tugp 4)

{\bf Prehistory: dednat.icn (2)}

...like this:

\msk

%V %:  [x]^1  f     
%V %:  --------     
%V %:     f(x)   g  
%V %:     --------  
%V %:     g(f(x))   
%V %:   ----------1 
%V %:   λx.g(f(x))  
%V %:
%V $$\infer[{1}]{ \mathstrut λx.g(f(x)) }{
%V    \infer[{}]{ \mathstrut g(f(x)) }{
%V     \infer[{}]{ \mathstrut f(x) }{
%V      \mathstrut [x]^1 &
%V      \mathstrut f } &
%V     \mathstrut g } } }
%V $$

%L verbdef "foo"

\pu

$\quad
 \vcenter{\ded{x.g(f(x))}}
 \qquad
 \vcenter{\resizebox{!}{120pt}{\foo}}
$


\newpage

% «dednat.icn-2» (to ".dednat.icn-2")
% (tugp 4)

{\bf Prehistory: dednat.icn (3)}

...then I realized that I could automate the boring part.

I made the syntax of the 2D ascii art trees more rigid

and wrote a parser (in {\color{VioletDarkHard}Icon}!) that understood it.

A tree with a name tag like \ColorGreen{\tt \char`^foo} below it

would become a \ColorGreen{\tt \char`\\defded\{foo\}\{...\}} ---

\ColorRed{dednat.icn would only look for trees in `\ColorGreen{\tt \char`\%:}'-lines,}
%
%V %:  [x]^1  f    
%V %:  --------    
%V %:     f(x)   g 
%V %:     -------- 
%V %:     g(f(x))  
%V %:   ----------1
%V %:   λx.g(f(x)) 
%V %:
%V %:   ^foo
%
%L verbdef "footree"
%
%V \defded{foo}{
%V  \infer[{1}]{ \mathstrut λx.g(f(x)) }{
%V   \infer[{}]{ \mathstrut g(f(x)) }{
%V    \infer[{}]{ \mathstrut f(x) }{
%V     \mathstrut [x]^1 &
%V     \mathstrut f } &
%V    \mathstrut g } } }
%
%L verbdef "foodef"
%
\pu
$$
\myvcenter{\resizebox{!}{50pt}{\footree}}
\;\;\diagxyto/->/<200>\;\;
\myvcenter{\resizebox{!}{50pt}{\foodef}}
$$
%
and would put the `\ColorGreen{\tt \char`\\defded}'s in another file...


\newpage

% «dednat.icn-4» (to ".dednat.icn-4")
% (tugp 5)

{\bf Prehistory: dednat.icn (4)}

So that I could have this, in \ColorGreen{\tt myfile.tex}:
%
%V \input myfile.auto.dnt
%V %
%V %:  [x]^1  f    
%V %:  --------    
%V %:     f(x)   g 
%V %:     -------- 
%V %:     g(f(x))  
%V %:   ----------1
%V %:   λx.g(f(x)) 
%V %:
%V %:   ^foo
%V %
%V $$\ded{foo}$$
%
%L verbdef "footree"
%
\pu
$$
\myvcenter{\resizebox{!}{80pt}{\footree}}
\;\;\diagxyto/->/<200>\;\;
\myvcenter{\ded{x.g(f(x))}}
$$

Running `\ColorGreen{\tt dednat.icn myfile.tex}' would generate

the file \ColorGreen{\tt myfile.auto.dnt}.




\newpage

%  ____           _             _   _  _   
% |  _ \  ___  __| |_ __   __ _| |_| || |  
% | | | |/ _ \/ _` | '_ \ / _` | __| || |_ 
% | |_| |  __/ (_| | | | | (_| | |_|__   _|
% |____/ \___|\__,_|_| |_|\__,_|\__|  |_|  
%                                          
% «dednat4.lua» (to ".dednat4.lua")

{\bf Prehistory: dednat4.lua}

\ColorGreen{\tt dednat.icn} understood one kind of ``head'':

`\ColorGreen{\tt \%:}'-lines would be scanned for trees.

\msk

\ColorGreen{\tt dednat4.lua} understood three kinds of heads:

`\ColorGreen{\tt \%:}'-lines would be scanned for trees,

`\ColorGreen{\tt \%L}'-lines contained Lua code,

`\ColorGreen{\tt \%D}'-lines contained diagrams in a Forth-based language.

New heads could be added \ColorRed{dynamically}.

\bsk
\bsk
\bsk

{\scriptsize

(Actually I also had a head to define abbreviations
like `{\tt ->}' $→$ `{\tt \char`\\to\ }')

}

\newpage

% «dednat4.lua-diagram» (to ".dednat4.lua-diagram")


{\bf Dednat4.lua's language for diagrams}

Based on Forth: stack-based, and we can define words

that affect parsing --- that eat the next word or all

the rest of the line. Some words parse a 2D grid with

coordinates for nodes; other words join nodes with arrows.

Generates code for \ColorGreen{\tt diagxy.tex} (a front-end for \ColorGreen{\tt xypic}).

\def\BCCL{\mathsf{BCCL}}

%V %D diagram BCCL-std
%V %D 2Dx    100     +45                +55   +45
%V %D 2D 100 B0 <====================== B1
%V %D 2D     -\\                        -\\
%V %D 2D     | \\                       | \\
%V %D 2D     v  \\                      v  \\
%V %D 2D +20 B2 <\\> B2' ============== B3  \\
%V %D 2D      /\  \/                     /\  \/
%V %D 2D +15   \\   B4                    \\  B5
%V %D 2D        \\  -                      \\ -
%V %D 2D         \\ |                       \\|
%V %D 2D          \\v                        \v
%V %D 2D +20        B6 <===================== B7
%V %D 2D
%V %D 2D +10 b0 |---------------------> b1
%V %D 2D        |->                        |->
%V %D 2D +35        b2 |--------------------> b3
%V %D ((
%V %D    B0 .tex= f^{\prime*}P          B1 .tex= P
%V %D    B2 .tex= z^{\prime*}f^*Σ_zP    B3 .tex= z^*Σ_zP
%V %D    B4 .tex= Σ_{z'}f^{\prime*}P    B5 .tex= Σ_zP
%V %D    B6 .tex= f^*Σ_zP               B7 .tex= Σ_zP
%V %D     B2' .tex= f^{\prime*}z^*Σ_zP
%V %D    B0 B1 <-| B0 B2 -> B0 B2' -> B1 B3 -> B2 B2' <-> B2' B3 <-|
%V %D    B0 B4 |-> B1 B5 |->
%V %D    B2 B6 <-| B3 B7 <-|
%V %D    B6 B7 <-| B5 B7 -> .plabel= r \id
%V %D    B4 B6 -> sl_ .plabel= l ♮ B4 B6 <- sl^ .plabel= r \BCCL
%V %D    B0 B2' midpoint B1 B3 midpoint  harrownodes nil 20 nil <-|
%V %D    B0  B2 midpoint B4 B6 midpoint dharrownodes nil 20 nil |->
%V %D    B1  B3 midpoint B5 B7 midpoint dharrownodes nil 20 nil <-|
%V %D ))
%V %D (( b0 .tex= X×_{Y}Z b1 .tex= Z b2 .tex= X b3 .tex= Y
%V %D    b0 b1 -> .plabel= b f'
%V %D    b0 b2 -> .plabel= l z'
%V %D    b1 b3 -> .plabel= r z
%V %D    b2 b3 -> .plabel= a f
%V %D    b0 relplace 20 7 \pbsymbol{7}
%V %D ))
%V %D enddiagram
%V %
%V $$\diag{BCCL-std}$$
%
%L verbdef "BCCLstdsrc"


% «BCC»  (to ".BCC")
%
%D diagram BCCL-std
%D 2Dx    100     +45                +55   +45
%D 2D 100 B0 <====================== B1
%D 2D     -\\                        -\\
%D 2D     | \\                       | \\
%D 2D     v  \\                      v  \\
%D 2D +20 B2 <\\> B2' ============== B3  \\
%D 2D      /\  \/                     /\  \/
%D 2D +15   \\   B4                    \\  B5
%D 2D        \\  -                      \\ -
%D 2D         \\ |                       \\|
%D 2D          \\v                        \v
%D 2D +20        B6 <===================== B7
%D 2D
%D 2D +10 b0 |---------------------> b1
%D 2D        |->                        |->
%D 2D +35        b2 |--------------------> b3
%D 2D
%D ((
%D    B0 .tex= f^{\prime*}P          B1 .tex= P
%D    B2 .tex= z^{\prime*}f^*Σ_zP    B3 .tex= z^*Σ_zP
%D    B4 .tex= Σ_{z'}f^{\prime*}P    B5 .tex= Σ_zP
%D    B6 .tex= f^*Σ_zP               B7 .tex= Σ_zP
%D     B2' .tex= f^{\prime*}z^*Σ_zP
%D    B0 B1 <-| B0 B2 -> B0 B2' -> B1 B3 -> B2 B2' <-> B2' B3 <-|
%D    B0 B4 |-> B1 B5 |->
%D    B2 B6 <-| B3 B7 <-|
%D    B6 B7 <-| B5 B7 -> .plabel= r \id
%D    B4 B6 -> sl_ .plabel= l ♮ B4 B6 <- sl^ .plabel= r \BCCL
%D    B0 B2' midpoint B1 B3 midpoint  harrownodes nil 20 nil <-|
%D    B0  B2 midpoint B4 B6 midpoint dharrownodes nil 20 nil |->
%D    B1  B3 midpoint B5 B7 midpoint dharrownodes nil 20 nil <-|
%D ))
%D (( b0 .tex= X×_{Y}Z b1 .tex= Z b2 .tex= X b3 .tex= Y
%D    b0 b1 -> .plabel= b f'
%D    b0 b2 -> .plabel= l z'
%D    b1 b3 -> .plabel= r z
%D    b2 b3 -> .plabel= a f
%D    b0 relplace 20 7 \pbsymbol{7}
%D ))
%D enddiagram
%
\pu

\msk

$\quad
 \myvcenter{\resizebox{!}{80pt}{\BCCLstdsrc}}
 \;\;\diagxyto/->/<200>\;\;
 \myvcenter{\resizebox{!}{40pt}{$\diag{BCCL-std}$}}
$


\newpage

% «dednat4.lua-diagram-2» (to ".dednat4.lua-diagram-2")
% (tugp 8)

{\bf Dednat4.lua's language for diagrams (2)}

%V %D diagram adj
%V %D 2Dx     100    +25
%V %D 2D  100 LA <-| A
%V %D 2D      |      |
%V %D 2D      | <--> |
%V %D 2D      v      v
%V %D 2D  +25 B |-> RB
%V %D 2D
%V %D 2D  +15 \catB \catA
%V %D 2D
%V %D (( LA A <-|
%V %D    LA B -> A RB ->
%V %D    B RB |->
%V %D    LA RB harrownodes nil 20 nil <->
%V %D    \catB \catA <- sl^ .plabel= a L
%V %D    \catB \catA -> sl_ .plabel= b R
%V %D ))
%V %D enddiagram
%V %D
%V $$\diag{adj}$$
%
%L verbdef "adjsrc"

%D diagram adj
%D 2Dx     100   +25
%D 2D  100 LA    A
%D 2D
%D 2D  +25 B     RB
%D 2D
%D 2D  +15 \catB \catA
%D 2D
%D (( LA A <-|
%D    LA B -> A RB ->
%D    B RB |->
%D    LA RB harrownodes nil 20 nil <->
%D    \catB \catA <- sl^ .plabel= a L
%D    \catB \catA -> sl_ .plabel= b R
%D ))
%D enddiagram
%D

\msk

$\pu
  %\quad
  \myvcenter{\resizebox{!}{134pt}{\adjsrc}}
  \qquad
  \diag{adj}
$



\newpage

% «dednat4.lua-diagram-3» (to ".dednat4.lua-diagram-3")
% (tugp 9)

{\bf Dednat4.lua's language for diagrams (3)}

(See my ``Bootstrapping a Forth in 40 lines of Lua code''

in the Lua Gems book... section `Modes'')

% (find-angg ".emacs" "miniforth-article")

%V %D 𝐫diagram 𝐠adj
%V %D 𝐫2Dx𝐠     100    +25
%V %D 𝐫2D 𝐠 100 LA <-| A
%V %D 𝐫2D 𝐠     |      |
%V %D 𝐫2D 𝐠     | <--> |
%V %D 𝐫2D 𝐠     v      v
%V %D 𝐫2D 𝐠 +25 B |-> RB
%V %D 𝐫2D 𝐠
%V %D 𝐫2D 𝐠 +15 \catB \catA
%V %D 𝐫2D 𝐠
%V %D (( LA A <-|
%V %D    LA B -> A RB ->
%V %D    B RB |->
%V %D    LA RB 𝐫harrownodes 𝐠nil 20 nil 𝐛<->
%V %D    \catB \catA <- sl^ 𝐫.plabel= 𝐠a L
%V %D    \catB \catA -> sl_ 𝐫.plabel= 𝐠b R
%V %D ))
%V %D enddiagram
%V %D
%V $$\diag{adj}$$
%
%L verbdef "adjsrcb"

\msk

$\pu
  %\quad
  \myvcenter{\resizebox{!}{110pt}{\adjsrcb}}
  \;
  \begin{tabular}[c]{l}
  The words in {𝐫red} \\
  ``eat {𝐠text}''. \\
  {\tt𝐫2D} and {\tt𝐫2Dx} eat \\
  the rest of the line \\
  as a grid, and define \\
  nodes with coordinates. \\
  {\tt𝐫.plabel} modifies the \\
  arrow at the top of the \\
  stack: `{𝐠placement}' `{𝐠label}' \\
  \end{tabular}
  %\diag{adj}
$

\newpage

% «dednat4.lua-diagram-4» (to ".dednat4.lua-diagram-4")
% (tugp 10)

{\bf Dednat4.lua's language for diagrams (4)}

(See my ``Bootstrapping a Forth in 40 lines of Lua code''

in the Lua Gems book... section `Modes'')

% (find-angg ".emacs" "miniforth-article")

%V %D 𝐫diagram 𝐠adj
%V %D 𝐫2Dx𝐠     𝐜100    +25
%V %D 𝐫2D 𝐠 𝐜100 𝐧LA 𝐛<-| 𝐧A
%V %D 𝐫2D 𝐠     |      |
%V %D 𝐫2D 𝐠     | <--> |
%V %D 𝐫2D 𝐠     v      v
%V %D 𝐫2D 𝐠 𝐜+25 𝐧B 𝐛|-> 𝐧RB
%V %D 𝐫2D 𝐠
%V %D 𝐫2D 𝐠 𝐜+15 𝐧\catB \catA
%V %D 𝐫2D 𝐠
%V %D (( 𝐧LA A 𝐚<-|
%V %D    𝐧LA B 𝐚-> 𝐧A RB 𝐚->
%V %D    𝐧B RB 𝐚|->
%V %D    𝐧LA RB 𝐫harrownodes 𝐠nil 20 nil 𝐚<->
%V %D    𝐧\catB \catA 𝐚<- 𝐛sl^ 𝐫.plabel= 𝐠a L
%V %D    𝐧\catB \catA 𝐚-> 𝐛sl_ 𝐫.plabel= 𝐠b R
%V %D ))
%V %D enddiagram
%V %D
%V $$\diag{adj}$$
%
%L verbdef "adjsrcb"

\msk

$\pu
  \def𝐚{\color{green}}
  \def𝐚{\color{SpringGreenDark}}
  \def𝐛{\color{black}}
  \def𝐠{\color{black}} % {\color{SpringGreenDark}}
  \def𝐫{\color{black}} % {\color{Red}}
  \def𝐧{\color{blue}}
  \def𝐜{\color{MagentaDarkHard}}
  %\quad
  \myvcenter{\resizebox{!}{110pt}{\adjsrcb}}
  \;
  \begin{tabular}[c]{l}
  % The words in {𝐫red} \\
  % ``eat {𝐠text}''. \\
  {\tt𝐫2D} and {\tt𝐫2Dx} eat \\
  the rest of the line \\
  as a grid, and define \\
  {𝐧nodes} with {𝐜coordinates}. \\
  {𝐚Arrow words} connect the two \\
  topmost nodes in the stack. \\
  {\tt harrownodes} creates two \\
  phantom nodes for a middle \\
  horizontal arrow. \\
  \end{tabular}
  %\diag{adj}
$


\newpage

% «dednat4.lua-diagram-5» (to ".dednat4.lua-diagram-5")
% (tugp 11)

{\bf Dednat4.lua's language for diagrams (5)}

{\footnotesize

For the sake of completeness...
{𝐠\tt diagram} resets several tables,

{𝐠\tt enddiagram} outputs the table {\tt arrows} as diagxy code,

{𝐠\tt sl\char`^} and {𝐠\tt sl\char`_} slide the topmost arrow in the stack,

The `{𝐠\tt ))}' in a {𝐠\tt ((} $\ldots$ {𝐠\tt ))} block drops all top items from the

stack until the depth becomes what it was at the `{𝐠\tt ((}',

we can put Lua code in `{𝐠\tt \%L}' lines between `{𝐠\tt \%D}' lines, and...

}

%V require "diagforth"
%V 
%V storenode {TeX="a", tag="a", x=100, y=100}
%V storenode {TeX="b", tag="b", x=140, y=100}
%V = nodes
%V
%V storearrow(DxyArrow {from="a", to="b", shape="|->",
%V                      slide="5pt", label="up",
%V                      placement="a"})
%V storearrow(DxyArrow {from="a", to="b", shape=".>"})
%V storearrow(DxyPlace {nodes["a"]})
%V storearrow(DxyLiteral {"literal foobar"})
%V = arrows
%V
%V print(arrow_to_TeX(arrows[1]))
%V print(arrows[2]:TeX())
%V print(arrows[3]:TeX())
%V print(arrows[4]:TeX())
%V print(arrows_to_TeX())
%
%L verbdef "diaglua"

\msk

$\pu
  \myvcenter{\resizebox{!}{85pt}{\diaglua}}
  \;
  \begin{tabular}[c]{l}
  $𝐧←$ this Lua code \\
  shows how the \\
  low-level \\
  functions \\
  work... \\
  \\
  \end{tabular}
  %\diag{adj}
$

% (find-dn6 "diagforth.lua" "low-level-tests")




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\newpage

%  ____           _             _    __   
% |  _ \  ___  __| |_ __   __ _| |_ / /_  
% | | | |/ _ \/ _` | '_ \ / _` | __| '_ \ 
% | |_| |  __/ (_| | | | | (_| | |_| (_) |
% |____/ \___|\__,_|_| |_|\__,_|\__|\___/ 
%                                         
% «dednat6» (to ".dednat6")
% (tugp 12)

{\bf Dednat6: a semi-preprocessor}

Dednat4 is a real \ColorRed{pre-}processor ---

it generates a {\tt foo.auto.dnt} from {\tt foo.tex},

and it runs \ColorRed{before} \LaTeX.

\msk

In Dednat6 the Lua code that processes the

lines with heads like `{\tt𝐠\%L}', `{\tt𝐠\%:}', `{\tt𝐠\%D}', etc,

\ColorRed{pretends} to run \ColorRed{at the same time} as \TeX...

In fact there are synchronization points.

Each tree in a `{\tt𝐠\%:}' block generates a `{\tt𝐠\char`\\defded}'

each diagram in a `{\tt𝐠\%D}' block generates a `{\tt𝐠\char`\\defdiag}'...

`{\tt𝐠\char`\\pu}' means ``\ColorRed{process} all pending heads \ColorRed{until} the

current line'', and send the defs to \LaTeX ---


\newpage

% «dednat6-2» (to ".dednat6-2")
% (tugp 13)
% (find-dn6 "block.lua")

{\bf Dednat6: a semi-preprocessor (2)}

`{\tt𝐠\char`\\pu}' means ``\ColorRed{process} all pending heads \ColorRed{until} the

current line'', and send the defs to \LaTeX ---

This is implemented using ``blocks'' with {\tt i} and {\tt j} fields

for their starting and ending lines.


%V %D diagram triangle
%V %D 2Dx     100   +20
%V %D 2D  100 A --> B
%V %D 2D        \   |
%V %D 2D         v  v
%V %D 2D  +20       C
%V %D 2D
%V %D (( A B -> B C -> A C ->
%V %D ))
%V %D enddiagram
%V
%V $$\pu \diag{triangle}$$
%V
%V
%V %:  A  A->B  
%V %:  -------
%V %:     B      C
%V %:     --------
%V %:       B/\C
%V %:
%V %:       ^a-tree
%V %:
%V
%V $$\pu \ded{a-tree}$$
%
%L verbdef "diagramandtree"

\pu

\def\diagramandtreeexplan{
  \begin{tabular}[c]{l}
  {\tt tf = Block \{i=1, j=24, nline=1, ...\}} \\[5pt]
  First `{\tt𝐠\char`\\pu}': line 12 \\
  {\tt processuntil(12)} \\
  {\tt processlines(1, 11)} \\
  {\tt processblock \{head="{𝐠\%D}", i=1, j=10\}} \\
  {\tt output("\char`\\\char`\\defdiag\{{𝐠triangle}\}\{...\}")} \\
  {\tt nline=13} \\[5pt]
  {\tt tf} becomes {\tt\{i=1, j=24, nline=13, ...\}} \\[5pt]
  Second `{\tt𝐠\char`\\pu}': line 24 \\
  {\tt processuntil(24)} \\
  {\tt processlines(13, 23)} \\
  {\tt processblock \{head="{𝐠\%:}", i=15, j=22\}} \\
  {\tt output("\char`\\\char`\\defded\{{𝐠a-tree}\}\{...\}")} \\
  {\tt nline=25} \\
  \\
  \end{tabular}
}

$\myvcenter{\resizebox{!}{95pt}{\diagramandtree}}
  \quad
  \begin{tabular}[c]{l}
  `{\tt𝐠\%D}' block: lines 1--10 \\
  First `{\tt𝐠\char`\\pu}': line 12 \\
  `{\tt𝐠\%:}' block: lines 15--22 \\
  Second `{\tt𝐠\char`\\pu}': line 24 \\
  \\
  Whole .tex file: lines 1--24
  \end{tabular}
$


\newpage

% «dednat6-3» (to ".dednat6-3")
% (tugp 14)

{\bf Dednat6: a semi-preprocessor (3)}

% (find-dn6 "block.lua")
% (tuap 1)
% (tua)

`{\tt𝐠\char`\\pu}' means ``\ColorRed{process} all pending heads \ColorRed{until} the

current line'', and send the defs to \LaTeX ---

This is implemented using ``blocks'' with {\tt i} and {\tt j} fields

for their starting and ending lines.

\msk

\pu
$
  \myvcenter{\resizebox{!}{95pt}{\diagramandtree}}
  \;\;
  \resizebox{!}{50pt}{\diagramandtreeexplan}
$

\newpage

{\bf Dednat6: a semi-preprocessor (4)}

$
  \myvcenter{\resizebox{!}{140pt}{\diagramandtree}}
  \;\;
  \resizebox{!}{72pt}{\diagramandtreeexplan}
$




\newpage

%  ____                      _                 _      __  _            _   
% |  _ \  _____      ___ __ | | ___   __ _  __| |    / / | |_ ___  ___| |_ 
% | | | |/ _ \ \ /\ / / '_ \| |/ _ \ / _` |/ _` |   / /  | __/ _ \/ __| __|
% | |_| | (_) \ V  V /| | | | | (_) | (_| | (_| |  / /   | ||  __/\__ \ |_ 
% |____/ \___/ \_/\_/ |_| |_|_|\___/ \__,_|\__,_| /_/     \__\___||___/\__|
%                                                                          
% «download-test» (to ".download-test")
% (tugp 15)

{\bf Downloading and testing}

I gave up (temporarily?) keeping a package or a git repo

of Dednat6... but if you run something like this in a shell,

% (find-angg "dednat6/2017planar-has-1.tex")

%V rm -rfv /tmp/edrx-latex/
%V mkdir   /tmp/edrx-latex/
%V cd      /tmp/edrx-latex/
%V # See: http://angg.twu.net/LATEX/2017planar-has-1.pdf
%V wget   http://angg.twu.net/LATEX/2017planar-has-1.tgz
%V tar -xvzf 2017planar-has-1.tgz
%V lualatex  2017planar-has-1.tex
%
%L verbdef "downloadtest"

$\pu
  \myvcenter{\resizebox{!}{50pt}{\downloadtest}}
$

you download and unpack a .tgz with the full source code

for {\tt𝐠2017planar-has-1.pdf}, including a full version of

Dednat6, and all the (non-standard) \TeX{} files...

The home page of dednat6

\url{http://angg.twu.net/dednat6.html}

points to several such .tgzs, both simple and complex.


\newpage

%  _____      _                 _                 
% | ____|_  _| |_ ___ _ __  ___(_) ___  _ __  ___ 
% |  _| \ \/ / __/ _ \ '_ \/ __| |/ _ \| '_ \/ __|
% | |___ >  <| ||  __/ | | \__ \ | (_) | | | \__ \
% |_____/_/\_\\__\___|_| |_|___/_|\___/|_| |_|___/
%                                                 
% «extensions» (to ".extensions")
% (tugp 16)

{\bf Extensions}

It is easy to extend Dednat6 with new heads...

For example, for these slides I created a head `{\tt𝐠\%V}'

for a Dednat6-based verbatim mode...

the Lua code was initially just this:

%V registerhead "%V" {
%V   name   = "myverbatim",
%V   action = function ()
%V       local i,j,verbatimlinesorig = tf:getblock()
%V       verbatimlines = verbatimlinesorig
%V     end,
%V }
%
%L verbdef "verbatimhead"
$\pu
  \myvcenter{\resizebox{!}{50pt}{\verbatimhead}}
$

Dednat6 would take each block of `{\tt𝐠\%V}' lines and

store its contents in the global variable {\tt𝐠verbatimlines},

that I would process in Lua in `{\tt𝐠\%L}' lines to generate

the \LaTeX{} code that I want...

\newpage

%  _   _            _    _             
% | | | | __ _  ___| | _(_)_ __   __ _ 
% | |_| |/ _` |/ __| |/ / | '_ \ / _` |
% |  _  | (_| | (__|   <| | | | | (_| |
% |_| |_|\__,_|\___|_|\_\_|_| |_|\__, |
%                                |___/ 
% «hacking» (to ".hacking")

{\bf Hacking}

Hacking something usually consists of these stages:

1) ``reading'': understanding docs, data structures, code

2) making tests, dumping data structures

3) ``writing'': implementing new things

\msk

Here's how to do (1):

Learn a tiny bit of Emacs and eev:

\url{http://angg.twu.net/\#eev}

and run the ``eepitch blocks'' in the Lua source files...




\newpage

%  _____           _ _       _     
% | ____|___ _ __ (_) |_ ___| |__  
% |  _| / _ \ '_ \| | __/ __| '_ \ 
% | |__|  __/ |_) | | || (__| | | |
% |_____\___| .__/|_|\__\___|_| |_|
%           |_|                    
%
% «eepitch-blocks» (to ".eepitch-blocks")
% (find-dn6 "diagforth.lua" "low-level-tests")

{\bf Eepitch blocks in comments in Lua files}

This is a comment block in {\tt dednat6/diagforth.lua}:

%V --[==[
%V * (eepitch-lua51)
%V * (eepitch-kill)
%V * (eepitch-lua51)
%V require "diagforth"
%V storenode {TeX="a", tag="a", x=100, y=100}
%V storenode {TeX="b", tag="b", x=140, y=100}
%V = nodes
%V
%V storearrow(DxyArrow {from="a", to="b", shape="|->",
%V                      slide="5pt", label="up",
%V                      placement="a"})
%V storearrow(DxyArrow {from="a", to="b", shape=".>"})
%V storearrow(DxyPlace {nodes["a"]})
%V storearrow(DxyLiteral {"literal foobar"})
%V = arrows
%V
%V --]==]
%
%L verbdef "testa"
\pu
$\myvcenter{\resizebox{!}{80pt}{\testa}}
$

It is an ``e-script'' --- an {\sl executable log} of an experiment

that I was doing. It can be ``played back'' by typing

`F8's in Emacs+eev --- an `F8' on a red star line runs

that line as Lisp code ($→$ set up a target buffer)...

\newpage

{\bf Eepitch blocks in comments in Lua files (2)}

%V --[==[
%V * (eepitch-lua51)
%V * (eepitch-kill)
%V * (eepitch-lua51)
%V require "diagforth"
%V storenode {TeX="a", tag="a", x=100, y=100}
%V storenode {TeX="b", tag="b", x=140, y=100}
%V = nodes
%V
%V 𝐮(...)
%V --]==]
%
%L verbdef "testa"
\pu
$\myvcenter{\resizebox{!}{95pt}{\testa}}
$

An `F8' on a red star line runs that line as Lisp code

($→$ set up a target buffer with a Lua interpreter)

and an `F8' on a non-red star line sends that line to

the target buffer as if the user had typed it...


\newpage

%  ____  _____ ____  _         
% |  _ \| ____|  _ \| |    ___ 
% | |_) |  _| | |_) | |   / __|
% |  _ <| |___|  __/| |___\__ \
% |_| \_\_____|_|   |_____|___/
%                              
% «repls» (to ".repls")

{\bf REPLs}

Here's a screenshot.

\ssk

% (find-es "imagemagick" "convert")
% (find-sh0 "convert tug-slides-ss1.png -resize 200% tug-slides-ss2.png")
% (find-fline                "tug-slides-ss1.png")
% (find-fline                "tug-slides-ss2.png")
\includegraphics[width=240pt]{tug-slides-ss1.png}

{\footnotesize

Left Emacs window: the e-script buffer. The cursor is there:
{\color{RedOrangeDark}\vrule width 5pt height 7pt depth 1pt}.

We have just executed an eepitch block with `F8's.

\ssk

Right Emacs window: the target buffer, with a terminal

running Lua 5.1 in interactive (Read/Eval/Print/Loop) mode.

Blue `$𝐮>$'s: Lua prompts. Bold white: user input (sent with `F8's).

\ssk

{𝐫Here we used just Lua, not Lua\LaTeX.}

}

% (find-lua51manual "#6")

\newpage

%  _                                  _ 
% | |_   _  __ _       _ __ ___ _ __ | |
% | | | | |/ _` |_____| '__/ _ \ '_ \| |
% | | |_| | (_| |_____| | |  __/ |_) | |
% |_|\__,_|\__,_|     |_|  \___| .__/|_|
%                              |_|      
% «repls-2» (to ".repls-2")
% (find-dn6 "luarepl.lua")
% (find-dn6 "lua-repl/")
% (tugp 22)

{\bf REPLs (2)}

It is also possible to run Rob Hoelz's lua-repl

from inside Lua\LaTeX. Here's a screenshot.

% (find-fline                "tug-slides-sslr1.png")
%\includegraphics[width=220pt]{tug-slides-sslr1.png}
% (find-fline                "tug-slides-sslr1.png")
\includegraphics[width=240pt]{tug-slides-sslr2.png}

\setbox0=\hbox{abc}
%\directlua{print();print();sync:run()}
\def\IGNORETHIS{
* (eepitch-shell)
* (eepitch-kill)
* (eepitch-shell)
lualatex tug-slides.tex
print(tex.box[0])
print(tex.box[0].id,             node.id("hlist"))
print(tex.box[0].list)
print(tex.box[0].list.id,        node.id("glyph"))
print(tex.box[0].list.char,      string.byte("a"))
print(tex.box[0].list.next)
print(tex.box[0].list.next.char, string.byte("b"))

}

When you are a Bear of Very Little Brain ---

like me --- Lua\TeX's interface to \TeX{} boxes

looks very hard... lua-repl may help.


\newpage

%  _   _ _______   __
% | | | | ____\ \ / /
% | |_| |  _|  \ V / 
% |  _  | |___  | |  
% |_| |_|_____| |_|  
%                    
% «hey» (to ".hey")

{\bf \Large HEY!!!}

From \url{http://angg.twu.net/dednat6.html}:

\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, {𝐫let's chat} --- {\sl
  please}!

\msk

{\sl 
Maybe I can typeset in 20 minutes a diagram that took you

a day, maybe I can implement an extension that you need...
}





\end{document}



% Local Variables:
% coding: utf-8-unix
% End: