Pensándolo bien...

Pensándolo bien...

Llevo un tiempo intentando crear un libro de recetas atractivo usando ShareLaTeX. Intenté usar los paquetes cookybookyand cuisinepero parece que no puedo hacerlos funcionar. Quiero que cada página tenga:

  1. El título de la receta y que ese título se coloque en la página de contenido.
  2. Símbolos para indicar:

    a) si la comida se puede congelar o no;

    (b) si es o no vegetariano;

    (c) cuánto tiempo lleva prepararlo (tiempo de preparación y cocción);

    (d) a cuántas personas sirve.

  3. La lista de ingredientes para

    (a) tener su propio subtítulo;

    (b) tener la opción de un subtítulo para cosas como adobos, etc.;

    (c) estar organizado como: ingrediente de medida numérica (preparación).

  4. Las instrucciones (de nuevo con subtítulo propio) con la opción de poner "Precalentar el horno a x grados" entre "Instrucciones" y la primera instrucción.

  5. La opción de agregar una imagen a cada receta del mismo tamaño en el mismo lugar.

Por el momento, una receta típica se ve así:

ingrese la descripción de la imagen aquí

Estoy mayormente contento con su apariencia (aunque algo de color podría quedar bien). Sin embargo, lo he hecho todo "a mano", por lo que supone mucho trabajo garantizar que todas las recetas tengan el mismo formato.

¿Es posible hacer una plantilla así?

Mi código para la receta anterior:

\newpage
\section{Raspberry Chocolate Tiramisu}
\lhead{}\chead{Serves 4}\rhead{V}
\lfoot{Prep time:}\rfoot{Cook time:}
\begin{multicols}{2}
{\Large Instructions}
\begin{itemize}
    \item 100ml Double Strength Coffee
    \item 400g Raspberries (blitzed)
    \item 200g Mascarpone
    \item 2 tbsp Sweetener
    \item 1 tsp Vanilla Extract
    \item 700g Vanilla Yogurt
    \item 15g Dark Chocolate (finely grated)
\end{itemize}
\columnbreak
\textit{For the Crumble Mixture}:
\begin{itemize}
    \item 80g Wholemeal Flour
    \item 80g Plain Flour
    \item 80g Butter (diced)
    \item 70g Demerara Sugar
\end{itemize}
\end{multicols}
{\Large Instructions}\\
Preheat the over to Gas Mark 4, Electric $180^\circ$C, Fan $160^\circ$C.
\begin{enumerate}
    \item Stir the two kinds of flour together in a bowl, add the butter and rub it into the flour. When the mixture looks like breadcrumbs, mix in the brown sugar. Lay the mixture on a shallow baking tray and bake for 25-30 minutes until golden brown. Leave on the side to cool.
    \item Mix together the mascarpone, sweetener, vanilla extract, and three quarters of the chocolate. Put half the crumble mixture in each of the glasses and pour over half the quark mixture along with half the raspberries.
    \item Put the other half of the crumble mixture on top, followed by the remaining quark mixture and raspberries. Sprinkle over the last of the chocolate. Chill for 3 hours before serving.
\end{enumerate}

Respuesta1

Gracias a @alephzero por hacer de este un proyecto LaTeX real. Es decir, concentrarse en la semántica de la receta en lugar del marcado LaTeX.

Con ese fin, prefiero entradas y salidas limpias y ordenadas. Solía \obeylines​​​​emular entornos de listas sin el marcado correspondiente. También he utilizado un poco de color para indicar algunas posibilidades. He incluido comentarios en mi código muy simple que deberían mostrar el camino. Computer Modern no sería mi elección, pero no sé cuál es su entorno TeXing, así que no quería hacer suposiciones inconvenientes. Mantendría la ornamentación al mínimo (reglas y demás) para ayudar a que la presentación de la receta sea lo más clara posible. Buen provecho.

Más tarde:

He proporcionado algunos que faltan %. Además, he proporcionado la posibilidad de una nota de encabezado como argumento opcional \recipe. Además, para mi propio beneficio, he solicitado la ayuda de geometry.stypara producir una salida de 5,5 x 8,5 pulgadas. Eso, por supuesto, se puede cambiar según convenga.

Aún más tarde:

También debo señalar que esto crea un TOC usando \frontmattery \backmatterdesde book.cls. Algo así como los cacahuetes: no puedes comer solo uno...

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = XeLaTeX

%% pagestyle alterations per user request 14 xii 2020

\documentclass{article}
\usepackage{fancyhdr}
\usepackage{multicol}
\usepackage[%
    %a5paper,
    papersize={5.5in,8.5in},
    margin=0.75in,
    top=0.75in,
    bottom=0.75in,
    %twoside
    ]{geometry}
\usepackage{xcolor}
\usepackage{graphicx}

\raggedcolumns
\setlength{\multicolsep}{0pt}
\setlength{\columnseprule}{1pt}

\makeatletter

%% Used for the headnote and in \showit
%% If the text is small it is placed on one line;
%% otherwise it is put into a raggedright paragraph.
\long\def\testoneline#1{%
  \sbox\@tempboxa{#1}%
  \ifdim \wd\@tempboxa <0.75\linewidth
        \begingroup
            \itshape
            #1\par
        \endgroup
  \else
    \parbox{0.75\linewidth}{\raggedright\itshape#1}%
    \par
  \fi
}

\newif\if@mainmatter \@mainmattertrue

%% Borrowed from book.cls
\newcommand\frontmatter{%
    \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{roman}}
\newcommand\mainmatter{%
    \cleardoublepage
  \@mainmattertrue
  \pagenumbering{arabic}}
\makeatother

%% Vary the colors at will

\definecolor{vegcolor}{rgb}{0,0.5,0.2}
\definecolor{frzcolor}{rgb}{0,0,1}
\definecolor{dessertcolor}{rgb}{0.5,0.2,0.1}
\definecolor{makeaheadcolor}{rgb}{0.5,0.5,0.6}

%% Thanks to alephzero for the excellent start:
\newcommand{\recipe}[2][]{%
    \newpage
    \thispagestyle{fancy}
    \lhead{}%
    \chead{}%
    \rhead{}%
    \lfoot{}%
    \rfoot{}%
    \section{#2}%
    \if###1##%
    \else
        \begin{center}
            \testoneline{#1}%
        \end{center}
    \fi
}
\newcommand{\serves}[2][Serves]{%
    \chead{#1 #2}}
\newcommand{\dishtype}[1]{%
    \rhead{#1}%
}
\newcommand{\dishother}[1]{%
    \lhead{#1}%
}
\newcommand{\vegetarian}{%
    {\large\color{vegcolor}\textbf{V}}%
}
\newcommand{\freeze}{%
    {\large\color{frzcolor}\textbf{F}}%
}
\newcommand{\dessert}{%
    {\large\color{dessertcolor}\textbf{D}}%
}
\newcommand{\makeahead}{%
    {\large\color{makeaheadcolor}\textbf{M}}%
}
%% Optional arguments for alternate names for these:
\newcommand{\preptime}[2][Prep time]{%
    \lfoot{#1: #2}%
}
\newcommand{\cooktime}[2][Cook time]{%
    \rfoot{#1: #2}%
}
\newcommand{\temp}[1]{%
    $#1^\circ$C}
%% Optional argument is the width of the graphic, default = 1in
\newcommand{\showit}[3][1in]{%
    \begin{center}
        \bigskip
            \includegraphics[width=#1]{#2}%
            \par
            \medskip
            \testoneline{#3}%
            \par
    \end{center}%
}

%% Optional argument for a  heading within the ingredients section
\newcommand{\ingredients}[1][]{%
    \if###1##%
        {\color{red}\Large\textbf{Ingredients}}%
    \else
        \emph{#1}%
    \fi
}

%% Use \obeylines to minimize markup
\newenvironment{ingreds}{%
    \parindent0pt
    \noindent
    \ingredients
    \par
    \smallskip
    \begin{multicols}{2}
    \leftskip1em
    \rightskip0pt plus 3em
    \parskip=0.25em
    \obeylines
    \everypar={\hangindent2em}
}{%
    \end{multicols}%
    \medskip
}

\newcounter{stepnum}

%% Optional argument for an italicized pre-step
%% Also use obeylines to minimize markup here as well
\newenvironment{method}[1][]{%
    \setcounter{stepnum}{0}
    \noindent
    {\color{red}\Large\textbf{Instructions}}%
    \par
    \smallskip
    \if###1##%
    \else
        \noindent
        \emph{#1}
        \par
    \fi
    \begingroup
    \parindent0pt
    \parskip0.25em
        \leftskip2em
    \everypar={\llap{\stepcounter{stepnum}\hbox to2em{\thestepnum.\hfill}}}
}{%
    \par
    \endgroup
    }

\pagestyle{plain}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\recipe[This is a simple headnote that describes the product for the user. A simple but elegant dessert.]{Raspberry Chocolate Tiramisu}
\serves{4}
\preptime{1 hour}
\cooktime[Chill time]{1$\frac{1}{2}$ hours}
\dishtype{\dessert,\vegetarian}
\dishother{\makeahead, \freeze}
\begin{ingreds}
     100ml double strength coffee
     400g raspberries (blitzed)
     200g mascarpone
     2 tbsp sweetener
     1 tsp vanilla extract
     700g vanilla yogurt
     15g dark chocolate (finely grated) and a really long one
\columnbreak
\ingredients[For the Crumble Mixture:]
     80g wholemeal flour
     80g plain flour
     80g butter (diced)
     70g demerara sugar
\end{ingreds}

\begin{method}[Preheat the oven to Gas Mark 4, Electric \temp{180}, Fan \temp{160}.]
     Stir the two kinds of flour together in a bowl, add the butter and rub it into the flour. When the mixture looks like breadcrumbs, mix in the brown sugar. Lay the mixture on a shallow baking tray and bake for 25--30 minutes until golden brown. Leave on the side to cool.

     Mix together the mascarpone, sweetener, vanilla extract, and three quarters of the chocolate. Put half the crumble mixture in each of the glasses, sprinkling over with half the coffee, and pour over half the mascarpone mixture along with half the raspberries.

     Put the other half of the crumble mixture on top, sprinkling over with the remaining half of the coffee, followed by the remaining quark mixture and raspberries. Sprinkle over the last of the chocolate. Chill for 3 hours before serving.

\end {method}

\showit[1.25in]{example-image-b}{This is a picture}

\end{document}

Primera versión

Pensándolo bien...

No me gusta mucho este formato,bipartito,en el que los ingredientes se presentan solos en un área visualmente distinta y bastante separada del método. Aparentemente, el propósito de esto era permitir al usuario ver desde el principio qué materias primas se necesitarían. Isabella Beeton (Libro de gestión del hogar,1861) instó a sus lectores a “seguir precisamente el orden en que se dan las recetas. Así, que primero coloquen en su mesa todos los INGREDIENTES necesarios; entonces el modus operandi, o MODO de preparación, será fácilmente manejado”, en una práctica ahora comúnmente llamadamal en su lugar. Pero con demasiada frecuencia, especialmente en recetas más largas, algo (a menudo un ingrediente) se pierde o se malinterpreta, o se salta un paso o se malinterpreta a medida que la vista va y viene entre los ingredientes y el método. El efecto es análogo al de leer líneas de texto demasiado largas: el ojo tiene problemas para localizar correctamente el comienzo de la siguiente línea y vuelve a leer la misma línea o se salta una línea. (https://www.fonts.com/content/learning/fontology/level-2/text-typography/length-column-width) En cualquier caso, basta decir que yo daría formato a esta receta de forma bastante diferente (ver más abajo).

Por el momento, seguiré con esta receta tal como está y abordaré otro tema: la especificación de los ingredientes. Desde la aparición del formato bipartito impreso (en inglés, a principios del siglo XIX), los ingredientes se han presentado de forma claramentenarrativoformato: 1 cucharadita [de] sal, 1 taza [de] harina, 2 onzas [de] cacao, etc. Aunque es idiomático en el habla, impreso esto da la impresión de que de alguna manera elcantidaddel ingrediente es el tema candente, no elidentidaddel ingrediente mismo. Afortunadamente, TeX proporciona las herramientas para corregir esto analizando los ingredientes sin alterar indebidamente este formato habitual (aunque insatisfactorio) con marcas innecesarias. Además, los ingredientes deben capitalizarse sólo si no están precedidos por una cantidad (Whitman,Recetas en tipo,pp.124--125), como aquí. Además, es mejor no abreviar las unidades de medida (Whitman,Recetas en tipo,pp. 15--16), excepto en caso de espacio limitado.

Además, voy a dejar que una fuente OpenType (STIX Two) se encargue del símbolo de grado (°) y de la fracción (½), minimizando aún más la codificación.

\documentclass{article}
\usepackage{fancyhdr,multicol,xcolor,graphicx,xparse,fontspec}
\usepackage[%
    %a5paper,
    papersize={5.5in,8.5in},
    margin=0.75in,
    top=0.75in,
    bottom=0.75in,
    %twoside
    ]{geometry}

\makeatletter

%% Used for the headnote and in \showit
%% If the text is small it is placed on one line;
%% otherwise it is put into a raggedright paragraph.
\long\def\testoneline#1{%
  \sbox\@tempboxa{#1}%
  \ifdim \wd\@tempboxa <0.75\linewidth
        \begingroup
            \itshape
            #1\par
        \endgroup
  \else
    \parbox{0.75\linewidth}{\raggedright\itshape#1}%
    \par
  \fi
}

\newif\if@mainmatter \@mainmattertrue

%% Borrowed from book.cls
\newcommand\frontmatter{%
    \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{roman}}
\newcommand\mainmatter{%
    \cleardoublepage
  \@mainmattertrue
  \pagenumbering{arabic}}
\makeatother

%% Vary the colors at will

\definecolor{vegcolor}{rgb}{0,0.5,0.2}
\definecolor{frzcolor}{rgb}{0,0.8,0.8}
\definecolor{dessertcolor}{rgb}{0.5,0.2,0.1}
\definecolor{makeaheadcolor}{rgb}{0.5,0.5,0.6}

%% Thanks to alephzero for the excellent start:
\newcommand{\recipe}[2][]{%
    \newpage
    \thispagestyle{fancy}
    \lhead{}%
    \chead{}%
    \rhead{}%
    \lfoot{}%
    \rfoot{}%
    \section{#2}%
    \if###1##%
    \else
        \begin{center}
            \testoneline{#1}%
        \end{center}
    \fi
}
\newcommand{\serves}[2][Serves]{%
    \chead{#1 #2}}
\newcommand{\dishtype}[1]{%
    \rhead{#1}%
}
\newcommand{\dishother}[1]{%
    \lhead{#1}%
}
\newcommand{\vegetarian}{%
    {\large\color{vegcolor}\textbf{V}}%
}
\newcommand{\freeze}{%
    {\large\color{frzcolor}\textbf{F}}%
}
\newcommand{\dessert}{%
    {\large\color{dessertcolor}\textbf{D}}%
}
\newcommand{\makeahead}{%
    {\large\color{makeaheadcolor}\textbf{M}}%
}
%% Optional arguments for alternate names for these:
\newcommand{\preptime}[2][Prep time]{%
    \lfoot{#1: #2}%
}
\newcommand{\cooktime}[2][Cook time]{%
    \rfoot{#1: #2}%
}
\newcommand{\temp}[1]{%
    #1°C}
%% Optional argument is the width of the graphic, default = 1in
\newcommand{\showit}[3][1in]{%
    \begin{center}
        \bigskip
            \includegraphics[width=#1]{#2}%
            \par
            \medskip
            \testoneline{#3}%
            \par
    \end{center}%
}

%% Optional argument for a  heading within the ingredients section
\newcommand{\ingredients}[1][]{%
    \if###1##%
        {\color{red}\Large\textbf{Ingredients}}%
    \else
        \emph{#1}%
    \fi
}

\def\ucit#1{\uppercase{#1}}
\begingroup
    \lccode`~=`\^^M
    \lowercase{%
\endgroup%% Ingredient first, then measure; empty measure and/or unit = " . "
    %% *=column break; amount<space>ingredient
    \NewDocumentCommand{\ing}{s u{ } u{~}}{% %% basically the same as: \def\ing#1 #2~{%
         %% or: \bfseries\ucit#3\if#1#2---\else,\ \fi
        \if.#2%
            \emph{#3}~ % A heading
        \else % Amounts containing spaces <1 teaspoon> have to use '~' <1~teaspoon>
            \textbf{\ucit#3, }#2 \IfBooleanT{#1}{\columnbreak}~ %
        \fi
    }%
}%


%% Use \obeylines to minimize markup
\newenvironment{ingreds}{%
    \parindent0pt
    \noindent
    \ingredients
    \par
    \smallskip
    \begin{multicols}{2}
    \leftskip1em
    \parindent-1em
    \rightskip0pt plus 3em
    \parskip=0.25em
    \obeylines
    \everypar={\ing}
}{%
    \end{multicols}%
    \medskip
}

\newcounter{stepnum}

%% Optional argument for an italicized pre-step
%% Also use obeylines to minimize markup here as well
\newenvironment{method}[1][]{%
    \setcounter{stepnum}{0}
    \noindent
    {\color{red}\Large\textbf{Instructions}}%
    \par
    \smallskip
    \if###1##%
    \else
        \noindent
        \emph{#1}
        \par
    \fi
    \begingroup
    \rightskip0pt plus 3em
    \parindent0pt
    \parskip0.25em
        \leftskip2em
    \everypar={\llap{\stepcounter{stepnum}\hbox to2em{\thestepnum.\hfill}}}
}{%
    \par
    \endgroup
    }

\setmainfont{STIX Two Text}

\pagestyle{plain}
\raggedcolumns
\setlength{\multicolsep}{0pt}
\setlength{\columnseprule}{1pt}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\recipe[This is a simple headnote that describes the product for the user. A simple but elegant dessert.]{Raspberry Chocolate Tiramisu}
\serves{4}
\preptime{1 hour}
\cooktime[Chill time]{1½ hours}
\dishtype{\dessert,\vegetarian}
\dishother{\makeahead, \freeze}
\begin{ingreds}% amount<space>ingredient; initial <.>=comment;*=column break
     100ml double strength coffee
     400g raspberries (blitzed)
     200g mascarpone
     2~tablespoons sweetener
     1~teaspoon vanilla extract
     700g vanilla yogurt
     *15g dark chocolate (finely grated) 
     . for the crumble mixture:
     80g wholemeal flour
     80g plain flour
     80g butter (diced)
     70g demerara sugar
\end{ingreds}

\begin{method}[Preheat the oven to Gas Mark 4, Electric \temp{180}, Fan \temp{160}.]
     Stir the two kinds of flour together in a bowl, add the butter and rub it into the flour. When the mixture looks like breadcrumbs, mix in the brown sugar. Lay the mixture on a shallow baking tray and bake for 25--30 minutes until golden brown. Leave on the side to cool.

     Mix together the mascarpone, sweetener, vanilla extract, and three quarters of the chocolate. Put half the crumble mixture in each of the glasses and pour over half the quark mixture along with half the raspberries.

     Put the other half of the crumble mixture on top, followed by the remaining quark mixture and raspberries. Sprinkle over the last of the chocolate. Chill for 3 hours before serving.
\end {method}

\showit[1.25in]{example-image-b}{This is a picture}

\end{document}

Segunda versión

Y finalmente...

Aquí tenéis la misma receta enformato bipartito coordinado,es decir, los ingredientes para cada paso se han mostrado (coordinados con) ese paso. Un misterio apareció cuando descubrí que la receta original en realidad nousarel “café de doble concentración” que se pide en la lista de ingredientes. He intentado corregir esa omisión en las tres versiones.

\documentclass{article}
\usepackage{fancyhdr,wrapfig,xcolor,graphicx,xparse,fontspec}
\usepackage[%
    %a5paper,
    papersize={5.5in,8.5in},
    margin=0.75in,
    top=0.75in,
    bottom=0.75in,
    %twoside
    ]{geometry}

\newcounter{stepnum}

%% |=====8><-----| %%


\makeatletter

%% From Donald Arseneau. Add after the wrapping text. Whew!
\def\wrapfill{% Just glad it works.
    \par
  \ifx\parshape\WF@fudgeparshape
    \nobreak
    \ifnum\c@WF@wrappedlines>\@ne
      \advance\c@WF@wrappedlines\m@ne
      \vskip\c@WF@wrappedlines\baselineskip
      \global\c@WF@wrappedlines\z@
    \fi
    \allowbreak
    \WF@finale
  \fi
}


%% Used for the headnote and in \showit
%% If the text is small it is placed on one line;
%% otherwise it is put into a raggedright paragraph.
\long\def\testoneline#1{%
  \sbox\@tempboxa{#1}%
  \ifdim \wd\@tempboxa <0.75\linewidth
        \begingroup
            \itshape
            #1\par
        \endgroup
  \else
    \parbox{0.75\linewidth}{\raggedright\itshape#1}%
    \par
  \fi
}

\newif\if@mainmatter \@mainmattertrue

%% Borrowed from book.cls
\newcommand\frontmatter{%
    \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{roman}}
\newcommand\mainmatter{%
    \cleardoublepage
  \@mainmattertrue
  \pagenumbering{arabic}}
\makeatother

%% Vary the colors at will

\definecolor{vegcolor}{rgb}{0,0.5,0.2}
\definecolor{frzcolor}{rgb}{0,0.8,0.8}
\definecolor{dessertcolor}{rgb}{0.5,0.2,0.1}
\definecolor{makeaheadcolor}{rgb}{0.5,0.5,0.6}

%% Thanks to alephzero for the excellent start:
%% #1 [optional headnote]; #2 Title of recipe; #3 [Initial instructions]
\NewDocumentCommand{\recipe}{o m o}{%
    \setcounter{stepnum}{0}%
    \newpage
    \thispagestyle{fancy}
    \lhead{}%
    \chead{}%
    \rhead{}%
    \lfoot{}%
    \rfoot{}%
    \section{#2}%
    \IfNoValueF{#1}{\begin{center}\testoneline{#1}\end{center}}
    \IfNoValueF{#3}{\noindent\emph{#3}\par\medskip}
}
\newcommand{\serves}[2][Serves]{%
    \chead{#1 #2}}
\newcommand{\dishtype}[1]{%
    \rhead{#1}%
}
\newcommand{\dishother}[1]{%
    \lhead{#1}%
}
\newcommand{\vegetarian}{%
    {\large\color{vegcolor}\textbf{V}}%
}
\newcommand{\freeze}{%
    {\large\color{frzcolor}\textbf{F}}%
}
\newcommand{\dessert}{%
    {\large\color{dessertcolor}\textbf{D}}%
}
\newcommand{\makeahead}{%
    {\large\color{makeaheadcolor}\textbf{M}}%
}
%% Optional arguments for alternate names for these:
\newcommand{\preptime}[2][Prep time]{%
    \lfoot{#1: #2}%
}
\newcommand{\cooktime}[2][Cook time]{%
    \rfoot{#1: #2}%
}
\newcommand{\temp}[1]{%
    #1°C}
%% Optional argument is the width of the graphic, default = 1in
\newcommand{\showpic}[3][1in]{%
    \begin{center}
        \bigskip
            \includegraphics[width=#1]{#2}%
            \par
            \medskip
            \testoneline{#3}%
            \par
    \end{center}%
}

\def\ucit#1{\uppercase{#1}}
\begingroup
    \lccode`~=`\^^M
    \lowercase{%
\endgroup%% Ingredient first, then measure; empty measure and/or unit = " . "
    %% *=column break; amount<space>ingredient
    \NewDocumentCommand{\ing}{u{ } u{~}}{% %% basically the same as: \def\ing#1 #2~{% requires xparse
        \noindent
        \if.#1% Is a heading, a non-ingredient, in the ingredients block
            \emph{#2}~ % A heading
        \else % Amounts containing spaces <1 teaspoon> have to use '~' <1~teaspoon>
            \textbf{\ucit#2, }#1~ %
        \fi
    }%
}%

\NewDocumentEnvironment{step}{}{%
    \parindent0pt
    \leftskip0pt
    \begin{minipage}{\textwidth}
        \begin{wrapfigure}{r}{0pt}
            \kern-0.5em
            \vrule width 1pt\enskip
            \begin{minipage}{0.5\textwidth}
                \leftskip=1.5em
                \parindent=-1.5em
                \parskip=0.25em
                \obeylines
                    \everypar={\ing}
}{%
        \wrapfill
    \end{minipage}
    \medskip
}

\NewDocumentCommand{\method}{}{%
            \end{minipage}
        \end{wrapfigure}
        \rightskip0pt plus 2em
        \parskip0.25em
        \everypar={\llap{\stepcounter{stepnum}\hbox to 1.5em{\thestepnum.\hfill}}}
}

\setmainfont{STIX Two Text}

\pagestyle{plain}
\setlength{\intextsep}{0pt}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\recipe[This is a simple headnote that describes the product for the user. A simple but elegant dessert.]{Raspberry Chocolate Tiramisu}[Preheat the oven to Gas Mark 4, Electric \temp{180}, Fan \temp{160}.]
\serves{4}
\preptime{1 hour}
\cooktime[Chill time]{1½ hours}
\dishtype{\dessert,\vegetarian}
\dishother{\makeahead, \freeze}

\begin{step}
     100ml double strength coffee
     400g raspberries 
\method
Prepare the coffee and set aside to cool; mash the raspberries with a fork and set aside.
\end{step}

\begin{step}
     . For the crumble mixture:
     80g wholemeal flour
     80g plain flour
     80g butter (diced)
     70g demerara sugar
    \method
    Stir the two kinds of flour together in a bowl, add the butter and rub it into the flour. When the mixture looks like breadcrumbs, mix in the brown sugar. Lay the mixture on a shallow baking tray and bake for 25--30 minutes until golden brown. Leave on the side to cool.
\end{step}

\begin{step}
     200g mascarpone
     2~tablespoons sweetener
     1~teaspoon vanilla extract
     700g vanilla yogurt
     15g dark chocolate (finely grated)
     \method
         Mix together the mascarpone, sweetener, vanilla extract, and three quarters of the chocolate.

    Put half the crumble mixture in each of the glasses, sprinkling over half the coffee, and pour over half the quark mixture along with half the raspberries.

     Put the other half of the crumble mixture on top, sprinkling over the remaining half of the coffee, followed by the remaining quark mixture and raspberries. Sprinkle over the last of the chocolate. Chill for 3 hours before serving.
\end{step}

\showpic[1.25in]{example-image-b}{This is a picture}

\end{document}

Tercera versión

Una última cosa...

Como señaló muy acertadamente @Alborz, hay algunas cosas aquí que deben solucionarse. Para el problema de una lista de ingredientes que es más larga que su método correspondiente, podemos agradecer a Donald Arseneau por proporcionar la solución, \wrapfillque se puede encontrar en wrapfig.styy que se ha utilizado a continuación. Ingresar los ingredientes también es más sencillo en el siguiente código:

\documentclass{article}
\usepackage{fancyhdr,wrapfig,xcolor,graphicx,xparse,fontspec}
\usepackage[%
    %a5paper,
    papersize={5.5in,8.5in},
    margin=0.75in,
    top=0.75in,
    bottom=0.75in,
    %twoside
    ]{geometry}

\newcounter{stepnum}

%% |=====8><-----| %%


\makeatletter

%% From Donald Arseneau. Add after the wrapping text. Whew!
\def\wrapfill{% Just glad it works.
    \par
  \ifx\parshape\WF@fudgeparshape
    \nobreak
    \ifnum\c@WF@wrappedlines>\@ne
      \advance\c@WF@wrappedlines\m@ne
      \vskip\c@WF@wrappedlines\baselineskip
      \global\c@WF@wrappedlines\z@
    \fi
    \allowbreak
    \WF@finale
  \fi
}


%% Used for the headnote and in \showit
%% If the text is small it is placed on one line;
%% otherwise it is put into a raggedright paragraph.
\long\def\testoneline#1{%
  \sbox\@tempboxa{#1}%
  \ifdim \wd\@tempboxa <0.75\linewidth
        \begingroup
            \itshape
            #1\par
        \endgroup
  \else
    \parbox{0.75\linewidth}{\raggedright\itshape#1}%
    \par
  \fi
}

\newif\if@mainmatter \@mainmattertrue

%% Borrowed from book.cls
\newcommand\frontmatter{%
    \cleardoublepage
  \@mainmatterfalse
  \pagenumbering{roman}}
\newcommand\mainmatter{%
    \cleardoublepage
  \@mainmattertrue
  \pagenumbering{arabic}}
\makeatother

%% Vary the colors at will

\definecolor{vegcolor}{rgb}{0,0.5,0.2}
\colorlet{gfcolor}{brown}
\definecolor{frzcolor}{rgb}{0,0.8,0.8}
\definecolor{dessertcolor}{rgb}{0.5,0.2,0.1}
\definecolor{makeaheadcolor}{rgb}{0.5,0.5,0.6}

%% Thanks to alephzero for the excellent start:
%% #1 [optional headnote]; #2 Title of recipe; #3 [Initial instructions]
\NewDocumentCommand{\recipe}{o m o}{%
    \setcounter{stepnum}{0}%
    \newpage
    \thispagestyle{fancy}
    \lhead{}%
    \chead{}%
    \rhead{}%
    \lfoot{}%
    \rfoot{}%
    \section{#2}%
    \IfNoValueF{#1}{\begin{center}\testoneline{#1}\end{center}}
    \IfNoValueF{#3}{\noindent\emph{#3}\par\medskip}
}
\newcommand{\serves}[2][Serves]{%
    \chead{#1 #2}}
\newcommand{\dishtype}[1]{%
    \rhead{#1}%
}
\newcommand{\dishother}[1]{%
    \lhead{#1}%
}
\newcommand{\vegetarian}{%
    {\large\color{vegcolor}\textbf{V}}%
}
\newcommand{\glutenfree}{%
    {\large\color{gfcolor}\textbf{GF}}%
}
\newcommand{\freeze}{%
    {\large\color{frzcolor}\textbf{F}}%
}
\newcommand{\dessert}{%
    {\large\color{dessertcolor}\textbf{D}}%
}
\newcommand{\makeahead}{%
    {\large\color{makeaheadcolor}\textbf{M}}%
}
%% Optional arguments for alternate names for these:
\newcommand{\preptime}[2][Prep time]{%
    \lfoot{#1: #2}%
}
\newcommand{\cooktime}[2][Cook time]{%
    \rfoot{#1: #2}%
}
\newcommand{\temp}[1]{%
    #1°C}
%% Optional argument is the width of the graphic, default = 1in
\newcommand{\showpic}[3][1in]{%
    \begin{center}
        \bigskip
            \includegraphics[width=#1]{#2}%
            \par
            \medskip
            \testoneline{#3}%
            \par
    \end{center}%
}

\def\ucit#1{\uppercase{#1}}
\begingroup
    \lccode`~=`\^^M
    \lowercase{%
\endgroup%% Ingredient first, then measure; empty measure and/or unit = " . "
    %% *=column break; amount<space>ingredient
    \NewDocumentCommand{\ing}{u{ } u{ } u{~}}{% %% basically the same as: \def\ing#1 #2~{% requires xparse
        \noindent
        \if#1#2% Is a heading, a non-ingredient, in the ingredients block
            \emph{#3}~ % A heading
        \else % Amounts containing spaces <1 teaspoon> have to use '~' <1~teaspoon>
            \textbf{\ucit#3, }#1\if.#2\else\ #2\fi~ %
        \fi
    }%
}%

\NewDocumentEnvironment{step}{}{%
    \parindent0pt
    \leftskip0pt
    \begin{minipage}{\textwidth}
        \begin{wrapfigure}{r}{0pt}
            \kern-0.5em
            \vrule width 1pt\enskip
            \begin{minipage}{0.5\textwidth}
                \leftskip=1.5em
                \parindent=-1.5em
                \parskip=0.25em
                \obeylines
                    \everypar={\ing}
}{%
        \wrapfill
    \end{minipage}
    \medskip
}

\NewDocumentCommand{\method}{}{%
            \end{minipage}
        \end{wrapfigure}
        \rightskip0pt plus 2em
        \parskip0.25em
        \everypar={\llap{\stepcounter{stepnum}\hbox to 1.5em{\thestepnum.\hfill}}}
}

\setmainfont{STIX Two Text}

\pagestyle{plain}
\setlength{\intextsep}{0pt}

\begin{document}

\frontmatter
\tableofcontents

\mainmatter

\recipe[Some would say this is better than pie. It is certainly easier. And delicious. The original recipe came from Dorie Greenspan; this version also includes almond flour, suggested by King Arthur Baking.]{French Apple Cake}[Center a rack in the oven and preheat the oven to 350°F. Generously butter an 8-inch springform pan and put it on a baking sheet lined with a silicone baking mat or parchment paper.]
\serves{6-8}
\preptime{1 hour}
\cooktime{1 hour}
\dishtype{\dessert}
\dishother{\glutenfree}

\begin{step}
. . Batter, the dry:
1 cup AP (or GF) flour
½ cup almond flour
1 teaspoon baking powder
½ teaspoon cinnamon
¼ teaspoon nutmeg
¼ teaspoon salt
\method
Whisk the flour, baking powder, spices, and salt together in small bowl.
\end{step}

\begin{step}
4 large apples (if you can, choose 4 different kinds)
\method
Peel the apples, cut them in half and remove the cores. Cut the apples into 1- to 2-inch chunks.
\end{step}

\begin{step}
. . Batter, the wet:
2 large eggs
¾ cup maple or brown sugar
3 tablespoons dark rum
½ teaspoon pure vanilla extract
2--3 drops lemon extract
8 tablespoons unsalted butter, melted and cooled
\method
In a medium bowl, beat the eggs with a whisk until they’re foamy. Pour in the sugar and whisk for a minute or so to blend. Whisk in the rum, vanilla, and lemon oil. Whisk in  the flour and when it is incorporated, add the melted butter, mixing gently so that you have a smooth, rather thick batter.

Use a rubber spatula to fold-in the apples--it might look as if there isn't enough batter, but there is. Put the batter into the prepared pan, smoothing the top as much as possible. Bake for 55--65 minutes, or until a toothpick inserted  in the middle comes out clean.

Let cool 30 minutes. Before removing the side of the springform pan, run a knife around the edge of the cake to make sure no apples stuck to the pan.
\end{step}


\end{document}

Nuevo ejemplo

Me siento tentado, un día de estos, a iniciar un blog como “TeX in the Kitchen” o “TeX en Cuisine”; podría resultar interesante...

Respuesta2

El primer paso que daría sería definir algunas macros para capturar elsemánticade tu receta, en lugar del LateXsintaxis.

Una vez hecho esto, puede comenzar a modificar el formato de cada elemento semántico (aplicar color, etc.) independientemente de editar elcontenidode las recetas.

Esto no está completo (y en cualquier caso, ¡no sé exactamente cómo quieres que se vea el libro!), pero funciona y da la idea básica.

\documentclass{article}
\usepackage{fancyhdr}
\usepackage{multicol}

% Your "recipes.sty" package starts here:
\newcommand{\recipe}{%
    \newpage\lhead{}\chead{}\rhead{}\lfoot{}\rfoot{}\section}
\newcommand{\serves}[1]{%
    \chead{Serves #1}}
\newcommand{\vegetarian}{%
    \rhead{V}}
\newcommand{\preptime}[1]{%
    \lfoot{Prep time: #1}}
\newcommand{\cooktime}[1]{%
    \rfoot{Cook time: #1}}
\newcommand{\ingredients}[1][\Large\emph{Ingredients}]{%
    \emph{#1}\\}
\newcommand{\instructions}[1][\Large\emph{Instructions}]{%
    \emph{#1}\\}
\newcommand{\temp}[1]{%
    $#1^\circ$C}

\pagestyle{fancy}
% End of "recipes.sty"

\begin{document}
\recipe{Raspberry Chocolate Tiramisu}
\serves{4}
\vegetarian

\begin{multicols}{2}
\ingredients
\begin{itemize}
    \item 100ml Double Strength Coffee
    \item 400g Raspberries (blitzed)
    \item 200g Mascarpone
    \item 2 tbsp Sweetener
    \item 1 tsp Vanilla Extract
    \item 700g Vanilla Yogurt
    \item 15g Dark Chocolate (finely grated)
\end{itemize}
\columnbreak
\ingredients[For the Crumble Mixture:]
\begin{itemize}
    \item 80g Wholemeal Flour
    \item 80g Plain Flour
    \item 80g Butter (diced)
    \item 70g Demerara Sugar
\end{itemize}
\end{multicols}

\instructions
Preheat the over to Gas Mark 4, Electric \temp{180}, Fan \temp{160}.
\begin{enumerate}
    \item Stir the two kinds of flour together in a bowl, add the butter and rub it into the flour. When the mixture looks like breadcrumbs, mix in the brown sugar. Lay the mixture on a shallow baking tray and bake for 25--30 minutes until golden brown. Leave on the side to cool.
    \item Mix together the mascarpone, sweetener, vanilla extract, and three quarters of the chocolate. Put half the crumble mixture in each of the glasses and pour over half the quark mixture along with half the raspberries.
    \item Put the other half of the crumble mixture on top, followed by the remaining quark mixture and raspberries. Sprinkle over the last of the chocolate. Chill for 3 hours before serving.
\end{enumerate}

\end{document}

Tenga en cuenta la forma en que las macros \instructionsy \ingredientstienen argumentos opcionales. Sin argumentos, crean automáticamente el texto predeterminado "Instrucciones" e "Ingredientes". Con un argumento entre corchetes, puede sobrescribirlo, como en "Para la mezcla crumble:", etc.

información relacionada