% \iffalse meta-comment
%
% Copyright (C) 2021 by Jinwen XU 
% -------------------------------
% 
% This file may be distributed and/or modified under the conditions of the LaTeX
% Project Public License, either version 1.3c of this license or (at your option)
% any later version. The latest version of this license is in:
%
%    http://www.latex-project.org/lppl.txt
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{mindflow.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{mindflow}
%<*package>
    [2021/03/17 Mindflow environment]
%</package>
%
%<*driver>
\documentclass{article}
\usepackage{doc}
\usepackage[a4paper,top=1.2in,bottom=1.2in,left=1.6in,right=1.2in]{geometry}
\usepackage{titling}
\setlength{\droptitle}{-.5in}
\PassOptionsToPackage{mathlines}{lineno}
\usepackage[linenumber,rightmarker]{mindflow}
\usepackage{enumitem}
\setlist{noitemsep}
\usepackage{newpxtext}
\usepackage{blindtext}
\usepackage{parskip}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{mindflow.dtx}
\end{document}
%</driver>
% \fi
%
% \CheckSum{186}
%
% \GetFileInfo{mindflow.dtx}
%
%
% \title{The {\normalfont\textsf{mindflow}} package}
% \author{\scshape Jinwen Xu}
% \date{\filedate}
%
% \maketitle
%
% \section{Introduction}
%
% The \textsf{mindflow} package provides you a way to write your ideas 
% and annotations clearly. For exmaple, with the options
% \verb|linenumber| and \verb|rightmarker|, you will get:
% \begin{mindflow}
%     What to write next:
%     \begin{itemize}
%         \item usage;
%         \item some internal macros;
%         \item an example maybe;
%         \item the complete code.
%     \end{itemize}
% \end{mindflow}
%
% \section{Usage}
%
% Simply load the package with 
% \begin{verbatim}
%   \usepackage{mindflow}
% \end{verbatim}
% \vspace{-.5\baselineskip}
% By default, it has no line numbers or markers. You can use the following options:
%
% \begin{tabular}{ll}
%     \verb|linenumber| & Enable line numbers\\
%     \verb|leftmarker| & Enable left marker, by default it is a ``\verb|*|''\\
%     \verb|rightmarker| & Enable right marker, by default it is a ``\verb|*|''\\
%     \verb|incolumn| or \verb|twocolumn| & The separation line would fit in the column \\&(\emph{automatically applied in two-column documents})\\
%     \verb|off| & Hide all the \verb|mindflow| environments
% \end{tabular}
%
% \DescribeEnv{mindflow}
% Then you can use the \verb|mindflow| environment as
% \begin{verbatim}
%   \begin{mindflow}
%       ...
%   \end{mindflow}
% \end{verbatim}
%
% \linenumbers
%
% You can also add line numbers to the other part of your document in the usual
% way. For example, line numbers have been turned on for this paragraph with
% \verb|\linenumbers|.
%
% \begin{mindflow}
%   Line numbers within the \textsf{mindflow} environments are independent from
%   those of the main text.
% \end{mindflow}
% (\emph{I recommend that you put an empty line before and after the mindflow 
% environments. This way, your paragraph structure won't get changed when you 
% use the }\verb|off|\emph{ option.})
%
% \nolinenumbers
%
% The feature of line numbering is provided by the package \textsf{lineno}. You
% can read its documentation to learn more about it. Notice that, by default,
% displayed equations are not numbered. You can add the following line before
% \verb|\usepackage{mindflow}|:\\[.5\baselineskip]
% \null\hspace{1.5em}{\small\verb|\PassOptionsToPackage{mathlines}{lineno}|}\\[.5\baselineskip]
% to enable the line numbers for displayed equations.
%
% \begin{mindflow}\vspace{-\baselineskip}
% \begin{align*}
%     (a + b)^2  &= a^2 + 2ab + b^2\\
%     (a + b)^3  &= a^3 + 3a^2b + 3ab^2 + b^3
% \end{align*}
% \end{mindflow}
%
%
% \section{Some \TeX{}nical details}
%
% \DescribeMacro{\mindflowTextFont}
% \DescribeMacro{\mindflowNumFont}
% The font for text, line numbers and markers within the \verb|mindflow|
% environments can be specified by redefining \verb|\mindflowTextFont|,
% \verb|\mindflowNumFont| and \verb|\mindflowMarkerFont|. By default, 
% they are defined as:
% \begin{verbatim}
%   \newcommand{\mindflowTextFont}{\normalfont\footnotesize}
%   \newcommand{\mindflowNumFont}{\normalfont\scriptsize\ttfamily}
%   \newcommand{\mindflowMarkerFont}{\normalfont\scriptsize\ttfamily}
% \end{verbatim}
% \vspace{-.5\baselineskip}
%
% \DescribeMacro{\mindflowLeft}
% \DescribeMacro{\mindflowRight}
% The left and right markers can be changed by redefining
% \verb|\mindflowLeft| and \verb|\mindflowRight|. Both have the default
% value as ``\verb|*|''.
%
% \DescribeMacro{\mindflowLineHeight}
% The height of the separation lines is a length macro named \verb|\mindflowLineHeight|, 
% with default value \verb|0.4pt|. You can change this with \verb|\setlength|.
%
% \DescribeMacro{mindflowLine}
% \DescribeMacro{mindflowText}
% \DescribeMacro{mindflowNum}
% \DescribeMacro{mindflowMarker}
% And finally, the colors for the separation lines, text, line numbers and
% markers within the \verb|mindflow| environments are called
% \verb|mindflowLine|, \verb|mindflowText|, \verb|mindflowNum| and
% \verb|mindflowMarker|, respectively. By default, they have the same color as
% the context, with opacity 30\% for the separation lines, text and markers, and
% 8\% for the line numbers. 
%
% \section{An example}
% With option \verb|linenumber, leftmarker, rightmarker| and the following settings:
% \begin{verbatim}
% \colorlet{mindflowLine}{green!50!black}
% \colorlet{mindflowText}{blue!50!cyan}
% \colorlet{mindflowNum}{red!50!orange}
% \colorlet{mindflowMarker}{orange}
% \renewcommand{\mindflowTextFont}{\normalfont\footnotesize\sffamily\itshape}
% \renewcommand{\mindflowNumFont}{\normalfont\small\footnotesize\sffamily}
% \renewcommand{\mindflowMarkerFont}{\normalfont\footnotesize\sffamily}
% \renewcommand{\mindflowLeft}{\hspace{1em}\(\succ\)}
% \renewcommand{\mindflowRight}{\(\prec\)}
% \setlength{\mindflowLineHeight}{1pt}
% \end{verbatim}
% \vspace{-.5\baselineskip}
% One gets:
% \makeatletter
% \@mindflow@leftmarkertrue
% \makeatother
% \colorlet{mindflowLine}{green!50!black}
% \colorlet{mindflowText}{blue!50!cyan}
% \colorlet{mindflowNum}{red!50!orange}
% \colorlet{mindflowMarker}{orange}
% \renewcommand{\mindflowTextFont}{\normalfont\footnotesize\sffamily\itshape}
% \renewcommand{\mindflowNumFont}{\normalfont\small\footnotesize\sffamily}
% \renewcommand{\mindflowMarkerFont}{\normalfont\footnotesize\sffamily}
% \renewcommand{\mindflowLeft}{\hspace{1em}\(\succ\)}
% \renewcommand{\mindflowRight}{\(\prec\)}
% \setlength{\mindflowLineHeight}{1pt}
% \begin{mindflow}
%     \blindtext
% \end{mindflow}
%
% \StopEventually{}
%
% \section{Implementation}
% Below is the complete source code of this package.
%
%    \begin{macrocode}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{%
    family = @mindflow,
    prefix = @mindflow@
}
\DeclareBoolOption[false]{off}           % Turn off mindflow
\DeclareBoolOption[false]{leftmarker}    % Left marker
\DeclareBoolOption[false]{rightmarker}   % Right marker
\DeclareBoolOption[false]{linenumber}    % Line numbers
\DeclareBoolOption[false]{twocolumn}     % Two column
\DeclareBoolOption[false]{incolumn}      % Separation line fits in the column

\ProcessKeyvalOptions*\relax

\if@mindflow@twocolumn
  \@mindflow@incolumntrue
\fi

%%================================
%% Initialization
%%================================
\RequirePackage{lineno}
\RequirePackage{xcolor}

\colorlet{mfSavedColor}{.}
\colorlet{mindflowLine}{mfSavedColor!30}
\colorlet{mindflowText}{mfSavedColor!30}
\colorlet{mindflowMarker}{mfSavedColor!30}
\colorlet{mindflowNum}{mfSavedColor!8}

\newcommand{\mindflowTextFont}{\normalfont\footnotesize}
\newcommand{\mindflowNumFont}{\normalfont\scriptsize\ttfamily}
\newcommand{\mindflowMarkerFont}{\normalfont\scriptsize\ttfamily}
\newcommand{\mindflowLeft}{*}
\newcommand{\mindflowRight}{*}
\newlength{\mindflowLineHeight}
\setlength{\mindflowLineHeight}{0.4pt}

%%================================
%% The mindflow environment
%%================================
\newif\ifLNturnsON

\newcommand*{\mfSepLine}{%
  \parskip=0pt
  \LNturnsONfalse%
  \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers%
  \par\noindent\nopagebreak%
  \if@mindflow@incolumn%
    \makebox[\linewidth]{\rule{\linewidth}{\mindflowLineHeight}}%
  \else%
    \hspace*{-\paperwidth}\makebox[\linewidth]{\rule{4\paperwidth}{\mindflowLineHeight}}%
  \fi%
  \nopagebreak\par%
  \ifLNturnsON\linenumbers\fi%
}

\newcounter{recordLN}
\newcounter{mfLN}
\setcounter{mfLN}{1}

\if@mindflow@off
  \RequirePackage{verbatim}
  \let\mindflow=\comment
  \let\endmindflow=\endcomment
\else
  \newenvironment{mindflow}
  {%
    \setcounter{recordLN}{\value{linenumber}}%
    \setcounter{linenumber}{\value{mfLN}}%
    \LNturnsONfalse%
    \ifLineNumbers\LNturnsONtrue\fi\nolinenumbers%
    \color{mindflowLine}\mfSepLine%
    \mindflowTextFont\color{mindflowText}%
    \linenumbers%
    \renewcommand\makeLineNumber{%
      \hss%
      \if@mindflow@linenumber%
        \mindflowNumFont\color{mindflowNum}\LineNumber\hspace{1em}%
      \fi%
      \color{mindflowMarker}%
      \if@mindflow@leftmarker%
        \mindflowMarkerFont\mindflowLeft\hspace{1em}%
      \fi%
      \if@mindflow@rightmarker%
        \rlap{\hskip\textwidth\hspace{1em}\mindflowRight}%
      \fi%
    }%
  }
  {%
    \par%
    \vspace{-.5\baselineskip}\color{mindflowLine}\mfSepLine%
    \ifLNturnsON\linenumbers\fi%
    \setcounter{mfLN}{\value{linenumber}}%
    \setcounter{linenumber}{\value{recordLN}}%
  }
\fi

\ifdefined\linenomathpatch\else
  \RequirePackage{amsmath}
  \RequirePackage{etoolbox}
  \newcommand*\linenomathpatch[1]{%
    \cspreto{#1}{\linenomath}%
    \cspreto{#1*}{\linenomath}%
    \cspreto{end#1}{\endlinenomath}%
    \cspreto{end#1*}{\endlinenomath}%
  }
  \newcommand*\linenomathpatchAMS[1]{%
    \cspreto{#1}{\linenomathAMS}%
    \cspreto{#1*}{\linenomathAMS}%
    \csappto{end#1}{\endlinenomath}%
    \csappto{end#1*}{\endlinenomath}%
  }
  \expandafter\ifx\linenomath\linenomathWithnumbers
    \let\linenomathAMS\linenomathWithnumbers
    \patchcmd\linenomathAMS{\advance\postdisplaypenalty\linenopenalty}{}{}{}
  \else
    \let\linenomathAMS\linenomathNonumbers
  \fi
  \linenomathpatch{equation}
  \linenomathpatchAMS{gather}
  \linenomathpatchAMS{multline}
  \linenomathpatchAMS{align}
  \linenomathpatchAMS{alignat}
  \linenomathpatchAMS{flalign}
\fi
%    \end{macrocode}
%
% \Finale
\endinput
