Usando a tecla ENTER como delimitador em uma lista detalhada

Usando a tecla ENTER como delimitador em uma lista detalhada

Fundo: Minha esposa está escrevendo um livro de receitas de família. Principalmente como um exercício de aprendizado para mim, estou montando o código LaTex para o projeto. Gostaria de tornar a entrada de dados da receita o mais simples possível, com (quase) todo o código de processamento oculto no back-end. Minha primeira passagem para inserir os ingredientes da receita é mostrada abaixo. Eu uso um comando \IngredientList que recebe um número variável de argumentos. Como você pode ver, cada “item” de ingrediente é delimitado pelo caractere [;]. Em um mundo ideal, minha esposa poderia simplesmente digitar os ingredientes e usar a tecla ENTER como delimitador entre os itens dos ingredientes. Eu tentei \cr e \newline como o delimitador\SplitList sem sorte.

Minha pergunta: Existe uma maneira de definir a tecla ENTER como delimitador entre uma lista de comprimento variável de itens de ingredientes da receita? (Outras soluções também são bem-vindas).

\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}

Responder1

O tratamento da lista realmente não parece estar ajudando, o seguinte é mais ou menos o mesmo resultado. Se você precisar de um layout específico, as configurações do parágrafo poderão ser ajustadas em um ambiente local.

insira a descrição da imagem aqui

\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}

Responder2

Passei muito tempo formatando receitas. Eu prefiro a marcação mais leve possível. Estou ciente dos perigos \obeylines(e \everyparnesse caso), embora esses perigos sejam facilmente evitados - apenas não faça nada com o ambiente que os utiliza. Acho que esse uso \obeylinesdeixa a entrada mais limpa. Ingredientes longos devem sempre ser tratados com um \hangindentse forem embrulhar. Eu também costumava ~fazer quebras de linha mais sensatas.

\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}

Atualizar

O manuseio de frações me incomodou - adicionei uma definição que permite manter as frações horizontais como estão e simplesmente adicionar o comando para transformá-las em frações cortadas. A saída é idêntica.

exemplo de ingredientes

Responder3

Vejo que já existem algumas soluções, mas em vez de usar linhas em branco para demarcar os ingredientes, acho que você deveria usar algum caractere, caso contrário, uma linha longa de ingredientes ou uma quebra de linha incorreta causará estragos. Abaixo usei -no início da linha. Além disso, usandoLaTeX3expressões regulares, substituo automaticamente uma fração a/bpor \sfrac{a}{b}para que a 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
}

produz

insira a descrição da imagem aqui

Claro, você poderia combinar minhas "frações automáticas" com uma das outras soluções para remover o -separador

Aqui está o 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}

informação relacionada