% \iffalse meta-comment % % File: codeanatomy.dtx Copyright (C) 2019 Hong-Phuc Bui % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this % license or (at your option) any later version. The latest version % of this license is in the file % % https://www.latex-project.org/lppl.txt % % % ----------------------------------------------------------------------- % % The development version of the bundle can be found at % % https://github.com/hpb-htw/codeanatomy % % for those people who are interested. % % ----------------------------------------------------------------------- % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[2018/12/01] %\ProvidesPackage{codeanatomy}[2023/01/24 v0.4-Beta draw Code Anatomy] % \fi % % \iffalse %<*driver> \documentclass[full]{l3doc} \usepackage{fontspec} \usepackage{luaotfload} \usepackage{biblatex} \addbibresource{literatur.bib} \newcommand{\slsh}{\textbackslash{}} \newcommand{\TikZ}{Ti\textit{k}Z} \newcommand{\fixedBug}[1]{\tikz[baseline=(X.base)]\node[cross out,draw] (X) {#1};} \def\thinmargin{\list{}{\rightmargin-50pt\leftmargin-90pt}\item[]} \let\endthinmargin=\endlist \usepackage{listings} \lstset { basicstyle=\small\ttfamily ,escapeinside={+}{+} } \usepackage{codeanatomy} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \GetFileInfo{\jobname.sty} % \DoNotIndex{\definecolor, \colorlet} % \DoNotIndex{\NewDocumentCommand, \node} % \DoNotIndex{\phantom} % \DoNotIndex{\RequirePackage, \rule} % \DoNotIndex{\small, \sffamily} % \DoNotIndex{\textcolor, \tikzmarknode, \tikzset, \ttfamily} % \DoNotIndex{\usetikzlibrary} % % \title{^^A % \pkg{codeanatomy} -- Draw Code Anatomy^^A % \thanks{This file describes \fileversion, ^^A % last revised \filedate.}\\[1ex]^^A % \normalsize{Reference}^^A % }^^A % % \author{^^A % Hồng-Phúc Bùi^^A % \thanks{^^A % E-mail: % \href{mailto:Hồng-Phúc Bùi} % {hong-phuc.bui (at) htwsaar dot de}^^A % }^^A % } % % \date{Released \filedate} % % \parindent0pt % % \maketitle % \tableofcontents % % \section{Hints} % Usage of this Package can be found in \texttt{codeanatomy.usage.pdf} and \texttt{codeanatomy.lstlisting.pdf}. % This document show only generated reference of commands in this Package. % % ^^A %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Implementation} % % \changes{v0.2-Alpha} % {2019/07/10} % {This package does not load \pkg{xcolor} anymore. % It relies on \pkg{tikz}, that \pkg{tikz} loads \pkg{xcolor} % in a way that \pkg{codeanatomy} can define RGB color} % % % \subsection{Package Dependenies} % % \begin{macrocode} \RequirePackage{expl3} \RequirePackage{xparse} \RequirePackage{tikz} % \end{macrocode} % % Load necsessary \TikZ{} libraries. % \begin{macrocode} \usetikzlibrary{ tikzmark ,fit ,arrows.meta ,bending ,shapes ,chains ,backgrounds ,scopes ,decorations ,decorations.pathmorphing } % \end{macrocode} % % \subsection{Setup styles} % ^^A+++++++++++++++++++++ % \subsubsection{Colors} % ^^A------------------- % Define colors which are used in \pkg{codeanatomy} % \DescribeMacro{annotationcolor} % \tikz{\draw[fill=annotationcolor] circle(1ex); } % \begin{macrocode} \definecolor{annotationcolor} {rgb}{0,0.50002,1} % Blue % \end{macrocode} % % \DescribeMacro{bgcmdcolor} % \tikz{\draw[fill=bgcmdcolor] circle(1ex); } % \begin{macrocode} \colorlet{bgcmdcolor}{gray} % Grey % \end{macrocode} % % \subsubsection{\TikZ{} styles for code in a Code Anatomy} % ^^A------------------------------------------------------ % % \DescribeMacro{anatomy} % \TikZ{} style for annotation labels: \\ % |\tikz{\node(code) [anatomy] at (0,0) {code line 1\\code line 2}; }|\\ % yields \tikz{\node(code) [anatomy] at (0,0) {code line 1\\code line 2}; } % \begin{macrocode} \tikzset{anatomy/.style={% anchor=south west,% inner sep=0,% align=left,% font=\ttfamily } } % \end{macrocode} % % % % \DescribeMacro{code part} % \TikZ{} style to mark a piece of code in an anatomy: \\ % |\tikz{\node(code) [code part] at (0,0) {let a = 12;};}|\\ % yields \tikz{\node(code) [code part] at (0,0) {let a = 12;};} % \begin{macrocode} \tikzset{code part/.style={% rectangle,% draw=annotationcolor,% align=left,% minimum height=1.175em,% inner sep=1.75pt,% outer sep=0.1pt,% font=\ttfamily } } % \end{macrocode} % % % \DescribeMacro{ignored code part} % \TikZ{} style to make a pice of code in an anatomy as not important in currently talking context % |\tikz{\node(ignore code) [ignored code part] at (0,0) {/*some comment*/} }| % yields \tikz{\node(ignore code) [ignored code part] at (0,0) {/*some comment*/} } % % \changes{v0.4-Beta} % {2023/01/24} % {Add new \TikZ{} Style \texttt{ignored code part}}% % % \begin{macrocode} \tikzset{ignored code part/.style={% code part,% draw=none,color=bgcmdcolor,% inner sep=0.75pt } } % \end{macrocode} % % % % % \DescribeMacro{fit extrem} % \TikZ{} style to mark a piece of multiple line code in an anatomy:\\ % |\tikz{ \node(c)[fit extrem, fit={(0,0) (0.5,0.975) (1,0)}] {}; }|\\ % yields \tikz{ \node(c)[fit extrem, fit={(0,0) (0.5,0.975) (1,0)}] {}; } % \begin{macrocode} \tikzset{fit extrem/.style={% rectangle,% draw=annotationcolor,% align=left,% minimum height=1.175em,% inner sep=1.75pt,% outer sep=0.1pt,% font=\ttfamily } } % \end{macrocode} % % % % % \DescribeMacro{annotation} % \TikZ{} style of arrows from annotation labels to code parts:\\ % |\tikz{\draw[] (1,0) circle(3ex); \draw[->,annotation] (0,0) -- (1,0);}|\\ % yields % \tikz{\draw[] (1,0) circle(3ex); \draw[->,annotation] (0,0) -- (1,0);} % % \changes{v0.4-Alpha} % {2019/07/12} % {Set \texttt{fill} to \texttt{annotationcolor} explicit for arrow style} % % \begin{macrocode} \tikzset{annotation/.style={% preaction={ draw=white,% line width=3.5pt,% arrows={-Triangle Cap[]},% },% draw=annotationcolor,% arrows={-Latex[% round,% color=annotationcolor, fill=annotationcolor ] }, shorten >=0.25pt } } % \end{macrocode} % % % \DescribeMacro{code annotation} % \TikZ{} style for a annotation label \tikz{\node(a)[code annotation] at (0,0) {function name};} % \begin{macrocode} \tikzset{code annotation/.style={% inner sep=2pt,% text=annotationcolor,% align=center,% font=\sffamily\small } } % \end{macrocode} % % % % \DescribeMacro{code grid debug} % \TikZ{} style to draw debug grid on the background of anatomy % \begin{macrocode} \tikzset{code grid debug/.style={% step=1.0,% draw=gray!20,% very thin,% on background layer } } % \end{macrocode} % % % ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % \subsection{Command used to set code and code anatomy} % ^^A--------------------------------------------------- % % % \DescribeMacro{\codeBlock} \marg{code} % % Complete code listing of a Code Anatomy figure is typeset by this command. % Whereas \marg{code} is the \emph{formatted} code listing. % This command can be used if there are no other packages to typeset code listing in use. % \begin{macrocode} \NewDocumentCommand{\codeBlock}{m}% {\node(code) [anatomy] at (0,0) {#1};}% % \end{macrocode} % % % % \DescribeMacro{\cPart} \oarg{style} \marg{node name}\marg{piece of code} % % Assign a piece of typeset code --typical in one line-- to a \TikZ{} Node, so that it can % be annotated. % \begin{itemize} % \item \oarg{style} a defined \TikZ{} style to be applied to this node, the style |code part| % is applied to the node per default. % \item \marg{node name} is a unique \TikZ{} node name in the |tikzpicture| % \item \marg{piece of code} is a single code part to be marked. % \end{itemize} % % \changes{v0.4-Beta} % {2023/01/24} % {Add option \oarg{style} to \texttt{cPart}}% % % \begin{macrocode} \NewDocumentCommand\cPart{O{code part}mm} {\tikzmarknode[#1]{#2}{#3}} % \end{macrocode} % % % % \DescribeMacro{\iPart} \marg{node name}\marg{piece of code} % % Assign a piece of typeset code --typical in one line-- to a \TikZ{} Node, so that it can % be annotated. It does not plot border around the pice of code as |\cPart| does. % \begin{itemize} % \item \oarg{style} a defined \TikZ{} style to be applied to this node, the style |ignored code part| % is applied to the node per default. % \item \marg{node name} is a unique \TikZ{} node name in the |tikzpicture| % \item \marg{piece of code} is a single code part to be marked. % \end{itemize} % % \changes{v0.4-Beta} % {2023/01/24} % {Add option \oarg{style} to \texttt{iPart}} % % \begin{macrocode} \NewDocumentCommand{\iPart}{O{ignored code part}mm} % {\tikzmarknode[#1]{#2}{#3}} % \end{macrocode} % % % % % \DescribeMacro{\mtPoint}\marg{node name} % % Marks a point as a \textbf{m}ost \textbf{t}op in a Code Block. % \begin{macrocode} \NewDocumentCommand{\mtPoint}{m} {\tikzmarknode{#1}{\phantom{\rule[1.8ex]{0.1ex}{0.1ex}}}} % \end{macrocode} % % % % \DescribeMacro{\hmtPoint}\marg{node name} % % Marks a point as a \textbf{h}eigher \textbf{m}ost \textbf{t}op point in a Code Block. % \begin{macrocode} \NewDocumentCommand{\hmtPoint}{m} {\tikzmarknode{#1}{\phantom{\rule[2.5ex]{0.1ex}{0.1ex}}}} % \end{macrocode} % % % % \DescribeMacro{\mbPoint}\marg{node name} % % Marks a point as a \textbf{d}eeper \textbf{m}ost \textbf{b}ottom point in a Code Block. % \begin{macrocode} \NewDocumentCommand{\mbPoint}{m} {\tikzmarknode{#1}{\phantom{\rule[-0.55ex]{0.1ex}{0.1ex}}}} % \end{macrocode} % % % % \DescribeMacro{\dmbPoint}\marg{node name} % % Marks a point as a \textbf{d}eeper \textbf{m}ost \textbf{b}ottom point in a Code Block. % \begin{macrocode} \NewDocumentCommand{\dmbPoint}{m} {\tikzmarknode{#1}{\phantom{\rule[-2ex]{0.1ex}{0.1ex}}}} % \end{macrocode} % % % \DescribeMacro{\extremPoint}\marg{node name}\oarg{yshift}\oarg{xshift}\oarg{style} % % Create a \TikZ{} Node as reference point for later use in |\fitExtrem|. % % \begin{itemize} % \item \marg{node name} is the \TikZ{} node name which is used in |\fitExtrem| to reference to this point % \item \oarg{yshift} a length, default 0ex which places this markpoint on the base line, % shift this mark point vertical, for positive value over base line, negative value under % base line. % \item \oarg{xshift} same as \oarg{yshift} but for horizontal direction. % \item \oarg{style} is a \TikZ{} style (may be defined by user). % \end{itemize} % % For example: % % |\begin{tikzpicture}[remember picture]|\\ % |\node(code) [anatomy] at (0,0) {|\\ % | \extremPoint{tl}[2ex]Line with some text\extremPoint{br}[-1ex]\\|\\ % | \extremPoint{tl2}other Line with some text\\|\\ % | some more line\extremPoint{br2}\\|\\ % |};|\\ % |\fitExtrem{box1}{(tl) (br)}|\\ % |\fitExtrem{box2}{(tl2) (br2)}|\\ % |\end{tikzpicture}|\\ % % yields\\ % % \begin{tikzpicture}[remember picture] % \node(code) [anatomy] at (0,0) { % \extremPoint{tl}[2ex]Line with some text\extremPoint{br}[-1ex]\\ % \extremPoint{tl2}other Line with some text\\ % some more line\extremPoint{br2}\\ % }; % \fitExtrem{box1}{(tl) (br)} % \fitExtrem{box2}{(tl2) (br2)} % \end{tikzpicture} % \begin{macrocode} \NewDocumentCommand{\extremPoint}{m O{0ex} O{0.1ex} O{} } {\tikzmarknode[#4]{#1}{\phantom{\rule[#2]{#3}{0.1ex}}}} % \end{macrocode} % % % % % \DescribeMacro{\fitExtrem} \marg{node name}\marg{extrem points} % % Create a rectangle box over given extrem points defined by |\*Point{}|. % % \begin{itemize} % \item \marg{node name} is a unique \TikZ{} node name in the current anatomy % \item \marg{extrem points} is a list of \TikZ{} node name created by |\*Point|, % each name is surrounded by |()|. % \end{itemize} % % Example: % % |\begin{tikzpicture}[remember picture]|\\ % |\node(code) [anatomy] at (0,0) {|\\ % |\mtPoint{left}Line 1\\|\\ % |Long Line 2\extremPoint{right}\\|\\ % |Line 3\mbPoint{bottom}|\\ % |};|\\ % |\fitExtrem{box} { (left) (bottom) (right) }|\\ % |\end{tikzpicture}|\\ % % yields\\ % % \begin{tikzpicture}[remember picture] % \node(code) [anatomy] at (0,0) { % \mtPoint{left}Line 1\\ % Long Line 2\extremPoint{right}\\ % Line 3\mbPoint{bottom} % }; % \fitExtrem{box} { (left) (bottom) (right) } % \end{tikzpicture} % \begin{macrocode} \NewDocumentCommand{\fitExtrem}{mm} {\node(#1)[fit extrem,fit={#2}]{};} % \end{macrocode} % % % \DescribeMacro{\bgcode} \marg{piece of code} % % Typeset a piece of code in color |bgcmdcolor|. % For example % % |\tikz{\codeBlock{let a := 12\bgcode{;}}}| % % yields \tikz{\codeBlock{let a := 12\bgcode{;}}} % \begin{macrocode} \NewDocumentCommand{\bgcode}{m}{\textcolor{bgcmdcolor}{#1}} % \end{macrocode} % % % \DescribeMacro{\ptab} % \DescribeMacro{\phspace} % Produce a horizontal space of 4 small characters |h| respective 1 small character |h|\\ % for example: |\tikz{\codeBlock{a\ptab{}b}}| yields \tikz{\codeBlock{a\ptab{}b}} % \begin{macrocode} \NewDocumentCommand{\ptab}{}{\phantom{hhhh}} \NewDocumentCommand{\phspace}{}{\phantom{h}} % \end{macrocode} % % % % \DescribeMacro{\codeAnnotation}\marg{node name}\parg{coordinate}\marg{label text} % % Typeset Annotation labels for a code part. % \begin{itemize} % \item \marg{node name} is a unique \TikZ{} node name in the |tikzpicture|, % \item \parg{coordinate} is the coordinate of the annotation label, surrounded by a |()|, % \item \marg{label text} text content to be typeset. % \end{itemize} % % For example: % % |\begin{tikzpicture}[remember picture]|\\ % |\codeBlock{a \cPart{a}{:=} 12 + 13}|\\ % |\codeAnnotation{codeLabel} (1,-0.5) {assignment}|\\ % |\draw[->,annotation] (codeLabel) -- (a);|\\ % |\end{tikzpicture}|\\ % % yields\\ \medskip % % \begin{tikzpicture}[remember picture] % \codeBlock{a \cPart{a}{:=} 12 + 13} % \codeAnnotation{codeLabel} (1,-0.5) {assignment} % \draw[->,annotation] (codeLabel) -- (a); % \end{tikzpicture} % \begin{macrocode} \NewDocumentCommand{\codeAnnotation}{m r() m } % { \node(#1)[code annotation] at (#2) {#3}; } % \end{macrocode} % % % % % ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \section{Known Bugs} % % \paragraph*{\fixedBug{Arrows color}} % Arrows appear in some cases with mysterious color. I don't know why! % For example: % % |\begin{tikzpicture}[remember picture]|\\ % |\node(code) [anatomy] at (0,0) {|\\ % |\hmtPoint{a}Short line\\|\\ % |code with some long text\extremPoint{b}[-0.5ex]|\\ % |};|\\ % |\fitExtrem{l}{(a) (b)}|\\ % |\codeAnnotation{n} (-2,0){here is|\\ % | a\extremPoint{point}[0.75ex][0.5ex]|\\ % | long line}|\\ % |\draw[->, annotation] (point) -- (l);|\\ % |\end{tikzpicture}| % % yields % % \begin{tikzpicture}[remember picture] % \node(code) [anatomy] at (0,0) { % \hmtPoint{a}Short line\\ % code with some long text\extremPoint{b}[-0.5ex] % }; % \fitExtrem{l}{(a) (b)} % \codeAnnotation{n} (-2,0){here is\\ % a\extremPoint{point}[0.75ex][0.5ex]\\ % long line} % \draw[->, annotation] (point) -- (l); % \end{tikzpicture} % % % ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \PrintIndex % \PrintChanges % \endinput