summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/recipebook
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/recipebook
Initial commit
Diffstat (limited to 'macros/latex/contrib/recipebook')
-rw-r--r--macros/latex/contrib/recipebook/LongSample.pdfbin0 -> 654473 bytes
-rw-r--r--macros/latex/contrib/recipebook/LongSample.tex338
-rw-r--r--macros/latex/contrib/recipebook/README182
-rw-r--r--macros/latex/contrib/recipebook/RecipeBook.cls393
-rw-r--r--macros/latex/contrib/recipebook/ShortSample.pdfbin0 -> 228559 bytes
-rw-r--r--macros/latex/contrib/recipebook/ShortSample.tex148
-rw-r--r--macros/latex/contrib/recipebook/images/Curried_butternut_squash_soup.jpgbin0 -> 118312 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/Curried_chicken_and_rice.jpgbin0 -> 120532 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/French_dip.jpgbin0 -> 101153 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/Grilled_chicken_with_capers.jpgbin0 -> 104127 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/Hawaiian_burgers.jpgbin0 -> 116466 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/Italian_calzones.jpgbin0 -> 103119 bytes
-rw-r--r--macros/latex/contrib/recipebook/images/Pumpkin_pie_soup.jpgbin0 -> 85377 bytes
l---------macros/latex/contrib/recipebook/images/sample_image.jpg1
14 files changed, 1062 insertions, 0 deletions
diff --git a/macros/latex/contrib/recipebook/LongSample.pdf b/macros/latex/contrib/recipebook/LongSample.pdf
new file mode 100644
index 0000000000..e064bf0879
--- /dev/null
+++ b/macros/latex/contrib/recipebook/LongSample.pdf
Binary files differ
diff --git a/macros/latex/contrib/recipebook/LongSample.tex b/macros/latex/contrib/recipebook/LongSample.tex
new file mode 100644
index 0000000000..cbf68ff2f3
--- /dev/null
+++ b/macros/latex/contrib/recipebook/LongSample.tex
@@ -0,0 +1,338 @@
+% Filename: LongSample.tex
+% Sample cookbook using RecipeBook class. Demonstrates
+% syntax for creating a title page, hyperlinked table of
+% contents, and several recipe formats.
+
+\documentclass{RecipeBook}
+
+\begin{document}
+
+\titlepage[Recipes]
+ {images/French_dip.jpg}
+ {images/Curried_butternut_squash_soup.jpg}
+ {images/Grilled_chicken_with_capers.jpg}
+
+\makecontents
+
+\pagestyle{recipe}
+
+\section{Beef}
+\subsection{French dip sandwiches}
+%====French dip sandwiches===================================================%
+\author{Brad}
+%----Title and info----------------------------------------------------------%
+\title{French dip}
+\subtitle{\hspace*{0.75in}sandwiches}
+\leftbgpic{images/French_dip.jpg}
+
+\begin{shrink}
+
+\begin{info}
+ Makes: & 6 - 8 sandwiches \\
+ Roast prep: & 15 minutes \\
+ Roast time: & 1 - 4 hours \\
+ Remaining: & 45 minutes
+\end{info}
+
+%----Ingredients-------------------------------------------------------------%
+\recipesection{Ingredients}
+\begin{ingredients}
+% \group{For the roast}
+ \item{4 lb. beef round or sirloin roast}
+ \item{2 cups chopped vegetables (onion, carrot, celery, garlic)}
+ \item{Several sprigs fresh thyme}
+ \item{\nicefrac{1}{4} cup red wine}
+ \item{Salt and pepper}
+ \group{For the au jus}
+ \item{1 tsp butter or coconut oil}
+ \item{1 tsp flour}
+ \item{2 cups beef broth}
+ \group{For the sandwiches}
+ \item{1 large onion, sliced}
+ \item{\nicefrac{1}{2} block provolone cheese (4 oz.), thinly sliced}
+ \item{Steak rolls, halved, for serving}
+\end{ingredients}
+
+%----Instructions------------------------------------------------------------%
+\recipesection{Instructions}
+\hlgroup{ For the roast }
+\step{1.}{
+ Preheat the oven to between 200\degree\ and 350\degree.
+ Pat the roast dry and season with salt and pepper. Heat oil in a medium
+ cast-iron skillet or Dutch oven over medium heat.
+}
+\step{2.}{
+ Sear the roast over medium-high heat, several minutes per
+ side, to brown. Set aside and add the root vegetables and thyme,
+ stirring for several minutes to sweat. Add the red wine and place the
+ roast on top.
+}
+\step{3.}{
+ Transfer to the preheated oven and cook for 1 hour at 300\degree,
+ 1 \nicefrac{1}{2} hours at 250\degree, 2 hours at 225\degree, or
+ 4 hours at 180\degree. Remove from the oven when the internal temperature
+ reaches about 135\degree\ for medium-rare, and set the roast aside to rest.
+}
+\hlgroup{For the au jus}
+\step{4.}{
+ Add the beef broth to the Dutch oven and bring the contents
+ to a boil, using a wooden spoon to deglaze the bottom. Reduce heat and
+ simmer to fully soften the vegetables.
+}
+\step{5.}{
+ Strain the liquid, pressing on the solids. Make a light roux
+ from 1 tsp oil and flour and slowly stir in the reserved liquid.
+}
+\hlgroup{For the sandwiches}
+\step{6.}{
+ Saut\'{e} the onion with some oil over medium-high heat, stirring
+ occasionally, to soften.
+}
+\step{7.}{
+ Spread or spray oil on the insides of the rolls and toast under the
+ broiler set to low (don't preheat) for 3 - 4 minutes. }
+\step{8.}{
+ Slice the roast thinly. Place the roast beef and cheese on
+ the bottom-halves of the buns, and place under the broiler briefly to
+ melt the cheese. Top with the onions and top-halves of the buns and serve
+ with the au jus, for dipping.
+}
+
+\recipesection{Goes well with}
+roasted vegetables or sweet potato fries.
+
+\recipesection{Notes}
+
+\end{shrink}
+
+\section{Pork}
+\subsection{Italian calzones}
+%====Italian calzones========================================================%
+\author{Brad, dough recipe from Chef Rider @ allrecipes.com}
+%----Title and info----------------------------------------------------------%
+\title{Italian calzones}
+
+\begin{info}
+ Makes: & 4 - 6 servings \\
+ & (8 calzones) \\
+ Prep time: & 1 hour \\
+ Cook time: & 25 minutes \\
+\end{info}
+
+%----Ingredients-------------------------------------------------------------%
+\recipesection{Ingredients}
+\begin{ingredients}
+ \group{For the dough}
+ \item{1 (\nicefrac{1}{4} oz.) package active dry yeast}
+ \item{1 tsp sugar}
+ \item{1 cup warm water}
+ \item{2 \nicefrac{1}{2} cups bread or all-purpose flour}
+ \item{1 tsp salt}
+ \item{1 Tbs dried oregano}
+ \group{For the filling}
+ \item{1 lb ground sausage}
+ \item{\nicefrac{1}{2} onion, diced}
+ \item{\nicefrac{1}{2} bell pepper, seeded and diced}
+ \item{1 tsp each dried basil, dried thyme, and red pepper flakes}
+ \item{\nicefrac{1}{2} block Mozzarella cheese $\quad\quad$ (4 oz.), diced}
+ \item{\nicefrac{1}{2} cup sliced olives}
+ \item{\nicefrac{3}{4} cup vodka or marinara sauce}
+\end{ingredients}
+
+%----Instructions------------------------------------------------------------%
+\recipesection{Instructions}
+
+\step{1.}{
+ Combine the sugar, yeast, and warm water in a large bowl
+ and rest 10 minutes to bloom. Add the other ingredients for the dough
+ and mix well.
+}
+\step{2.}{
+ Cook the onions, peppers, sausage, and seasoning together
+ in a medium skillet, breaking the sausage apart as it browns until
+ cooked through.
+}
+\step{3.}{
+ Drain the grease and remove from heat. Preheat the oven to
+ 400\degree.
+}
+\step{4.}{
+ Divide the dough into eighths and roll into thin disks on
+ a lightly floured surface, keeping extra flour handy to prevent
+ sticking.
+}
+\step{5.}{
+ Spread each disk with marinara sauce and divide the sausage
+ mixture among them. Fold the dough around the sausage mixture, pressing
+ flat, and fold or pinch the edges closed.
+}
+\step{6.}{
+ Transfer the calzones to prepared baking pans and use your
+ fingers to spread a light coat of olive oil on the exposed dough.
+ Cook in the preheated oven for 20 - 25 minutes, or until the
+ crust is lightly browned.
+}
+
+\pic{images/Italian_calzones.jpg}
+
+\section{Chicken}
+\subsection{Grilled chicken with capers}
+%----Title and info----------------------------------------------------------%
+\author{Brad, original by Sandra Lee @ www.foodnetwork.com}
+\title{Grilled chicken}
+\subtitle{\hspace*{0.4in}with capers}
+
+\begin{info}
+ Makes: & 2 servings \\
+ Time: & 45 minutes \\
+\end{info}
+
+\recipesection{For the chicken}
+
+\begin{ingredients*}
+ \item{2 chicken breasts, butterflied}
+ \item{Salt and pepper}
+\end{ingredients*}
+
+\step{1.}{
+ Rub the chicken with salt and pepper. Add oil to a skillet and place over
+ medium-high heat. Add the chicken and cook for 3 - 4 minutes, or until the
+ edges have turned white, and flip. Cook until the chicken firms to the touch
+ and is cooked through.
+}
+
+\recipesection{For the pasta}
+\begin{ingredients*}
+ \item{2 servings* fettuccini or linguini pasta}
+\end{ingredients*}
+
+\step{2.}{
+ Bring a pot of water to boil and add the pasta. Boil for about 10
+ minutes or until soft. Drain and rinse to halt cooking, and stir in
+ some olive oil.
+}
+
+\pagebreak
+\recipesection{For the caper sauce}
+\begin{ingredients*}
+ \item{1 shallot, diced}
+ \item{2 cloves garlic, minced}
+ \item{2 Tbs capers}
+ \item{1 cup white wine or chicken stock}
+ \item{1 Tbs Dijon mustard}
+ \item{1 Tbs dried parsley}
+ \item{\nicefrac{1}{4} cup plain Greek yogurt}
+\end{ingredients*}
+
+\step{3.}{
+ Saut\'{e} the shallot and garlic with a little oil
+ to soften. Add the capers and white wine and simmer, uncovered, to
+ reduce by about half.
+}
+\step{4.}{
+ Mix in the mustard and parsley, and season with salt and
+ pepper to taste. Remove from heat and stir in the Greek yogurt.
+}
+
+\recipesection{Notes}
+
+*One serving of pasta is about the diameter of a nickel.
+
+\pic[t]{images/Grilled_chicken_with_capers.jpg}
+
+\section{Sides and Desserts}
+
+\subsection{Curried butternut squash soup}
+\subsection{Pumpkin pie soup}
+\author{Brad}
+% Background images for side-by-side recipes
+\rightbgpic{images/Curried_butternut_squash_soup.jpg}
+\leftbgpic{images/Pumpkin_pie_soup.jpg}
+
+%----Title and info----------------------------------------------------------%
+\title{Pumpkin pie soup}
+
+\begin{info}
+ Makes: & 6 - 8 servings \\
+ Time: & 1 hour 15 minutes \\
+\end{info}
+
+%----Ingredients-------------------------------------------------------------%
+\recipesection{Ingredients}
+\begin{ingredients}
+ \item{2 carnival squash}
+ \item{2 cups coconut milk}
+ \item{2 cups chicken stock}
+ \item{2 shallots, diced}
+ \item{2 Tbs maple syrup or honey}
+ \item{Pinch salt, pepper, cinnamon, nutmeg, and ground cloves}
+\end{ingredients}
+
+%----Instructions------------------------------------------------------------%
+\recipesection{Instructions}
+
+\step{1.}{
+ Preheat the oven to 300\degree. Cut off the top of the squash
+ with the stem and then cut in half. Scrape the insides with a spoon and
+ coat the cut-sides with olive oil. Place flesh-down on a baking pan and
+ roast for 45 minutes, or until soft.
+}
+\step{2.}{
+ Cook the shallot with some oil in a large saucepan until
+ translucent and reduce the heat. Add the coconut milk, chicken stock,
+ maple syrup or honey, and spices.
+}
+\step{3.}{
+ Scoop out the squash flesh and add to the saucepan. Use an
+ immersion blender to puree the soup. Heat through and serve with a
+ sprinkle of nutmeg.
+}
+
+\pagebreak
+
+%----Title and info----------------------------------------------------------%
+\title{Curried butternut squash soup}
+
+\begin{info}
+ Makes: & 4 - 6 servings \\
+ Time: & 45 minutes \\
+\end{info}
+
+%----Ingredients-------------------------------------------------------------%
+\recipesection{Ingredients}
+\begin{ingredients}
+ \item{1 butternut squash, peeled, seeded, and chopped}
+ \item{1 apple, cored and chopped}
+ \item{1 onion, chopped}
+ \item{2 cloves garlic, chopped}
+ \item{2 cups coconut milk}
+ \item{1 Tbs curry powder}
+ \item{1 tsp mild chili powder}
+ \item{\nicefrac{1}{2} tsp ground black pepper}
+\end{ingredients}
+
+%----Instructions------------------------------------------------------------%
+\recipesection{Instructions}
+
+\step{1.}{
+ Place a medium saucepan or Dutch oven with some oil over medium
+ heat. Add the onions, garlic, apple, and spices and cook to soften,
+ about 5 minutes.
+}
+\step{2.}{
+ Add the squash and coconut milk and bring to a boil. Reduce the
+ heat, cover, and simmer for 20 - 30 minutes to soften the squash.
+}
+\step{3.}{
+ Puree the soup with an immersion blender. Serve with a splash
+ of heavy cream for garnish.
+}
+
+\recipesection{Notes}
+
+Divide the leftover soup into containers and freeze for up to 3 months.
+
+\clearpage
+
+\end{document}
+
diff --git a/macros/latex/contrib/recipebook/README b/macros/latex/contrib/recipebook/README
new file mode 100644
index 0000000000..adf4d39e98
--- /dev/null
+++ b/macros/latex/contrib/recipebook/README
@@ -0,0 +1,182 @@
+%====Copyright info==========================================================%
+%% README.txt
+%% 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 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
+%
+%====Abstract================================================================%
+This is a LaTeX2e class file for typesetting recipes. It is designed for
+typesetting one or two recipes per page, with dimensions of 5.5'' x 8.5''.
+The hyperlinked table of contents (ToC) and page numbers make browsing
+recipes convenient, and the pages can be joined together or printed 2 per page
+to normal letterpaper easily. The size was chosen to work in half-page
+3-ring binder cover sheets, because un-laminated paper just doesn't last in the
+kitchen.
+
+This class requires pdflatex to compile with image transparency.
+
+The half-letter pages can be printed two per page using your printer driver, or
+bound together using pdfjam, a shell script free and available for MacOSX and
+Linux. I haven't tested in MacOS, but in Linux the command to bind together
+your recipes for printing is
+$ pdfjam --nup 2x1 --papersize '{11in,8.5in}' Recipes.pdf
+where Recipes.pdf is the compiled version of your recipes.
+More info on pdfjam can be found here: http://go.warwick.ac.uk/pdfjam.
+
+%====Installation instructions===============================================%
+The simplest method is to place RecipeBook.cls in the same directory as your
+LaTeX source file.
+
+To install system-wide make the folder RecipeBook in your latex
+search path and place RecipeBook.cls inside.
+
+On Debian / Ubuntu systems, the preferred location is:
+/usr/local/share/texmf/tex/latex/
+Navigate to /usr/local/share/texmf, and execute the following bash command
+to update the search path.
+$ sudo mktexlsr
+
+%====Command and environment overview========================================%
+%----Title page and table of contents----------------------------------------%
+\titlepage[<Text>]{<image1>}{<image2>}{<image3>}
+This command will generate the title page. The title is given by <Text> with
+the default being Recipes, and <imagex> the image files to use.
+
+\section{<section>}
+Add a section heading to the ToC with a hyperlink pointing to the next recipe.
+
+\subsection{<subsection>}
+Add a subsection heading to the ToC with a hyperlink. This also controls
+clearing / moving to the next page, so each recipe should be preceeded by
+its subsection command.
+
+%----Recipe formatting-------------------------------------------------------%
+\title[<fontsize>]{<Text>}
+Format the recipe title. Default <fontsize> is 22pt.
+
+\subtitle[<fontsize>]{<Text>}
+Format the subtitle. Default <fontsize> is 18pt.
+
+\recipesection[<fontsize>]{<Text>}
+Add a section heading to the recipe, e.g. before the list of ingredients.
+
+\author[<Preamble>{<text>}
+Adds a footnote in the SW corner with text <text> preceded by <Preamble>.
+<Preamble> is 'Author: ' by default.
+
+\begin{info} ... \end{info}
+This is a tabular environment with two columns for general recipe info like
+cooking time and recipe yield.
+
+\begin{info*} ... \end{info*}
+Same and info environment except more compact spacing.
+
+\begin{ingredients}[<bullet>] ... \end{ingredients}
+The standard environment for listing ingredients. This will not wrap pages.
+This is a tabular environment with 2 columns. Ingredients and section
+headers can be listed with the following commands.
+
+\item[<bullet>]{<Text>}
+The optional argument <bullet> specifies the list bullets, the default is
+the \square icon.
+
+\group{<Text>}
+Formats a section header between ingredients.
+
+\begin{ingredients*} ... \end{ingredients*}
+Alternative method for formatting ingredients. This works best when the
+recipe can be divided into parts, and ingredients listed with their
+corresponding instructions. Formats the ingredients with a light background
+with blurred edges. Uses the same commands for the unstarred version for
+listing ingredients.
+
+\step{<Number>}{<Text>}
+Instruction steps don't need to be placed in an environment like ingredients.
+<Number> gives the instruction number, and <Text> the instruction text.
+<Number> should be a single digit followed by a period, or it will overflow the
+box.
+
+\hlgroup[<color>]{<Text>}
+Formats <Text> in italics with a shaded background with blurred edges. Useful
+for separating instruction steps with section information (e.g. 'For the
+sauce').
+
+\begin[<size>]{shrink} ... \end{shrink}
+You can put an entire recipe within the shrink environment if it doesn't fit
+on the page. Default value of <size> is 1pt, decimals are allowed.
+% Grow environment
+
+\begin[<size>]{grow} ... \end{grow}
+The complement of the shrink environment, if you would like your text larger.
+Default value is 1pt, decimals are allowed.
+%----Image commands----------------------------------------------------------%
+\pic[<location>]{<image>}
+Add a float image with fuzzy edges to your recipe. <location> can be h for
+here, t for top, or b for bottom. <image> is the image file, e.g. Burgers.jpg.
+
+\leftbgpic[<length>][<opacity>]{<image>}
+Add a background image in the left column. <length> is the vertical distance
+from the top of the page, the default is the length \pagetop. Opacity is a
+number between 0 and 1 with a default of 0.4. <image> is an image file.
+
+\rightbgpic[<length>][<opacity>]{<image>}
+Add a background image in the right column. Default <length> of \pagebottom
+places the image at the bottom of the page.
+
+%====Class specific lengths==================================================%
+% The following lengths are used to control various aspects of the class.
+\basefontsize % Info, ingredients, and instructions font size
+\basefontskipsize % Normally about 1.2\basefontsize. Controls line spacing.
+\recipetitlefontsize % Font size for recipe titles, not the title-page title.
+\instrnumsize % Font size for the instruction numbers
+\recipeheadfontsize % Font size for headings using \recipesection{}.
+
+%====Required Latex Packages=================================================%
+ragged2e % Left-aligns document instead of default justified, which leaves
+ % large gaps in 2-column mode.
+amsmath,amsfonts,amssymb % Use for \square symbol, etc.
+xparse % Allows for multiple optional arguments in new environments
+ % and other convenient class features
+wrapfig % Used for numbering instruction steps
+graphicx % Used to include pictures
+eso-pic % Used for transparent images
+anyfontsize % Provides arbitrary font sizes
+scrextend % Used with anyfontsize
+multirow, multicol % Join cells in tabular (used in \group)
+nicefrac % Nicer fraction format for inline fractions
+xcolor % Colored text
+gensymb % Provides degree symbol with \degree.
+booktabs % Provies a nice table line with \toprule
+tabularx % Required for ingredients and info environments
+calc % Provides \widthof for automatically adjusting width of
+ % the number box in \step{}
+picture % Used for absolute page dimensions with put{}.
+parskip % Custom spacing options
+tgtermes % Default font package
+fontenc % Required for controlling the font, somehow
+datetime % Used to generate the compile date on the title page
+fancyhdr % Used to control header and footer content
+tikz % Used for more complicated image control like fuzzy edges.
+tocloft % Used for more control over the table of contents (ToC).
+hypperref % Used for hyperlinked ToC and page numbers.
+geometry % Sets page geometry.
+environ % Used for more advanced environment definitions
+tcolorbox % Used for faded boxes in ingredients* environment
+
+%====Known bugs / features===================================================%
+Images with transparency won't work on the last page of the document. The
+workaround is to place a \clearpage command before \end{document}
+
+\author must be redefined for every page or it will carry over to the following
+recipes.
diff --git a/macros/latex/contrib/recipebook/RecipeBook.cls b/macros/latex/contrib/recipebook/RecipeBook.cls
new file mode 100644
index 0000000000..2a13d424e5
--- /dev/null
+++ b/macros/latex/contrib/recipebook/RecipeBook.cls
@@ -0,0 +1,393 @@
+%% 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
+ }
+}
+
diff --git a/macros/latex/contrib/recipebook/ShortSample.pdf b/macros/latex/contrib/recipebook/ShortSample.pdf
new file mode 100644
index 0000000000..5b68ae330b
--- /dev/null
+++ b/macros/latex/contrib/recipebook/ShortSample.pdf
Binary files differ
diff --git a/macros/latex/contrib/recipebook/ShortSample.tex b/macros/latex/contrib/recipebook/ShortSample.tex
new file mode 100644
index 0000000000..ce38c39f54
--- /dev/null
+++ b/macros/latex/contrib/recipebook/ShortSample.tex
@@ -0,0 +1,148 @@
+% Filename: ShortSample.tex
+% Minimal sample cookbook using RecipeBook class. Demonstrates
+% syntax for creating a title page, hyperlinked table of
+% contents, and several recipe formats.
+
+\documentclass{RecipeBook}
+
+\begin{document}
+
+% \titlepage[<Text>]{<image1>}{<image2>}{<image3>}
+% Provide title text and three image files to \titlepage to
+% generate a title page. In the following the images are located
+% in the subdirectory images.
+\titlepage[Sample Title]
+ {images/sample_image.jpg}
+ {images/sample_image.jpg}
+ {images/sample_image.jpg}
+
+% \makecontents
+% Generate hyperlinked table of contents
+\makecontents
+
+% Section and subsection commands for making ToC entries and
+% managing pagebreaks.
+\section{Sample section num. 1}
+\subsection{Sample recipe num. 1}
+
+% \author{<name>}
+% Author, to be displayed in a footnote
+\author{Sample Author}
+
+% Recipe title and subtitle
+\title{Sample Title}
+\subtitle{\hspace*{0.5in}sample subtitle}
+
+% info environment. This is a tabular environment with two
+% columns, so entries on the same line are separated by & and
+% lines must be ended with \\.
+\begin{info}
+ Makes: & X servings \\
+ Cooking time: & X hours
+\end{info}
+
+% \begin[<size>]{shrink} ... \end{shrink}
+% Shrink the text within this environment by value <size>. Default
+% value is 1 pt, a good place to start if your recipe is too long.
+\begin{shrink}
+
+% \recipesection{<text>}
+% Formats a heading with text <text>.
+\recipesection{Ingredients}
+
+% \begin{ingredients} ... \end{ingredients}
+% \ingr[<bullet>]{<text>}
+% Format ingredients in a tabular environment with bullet points
+% specified by <bullet>. The default is \square.
+% \group{<text>} removes bullet point and underlines the text.
+
+\begin{ingredients}
+ \group{Sample group heading}
+ \item{Sample ingredient}
+ \group{Sample group heading 2}
+ \item{Sample ingredient 2}
+\end{ingredients}
+
+\recipesection{Instructions}
+
+% \instr{<step_number>}{<text>}
+% Used for numbered instructions.
+\step{1.}{
+ Sample instruction with some extra text text text text text
+ text text text text text text text.
+}
+
+% \hlgroup{<text>}
+% Used for heading within instruction set.
+\hlgroup{Sample group heading}
+\step{2.}{
+ Sample instruction with some extra text text text text text
+ text text text text text text text.
+}
+
+\pagebreak
+\pic[t]{images/sample_image.jpg}
+
+\end{shrink}
+
+\section{Sample side-by-side recipes}
+\subsection{Sample recipe (a)}
+\subsection{Sample recipe (b)}
+\author{Sample Author}
+
+% \leftbgpic[<offset>][<transparency>]{<image_file>}
+% Places a transparent image with edge fading in the left
+% column, with <offset> setting the vertical distance from
+% the top of the page (default is \pagetop).
+% \rightbgpic[<offset>][<transparency>]{<image>}
+% Same syntax for \rightbgpic and leftbgpic. Default value
+% for <offset> is \pagebottom.
+\rightbgpic{images/sample_image.jpg}
+\leftbgpic{images/sample_image.jpg}
+
+%----Title and info----------------------------------------------------------%
+\title{Sample recipe (a)}
+
+\begin{info}
+ Makes: & X servings \\
+ Cooking time: & X hours
+\end{info}
+
+\recipesection{Ingredients}
+\begin{ingredients}
+ \item{Sample ingredient}
+ \item{Sample ingredient}
+\end{ingredients}
+
+\recipesection{Instructions}
+
+\step{1.}{
+ Sample instruction with some extra text text text text text
+ text text text text text text text.
+}
+
+\pagebreak
+
+\title{Sample recipe (b)}
+
+\begin{info}
+ Makes: & X servings \\
+ Cooking time: & X hours
+\end{info}
+
+\recipesection{Ingredients}
+\begin{ingredients}
+ \item{Sample ingredient}
+\end{ingredients}
+
+\recipesection{Instructions}
+
+\step{1.}{
+ Sample instruction with some extra text text text text text
+ text text text text text text text.
+}
+
+\clearpage
+
+\end{document}
+
diff --git a/macros/latex/contrib/recipebook/images/Curried_butternut_squash_soup.jpg b/macros/latex/contrib/recipebook/images/Curried_butternut_squash_soup.jpg
new file mode 100644
index 0000000000..5f8255ce02
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Curried_butternut_squash_soup.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/Curried_chicken_and_rice.jpg b/macros/latex/contrib/recipebook/images/Curried_chicken_and_rice.jpg
new file mode 100644
index 0000000000..042f782b34
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Curried_chicken_and_rice.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/French_dip.jpg b/macros/latex/contrib/recipebook/images/French_dip.jpg
new file mode 100644
index 0000000000..50c010973f
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/French_dip.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/Grilled_chicken_with_capers.jpg b/macros/latex/contrib/recipebook/images/Grilled_chicken_with_capers.jpg
new file mode 100644
index 0000000000..54e6cccda3
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Grilled_chicken_with_capers.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/Hawaiian_burgers.jpg b/macros/latex/contrib/recipebook/images/Hawaiian_burgers.jpg
new file mode 100644
index 0000000000..d7a9b53490
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Hawaiian_burgers.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/Italian_calzones.jpg b/macros/latex/contrib/recipebook/images/Italian_calzones.jpg
new file mode 100644
index 0000000000..a880d28300
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Italian_calzones.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/Pumpkin_pie_soup.jpg b/macros/latex/contrib/recipebook/images/Pumpkin_pie_soup.jpg
new file mode 100644
index 0000000000..84a444a00d
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/Pumpkin_pie_soup.jpg
Binary files differ
diff --git a/macros/latex/contrib/recipebook/images/sample_image.jpg b/macros/latex/contrib/recipebook/images/sample_image.jpg
new file mode 120000
index 0000000000..c4b70bd582
--- /dev/null
+++ b/macros/latex/contrib/recipebook/images/sample_image.jpg
@@ -0,0 +1 @@
+Curried_chicken_and_rice.jpg \ No newline at end of file