|
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: