Merge remote-tracking branch 'hendiricus/main' into 225-ebook-situation

This commit is contained in:
Cedric
2025-01-21 21:04:46 +00:00
29 changed files with 347 additions and 271 deletions

View File

@@ -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:

View File

@@ -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
View 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.{}{.\@}}

View File

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

View File

@@ -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);

View File

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

View File

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

View File

@@ -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);

View File

@@ -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);

View File

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

View File

@@ -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) --

View File

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

View File

@@ -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);

View File

@@ -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},

View File

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

View File

@@ -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)))))
# }}}

View File

@@ -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.

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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

View File

@@ -483,8 +483,6 @@ poolish
pre pre
preshape preshape
preshaping preshaping
puré
puréd
purée purée
pâte pâte
raffaella raffaella

View File

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

View File

@@ -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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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