
Фон: Моя жена пишет семейную кулинарную книгу. В основном в качестве учебного упражнения для себя я собираю код LaTex для проекта. Я хотел бы сделать ввод данных рецепта максимально простым, с (почти) всем кодом обработки, скрытым в бэкэнде. Мой первый проход для ввода ингредиентов рецепта показан ниже. Я использую команду \IngredientList, которая принимает переменное количество аргументов. Как вы видите, каждый ингредиент «элемент» разделен символом [;]. В идеальном мире моя жена могла бы просто ввести ингредиенты и использовать клавишу ENTER в качестве разделителя между ингредиентами. Я пробовал \cr и \newline в качестве разделителя \SplitList, но безуспешно.
Мой вопрос: Есть ли способ установить клавишу ENTER в качестве разделителя между списками ингредиентов рецепта переменной длины? (Другие решения также приветствуются).
\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}
решение1
Обработка списков, похоже, не помогает, ниже приведен более или менее тот же вывод. Если вам нужна определенная раскладка, настройки абзаца можно настроить в локальной среде.
\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}
решение2
Я потратил много времени на форматирование рецептов. Я предпочитаю максимально легкую разметку. Я знаю об опасностях \obeylines
(и, \everypar
если на то пошло), хотя этих опасностей легко избежать — просто не делайте ничего со средой, в которой они используются. Я думаю, что такое использование \obeylines
делает ввод более чистым. Длинные ингредиенты всегда следует обрабатывать с помощью , \hangindent
если они будут переноситься. Я также использовал ~
, чтобы сделать более разумные переносы строк.
\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}
Обновлять
Обработка дробей меня беспокоила -- я добавил определение, которое позволяет сохранять горизонтальные дроби как есть и просто добавлять команду, чтобы сделать их косыми дробями. Вывод идентичен.
решение3
Я вижу, что уже есть несколько решений, но вместо того, чтобы использовать пустые строки для разграничения ингредиентов, я думаю, что вам следует использовать какой-то символ, потому что в противном случае длинная строка ингредиентов или неправильный перенос строки вызовут хаос. Ниже я использовал -
в начале строки. Кроме того, используяLaTeX3регулярные выражения, я автоматически заменяю дробь a/b
на \sfrac{a}{b}
так, чтобы список ингредиентов
\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
}
производит
Конечно, вы можете объединить мои «автоматические дроби» с одним из других решений, чтобы удалить -
разделитель.
Вот полный код:
\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}