%% RecipeBook.cls
%% Copyright 2015 Brad Granger
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% 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.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% The Current Maintainer of this work is Brad Granger
%
% This work consists of the file RecipeBook.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{RecipeBook}[2015/02/13 Custom recipe class]

\LoadClass[letterpaper,12pt,twocolumn]{article}

\RequirePackage[document]{ragged2e} % Left-aligns document (need document option)
\RequirePackage{amsmath,amsfonts,amssymb} % Use for \square symbol, etc.
\RequirePackage{xparse} % Multiple optional arguments in new environments
\RequirePackage{wrapfig} % Use for wrapping around large numbers in instructions
\RequirePackage{graphicx} % Use to include figures
\RequirePackage{eso-pic} % Used for transparent images
\RequirePackage{anyfontsize} % Provides arbitrary font sizes
\RequirePackage{scrextend} % Used with anyfontsize
\RequirePackage{multirow,multicol} % Join cells in tabular
\RequirePackage{nicefrac} % nice slanted fractions using \nicefrac
\RequirePackage{xcolor} % Change text color using \color{} within group or env.
\RequirePackage{gensymb} % Provides the degree symbol with \degree
\RequirePackage{booktabs} % Nice table line \toprule
\RequirePackage{tabularx} % Used for auto-width tables
\RequirePackage{calc} % Provides \widthof for wrapping around numbers in \step{}.
\RequirePackage{picture} % Used for absolute dimensions with put{}
%----Adds parskip between minipage environments------------------------------%
\RequirePackage{parskip}
\setlength{\parskip}{\medskipamount}
\newcommand{\@minipagerestore}{\setlength{\parskip}{\medskipamount}}
%----Define fonts and font sizes---------------------------------------------%
\RequirePackage{tgtermes}
\RequirePackage[T1]{fontenc}
\renewcommand{\rmdefault}{qtm}
\newlength{\basefontsize}
\setlength{\basefontsize}{13pt}
\newlength{\basefontskipsize}
\setlength{\basefontskipsize}{14pt}
\newlength{\recipetitlefontsize}
\setlength{\recipetitlefontsize}{22pt}
\newlength{\instrnumsize}
\setlength{\instrnumsize}{22pt}
\newlength{\recipeheadfontsize}
\setlength{\recipeheadfontsize}{17pt}
\changefontsizes[\basefontskipsize]{\basefontsize} % Default font skip/size

%----Shrink and grow environments to scale text------------------------------%
\NewDocumentEnvironment{shrink}{O{1pt}}{
	\addtolength{\basefontsize}{-#1}
	\addtolength{\basefontskipsize}{-#1}
	\addtolength{\instrnumsize}{-#1 * 2}
	\addtolength{\recipeheadfontsize}{-#1}
	\changefontsizes[\basefontskipsize]{\basefontsize}
}{
	\addtolength{\basefontsize}{#1}
	\addtolength{\basefontskipsize}{#1}
	\addtolength{\instrnumsize}{#1 * 2}
	\addtolength{\recipeheadfontsize}{#1}
	\changefontsizes[\basefontskipsize]{\basefontsize}
}

\NewDocumentEnvironment{grow}{O{1pt}}{
	\addtolength{\basefontsize}{#1}
	\addtolength{\basefontskipsize}{#1}
	\addtolength{\instrnumsize}{#1 * 2}
	\addtolength{\recipeheadfontsize}{#1}
	\changefontsizes[\basefontskipsize]{\basefontsize}
}{
	\addtolength{\basefontsize}{-#1}
	\addtolength{\basefontskipsize}{-#1}
	\addtolength{\instrnumsize}{-#1 * 2}
	\addtolength{\recipeheadfontsize}{-#1}
	\changefontsizes[\basefontskipsize]{\basefontsize}
}

%----Some page formatting lengths--------------------------------------------%
\setlength\parindent{0pt} % Don't indent new paragraphs
\setlength\parskip{4pt} % Set space between paragraphs
\setlength{\columnsep}{12pt} % Sets margin between columns

%----Headers and footers-----------------------------------------------------%
\RequirePackage{datetime} % Provides compile date on title page
\mmddyyyydate		% Reformat \today to MM/DD/YYYY
\RequirePackage{fancyhdr} % Provide header and footer \lhead \rfoot, etc.
\fancypagestyle{recipe}{
	\fancyhead{} 
	\fancyfoot{}
	\fancyfoot[R]{\hyperlink{contents}{\arabic{page}}}
	\renewcommand{\headrulewidth}{0pt} % Remove line from header
	\renewcommand{\footrulewidth}{0pt}
}
\fancypagestyle{titlestyle}{
	\fancyhead{}
	\fancyfoot{}
	\renewcommand{\headrulewidth}{0pt} % Remove line from header
	\renewcommand{\footrulewidth}{0pt}
}
\fancypagestyle{tocstyle}{
	\fancyhead{}
	\fancyfoot{}
	\fancyfoot[C]{\today}
	\renewcommand{\headrulewidth}{0pt} % Remove line from header
	\renewcommand{\footrulewidth}{0pt}
}

\raggedbottom % Don't stretch blocks vertically to fit page
\RequirePackage{tikz}
\usetikzlibrary{calc, fadings}

%----Commands for working with the ToC--------------------------------------=%
% Use tocloft to remove numbers from the table of contents (ToC)
\RequirePackage{tocloft}
% Use hyperref to create links in the ToC (has to be loaded last, usually)
\RequirePackage[colorlinks]{hyperref}
\hypersetup{linkcolor=blue}
% Set page geometry (should be loaded after hyperref}
\RequirePackage[top=0.4in,inner=0.25in,outer=0.25in,bottom=0.65in,
								paperheight=8.5in, paperwidth=5.5in, 
								headheight=16pt]{geometry}

\cftsetindents{subsection}{8pt}{0pt}
\cftsetindents{section}{0pt}{0pt}
\renewcommand\thesection{}
\renewcommand\thesubsection{}
\renewcommand\cftdot{}
\renewcommand{\cftsecfont}{
	\bfseries \fontsize{\recipeheadfontsize}{\recipeheadfontsize}\selectfont 
}
\newcommand \makecontents {\tableofcontents \thispagestyle{tocstyle}}

%----\titlepage for generating title page------------------------------------%
\DeclareDocumentCommand{\titlepage}{O{Recipes} m m m}{
	\thispagestyle{titlestyle}
	\AddToShipoutPicture*{
		\put(0.20in,0){
			\parbox[b][\paperheight]{\linewidth}{%
				\vspace*{2.40in}
				\begin{tikzpicture}
					\node[anchor=north east, inner sep=0] (image) at (0,0) {%
						\includegraphics[width=1.05\linewidth]{#2}};
				\end{tikzpicture}
				\vfill
			}
		}
	}
	\AddToShipoutPicture*{
		\put(0.25\paperwidth,0){
			\parbox[b][\paperheight]{\linewidth}{%
				\vspace*{3.90in}
				\begin{tikzpicture}
					\node[anchor=north east, inner sep=0] (image) at (0,0) {%
						\includegraphics[width=1.05\linewidth]{#3}};
				\end{tikzpicture}
				\vfill
			}
		}
	}
	\AddToShipoutPicture*{
		\put(0.5\paperwidth,0){
			\parbox[b][\paperheight]{\linewidth}{%
				\vspace*{5.40in}
				\begin{tikzpicture}
					\node[anchor=north east, inner sep=0] (image) at (0,0) {%
						\includegraphics[width=1.05\linewidth]{#4}};
				\end{tikzpicture}
				\vfill
			}
		}
	}
	\AddToShipoutPicture*{
		\parbox[b][\paperheight]{\paperwidth}{
			\vspace*{0.9in}
			\centering \color{black!50}
			\fontsize{46pt}{40pt}\selectfont #1
			\vfill
		}
	}
	$\quad$
	\clearpage \newpage
}
	
%----section and subsection commands-----------------------------------------%
\RenewDocumentCommand{\section}{m}{
	\newpage
	\phantomsection 
	\cftaddtitleline{toc}{section}{#1}{}
}

\RenewDocumentCommand{\subsection}{m}{
 	\clearpage\newpage 
 	\phantomsection
	\addcontentsline{toc}{subsection}{#1}
}

%----Make page numbers hyperlinks to the ToC (along with fancyhdr, above)----%
\renewcommand{\contentsname}{\hypertarget{contents}{
	\bfseries \fontsize{\recipetitlefontsize}{\recipetitlefontsize}\selectfont
	Recipes}
}

%----Image commands----------------------------------------------------------%
\setlength{\@fptop}{0pt} % Position image at the top by setting fill to 0pt

\tikzfading[name=fade l,left color=transparent!100,right color=transparent!0]
\tikzfading[name=fade r,right color=transparent!100,left color=transparent!0]
\tikzfading[name=fade d,bottom color=transparent!100,top color=transparent!0]
\tikzfading[name=fade u,top color=transparent!100,bottom color=transparent!0]

% this "frames" a rectangle node
\newcommand\framenode[2][10pt]{
	\fill[white, opacity=1, path fading=fade u] (#2.south west) rectangle ($(#2.south east)+(0, #1)$);
	\fill[white, opacity=1, path fading=fade d] (#2.north west) rectangle ($(#2.north east)+(0,-#1)$);
	\fill[white, opacity=1, path fading=fade l] (#2.south east) rectangle ($(#2.north east)+(-#1,0)$);
	\fill[white, opacity=1, path fading=fade r] (#2.south west) rectangle ($(#2.north west)+( #1,0)$);
}

\newlength{\pagetop} \setlength{\pagetop}{32.5pt}
\DeclareDocumentCommand \leftbgpic {O{32.5pt} O{0.4} m} {
	\AddToShipoutPicture*{
		\put(0.20in,0.15in){
			\parbox[b][\paperheight]{\linewidth}{%
				\vspace*{#1}
				\begin{tikzpicture}[opacity=#2]
					\node[anchor=north east, inner sep=0] (image) at (0,0) {%
						\includegraphics[width=1.05\linewidth]{#3}};
					\framenode[25pt]{image} % opt. arg. is fade radius;
																	% mand. arg. is node name to frame
				\end{tikzpicture}
				\vfill
			}
		}
	}
}

\newlength{\pagebottom} \setlength{\pagebottom}{6.15in}
\DeclareDocumentCommand \rightbgpic {O{\pagebottom} O{0.4} m} {
	\AddToShipoutPicture*{
		\put(.49\paperwidth,0.15in){
			\parbox[b][\paperheight]{\linewidth}{%
				\vspace*{#1}
				\begin{tikzpicture}[opacity=#2]
					\node[anchor=north east, inner sep=0] (image) at (0,0) {%
						\includegraphics[width=1.05\linewidth]{#3}};
					\framenode[30pt]{image} % opt. arg. is fade radius;
																	% mand. arg. is node name to frame
				\end{tikzpicture}
				\vfill
			}
		}
	}
}

% % \pic command for float image
% \DeclareDocumentCommand{\pic}{O{t} m}{
% 	\begin{figure}[#1]
% 		\centering \includegraphics[width=0.45\textwidth]{#2} \\
% 	\end{figure}
% }

% \pic command for float image
\DeclareDocumentCommand{\pic}{O{t} m}{
	\begin{figure}[#1]
		\begin{tikzpicture}
			\node[anchor=north east, inner sep=0] (image) at (0,0) {%
				\centering \includegraphics[width=.92\linewidth]{#2}
			};
			\framenode[4pt]{image}
		\end{tikzpicture}
	\end{figure}
}

%----Title and subtitle commands---------------------------------------------%
\RenewDocumentCommand{\title}{O{\recipetitlefontsize} m}{
	\begingroup \fontsize{#1}{#1}\selectfont \bf #2 \endgroup 
}

\DeclareDocumentCommand{\subtitle}{O{18pt} m}{
	\begingroup 
		\fontsize{#1}{#1}\selectfont \textcolor{black!50} {#2} 
	\endgroup 
}

%----RecipeSection command---------------------------------------------------%
\DeclareDocumentCommand{\recipesection}{O{\recipeheadfontsize} m}{
	\begingroup \fontsize{#1}{#1}\selectfont \color{blue!60}\bf\emph{#2} \endgroup
}{}

%----Author footnote---------------------------------------------------------%
\RenewDocumentCommand{\author}{O{Author: } m}{
	\lfoot{\textcolor{black!20}{#1#2}}
}

%----Info environment--------------------------------------------------------%
\newenvironment{info}{
	\vspace*{\parskip}
	\tabular{ll}
}{
	\endtabular
	\vspace*{\parskip}
}

%----Info* environment for more compact spacing------------------------------%
\newenvironment{info*}{
	\tabular{ll}
}{
	\endtabular
}

%----Ingredients section-----------------------------------------------------%
\NewDocumentEnvironment{ingredients}{}{
	\renewcommand{\arraystretch}{1.08}
	\setlength{\tabcolsep}{4pt}
	\tabularx{\linewidth}{@{}lX@{}}
}{
	\endtabularx
}

\DeclareDocumentCommand{\item}{O{$\square$} m}{#1 & #2 \\}

% Starred version of ingredients environment for a shaded background
% with faded edges.
\RequirePackage{environ}
\RequirePackage{tcolorbox}
\NewEnviron{ingredients*}{%
	\renewcommand{\arraystretch}{1.08}
	\setlength{\tabcolsep}{4pt}
	\setlength\fboxsep{0pt}
	\begin{tcolorbox}[colback=black!4,colframe=black!2,boxrule=2pt,
										arc=7pt,boxsep=0pt,left=1pt,right=1pt,top=-5pt,
										bottom=1pt]
	\begin{tcolorbox}[colback=black!8,colframe=black!6,boxrule=2pt,
										arc=6pt,boxsep=0pt,left=0pt,right=0pt,top=-5pt,
										bottom=0pt]
		\begin{tabularx}{\linewidth}{@{}lX@{}}
			\BODY
		\end{tabularx}
	\end{tcolorbox}
	\end{tcolorbox}
}

\newcommand{\group}[1]{
	\multicolumn{2}{l}{
		\color{black!80} \emph{#1}} \\[-2pt] \toprule 
	}
	
%----Instructions section----------------------------------------------------%
\DeclareDocumentCommand{\step}{m m}{
	\begin{minipage}{\linewidth}
		\setlength{\intextsep}{4pt}
		\setlength{\columnsep}{6pt}
		\begin{wraptable}{L}{
			\widthof{\fontsize{\instrnumsize}{\instrnumsize}\selectfont 1 }}
			\begin{tabularx}{\textwidth}{@{}l@{}}
				\fontsize{\instrnumsize}{\instrnumsize}\selectfont \color{black!60}  #1 
			\end{tabularx}
		\end{wraptable}
		#2 
	\end{minipage} 

}

\DeclareDocumentCommand{\hlgroup}{O{black} m}{
	\begin{tcolorbox}[colback=black!7,colframe=black!3,boxrule=2pt,
										arc=5pt,boxsep=0pt,left=1pt,right=1pt,top=-7pt,
										bottom=-1pt]
		\begin{tcolorbox}[colback=black!12,colframe=black!10,boxrule=2pt,
											arc=4pt,boxsep=0pt,left=0pt,right=0pt,top=-7pt,
											bottom=-3pt]
			\begin{tabular}{@{}m{\linewidth}@{}}
				\emph{$\:$#2}
			\end{tabular}
		\end{tcolorbox}
	\end{tcolorbox}
}

\newcommand{\num}[1]{
	\multirow{2}{*}{
		\begingroup \fontsize{\instrnumsize}{\instrnumsize}\selectfont 
		\textcolor{black!80} #1 \endgroup
	}
}