mirror of
https://github.com/hendricius/the-sourdough-framework
synced 2025-11-09 04:31:11 -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
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
make -j -O build_serif_pdf build_ebook website
|
make -j -O serif ebook website
|
||||||
- name: Upload book Artifacts
|
- name: Upload book Artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ make
|
|||||||
```
|
```
|
||||||
|
|
||||||
If you want to 🍞 bake all the versions including ebook variants (.pdf, .epub
|
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
|
```console
|
||||||
cd book/
|
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)
|
* [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
|
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)
|
* [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
|
% 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] (ph_value) -- node{} ++(2, 0);
|
||||||
\path [draw, thick] (smell) -| node{} ++(2, 4);
|
\path [draw, thick] (smell) -| node{} ++(2, 4);
|
||||||
\path [line] (dough_ready) -- node{yes} (divide_preshape);
|
\path [line] (dough_ready) -- node{Yes} (divide_preshape);
|
||||||
\path [line] (dough_ready) |- node[right=3pt]{no} (dough_flattened);
|
\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[right=3pt]{Yes} (stretch_fold);
|
||||||
\path [line] (dough_flattened) -- node{no} (wait_60_minutes);
|
\path [line] (dough_flattened) -- node{No} (wait_60_minutes);
|
||||||
\path [line] (stretch_fold) -- (wait_60_minutes);
|
\path [line] (stretch_fold) -- (wait_60_minutes);
|
||||||
\path [line] (wait_60_minutes) -- (check_dough);
|
\path [line] (wait_60_minutes) -- (check_dough);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
|
|||||||
@@ -8,18 +8,18 @@
|
|||||||
\path [line] (knead) -- (wait2);
|
\path [line] (knead) -- (wait2);
|
||||||
\node [decision, below of=wait2, node distance=4cm] (windowpane_test) {Window-pane?};
|
\node [decision, below of=wait2, node distance=4cm] (windowpane_test) {Window-pane?};
|
||||||
\path [line] (wait2) -- (windowpane_test);
|
\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?};
|
\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};
|
\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);
|
\path [line] (add_water.north east) -- (knead.south west);
|
||||||
\node [decision, below of=more_water, node distance=4.5cm] (dough_sample) {Aliquot sample?};
|
\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};
|
\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};
|
\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);
|
\path [line] (extract_sample.north east) -- (dough_ball.south west);
|
||||||
\node [success, below of=dough_ball] (begin_bulk) {Begin bulk fermentation};
|
\node [success, below of=dough_ball] (begin_bulk) {Begin bulk fermentation};
|
||||||
\path [line] (dough_ball) -- (begin_bulk);
|
\path [line] (dough_ball) -- (begin_bulk);
|
||||||
|
|||||||
@@ -8,10 +8,10 @@
|
|||||||
\path [line] (init) -- (feed_new_ratio);
|
\path [line] (init) -- (feed_new_ratio);
|
||||||
\path [line] (feed_new_ratio) -- node{Wait \qty{24}{\hour}} (ready_signs);
|
\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] (feed_again) -- node[anchor=east] {} ++(2.2,0) |- (feed_new_ratio);
|
||||||
\path [line] (ready_signs) -- node{no} (feed_again);
|
\path [line] (ready_signs) -- node{No} (feed_again);
|
||||||
\path [line] (ready_signs) -- node[above=2pt]{~yes} (last_feed);
|
\path [line] (ready_signs) -- node[above=2pt]{~Yes} (last_feed);
|
||||||
\path [line] (last_feed) -- node{after \qtyrange{6}{12}{\hour}} (bread_dough);
|
\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}
|
\end{tikzpicture}
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
\node [success, right of=dent_visible_decision, node distance=4cm] (bake) {Score and bake};
|
\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 (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})};
|
\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{Yes} (poke);
|
||||||
\path [line] (init) -- node{no} (retard_bake_decision);
|
\path [line] (init) -- node{No} (retard_bake_decision);
|
||||||
\path [line] (poke) -- (dent_visible_decision);
|
\path [line] (poke) -- (dent_visible_decision);
|
||||||
\path [line] (dent_visible_decision) -- node{yes} (bake);
|
\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.west) -- node{No} ++(-1.4, 0) -- node{} (wait_poke.south);
|
||||||
\path [line] (wait_poke) -- (poke);
|
\path [line] (wait_poke) -- (poke);
|
||||||
\path [line] (retard_bake_decision) -- node{yes} (wait_retard);
|
\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.east) -- node{No} ++(1, 0) |- node{} (retard.east);
|
||||||
\path [line] (wait_retard) -- (retard);
|
\path [line] (wait_retard) -- (retard);
|
||||||
\path [line] (retard) -- (bake);
|
\path [line] (retard) -- (bake);
|
||||||
\end{tikzpicture}
|
\end{tikzpicture}
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
\node [block, right of=flour] (banneton) {Place upside down in banneton};
|
\node [block, right of=flour] (banneton) {Place upside down in banneton};
|
||||||
\node [success, right of=banneton] (proof) {Begin proofing};
|
\node [success, right of=banneton] (proof) {Begin proofing};
|
||||||
\path [line] (init) -- (overfermented_decision);
|
\path [line] (init) -- (overfermented_decision);
|
||||||
\path [line] (overfermented_decision) -- node{yes} (overfermented);
|
\path [line] (overfermented_decision) -- node{Yes} (overfermented);
|
||||||
\path [line] (overfermented_decision) -- node{no} (shaping_technique);
|
\path [line] (overfermented_decision) -- node{No} (shaping_technique);
|
||||||
\path [line] (shaping_technique) -- (flour);
|
\path [line] (shaping_technique) -- (flour);
|
||||||
\path [line] (flour) -- (banneton);
|
\path [line] (flour) -- (banneton);
|
||||||
\path [line] (banneton) -- (proof);
|
\path [line] (banneton) -- (proof);
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
\path [line] (init) -- (all_starter_used);
|
\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=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};
|
\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{Yes} (use_dough);
|
||||||
\path [line] (all_starter_used) -- node{no} (use_starter);
|
\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};
|
\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_dough) -- (feed_starter);
|
||||||
\path [line] (use_starter) -- (feed_starter);
|
\path [line] (use_starter) -- (feed_starter);
|
||||||
@@ -13,20 +13,20 @@
|
|||||||
\path [line] (feed_starter) -- (bake_next_day_check);
|
\path [line] (feed_starter) -- (bake_next_day_check);
|
||||||
\node [success, right of=bake_next_day_check, node distance=3.5cm]
|
\node [success, right of=bake_next_day_check, node distance=3.5cm]
|
||||||
(make_bread_dough) {Make bread dough again after \qtyrange{8}{12}{\hour}};
|
(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 [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})};
|
\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};
|
\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] (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?};
|
\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) -- (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, 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};
|
\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{No} (dry_starter);
|
||||||
\path [line] (freezer_check) -- node{yes} (freeze_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};
|
\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] (dry_starter) -- (reactivate_freezer);
|
||||||
\path [line] (freeze_starter) -- (reactivate_freezer);
|
\path [line] (freeze_starter) -- (reactivate_freezer);
|
||||||
|
|||||||
@@ -1,19 +1,22 @@
|
|||||||
\begin{tikzpicture}[node distance = 3.5cm, auto]
|
\begin{tikzpicture}[node distance = 3.5cm, auto]
|
||||||
\node [start] (init) {Mix \qty{50}{\gram} flour + \qty{50}{\gram} water, stir};
|
\node [start] (start_n) {Mix \qty{50}{\gram} flour + \qty{50}{\gram} water, stir};
|
||||||
\node [block, right of=init] (wait2) {Wait\\ \qty{24}{\hour}};
|
\node [block, right of=start_n, node distance = 3.5cm] (wait_n) {Wait\\ \qty{24}{\hour}};
|
||||||
\path [line] (init) -- (wait2);
|
\node [decision, right of=wait_n, node distance = 3.5cm] (readycheck_n) {Ready?};
|
||||||
\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};
|
\node [block, below of=wait_n, node distance = 3.2cm] (feed_n) {Feed the mixture };
|
||||||
\path [line] (wait2) -- (feed);
|
\node [decision, right of=feed_n, node distance = 3.5cm] (limitcheck_n) {>10 feeds?};
|
||||||
\node [block, below of=feed] (discard) {Discard the rest};
|
\node [fail, right of=limitcheck_n, node distance = 3.5cm] (abort_n) {Discard all. Start over};
|
||||||
\path [line] (feed) -- (discard);
|
\node [success, right of=readycheck_n, node distance = 3.5cm] (final_n) {Ready to use};
|
||||||
\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?};
|
\draw [line] (start_n) -- (wait_n);
|
||||||
\node [fail, right of=timeout, node distance=3.5cm] (discard2) {Batch failed};
|
\draw [line] (wait_n) -- (readycheck_n);
|
||||||
\path [line] (timeout) -- node{no} (discard2);
|
\draw [line] (feed_n) -- (wait_n);
|
||||||
\path [line] (timeout) -- node{yes} (wait2);
|
\draw [line] (readycheck_n) -- node {No} (limitcheck_n);
|
||||||
\path [line] (feed) -- (decide);
|
\draw [line] (limitcheck_n) -- node (feedok_n) {No} (feed_n) ;
|
||||||
\node [success, right of=decide, node distance=3.5cm] (use) {Ready to use};
|
\draw [line] (limitcheck_n) -- node {Yes} (abort_n);
|
||||||
\path [line] (decide) -- node{no} (timeout);
|
\draw [line] (readycheck_n) -- node {Yes} (final_n);
|
||||||
\path [line] (wait2) -- (feed);
|
|
||||||
\path [line] (decide) -- node{yes} (use);
|
\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}
|
\end{tikzpicture}
|
||||||
|
|||||||
@@ -23,16 +23,16 @@
|
|||||||
{Prepare dough};
|
{Prepare dough};
|
||||||
|
|
||||||
\path [line] (init) -- (decision_start);
|
\path [line] (init) -- (decision_start);
|
||||||
\path [line] (decision_start) -- node{no} (feed_no_branch);
|
\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[below=2pt]{Yes} (feed_yes_branch.north west);
|
||||||
\path [line] (feed_yes_branch) -- (low_ratio);
|
\path [line] (feed_yes_branch) -- (low_ratio);
|
||||||
\path [line] (feed_no_branch) -- (high_ratio);
|
\path [line] (feed_no_branch) -- (high_ratio);
|
||||||
\path [line] (high_ratio) -- node[anchor=east, above=2pt] {} ++(2.2,0) |-(size_check);
|
\path [line] (high_ratio) -- node[anchor=east, above=2pt] {} ++(2.2,0) |-(size_check);
|
||||||
\path [line] (low_ratio) -- (size_check);
|
\path [line] (low_ratio) -- (size_check);
|
||||||
\path [line] (size_check) -- node{no} (feed_yes_branch.south east);
|
\path [line] (size_check) -- node{No} (feed_yes_branch.south east);
|
||||||
\path [line] (size_check) -- node{yes} (smell_check);
|
\path [line] (size_check) -- node{Yes} (smell_check);
|
||||||
\path [line] (smell_check) -- node{no} (feed_yes_branch.south west);
|
\path [line] (smell_check) -- node{No} (feed_yes_branch.south west);
|
||||||
\path [line] (smell_check) -- node{yes} (make_dough);
|
\path [line] (smell_check) -- node{Yes} (make_dough);
|
||||||
|
|
||||||
% braces
|
% braces
|
||||||
\draw[BC] (size_check.south) --
|
\draw[BC] (size_check.south) --
|
||||||
|
|||||||
@@ -11,14 +11,15 @@
|
|||||||
\path [line] (init) -- (feed_new_ratio);
|
\path [line] (init) -- (feed_new_ratio);
|
||||||
\path [line] (feed_again) -- (feed_new_ratio);
|
\path [line] (feed_again) -- (feed_new_ratio);
|
||||||
\path [line] (next_day) -- (ready_signs);
|
\path [line] (next_day) -- (ready_signs);
|
||||||
\path [line] (ready_signs) -- node{no} (feed_again |- last_feed) |- (feed_again.south);
|
\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{Yes} (last_feed);
|
||||||
\path [line] (last_feed) -- node{after \qtyrange{6}{12}{\hour}} (bread_dough);
|
\path [line] (last_feed) -- node{after \qtyrange{6}{12}{\hour}} (bread_dough);
|
||||||
\path [line] (feed_new_ratio) -- (too_dry);
|
\path [line] (feed_new_ratio) -- (too_dry);
|
||||||
\path [line] (add_water.north) -- node{} ++(0, 1.3) -| (too_dry.north);
|
\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{No} (next_day);
|
||||||
\path [line] (too_dry) -- node{yes} (add_water);
|
\path [line] (too_dry) -- node{Yes} (add_water);
|
||||||
\path [line] (ready_signs) -- node{yes} (last_feed);
|
\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};
|
\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}
|
\end{tikzpicture}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
\path [line] (mix_ingredients) -- (dough_strength);
|
\path [line] (mix_ingredients) -- (dough_strength);
|
||||||
\path [line] (dough_strength) -- (bulk);
|
\path [line] (dough_strength) -- (bulk);
|
||||||
\path [line] (bulk) -- (divide_test);
|
\path [line] (bulk) -- (divide_test);
|
||||||
\path [line] (divide_test) -- node{yes} (shape);
|
\path [line] (divide_test) -- node{Yes} (shape);
|
||||||
\path [line] (divide_test) -- node{no} (divide);
|
\path [line] (divide_test) -- node{No} (divide);
|
||||||
\path [line] (divide) -- (preshape);
|
\path [line] (divide) -- (preshape);
|
||||||
\path [line] (preshape) -- (shape);
|
\path [line] (preshape) -- (shape);
|
||||||
\path [line] (shape) -- (proof);
|
\path [line] (shape) -- (proof);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
\tikzstyle{every picture}+=[font=\footnotesize\sffamily]
|
\tikzstyle{every picture}+=[font=\footnotesize\sffamily]
|
||||||
\usetikzlibrary{calc, shapes, arrows, decorations.pathreplacing, calligraphy,
|
\usetikzlibrary{calc, shapes, arrows.meta, decorations.pathreplacing, calligraphy,
|
||||||
positioning}
|
positioning}
|
||||||
\tikzstyle{decision} = [diamond, draw=codeblack, fill=codeblack, text=white,
|
\tikzstyle{decision} = [diamond, draw=codeblack, fill=codeblack, text=white,
|
||||||
text width=4.5em, text badly centered, node distance=3cm, inner sep=0pt,
|
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,
|
\tikzstyle{fail} = [rectangle, draw=codeblack, fill=redpic, text=black,
|
||||||
text width=5em, text centered, rounded corners, minimum height=4em,
|
text width=5em, text centered, rounded corners, minimum height=4em,
|
||||||
line width=0.4mm]
|
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
|
\tikzstyle{BC} = [decorate, % Brace Calligraphic
|
||||||
decoration={calligraphic brace, amplitude=3mm, raise=1mm},
|
decoration={calligraphic brace, amplitude=3mm, raise=1mm},
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
\documentclass[tikz]{standalone}
|
\documentclass[tikz]{standalone}
|
||||||
\usepackage{tikz}
|
\usepackage{tikz}
|
||||||
|
\usepackage{pgfplots}
|
||||||
|
\usepackage{chemfig}
|
||||||
\usepackage[mode=match, reset-text-family=false]{siunitx}
|
\usepackage[mode=match, reset-text-family=false]{siunitx}
|
||||||
\DeclareSIUnit\degF{\text{°}F}
|
\DeclareSIUnit\degF{\text{°}F}
|
||||||
\input{flowcharts_tikz.tex}
|
\input{flowcharts_tikz.tex}
|
||||||
\input{../colors.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
|
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
|
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
|
CLEAN := latexmk -cd -lualatex -c -use-make
|
||||||
CHECK_1 := lacheck
|
CHECK_1 := lacheck
|
||||||
CHECK_2 := chktex
|
CHECK_2 := chktex
|
||||||
@@ -13,7 +13,6 @@ REDUCE_PIC_COLOR := -quality 80\%
|
|||||||
RSYNC := rsync -au --exclude 'book.epub' --exclude '*.jpg'
|
RSYNC := rsync -au --exclude 'book.epub' --exclude '*.jpg'
|
||||||
GIT := git --no-pager
|
GIT := git --no-pager
|
||||||
SPELL_CHECK := hunspell -t -l -d en_US
|
SPELL_CHECK := hunspell -t -l -d en_US
|
||||||
EPUBSIZE := `du -sb epub/low_res_book.epub | cut -f1`
|
|
||||||
|
|
||||||
# We want bash as shell
|
# We want bash as shell
|
||||||
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
|
SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
|
||||||
@@ -25,25 +24,35 @@ LATEX += -diagnostics
|
|||||||
EBOOK += -a debug
|
EBOOK += -a debug
|
||||||
WEBSITE += -a debug
|
WEBSITE += -a debug
|
||||||
endif
|
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\
|
chapters = baking basics bread-types cover flour-types history intro mix-ins\
|
||||||
non-wheat-sourdough sourdough-starter storing-bread troubleshooting\
|
non-wheat-sourdough sourdough-starter storing-bread troubleshooting\
|
||||||
wheat-sourdough glossary
|
wheat-sourdough glossary
|
||||||
|
|
||||||
src_tables := $(wildcard tables/table-*.tex)
|
# Actual book text and LaTeX code {{{
|
||||||
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)
|
|
||||||
|
|
||||||
src_tex := $(foreach directory, $(chapters), $(wildcard $(directory)/*.tex))
|
src_tex := $(foreach directory, $(chapters), $(wildcard $(directory)/*.tex))
|
||||||
src_tex += book.tex book_sans_serif.tex references.bib figures/vars.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)
|
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/*.jpg)
|
images += $(wildcard images/*.jpg)
|
||||||
images += $(wildcard images/*.png)
|
images += $(wildcard images/*.png)
|
||||||
@@ -57,55 +66,47 @@ images += $(foreach directory, $(chapters), $(wildcard $(directory)/*/*.png))
|
|||||||
# images to lower resolution and greyscale
|
# images to lower resolution and greyscale
|
||||||
bw_images := $(addprefix bw-book-epub/OEBPS/, $(images))
|
bw_images := $(addprefix bw-book-epub/OEBPS/, $(images))
|
||||||
|
|
||||||
# For lower res colour ebook we would not convert png as it only get worst
|
# For lower resolution colour ebook (see below) we will not convert png as it
|
||||||
# we will copy them instead... so remove them as a dependency.
|
# 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 := $(addprefix low-res-book-epub/OEBPS/, $(images))
|
||||||
low_res_images := $(filter-out %.png, $(low_res_images))
|
low_res_images := $(filter-out %.png, $(low_res_images))
|
||||||
|
# }}}
|
||||||
|
|
||||||
|
# All together.
|
||||||
src_all := $(src_tex) $(src_figures) $(src_tables) $(images) $(src_plots)
|
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
|
ebook_src := $(src_all) tex4ebook.cfg book.mk4 book-ebook.css
|
||||||
|
|
||||||
website_src := $(src_all) website.cfg style.css
|
website_src := $(src_all) website.cfg style.css
|
||||||
|
website_dir := static_website_html
|
||||||
# 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_assets := $(wildcard ../website/assets/*)
|
website_assets := $(wildcard ../website/assets/*)
|
||||||
ruby_src := ../website/modify_build.rb $(website_assets)
|
ruby_src := ../website/modify_build.rb $(website_assets)
|
||||||
ruby_pkg := ../website/Gemfile ../website/Gemfile.lock
|
ruby_pkg := ../website/Gemfile ../website/Gemfile.lock
|
||||||
|
|
||||||
tgt_figures := $(patsubst %.tex, %.png,$(src_figures))
|
# This is more than what is actually needed but keeps the makefile simple
|
||||||
|
booklet_src := $(src_figures) $(src_tables) $(src_recipes) $(images)
|
||||||
# Default target is not all because most of the time we just want a pdf...
|
booklet_src += booklet.tex
|
||||||
# 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) $<
|
|
||||||
|
|
||||||
|
# Flowcharts {{{
|
||||||
# TODO: check if it works on github CI
|
# TODO: check if it works on github CI
|
||||||
%.png: %.tex
|
%.png: %.tex
|
||||||
@echo "\input{./vars.tex}" > $@.in
|
@printf '%s\n' "\input{./vars.tex}" > $@.in
|
||||||
# \b is backspace..
|
@printf '%s\n' "\begin{document}" >> $@.in
|
||||||
@echo "\\\begin{document}" >> $@.in
|
|
||||||
@cat $< >> $@.in
|
@cat $< >> $@.in
|
||||||
@echo "\\\end{document}" >> $@.in
|
@printf '%s\n' "\end{document}" >> $@.in
|
||||||
$(LATEX) $@.in
|
$(LATEX) $@.in
|
||||||
figures/export_figures.sh $@.pdf
|
figures/export_figures.sh $@.pdf
|
||||||
|
|
||||||
%.xbb: %.jpg
|
%.xbb: %.jpg
|
||||||
ebb -x $<
|
ebb -x $<
|
||||||
|
# }}}
|
||||||
|
|
||||||
# We don't want to use latexmk as there is no biber nor references and it
|
# pdf {{{
|
||||||
# seems to make it somehow unhappy
|
# Default rules for pdf, getting overwritten when built in a sub-directory
|
||||||
booklet/booklet.pdf: $(booklet_src)
|
%.pdf: %.tex
|
||||||
mkdir -p booklet
|
$(LATEX) $<
|
||||||
lualatex --output-directory=booklet booklet.tex
|
|
||||||
|
|
||||||
book_serif/book.pdf: $(src_all)
|
book_serif/book.pdf: $(src_all)
|
||||||
$(LATEX) -output-directory=book_serif book.tex
|
$(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)
|
book_sans_serif/book_sans_serif.pdf: $(src_all)
|
||||||
$(LATEX) -output-directory=book_sans_serif book_sans_serif.tex
|
$(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
|
epub/%.epub: %.tex $(ebook_src) cover/cover-page.xbb
|
||||||
$(EBOOK) $<
|
$(EBOOK) $<
|
||||||
|
|
||||||
copy_ebook_files: build_ebook
|
copy_ebook_files: build_ebook
|
||||||
$(RSYNC) --exclude '*.png' epub_build/book-epub/ bw-book-epub/
|
$(RSYNC) --exclude '*.png' epub_build/book-epub/ bw-book-epub/
|
||||||
|
|
||||||
copy_ebook_files_low_res: build_ebook
|
# Now that we have built the ebook we will generate 2 more versions
|
||||||
$(RSYNC) epub_build/book-epub/ low-res-book-epub/
|
#
|
||||||
|
# 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
|
# We do not convert SVG to B&W or lower res for now as they are super small
|
||||||
# anyway
|
# anyway
|
||||||
@@ -134,120 +147,107 @@ bw-book-epub/OEBPS/%.png: %.png
|
|||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
$(CONVERT_PIC) $< $(REDUCE_PIC) $@
|
$(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)
|
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 -q0X ../epub/bw_book.epub mimetype
|
||||||
cd bw-book-epub; zip -q9XrD ../epub/bw_book.epub ./
|
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)
|
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 -q0X ../epub/low_res_book.epub mimetype
|
||||||
cd low-res-book-epub; zip -q9XrD ../epub/low_res_book.epub ./
|
cd low-res-book-epub; zip -q9XrD ../epub/low_res_book.epub ./
|
||||||
|
#}}}
|
||||||
|
|
||||||
# Now with the rules
|
# Website {{{
|
||||||
# Expected usual rules first
|
###################################
|
||||||
|
.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
|
.PHONY: all
|
||||||
all: bake
|
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)
|
# 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
|
release_sans_serif: sans_serif | release
|
||||||
# Requires that you have docker running on your computer.
|
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
||||||
export_figures: build_pdf $(tgt_figures)
|
|
||||||
cd figures/ && bash export_figures.sh
|
|
||||||
|
|
||||||
# Goal is not really to have 0 warning reported but we should check we don't
|
release_booklet: booklet | release
|
||||||
# add many and if we do, we know they are false positive
|
cp booklet/booklet.pdf release/TheBreadCode-The-Sourdough-Framework-booklet.pdf
|
||||||
check: spell-check tex-check
|
# }}}
|
||||||
|
|
||||||
tex-check: $(src_tex)
|
# Clean up {{{
|
||||||
@echo "Running: " $(CHECK_1)
|
###################################
|
||||||
$(CHECK_1) book.tex
|
|
||||||
@echo ""
|
|
||||||
@echo "Running: " $(CHECK_2)
|
|
||||||
$(CHECK_2) book.tex
|
|
||||||
|
|
||||||
spell-check: $(src_tex) spelling_exceptions.txt
|
# delete generated files
|
||||||
# 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
|
|
||||||
.PHONY: clean_figures clean_ebook_build clean_website_build clean mrproper
|
.PHONY: clean_figures clean_ebook_build clean_website_build clean mrproper
|
||||||
clean_figures:
|
clean_figures:
|
||||||
-$(CLEAN) $(patsubst %.tex, %.png.in, $(src_figures))
|
-$(CLEAN) $(patsubst %.tex, %.png.in, $(src_figures))
|
||||||
@@ -292,52 +292,92 @@ mrproper: clean
|
|||||||
-rm -rf epub_build/
|
-rm -rf epub_build/
|
||||||
-rm -rf website_build/
|
-rm -rf website_build/
|
||||||
-rm -rf $(website_dir)
|
-rm -rf $(website_dir)
|
||||||
|
#}}}
|
||||||
|
|
||||||
# top level releases rules
|
# Help {{{
|
||||||
.PHONY: bake release_serif release_sans_serif
|
###################################
|
||||||
|
.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:
|
# Verify your spelling and TeX warnings {{{
|
||||||
mkdir -p release
|
.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
|
tex-check: $(src_tex)
|
||||||
cp book_serif/book.pdf release/TheBreadCode-The-Sourdough-Framework.pdf
|
@echo "Running: " $(CHECK_1)
|
||||||
cp epub/bw_book.epub release/TheBreadCode-The-Sourdough-Framework-black-and-white.epub
|
$(CHECK_1) book.tex
|
||||||
cp epub/low_res_book.epub release/TheBreadCode-The-Sourdough-Framework.epub
|
@echo ""
|
||||||
@if [ $(EPUBSIZE) -gt 49500000 ]; then \
|
@echo "Running: " $(CHECK_2)
|
||||||
echo "ERROR: epub File too big"; \
|
$(CHECK_2) book.tex
|
||||||
exit 1; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
release_sans_serif: build_sans_serif_pdf | release
|
# Should be 0 if not and you are really sure update the exception file
|
||||||
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
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
|
.PHONY: quick quick_ebook show_tools_version printvars
|
||||||
|
|
||||||
# Those 2 targets allow fast debug cycles but not resolving references etc
|
# Those 2 targets allow fast debug cycles but not resolving references etc
|
||||||
# They also ignore dependencies and run each time you call them.
|
# They also ignore dependencies and run each time you call them.
|
||||||
quick: # run latex only once no biber, no references etc...
|
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...
|
quick_ebook: cover/cover-page.xbb # run latex only once no biber, ref etc...
|
||||||
$(EBOOK) --mode draft book.tex
|
$(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
|
- $(GIT) log -1 --pretty=%B
|
||||||
@echo ""
|
@echo ""
|
||||||
- uname -a
|
- uname -a
|
||||||
@@ -384,6 +424,7 @@ show_tools_version: # Show version of tools used on the build machine
|
|||||||
- $(CONVERT_PIC) --version
|
- $(CONVERT_PIC) --version
|
||||||
@echo ""
|
@echo ""
|
||||||
- rsync --version
|
- rsync --version
|
||||||
|
# }}}
|
||||||
|
|
||||||
# You can find the value of variable X with the following command:
|
# You can find the value of variable X with the following command:
|
||||||
# make print-X
|
# make print-X
|
||||||
@@ -393,3 +434,4 @@ printvars: # Print all variables in the makefile
|
|||||||
@$(foreach V,$(sort $(.VARIABLES)), \
|
@$(foreach V,$(sort $(.VARIABLES)), \
|
||||||
$(if $(filter-out environ% default automatic, \
|
$(if $(filter-out environ% default automatic, \
|
||||||
$(origin $V)),$(info $V=$($V) ($(value $V)))))
|
$(origin $V)),$(info $V=$($V) ($(value $V)))))
|
||||||
|
# }}}
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ to express yourself.
|
|||||||
\begin{figure}[htb!]
|
\begin{figure}[htb!]
|
||||||
\centering
|
\centering
|
||||||
\includegraphics[width=\textwidth]{pumpkin-on-flour}
|
\includegraphics[width=\textwidth]{pumpkin-on-flour}
|
||||||
\caption[Pumpkin puré]{A common mix-in technique is to replace some of
|
\caption[Pumpkin purée]{A popular method is to substitute part of the
|
||||||
the dough's water with another liquid. In this case, puréd pumpkin replaced
|
dough's water with another liquid, such as puréed pumpkin. When
|
||||||
some of the water. When adding puré to the dough only slowly add
|
incorporating the purée, add any extra water gradually, as the purée
|
||||||
additional water as the puré slowly releases additional water to the
|
will release its own liquid into the dough over time.}%
|
||||||
dough.}%
|
\label{fig:pumpkin-on-flour}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
One approach to categorizing the mixins is to look at their respective shape.
|
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},
|
major grid style={line width=.2pt,draw=gray!30},
|
||||||
axis x line=middle,
|
axis x line=middle,
|
||||||
axis y line=middle,
|
axis y line=middle,
|
||||||
|
axis line style={-Latex},
|
||||||
width=\textwidth,
|
width=\textwidth,
|
||||||
height=0.5\textwidth,
|
height=0.5\textwidth,
|
||||||
xmax=35, xmin=-0.1,
|
xmax=35, xmin=-0.1,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
major grid style={line width=.2pt,draw=gray!30},
|
major grid style={line width=.2pt,draw=gray!30},
|
||||||
axis x line=middle,
|
axis x line=middle,
|
||||||
axis y line=middle,
|
axis y line=middle,
|
||||||
|
axis line style={-Latex},
|
||||||
width=\textwidth,
|
width=\textwidth,
|
||||||
height=0.5\textwidth,
|
height=0.5\textwidth,
|
||||||
xmax=35, xmin=-0.1,
|
xmax=35, xmin=-0.1,
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
\qty{60}{\percent}~hydration},
|
\qty{60}{\percent}~hydration},
|
||||||
axis x line=middle,
|
axis x line=middle,
|
||||||
axis y line=middle,
|
axis y line=middle,
|
||||||
|
axis line style={-Latex},
|
||||||
width=\textwidth,
|
width=\textwidth,
|
||||||
height=0.5\textwidth,
|
height=0.5\textwidth,
|
||||||
xmax=44, xmin=-0.1,
|
xmax=44, xmin=-0.1,
|
||||||
|
|||||||
@@ -34,9 +34,7 @@
|
|||||||
\DeclareTOCStyleEntry[numwidth=3em]{tocline}{table}
|
\DeclareTOCStyleEntry[numwidth=3em]{tocline}{table}
|
||||||
|
|
||||||
% Common abbreviations
|
% Common abbreviations
|
||||||
\newcommand{\ie}{\emph{i.e.}\@ifnextchar.{\!\@gobble}{}}
|
\input{abbreviations.tex}
|
||||||
\newcommand{\eg}{\emph{e.g.}\@ifnextchar.{\!\@gobble}{}}
|
|
||||||
\newcommand{\etc}{etc\@ifnextchar.{}{.\@}}
|
|
||||||
|
|
||||||
% Consistent pH values
|
% Consistent pH values
|
||||||
\newcommand{\pHvalue}[1]{pH~\SI{#1}{}}
|
\newcommand{\pHvalue}[1]{pH~\SI{#1}{}}
|
||||||
@@ -54,8 +52,9 @@
|
|||||||
\DeclareRobustCommand\sbseries{\fontseries{sb}\selectfont}
|
\DeclareRobustCommand\sbseries{\fontseries{sb}\selectfont}
|
||||||
% Fonts for accessibility
|
% Fonts for accessibility
|
||||||
\ifdefined\isaccessible
|
\ifdefined\isaccessible
|
||||||
\setmainfont{Open Sans}[
|
\usepackage[mathrm=sym]{unicode-math}
|
||||||
Scale=MatchLowercase]
|
\setmathfont{Fira Math}[Scale=MatchLowercase]
|
||||||
|
\setmainfont{Open Sans}[Scale=MatchLowercase]
|
||||||
\else
|
\else
|
||||||
\setmainfont{TeX Gyre Pagella}[Scale=1.0] % Or Palatino Linotype, etc.
|
\setmainfont{TeX Gyre Pagella}[Scale=1.0] % Or Palatino Linotype, etc.
|
||||||
% TODO not available on github CI
|
% TODO not available on github CI
|
||||||
|
|||||||
@@ -483,8 +483,6 @@ poolish
|
|||||||
pre
|
pre
|
||||||
preshape
|
preshape
|
||||||
preshaping
|
preshaping
|
||||||
puré
|
|
||||||
puréd
|
|
||||||
purée
|
purée
|
||||||
pâte
|
pâte
|
||||||
raffaella
|
raffaella
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ later time.
|
|||||||
\end{quoting}
|
\end{quoting}
|
||||||
|
|
||||||
A summary can be found in Table~\ref{table:bread-storage}, with details and
|
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]
|
\begin{table}[!htb]
|
||||||
\centering
|
\centering
|
||||||
\input{tables/table-storing-bread-overview.tex}
|
\input{tables/table-storing-bread-overview.tex}
|
||||||
@@ -120,4 +120,4 @@ A 2008 study hints that there might be some health
|
|||||||
benefits to freezing and toasting your bread. By doing so
|
benefits to freezing and toasting your bread. By doing so
|
||||||
the starch molecules could become more resistant to digestion
|
the starch molecules could become more resistant to digestion
|
||||||
and thus lower your body's blood sugar
|
and thus lower your body's blood sugar
|
||||||
response by almost 40\%~\cite{freezing+toasting+bread}.
|
response by almost 40\%~\cite{freezing+toasting+bread}.
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;800&display=swap');
|
|
||||||
|
|
||||||
:root{
|
:root{
|
||||||
--ff-sans: 'Open Sans', sans-serif;
|
--ff-sans: 'Open Sans', sans-serif;
|
||||||
--fw-regular: 400;
|
--fw-regular: 400;
|
||||||
@@ -147,7 +145,6 @@ nav.TOC a, nav.TOC a:visited{
|
|||||||
/* *** Colors *** */
|
/* *** Colors *** */
|
||||||
/* ************** */
|
/* ************** */
|
||||||
|
|
||||||
|
|
||||||
body{
|
body{
|
||||||
background-color: var(--c-beige);
|
background-color: var(--c-beige);
|
||||||
}
|
}
|
||||||
@@ -254,6 +251,10 @@ figcaption.caption {
|
|||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chapterToc a, .chapterToc, .likechapterToc a, .likechapterToc, .appendixToc a, .appendixToc, .addchapToc a {
|
||||||
|
font-weight: var(--fw-bold);
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.toggle-menu-label {
|
.toggle-menu-label {
|
||||||
display: block;
|
display: block;
|
||||||
@@ -317,7 +318,7 @@ figcaption.caption {
|
|||||||
display: block;
|
display: block;
|
||||||
color: #000;
|
color: #000;
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
font-weight: bold;
|
font-weight: var(--fw-bold);
|
||||||
}
|
}
|
||||||
|
|
||||||
.chapterToc a, .sectionToc a, .subsectionToc a, .likechapterToc a {
|
.chapterToc a, .sectionToc a, .subsectionToc a, .likechapterToc a {
|
||||||
@@ -498,7 +499,7 @@ blockquote {
|
|||||||
border: 2px solid var(--c-black);
|
border: 2px solid var(--c-black);
|
||||||
color: var(--c-black);
|
color: var(--c-black);
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
font-weight: bold;
|
font-weight: var(--fw-bold);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
.crosslinks-bottom a.prev {
|
.crosslinks-bottom a.prev {
|
||||||
|
|||||||
@@ -11,4 +11,12 @@
|
|||||||
\Configure{AddCss}{book-ebook.css}
|
\Configure{AddCss}{book-ebook.css}
|
||||||
\Configure{CoverMimeType}{image/jpeg}
|
\Configure{CoverMimeType}{image/jpeg}
|
||||||
\CoverMetadata{cover/cover-page.jpg}
|
\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
|
\EndPreamble
|
||||||
|
|||||||
@@ -9,6 +9,14 @@
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
\Configure{AddCss}{style.css}
|
\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>}}{}{}
|
\ConfigureEnv{titlepage}{\ifvmode\IgnorePar\fi\EndP\HCode{<main class="titlepage">}}{\ifvmode\IgnorePar\fi\EndP\HCode{</main>}}{}{}
|
||||||
|
|
||||||
% Mini TOC
|
% Mini TOC
|
||||||
|
|||||||
@@ -405,7 +405,7 @@ your dough. The warmer the temperature, the faster the process; the colder, the
|
|||||||
slower the process.
|
slower the process.
|
||||||
|
|
||||||
While food is available, the microorganisms will reproduce and increase in
|
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
|
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
|
the yeast ultimately sporulates and dies as ethanol levels increase. The ethanol creates an
|
||||||
environment that makes it impossible for other
|
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
|
bread dough is essentially a gigantic starter. The low inoculation rate allows
|
||||||
the starter to regrow inside your main dough into a desirable balance.
|
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
|
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.
|
This greatly simplifies the whole process.
|
||||||
|
|
||||||
\section{Autolysis}%
|
\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
|
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
|
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
|
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
|
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
|
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}.
|
a more extensible dough with lower-gluten flour~\cite{bassinage+technique}.
|
||||||
|
|
||||||
When machine kneading a dough, opt for the same technique shown in
|
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.
|
speed. This helps the homogenization process.
|
||||||
After waiting to allow the flour to soak up the water, proceed on a higher speed
|
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
|
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
|
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
|
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
|
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
|
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
|
doughs. See Table~\ref{table:sample-ph-values} for some sample pH values
|
||||||
to follow.
|
to follow.
|
||||||
@@ -1610,7 +1610,7 @@ banneton should now be facing you.
|
|||||||
\label{fig:artistic-scoring}
|
\label{fig:artistic-scoring}
|
||||||
\end{figure}
|
\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
|
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.
|
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.
|
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
|
docker push $(DOCKER_IMAGE):latest
|
||||||
|
|
||||||
# Books/website
|
# Books/website
|
||||||
build_serif_pdf:
|
serif_pdf:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_serif_pdf"
|
$(DOCKER_CMD) "cd /opt/repo/book && make serif_pdf"
|
||||||
|
|
||||||
build_ebook:
|
ebook:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_ebook"
|
$(DOCKER_CMD) "cd /opt/repo/book && make ebook"
|
||||||
|
|
||||||
build_pdf:
|
pdf:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make"
|
$(DOCKER_CMD) "cd /opt/repo/book && make"
|
||||||
|
|
||||||
bake:
|
bake:
|
||||||
@@ -31,7 +31,7 @@ website:
|
|||||||
$(DOCKER_CMD) "cd /opt/repo/book && make website"
|
$(DOCKER_CMD) "cd /opt/repo/book && make website"
|
||||||
|
|
||||||
booklet:
|
booklet:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make build_booklet"
|
$(DOCKER_CMD) "cd /opt/repo/book && make booklet"
|
||||||
|
|
||||||
mrproper:
|
mrproper:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make mrproper"
|
$(DOCKER_CMD) "cd /opt/repo/book && make mrproper"
|
||||||
@@ -48,3 +48,8 @@ print_os_version:
|
|||||||
|
|
||||||
start_shell:
|
start_shell:
|
||||||
docker run -it -v $(PWD):/opt/repo $(DOCKER_IMAGE) /bin/bash
|
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