
Fondo: Mi esposa está escribiendo un libro de cocina familiar. Principalmente como ejercicio de aprendizaje para mí, estoy armando código LaTex para el proyecto. Me gustaría hacer que la entrada de datos de la receta sea lo más simple posible, con (casi) todo el código de procesamiento oculto en la parte posterior. Mi primer paso para ingresar los ingredientes de la receta se muestra a continuación. Utilizo un comando \IngredientList que toma un número variable de argumentos. Como puede ver, cada ingrediente "elemento" está delimitado por el carácter [;]. En un mundo ideal, mi esposa podría simplemente escribir los ingredientes y usar la tecla ENTER como delimitador entre los ingredientes. Probé \cr y \newline como delimitador\SplitList sin suerte.
Mi pregunta: ¿Hay alguna manera de configurar la tecla ENTRAR como delimitador entre una lista de longitud variable de elementos de ingredientes de recetas? (También se aceptan otras soluciones).
\documentclass[11pt]{book}
\usepackage{enumitem, xfrac, xparse}
\NewDocumentCommand \IngredientList { >{\SplitList{;}} m }
{
\begin{description} [noitemsep,leftmargin=!,labelindent=8pt,itemindent=-15pt]
\ProcessList{#1}{\ProcessIngredients}
\end{description}
}
\newcommand\ProcessIngredients[1]{\item #1}
\begin{document}
\IngredientList{
4 ounces unsalted butter, room temperature ;
2 large eggs, room temperature ;
1 cup granulated sugar ;
1 tsp. vanilla extract ;
1 Tbsp. instant espresso powder ;
\sfrac{1}{2} cup cocoa powder, sifted if necessary ;
1\sfrac{1}{2} cups flour ;
\sfrac{1}{2} cup almond flour ;
1 tsp. baking soda ;
\sfrac{1}{2} tsp. salt ;
1 cup toasted hazelnuts, roughly chopped (or pistachios or almonds) ;
3 ounces bittersweet chocolate, coarsely chopped
}
\end{document}
Respuesta1
El manejo de la lista realmente no parece ayudar, el siguiente es más o menos el mismo resultado. Si necesita un diseño particular, la configuración del párrafo se puede ajustar en un entorno local.
\documentclass[11pt]{book}
\usepackage{xfrac}
\newcommand\f[2]{\sfrac{#1}{#2}}
\begin{document}
4 ounces unsalted butter, room temperature
2 large eggs, room temperature
1 cup granulated sugar
1 tsp. vanilla extract
1 Tbsp. instant espresso powder
\f12 cup cocoa powder, sifted if necessary
1\f12 cups flour
\f12 cup almond flour
1 tsp. baking soda
\f12 tsp. salt
1 cup toasted hazelnuts, roughly chopped (or pistachios or almonds)
3 ounces bittersweet chocolate, coarsely chopped
\end{document}
Respuesta2
He dedicado mucho tiempo al formato de recetas. Prefiero el marcado más ligero posible. Soy consciente de los peligros \obeylines
(y \everypar
de hecho), aunque estos peligros se evitan fácilmente, simplemente no hagas nada con el entorno que los utiliza. Creo que este uso de \obeylines
hace que la entrada sea más limpia. Los ingredientes largos siempre se deben tratar con un \hangindent
si se van a envolver. También he utilizado ~
para crear saltos de línea más sensatos.
\documentclass{book}
%% Narrow measure to show wrapped lines
\usepackage[textwidth=2.5in]{geometry}
\usepackage{xfrac}
\newenvironment{ingredients}{%
\begingroup
\frenchspacing %% no extra space after periods
\parindent0pt
\obeylines
\everypar={\hangindent1.25em} %% long lines should hang
\raggedright %% no need for justified text for ingredients
}{%
\endgroup
}
%% Transfrom horizontal fractions to slashed with
%% minimal markup. Not perfect but handles 99% of instances.
\def\fr#1/#2 {\sfrac{#1}{#2} }
\begin{document}
\begin{ingredients}
4 ounces unsalted butter, room~temperature
2 large eggs, room temperature
1 cup granulated sugar
1 tsp. vanilla extract
1 Tbsp. instant espresso powder
\fr1/2 cup cocoa powder, sifted if necessary
1\fr1/2 cups flour
\fr1/2 cup almond flour
1 tsp. baking soda
\fr1/2 tsp. salt
1 cup toasted hazelnuts, roughly chopped (or pistachios or almonds)
3 ounces bittersweet chocolate, coarsely~chopped %% note ~
\end{ingredients}
\end{document}
Actualizar
El manejo de fracciones me molestó: agregué una definición que permite mantener las fracciones horizontales como están y simplemente agregar el comando para convertirlas en fracciones cortadas. La salida es idéntica.
Respuesta3
Veo que ya hay algunas soluciones, pero en lugar de usar líneas en blanco para delimitar los ingredientes, creo que deberías usar algún carácter porque, de lo contrario, una línea de ingrediente larga o un salto de línea incorrecto causará estragos. A continuación he usado-
al comienzo de la línea. Además, utilizandoLátex3expresiones regulares, reemplazo automáticamente una fracción a/b
para \sfrac{a}{b}
que la lista de ingredientes
\IngredientList{
- 4 ounces unsalted butter, room temperature
- 2 large eggs, room temperature
- 1 cup granulated sugar
- 1 tsp. vanilla extract
- 1 Tbsp. instant espresso powder
- 1/2 cup cocoa powder, sifted if necessary
- 1 1/2 cups flour
- 1/2 cup almond flour
- 1 tsp. baking soda
- 1/2 tsp. salt
- 1 cup toasted hazelnuts, roughly chopped (or pistachios or almonds)
- 3 ounces bittersweet chocolate, coarsely chopped
}
produce
Por supuesto, puedes combinar mis "fracciones automáticas" con alguna de las otras soluciones para eliminar el -
separador.
Aquí está el código completo:
\documentclass[11pt]{book}
\usepackage{enumitem, xfrac, xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \regex_split:nnN { nVN }
\tl_new:N \l_ingredient_tl
\seq_new:N \l_ingredients_seq
\NewDocumentCommand \IngredientList { m }
{
% first replace fractions
\tl_set:Nn \l_ingredient_tl {#1}
\regex_replace_all:nnN { \b(\d+)/(\d+) } {\c{sfrac}\cB{\1\cE}\cB{\2\cE}} \l_ingredient_tl
% clear the ingredients sequence and split #1 on integers and/or \sfrac
\seq_clear:N \l_ingredients_seq
\regex_split:nVN { -\s } \l_ingredient_tl \l_ingredients_seq
% remove the first (empty) item from the sequence
\seq_pop_left:NN \l_ingredients_seq \l_ingredient_tl
% now run through the list and print the ingredients inside a description environment
\begin{description} [noitemsep,leftmargin=!,labelindent=8pt,itemindent=-15pt]
\item \seq_use:Nn \l_ingredients_seq {\item }
\end{description}
}
\ExplSyntaxOff
\begin{document}
\IngredientList{
- 4 ounces unsalted butter, room temperature
- 2 large eggs, room temperature
- 1 cup granulated sugar
- 1 tsp. vanilla extract
- 1 Tbsp. instant espresso powder
- 1/2 cup cocoa powder, sifted if necessary
- 1 1/2 cups flour
- 1/2 cup almond flour
- 1 tsp. baking soda
- 1/2 tsp. salt
- 1 cup toasted hazelnuts, roughly chopped (or pistachios or almonds)
- 3 ounces bittersweet chocolate, coarsely chopped
}
\end{document}