% \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
%<package>\NeedsTeXFormat{LaTeX2e}[2018/12/01]
%<package>\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}
%</driver>
% \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

