mirror of
https://github.com/hendricius/the-sourdough-framework
synced 2025-11-09 12:41:12 -06:00
Merge remote-tracking branch 'hendiricus/main' into 225-ebook-situation
This commit is contained in:
2
.github/workflows/test-book-website.yml
vendored
2
.github/workflows/test-book-website.yml
vendored
@@ -40,7 +40,7 @@ jobs:
|
||||
options: -v ${{ github.workspace }}:/app
|
||||
run: |
|
||||
cd /app/book
|
||||
make -j -O build_serif_pdf build_ebook website
|
||||
make -j -O serif ebook website
|
||||
- name: Upload book Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
|
||||
@@ -53,7 +53,7 @@ make
|
||||
```
|
||||
|
||||
If you want to 🍞 bake all the versions including ebook variants (.pdf, .epub
|
||||
in colour and size optimized Black&White), run:
|
||||
in colour and size optimized Black&White, as well as website), run:
|
||||
|
||||
```console
|
||||
cd book/
|
||||
@@ -80,7 +80,7 @@ There's an additional enhanced accessibility version using a sans-serif font:
|
||||
* [Download compiled sans-serif .pdf version](https://www.the-bread-code.io/book-sans-serif.pdf)
|
||||
|
||||
An additional black and white ebook is provided with a greatly reduced file
|
||||
size. This shrinks the book from more than 50MB down to ~5MB:
|
||||
size. This shrinks the book from more than 20MB down to ~5MB:
|
||||
|
||||
* [Download compiled B&W .epub version](https://www.the-bread-code.io/bw-book.epub)
|
||||
|
||||
|
||||
4
book/abbreviations.tex
Normal file
4
book/abbreviations.tex
Normal file
@@ -0,0 +1,4 @@
|
||||
% Common abbreviations
|
||||
\newcommand{\ie}{\emph{i.e.}\@ifnextchar.{\!\@gobble}{}}
|
||||
\newcommand{\eg}{\emph{e.g.}\@ifnextchar.{\!\@gobble}{}}
|
||||
\newcommand{\etc}{etc\@ifnextchar.{}{.\@}}
|
||||
@@ -20,10 +20,10 @@
|
||||
% Same tricks not to get double lines and also we do _not_ want arrows
|
||||
\path [draw, thick] (ph_value) -- node{} ++(2, 0);
|
||||
\path [draw, thick] (smell) -| node{} ++(2, 4);
|
||||
\path [line] (dough_ready) -- node{yes} (divide_preshape);
|
||||
\path [line] (dough_ready) |- node[right=3pt]{no} (dough_flattened);
|
||||
\path [line] (dough_flattened) |- node[right=3pt]{yes} (stretch_fold);
|
||||
\path [line] (dough_flattened) -- node{no} (wait_60_minutes);
|
||||
\path [line] (dough_ready) -- node{Yes} (divide_preshape);
|
||||
\path [line] (dough_ready) |- node[right=3pt]{No} (dough_flattened);
|
||||
\path [line] (dough_flattened) |- node[right=3pt]{Yes} (stretch_fold);
|
||||
\path [line] (dough_flattened) -- node{No} (wait_60_minutes);
|
||||
\path [line] (stretch_fold) -- (wait_60_minutes);
|
||||
\path [line] (wait_60_minutes) -- (check_dough);
|
||||
\end{tikzpicture}
|
||||
|
||||
@@ -8,18 +8,18 @@
|
||||
\path [line] (knead) -- (wait2);
|
||||
\node [decision, below of=wait2, node distance=4cm] (windowpane_test) {Window-pane?};
|
||||
\path [line] (wait2) -- (windowpane_test);
|
||||
\path [line] (windowpane_test.east) -- node{no} ++(1, 0) -- node{} ++(0, 5.7) -| (knead.north);
|
||||
\path [line] (windowpane_test.east) -- node{No} ++(1, 0) -- node{} ++(0, 5.7) -| (knead.north);
|
||||
\node [decision] at (windowpane_test -| knead) (more_water) {Bassinage for more water?};
|
||||
\path [line] (windowpane_test) -- node{yes} (more_water);
|
||||
\path [line] (windowpane_test) -- node{Yes} (more_water);
|
||||
\node [block] at (wait1 |- more_water) (add_water) {Add water};
|
||||
\path [line] (more_water) -- node{yes} (add_water);
|
||||
\path [line] (more_water) -- node{Yes} (add_water);
|
||||
\path [line] (add_water.north east) -- (knead.south west);
|
||||
\node [decision, below of=more_water, node distance=4.5cm] (dough_sample) {Aliquot sample?};
|
||||
\path [line] (more_water) -- node{no} (dough_sample);
|
||||
\path [line] (more_water) -- node{No} (dough_sample);
|
||||
\node [block] at (dough_sample -| wait2) (dough_ball) {Make round dough ball};
|
||||
\path [line] (dough_sample) -- node{no} (dough_ball);
|
||||
\path [line] (dough_sample) -- node{No} (dough_ball);
|
||||
\node [block, below of=dough_sample] (extract_sample) {Extract sample};
|
||||
\path [line] (dough_sample) -- node{yes} (extract_sample);
|
||||
\path [line] (dough_sample) -- node{Yes} (extract_sample);
|
||||
\path [line] (extract_sample.north east) -- (dough_ball.south west);
|
||||
\node [success, below of=dough_ball] (begin_bulk) {Begin bulk fermentation};
|
||||
\path [line] (dough_ball) -- (begin_bulk);
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
\path [line] (init) -- (feed_new_ratio);
|
||||
\path [line] (feed_new_ratio) -- node{Wait \qty{24}{\hour}} (ready_signs);
|
||||
\path [line] (feed_again) -- node[anchor=east] {} ++(2.2,0) |- (feed_new_ratio);
|
||||
\path [line] (ready_signs) -- node{no} (feed_again);
|
||||
\path [line] (ready_signs) -- node[above=2pt]{~yes} (last_feed);
|
||||
\path [line] (ready_signs) -- node{No} (feed_again);
|
||||
\path [line] (ready_signs) -- node[above=2pt]{~Yes} (last_feed);
|
||||
\path [line] (last_feed) -- node{after \qtyrange{6}{12}{\hour}} (bread_dough);
|
||||
\draw [thick, ->] ($ (feed_again.north) +(0.7cm, 1cm)$) arc (-45:220:1cm);
|
||||
\node [anchor=north, text width=5em] at ($(feed_again.north west)+(1.8cm, 2.3cm)$) {Repeat 3~times};
|
||||
|
||||
\node [above of=feed_again, text width=5em, align=center, node distance=3cm] (repeat_text) {Repeat 3~times};
|
||||
\draw [line] ($(repeat_text) +(0, 1 cm)$) arc (90:420:1cm);
|
||||
\end{tikzpicture}
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
\node [success, right of=dent_visible_decision, node distance=4cm] (bake) {Score and bake};
|
||||
\node [block] at (retard_bake_decision |- poke) (wait_retard) {Wait\\ 15~minutes};
|
||||
\node [block] at (wait_retard |- bake) (retard) {Proof in fridge at \qty{4}{\degreeCelsius} (\qty{40}{\degF})};
|
||||
\path [line] (init) -- node{yes} (poke);
|
||||
\path [line] (init) -- node{no} (retard_bake_decision);
|
||||
\path [line] (init) -- node{Yes} (poke);
|
||||
\path [line] (init) -- node{No} (retard_bake_decision);
|
||||
\path [line] (poke) -- (dent_visible_decision);
|
||||
\path [line] (dent_visible_decision) -- node{yes} (bake);
|
||||
\path [line] (dent_visible_decision.west) -- node{no} ++(-1.4, 0) -- node{} (wait_poke.south);
|
||||
\path [line] (dent_visible_decision) -- node{Yes} (bake);
|
||||
\path [line] (dent_visible_decision.west) -- node{No} ++(-1.4, 0) -- node{} (wait_poke.south);
|
||||
\path [line] (wait_poke) -- (poke);
|
||||
\path [line] (retard_bake_decision) -- node{yes} (wait_retard);
|
||||
\path [line] (retard_bake_decision.east) -- node{no} ++(1, 0) |- node{} (retard.east);
|
||||
\path [line] (retard_bake_decision) -- node{Yes} (wait_retard);
|
||||
\path [line] (retard_bake_decision.east) -- node{No} ++(1, 0) |- node{} (retard.east);
|
||||
\path [line] (wait_retard) -- (retard);
|
||||
\path [line] (retard) -- (bake);
|
||||
\end{tikzpicture}
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
\node [block, right of=flour] (banneton) {Place upside down in banneton};
|
||||
\node [success, right of=banneton] (proof) {Begin proofing};
|
||||
\path [line] (init) -- (overfermented_decision);
|
||||
\path [line] (overfermented_decision) -- node{yes} (overfermented);
|
||||
\path [line] (overfermented_decision) -- node{no} (shaping_technique);
|
||||
\path [line] (overfermented_decision) -- node{Yes} (overfermented);
|
||||
\path [line] (overfermented_decision) -- node{No} (shaping_technique);
|
||||
\path [line] (shaping_technique) -- (flour);
|
||||
\path [line] (flour) -- (banneton);
|
||||
\path [line] (banneton) -- (proof);
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
\path [line] (init) -- (all_starter_used);
|
||||
\node [block, right of=init, node distance=3cm] (use_dough) {Take \qty{10}{\gram} of your bread dough};
|
||||
\node [block, right of=all_starter_used, node distance=3cm] (use_starter) {Take all but not more than \qty{10}{\gram} of your starter};
|
||||
\path [line] (all_starter_used) -- node{yes} (use_dough);
|
||||
\path [line] (all_starter_used) -- node{no} (use_starter);
|
||||
\path [line] (all_starter_used) -- node{Yes} (use_dough);
|
||||
\path [line] (all_starter_used) -- node{No} (use_starter);
|
||||
\node [block, right of=use_dough, node distance=3cm] (feed_starter) {Feed using 1:5:5 ratio};
|
||||
\path [line] (use_dough) -- (feed_starter);
|
||||
\path [line] (use_starter) -- (feed_starter);
|
||||
@@ -13,20 +13,20 @@
|
||||
\path [line] (feed_starter) -- (bake_next_day_check);
|
||||
\node [success, right of=bake_next_day_check, node distance=3.5cm]
|
||||
(make_bread_dough) {Make bread dough again after \qtyrange{8}{12}{\hour}};
|
||||
\path [line] (bake_next_day_check) -- node{yes} (make_bread_dough);
|
||||
\path [line] (bake_next_day_check) -- node{Yes} (make_bread_dough);
|
||||
\node [decision, right of=use_starter, node distance=3cm] (bake_next_week_check) {Baking in next 2 weeks?};
|
||||
\node [block, right of=bake_next_week_check, node distance=3.5cm] (store_fridge) {Store starter in fridge at \qty{4}{\degreeCelsius} (\qty{40}{\degF})};
|
||||
\path [line] (bake_next_week_check) -- node{yes} (store_fridge);
|
||||
\path [line] (bake_next_week_check) -- node{Yes} (store_fridge);
|
||||
\node [success, right of=store_fridge, node distance=3cm] (feed_after_fridge) {Feed again using 1:5:5 ratio \qtyrange{8}{12}{\hour} before making dough};
|
||||
\path [line] (store_fridge) -- (feed_after_fridge);
|
||||
\path [line] (bake_next_day_check) -- node{no} (bake_next_week_check);
|
||||
\path [line] (bake_next_day_check) -- node{No} (bake_next_week_check);
|
||||
\node [decision, below of=use_starter, node distance=3cm] (freezer_check) {Have a freezer?};
|
||||
\path [line] (bake_next_week_check) -- (store_fridge);
|
||||
\path [line] (bake_next_week_check) -- node{no} (freezer_check);
|
||||
\path [line] (bake_next_week_check) -- node{No} (freezer_check);
|
||||
\node [block, right of=freezer_check, node distance=3cm] (dry_starter) {Dry your starter};
|
||||
\node [block, below of=dry_starter, node distance=3cm] (freeze_starter) {Freeze your starter};
|
||||
\path [line] (freezer_check) -- node{no} (dry_starter);
|
||||
\path [line] (freezer_check) -- node{yes} (freeze_starter);
|
||||
\path [line] (freezer_check) -- node{No} (dry_starter);
|
||||
\path [line] (freezer_check) -- node{Yes} (freeze_starter);
|
||||
\node [success, right of=dry_starter, node distance=3.5cm] (reactivate_freezer) {Reactivate starter for 3 days with daily 1:5:5 feedings};
|
||||
\path [line] (dry_starter) -- (reactivate_freezer);
|
||||
\path [line] (freeze_starter) -- (reactivate_freezer);
|
||||
|
||||
@@ -1,19 +1,22 @@
|
||||
\begin{tikzpicture}[node distance = 3.5cm, auto]
|
||||
\node [start] (init) {Mix \qty{50}{\gram} flour + \qty{50}{\gram} water, stir};
|
||||
\node [block, right of=init] (wait2) {Wait\\ \qty{24}{\hour}};
|
||||
\path [line] (init) -- (wait2);
|
||||
\node [block, below of=wait2, node distance=3.5cm] (feed) {\qty{10}{\gram} of previous day + \qty{50}{\gram} water + \qty{50}{\gram} flour, stir};
|
||||
\path [line] (wait2) -- (feed);
|
||||
\node [block, below of=feed] (discard) {Discard the rest};
|
||||
\path [line] (feed) -- (discard);
|
||||
\node [decision, right of=feed, node distance=3.5cm] (decide) {Is good?};
|
||||
\node [decision, above of=decide, node distance=3.5cm] (timeout) {Less than 10 feeds?};
|
||||
\node [fail, right of=timeout, node distance=3.5cm] (discard2) {Batch failed};
|
||||
\path [line] (timeout) -- node{no} (discard2);
|
||||
\path [line] (timeout) -- node{yes} (wait2);
|
||||
\path [line] (feed) -- (decide);
|
||||
\node [success, right of=decide, node distance=3.5cm] (use) {Ready to use};
|
||||
\path [line] (decide) -- node{no} (timeout);
|
||||
\path [line] (wait2) -- (feed);
|
||||
\path [line] (decide) -- node{yes} (use);
|
||||
\node [start] (start_n) {Mix \qty{50}{\gram} flour + \qty{50}{\gram} water, stir};
|
||||
\node [block, right of=start_n, node distance = 3.5cm] (wait_n) {Wait\\ \qty{24}{\hour}};
|
||||
\node [decision, right of=wait_n, node distance = 3.5cm] (readycheck_n) {Ready?};
|
||||
\node [block, below of=wait_n, node distance = 3.2cm] (feed_n) {Feed the mixture };
|
||||
\node [decision, right of=feed_n, node distance = 3.5cm] (limitcheck_n) {>10 feeds?};
|
||||
\node [fail, right of=limitcheck_n, node distance = 3.5cm] (abort_n) {Discard all. Start over};
|
||||
\node [success, right of=readycheck_n, node distance = 3.5cm] (final_n) {Ready to use};
|
||||
|
||||
\draw [line] (start_n) -- (wait_n);
|
||||
\draw [line] (wait_n) -- (readycheck_n);
|
||||
\draw [line] (feed_n) -- (wait_n);
|
||||
\draw [line] (readycheck_n) -- node {No} (limitcheck_n);
|
||||
\draw [line] (limitcheck_n) -- node (feedok_n) {No} (feed_n) ;
|
||||
\draw [line] (limitcheck_n) -- node {Yes} (abort_n);
|
||||
\draw [line] (readycheck_n) -- node {Yes} (final_n);
|
||||
|
||||
\node [below of=feedok_n, node distance=2cm, align=left] (details2) [shape=rectangle, draw, fill=maingray]{%
|
||||
\textbf{Ready}: Mixture has \emph{grown}, has \emph{bubbles}, and \emph{smells} vinegary/yoghurty. \\
|
||||
\textbf{Feed the mixture}: Discard all but \qty{10}{\gram}, mix in \qty{50}{\gram} flour and \qty{50}{\gram} water.
|
||||
};
|
||||
\end{tikzpicture}
|
||||
|
||||
@@ -23,16 +23,16 @@
|
||||
{Prepare dough};
|
||||
|
||||
\path [line] (init) -- (decision_start);
|
||||
\path [line] (decision_start) -- node{no} (feed_no_branch);
|
||||
\path [line] (decision_start) -- node[below=2pt]{yes} (feed_yes_branch.north west);
|
||||
\path [line] (decision_start) -- node{No} (feed_no_branch);
|
||||
\path [line] (decision_start) -- node[below=2pt]{Yes} (feed_yes_branch.north west);
|
||||
\path [line] (feed_yes_branch) -- (low_ratio);
|
||||
\path [line] (feed_no_branch) -- (high_ratio);
|
||||
\path [line] (high_ratio) -- node[anchor=east, above=2pt] {} ++(2.2,0) |-(size_check);
|
||||
\path [line] (low_ratio) -- (size_check);
|
||||
\path [line] (size_check) -- node{no} (feed_yes_branch.south east);
|
||||
\path [line] (size_check) -- node{yes} (smell_check);
|
||||
\path [line] (smell_check) -- node{no} (feed_yes_branch.south west);
|
||||
\path [line] (smell_check) -- node{yes} (make_dough);
|
||||
\path [line] (size_check) -- node{No} (feed_yes_branch.south east);
|
||||
\path [line] (size_check) -- node{Yes} (smell_check);
|
||||
\path [line] (smell_check) -- node{No} (feed_yes_branch.south west);
|
||||
\path [line] (smell_check) -- node{Yes} (make_dough);
|
||||
|
||||
% braces
|
||||
\draw[BC] (size_check.south) --
|
||||
|
||||
@@ -11,14 +11,15 @@
|
||||
\path [line] (init) -- (feed_new_ratio);
|
||||
\path [line] (feed_again) -- (feed_new_ratio);
|
||||
\path [line] (next_day) -- (ready_signs);
|
||||
\path [line] (ready_signs) -- node{no} (feed_again |- last_feed) |- (feed_again.south);
|
||||
\path [line] (ready_signs) -- node{yes} (last_feed);
|
||||
\path [line] (ready_signs) -- node{No} (feed_again |- last_feed) -| (feed_again.south);
|
||||
\path [line] (ready_signs) -- node{Yes} (last_feed);
|
||||
\path [line] (last_feed) -- node{after \qtyrange{6}{12}{\hour}} (bread_dough);
|
||||
\path [line] (feed_new_ratio) -- (too_dry);
|
||||
\path [line] (add_water.north) -- node{} ++(0, 1.3) -| (too_dry.north);
|
||||
\path [line] (too_dry) -- node{no} (next_day);
|
||||
\path [line] (too_dry) -- node{yes} (add_water);
|
||||
\path [line] (ready_signs) -- node{yes} (last_feed);
|
||||
\draw [thick, <-] ($ (feed_again.east) +(2.1cm, 0.7cm)$) arc (-45:220:1cm);
|
||||
\node [anchor=north, text width=5em] at ($(feed_again.east)+(2cm, 2cm)$) {Repeat 3~times};
|
||||
\path [line] (too_dry) -- node{No} (next_day);
|
||||
\path [line] (too_dry) -- node{Yes} (add_water);
|
||||
\path [line] (ready_signs) -- node{Yes} (last_feed);
|
||||
|
||||
\node [text width=5em, align=center] (repeat_text) at ($(feed_new_ratio)!0.5!(next_day)$) {Repeat 3~times};
|
||||
\draw [line] ($(repeat_text) +(0, 1 cm)$) arc (90:-210:1cm);
|
||||
\end{tikzpicture}
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
\path [line] (mix_ingredients) -- (dough_strength);
|
||||
\path [line] (dough_strength) -- (bulk);
|
||||
\path [line] (bulk) -- (divide_test);
|
||||
\path [line] (divide_test) -- node{yes} (shape);
|
||||
\path [line] (divide_test) -- node{no} (divide);
|
||||
\path [line] (divide_test) -- node{Yes} (shape);
|
||||
\path [line] (divide_test) -- node{No} (divide);
|
||||
\path [line] (divide) -- (preshape);
|
||||
\path [line] (preshape) -- (shape);
|
||||
\path [line] (shape) -- (proof);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
\tikzstyle{every picture}+=[font=\footnotesize\sffamily]
|
||||
\usetikzlibrary{calc, shapes, arrows, decorations.pathreplacing, calligraphy,
|
||||
\usetikzlibrary{calc, shapes, arrows.meta, decorations.pathreplacing, calligraphy,
|
||||
positioning}
|
||||
\tikzstyle{decision} = [diamond, draw=codeblack, fill=codeblack, text=white,
|
||||
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt,
|
||||
@@ -19,7 +19,8 @@
|
||||
\tikzstyle{fail} = [rectangle, draw=codeblack, fill=redpic, text=black,
|
||||
text width=5em, text centered, rounded corners, minimum height=4em,
|
||||
line width=0.4mm]
|
||||
\tikzstyle{line} = [draw, -latex', thick, ->,>=to]
|
||||
% The arrowed connector line between nodes
|
||||
\tikzstyle{line} = [draw, thick, ->, >={Latex}]
|
||||
|
||||
\tikzstyle{BC} = [decorate, % Brace Calligraphic
|
||||
decoration={calligraphic brace, amplitude=3mm, raise=1mm},
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
\documentclass[tikz]{standalone}
|
||||
\usepackage{tikz}
|
||||
\usepackage{pgfplots}
|
||||
\usepackage{chemfig}
|
||||
\usepackage[mode=match, reset-text-family=false]{siunitx}
|
||||
\DeclareSIUnit\degF{\text{°}F}
|
||||
\input{flowcharts_tikz.tex}
|
||||
\input{../colors.tex}
|
||||
\input{../abbreviations.tex}
|
||||
|
||||
388
book/makefile
388
book/makefile
@@ -1,7 +1,7 @@
|
||||
# Macros for commands
|
||||
# Macros for commands {{{
|
||||
LATEX := latexmk -cd -pdflua -lualatex="lualatex -interaction=nonstopmode" -synctex=1 -use-make
|
||||
EBOOK := tex4ebook --lua -d epub -f epub -c tex4ebook.cfg -B epub_build
|
||||
WEBSITE := make4ht --lua -c website.cfg -a debug -uf html5+tidy+common_domfilters -B website_build
|
||||
WEBSITE := make4ht --lua -c website.cfg -uf html5+tidy+common_domfilters -B website_build
|
||||
CLEAN := latexmk -cd -lualatex -c -use-make
|
||||
CHECK_1 := lacheck
|
||||
CHECK_2 := chktex
|
||||
@@ -13,7 +13,6 @@ REDUCE_PIC_COLOR := -quality 80\%
|
||||
RSYNC := rsync -au --exclude 'book.epub' --exclude '*.jpg'
|
||||
GIT := git --no-pager
|
||||
SPELL_CHECK := hunspell -t -l -d en_US
|
||||
EPUBSIZE := `du -sb epub/low_res_book.epub | cut -f1`
|
||||
|
||||
# We want bash as shell
|
||||
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
|
||||
@@ -25,25 +24,35 @@ LATEX += -diagnostics
|
||||
EBOOK += -a debug
|
||||
WEBSITE += -a debug
|
||||
endif
|
||||
# }}}
|
||||
|
||||
website_dir := static_website_html
|
||||
# Default target is not all because most of the time we just want a pdf...
|
||||
# and building everything take a long time.
|
||||
.DEFAULT_GOAL := serif
|
||||
|
||||
# List all files that are dependencies
|
||||
# List all files that are dependencies {{{
|
||||
chapters = baking basics bread-types cover flour-types history intro mix-ins\
|
||||
non-wheat-sourdough sourdough-starter storing-bread troubleshooting\
|
||||
wheat-sourdough glossary
|
||||
|
||||
src_tables := $(wildcard tables/table-*.tex)
|
||||
src_figures := $(wildcard figures/fig-*.tex) figures/flowcharts_tikz.tex
|
||||
src_figures += $(wildcard plots/fig-*.tex)
|
||||
src_recipes := $(wildcard recipes/*.tex)
|
||||
src_plots := $(wildcard plots/*.table)
|
||||
|
||||
# Actual book text and LaTeX code {{{
|
||||
src_tex := $(foreach directory, $(chapters), $(wildcard $(directory)/*.tex))
|
||||
src_tex += book.tex book_sans_serif.tex references.bib figures/vars.tex
|
||||
src_tex += supporters.csv sourdough.sty colors.tex
|
||||
src_tex += supporters.csv sourdough.sty colors.tex abbreviations.tex
|
||||
src_tex += $(src_recipes)
|
||||
# }}}
|
||||
|
||||
# Tables and TikZ flowcharts/plots/drawings... {{{
|
||||
src_tables := $(wildcard tables/table-*.tex)
|
||||
src_figures := $(wildcard figures/fig-*.tex) figures/flowcharts_tikz.tex
|
||||
src_figures += $(wildcard plots/fig-*.tex) abbreviations.tex colors.tex
|
||||
src_recipes := $(wildcard recipes/*.tex)
|
||||
src_plots := $(wildcard plots/*.table)
|
||||
# }}}
|
||||
|
||||
tgt_figures := $(patsubst %.tex, %.png,$(src_figures))
|
||||
|
||||
# Photos {{{
|
||||
images := $(wildcard images/*/*.jpg)
|
||||
images += $(wildcard images/*.jpg)
|
||||
images += $(wildcard images/*.png)
|
||||
@@ -57,55 +66,47 @@ images += $(foreach directory, $(chapters), $(wildcard $(directory)/*/*.png))
|
||||
# images to lower resolution and greyscale
|
||||
bw_images := $(addprefix bw-book-epub/OEBPS/, $(images))
|
||||
|
||||
# For lower res colour ebook we would not convert png as it only get worst
|
||||
# we will copy them instead... so remove them as a dependency.
|
||||
# For lower resolution colour ebook (see below) we will not convert png as it
|
||||
# only get worst we will copy them instead... so remove them as a dependency.
|
||||
low_res_images := $(addprefix low-res-book-epub/OEBPS/, $(images))
|
||||
low_res_images := $(filter-out %.png, $(low_res_images))
|
||||
# }}}
|
||||
|
||||
# All together.
|
||||
src_all := $(src_tex) $(src_figures) $(src_tables) $(images) $(src_plots)
|
||||
|
||||
# And format specific configurations
|
||||
ebook_src := $(src_all) tex4ebook.cfg book.mk4 book-ebook.css
|
||||
|
||||
website_src := $(src_all) website.cfg style.css
|
||||
|
||||
# This is more than what is actually needed but keeps the makefile simple
|
||||
# and latexmk will handle the rest
|
||||
booklet_src := $(src_figures) $(src_tables) $(src_recipes) $(images)
|
||||
booklet_src += booklet.tex
|
||||
|
||||
website_dir := static_website_html
|
||||
website_assets := $(wildcard ../website/assets/*)
|
||||
ruby_src := ../website/modify_build.rb $(website_assets)
|
||||
ruby_pkg := ../website/Gemfile ../website/Gemfile.lock
|
||||
|
||||
tgt_figures := $(patsubst %.tex, %.png,$(src_figures))
|
||||
|
||||
# Default target is not all because most of the time we just want a pdf...
|
||||
# and ebook take a long time to build.
|
||||
.DEFAULT_GOAL := build_serif_pdf
|
||||
|
||||
# Default rules for pdf and ebooks, getting overwritten when built in a
|
||||
# sub-directory
|
||||
%.pdf: %.tex
|
||||
$(LATEX) $<
|
||||
# This is more than what is actually needed but keeps the makefile simple
|
||||
booklet_src := $(src_figures) $(src_tables) $(src_recipes) $(images)
|
||||
booklet_src += booklet.tex
|
||||
# }}}
|
||||
|
||||
# Flowcharts {{{
|
||||
# TODO: check if it works on github CI
|
||||
%.png: %.tex
|
||||
@echo "\input{./vars.tex}" > $@.in
|
||||
# \b is backspace..
|
||||
@echo "\\\begin{document}" >> $@.in
|
||||
@printf '%s\n' "\input{./vars.tex}" > $@.in
|
||||
@printf '%s\n' "\begin{document}" >> $@.in
|
||||
@cat $< >> $@.in
|
||||
@echo "\\\end{document}" >> $@.in
|
||||
@printf '%s\n' "\end{document}" >> $@.in
|
||||
$(LATEX) $@.in
|
||||
figures/export_figures.sh $@.pdf
|
||||
|
||||
%.xbb: %.jpg
|
||||
ebb -x $<
|
||||
# }}}
|
||||
|
||||
# We don't want to use latexmk as there is no biber nor references and it
|
||||
# seems to make it somehow unhappy
|
||||
booklet/booklet.pdf: $(booklet_src)
|
||||
mkdir -p booklet
|
||||
lualatex --output-directory=booklet booklet.tex
|
||||
# pdf {{{
|
||||
# Default rules for pdf, getting overwritten when built in a sub-directory
|
||||
%.pdf: %.tex
|
||||
$(LATEX) $<
|
||||
|
||||
book_serif/book.pdf: $(src_all)
|
||||
$(LATEX) -output-directory=book_serif book.tex
|
||||
@@ -113,16 +114,28 @@ book_serif/book.pdf: $(src_all)
|
||||
book_sans_serif/book_sans_serif.pdf: $(src_all)
|
||||
$(LATEX) -output-directory=book_sans_serif book_sans_serif.tex
|
||||
|
||||
.PHONY: copy_ebook_files copy_ebook_files_low_res
|
||||
# We don't want to use latexmk as there is no biber nor references and it
|
||||
# seems to make it somehow unhappy
|
||||
booklet/booklet.pdf: $(booklet_src)
|
||||
mkdir -p booklet
|
||||
lualatex --output-directory=booklet booklet.tex
|
||||
# }}}
|
||||
|
||||
# Ebook {{{
|
||||
###################################
|
||||
.PHONY: copy_ebook_files copy_ebook_files_low_res
|
||||
epub/%.epub: %.tex $(ebook_src) cover/cover-page.xbb
|
||||
$(EBOOK) $<
|
||||
|
||||
copy_ebook_files: build_ebook
|
||||
$(RSYNC) --exclude '*.png' epub_build/book-epub/ bw-book-epub/
|
||||
|
||||
copy_ebook_files_low_res: build_ebook
|
||||
$(RSYNC) epub_build/book-epub/ low-res-book-epub/
|
||||
# Now that we have built the ebook we will generate 2 more versions
|
||||
#
|
||||
# 1) With kindle app on phone we want a colour version with size < 50 MB
|
||||
# 2) A black-white version for actual eink readers
|
||||
#
|
||||
# In both cases we just convert images and repack the ebpub
|
||||
|
||||
# We do not convert SVG to B&W or lower res for now as they are super small
|
||||
# anyway
|
||||
@@ -134,120 +147,107 @@ bw-book-epub/OEBPS/%.png: %.png
|
||||
mkdir -p $(dir $@)
|
||||
$(CONVERT_PIC) $< $(REDUCE_PIC) $@
|
||||
|
||||
low-res-book-epub/OEBPS/%.jpg: %.jpg
|
||||
mkdir -p $(dir $@)
|
||||
$(CONVERT_PIC) $< $(REDUCE_PIC_COLOR) $@
|
||||
|
||||
epub/bw_book.epub: copy_ebook_files $(bw_images)
|
||||
cd bw-book-epub; zip -q0X ../epub/bw_book.epub mimetype
|
||||
cd bw-book-epub; zip -q9XrD ../epub/bw_book.epub ./
|
||||
|
||||
# Now the low res
|
||||
copy_ebook_files_low_res: ebook
|
||||
$(RSYNC) epub_build/book-epub/ low-res-book-epub/
|
||||
|
||||
low-res-book-epub/OEBPS/%.jpg: %.jpg
|
||||
mkdir -p $(dir $@)
|
||||
$(CONVERT_PIC) $< $(REDUCE_PIC_COLOR) $@
|
||||
|
||||
epub/low_res_book.epub: copy_ebook_files_low_res $(low_res_images)
|
||||
cd low-res-book-epub; zip -q0X ../epub/low_res_book.epub mimetype
|
||||
cd low-res-book-epub; zip -q9XrD ../epub/low_res_book.epub ./
|
||||
#}}}
|
||||
|
||||
# Now with the rules
|
||||
# Expected usual rules first
|
||||
# Website {{{
|
||||
###################################
|
||||
.PHONY: html website
|
||||
$(website_dir)/book.html: $(website_src) cover/cover-page.xbb
|
||||
$(WEBSITE) -d $(website_dir) book.tex
|
||||
|
||||
html: $(website_dir)/book.html
|
||||
cp $< $(website_dir)/index.html
|
||||
|
||||
# Because packages will be installed in hard to predict places use a file as
|
||||
# marker..
|
||||
../website/_bundle_install_done: $(ruby_pkg)
|
||||
-rm ../website/$@
|
||||
cd ../website && bundle install
|
||||
touch ../website/$@
|
||||
|
||||
# TODO: this will run every single time, but is so fast we don't really care
|
||||
website: html ../website/_bundle_install_done $(ruby_src)
|
||||
cd ../website && ruby modify_build.rb
|
||||
#}}}
|
||||
|
||||
# Figures only {{{
|
||||
###################################
|
||||
.PHONY: export_figures
|
||||
# Requires that you have docker running on your computer.
|
||||
export_figures: pdf $(tgt_figures)
|
||||
cd figures/ && bash export_figures.sh
|
||||
# }}}
|
||||
|
||||
# Now with the targets {{{
|
||||
# Expected usual targets first
|
||||
.PHONY: all
|
||||
all: bake
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
@echo ""
|
||||
@echo "default: builds the book in pdf format (serif)"
|
||||
@echo ""
|
||||
@echo "Releases:"
|
||||
@echo " all: pdf serif and sans-serif accessible version, ebooks in colours"
|
||||
@echo " and black&white versions and the website"
|
||||
@echo ""
|
||||
@echo " bake: same as build all"
|
||||
@echo ""
|
||||
@echo " release_serif: build serif only version of pdf and ebook"
|
||||
@echo " release_sans_serif: build sans-serif/accessible version of pdf"
|
||||
@echo ""
|
||||
@echo "Portable Document Format (pdf):"
|
||||
@echo " build_sans_serif_pdf: build accessible pdf only (same as release_sans_serif)"
|
||||
@echo " build_serif_pdf: build serif pdf only"
|
||||
@echo " build_pdf: builds both serif and accessible pdf"
|
||||
@echo ""
|
||||
@echo "Ebooks (epub):"
|
||||
@echo " build_ebook: builds only the colour ebook"
|
||||
@echo " build_bw_ebook: builds the low res black & white ebook"
|
||||
@echo ""
|
||||
@echo "Website:"
|
||||
@echo " website: build the static website from LaTeX sources and post-process it"
|
||||
@echo " html: build the static website from LaTeX sources _without_ post-processing"
|
||||
@echo ""
|
||||
@echo "Cleanup:"
|
||||
@echo " mrproper: delete all generated files intermediate and pdf/ebooks/website"
|
||||
@echo " clean: delete all intermediate files keep targets (pdf/ebooks/website)"
|
||||
@echo " clean_figures: delete intermediate TikZ files"
|
||||
@echo " clean_website_build: delete intermediate website files"
|
||||
@echo " clean_ebook_build: delete intermediate ebook files"
|
||||
@echo ""
|
||||
@echo "Debug targets:"
|
||||
@echo ""
|
||||
@echo "figures: build TikZ figures only"
|
||||
@echo ""
|
||||
@echo "Quick builds:"
|
||||
@echo " quick: compiles serif_pdf but runs lulatex only once"
|
||||
@echo " quick_ebook: compiles ebook but runs lulatex only once"
|
||||
@echo " quick_booklet: compiles booklet but runs lulatex only once"
|
||||
@echo ""
|
||||
@echo "Checks:"
|
||||
@echo " tex-check: runs static analysis checker on LaTeX source to spot"
|
||||
@echo " programming or typographic mistakes"
|
||||
@echo " spell-check: runs a spell checker"
|
||||
@echo " check: runs both checkers"
|
||||
@echo ""
|
||||
@echo "Dump informations:"
|
||||
@echo " show_tools_version: Show version of tools used on the build machine"
|
||||
@echo " printvars: print all variables in the makefile"
|
||||
@echo " print-X: print makefile variable X"
|
||||
@echo ""
|
||||
@echo "set DEBUG i.e make DEBUG=1 build_ebook to add debug flags to commands"
|
||||
|
||||
|
||||
# Finally actual project targets (i.e. build pdf and ebooks)
|
||||
.PHONY: build_pdf build_booklet build_serif_pdf build_sans_serif_pdf build_ebook
|
||||
.PHONY: pdf booklet serif sans_serif ebook
|
||||
|
||||
build_pdf: build_serif_pdf build_sans_serif_pdf
|
||||
pdf: serif sans_serif
|
||||
|
||||
build_booklet: booklet/booklet.pdf
|
||||
booklet: booklet/booklet.pdf
|
||||
serif: book_serif/book.pdf
|
||||
sans_serif: book_sans_serif/book_sans_serif.pdf
|
||||
|
||||
build_serif_pdf: book_serif/book.pdf
|
||||
ebook: epub/book.epub
|
||||
bw_ebook: epub/bw_book.epub
|
||||
low_res_ebook: epub/low_res_book.epub
|
||||
|
||||
build_sans_serif_pdf: book_sans_serif/book_sans_serif.pdf
|
||||
# We keep the old target names for backward compatibility
|
||||
build_pdf: pdf
|
||||
build_booklet: booklet
|
||||
build_serif_pdf: serif
|
||||
build_sans_serif_pdf: sans_serif
|
||||
build_ebook: ebook
|
||||
build_bw_ebook: bw_ebook
|
||||
build_low_res_ebook: low_res_ebook
|
||||
|
||||
build_ebook: epub/book.epub
|
||||
# top level releases rules
|
||||
.PHONY: bake release_serif release_sans_serif
|
||||
bake: release_serif release_sans_serif release_booklet website
|
||||
|
||||
build_bw_ebook: epub/bw_book.epub
|
||||
release:
|
||||
mkdir -p release
|
||||
|
||||
build_low_res_ebook: epub/low_res_book.epub
|
||||
release_serif: serif ebook bw_ebook low_res_ebook | release
|
||||
cp book_serif/book.pdf release/TheBreadCode-The-Sourdough-Framework.pdf
|
||||
cp epub/bw_book.epub release/TheBreadCode-The-Sourdough-Framework-black-and-white.epub
|
||||
cp epub/low_res_book.epub release/TheBreadCode-The-Sourdough-Framework.epub
|
||||
# Kindle does not allow files larger than 50 MB... so let's check
|
||||
@if [ `du -sb epub/low_res_book.epub | cut -f1` -gt 49500000 ]; then \
|
||||
echo "ERROR: epub File too big"; \
|
||||
exit 1; \
|
||||
fi
|
||||
|
||||
.PHONY: export_figures check tex-check spell-check
|
||||
# Requires that you have docker running on your computer.
|
||||
export_figures: build_pdf $(tgt_figures)
|
||||
cd figures/ && bash export_figures.sh
|
||||
release_sans_serif: sans_serif | release
|
||||
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
||||
|
||||
# Goal is not really to have 0 warning reported but we should check we don't
|
||||
# add many and if we do, we know they are false positive
|
||||
check: spell-check tex-check
|
||||
release_booklet: booklet | release
|
||||
cp booklet/booklet.pdf release/TheBreadCode-The-Sourdough-Framework-booklet.pdf
|
||||
# }}}
|
||||
|
||||
tex-check: $(src_tex)
|
||||
@echo "Running: " $(CHECK_1)
|
||||
$(CHECK_1) book.tex
|
||||
@echo ""
|
||||
@echo "Running: " $(CHECK_2)
|
||||
$(CHECK_2) book.tex
|
||||
# Clean up {{{
|
||||
###################################
|
||||
|
||||
spell-check: $(src_tex) spelling_exceptions.txt
|
||||
# Generate exceptions this way to avoid false positives
|
||||
# hunspell -t -l -d en_US **/*.tex *.csv *.sty *.sty | cut -f 2 -d ':' | sort -u > spelling_exceptions.txt
|
||||
$(SPELL_CHECK) -p spelling_exceptions.txt $(src_tex)
|
||||
|
||||
|
||||
# Clean up and delete generated files
|
||||
# delete generated files
|
||||
.PHONY: clean_figures clean_ebook_build clean_website_build clean mrproper
|
||||
clean_figures:
|
||||
-$(CLEAN) $(patsubst %.tex, %.png.in, $(src_figures))
|
||||
@@ -292,52 +292,92 @@ mrproper: clean
|
||||
-rm -rf epub_build/
|
||||
-rm -rf website_build/
|
||||
-rm -rf $(website_dir)
|
||||
#}}}
|
||||
|
||||
# top level releases rules
|
||||
.PHONY: bake release_serif release_sans_serif
|
||||
# Help {{{
|
||||
###################################
|
||||
.PHONY: help
|
||||
help:
|
||||
@echo ""
|
||||
@echo "default: builds the book in pdf format (serif)"
|
||||
@echo ""
|
||||
@echo "Releases:"
|
||||
@echo " all: pdf serif and sans-serif accessible version, ebooks in colours"
|
||||
@echo " and black&white versions as well as the website"
|
||||
@echo ""
|
||||
@echo " bake: same as build all"
|
||||
@echo ""
|
||||
@echo " release_serif: build serif only version of pdf and ebook"
|
||||
@echo " release_sans_serif: build sans-serif/accessible version of pdf"
|
||||
@echo ""
|
||||
@echo "Portable Document Format (pdf):"
|
||||
@echo " sans_serif: build accessible pdf only (same as release_sans_serif)"
|
||||
@echo " serif: build serif pdf only"
|
||||
@echo " pdf: builds both serif and accessible pdf"
|
||||
@echo ""
|
||||
@echo "Ebooks (epub):"
|
||||
@echo " ebook: builds only the colour ebook"
|
||||
@echo " low_res_ebook: builds the colour ebook in lower resolution"
|
||||
@echo " bw_ebook: builds the low res black & white ebook"
|
||||
@echo ""
|
||||
@echo "Website:"
|
||||
@echo " website: build the static website from LaTeX sources and post-process it"
|
||||
@echo " html: build the static website from LaTeX sources _without_ post-processing"
|
||||
@echo ""
|
||||
@echo "Cleanup:"
|
||||
@echo " mrproper: delete all generated files intermediate and pdf/ebooks/website"
|
||||
@echo " clean: delete all intermediate files keep targets (pdf/ebooks/website)"
|
||||
@echo " clean_figures: delete intermediate TikZ files"
|
||||
@echo " clean_website_build: delete intermediate website files"
|
||||
@echo " clean_ebook_build: delete intermediate ebook files"
|
||||
@echo ""
|
||||
@echo "Debug targets:"
|
||||
@echo ""
|
||||
@echo "figures: build TikZ figures only"
|
||||
@echo ""
|
||||
@echo "Quick builds:"
|
||||
@echo " quick: compiles serif_pdf but runs lulatex only once"
|
||||
@echo " quick_ebook: compiles ebook but runs lulatex only once"
|
||||
@echo " quick_booklet: compiles booklet but runs lulatex only once"
|
||||
@echo ""
|
||||
@echo "Checks:"
|
||||
@echo " tex-check: runs static analysis checker on LaTeX source to spot"
|
||||
@echo " programming or typographic mistakes"
|
||||
@echo " spell-check: runs a spell checker"
|
||||
@echo " check: runs both checkers"
|
||||
@echo ""
|
||||
@echo "Dump informations:"
|
||||
@echo " show_tools_version: Show version of tools used on the build machine"
|
||||
@echo " printvars: print all variables in the makefile"
|
||||
@echo " print-X: print makefile variable X"
|
||||
@echo ""
|
||||
@echo "set DEBUG i.e make DEBUG=1 ebook to add debug flags to commands"
|
||||
# }}}
|
||||
|
||||
bake: release_serif release_sans_serif release_booklet website
|
||||
# Debug Stuff from now on {{{
|
||||
###################################
|
||||
|
||||
release:
|
||||
mkdir -p release
|
||||
# Verify your spelling and TeX warnings {{{
|
||||
.PHONY: check tex-check spell-check
|
||||
# Goal is not really to have 0 warning reported but we should check we don't
|
||||
# add many and if we do, we know they are false positive
|
||||
check: spell-check tex-check
|
||||
|
||||
release_serif: build_serif_pdf build_ebook build_bw_ebook build_low_res_ebook | release
|
||||
cp book_serif/book.pdf release/TheBreadCode-The-Sourdough-Framework.pdf
|
||||
cp epub/bw_book.epub release/TheBreadCode-The-Sourdough-Framework-black-and-white.epub
|
||||
cp epub/low_res_book.epub release/TheBreadCode-The-Sourdough-Framework.epub
|
||||
@if [ $(EPUBSIZE) -gt 49500000 ]; then \
|
||||
echo "ERROR: epub File too big"; \
|
||||
exit 1; \
|
||||
fi
|
||||
tex-check: $(src_tex)
|
||||
@echo "Running: " $(CHECK_1)
|
||||
$(CHECK_1) book.tex
|
||||
@echo ""
|
||||
@echo "Running: " $(CHECK_2)
|
||||
$(CHECK_2) book.tex
|
||||
|
||||
release_sans_serif: build_sans_serif_pdf | release
|
||||
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
||||
# Should be 0 if not and you are really sure update the exception file
|
||||
spell-check: $(src_tex) spelling_exceptions.txt
|
||||
# Generate exceptions this way to avoid false positives
|
||||
# hunspell -t -l -d en_US **/*.tex *.csv *.sty *.sty | cut -f 2 -d ':' | sort -u > spelling_exceptions.txt
|
||||
$(SPELL_CHECK) -p spelling_exceptions.txt $(src_tex)
|
||||
#}}}
|
||||
|
||||
release_booklet: build_booklet | release
|
||||
cp booklet/booklet.pdf release/TheBreadCode-The-Sourdough-Framework-booklet.pdf
|
||||
|
||||
# Website stuff
|
||||
.PHONY: html website
|
||||
$(website_dir)/book.html: $(website_src) cover/cover-page.xbb
|
||||
$(WEBSITE) -d $(website_dir) book.tex
|
||||
|
||||
html: $(website_dir)/book.html
|
||||
cp $< $(website_dir)/index.html
|
||||
|
||||
# Because packages will be installed in hard to predict places use a file as
|
||||
# marker..
|
||||
../website/_bundle_install_done: $(ruby_pkg)
|
||||
-rm ../website/$@
|
||||
cd ../website && bundle install
|
||||
touch ../website/$@
|
||||
|
||||
# TODO: this will run every single time, but is so fast we don't really care
|
||||
website: html ../website/_bundle_install_done $(ruby_src)
|
||||
cd ../website && ruby modify_build.rb
|
||||
|
||||
# Debug Stuff from now on
|
||||
.PHONY: quick quick_ebook show_tools_version printvars
|
||||
|
||||
# Those 2 targets allow fast debug cycles but not resolving references etc
|
||||
# They also ignore dependencies and run each time you call them.
|
||||
quick: # run latex only once no biber, no references etc...
|
||||
@@ -349,7 +389,7 @@ quick_booklet:
|
||||
quick_ebook: cover/cover-page.xbb # run latex only once no biber, ref etc...
|
||||
$(EBOOK) --mode draft book.tex
|
||||
|
||||
show_tools_version: # Show version of tools used on the build machine
|
||||
show_tools_version: # Show version of tools used on the build machine {{{
|
||||
- $(GIT) log -1 --pretty=%B
|
||||
@echo ""
|
||||
- uname -a
|
||||
@@ -384,6 +424,7 @@ show_tools_version: # Show version of tools used on the build machine
|
||||
- $(CONVERT_PIC) --version
|
||||
@echo ""
|
||||
- rsync --version
|
||||
# }}}
|
||||
|
||||
# You can find the value of variable X with the following command:
|
||||
# make print-X
|
||||
@@ -393,3 +434,4 @@ printvars: # Print all variables in the makefile
|
||||
@$(foreach V,$(sort $(.VARIABLES)), \
|
||||
$(if $(filter-out environ% default automatic, \
|
||||
$(origin $V)),$(info $V=$($V) ($(value $V)))))
|
||||
# }}}
|
||||
|
||||
@@ -26,11 +26,11 @@ to express yourself.
|
||||
\begin{figure}[htb!]
|
||||
\centering
|
||||
\includegraphics[width=\textwidth]{pumpkin-on-flour}
|
||||
\caption[Pumpkin puré]{A common mix-in technique is to replace some of
|
||||
the dough's water with another liquid. In this case, puréd pumpkin replaced
|
||||
some of the water. When adding puré to the dough only slowly add
|
||||
additional water as the puré slowly releases additional water to the
|
||||
dough.}%
|
||||
\caption[Pumpkin purée]{A popular method is to substitute part of the
|
||||
dough's water with another liquid, such as puréed pumpkin. When
|
||||
incorporating the purée, add any extra water gradually, as the purée
|
||||
will release its own liquid into the dough over time.}%
|
||||
\label{fig:pumpkin-on-flour}
|
||||
\end{figure}
|
||||
|
||||
One approach to categorizing the mixins is to look at their respective shape.
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
major grid style={line width=.2pt,draw=gray!30},
|
||||
axis x line=middle,
|
||||
axis y line=middle,
|
||||
axis line style={-Latex},
|
||||
width=\textwidth,
|
||||
height=0.5\textwidth,
|
||||
xmax=35, xmin=-0.1,
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
major grid style={line width=.2pt,draw=gray!30},
|
||||
axis x line=middle,
|
||||
axis y line=middle,
|
||||
axis line style={-Latex},
|
||||
width=\textwidth,
|
||||
height=0.5\textwidth,
|
||||
xmax=35, xmin=-0.1,
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
\qty{60}{\percent}~hydration},
|
||||
axis x line=middle,
|
||||
axis y line=middle,
|
||||
axis line style={-Latex},
|
||||
width=\textwidth,
|
||||
height=0.5\textwidth,
|
||||
xmax=44, xmin=-0.1,
|
||||
|
||||
@@ -34,9 +34,7 @@
|
||||
\DeclareTOCStyleEntry[numwidth=3em]{tocline}{table}
|
||||
|
||||
% Common abbreviations
|
||||
\newcommand{\ie}{\emph{i.e.}\@ifnextchar.{\!\@gobble}{}}
|
||||
\newcommand{\eg}{\emph{e.g.}\@ifnextchar.{\!\@gobble}{}}
|
||||
\newcommand{\etc}{etc\@ifnextchar.{}{.\@}}
|
||||
\input{abbreviations.tex}
|
||||
|
||||
% Consistent pH values
|
||||
\newcommand{\pHvalue}[1]{pH~\SI{#1}{}}
|
||||
@@ -54,8 +52,9 @@
|
||||
\DeclareRobustCommand\sbseries{\fontseries{sb}\selectfont}
|
||||
% Fonts for accessibility
|
||||
\ifdefined\isaccessible
|
||||
\setmainfont{Open Sans}[
|
||||
Scale=MatchLowercase]
|
||||
\usepackage[mathrm=sym]{unicode-math}
|
||||
\setmathfont{Fira Math}[Scale=MatchLowercase]
|
||||
\setmainfont{Open Sans}[Scale=MatchLowercase]
|
||||
\else
|
||||
\setmainfont{TeX Gyre Pagella}[Scale=1.0] % Or Palatino Linotype, etc.
|
||||
% TODO not available on github CI
|
||||
|
||||
@@ -483,8 +483,6 @@ poolish
|
||||
pre
|
||||
preshape
|
||||
preshaping
|
||||
puré
|
||||
puréd
|
||||
purée
|
||||
pâte
|
||||
raffaella
|
||||
|
||||
@@ -7,7 +7,7 @@ later time.
|
||||
\end{quoting}
|
||||
|
||||
A summary can be found in Table~\ref{table:bread-storage}, with details and
|
||||
explanation in th rest of this chapter.
|
||||
explanation in the rest of this chapter.
|
||||
\begin{table}[!htb]
|
||||
\centering
|
||||
\input{tables/table-storing-bread-overview.tex}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;800&display=swap');
|
||||
|
||||
:root{
|
||||
--ff-sans: 'Open Sans', sans-serif;
|
||||
--fw-regular: 400;
|
||||
@@ -147,7 +145,6 @@ nav.TOC a, nav.TOC a:visited{
|
||||
/* *** Colors *** */
|
||||
/* ************** */
|
||||
|
||||
|
||||
body{
|
||||
background-color: var(--c-beige);
|
||||
}
|
||||
@@ -254,6 +251,10 @@ figcaption.caption {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.chapterToc a, .chapterToc, .likechapterToc a, .likechapterToc, .appendixToc a, .appendixToc, .addchapToc a {
|
||||
font-weight: var(--fw-bold);
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.toggle-menu-label {
|
||||
display: block;
|
||||
@@ -317,7 +318,7 @@ figcaption.caption {
|
||||
display: block;
|
||||
color: #000;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
font-weight: var(--fw-bold);
|
||||
}
|
||||
|
||||
.chapterToc a, .sectionToc a, .subsectionToc a, .likechapterToc a {
|
||||
@@ -498,7 +499,7 @@ blockquote {
|
||||
border: 2px solid var(--c-black);
|
||||
color: var(--c-black);
|
||||
padding: 4px;
|
||||
font-weight: bold;
|
||||
font-weight: var(--fw-bold);
|
||||
text-decoration: none;
|
||||
}
|
||||
.crosslinks-bottom a.prev {
|
||||
|
||||
@@ -11,4 +11,12 @@
|
||||
\Configure{AddCss}{book-ebook.css}
|
||||
\Configure{CoverMimeType}{image/jpeg}
|
||||
\CoverMetadata{cover/cover-page.jpg}
|
||||
\AddToHook{env/tikzpicture/begin}{\fontfamily{opensans-TLF}\selectfont}
|
||||
\Configure{@HEAD}{\HCode{
|
||||
<style type="text/css">
|
||||
@import url('https://fonts.cdnfonts.com/css/open-sans');
|
||||
body{
|
||||
font-family: 'Open Sans';
|
||||
}
|
||||
</style>}}
|
||||
\EndPreamble
|
||||
|
||||
@@ -9,6 +9,14 @@
|
||||
}}
|
||||
|
||||
\Configure{AddCss}{style.css}
|
||||
\AddToHook{env/tikzpicture/begin}{\fontfamily{opensans-TLF}\selectfont}
|
||||
\Configure{@HEAD}{\HCode{
|
||||
<style type="text/css">
|
||||
@import url('https://fonts.cdnfonts.com/css/open-sans');
|
||||
body{
|
||||
font-family: 'Open Sans';
|
||||
}
|
||||
</style>}}
|
||||
\ConfigureEnv{titlepage}{\ifvmode\IgnorePar\fi\EndP\HCode{<main class="titlepage">}}{\ifvmode\IgnorePar\fi\EndP\HCode{</main>}}{}{}
|
||||
|
||||
% Mini TOC
|
||||
|
||||
@@ -405,7 +405,7 @@ your dough. The warmer the temperature, the faster the process; the colder, the
|
||||
slower the process.
|
||||
|
||||
While food is available, the microorganisms will reproduce and increase in
|
||||
quantity. The process is a self-limiting: it stops when there is no
|
||||
quantity. The process is self-limiting: it stops when there is no
|
||||
more food available. This can be compared to wine making where
|
||||
the yeast ultimately sporulates and dies as ethanol levels increase. The ethanol creates an
|
||||
environment that makes it impossible for other
|
||||
@@ -448,7 +448,7 @@ explained earlier, your
|
||||
bread dough is essentially a gigantic starter. The low inoculation rate allows
|
||||
the starter to regrow inside your main dough into a desirable balance.
|
||||
Furthermore, the enzymes have enough time to break down the flour. This also
|
||||
allows me to skip the so-called autolysis step completely (more in the next chapter).
|
||||
allows me to skip the so-called autolysis step completely (more in the next section).
|
||||
This greatly simplifies the whole process.
|
||||
|
||||
\section{Autolysis}%
|
||||
@@ -465,7 +465,7 @@ The overall time that flour and water are in contact is extended. Thus you get t
|
||||
beneficial enzymatic reactions that improve the taste and characteristics of the
|
||||
dough. I~do not recommend autolysis as it adds an unnecessary step to the
|
||||
process. Instead, I~recommend the fermentolysis technique which will be covered in the
|
||||
next chapter of this book.
|
||||
next section of this book.
|
||||
|
||||
The effects of autolysis are very interesting. Try to mix just flour and
|
||||
water and let that sit for a day. During the day, check the consistency of
|
||||
@@ -615,7 +615,7 @@ by adding water and kneading again. This is a great trick to make
|
||||
a more extensible dough with lower-gluten flour~\cite{bassinage+technique}.
|
||||
|
||||
When machine kneading a dough, opt for the same technique shown in
|
||||
figure~\ref{fig:wheat-sourdough-kneading-process}. Initially opt for a low
|
||||
flowchart~\ref{fig:wheat-sourdough-kneading-process}. Initially opt for a low
|
||||
speed. This helps the homogenization process.
|
||||
After waiting to allow the flour to soak up the water, proceed on a higher speed
|
||||
setting. A good sign of a well-developed gluten network is
|
||||
@@ -1563,7 +1563,7 @@ A reliable way to ensure consistent proofing is to opt for using a pH
|
||||
meter. By checking the amount of piled-up acidity you can ensure
|
||||
each of your doughs has the right amount of acidity. Opt for an iterative
|
||||
approach and check the pH for multiple proofing times. Find the pH
|
||||
the value that creates the best bread for you. Once you have identified
|
||||
value that creates the best bread for you. Once you have identified
|
||||
your perfect pH value you can resort to that number on all following
|
||||
doughs. See Table~\ref{table:sample-ph-values} for some sample pH values
|
||||
to follow.
|
||||
@@ -1610,7 +1610,7 @@ banneton should now be facing you.
|
||||
\label{fig:artistic-scoring}
|
||||
\end{figure}
|
||||
|
||||
The scoring cut for done at a \ang{45}~angle relative to the dough's
|
||||
The scoring cut is done at a \ang{45}~angle relative to the dough's
|
||||
surface slightly off the dough's center. With the \ang{45}~angle cut
|
||||
the overlaying side will rise more in the oven than the other side.
|
||||
This way you will achieve a so-called \emph{ear} on the final bread.
|
||||
|
||||
17
makefile
17
makefile
@@ -15,13 +15,13 @@ push_docker_image: build_docker_image
|
||||
docker push $(DOCKER_IMAGE):latest
|
||||
|
||||
# Books/website
|
||||
build_serif_pdf:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_serif_pdf"
|
||||
serif_pdf:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make serif_pdf"
|
||||
|
||||
build_ebook:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_ebook"
|
||||
ebook:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make ebook"
|
||||
|
||||
build_pdf:
|
||||
pdf:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make"
|
||||
|
||||
bake:
|
||||
@@ -31,7 +31,7 @@ website:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make website"
|
||||
|
||||
booklet:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_booklet"
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make booklet"
|
||||
|
||||
mrproper:
|
||||
$(DOCKER_CMD) "cd /opt/repo/book && make mrproper"
|
||||
@@ -48,3 +48,8 @@ print_os_version:
|
||||
|
||||
start_shell:
|
||||
docker run -it -v $(PWD):/opt/repo $(DOCKER_IMAGE) /bin/bash
|
||||
|
||||
# Old names for backward compatibility
|
||||
build_serif_pdf: serif_pdf
|
||||
build_ebook: ebook
|
||||
build_pdf: pdf
|
||||
|
||||
Reference in New Issue
Block a user