%% Copyright (C) 2017 by Ruini Xue <xueruini@gmail.com>
%%
%% This file may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3a
%% 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
%%
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2008/05/04 or later.
\ProvidesPackage{zebra-goodies}[2017/12/6 0.3.0 LaTeX goodies for paper writing.]

\RequirePackage{kvoptions}
\SetupKeyvalOptions{
  family=zebra,
  prefix=zebr@,
  setkeys=\kvsetkeys}
\DeclareBoolOption{draft}
\DeclareBoolOption{microtype}
\setkeys{zebra}{draft,microtype}
\ProcessKeyvalOptions{zebra}

% comment this if you do not need.
\ifzebr@microtype
  \RequirePackage{microtype}
\fi
\RequirePackage{xcolor}
\RequirePackage{tikzpagenodes}
\RequirePackage{marginnote}
\RequirePackage{manfnt}

%%%%%%%%%%%%%%%%%%
% zebra-note
%%%%%%%%%%%%%%%%%%

% From: http://tex.stackexchange.com/questions/247449/making-marginnote-to-appear-either-side-of-twocolumn-twoside-document-part-ii
% I did a little edit.
\newlength{\zebr@tempdima}
\newcount{\zebr@tikzpage}

\newcommand*{\zebr@marginnote}[1]{%
  \begin{tikzpicture}[remember picture, overlay]%
    \pgfextractx{\zebr@tempdima}{\pgfpointanchor{current page text area}{center}}%
    \global\zebr@tempdima=\zebr@tempdima
    \global\zebr@tikzpage=\oddpage@page
  \end{tikzpicture}%
  \begingroup
    \ifdim\zebr@tempdima>0pt \reversemarginpar\fi
    \marginnote{#1}%
  \endgroup% resets \reversemarginpar
}

\def\zebr@note{%
  \ifzebr@draft\expandafter\zebr@note@\else\expandafter\@gobblefour\fi}

% #1: note name
% #2: color
% #3: assignee
% #4: note text
\newcommand{\zebr@note@}[4]{%
  \zebr@marginnote{\textcolor{#2}{\dbend}}%
  \expandafter\stepcounter{zebr@num@#1}%
  \textcolor{#2}{[\textbf{\MakeUppercase{#1}\textit{#3}:} #4]}}

\newcommand{\zebr@prepend}[2]{%
  \ifx\relax#2\relax\relax\else#1#2\fi}

\global\def\zebr@noteslist{}
\def\zebranewnote#1#2{%
  \g@addto@macro\zebr@noteslist{,#1}%
  \expandafter\newcounter\expandafter{zebr@num@#1}
  \expandafter\newcommand\csname zebr@color@#1\endcsname{#2}
  \expandafter\newcommand\csname zebra#1\endcsname[2][]{% we suppose it is not defined yet
    \zebr@note{#1}{#2}{\zebr@prepend{@}{##1}}{##2}}
  \@ifundefined{#1}{\expandafter\def\csname #1\endcsname{\csname zebra#1\endcsname}}{%
    \PackageWarning{zebra}{'\textbackslash{#1}' has been taken. Use '\textbackslash{zebra#1}' instead.}}}

\def\zebr@listnotes{%
  \ifzebr@draft\zebr@listnotes@\fi}

\def\zebr@listnotes@{%
  \def\temp@a{}
  \edef\temp@noteslist{\expandafter\@gobble\zebr@noteslist}
  \@for\temp@b:=\temp@noteslist\do{%
    \expandafter\ifnum\expandafter\value\expandafter{zebr@num@\temp@b} > 0%
      \def\temp@c{\expandafter\csname thezebr@num@\temp@b\endcsname}
      \edef\temp@d{\noexpand\textcolor{\expandafter\csname zebr@color@\temp@b\endcsname}{\temp@b} \noexpand &  \temp@c\noexpand\\}
      \expandafter\g@addto@macro\expandafter\temp@a\expandafter{\temp@d}%
    \fi}
  \ifx\temp@a\@empty\else%
    \noindent\dotfill\par
    \section*{Zebra Notes}
    \par \medskip
    \begin{center}
      \begin{tabular}{lr}
        \hline
        \textbf{Type} & \textbf{Number} \\\hline
        \temp@a
        \hline
      \end{tabular}
      \par \medskip
      \textbf{Do fix all of them before submitting.}
    \end{center}
  \fi}

\AtEndDocument{\zebr@listnotes}

\zebranewnote{todo}{purple}
\zebranewnote{fixed}{teal}
\zebranewnote{comment}{blue}
\zebranewnote{note}{violet}
\zebranewnote{placeholder}{gray}

%%%%%%%%%%%%%%
% zebra-color
%%%%%%%%%%%%%%
\definecolor{zebrablue}{HTML}{4F81BD}
\definecolor{zebrared}{HTML}{C0504D}
\definecolor{zebragreen}{HTML}{9BBB00}
\definecolor{zebrapurple}{HTML}{9F4C7C}
\definecolor{zebrayellow}{HTML}{D9CD2E}
\definecolor{zebragreen2}{HTML}{00E000}

\endinput
