diff options
author | Norbert Preining <norbert@preining.info> | 2022-10-21 03:01:06 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2022-10-21 03:01:06 +0000 |
commit | b3bdf86b91849c38a256c86082770bf854db7610 (patch) | |
tree | b256f6bb18ff67fbc9d3d2a00257b6b0e967e6c7 /macros/latex/contrib/eolang/eolang.dtx | |
parent | 3b961a61ef9fb89adf20a89550d5de0bfe135448 (diff) |
CTAN sync 202210210301
Diffstat (limited to 'macros/latex/contrib/eolang/eolang.dtx')
-rw-r--r-- | macros/latex/contrib/eolang/eolang.dtx | 415 |
1 files changed, 415 insertions, 0 deletions
diff --git a/macros/latex/contrib/eolang/eolang.dtx b/macros/latex/contrib/eolang/eolang.dtx new file mode 100644 index 0000000000..b10f1a8c35 --- /dev/null +++ b/macros/latex/contrib/eolang/eolang.dtx @@ -0,0 +1,415 @@ +% \iffalse meta-comment +% (The MIT License) +% +% Copyright (c) 2021-2022 Yegor Bugayenko +% +% Permission is hereby granted, free of charge, to any person obtaining a copy +% of this software and associated documentation files (the 'Software'), to deal +% in the Software without restriction, including without limitation the rights +% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +% copies of the Software, and to permit persons to whom the Software is +% furnished to do so, subject to the following conditions: +% +% The above copyright notice and this permission notice shall be included in all +% copies or substantial portions of the Software. +% +% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +% SOFTWARE. +% \fi + +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} + +% \GetFileInfo{eolang.dtx} +% \DoNotIndex{\endgroup,\begingroup,\let,\else,\s,\n,\r,\\,\1,\fi} + +% \iffalse +%<*driver> +\ProvidesFile{eolang.dtx} +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{eolang} +%<*package> +[2022-10-20 0.0.1 Formulas and Graphs for EO Programming Language] +%</package> +%<*driver> +\documentclass{ltxdoc} +\usepackage[maxnames=1,minnames=1,maxbibnames=1,natbib=true,citestyle=authoryear,bibstyle=authoryear,doi=false,url=false,isbn=false,isbn=false]{biblatex} +\addbibresource{main.bib} +\usepackage[tt=false, type1=true]{libertine} +\usepackage{microtype} +\usepackage{graphicx} +\usepackage[runs=1,dtx]{docshots} +\docshotPrerequisite{eolang.sty} +\usepackage{eolang} +\usepackage{href-ul} +\PageIndex +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\begin{document} + \DocInput{eolang.dtx} + \PrintChanges + \PrintIndex +\end{document} +%</driver> +% \fi + +% \title{\includegraphics[height=1in]{cactus.pdf} \\ |eolang|: \LaTeX{} Package \\ for Formulas and Graphs \\ of EO Programming Language \\ and $\varphi$-calculus\thanks{The sources are in GitHub at \href{https://github.com/yegor256/eolang.sty}{yegor256/eolang.sty}}} +% \author{Yegor Bugayenko \\ \texttt{yegor256@gmail.com}} +% \date{\filedate, \fileversion} +% +% \maketitle +% +% \textbf{NB!} +% You must run \TeX{} processor with |--shell-escape| option +% and you must have \href{https://www.perl.org}{Perl} installed. + +% \section{Introduction} +% +% This package helps you print formulas of $\varphi$-calculus, +% which is a formal foundation of \href{https://www.eolang.org}{EO} +% programming language. The calculus was introduced by \citet{bugayenko2021eolang} +% and later formalized by \citet{kudasov2021}. Here is how you render +% a simple expression: +% \begin{docshot} +% \documentclass{article} +% \pagestyle{empty} +% \usepackage{eolang} +% \begin{document} +% \begin{phiquation*} +% a -> [ +% b -> [ c -> |x|(56), +% \rho -> |hello|(\xi), +% \Delta ~> |01-FE-C3| ]], + +% x -> [ \lambda ~> M_1 ]. +% \end{phiquation*} +% \end{document} +% \end{docshot} + +% \DescribeEnv{phiquation} +% The environment |phiquation| lets you write a $\varphi$-calculus expressions +% using simple plain-text notation, where: +% \begin{itemize}\setlength\itemsep{0em} +% \item ``|->|'' maps to ``$\mapsto$'' (|\mapsto|), +% \item ``|~>|'' maps to ``$\mapstochar\dashrightarrow$'' (|\mapstochar\dashrightarrow|), +% \item ``|[|'' maps to ``$\llbracket$'' (|\llbracket|), +% \item ``|]|'' maps to ``$\rrbracket$'' (|\rrbracket|), +% \item ``$\vert$|abc|$\vert$'' maps to ``\texttt{abc}'' (|\texttt{abc}|). +% \end{itemize} + +% \DescribeMacro{\phiq} +% The command |\phiq| lets you inline a $\varphi$-calculus expressions +% using the same simple plain-text notation: +% \begin{docshot} +% \documentclass{article} +% \usepackage[paperwidth=2in]{geometry} +% \pagestyle{empty} +% \usepackage{eolang} +% \begin{document} +% A simple object +% \phiq{x -> [\varphi -> y]} +% is a decorator of +% the data object +% \phiq{y -> [\Delta ~> 42]}. +% \end{document} +% \end{docshot} + +% \DescribeEnv{phigure} +% The environment |phigure| allows you to draw a \href{https://github.com/objectionary/sodg}{SODG} graph: +% \begin{docshot} +% \documentclass{article} +% \pagestyle{empty} +% \usepackage{eolang} +% \begin{document} +% \begin{phigure} +% v0 +% v1 xy:v0,-2,+1 data:|42| +% v0->v1 a:$x$ rho +% v2 xy:v0,+1,+1 atom:$\xi.x+1$ +% v1->v2 a:|hi| bend:-15 +% v2->v0 pi bend:10 +% \end{phigure} +% \end{document} +% \end{docshot} +% The content of the environment is parsed line by line. Markers in each line are +% separated by a single space. The first marker is either a unique name of a +% vertex, like |v1| in the example above, or an edge, like |v0->v1|. All other markers are either +% unary like |rho| or binary like |atom:$\xi.x+1$|. Binary markers have two +% parts, separated by colon. The following markers are supported for a vertex: +% \begin{itemize}\setlength\itemsep{0em} +% \item ``|data:[<box>]|'' makes it a data vertex with an optional attached |<box>|, +% \item ``|atom:[<box>]|'' makes it an atom with an optional attached |<box>|, +% \item ``|box:<txt>|'' attaches a |<box>| to it, +% \item ``|xy:<v>,<r>,<d>|'' places this vertex in a position relative to the vertex |<v>|, +% shifting it right by |<r>| % and down by |<d>| centimetres. +% \end{itemize} +% The following markers are supported for an edge: +% \begin{itemize}\setlength\itemsep{0em} +% \item ``|rho|'' places a backward snake arrow to the edge, +% \item ``|rrho|'' places a reverse |rho|, +% \item ``|bend:<angle>|'' bend it right by the amount of |<angle>|, +% \item ``|a:<txt>|'' attaches label |<txt>| to it, +% \item ``|pi|'' makes it dotted, with $\pi$ label. +% \end{itemize} + +% \StopEventually{} + +% \section{Implementation} + +% \changes{v0.0.1}{2022/10/05}{Initial version} + +% First, we include a few packages: +% \begin{macrocode} +\RequirePackage{stmaryrd} +\RequirePackage{amsmath} +\RequirePackage{amsfonts} +\RequirePackage{iexec} +\RequirePackage{fancyvrb} +% \end{macrocode} + +% \begin{macro}{\eolang@env} +% Then, we define |\eolang@env| supplementary command. +% It is implemented with the help of |\iexec| from +% \href{https://github.com/yegor256/iexec}{iexec} package: +% \begin{macrocode} +\makeatletter\newcommand\eolang@env[2]{ + \iexec[trace]{ + /bin/echo -n '\\begin{#1}\\begin{split} &'; + /bin/echo -n '\detokenize{#2}' + | perl -pe 's/^\\r\\+//g' + | perl -pe 's/\\r\\+$//g' + | perl -pe 's/->/\\\\mapsto/g' + | perl -pe 's/\unexpanded{~}>/\\\\mapstochar\\\\dashrightarrow/g' + | perl -pe 's/\\|([^\\|]+)\\|/\\\\texttt{\\1}/g' + | perl -pe 's/\\[/\\\\llbracket/g' + | perl -pe 's/\\]/\\\\rrbracket/g' + | perl -pe 's/\\r\\r/\\\\\\\\ \&/g' + | perl -pe 's/\\r/\\\\\\\\[-4pt] \&/g' + | perl -pe 's/([^& ]) {2}([^ ])/\\1 \\2/g' + | perl -pe 's/ {2}/\\\\quad{}/g' + ; + /bin/echo -n '\\end{split}\\end{#1}\\endinput' + }% +}\makeatother +% \end{macrocode} +% \end{macro} + +% \begin{macro}{phiquation} +% Then, we define |phiquation| and |phiquation*| environments: +% \begin{macrocode} +\makeatletter +\NewDocumentEnvironment{phiquation*}{b}{% + \eolang@env{equation*}{#1} +}{} +\NewDocumentEnvironment{phiquation}{b}{% + \eolang@env{equation}{#1} +}{} +\makeatother +\AddToHook{env/phiquation*/begin}{\obeylines\obeyspaces} +\AddToHook{env/phiquation/begin}{\obeylines\obeyspaces} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\phiq} +% Then, we define |\phiq| command: +% \begin{macrocode} +\newcommand\phiq[1]{ + \iexec[trace]{ + /bin/echo -n '$'; + /bin/echo -n '\detokenize{#1}' + | perl -pe 's/->/\\\\mapsto/g' + | perl -pe 's/\unexpanded{~}>/\\\\mapstochar\\\\dashrightarrow/g' + | perl -pe 's/\\[/\\\\llbracket/g' + | perl -pe 's/\\]/\\\\rrbracket/g' + ; + /bin/echo -n '$\\endinput' + }% +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{Perl} +% Then, create a Perl script: +% \begin{macrocode} +\begin{VerbatimOut}{\jobname.pl.eolang} +$tex = $ARGV[0]; +$tex =~ s/^\s+|\s+$//g; +$tex =~ s/(\\[a-zA-Z]+)\s+/\1/g; +$tex =~ s/\r\s+/\r/g; +$tex =~ s/\|([^\|]+)\|/\\texttt{\1}/g; +my @cmds = split (/\r/g, $tex); +print '\begin{phig}', "\n"; +foreach my $c (@cmds) { + my ($head, $tail) = split (/ /, $c, 2); + my %opts = {}; + foreach my $p (split (/ /, $tail)) { + my ($q, $t) = split (/:/, $p); + $opts{$q} = $t; + } + if (index($head, '->') == -1) { + print '\node['; + if (exists $opts{'xy'}) { + my ($v, $right, $down) = split(/,/, $opts{'xy'}); + print ',below right='; + print $down; + print 'cm and '; + print $right; + print 'cm of '; + print $v; + } + if (exists $opts{'data'}) { + print ',phi-data'; + if (not $opts{'data'} eq '') { + $opts{'box'} = $opts{'data'}; + } + } elsif (exists $opts{'atom'}) { + print ',phi-atom'; + if (not $opts{'atom'} eq '') { + $opts{'box'} = $opts{'atom'}; + } + } else { + print ',phi-object'; + } + print ']'; + print ' (', $head, ')'; + print ' {$'; + if ($head eq 'v0') { + print '\Phi'; + } else { + print 'v_', substr($head, 1); + } + print '$}'; + if (exists $opts{'box'}) { + print ' node[phi-box] at ('; + print $head, '.south east) {'; + print $opts{'box'}, '}'; + } + } else { + print '\draw['; + if (exists $opts{'pi'}) { + print ',phi-pi'; + if (not exists $opts{'a'}) { + $opts{'a'} = '$\pi$'; + } + } + print ']'; + my ($from, $to) = split (/->/, $head); + print ' (', $from, ') '; + if (exists $opts{'bend'}) { + print 'edge [bend right=', $opts{'bend'}, ']'; + } else { + print '--'; + } + if (exists $opts{'rho'} or exists $opts{'rrho'}) { + print ' pic[sloped,phi-rho]{parallel arrow={'; + print '-' if not exists $opts{'rrho'}; + print '0.3,-0.15}}'; + } + if (exists $opts{'a'}) { + print ' node [phi-attr] {', $opts{'a'}, '}'; + } + print ' (', $to, ')'; + } + print ";\n"; +} +print '\end{phig}', "\n", '\endinput'; +\end{VerbatimOut} +\message{^^Jeolang: file with Perl script (\jobname.pl.eolang) saved^^J}% +\iexec[trace,stdout=/dev/null]{ + perl -pi -e 's/(\\\\[a-zA-Z])\\s+/\\1/g' \jobname.pl.eolang} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{phigure} +% Then, we include |tikz| package and its libraries: +% \begin{macrocode} +\RequirePackage{tikz} + \usetikzlibrary{arrows} + \usetikzlibrary{shapes} + \usetikzlibrary{decorations} + \usetikzlibrary{decorations.pathmorphing} + \usetikzlibrary{intersections} + \usetikzlibrary{positioning} + \usetikzlibrary{backgrounds} + \usetikzlibrary{calc} + \usetikzlibrary{shapes.arrows} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{phig} +% Then, we define internal environment |phig|: +% \begin{macrocode} +\newenvironment{phig}% + {\noindent\begin{tikzpicture}[ + ->,>=stealth',node distance=0,thick, + pics/parallel arrow/.style={ + code={\draw[-latex,phi-rho] (##1) -- (-##1);}}]}% + {\end{tikzpicture}} +\tikzstyle{transforms} = [fill=white!80!black, single arrow, + minimum height=0.5cm, minimum width=0.5cm, + single arrow head extend=2mm] +\tikzstyle{phi-thing} = [thick,inner sep=0pt,minimum height=2.4em, + draw,font={\small}] +\tikzstyle{phi-object} = [phi-thing,circle] +\tikzstyle{phi-data} = [phi-thing,regular polygon, + regular polygon sides=8] +\tikzstyle{phi-empty} = [phi-object] +\tikzstyle{phi-rho} = [draw,decorate,decoration={ + snake,amplitude=.4mm,segment length=2mm,post length=1mm}] +\tikzstyle{phi-pi} = [draw,dotted] +\tikzstyle{phi-atom} = [phi-object,double] +\tikzstyle{phi-box} = [xshift=-5pt,yshift=3pt,draw,fill=white, + rectangle,thin,minimum width=1.2em,anchor=north west, + font={\scriptsize}] +\tikzstyle{phi-attr} = [midway,sloped,inner sep=0pt, + above=2pt,sloped/.append style={transform shape}, + font={\scriptsize},color=black] +% \end{macrocode} +% \end{macro} + +% \begin{macro}{phigure} +% Then, create a new environment |figure|, as suggested +% \href{https://tex.stackexchange.com/questions/661056}{here}: +% \begin{macrocode} +\NewDocumentEnvironment{phigure}{b}{% + \catcode`\ =10 % + \catcode`\^^M=5 % + \iexec[trace,stdout=\jobname.tex.eolang]{ + perl \jobname.pl.eolang '\detokenize{#1}'}% +}{} +\AddToHook{env/phigure/before}{\bgroup\obeylines\obeyspaces} +\AddToHook{env/phigure/after}{\egroup} +% \end{macrocode} +% \end{macro} + +% \Finale + +%\clearpage + +% \printbibliography + +%\PrintChanges +%\clearpage +%\PrintIndex |