%% %% This is file `xcookybooky.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% xcookybooky.dtx (with options: `package') %% %% This is a generated file. %% Copyright (C) 2011 by Sven Harder %% %% This file 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. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{xcookybooky} [2011/12/29 v1.0 Easy typesetting (long) recipes with pictures] \DeclareOption{myconfig} {% load personal configuration \AtEndOfPackage{ \InputIfFileExists{xcookybooky.cfg} {\PackageInfo{xcookybooky}{inputting 'xcookybooky.cfg'}} {\PackageWarning{xcookybooky}{cannot find the configuration file 'xcookybooky.cfg'}} } } \ProcessOptions\relax \RequirePackage{tikz} % for creating the lines for the hint \RequirePackage{graphicx} \RequirePackage{xcolor} \RequirePackage{emerald} % Handwritten Fonts \RequirePackage[clock, misc, weather]{ifsym} % Symbolpackage e.g. \Interval, \Wecker etc \RequirePackage{cookingsymbols} % Cookings symbols e.g. \Oven, \Dish etc \RequirePackage{wrapfig} % To wrap the tabular with the ingredients \RequirePackage{ifthen} \RequirePackage{xkeyval} \RequirePackage{lettrine} % numbering the preparation steps \RequirePackage{fancyhdr} \RequirePackage{units} \RequirePackage{eso-pic} % for background pictures \RequirePackage{picture} % for modfifying the position of the bg pictures \setlength{\parindent}{0cm} \setlength{\parskip}{2ex plus 0.5ex} \setlength{\textwidth}{15.5cm} \setlength{\textheight}{24.0cm} \setlength{\topmargin}{-0.8cm} \setlength{\headheight}{12pt} %0cm \setlength{\headsep}{1cm} \setlength{\topskip}{0cm} \setlength{\footskip}{1.4cm} \setlength{\evensidemargin}{-0.5cm} \setlength{\oddsidemargin}{0.5cm} \setlength{\voffset}{0cm} \setlength{\hoffset}{0cm} \setcounter{secnumdepth}{2} % subsubsections not numbered \setcounter{tocdepth}{3} % subsubsections in the .toc file \newcommand*{\recipesection}[2][] {% \subsubsection[#1]{#2} } \define@key{colorManagement}{recipename}[green]{\def\xcb@color@recipename{#1}} \define@key{colorManagement}{ing}[gray]{\def\xcb@color@ing{#1}} \define@key{colorManagement}{inghead}[gray]{\def\xcb@color@inghead{#1}} \define@key{colorManagement}{prep}[black]{\def\xcb@color@prep{#1}} \define@key{colorManagement}{prephead}[black]{\def\xcb@color@prephead{#1}} \define@key{colorManagement}{hint}[black]{\def\xcb@color@hint{#1}} \define@key{colorManagement}{hinthead}[red]{\def\xcb@color@hinthead{#1}} \define@key{colorManagement}{hintline}[red]{\def\xcb@color@hintline{#1}} \define@key{colorManagement}{numeration}[red]{\def\xcb@color@numeration{#1}} \savekeys{colorManagement} {% recipename, % color of recipename ing, % color of ingredients (text) inghead, % color of headline of ingredients prep, % color of preparation (text) prephead, % color of headline of preparation hint, % color of hint (text) hinthead, % color of headline of hint hintline, % color of lines of hint numeration % color of numeration (preparation) } \newcommand*{\setRecipeColors}[1] {% \setkeys{colorManagement}{#1} } \setRecipeColors {% initialisation recipename, ing, inghead, prep, prephead, hint, hinthead, hintline, numeration } \define@key{sizeManagement}{recipename}[\fontsize{24pt}{30pt}]{\def\xcb@fontsize@recipename{#1}} \define@key{sizeManagement}{ing}[\normalsize]{\def\xcb@fontsize@ing{#1}} \define@key{sizeManagement}{inghead}[\normalsize]{\def\xcb@fontsize@inghead{#1}} \define@key{sizeManagement}{prep}[\normalsize]{\def\xcb@fontsize@prep{#1}} \define@key{sizeManagement}{prephead}[\normalsize]{\def\xcb@fontsize@prephead{#1}} \define@key{sizeManagement}{hint}[\normalsize]{\def\xcb@fontsize@hint{#1}} \define@key{sizeManagement}{hinthead}[\Large]{\def\xcb@fontsize@hinthead{#1}} \savekeys{sizeManagement} { recipename, ing, inghead, prep, prephead, hint, hinthead } \newcommand*{\setRecipeSizes}[1] { \setkeys{sizeManagement}{#1} } \setRecipeSizes {% initialisation recipename, ing, inghead, prep, prephead, hint, hinthead } %% Handwritten fonts: hlce, pbsi, hlcw, fjd, fau %% Other fonts: fwb \newcommand*{\setRecipenameFont}[4] {% sets the font for the recipename \def\xcb@font@recipename { \fontfamily{#1} \fontencoding{#2} \fontseries{#3} %x1 \fontshape{#4} \xcb@fontsize@recipename \selectfont } } \setRecipenameFont{fjd}{T1}{m}{n} \newcounter{step} \setcounter{step}{0} \renewcommand{\LettrineFontHook} {% \color{\xcb@color@numeration} } \newcommand{\step} {% \lettrine [% lines=2, lhang=0, % space into margin, value between 0 and 1 loversize=0.15, % enlarges the height of the capital slope=0em, findent=1em, % gap between capital and intended text nindent=0em % shifts all intended lines, begining with the second line ]{\stepcounter{step}\thestep}{}% } \define@key{headlines}{inghead}[Zutaten]{ \def\xcb@name@inghead{\textcolor{\xcb@color@inghead}{\textbf{\xcb@fontsize@inghead{#1}}\ }} } \define@key{headlines}{prephead}[Zubereitung]{ \def\xcb@name@prephead{\textcolor{\xcb@color@prephead}{\textbf{\xcb@fontsize@prephead{#1}}\ }} } \define@key{headlines}{hinthead}[Tipp:]{ \def\xcb@name@hinthead{\textcolor{\xcb@color@hinthead}{\xcb@fontsize@hinthead{#1}}} } \define@key{headlines}{continuationhead}[Fortsetzung]{\def\xcb@name@continuationhead{#1}} \define@key{headlines}{continuationfoot}[Fortsetzung auf n\"achster Seite]{\def\xcb@name@continuationfoot{#1}} \define@key{headlines}{preparationtime}[\fontsize{14.5pt}{10pt}\Gloves]{\def\xcb@name@preparationtime{#1}} \define@key{headlines}{bakingtime}[\fontsize{14.5pt}{10pt}\Oven]{\def\xcb@name@bakingtime{#1}} \define@key{headlines}{bakingtemperature}[\Thermo{4}]{\def\xcb@name@bakingtemperature{#1}} \define@key{headlines}{portion}[\fontsize{14.5pt}{10pt}\Dish]{\def\xcb@name@portion{#1}} \define@key{headlines}{portionvalue}[Personen]{\def\xcb@name@portionvalue{#1}} \define@key{headlines}{calory}[Brennwert]{\def\xcb@name@calory{#1}} \define@key{headlines}{source}[\PaperPortrait]{\def\xcb@name@source{#1}} \savekeys{headlines} { inghead, prephead, hinthead, continuationhead, continuationfoot, preparationtime, bakingtime, bakingtemperature, portion, portionvalue, calory, source } \newcommand*{\setHeadlines}[1] {% \setkeys{headlines}{#1} } \setHeadlines {% initialisation inghead, prephead, hinthead, continuationhead, continuationfoot, preparationtime, bakingtime, bakingtemperature, portion, portionvalue, calory, source } \define@key{recipelengths}{preparationwidth}[0.60\textwidth]{\def\xcb@preparationwidth{#1}} \define@key{recipelengths}{ingredientswidth}[0.35\textwidth]{\def\xcb@ingredientswidth{#1}} \define@key{recipelengths}{pictureheight}[6cm]{\def\xcb@pictureheight{#1}} \savekeys{recipelengths} { preparationwidth, ingredientswidth, pictureheight } \newcommand*{\setRecipeLengths}[1] {% \setkeys{recipelengths}{#1} } \setRecipeLengths {% initialisation preparationwidth, ingredientswidth, pictureheight } \define@key{graph}{small}[]{ \def\xcb@sgraph{ \ifthenelse{\equal{#1}{}} {% not set => not shown } { \vspace{-0.5cm} \includegraphics[width=\linewidth, height = \xcb@pictureheight, keepaspectratio]{#1} } } } \define@key{graph}{big}[]{ \def\xcb@bgraph{ \ifthenelse{\equal{#1}{}} {% not set => not shown } { \vspace{-0.5cm} \includegraphics[width=\linewidth, height = \xcb@pictureheight, keepaspectratio]{#1} } } } \define@key{recipe}{preparationtime}[]{\def\xcb@preparationtime{#1}} \define@key{recipe}{bakingtime}[]{\def\xcb@bakingtime{#1}} \define@key{recipe}{bakingtemperature}[]{\def\xcb@bakingtemperature{#1}} \define@key{recipe}{portion}[]{\def\xcb@portion{#1}} \define@key{recipe}{calory}[]{\def\xcb@calory{#1}} \define@key{recipe}{source}[]{\def\xcb@source{#1}} \newcommand*{\portion}[2][\xcb@name@portionvalue]{\unit[#2]{#1}} \define@key{bakingtemperature}{fanoven}[]{\def\xcb@bakingtemperature@fanoven{#1}} \define@key{bakingtemperature}{topbottomheat}[]{\def\xcb@bakingtemperature@topbottomheat{#1}} \define@key{bakingtemperature}{topheat}[]{\def\xcb@bakingtemperature@topheat{#1}} \define@key{bakingtemperature}{bottomheat}[]{\def\xcb@bakingtemperature@bottomheat{#1}} \define@key{bakingtemperature}{gasstove}[]{\def\xcb@bakingtemperature@gasstove{#1}} \newboolean{xcb@bakingtemperature@firstentry} \newcommand*{\bakingtemperature}[1] {% \setboolean{xcb@bakingtemperature@firstentry}{true}% \setkeys{bakingtemperature}{fanoven, topbottomheat, topheat, bottomheat, gasstove}% \setkeys{bakingtemperature}{#1}% \ifthenelse{\equal{\xcb@bakingtemperature@fanoven}{}}% {}% {% \xcb@bakingtemperature@fanoven \ {\fontsize{14.5pt}{10pt}\Fanoven}% \setboolean{xcb@bakingtemperature@firstentry}{false}% }% \ifthenelse{\equal{\xcb@bakingtemperature@topbottomheat}{}}% {}% {% \ifthenelse{\boolean{xcb@bakingtemperature@firstentry}}{\setboolean{xcb@bakingtemperature@firstentry}{false}}{, }% \xcb@bakingtemperature@topbottomheat \ {\fontsize{14.5pt}{10pt}\Topbottomheat}% }% \ifthenelse{\equal{\xcb@bakingtemperature@topheat}{}}% {}% {% \ifthenelse{\boolean{xcb@bakingtemperature@firstentry}}{\setboolean{xcb@bakingtemperature@firstentry}{false}}{, }% \xcb@bakingtemperature@topheat \ {\fontsize{14.5pt}{10pt}\Topheat}% }% \ifthenelse{\equal{\xcb@bakingtemperature@bottomheat}{}}% {}% {% \ifthenelse{\boolean{xcb@bakingtemperature@firstentry}}{\setboolean{xcb@bakingtemperature@firstentry}{false}}{, }% \xcb@bakingtemperature@bottomheat \ {\fontsize{14.5pt}{10pt}\Bottomheat}% }% \ifthenelse{\equal{\xcb@bakingtemperature@gasstove}{}}% {}% {% \ifthenelse{\boolean{xcb@bakingtemperature@firstentry}}{\setboolean{xcb@bakingtemperature@firstentry}{false}}{, }% \xcb@bakingtemperature@gasstove \ {\fontsize{14.5pt}{10pt}\Gasstove}% }% } \newenvironment{recipe}[2][] { %% macros \newcommand*{\graph}[1] {% \setkeys{graph}{##1} } \newcommand*{\ingredients}[1] {% \def\xcb@ingredients {% \vspace{-1em} % same height of ingredients and preparation \xcb@name@inghead %\\[4pt] \\[1em] \xcb@fontsize@ing\color{\xcb@color@ing} \begin{tabular}{rll} ##1 \end{tabular} } } \newcommand*{\preparation}[1] {% \def\xcb@preparation {% \xcb@name@prephead %\\[4pt] \xcb@fontsize@prep\color{\xcb@color@prep}##1 } \setcounter{step}{0} } \newcommand*{\hint}[1] {% \def\xcb@hint {% \pagebreak[1] % begin here a new page, if the space is small \begin{tikzpicture}[line width = 1.5pt, \xcb@color@hintline] \useasboundingbox (0,0) -- ++(right:3.5cm) -- ++(up:3mm) -- ++(left:3.5cm) -- cycle; \draw (-3mm, 0mm) -- ++(right:3.5cm); \draw (0, 3mm) -- ++(down:2.4cm); \end{tikzpicture} \nopagebreak \begingroup % a group for the hint \leftskip1em \xcb@name@hinthead \nopagebreak \itshape\textcolor{\xcb@color@hint}{\xcb@fontsize@hint{##1}} \par \endgroup } } \newcommand{\xcb@cmd@recipeoverview} { \begin{tabular}{rl} \ifthenelse{\equal{\xcb@preparationtime}{}} {% not set => not shown } { \xcb@name@preparationtime & \xcb@preparationtime\\ } \ifthenelse{\equal{\xcb@bakingtime}{}} {% not set => not shown } { \xcb@name@bakingtime & \xcb@bakingtime\ifthenelse{\equal{\xcb@bakingtemperature}{}} { \\ } {,\hspace{1em} \xcb@name@bakingtemperature \hspace{1ex} \xcb@bakingtemperature\\ } } \ifthenelse{\equal{\xcb@portion}{}} {% not set => not shown } { \xcb@name@portion & \xcb@portion\\ } \ifthenelse{\equal{\xcb@calory}{}} {% not set => not shown } { \xcb@name@calory & \xcb@calory\\ } \ifthenelse{\equal{\xcb@source}{}} {% not set => not shown } { \xcb@name@source & \xcb@source } \end{tabular} } \newcommand\xcb@cmd@wrapfill {% \par \ifx\parshape\WF@fudgeparshape \nobreak \vskip-\baselineskip \vskip\c@WF@wrappedlines\baselineskip \allowbreak \WFclear \fi } %% end of macros % initialisation \setkeys{recipe}{preparationtime, bakingtime, bakingtemperature, portion, calory, source} \setkeys{graph}{small, big} \ingredients{} \preparation{} \def\xcb@hint{} \def\xcb@recipename{#2} \setkeys{recipe}{#1} % reading the optional parameters \setcounter{xcb@newpagefoot}{1} \setcounter{xcb@newpagehead}{\value{page}} } {% this part is executed at \end{recipe} %% FIRST BLOCK \if@twoside \ifodd\arabic{page} \begin{minipage}[T]{\xcb@preparationwidth} \xcb@bgraph \end{minipage} \hfill \begin{minipage}[T]{\xcb@ingredientswidth} \xcb@sgraph \end{minipage} \else \begin{minipage}[T]{\xcb@ingredientswidth} \xcb@sgraph \end{minipage} \hfill \begin{minipage}[T]{\xcb@preparationwidth} \xcb@bgraph \end{minipage} \fi \else \begin{minipage}[T]{\xcb@preparationwidth} \xcb@bgraph \end{minipage} \hfill \begin{minipage}[T]{\xcb@ingredientswidth} \xcb@sgraph \end{minipage} \fi %% SECOND BLOCK \recipesection[\normalsize\xcb@recipename]% {\hspace{-1em}\textcolor{\xcb@color@recipename}{\xcb@font@recipename\xcb@recipename}} \xcb@cmd@recipeoverview %% THIRD BLOCK \begin{wraptable}{r}{\xcb@ingredientswidth} { \xcb@ingredients } \end{wraptable} \xcb@preparation \vfill \xcb@cmd@wrapfill \xcb@hint \setcounter{xcb@newpagefoot}{0} } \pagestyle{fancy} \renewcommand{\sectionmark}[1] {% \markright{\MakeUppercase{\thesection.\ #1}} } \renewcommand{\headrulewidth} {% 0.5pt } \fancyhf{} \fancyfoot[LE,RO]{\textbf{\thepage}} \fancyhead[LE,RO]{\rightmark} \fancyhead[C]{\@newpagehint{head}} \fancyfoot[C]{\@newpagehint{foot}} \newcounter{xcb@newpagehead} \setcounter{xcb@newpagehead}{0} \newcounter{xcb@newpagefoot} \setcounter{xcb@newpagefoot}{0} \newcommand*{\@newpagehint}[1] { \ifthenelse{\equal{#1}{head}} { \ifnum \value{xcb@newpagehead} < \value{page} \ifnum \value{xcb@newpagehead} > 0 \xcb@name@continuationhead \fi \fi } { \ifthenelse{\value{xcb@newpagefoot} > 0} { \xcb@name@continuationfoot } {% if no message at the bottom is set, there is no need for a message on the next page \setcounter{xcb@newpagehead}{0} } } } \define@key{background}{width}[\linewidth]{\def\xcb@background@width{#1}} \define@key{background}{height}[\paperheight]{\def\xcb@background@height{#1}} \define@key{background}{x}[0cm]{\def\xcb@background@x{#1}} \define@key{background}{y}[0cm]{\def\xcb@background@y{#1}} \define@key{background}{orientation}[default]{\def\xcb@background@orientation{#1}} \savekeys{background} {% width, height, x, y, orientation } \newcommand*{\setBackgroundPicture}[2][] {% \ClearShipoutPictureBG \setkeys{background}{width, height, x, y, orientation} % initialisation \setkeys{background}{#1} \AddToShipoutPicture {% \ifthenelse{\equal{\xcb@background@orientation}{default}} {% default \put(\xcb@background@x, \xcb@background@y) {% \parbox[b][\xcb@background@height]{\xcb@background@width} {% \vfill \includegraphics[width=\xcb@background@width, height=\xcb@background@height, keepaspectratio]{#2}% \vfill } } } {% \ifthenelse{\equal{\xcb@background@orientation}{pagecenter}} {% pagecenter \AtPageCenter{% \makebox(\xcb@background@x, \xcb@background@y)[c] {% \includegraphics[width=\xcb@background@width, height=\xcb@background@height, keepaspectratio]{#2} } } } {% \ifthenelse{\equal{\xcb@background@orientation}{textcenter}} {% textcenter \AtTextCenter{% \makebox(\xcb@background@x, \xcb@background@y)[c] {% \includegraphics[width=\xcb@background@width, height=\xcb@background@height, keepaspectratio]{#2} } } } {% \ifthenelse{\equal{\xcb@background@orientation}{stockcenter}} {% stockcenter \AtStockCenter{% \makebox(\xcb@background@x, \xcb@background@y)[c] {% \includegraphics[width=\xcb@background@width, height=\xcb@background@height, keepaspectratio]{#2} } } } {% error message \PackageError{xcookybooky} {There is no '\xcb@background@orientation' option for background picture orientation available!} {The possible options are: default, pagecenter, textcenter or stockcenter} } } } } } } \endinput %% %% End of file `xcookybooky.sty'.