mirror of
https://github.com/hendricius/the-sourdough-framework
synced 2025-11-08 20:21:12 -06:00
Merge remote-tracking branch 'hendiricus/main' into supporters
This commit is contained in:
56
.github/workflows/docker-build-push.yml
vendored
56
.github/workflows/docker-build-push.yml
vendored
@@ -1,56 +0,0 @@
|
|||||||
name: Create and publish a Docker image
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Log in to the Container registry
|
|
||||||
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Figure out branch name
|
|
||||||
shell: bash
|
|
||||||
run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT
|
|
||||||
id: extract_branch
|
|
||||||
- name: Determine docker image tag
|
|
||||||
shell: bash
|
|
||||||
id: determine_tag
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
|
|
||||||
echo "tag=latest" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "tag=${{ steps.extract_branch.outputs.branch }}" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
||||||
# Buildx for caching
|
|
||||||
- uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Build and push Docker image
|
|
||||||
uses: docker/build-push-action@v5
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
push: true
|
|
||||||
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.determine_tag.outputs.tag }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
38
.github/workflows/release-book-website.yml
vendored
38
.github/workflows/release-book-website.yml
vendored
@@ -4,12 +4,36 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
env:
|
env:
|
||||||
IMAGE: ghcr.io/${{ github.repository }}:latest
|
LATEST_IMAGE: ghcr.io/${{ github.repository }}:latest
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-push-image:
|
build-and-push-image:
|
||||||
uses: ./.github/workflows/docker-build-push.yml
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# Buildx for caching
|
||||||
|
- uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Build and push Docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
push: true
|
||||||
|
tags: ghcr.io/${{ github.repository }}:latest
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
||||||
|
|
||||||
release-book-website:
|
release-book-website:
|
||||||
needs: build-and-push-image
|
needs: build-and-push-image
|
||||||
@@ -20,7 +44,7 @@ jobs:
|
|||||||
- name: Print dependency versions
|
- name: Print dependency versions
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ env.IMAGE }}
|
image: ${{ env.LATEST_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
@@ -28,7 +52,7 @@ jobs:
|
|||||||
- name: Print build variables
|
- name: Print build variables
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ env.IMAGE }}
|
image: ${{ env.LATEST_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
@@ -36,11 +60,11 @@ jobs:
|
|||||||
- name: Bake the book
|
- name: Bake the book
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ env.IMAGE }}
|
image: ${{ env.LATEST_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
make -j bake
|
make bake
|
||||||
- name: Release baked book to S3
|
- name: Release baked book to S3
|
||||||
uses: shallwefootball/s3-upload-action@master
|
uses: shallwefootball/s3-upload-action@master
|
||||||
with:
|
with:
|
||||||
@@ -60,7 +84,7 @@ jobs:
|
|||||||
- name: Bake the website
|
- name: Bake the website
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ env.IMAGE }}
|
image: ${{ env.LATEST_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
name: Test building book and website with custom image
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
uses: ./.github/workflows/docker-build-push.yml
|
|
||||||
|
|
||||||
test-building-book-website:
|
|
||||||
needs: build-and-push-image
|
|
||||||
uses: ./.github/workflows/test-book-website.yml
|
|
||||||
with:
|
|
||||||
docker-image: ghcr.io/${{ github.repository }}:${{ github.event.pull_request.head.ref }}
|
|
||||||
14
.github/workflows/test-book-website-push.yml
vendored
14
.github/workflows/test-book-website-push.yml
vendored
@@ -1,14 +0,0 @@
|
|||||||
name: Test building book and website with default image
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-image:
|
|
||||||
uses: ./.github/workflows/docker-build-push.yml
|
|
||||||
|
|
||||||
test-building-book-website:
|
|
||||||
needs: build-and-push-image
|
|
||||||
uses: ./.github/workflows/test-book-website.yml
|
|
||||||
with:
|
|
||||||
docker-image: ghcr.io/${{ github.repository }}:latest
|
|
||||||
18
.github/workflows/test-book-website.yml
vendored
18
.github/workflows/test-book-website.yml
vendored
@@ -1,11 +1,9 @@
|
|||||||
name: Test book and website for given image
|
name: Test book and website for given image
|
||||||
|
|
||||||
on:
|
on: [push, pull_request]
|
||||||
workflow_call:
|
|
||||||
inputs:
|
env:
|
||||||
docker-image:
|
DOCKER_IMAGE: ghcr.io/${{ github.repository }}:latest
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-book-website:
|
test-book-website:
|
||||||
@@ -16,7 +14,7 @@ jobs:
|
|||||||
- name: Print dependency versions
|
- name: Print dependency versions
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ inputs.docker-image }}
|
image: ${{ env.DOCKER_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
@@ -24,7 +22,7 @@ jobs:
|
|||||||
- name: Print build variables
|
- name: Print build variables
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ inputs.docker-image }}
|
image: ${{ env.DOCKER_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
@@ -32,7 +30,7 @@ jobs:
|
|||||||
- name: Test baking the release versions
|
- name: Test baking the release versions
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ inputs.docker-image }}
|
image: ${{ env.DOCKER_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
@@ -48,7 +46,7 @@ jobs:
|
|||||||
- name: Test building website
|
- name: Test building website
|
||||||
uses: addnab/docker-run-action@v3
|
uses: addnab/docker-run-action@v3
|
||||||
with:
|
with:
|
||||||
image: ${{ inputs.docker-image }}
|
image: ${{ env.DOCKER_IMAGE }}
|
||||||
options: -v ${{ github.workspace }}:/app
|
options: -v ${{ github.workspace }}:/app
|
||||||
run: |
|
run: |
|
||||||
cd /app/book
|
cd /app/book
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ LABEL org.opencontainers.image.source="https://github.com/hendricius/the-sourdou
|
|||||||
# Print release information if needed
|
# Print release information if needed
|
||||||
RUN cat /etc/*release*
|
RUN cat /etc/*release*
|
||||||
|
|
||||||
# Install base depdendencies
|
# Install base dependencies
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install --yes -y --no-install-recommends \
|
apt-get install --yes -y --no-install-recommends \
|
||||||
sudo \
|
sudo \
|
||||||
@@ -55,6 +55,11 @@ RUN wget https://github.com/mgieseki/dvisvgm/releases/download/3.1.2/dvisvgm-3.1
|
|||||||
make && \
|
make && \
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
RUN git clone https://github.com/michal-h21/make4ht.git && \
|
||||||
|
cd make4ht && \
|
||||||
|
make && \
|
||||||
|
make install
|
||||||
|
|
||||||
# Make sure everything is UTF-8
|
# Make sure everything is UTF-8
|
||||||
RUN echo "export LC_ALL=en_US.UTF-8" >> /root/.bashrc && \
|
RUN echo "export LC_ALL=en_US.UTF-8" >> /root/.bashrc && \
|
||||||
echo "export LANG=en_US.UTF-8" >> /root/.bashrc
|
echo "export LANG=en_US.UTF-8" >> /root/.bashrc
|
||||||
|
|||||||
@@ -84,6 +84,13 @@ size. This shrinks the book from more than 50MB 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)
|
||||||
|
|
||||||
|
If you prefer a very short version (about 10 pages) with main flowcharts and
|
||||||
|
crucial information needed while you are in the kitchen, we also provide a
|
||||||
|
"too long;didn't read" version you could print. Having read the full book is
|
||||||
|
highly recommended to understand this leaflet:
|
||||||
|
|
||||||
|
* [Download a condensed version](https://www.the-bread-code.io/booklet.pdf)
|
||||||
|
|
||||||
## Online HTML version
|
## Online HTML version
|
||||||
|
|
||||||
Head over to [https://www.the-sourdough-framework.com](https://www.the-sourdough-framework.com)
|
Head over to [https://www.the-sourdough-framework.com](https://www.the-sourdough-framework.com)
|
||||||
|
|||||||
@@ -18,12 +18,11 @@ rise, this is called oven spring. Your bread starts to build a crust of
|
|||||||
gel-like consistency, the crust is still extensible and can be stretched.
|
gel-like consistency, the crust is still extensible and can be stretched.
|
||||||
|
|
||||||
\begin{table}[htp!]
|
\begin{table}[htp!]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-baking-process-stages.tex}
|
\input{tables/table-baking-process-stages.tex}
|
||||||
\caption[Stages of dough during baking]{The different stages that
|
\caption[Stages of dough during baking]{The different stages that
|
||||||
your dough undergoes during the baking process.}%
|
your dough undergoes during the baking process.}%
|
||||||
\label{tab:baking-stages}
|
\label{tab:baking-stages}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
At around \qty{60}{\degreeCelsius} (\qty{140}{\degF}) the microbes in your dough start to die.
|
At around \qty{60}{\degreeCelsius} (\qty{140}{\degF}) the microbes in your dough start to die.
|
||||||
@@ -171,12 +170,11 @@ way.
|
|||||||
|
|
||||||
\section{Building up steam}
|
\section{Building up steam}
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-baking-process.tex}
|
\input{figures/fig-baking-process.tex}
|
||||||
\caption[Different steaming methods]{A schematic visualization of the baking
|
\caption[Different steaming methods]{A schematic visualization of the baking
|
||||||
process using different sources of steam in a home oven.}%
|
process using different sources of steam in a home oven.}%
|
||||||
\label{fig:baking-process}
|
\label{fig:baking-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
@@ -206,7 +204,7 @@ way.
|
|||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-dutch-oven-process.tex}
|
\input{figures/fig-dutch-oven-process.tex}
|
||||||
\caption[Baking process with a dutch oven]{A visualization of the baking
|
\caption[Baking process with a dutch oven]{A visualization of the baking
|
||||||
process using a dutch oven (DO). The dough is steamed for the first half
|
process using a dutch oven (DO). The dough is steamed for the first half
|
||||||
@@ -215,7 +213,6 @@ way.
|
|||||||
personal preference. Some bakers prefer a lighter crust and others a
|
personal preference. Some bakers prefer a lighter crust and others a
|
||||||
darker.}%
|
darker.}%
|
||||||
\label{fig:dutch-oven-process}
|
\label{fig:dutch-oven-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
Dutch ovens are an ideal way to bake with a lot of
|
Dutch ovens are an ideal way to bake with a lot of
|
||||||
@@ -277,12 +274,11 @@ created from the dough and water source stays
|
|||||||
around your dough.
|
around your dough.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-inverted-tray-method.tex}
|
\input{figures/fig-inverted-tray-method.tex}
|
||||||
\caption[Inverted tray baking process]{A schematic visualization the
|
\caption[Inverted tray baking process]{A schematic visualization the
|
||||||
inverted tray baking method that works great for home ovens.}%
|
inverted tray baking method that works great for home ovens.}%
|
||||||
\label{fig:inverted-tray-process}
|
\label{fig:inverted-tray-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
|
|
||||||
@@ -335,11 +331,10 @@ crust color. In my case this is another 15--25~minutes typically.
|
|||||||
\section{Conclusions}
|
\section{Conclusions}
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-oven-baking-overview.tex}
|
\input{tables/table-oven-baking-overview.tex}
|
||||||
\caption[Different oven types]{An overview of different oven types and their
|
\caption[Different oven types]{An overview of different oven types and their
|
||||||
different baking methods.}
|
different baking methods.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Depending on your home oven, a different method
|
Depending on your home oven, a different method
|
||||||
|
|||||||
@@ -223,12 +223,11 @@ exception, skip ahead to the end of this section on
|
|||||||
page~\pageref{aggressive-yeast}.}
|
page~\pageref{aggressive-yeast}.}
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=0.8\textwidth]{saccharomyces-cerevisiae-microscope}
|
\includegraphics[width=0.8\textwidth]{saccharomyces-cerevisiae-microscope}
|
||||||
\caption[Brewer's yeast]{Saccharomyces cerevisiae: Brewer's yeast under the
|
\caption[Brewer's yeast]{Saccharomyces cerevisiae: Brewer's yeast under the
|
||||||
microscope.}%
|
microscope.}%
|
||||||
\label{saccharomyces-cerevisiae-microscope}
|
\label{saccharomyces-cerevisiae-microscope}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Yeasts are saprotrophic fungi. This means that they do not produce their own
|
Yeasts are saprotrophic fungi. This means that they do not produce their own
|
||||||
|
|||||||
174
book/booklet.tex
Normal file
174
book/booklet.tex
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
\documentclass[paper=a4, twoside=false, fontsize=12pt]{scrbook}
|
||||||
|
|
||||||
|
% General packages
|
||||||
|
\usepackage{sourdough}
|
||||||
|
\usepackage[
|
||||||
|
paperwidth=210mm,
|
||||||
|
paperheight=260mm,
|
||||||
|
top=10mm,
|
||||||
|
bottom=80mm,
|
||||||
|
inner=10mm,
|
||||||
|
outer=10mm,
|
||||||
|
marginparsep=7mm,
|
||||||
|
marginparwidth=48mm,
|
||||||
|
]{geometry}
|
||||||
|
\usepackage{subcaption}
|
||||||
|
|
||||||
|
\pagenumbering{gobble}
|
||||||
|
% Basic attributes
|
||||||
|
\author{Hendrik Kleinwächter}
|
||||||
|
\title{The Sourdough Framework\\\texttt{tl;dr Booklet Version}}
|
||||||
|
\begin{document}
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
\section*{Sourdough starter}
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-starter-process.tex}
|
||||||
|
\caption*{How to setup a sourdough starter}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-starter-readiness.tex}
|
||||||
|
\caption*{Preparing your starter for baking}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-starter-maintenance.tex}
|
||||||
|
\caption*{Maintaining your starter, change ratio as per starter hydration
|
||||||
|
type}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\clearpage{}
|
||||||
|
\section*{Baker's math}
|
||||||
|
\begin{table}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{tables/table-bakers-math-example.tex}
|
||||||
|
\caption*{An example table demonstrating how to properly calculate using
|
||||||
|
baker's math. All the ingredients are calculated as a percentage of the
|
||||||
|
flour quantity.}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\section*{Basic recipes}
|
||||||
|
\subsection*{Flat bread}
|
||||||
|
\input{recipes/flat-bread.tex}
|
||||||
|
\clearpage{}
|
||||||
|
|
||||||
|
\subsection*{Freestanding \& sandwich wheat-based breads}
|
||||||
|
\begin{table}[!htb]
|
||||||
|
\centering
|
||||||
|
\begin{tabular}{@{}lrrrp{0.4\linewidth}@{}}
|
||||||
|
\toprule
|
||||||
|
\thead{Ingredient}& & \thead{Percentage} & \thead{Calculation} & \thead{Comments} \\ \midrule
|
||||||
|
Flour & \qty{400}{g} & & & \\
|
||||||
|
Whole-wheat flour & \qty{100}{g} & & & \\
|
||||||
|
Total flour & & \qty{100}{\percent} & \qty{500}{g} & \\
|
||||||
|
Water & & \qty{60}{\percent} & \qty{300}{g} & \\
|
||||||
|
Sourdough starter & & \qty{10}{\percent} & \qty{50}{g} & \\
|
||||||
|
Salt & & \qty{2}{\percent} & \qty{10}{g} & \\ \midrule
|
||||||
|
Flour & & \qty{100}{\percent} & & \\
|
||||||
|
Water & & & & \\
|
||||||
|
Sourdough starter & & & & \\
|
||||||
|
Salt & & & & \\ \midrule
|
||||||
|
Flour & & & & \\
|
||||||
|
& & & & \\
|
||||||
|
& & & & \\
|
||||||
|
& & & & \\
|
||||||
|
& & & & \\ \bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\caption*{Table for your own calculation using baker's math}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-wheat-sourdough-process.tex}
|
||||||
|
\caption*{The whole process of making wheat based sourdough breads}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-kneading-process.tex}
|
||||||
|
\caption*{The kneading process to create dough strength}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-bulk-fermentation.tex}
|
||||||
|
\caption*{How to properly manage bulk fermentation}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{figure*}[!htb]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{stretch-and-fold-steps}
|
||||||
|
\caption*{An overview of the steps involved to perform stretch and folds for
|
||||||
|
wheat-based doughs. They are optional and should only be done when the dough
|
||||||
|
flattened out a lot.}%
|
||||||
|
\end{figure*}
|
||||||
|
\clearpage{}
|
||||||
|
|
||||||
|
\section*{Shaping}
|
||||||
|
|
||||||
|
\begin{figure*}[!htb]
|
||||||
|
\centering
|
||||||
|
\begin{subfigure}{.475\linewidth}
|
||||||
|
\includegraphics[width=\linewidth]{preshape-direction}
|
||||||
|
\caption*{Preshaping: Drag the dough in the direction of the rough
|
||||||
|
surface area.}%
|
||||||
|
\end{subfigure}
|
||||||
|
\begin{subfigure}{.475\linewidth}
|
||||||
|
\includegraphics[width=\linewidth]{step-1-flour-applied}
|
||||||
|
\caption*{Step 1: Apply flour to the dough's surface.}%
|
||||||
|
\end{subfigure}\hfill % <-- "\hfill"
|
||||||
|
\medskip % create some *vertical* separation between the graphs
|
||||||
|
\begin{subfigure}{.475\linewidth}
|
||||||
|
\includegraphics[width=\linewidth]{step-2-flipped-over}
|
||||||
|
\caption*{Step 2: Flipp-over dough. Note how the sticky side is facing
|
||||||
|
you while the floured side is facing the countertop.}
|
||||||
|
\end{subfigure}\hfill % <-- "\hfill"
|
||||||
|
\begin{subfigure}{.475\linewidth}
|
||||||
|
\includegraphics[width=\linewidth]{step-3-rectangular}
|
||||||
|
\caption*{Step 3: Make the dough rectangular, keep the sticky side
|
||||||
|
facing you while the floured side is facing the countertop.}%
|
||||||
|
\end{subfigure}
|
||||||
|
\caption*{First steps of shaping process}
|
||||||
|
\end{figure*}
|
||||||
|
|
||||||
|
\begin{figure*}[htb!]
|
||||||
|
\centering
|
||||||
|
\includegraphics[width=\textwidth]{step-4-folding}
|
||||||
|
\caption*{Step 4: The process of folding a batard. Note how the rectangle
|
||||||
|
is first glued together and then rolled inwards to create a dough roll.
|
||||||
|
Ultimately the edges are sealed to create a more uniform dough.}%
|
||||||
|
\end{figure*}
|
||||||
|
\clearpage{}
|
||||||
|
|
||||||
|
\section*{Proofing}
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-proofing-process.tex}
|
||||||
|
\end{flowchart}
|
||||||
|
\clearpage{}
|
||||||
|
|
||||||
|
\section*{Baking}
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-baking-process.tex}
|
||||||
|
\caption*{Summary of different bread baking processes}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
|
||||||
|
\begin{flowchart}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-inverted-tray-method.tex}
|
||||||
|
\caption*{Baking with the inverted tray method}
|
||||||
|
\end{flowchart}
|
||||||
|
|
||||||
|
\begin{flowchart*}[!htb]
|
||||||
|
\centering
|
||||||
|
\input{figures/fig-dutch-oven-process.tex}
|
||||||
|
\caption*{Baking with a Dutch Oven}
|
||||||
|
\end{flowchart*}
|
||||||
|
\clearpage{}
|
||||||
|
\end{document}
|
||||||
@@ -19,12 +19,11 @@ accessible, least effort type of bread you can make. If you are a busy person
|
|||||||
and/or don’t have an oven, this might be exactly the type of bread you should
|
and/or don’t have an oven, this might be exactly the type of bread you should
|
||||||
consider.
|
consider.
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-overview-bread-types.tex}
|
\input{tables/table-overview-bread-types.tex}
|
||||||
\caption[Different bread types]{An overview of different bread types
|
\caption[Different bread types]{An overview of different bread types
|
||||||
and their respective complexity.}%
|
and their respective complexity.}%
|
||||||
\label{tab:bread-types-comparison}
|
\label{tab:bread-types-comparison}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
\section{Flatbread}%
|
\section{Flatbread}%
|
||||||
@@ -57,7 +56,7 @@ pancake-like consistency, as you can see in
|
|||||||
Table~\ref{tab:flat-bread-ingredients}
|
Table~\ref{tab:flat-bread-ingredients}
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-flat-bread-pancake-recipe.tex}
|
\input{tables/table-flat-bread-pancake-recipe.tex}
|
||||||
\caption[Flatbread recipe]{Flatbread or pancake recipe for 1 person.
|
\caption[Flatbread recipe]{Flatbread or pancake recipe for 1 person.
|
||||||
Multiply the ingredients to increase portion size. Refer to the
|
Multiply the ingredients to increase portion size. Refer to the
|
||||||
@@ -65,7 +64,6 @@ Table~\ref{tab:flat-bread-ingredients}
|
|||||||
``\nameref{section:bakers-math}'' to learn how to understand and
|
``\nameref{section:bakers-math}'' to learn how to understand and
|
||||||
use the percentages properly.}%
|
use the percentages properly.}%
|
||||||
\label{tab:flat-bread-ingredients}
|
\label{tab:flat-bread-ingredients}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
For a full recipe including the process of making such a flatbread, refer to
|
For a full recipe including the process of making such a flatbread, refer to
|
||||||
@@ -80,13 +78,12 @@ few steps, you can stop buying bread forever. This works with
|
|||||||
any flour, including gluten-free options.
|
any flour, including gluten-free options.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-process-flat-bread.tex}
|
\input{figures/fig-process-flat-bread.tex}
|
||||||
\caption[The process to make a sourdough flatbread]{The process of making a flatbread is very
|
\caption[The process to make a sourdough flatbread]{The process of making a flatbread is very
|
||||||
simple, requiring very little effort. This type of bread is especially
|
simple, requiring very little effort. This type of bread is especially
|
||||||
handy for busy bakers.}%
|
handy for busy bakers.}%
|
||||||
\label{fig:flat-bread-process}
|
\label{fig:flat-bread-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
This is my go-to recipe that I~use to make bread whenever
|
This is my go-to recipe that I~use to make bread whenever
|
||||||
@@ -106,13 +103,12 @@ warmer it is, the sooner it will be ready, consider
|
|||||||
using warm water if it is very cold where you live.
|
using warm water if it is very cold where you live.
|
||||||
|
|
||||||
\begin{figure}[htb!]
|
\begin{figure}[htb!]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=1.0\textwidth]{flat-bread-wheat}
|
\includegraphics[width=1.0\textwidth]{flat-bread-wheat}
|
||||||
\caption[Wheat flatbread]{A flatbread made with purely wheat flour. The
|
\caption[Wheat flatbread]{A flatbread made with purely wheat flour. The
|
||||||
dough is drier at around \qty{60}{\percent} hydration. The drier dough
|
dough is drier at around \qty{60}{\percent} hydration. The drier dough
|
||||||
is a little harder to mix. As wheat contains more gluten, the dough
|
is a little harder to mix. As wheat contains more gluten, the dough
|
||||||
puffs up during the baking process.}
|
puffs up during the baking process.}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
This way you should have around \qty{11}{\gram} of sourdough ready in the evening. You will have
|
This way you should have around \qty{11}{\gram} of sourdough ready in the evening. You will have
|
||||||
@@ -135,12 +131,11 @@ when getting started. You can observe the dough more easily and see when
|
|||||||
it is ready.
|
it is ready.
|
||||||
|
|
||||||
\begin{figure}[htb]
|
\begin{figure}[htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=1.0\textwidth]{ethiopian-woman-checking-bread}
|
\includegraphics[width=1.0\textwidth]{ethiopian-woman-checking-bread}
|
||||||
\caption[Ethiopian \emph{injera}]{An Ethiopian woman baking an \emph{injera}
|
\caption[Ethiopian \emph{injera}]{An Ethiopian woman baking an \emph{injera}
|
||||||
made using teff flour. The image has been provided by Charliefleurene
|
made using teff flour. The image has been provided by Charliefleurene
|
||||||
via Wikipedia.}
|
via Wikipedia.}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
If you used the flatbread option with less water, look at the size increase
|
If you used the flatbread option with less water, look at the size increase
|
||||||
@@ -170,12 +165,11 @@ going to taste relatively sour. I~do this frequently to better evaluate the
|
|||||||
state of my doughs.
|
state of my doughs.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=1.0\textwidth]{injera-pancake-texture.jpg}
|
\includegraphics[width=1.0\textwidth]{injera-pancake-texture.jpg}
|
||||||
\caption[Teff sourdough pancake]{A sourdough pancake made with teff flour.
|
\caption[Teff sourdough pancake]{A sourdough pancake made with teff flour.
|
||||||
The pockets come from evaporated water and \ch{CO2} created by the
|
The pockets come from evaporated water and \ch{CO2} created by the
|
||||||
microbes. The image has been provided by Łukasz Nowak via Wikipedia.}
|
microbes. The image has been provided by Łukasz Nowak via Wikipedia.}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
If you are feeling lazy or don't have time, you could also use older sourdough starter
|
If you are feeling lazy or don't have time, you could also use older sourdough starter
|
||||||
@@ -208,13 +202,12 @@ pancake option, opt for around \qtyrange{0.1}{0.5}{\cm} depending on what you
|
|||||||
like.
|
like.
|
||||||
|
|
||||||
\begin{figure}[htb]
|
\begin{figure}[htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=1.0\textwidth]{einkorn-crumb.jpg}
|
\includegraphics[width=1.0\textwidth]{einkorn-crumb.jpg}
|
||||||
\caption[Einkorn crum]{The crumb of a flatbread made with einkorn as flour.
|
\caption[Einkorn crum]{The crumb of a flatbread made with einkorn as flour.
|
||||||
Einkorn is very low in gluten and thus does not trap as much \ch{CO2} as
|
Einkorn is very low in gluten and thus does not trap as much \ch{CO2} as
|
||||||
a wheat based dough. To make the dough fluffier use more water or
|
a wheat based dough. To make the dough fluffier use more water or
|
||||||
consider adding more wheat to the mix of your dough.}
|
consider adding more wheat to the mix of your dough.}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
After 2--4~minutes flip over the pancake or flatbread. Bake it for the same
|
After 2--4~minutes flip over the pancake or flatbread. Bake it for the same
|
||||||
@@ -249,57 +242,10 @@ culinary applications. Whether you're scooping up a savory dip,
|
|||||||
wrapping a flavorful filling, or simply enjoying a piece with a drizzle
|
wrapping a flavorful filling, or simply enjoying a piece with a drizzle
|
||||||
of olive oil, these flatbreads are sure to impress.
|
of olive oil, these flatbreads are sure to impress.
|
||||||
|
|
||||||
\subsubsection*{Ingredients}
|
\input{recipes/flat-bread.tex}
|
||||||
|
|
||||||
\begin{tabular}{r@{}rl@{}}
|
\section{Loaf pan bread}%
|
||||||
\qty{400}{\gram} &~(\qty{100}{\percent}) & Flour (wheat, rye, corn, whatever you have at hand)\\
|
\label{sec:loaf-pan-bread}
|
||||||
\qty{320}{\gram} & (\qty{80}{\percent}) & Water, preferably at room temperature\\
|
|
||||||
\qty{80}{\gram} & (\qty{20}{\percent}) & Active sourdough starter\\
|
|
||||||
\qty{8}{\gram} & (\qty{2}{\percent}) & Salt\\
|
|
||||||
\end{tabular}
|
|
||||||
|
|
||||||
\subsubsection*{Instructions}
|
|
||||||
\begin{description}
|
|
||||||
\item[Prepare the dough] In a large mixing bowl, combine the flour and water.
|
|
||||||
Mix until you have a shaggy dough with no dry spots.
|
|
||||||
|
|
||||||
Add the sourdough starter and salt to the mixture. Incorporate them thoroughly
|
|
||||||
until you achieve a smooth and homogenized dough.
|
|
||||||
|
|
||||||
\item[Fermentation:] Cover the bowl with a lid or plastic wrap. Allow the dough
|
|
||||||
to rest and ferment until it has increased by at least \qty{50}{\percent}
|
|
||||||
in size. Depending on the temperature and activity of your starter, this
|
|
||||||
can take anywhere from 4 to 24~hours.
|
|
||||||
|
|
||||||
\item[Cooking preparation:] Once the dough has risen, heat a pan over medium heat.
|
|
||||||
Lightly oil the pan, ensuring to wipe away any excess oil with a paper towel.
|
|
||||||
|
|
||||||
\item[Shaping and cooking:] With a ladle or your hands, scoop out a portion of
|
|
||||||
the dough and place it onto the hot pan, spreading it gently like a pancake.
|
|
||||||
|
|
||||||
Cover the pan with a lid. This traps the steam and ensures even cooking
|
|
||||||
from the top, allowing for easier flipping later.
|
|
||||||
|
|
||||||
After about 5~minutes, or when the bottom of the flatbread has a
|
|
||||||
golden-brown crust, carefully flip it using a spatula.
|
|
||||||
|
|
||||||
\emph{Adjusting cook time.} If the flatbread appears too dark,
|
|
||||||
remember to reduce the cooking time slightly for the next one.
|
|
||||||
Conversely, if it's too pale, allow it to cook a bit longer before flipping.
|
|
||||||
|
|
||||||
Cook the flipped side for an additional 5~minutes or until it's also golden
|
|
||||||
brown.
|
|
||||||
|
|
||||||
\item[Storing:] Once cooked, remove the flatbread from the pan and place it on a
|
|
||||||
kitchen towel. Wrapping the breads in the towel will help retain their
|
|
||||||
softness and prevent them from becoming overly crisp.
|
|
||||||
Repeat the cooking process for the remaining dough.
|
|
||||||
|
|
||||||
\item[Serving suggestion:] Enjoy your sourdough flatbreads warm,
|
|
||||||
paired with your favorite dips, spreads, or as a side to any meal.
|
|
||||||
|
|
||||||
\end{description}
|
|
||||||
\section{Loaf pan bread}
|
|
||||||
|
|
||||||
Loaf pan bread is made using the help of a special loaf pan
|
Loaf pan bread is made using the help of a special loaf pan
|
||||||
or loaf tin. The edges of the pan provide additional support
|
or loaf tin. The edges of the pan provide additional support
|
||||||
@@ -377,12 +323,11 @@ baking vessels in your oven. To make a freestanding loaf more steps
|
|||||||
and tools are required.
|
and tools are required.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=1.0\textwidth]{free-standing-loaf.jpg}
|
\includegraphics[width=1.0\textwidth]{free-standing-loaf.jpg}
|
||||||
\caption[Freestanding sourdough bread]{A freestanding sourdough bread. Note
|
\caption[Freestanding sourdough bread]{A freestanding sourdough bread. Note
|
||||||
the incision known as an \emph{ear} and the oven spring clearly
|
the incision known as an \emph{ear} and the oven spring clearly
|
||||||
distinguish this type of bread from flatbread and loaf pan bread.}
|
distinguish this type of bread from flatbread and loaf pan bread.}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
When using wheat, make sure to mix your dough enough to develop a gluten network.
|
When using wheat, make sure to mix your dough enough to develop a gluten network.
|
||||||
|
|||||||
@@ -29,11 +29,11 @@
|
|||||||
% Additional line for dinosaurs since it is so close
|
% Additional line for dinosaurs since it is so close
|
||||||
\draw[line width=1pt] (11.9*\segmentwidth,1.49) -- (11.70*\segmentwidth,1.85);
|
\draw[line width=1pt] (11.9*\segmentwidth,1.49) -- (11.70*\segmentwidth,1.85);
|
||||||
|
|
||||||
% Special lines for december events since they are so close togehter
|
% Special lines for december events since they are so close together
|
||||||
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (12.0*\segmentwidth,0.2); % Main branch
|
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (12.0*\segmentwidth,0.2); % Main branch
|
||||||
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (11.75*\segmentwidth,2.5); % Branch to first humans
|
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (11.75*\segmentwidth,2.5); % Branch to first humans
|
||||||
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (11.75*\segmentwidth,3.0); % Branch to Jordan
|
\draw[line width=1pt] (12.0*\segmentwidth,3.0) -- (11.75*\segmentwidth,3.0); % Branch to Jordan
|
||||||
% Move pasteur down a bit so the lines look like they cross
|
% Move Pasteur down a bit so the lines look like they cross
|
||||||
\draw[line width=1pt] (12.0*\segmentwidth,2.99) -- (11.75*\segmentwidth,3.5); % Branch to Pasteur
|
\draw[line width=1pt] (12.0*\segmentwidth,2.99) -- (11.75*\segmentwidth,3.5); % Branch to Pasteur
|
||||||
|
|
||||||
% Draw months and month separators
|
% Draw months and month separators
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
\begin{tikzpicture}[node distance = 3cm, auto]
|
\begin{tikzpicture}[node distance = 3cm, auto]
|
||||||
\node [start] (init) {Make a starter};
|
\node [start] (init) {Create a starter};
|
||||||
\node [decision, right of=init, node distance=3.5cm] (decision_start) {Starter last fed within 3~days?};
|
\node [decision, right of=init, node distance=3.5cm] (decision_start) {Starter last fed within 3~days?};
|
||||||
\node [block, right of=decision_start, text width=7em, node distance=4cm] (feed_no_branch)
|
\node [block, right of=decision_start, text width=7em, node distance=4cm] (feed_no_branch)
|
||||||
{Feed starter twice:\par \qty{48}{\hour} before\par \qtyrange{6}{12}{\hour} before};
|
{Feed starter twice:\par \qty{48}{\hour} before\par \qtyrange{6}{12}{\hour} before};
|
||||||
|
|||||||
@@ -17,12 +17,11 @@ Depending on which layers are still present, different names are used to describ
|
|||||||
type of flour.
|
type of flour.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-flour-types.tex}
|
\input{tables/table-flour-types.tex}
|
||||||
\caption[Labelling of wheat flour]{A comparison of how different types
|
\caption[Labelling of wheat flour]{A comparison of how different types
|
||||||
of wheat flour are labelled in different countries.}%
|
of wheat flour are labelled in different countries.}%
|
||||||
\label{tab:flour-types-comparison}
|
\label{tab:flour-types-comparison}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
In Germany, the ash content is used to describe the flours. The lab will burn
|
In Germany, the ash content is used to describe the flours. The lab will burn
|
||||||
@@ -60,11 +59,10 @@ want the final bread to be too sour. Conversely you do not have to worry about
|
|||||||
the gluten degradation, removing a huge headache from the equation.
|
the gluten degradation, removing a huge headache from the equation.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-grains-bread-making-process.tex}
|
\input{tables/table-grains-bread-making-process.tex}
|
||||||
\caption[Different types of grain]{An overview of different grain
|
\caption[Different types of grain]{An overview of different grain
|
||||||
types and the steps involved in the respective bread making process.}
|
types and the steps involved in the respective bread making process.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Because gluten has a special role, the rest of this chapter is dedicated to having a
|
Because gluten has a special role, the rest of this chapter is dedicated to having a
|
||||||
@@ -115,13 +113,12 @@ The long fermentation period also means that your microbes will enrich
|
|||||||
your dough with more flavor.
|
your dough with more flavor.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-overview-w-values.tex}
|
\input{tables/table-overview-w-values.tex}
|
||||||
\caption[Fermentation time versus W-value]{An overview of different
|
\caption[Fermentation time versus W-value]{An overview of different
|
||||||
levels of W-values and the respective hydrations and fermentation
|
levels of W-values and the respective hydrations and fermentation
|
||||||
times.}%
|
times.}%
|
||||||
\label{tab:w-value}
|
\label{tab:w-value}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Generally, when aiming to
|
Generally, when aiming to
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ and pastries.
|
|||||||
|
|
||||||
\item[Coil fold] A special stretch and folding technique. The coil fold is
|
\item[Coil fold] A special stretch and folding technique. The coil fold is
|
||||||
very gentle on the dough and is thus excellent throughout the bulk fermentation.
|
very gentle on the dough and is thus excellent throughout the bulk fermentation.
|
||||||
By applying the coil fold the dough strength is improved by minimising damage
|
By applying the coil fold the dough strength is improved by minimizing damage
|
||||||
to the dough structure.
|
to the dough structure.
|
||||||
|
|
||||||
\item[Crumb] The inner texture of the bread, which is characterized by the size,
|
\item[Crumb] The inner texture of the bread, which is characterized by the size,
|
||||||
@@ -285,7 +285,7 @@ depending on the initial reactants and cooking conditions can produce a wide var
|
|||||||
of end products with different tastes and aromas. Maillard reactions occur readily
|
of end products with different tastes and aromas. Maillard reactions occur readily
|
||||||
above \SI{150}{\celsius}, although will still occur much more slowly below that
|
above \SI{150}{\celsius}, although will still occur much more slowly below that
|
||||||
temperature. Optimal reaction rate occurs between \pHvalue{6.0} to \pHvalue{8.0},
|
temperature. Optimal reaction rate occurs between \pHvalue{6.0} to \pHvalue{8.0},
|
||||||
although it favours alkaline conditions.
|
although it favors alkaline conditions.
|
||||||
|
|
||||||
\item[Maltose] A sugar produced from the enzymatic breakdown of starch by amylases.
|
\item[Maltose] A sugar produced from the enzymatic breakdown of starch by amylases.
|
||||||
It's a primary food source for yeast during fermentation.
|
It's a primary food source for yeast during fermentation.
|
||||||
@@ -404,7 +404,7 @@ unpredictable ways. It also provides a controlled aesthetic to the finished loaf
|
|||||||
|
|
||||||
\item[Soaker] A mixture of grains or seeds with water that is left to soak overnight (or for a
|
\item[Soaker] A mixture of grains or seeds with water that is left to soak overnight (or for a
|
||||||
specified amount of time) before being incorporated into bread dough. This helps to
|
specified amount of time) before being incorporated into bread dough. This helps to
|
||||||
soften and hydrate the grains or seeds (sesame, pumpkin, etc.), making them
|
soften and hydrate the grains or seeds (sesame, pumpkin, \etc{}), making them
|
||||||
easier to integrate into the dough and
|
easier to integrate into the dough and
|
||||||
providing a moister crumb in the finished bread.
|
providing a moister crumb in the finished bread.
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ waters, another single-celled life form, \emph{archaea}, also thrived. These
|
|||||||
organisms inhabit extreme environments, from boiling vents to icy waters.
|
organisms inhabit extreme environments, from boiling vents to icy waters.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-life-planet-sourdough-timeline.tex}
|
\input{figures/fig-life-planet-sourdough-timeline.tex}
|
||||||
\caption[Sourdough microbiology timeline]{Timeline of significant events
|
\caption[Sourdough microbiology timeline]{Timeline of significant events
|
||||||
starting from the first day of Earth's existence,
|
starting from the first day of Earth's existence,
|
||||||
@@ -34,12 +34,11 @@ organisms inhabit extreme environments, from boiling vents to icy waters.
|
|||||||
marked at midnight. This visualization shows the pivotal steps
|
marked at midnight. This visualization shows the pivotal steps
|
||||||
of life and sourdough on earth.}%
|
of life and sourdough on earth.}%
|
||||||
\label{fig:planet-timeline}
|
\label{fig:planet-timeline}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Whoever comes first, bacteria or archaea, remains debated. For three
|
Whoever comes first, bacteria or archaea, remains debated. For three
|
||||||
months (or approximately 1.1~billion years), these life forms dominated
|
months (or approximately 1.1~billion years), these life forms dominated
|
||||||
the oceans. Then, on June~25 in an highly unlikely event, an archaeon consumed a bacterium.
|
the oceans. Then, on June~25 in a highly unlikely event, an archaeon consumed a bacterium.
|
||||||
Instead of digesting it, they formed a symbiotic relationship. This led to the
|
Instead of digesting it, they formed a symbiotic relationship. This led to the
|
||||||
first nucleated organisms, marking an evolutionary milestone. This event lead
|
first nucleated organisms, marking an evolutionary milestone. This event lead
|
||||||
to the development of plants, fungi and also ultimately humans.
|
to the development of plants, fungi and also ultimately humans.
|
||||||
@@ -70,12 +69,11 @@ Ancient Jordan~\cite{jordan+bread}. Looking at the earth's timeline sourdough
|
|||||||
bread can be considered a very recent invention.
|
bread can be considered a very recent invention.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-sourdough-history-timeline.tex}
|
\input{figures/fig-sourdough-history-timeline.tex}
|
||||||
\caption[Sourdough history timeline]{Timeline of significant discoveries and
|
\caption[Sourdough history timeline]{Timeline of significant discoveries and
|
||||||
events leading to modern sourdough bread.}%
|
events leading to modern sourdough bread.}%
|
||||||
\label{fig:sourdough-timeline}
|
\label{fig:sourdough-timeline}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
The exact origins of fermented
|
The exact origins of fermented
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ sometimes you are faced with issues you don't understand. In \qty{99.95}{\percen
|
|||||||
of all software bugs, the developer is the issue. Sometimes, however, the framework has a
|
of all software bugs, the developer is the issue. Sometimes, however, the framework has a
|
||||||
bug. That is when the developer must dig deeper to see the \emph{what} and the
|
bug. That is when the developer must dig deeper to see the \emph{what} and the
|
||||||
\emph{why} behind what
|
\emph{why} behind what
|
||||||
the framework is doing. You will need to read other engineer's source code, and you will be forced
|
the framework is doing. You will need to read other engineers' source code, and you will be forced
|
||||||
to understand \emph{why} things are happening.
|
to understand \emph{why} things are happening.
|
||||||
|
|
||||||
Being unhappy with what I~was baking, my engineering mindset took over, and I~had
|
Being unhappy with what I~was baking, my engineering mindset took over, and I~had
|
||||||
|
|||||||
@@ -31,10 +31,12 @@ chapters = baking basics bread-types cover flour-types history intro mix-ins\
|
|||||||
|
|
||||||
src_tables := $(wildcard tables/table-*.tex)
|
src_tables := $(wildcard tables/table-*.tex)
|
||||||
src_figures := $(wildcard figures/fig-*.tex) figures/flowcharts_tikz.tex
|
src_figures := $(wildcard figures/fig-*.tex) figures/flowcharts_tikz.tex
|
||||||
|
src_recipes := $(wildcard recipes/*.tex)
|
||||||
|
|
||||||
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
|
||||||
|
src_tex += $(src_recipes)
|
||||||
|
|
||||||
images := $(wildcard images/*/*.jpg)
|
images := $(wildcard images/*/*.jpg)
|
||||||
images += $(wildcard images/*.jpg)
|
images += $(wildcard images/*.jpg)
|
||||||
@@ -55,6 +57,11 @@ 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
|
||||||
|
|
||||||
|
# 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
|
||||||
@@ -83,6 +90,9 @@ tgt_figures := $(patsubst %.tex, %.png,$(src_figures))
|
|||||||
%.xbb: %.jpg
|
%.xbb: %.jpg
|
||||||
ebb -x $<
|
ebb -x $<
|
||||||
|
|
||||||
|
booklet/booklet.pdf: $(booklet_src)
|
||||||
|
$(LATEX) -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
|
||||||
|
|
||||||
@@ -97,7 +107,7 @@ epub/%.epub: %.tex $(ebook_src) cover/cover-page.xbb
|
|||||||
copy_ebook_files: build_ebook
|
copy_ebook_files: build_ebook
|
||||||
$(RSYNC) book-epub/ bw-book-epub/
|
$(RSYNC) book-epub/ bw-book-epub/
|
||||||
|
|
||||||
# We 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
|
||||||
bw-book-epub/OEBPS/%.jpg: %.jpg
|
bw-book-epub/OEBPS/%.jpg: %.jpg
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
@@ -140,6 +150,8 @@ help:
|
|||||||
@echo ""
|
@echo ""
|
||||||
@echo "build_ebook: builds only the colour ebook"
|
@echo "build_ebook: builds only the colour ebook"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@echo "build_booklet: builds only the short booklet"
|
||||||
|
@echo ""
|
||||||
@echo "build_bw_ebook: builds the low res black & white ebook"
|
@echo "build_bw_ebook: builds the low res black & white ebook"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "build_sans_serif_pdf: build accessible pdf only"
|
@echo "build_sans_serif_pdf: build accessible pdf only"
|
||||||
@@ -160,6 +172,8 @@ help:
|
|||||||
@echo ""
|
@echo ""
|
||||||
@echo "quick_ebook: compiles ebook but runs lulatex only once"
|
@echo "quick_ebook: compiles ebook but runs lulatex only once"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@echo "quick_booklet: compiles booklet but runs lulatex only once"
|
||||||
|
@echo ""
|
||||||
@echo "show_tools_version: Show version of tools used on the build machine"
|
@echo "show_tools_version: Show version of tools used on the build machine"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "print-X: print makefile variable X"
|
@echo "print-X: print makefile variable X"
|
||||||
@@ -170,10 +184,12 @@ help:
|
|||||||
|
|
||||||
|
|
||||||
# Finally actual project targets (i.e. build pdf and ebooks)
|
# Finally actual project targets (i.e. build pdf and ebooks)
|
||||||
.PHONY: build_pdf build_serif_pdf build_sans_serif_pdf build_ebook
|
.PHONY: build_pdf build_booklet build_serif_pdf build_sans_serif_pdf build_ebook
|
||||||
|
|
||||||
build_pdf: build_serif_pdf build_sans_serif_pdf
|
build_pdf: build_serif_pdf build_sans_serif_pdf
|
||||||
|
|
||||||
|
build_booklet: booklet/booklet.pdf
|
||||||
|
|
||||||
build_serif_pdf: book_serif/book.pdf
|
build_serif_pdf: book_serif/book.pdf
|
||||||
|
|
||||||
build_sans_serif_pdf: book_sans_serif/book_sans_serif.pdf
|
build_sans_serif_pdf: book_sans_serif/book_sans_serif.pdf
|
||||||
@@ -221,15 +237,17 @@ clean_website_build: clean_ebook_build
|
|||||||
clean: clean_ebook_build clean_figures clean_website_build
|
clean: clean_ebook_build clean_figures clean_website_build
|
||||||
$(CLEAN) -output-directory=book_serif book.tex
|
$(CLEAN) -output-directory=book_serif book.tex
|
||||||
$(CLEAN) -output-directory=book_sans_serif book_sans_serif.tex
|
$(CLEAN) -output-directory=book_sans_serif book_sans_serif.tex
|
||||||
|
$(CLEAN) -output-directory=booklet booklet.tex
|
||||||
-rm book*/*.{bbl,loc,.run.xml}
|
-rm book*/*.{bbl,loc,.run.xml}
|
||||||
-rm -rf book*-epub/META-INF
|
-rm -rf *book-epub/META-INF
|
||||||
-rm -rf book*-epub/OEBPS
|
-rm -rf *book-epub/OEBPS
|
||||||
-rm book*-epub/mimetype
|
-rm *book-epub/mimetype
|
||||||
|
|
||||||
mrproper: clean
|
mrproper: clean
|
||||||
$(CLEAN) -C $(src_figures)
|
$(CLEAN) -C $(src_figures)
|
||||||
$(CLEAN) -C -output-directory=book_serif book.tex
|
$(CLEAN) -C -output-directory=book_serif book.tex
|
||||||
$(CLEAN) -C -output-directory=book_sans_serif book_sans_serif.tex
|
$(CLEAN) -C -output-directory=book_sans_serif book_sans_serif.tex
|
||||||
|
$(CLEAN) -C -output-directory=booklet booklet.tex
|
||||||
-rm figures/*.png
|
-rm figures/*.png
|
||||||
-rm *.html
|
-rm *.html
|
||||||
-rm *.svg
|
-rm *.svg
|
||||||
@@ -237,13 +255,14 @@ mrproper: clean
|
|||||||
-rm -rf release/
|
-rm -rf release/
|
||||||
-rm -rf book_serif/
|
-rm -rf book_serif/
|
||||||
-rm -rf book_sans_serif/
|
-rm -rf book_sans_serif/
|
||||||
-rm -rf book-epub/
|
-rm -rf booklet/
|
||||||
|
-rm -rf *book-epub/
|
||||||
-rm -rf $(website_dir)
|
-rm -rf $(website_dir)
|
||||||
|
|
||||||
# top level releases rules
|
# top level releases rules
|
||||||
.PHONY: bake release_serif release_sans_serif
|
.PHONY: bake release_serif release_sans_serif
|
||||||
|
|
||||||
bake: release_serif release_sans_serif
|
bake: release_serif release_sans_serif release_booklet
|
||||||
|
|
||||||
release:
|
release:
|
||||||
mkdir -p release
|
mkdir -p release
|
||||||
@@ -256,6 +275,9 @@ release_serif: build_serif_pdf build_ebook build_bw_ebook | release
|
|||||||
release_sans_serif: build_sans_serif_pdf | release
|
release_sans_serif: build_sans_serif_pdf | release
|
||||||
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
||||||
|
|
||||||
|
release_booklet: build_booklet | release
|
||||||
|
cp booklet/booklet.pdf release/TheBreadCode-The-Sourdough-Framework-booklet.pdf
|
||||||
|
|
||||||
# Website stuff
|
# Website stuff
|
||||||
.PHONY: html website
|
.PHONY: html website
|
||||||
$(website_dir)/book.html: $(website_src) cover/cover-page.xbb
|
$(website_dir)/book.html: $(website_src) cover/cover-page.xbb
|
||||||
@@ -283,6 +305,9 @@ website: html ../website/_bundle_install_done $(ruby_src)
|
|||||||
quick: # run latex only once no biber, no references etc...
|
quick: # run latex only once no biber, no references etc...
|
||||||
$(LATEX) -e '$$max_repeat=1' -halt-on-error -output-directory=book_serif book.tex
|
$(LATEX) -e '$$max_repeat=1' -halt-on-error -output-directory=book_serif book.tex
|
||||||
|
|
||||||
|
quick_booklet:
|
||||||
|
$(LATEX) -e '$$max_repeat=1' -halt-on-error -output-directory=booklet booklet.tex
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
@@ -293,6 +318,9 @@ show_tools_version: # Show version of tools used on the build machine
|
|||||||
@echo ""
|
@echo ""
|
||||||
- $(SHELL) --version
|
- $(SHELL) --version
|
||||||
@echo ""
|
@echo ""
|
||||||
|
- @echo "PATH:"
|
||||||
|
- @echo $(PATH) | tr ':' '\n'
|
||||||
|
@echo ""
|
||||||
- latexmk --version
|
- latexmk --version
|
||||||
@echo ""
|
@echo ""
|
||||||
- lualatex --version
|
- lualatex --version
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ usually moderately affect the color.
|
|||||||
\item Semolina (supports Mediterranean flavors)
|
\item Semolina (supports Mediterranean flavors)
|
||||||
\item Cocoa (replace \qty{10}{\percent} of the flour for a black loaf, goes
|
\item Cocoa (replace \qty{10}{\percent} of the flour for a black loaf, goes
|
||||||
great with sweet toppings)
|
great with sweet toppings)
|
||||||
\item Other non-wheat flours such as: Chickpea, corn, hemp, potato etc.
|
\item Other non-wheat flours such as: Chickpea, corn, hemp, potato\dots{}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Liquids}
|
\subsection{Liquids}
|
||||||
@@ -134,15 +134,15 @@ affecting taste and texture.
|
|||||||
\item Eggs
|
\item Eggs
|
||||||
\item Fruit/vegetable juices (also see Section~\ref{section:colors})
|
\item Fruit/vegetable juices (also see Section~\ref{section:colors})
|
||||||
\item Milk (for sweet, soft breads)
|
\item Milk (for sweet, soft breads)
|
||||||
\item Milk alternatives such as: Almond, oat, soy etc.
|
\item Milk alternatives such as: Almond, oat, soy\dots{}
|
||||||
\item Mashed potatoes
|
\item Mashed potatoes
|
||||||
\item Mashed sweet potatoes. Bolo do caco is a typical bread from Madeira,
|
\item Mashed sweet potatoes. Bolo do caco is a typical bread from Madeira,
|
||||||
made from \qty{50}{\percent} wheat flour and \qty{50}{\percent} mashed potatoes.
|
made from \qty{50}{\percent} wheat flour and \qty{50}{\percent} mashed potatoes.
|
||||||
\item Olive oil (Mediterranean)
|
\item Olive oil (Mediterranean)
|
||||||
\item Other mashed vegetables such as: Beets, pumpkin, etc.
|
\item Other mashed vegetables such as: Beets, pumpkin\dots{}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Colors}
|
\subsection{Colors}%
|
||||||
\label{section:colors}
|
\label{section:colors}
|
||||||
Some mix-ins will change the color and flavor of your bread. Common colorings
|
Some mix-ins will change the color and flavor of your bread. Common colorings
|
||||||
include:
|
include:
|
||||||
@@ -201,17 +201,18 @@ dough.
|
|||||||
These are mostly powders or small bits.
|
These are mostly powders or small bits.
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Blueberry skins (press through a sieve to remove juice, raw blueberries
|
\item Blueberry skins (press through a sieve to remove juice), raw
|
||||||
|
blueberries
|
||||||
\item Browned onions
|
\item Browned onions
|
||||||
\item Candied fruits such as: Lemon, orange, pineapple, etc.
|
\item Candied fruits such as: Lemon, orange, pineapple\dots{}
|
||||||
\item Cinnamon
|
\item Cinnamon
|
||||||
\item Grated hard cheese such as: Gruyère, parmesan, etc.
|
\item Grated hard cheese such as: Gruyère, parmesan\dots{}
|
||||||
\item Mediterranean herbs such as: Marjoram, oregano, rosemary, thyme, etc.
|
\item Mediterranean herbs such as: Marjoram, oregano, rosemary, thyme\dots{}
|
||||||
\item Miso
|
\item Miso
|
||||||
\item Molasses
|
\item Molasses
|
||||||
\item Sugar
|
\item Sugar
|
||||||
\item Spices such as: Anise, fennel, cinnamon, coriander, cumin, etc.
|
\item Spices such as: Anise, fennel, cinnamon, coriander, cumin\dots{}
|
||||||
\item Zests such as: Lime, Lemon, orange, etc.
|
\item Zests such as: Lime, Lemon, orange\dots{}
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\subsection{Highlights}
|
\subsection{Highlights}
|
||||||
@@ -222,12 +223,12 @@ can often be complemented by some flavor or flour mix-in.
|
|||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item Chocolate chunks or drops
|
\item Chocolate chunks or drops
|
||||||
\item Chunks of black garlic
|
\item Chunks of black garlic
|
||||||
\item Chunks of cheese such as: Cheddar, feta, etc.
|
\item Chunks of cheese such as: Cheddar, feta\dots{}
|
||||||
\item Cornflakes
|
\item Cornflakes
|
||||||
\item Dried fruits such as: Cranberries, dates, raisins, etc.
|
\item Dried fruits such as: Cranberries, dates, raisins\dots{}
|
||||||
\item Olives
|
\item Olives
|
||||||
\item Pickled pepperoni
|
\item Pickled pepperoni
|
||||||
\item Sundried tomatoes (squeeze out the oil if using pickled ones, or soak
|
\item Sun-dried tomatoes (squeeze out the oil if using pickled ones, or soak
|
||||||
dried ones in water)
|
dried ones in water)
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
@@ -240,7 +241,7 @@ A few combinations where multiple mix-ins complement each other:
|
|||||||
\item Cheddar and jalapeño
|
\item Cheddar and jalapeño
|
||||||
\item Cocoa, cacao nibs, whole hazelnuts
|
\item Cocoa, cacao nibs, whole hazelnuts
|
||||||
\item Cranberry and walnuts
|
\item Cranberry and walnuts
|
||||||
\item Semolina, Mediterranean herbs, olives, sundried tomatoes
|
\item Semolina, Mediterranean herbs, olives, sun-dried tomatoes
|
||||||
\item Tomato juice instead of water with \qty{20}{\percent} rye flour
|
\item Tomato juice instead of water with \qty{20}{\percent} rye flour
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
@@ -310,6 +311,6 @@ ferment the dough in separate containers. Then Combine the two (or
|
|||||||
more) differently colored doughs by laminating and stacking the colored sheets
|
more) differently colored doughs by laminating and stacking the colored sheets
|
||||||
of dough before the last folding, just before shaping. This way the colored
|
of dough before the last folding, just before shaping. This way the colored
|
||||||
layers won't mix and the resulting dough will have differently colored and
|
layers won't mix and the resulting dough will have differently colored and
|
||||||
tasting layers. \footnote{I once made an experimental dough by merging a wheat,
|
tasting layers\footnote{I once made an experimental dough by merging a wheat,
|
||||||
rye, spelt and einkorn dough into a single dough. The resulting dough was
|
rye, spelt and einkorn dough into a single dough. The resulting dough was
|
||||||
layered featuring different colors, textures, and flavors.}
|
layered featuring different colors, textures, and flavors.}.
|
||||||
|
|||||||
@@ -17,14 +17,13 @@ a denser crumb compared to wheat, as you can see in
|
|||||||
Picture~\ref{fig:rye-crumb}.
|
Picture~\ref{fig:rye-crumb}.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-non-wheat-process.tex}
|
\input{figures/fig-non-wheat-process.tex}
|
||||||
\caption[Process for non-wheat sourdough bread]{A visualization of the
|
\caption[Process for non-wheat sourdough bread]{A visualization of the
|
||||||
process to make non-wheat sourdough bread. The process is much simpler
|
process to make non-wheat sourdough bread. The process is much simpler
|
||||||
than making wheat sourdough bread. There is no gluten development. The
|
than making wheat sourdough bread. There is no gluten development. The
|
||||||
ingredients are simply mixed together.}%
|
ingredients are simply mixed together.}%
|
||||||
\label{flc:non-wheat-sourdough}
|
\label{flc:non-wheat-sourdough}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
For non-wheat flours---including rye, emmer, and einkorn---no gluten
|
For non-wheat flours---including rye, emmer, and einkorn---no gluten
|
||||||
|
|||||||
53
book/recipes/flat-bread.tex
Normal file
53
book/recipes/flat-bread.tex
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
\subsubsection*{Ingredients}
|
||||||
|
\begin{tabular}{r@{}rl@{}}
|
||||||
|
\qty{400}{\gram} &~(\qty{100}{\percent}) & Flour (wheat, rye, corn, whatever
|
||||||
|
you have at hand)\\
|
||||||
|
\qty{320}{\gram} & (\qty{80}{\percent}) & Water, preferably at room
|
||||||
|
temperature\\
|
||||||
|
\qty{80}{\gram} & (\qty{20}{\percent}) & Active sourdough starter\\
|
||||||
|
\qty{8}{\gram} & (\qty{2}{\percent}) & Salt\\
|
||||||
|
\end{tabular}
|
||||||
|
|
||||||
|
\subsubsection*{Instructions}
|
||||||
|
\begin{description}
|
||||||
|
\item[Prepare the dough] In a large mixing bowl, combine the flour and water.
|
||||||
|
Mix until you have a shaggy dough with no dry spots.
|
||||||
|
|
||||||
|
Add the sourdough starter and salt to the mixture. Incorporate them
|
||||||
|
thoroughly until you achieve a smooth and homogenized dough.
|
||||||
|
|
||||||
|
\item[Fermentation:] Cover the bowl with a lid or plastic wrap. Allow the dough
|
||||||
|
to rest and ferment until it has increased by at least \qty{50}{\percent}
|
||||||
|
in size. Depending on the temperature and activity of your starter, this
|
||||||
|
can take anywhere from 4 to 24~hours.
|
||||||
|
|
||||||
|
\item[Cooking preparation:] Once the dough has risen, heat a pan over medium
|
||||||
|
heat. Lightly oil the pan, ensuring to wipe away any excess oil with a
|
||||||
|
paper towel.
|
||||||
|
|
||||||
|
\item[Shaping and cooking:] With a ladle or your hands, scoop out a portion of
|
||||||
|
the dough and place it onto the hot pan, spreading it gently like a
|
||||||
|
pancake.
|
||||||
|
|
||||||
|
Cover the pan with a lid. This traps the steam and ensures even cooking
|
||||||
|
from the top, allowing for easier flipping later.
|
||||||
|
|
||||||
|
After about 5~minutes, or when the bottom of the flatbread has a
|
||||||
|
golden-brown crust, carefully flip it using a spatula.
|
||||||
|
|
||||||
|
\emph{Adjusting cook time.} If the flatbread appears too dark, remember to
|
||||||
|
reduce the cooking time slightly for the next one. Conversely, if it's
|
||||||
|
too pale, allow it to cook a bit longer before flipping.
|
||||||
|
|
||||||
|
Cook the flipped side for an additional 5~minutes or until it's also
|
||||||
|
golden brown.
|
||||||
|
|
||||||
|
\item[Storing:] Once cooked, remove the flatbread from the pan and place it on
|
||||||
|
a kitchen towel. Wrapping the breads in the towel will help retain their
|
||||||
|
softness and prevent them from becoming overly crisp. Repeat the cooking
|
||||||
|
process for the remaining dough.
|
||||||
|
|
||||||
|
\item[Serving suggestion:] Enjoy your sourdough flatbreads warm, paired with
|
||||||
|
your favorite dips, spreads, or as a side to any meal.
|
||||||
|
|
||||||
|
\end{description}
|
||||||
@@ -27,14 +27,13 @@ starter has half as much water as flour, as summarized in
|
|||||||
Table~\ref{tab:starter-types-comparison}.
|
Table~\ref{tab:starter-types-comparison}.
|
||||||
|
|
||||||
\begin{table}[htp!]
|
\begin{table}[htp!]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-starter-types.tex}
|
\input{tables/table-starter-types.tex}
|
||||||
\caption[Different types of sourdough]{A comparison of different
|
\caption[Different types of sourdough]{A comparison of different
|
||||||
sourdough starter types and their respective properties. The only
|
sourdough starter types and their respective properties. The only
|
||||||
difference is the amount of water (hydration) that is used when
|
difference is the amount of water (hydration) that is used when
|
||||||
feeding the starter.}%
|
feeding the starter.}%
|
||||||
\label{tab:starter-types-comparison}
|
\label{tab:starter-types-comparison}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
You can change your starter type by just adjusting the feeding ratio of how
|
You can change your starter type by just adjusting the feeding ratio of how
|
||||||
@@ -123,19 +122,18 @@ starter's flavor by changing the type to a liquid starter.
|
|||||||
\label{section:liquid-starter}
|
\label{section:liquid-starter}
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=0.5\textwidth]{sourdough-starter-liquid.jpg}
|
\includegraphics[width=0.5\textwidth]{sourdough-starter-liquid.jpg}
|
||||||
\caption[Liquid starter]{A liquid sourdough starter features a high level of
|
\caption[Liquid starter]{A liquid sourdough starter features a high level of
|
||||||
water. The high water amount boosts lactic acid producing bacteria.
|
water. The high water amount boosts lactic acid producing bacteria.
|
||||||
After a while the liquid and flour start to separate. Bubbles on the
|
After a while the liquid and flour start to separate. Bubbles on the
|
||||||
side of the flour indicate that the starter is ready to be used.}%
|
side of the flour indicate that the starter is ready to be used.}%
|
||||||
\label{fig:liquid-sourdough-starter}
|
\label{fig:liquid-sourdough-starter}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-liquid-starter-conversion.tex}
|
\input{figures/fig-liquid-starter-conversion.tex}
|
||||||
\caption[Converting to a liquid starter]{The process to convert your regular
|
\caption[Converting to a liquid starter]{The process to convert your regular
|
||||||
or stiff starter into a liquid starter. The whole process takes around
|
or stiff starter into a liquid starter. The whole process takes around
|
||||||
@@ -149,7 +147,6 @@ starter's flavor by changing the type to a liquid starter.
|
|||||||
starter your created stiff starter will feature both dairy
|
starter your created stiff starter will feature both dairy
|
||||||
and vinegary notes.}%
|
and vinegary notes.}%
|
||||||
\label{flc:liquid-starter-conversion}
|
\label{flc:liquid-starter-conversion}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
The liquid starter is made at a hydration of around \qty{500}{\percent}. This means
|
The liquid starter is made at a hydration of around \qty{500}{\percent}. This means
|
||||||
@@ -242,7 +239,7 @@ for a visual example of the starter's required hydration level.
|
|||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-stiff-starter-conversion.tex}
|
\input{figures/fig-stiff-starter-conversion.tex}
|
||||||
\caption[Converting to a stiff starter]{The process to convert your regular
|
\caption[Converting to a stiff starter]{The process to convert your regular
|
||||||
starter into a stiff starter. The whole process takes around 3 days. The
|
starter into a stiff starter. The whole process takes around 3 days. The
|
||||||
@@ -252,7 +249,6 @@ for a visual example of the starter's required hydration level.
|
|||||||
\qty{50}{\percent} hydration level for the starter. If the dough is too
|
\qty{50}{\percent} hydration level for the starter. If the dough is too
|
||||||
stiff consider increasing this to \qty{60}{\percent}.}%
|
stiff consider increasing this to \qty{60}{\percent}.}%
|
||||||
\label{fig:stiff-starter-conversion}
|
\label{fig:stiff-starter-conversion}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
In the stiffer environment the yeast thrives more. This means you will have
|
In the stiffer environment the yeast thrives more. This means you will have
|
||||||
@@ -302,13 +298,16 @@ pockets of air on the sides of your container. Use your nose to smell the
|
|||||||
starter. It should have a mild smell. It also tends to smell much more
|
starter. It should have a mild smell. It also tends to smell much more
|
||||||
alcoholic than the other starters.
|
alcoholic than the other starters.
|
||||||
|
|
||||||
When using a stiff starter, use around \qtyrange{1}{20}{\percent} starter for your
|
When using a stiff starter, use around \qtyrange{1}{20}{\percent} starter in terms of
|
||||||
|
baker's math for your
|
||||||
dough. This depends on the ripeness of your starter.
|
dough. This depends on the ripeness of your starter.
|
||||||
In summer I~typically use around
|
In summer I~typically use around
|
||||||
\qty{10}{\percent} and in winter around \qty{20}{\percent}. This way you can
|
\qtyrange{1}{10}{\percent} and in winter around \qty{20}{\percent}. This way you can
|
||||||
also control the fermentation speed.
|
also control the fermentation speed. If it is very hot where you live, consider
|
||||||
Mixing the starter can be a little bit annoying as it hardly homogenizes with
|
lowering the starter amount to \qtyrange{1}{5}{\percent}. If it is very cold in your
|
||||||
the rest of the dough. In this case you can try to dissolve the starter in the
|
area consider increasing the starter amount up to \qty{30}{\percent}.
|
||||||
|
Mixing the stiff starter can be a little bit annoying as it hardly homogenizes with
|
||||||
|
the rest of the dough. In this case, you can try to dissolve the starter in the
|
||||||
water you are about to use for your dough. This will make mixing a lot easier.
|
water you are about to use for your dough. This will make mixing a lot easier.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,10 @@ comes in handy. Let's look at the default recipe with baker's
|
|||||||
math and then adjust it for the \qty{1.4}{\kg} flour quantity.
|
math and then adjust it for the \qty{1.4}{\kg} flour quantity.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-bakers-math-example.tex}
|
\input{tables/table-bakers-math-example.tex}
|
||||||
\caption[Baker's math example]{An example table demonstrating how to
|
\caption[Baker's math example]{An example table demonstrating how to
|
||||||
properly calculate using baker's math}
|
properly calculate using baker's math}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Note how each of the ingredients is calculated as a percentage
|
Note how each of the ingredients is calculated as a percentage
|
||||||
@@ -55,12 +54,11 @@ more flour available the next day. As mentioned the next day
|
|||||||
we have \qty{1.4}{\kg} at hand (\qty{1400}{\gram}).
|
we have \qty{1.4}{\kg} at hand (\qty{1400}{\gram}).
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-recipe-bakers-math.tex}
|
\input{tables/table-recipe-bakers-math.tex}
|
||||||
\caption[Another baker's math example]{An example recipe that uses
|
\caption[Another baker's math example]{An example recipe that uses
|
||||||
\qty{1400}{\gram} as its baseline and is then calculated using
|
\qty{1400}{\gram} as its baseline and is then calculated using
|
||||||
baker's math.}
|
baker's math.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
For each ingredient we calculate the percentage
|
For each ingredient we calculate the percentage
|
||||||
@@ -133,12 +131,11 @@ I~like to use a glass and place another
|
|||||||
inverted one on top.
|
inverted one on top.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-starter-process.tex}
|
\input{figures/fig-starter-process.tex}
|
||||||
\caption[The full sourdough starter process]{The process of making a sourdough
|
\caption[The full sourdough starter process]{The process of making a sourdough
|
||||||
starter from scratch.}%
|
starter from scratch.}%
|
||||||
\label{fig:sourdough-starter-process}
|
\label{fig:sourdough-starter-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
Now an epic battle begins. In one study~\cite{yeasts+biocontrol+agent}
|
Now an epic battle begins. In one study~\cite{yeasts+biocontrol+agent}
|
||||||
@@ -272,14 +269,13 @@ yeast has been isolated like this from century old sourdough
|
|||||||
starters.
|
starters.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-starter-readiness.tex}
|
\input{figures/fig-starter-readiness.tex}
|
||||||
\caption[Determining sourdough starter readiness]{A flow chart showing you how to
|
\caption[Determining sourdough starter readiness]{A flow chart showing you how to
|
||||||
determine if your sourdough starter is ready to be used. For checking
|
determine if your sourdough starter is ready to be used. For checking
|
||||||
readiness look at a size increase and take note of your starter's smell.
|
readiness look at a size increase and take note of your starter's smell.
|
||||||
Both are important indicators to check for readiness.}%
|
Both are important indicators to check for readiness.}%
|
||||||
\label{fig:sourdough-starter-readiness}
|
\label{fig:sourdough-starter-readiness}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
The key sign to look at is bubbles that you see in your starter
|
The key sign to look at is bubbles that you see in your starter
|
||||||
@@ -346,7 +342,7 @@ yeast part of your sourdough and balance the fermentation.
|
|||||||
\section{Maintenance}
|
\section{Maintenance}
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-starter-maintenance.tex}
|
\input{figures/fig-starter-maintenance.tex}
|
||||||
\caption[Sourdough starter maintenance flowchart]{A full flowchart showing
|
\caption[Sourdough starter maintenance flowchart]{A full flowchart showing
|
||||||
you how to conduct proper sourdough starter maintenance. You can use a
|
you how to conduct proper sourdough starter maintenance. You can use a
|
||||||
@@ -356,7 +352,6 @@ yeast part of your sourdough and balance the fermentation.
|
|||||||
\qty{100}{\percent} hydration level. Adjust the water content
|
\qty{100}{\percent} hydration level. Adjust the water content
|
||||||
accordingly when you use a stiff starter.}%
|
accordingly when you use a stiff starter.}%
|
||||||
\label{fig:sourdough-maintenance-process}
|
\label{fig:sourdough-maintenance-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
You have made your sourdough starter and your first bread. How do you perform
|
You have made your sourdough starter and your first bread. How do you perform
|
||||||
@@ -432,7 +427,7 @@ of water. This extra layer of water provides good protection from the top
|
|||||||
part drying out. As mold is aerobic it can not grow efficiently under
|
part drying out. As mold is aerobic it can not grow efficiently under
|
||||||
water~\cite{mold+anaerobic}. Before using the starter again simply either stir
|
water~\cite{mold+anaerobic}. Before using the starter again simply either stir
|
||||||
the liquid into the dough or drain it. If you drain the liquid you can use it
|
the liquid into the dough or drain it. If you drain the liquid you can use it
|
||||||
to make a lacto fermented hot sauce for instance.
|
to make a lacto-fermented hot sauce for instance.
|
||||||
|
|
||||||
The colder it is the longer you preserve a good balance of yeast and
|
The colder it is the longer you preserve a good balance of yeast and
|
||||||
bacteria. Generally, the warmer it is the faster the fermentation process is,
|
bacteria. Generally, the warmer it is the faster the fermentation process is,
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
% Common abbreviations
|
% Common abbreviations
|
||||||
\newcommand{\ie}{\emph{i.e.}\@ifnextchar.{\!\@gobble}{}}
|
\newcommand{\ie}{\emph{i.e.}\@ifnextchar.{\!\@gobble}{}}
|
||||||
\newcommand{\eg}{\emph{e.g.}\@ifnextchar.{\!\@gobble}{}}
|
\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}{}}
|
||||||
|
|||||||
@@ -9,12 +9,11 @@ later time.
|
|||||||
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 th rest of this chapter.
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-storing-bread-overview.tex}
|
\input{tables/table-storing-bread-overview.tex}
|
||||||
\caption[Options to store bread]{A table visualizing the advantages
|
\caption[Options to store bread]{A table visualizing the advantages
|
||||||
and disadvantages of different bread storing options.}%
|
and disadvantages of different bread storing options.}%
|
||||||
\label{table:bread-storage}
|
\label{table:bread-storage}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
\section{Room temperature}
|
\section{Room temperature}
|
||||||
|
|||||||
221
book/style.css
221
book/style.css
@@ -6,12 +6,15 @@
|
|||||||
--fw-bold: 800;
|
--fw-bold: 800;
|
||||||
--f-lh: 28px;
|
--f-lh: 28px;
|
||||||
--c-black: #282828;
|
--c-black: #282828;
|
||||||
|
--c-black-background: #1c1819;
|
||||||
--fs-xxxl: 32px;
|
--fs-xxxl: 32px;
|
||||||
--fs-xxl: 26px;
|
--fs-xxl: 26px;
|
||||||
--fs-xl: 24px;
|
--fs-xl: 24px;
|
||||||
--fs-l: 22px;
|
--fs-l: 22px;
|
||||||
--fs-m: 16px;
|
--fs-m: 16px;
|
||||||
--padding-hamburger: 5px;
|
--padding-hamburger: 5px;
|
||||||
|
--c-beige: #F3EDE6;
|
||||||
|
--border-radius: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 1200px){
|
@media (min-width: 1200px){
|
||||||
@@ -38,6 +41,7 @@ body{
|
|||||||
font-family: var(--ff-sans);
|
font-family: var(--ff-sans);
|
||||||
font-weight: var(--fw-regular);
|
font-weight: var(--fw-regular);
|
||||||
font-size: var(--fs-m);
|
font-size: var(--fs-m);
|
||||||
|
color: var(--c-black);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 57rem) {
|
@media screen and (min-width: 57rem) {
|
||||||
@@ -60,7 +64,6 @@ body{
|
|||||||
/* ****************** */
|
/* ****************** */
|
||||||
|
|
||||||
main.main-content,main.titlepage,div.footnotes{
|
main.main-content,main.titlepage,div.footnotes{
|
||||||
padding:1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.permalink {
|
.permalink {
|
||||||
@@ -144,7 +147,7 @@ nav.TOC a, nav.TOC a:visited{
|
|||||||
|
|
||||||
|
|
||||||
body{
|
body{
|
||||||
background-color: var(--c-black);
|
background-color: var(--c-beige);
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@@ -174,6 +177,7 @@ figure.texsource, figure.shellcommand, figure.htmlsource, figure.luasource, figu
|
|||||||
|
|
||||||
.main-content {
|
.main-content {
|
||||||
line-height: var(--f-lh);
|
line-height: var(--f-lh);
|
||||||
|
margin-left: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.footnotes {
|
div.footnotes {
|
||||||
@@ -229,6 +233,7 @@ figcaption.caption {
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
width: 300px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.menu-items .chapterToc, .menu-items .likechapterToc {
|
.menu-items .chapterToc, .menu-items .likechapterToc {
|
||||||
@@ -331,7 +336,7 @@ div.center {
|
|||||||
margin-right: 0 !important;
|
margin-right: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
main.titlepage h2.chapterHead {
|
main.main-content h2.chapterHead, main.main-content h2.likechapterHead {
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,3 +384,213 @@ h4 {
|
|||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img[alt~="PIC"], iframe, a img {
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
border: 2px solid var(--c-black);
|
||||||
|
}
|
||||||
|
|
||||||
|
main.main-content, div.footnotes, main.titlepage {
|
||||||
|
background-color: var(--c-beige);
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrapper {
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
background-color: var(--c-black-background);
|
||||||
|
width: 100%;
|
||||||
|
height: 340px;
|
||||||
|
display: flex;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header img {
|
||||||
|
border-radius: 0px;
|
||||||
|
border: none;
|
||||||
|
width: 710px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.book-content {
|
||||||
|
display: flex;
|
||||||
|
padding: 0px 40px;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.TOC.menu {
|
||||||
|
width: 330px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.TOC, nav.TOC a, nav.TOC a:visited {
|
||||||
|
background-color: transparent;
|
||||||
|
color: var(--c-black);
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-group {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-inner {
|
||||||
|
border: 2px solid var(--c-black);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-entry {
|
||||||
|
padding: 1px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-arrow {
|
||||||
|
width: 14px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.TOC span:hover, nav.TOC span:hover *, nav.TOC span.chapterToc.selected, nav.TOC span.chapterToc.selected a {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-entry:hover {
|
||||||
|
background-color: #c8c8c8;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.flowchart-image-wrapper {
|
||||||
|
background: white;
|
||||||
|
padding: 20px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
border: 2px solid var(--c-black);
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-items .menu-group:last-of-type .menu-arrow {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote {
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-right: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.crosslinks-bottom {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.crosslinks-bottom a {
|
||||||
|
display: inline-block;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
border: 2px solid var(--c-black);
|
||||||
|
color: var(--c-black);
|
||||||
|
padding: 4px;
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.crosslinks-bottom a.prev {
|
||||||
|
margin-right: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.crosslinks-bottom a:hover {
|
||||||
|
color: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-group.selected .menu-inner {
|
||||||
|
background-color: #c8c8c8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.TOC.menu {
|
||||||
|
margin-bottom: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-banner {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.header {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.book-content {
|
||||||
|
padding: 0px;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content {
|
||||||
|
width: 100%;
|
||||||
|
margin-left: 0px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 0px 14px;
|
||||||
|
margin-top: 20px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.TOC.menu {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
background: var(--c-black-background);
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav.TOC, nav.TOC a, nav.TOC a:visited {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.menu-arrow {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-inner {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-group.selected .menu-inner {
|
||||||
|
background: var(--c-black-background);
|
||||||
|
}
|
||||||
|
|
||||||
|
p.flowchart-image-wrapper {
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-entry:hover {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.TOC.menu {
|
||||||
|
margin-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mobile-banner {
|
||||||
|
display: block;
|
||||||
|
background-color: var(--c-black-background);
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
.mobile-banner a img {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Andail,
|
|||||||
Andreas Schmid,
|
Andreas Schmid,
|
||||||
Andrzej Mitelski,
|
Andrzej Mitelski,
|
||||||
Anna G.,
|
Anna G.,
|
||||||
anonnn,
|
Anonnn,
|
||||||
Anthony Atkinson,
|
Anthony Atkinson,
|
||||||
Aurore,
|
Aurore,
|
||||||
Beatriz,
|
Beatriz,
|
||||||
@@ -26,6 +26,7 @@ BTSkete,
|
|||||||
C Fazio,
|
C Fazio,
|
||||||
Cal Kotz,
|
Cal Kotz,
|
||||||
Case,
|
Case,
|
||||||
|
Cédric Andrieu,
|
||||||
Charlene Adkins,
|
Charlene Adkins,
|
||||||
Chin Pui Ling,
|
Chin Pui Ling,
|
||||||
Chris DuBosq,
|
Chris DuBosq,
|
||||||
@@ -35,7 +36,6 @@ Christiane B,
|
|||||||
Christine,
|
Christine,
|
||||||
Chrysanna,
|
Chrysanna,
|
||||||
Colleen Guidone,
|
Colleen Guidone,
|
||||||
Cédric Andrieu,
|
|
||||||
Danieel,
|
Danieel,
|
||||||
Daniel,
|
Daniel,
|
||||||
David,
|
David,
|
||||||
@@ -48,7 +48,7 @@ Duivelsjong,
|
|||||||
Elaine Leung,
|
Elaine Leung,
|
||||||
Ellie,
|
Ellie,
|
||||||
Ethan,
|
Ethan,
|
||||||
Francois le Danois,
|
François le Danois,
|
||||||
Fredrik,
|
Fredrik,
|
||||||
Geoff,
|
Geoff,
|
||||||
Guillermo,
|
Guillermo,
|
||||||
@@ -59,7 +59,6 @@ Ilsefa,
|
|||||||
Inma Mcleish,
|
Inma Mcleish,
|
||||||
Jackie,
|
Jackie,
|
||||||
Jacques Lucke,
|
Jacques Lucke,
|
||||||
Jacques Lucke,
|
|
||||||
Jan Chrillesen,
|
Jan Chrillesen,
|
||||||
Jan-Pieter Van Den Wittenboer,
|
Jan-Pieter Van Den Wittenboer,
|
||||||
Jane,
|
Jane,
|
||||||
@@ -135,7 +134,6 @@ Smirnov,
|
|||||||
Spencer,
|
Spencer,
|
||||||
Strambinha,
|
Strambinha,
|
||||||
Sue,
|
Sue,
|
||||||
Sue,
|
|
||||||
Sune,
|
Sune,
|
||||||
Susan,
|
Susan,
|
||||||
Sven,
|
Sven,
|
||||||
@@ -145,7 +143,7 @@ Therealbruce,
|
|||||||
Tracy \& Paul Will,
|
Tracy \& Paul Will,
|
||||||
Usliv,
|
Usliv,
|
||||||
Vassil Dichev,
|
Vassil Dichev,
|
||||||
Vladimir
|
Vladimir Smirnov,
|
||||||
Voicu,
|
Voicu,
|
||||||
Zika,
|
Zika,
|
||||||
Zoltan.
|
Zoltan.
|
||||||
|
|||||||
|
Can't render this file because it has a wrong number of fields in line 148.
|
@@ -7,7 +7,7 @@
|
|||||||
100 / 212 & Water evaporation & Water begins to evaporate and inflates your dough's alveoli.\\
|
100 / 212 & Water evaporation & Water begins to evaporate and inflates your dough's alveoli.\\
|
||||||
118 / 244 & Acetic acid evaporation & The vinegary tasting acid starts to evaporate, sourness decreases.\\
|
118 / 244 & Acetic acid evaporation & The vinegary tasting acid starts to evaporate, sourness decreases.\\
|
||||||
122 / 252 & Lactic acid evaporation & The dairy tasting lactic acid begins to evaporate, sourness further decreases.\\
|
122 / 252 & Lactic acid evaporation & The dairy tasting lactic acid begins to evaporate, sourness further decreases.\\
|
||||||
140 / 284 & Maillard reaction & The maillard reaction starts to deform starches and proteins.
|
140 / 284 & Maillard reaction & The Maillard reaction starts to deform starches and proteins.
|
||||||
The dough starts browning.\\
|
The dough starts browning.\\
|
||||||
170 / 338 & Caramelization & Remaining sugars begin to caramelise giving your bread a distinct flavor.\\ \bottomrule
|
170 / 338 & Caramelization & Remaining sugars begin to caramelise giving your bread a distinct flavor.\\ \bottomrule
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
%TODO: Alignement is not great
|
%TODO: Alignment is not great
|
||||||
\begin{tabular}{@{}lll@{}}
|
\begin{tabular}{@{}lll@{}}
|
||||||
\toprule
|
\toprule
|
||||||
& \textbf{Flat breads} & \textbf{Pancakes} \\ \midrule
|
& \textbf{Flat breads} & \textbf{Pancakes} \\ \midrule
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ should dissipate within 12--24~hours, and you have
|
|||||||
the added advantage of automatically having
|
the added advantage of automatically having
|
||||||
room-temperature water.
|
room-temperature water.
|
||||||
|
|
||||||
Make sure to use whole grain flour (whole-wheat, whole-rye, etc.).
|
Make sure to use whole grain flour (whole-wheat, whole-rye, \etc{}).
|
||||||
These flours have more natural wild yeast and
|
These flours have more natural wild yeast and
|
||||||
bacterial contamination. Making a starter
|
bacterial contamination. Making a starter
|
||||||
from just white flour sometimes doesn't work.
|
from just white flour sometimes doesn't work.
|
||||||
@@ -188,12 +188,11 @@ protecting your sourdough starter from aerobic mold entering through
|
|||||||
the top.
|
the top.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\includegraphics[width=0.5\textwidth]{sourdough-starter-hooch}
|
\includegraphics[width=0.5\textwidth]{sourdough-starter-hooch}
|
||||||
\caption[Hooch] {Hooch building on top of a sourdough
|
\caption[Hooch] {Hooch building on top of a sourdough
|
||||||
starter~\cite{liquid+on+starter}.}%
|
starter~\cite{liquid+on+starter}.}%
|
||||||
\label{fig:hooch}
|
\label{fig:hooch}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Simply stir your sourdough starter to homogenize the hooch back
|
Simply stir your sourdough starter to homogenize the hooch back
|
||||||
@@ -321,12 +320,11 @@ When tasting acetic acid, the flavor of your bread is often perceived
|
|||||||
as quite strong.
|
as quite strong.
|
||||||
|
|
||||||
\begin{figure}[!htb]
|
\begin{figure}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-ethanol-oxidation.tex}
|
\input{figures/fig-ethanol-oxidation.tex}
|
||||||
\caption[Acetic acid creation]{Oxygen is required to create acetic
|
\caption[Acetic acid creation]{Oxygen is required to create acetic
|
||||||
acid~\cite{acetic+acid+production}.}%
|
acid~\cite{acetic+acid+production}.}%
|
||||||
\label{fig:ethanol-oxidation}
|
\label{fig:ethanol-oxidation}
|
||||||
\end{center}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
This is nothing bad. But if you would like to change
|
This is nothing bad. But if you would like to change
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 626 KiB |
@@ -45,11 +45,10 @@ that tastes much better than any store-bought bread.
|
|||||||
\section{The process}
|
\section{The process}
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-wheat-sourdough-process.tex}
|
\input{figures/fig-wheat-sourdough-process.tex}
|
||||||
\caption{The typical process of making a wheat-based sourdough bread.}%
|
\caption{The typical process of making a wheat-based sourdough bread.}%
|
||||||
\label{fig:wheat-sourdough-process}
|
\label{fig:wheat-sourdough-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
The whole process of making great sourdough bread starts with
|
The whole process of making great sourdough bread starts with
|
||||||
@@ -99,7 +98,7 @@ doesn't have a good balance of yeast to bacteria, so will your
|
|||||||
main dough.
|
main dough.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-starter-readiness.tex}
|
\input{figures/fig-starter-readiness.tex}
|
||||||
\caption[Process to prepare your starter before baking]{The process to check
|
\caption[Process to prepare your starter before baking]{The process to check
|
||||||
your sourdough starter when making wheat-based doughs. In practice
|
your sourdough starter when making wheat-based doughs. In practice
|
||||||
@@ -110,7 +109,6 @@ main dough.
|
|||||||
shown water quantities, i.e., if the chart shows \qty{100}{\gram} of
|
shown water quantities, i.e., if the chart shows \qty{100}{\gram} of
|
||||||
water, use \qtyrange{50}{60}{\gram} of water for your stiff starter.}%
|
water, use \qtyrange{50}{60}{\gram} of water for your stiff starter.}%
|
||||||
\label{fig:process-starter-wheat-sourdough}
|
\label{fig:process-starter-wheat-sourdough}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
Generally, think of the dough you are mixing as a big starter with salt.
|
Generally, think of the dough you are mixing as a big starter with salt.
|
||||||
@@ -137,7 +135,7 @@ the microorganisms.
|
|||||||
Some people use a 1:1:1 ratio to refresh the starter. This would
|
Some people use a 1:1:1 ratio to refresh the starter. This would
|
||||||
be one part of the old starter (\qty{10}{\gram} for instance), 1 part of flour,
|
be one part of the old starter (\qty{10}{\gram} for instance), 1 part of flour,
|
||||||
and one part of water. I~think this is utter rubbish. As mentioned
|
and one part of water. I~think this is utter rubbish. As mentioned
|
||||||
your starter is a gigantic dough. You would never opt for a 1:1:1 ratio to
|
your starter is a miniature dough. You would never opt for a 1:1:1 ratio to
|
||||||
make dough. You might use a maximum of \qty{20}{\percent} starter to
|
make dough. You might use a maximum of \qty{20}{\percent} starter to
|
||||||
make dough. That's why I~advocate using a 1:5:5 ratio or a
|
make dough. That's why I~advocate using a 1:5:5 ratio or a
|
||||||
1:10:10 ratio depending on how ripe your starter is. As I~almost
|
1:10:10 ratio depending on how ripe your starter is. As I~almost
|
||||||
@@ -520,12 +518,11 @@ value to \qtyrange{5}{10}{\percent}. The other option could be to place the doug
|
|||||||
environment and thus reduce the speed at which your microorganisms replicate.
|
environment and thus reduce the speed at which your microorganisms replicate.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-starter-usage-activity.tex}
|
\input{tables/table-starter-usage-activity.tex}
|
||||||
\caption[Quantity of sourdough]{A table visualizing how much sourdough
|
\caption[Quantity of sourdough]{A table visualizing how much sourdough
|
||||||
starter to use depending on temperature and the starter's activity
|
starter to use depending on temperature and the starter's activity
|
||||||
level.}
|
level.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Based on my experience and my sourdough, my ideal bread always takes around 8
|
Based on my experience and my sourdough, my ideal bread always takes around 8
|
||||||
@@ -561,11 +558,10 @@ all the gases during the fermentation process. Without the gluten network,
|
|||||||
the gases would just diffuse out of your dough.
|
the gases would just diffuse out of your dough.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-kneading-process.tex}
|
\input{figures/fig-kneading-process.tex}
|
||||||
\caption{The gluten development process for a wheat-based dough.}%
|
\caption{The gluten development process for a wheat-based dough.}%
|
||||||
\label{fig:wheat-sourdough-kneading-process}
|
\label{fig:wheat-sourdough-kneading-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
It might sound odd, but the most important part of kneading is waiting. By
|
It might sound odd, but the most important part of kneading is waiting. By
|
||||||
@@ -751,12 +747,11 @@ flavor of the resulting bread is better compared to a pale
|
|||||||
underfermented dough.
|
underfermented dough.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-fermentation-effects.tex}
|
\input{tables/table-fermentation-effects.tex}
|
||||||
\caption[Stages of sourdough fermentation]{The different stages of
|
\caption[Stages of sourdough fermentation]{The different stages of
|
||||||
sourdough fermentation and the effects on crumb, alveoli, texture,
|
sourdough fermentation and the effects on crumb, alveoli, texture,
|
||||||
and overall taste.}
|
and overall taste.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
The worst thing you can do when fermenting sourdough
|
The worst thing you can do when fermenting sourdough
|
||||||
@@ -777,7 +772,7 @@ is much larger. The doughs are perfect to be made in a
|
|||||||
machine.
|
machine.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-bulk-fermentation.tex}
|
\input{figures/fig-bulk-fermentation.tex}
|
||||||
\caption[Process to check the bulk fermentation]{During the bulk
|
\caption[Process to check the bulk fermentation]{During the bulk
|
||||||
fermentation, multiple doughs are fermented together in bulk. A
|
fermentation, multiple doughs are fermented together in bulk. A
|
||||||
@@ -785,7 +780,6 @@ machine.
|
|||||||
stage of fermentation is completed. This chart shows multiple available
|
stage of fermentation is completed. This chart shows multiple available
|
||||||
options to check on the bulk fermentation progress.}%
|
options to check on the bulk fermentation progress.}%
|
||||||
\label{fig:bulk-fermentation}
|
\label{fig:bulk-fermentation}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
Experienced bakers will tell you to go by the look and feel of
|
Experienced bakers will tell you to go by the look and feel of
|
||||||
@@ -798,8 +792,7 @@ My go-to method for beginners is to use an \emph{Aliquot jar}.
|
|||||||
The aliquot is a sample that you extract from your dough. The
|
The aliquot is a sample that you extract from your dough. The
|
||||||
sample is extracted after creating the initial dough strength.
|
sample is extracted after creating the initial dough strength.
|
||||||
You monitor the aliquot's size increase to judge the
|
You monitor the aliquot's size increase to judge the
|
||||||
level of fermentation of your main dough. The aliquot
|
level of fermentation of your main dough. As your
|
||||||
sample is extracted after creating dough strength. As your
|
|
||||||
dough ferments, so does the content of your aliquot jar. The moment your
|
dough ferments, so does the content of your aliquot jar. The moment your
|
||||||
sample reached a certain size, your main dough is ready
|
sample reached a certain size, your main dough is ready
|
||||||
to be shaped and proofed. The size increase you should
|
to be shaped and proofed. The size increase you should
|
||||||
@@ -814,12 +807,11 @@ up to \qty{100}{\percent} with subsequent bakes. Then identify a value
|
|||||||
that you are happy with.
|
that you are happy with.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-dough-size-increase.tex}
|
\input{tables/table-dough-size-increase.tex}
|
||||||
\caption[Increase of size versus protein content]{Reference values for
|
\caption[Increase of size versus protein content]{Reference values for
|
||||||
how much size increase to aim for with an aliquot jar depending on
|
how much size increase to aim for with an aliquot jar depending on
|
||||||
the dough's protein content.}
|
the dough's protein content.}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
The beauty of the aliquot is that no matter the surrounding
|
The beauty of the aliquot is that no matter the surrounding
|
||||||
@@ -896,12 +888,11 @@ bread didn't turn out the way you like, either shorten
|
|||||||
the fermentation or extend it a little bit.
|
the fermentation or extend it a little bit.
|
||||||
|
|
||||||
\begin{table}[!htb]
|
\begin{table}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{tables/table-ph-values-dough.tex}%
|
\input{tables/table-ph-values-dough.tex}%
|
||||||
\caption[Dough's pH during bread preparation]{Example pH values for
|
\caption[Dough's pH during bread preparation]{Example pH values for
|
||||||
the different breakpoints of my own sourdough process.}%
|
the different breakpoints of my own sourdough process.}%
|
||||||
\label{table:sample-ph-values}
|
\label{table:sample-ph-values}
|
||||||
\end{center}
|
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
The beauty of this method is its reliability. Once you have found
|
The beauty of this method is its reliability. Once you have found
|
||||||
@@ -921,7 +912,12 @@ as rough ballpark figures. Regardless, you need to find values
|
|||||||
that work for your setup.
|
that work for your setup.
|
||||||
|
|
||||||
Another limitation is the price. You will need to purchase
|
Another limitation is the price. You will need to purchase
|
||||||
a high-tech pH meter, ideally, a meter featuring a spearhead.
|
a high-tech pH meter, ideally, a meter featuring a spearhead
|
||||||
|
\footnote{Not every pH meter is suitable for measuring dough.
|
||||||
|
Please refer to the manual to make sure it is certified for
|
||||||
|
measuring the pH of liquid and semi-solid media. To receive
|
||||||
|
accurate pH readings further ensure that your pH meter
|
||||||
|
is properly calibrated.}.
|
||||||
This way you can directly poke the meter deep into the dough.
|
This way you can directly poke the meter deep into the dough.
|
||||||
At the same time, automated temperature adjustments are a
|
At the same time, automated temperature adjustments are a
|
||||||
feature to look out for. Depending on the temperature,
|
feature to look out for. Depending on the temperature,
|
||||||
@@ -1120,12 +1116,11 @@ The step is required if you are making multiple loaves in one
|
|||||||
batch. It is optional if you are making a single loaf.
|
batch. It is optional if you are making a single loaf.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-dividing-preshaping.tex}
|
\input{figures/fig-dividing-preshaping.tex}
|
||||||
\caption[Is dividing your dough required check]{Dividing is only required when you are
|
\caption[Is dividing your dough required check]{Dividing is only required when you are
|
||||||
making multiple loaves in a single dough batch.}%
|
making multiple loaves in a single dough batch.}%
|
||||||
\label{fig:dividing-decision-tree}
|
\label{fig:dividing-decision-tree}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
The goal of dividing your dough into smaller pieces is to portion
|
The goal of dividing your dough into smaller pieces is to portion
|
||||||
@@ -1235,12 +1230,11 @@ your environment.
|
|||||||
\section{Shaping}
|
\section{Shaping}
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-shaping-process.tex}
|
\input{figures/fig-shaping-process.tex}
|
||||||
\caption[Sourdough shaping process]{A schematic visualization of the shaping process
|
\caption[Sourdough shaping process]{A schematic visualization of the shaping process
|
||||||
including checks for an overfermented dough.}%
|
including checks for an overfermented dough.}%
|
||||||
\label{fig:shaping-decision-tree}
|
\label{fig:shaping-decision-tree}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
Shaping will give your dough the final shape before baking. After
|
Shaping will give your dough the final shape before baking. After
|
||||||
@@ -1460,13 +1454,12 @@ their biochemical processes. More research is needed on the topic
|
|||||||
of retarding and flavor development.
|
of retarding and flavor development.
|
||||||
|
|
||||||
\begin{flowchart}[!htb]
|
\begin{flowchart}[!htb]
|
||||||
\begin{center}
|
\centering
|
||||||
\input{figures/fig-proofing-process.tex}
|
\input{figures/fig-proofing-process.tex}
|
||||||
\caption[Sourdough proofing process]{A schematic overview of the different steps of
|
\caption[Sourdough proofing process]{A schematic overview of the different steps of
|
||||||
the sourdough proofing process. The proofing technique to choose depends
|
the sourdough proofing process. The proofing technique to choose depends
|
||||||
on your availability and schedule.}%
|
on your availability and schedule.}%
|
||||||
\label{fig:proofing-process}
|
\label{fig:proofing-process}
|
||||||
\end{center}
|
|
||||||
\end{flowchart}
|
\end{flowchart}
|
||||||
|
|
||||||
To me, the sole purpose of cold-proofing is its ability to allow you
|
To me, the sole purpose of cold-proofing is its ability to allow you
|
||||||
@@ -1676,7 +1669,7 @@ An additional trick that can help you to combine the benefits
|
|||||||
of room temperature-proofing and easy cold-proofing scoring
|
of room temperature-proofing and easy cold-proofing scoring
|
||||||
is to place your dough in the freezer for 30~minutes before baking.
|
is to place your dough in the freezer for 30~minutes before baking.
|
||||||
Once you notice your dough is almost done proofing, move it to the
|
Once you notice your dough is almost done proofing, move it to the
|
||||||
freezer. The freezer will dry out the doughs's surface even further
|
freezer. The freezer will dry out the dough's surface even further
|
||||||
while also lowering its viscosity, making scoring easier.
|
while also lowering its viscosity, making scoring easier.
|
||||||
|
|
||||||
Another interesting trick is to bake your dough for 30 seconds without steam.
|
Another interesting trick is to bake your dough for 30 seconds without steam.
|
||||||
|
|||||||
6
makefile
6
makefile
@@ -5,6 +5,7 @@ DOCKER_CMD := docker run --rm -it -v $(PWD):/opt/repo --platform linux/x86_64 $(
|
|||||||
|
|
||||||
.PHONY: bake build_pdf build_docker_image push_docker_image validate website
|
.PHONY: bake build_pdf build_docker_image push_docker_image validate website
|
||||||
.PHONY: print_os_version start_shell printvars show_tools_version mrproper
|
.PHONY: print_os_version start_shell printvars show_tools_version mrproper
|
||||||
|
.PHONY: build_serif_pdf build_ebook booklet
|
||||||
|
|
||||||
# Dockers targets
|
# Dockers targets
|
||||||
build_docker_image:
|
build_docker_image:
|
||||||
@@ -24,11 +25,14 @@ build_pdf:
|
|||||||
$(DOCKER_CMD) "cd /opt/repo/book && make"
|
$(DOCKER_CMD) "cd /opt/repo/book && make"
|
||||||
|
|
||||||
bake:
|
bake:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make -j bake"
|
$(DOCKER_CMD) "cd /opt/repo/book && make bake"
|
||||||
|
|
||||||
website:
|
website:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make website"
|
$(DOCKER_CMD) "cd /opt/repo/book && make website"
|
||||||
|
|
||||||
|
booklet:
|
||||||
|
$(DOCKER_CMD) "cd /opt/repo/book && make build_booklet"
|
||||||
|
|
||||||
mrproper:
|
mrproper:
|
||||||
$(DOCKER_CMD) "cd /opt/repo/book && make mrproper"
|
$(DOCKER_CMD) "cd /opt/repo/book && make mrproper"
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ GEM
|
|||||||
method_source (1.0.0)
|
method_source (1.0.0)
|
||||||
nokogiri (1.15.3-arm64-darwin)
|
nokogiri (1.15.3-arm64-darwin)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
|
nokogiri (1.15.3-x86_64-darwin)
|
||||||
|
racc (~> 1.4)
|
||||||
nokogiri (1.15.3-x86_64-linux)
|
nokogiri (1.15.3-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
pry (0.14.2)
|
pry (0.14.2)
|
||||||
@@ -14,6 +16,7 @@ GEM
|
|||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-22
|
arm64-darwin-22
|
||||||
|
x86_64-darwin-22
|
||||||
x86_64-linux
|
x86_64-linux
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
|||||||
BIN
website/assets/arrow.png
Normal file
BIN
website/assets/arrow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 298 B |
BIN
website/assets/banner.png
Normal file
BIN
website/assets/banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 170 KiB |
BIN
website/assets/og_image_mixins.png
Normal file
BIN
website/assets/og_image_mixins.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 319 KiB |
@@ -52,19 +52,27 @@ class ModifyBuild
|
|||||||
text = fix_titles(text)
|
text = fix_titles(text)
|
||||||
text = fix_menu(text)
|
text = fix_menu(text)
|
||||||
text = fix_cover_page(text) if is_cover_page?(filename)
|
text = fix_cover_page(text) if is_cover_page?(filename)
|
||||||
|
text = add_header_banner(text)
|
||||||
text = add_home_link_to_menu(text)
|
text = add_home_link_to_menu(text)
|
||||||
text = fix_anchor_hyperlinks_menu(text)
|
text = fix_anchor_hyperlinks_menu(text)
|
||||||
text = add_favicon(text)
|
text = add_favicon(text)
|
||||||
text = add_meta_tags(text, filename)
|
text = add_meta_tags(text, filename)
|
||||||
text = remove_section_table_of_contents(text)
|
text = remove_section_table_of_contents(text)
|
||||||
text = mark_menu_as_selected_if_on_page(text, extract_file_from_path(filename))
|
|
||||||
text = add_canonical_for_duplicates(text, extract_file_from_path(filename))
|
text = add_canonical_for_duplicates(text, extract_file_from_path(filename))
|
||||||
text = include_javascript(text)
|
text = include_javascript(text)
|
||||||
text = add_text_to_coverpage(text, extract_file_from_path(filename))
|
text = add_text_to_coverpage(text, extract_file_from_path(filename))
|
||||||
text = fix_js_dependency_link(text)
|
text = fix_js_dependency_link(text)
|
||||||
text = fix_list_of_tables_figures_duplicates(text)
|
text = fix_list_of_tables_figures_duplicates(text)
|
||||||
text = add_anchors_to_headers(text)
|
text = add_anchors_to_headers(text)
|
||||||
|
text = create_menu_groups(text)
|
||||||
|
text = fix_top_links(text)
|
||||||
|
text = fix_flowchart_background(text)
|
||||||
|
text = remove_empty_menu_links(text)
|
||||||
|
text = fix_bottom_cross_links(text)
|
||||||
|
text = insert_mobile_header_graphic(text)
|
||||||
text = fix_https_links(text)
|
text = fix_https_links(text)
|
||||||
|
text = add_anchors_to_glossary_items(text) if is_glossary_page?(filename)
|
||||||
|
text = mark_menu_as_selected_if_on_page(text, extract_file_from_path(filename))
|
||||||
text = fix_menus_list_figures_tables(text) if is_list_figures_tables?(filename)
|
text = fix_menus_list_figures_tables(text) if is_list_figures_tables?(filename)
|
||||||
text = fix_list_of_figures_tables_display(text) if is_list_figures_tables?(filename)
|
text = fix_list_of_figures_tables_display(text) if is_list_figures_tables?(filename)
|
||||||
File.open(filename, "w:UTF-8") {|file| file.puts text }
|
File.open(filename, "w:UTF-8") {|file| file.puts text }
|
||||||
@@ -76,6 +84,10 @@ class ModifyBuild
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def is_glossary_page?(filename)
|
||||||
|
filename.include?("Glossary.html")
|
||||||
|
end
|
||||||
|
|
||||||
def is_list_figures_tables?(filename)
|
def is_list_figures_tables?(filename)
|
||||||
["listfigurename.html", "listtablename.html", "listoflocname.html", "bibname.html"].any? do |name|
|
["listfigurename.html", "listtablename.html", "listoflocname.html", "bibname.html"].any? do |name|
|
||||||
filename.include?(name)
|
filename.include?(name)
|
||||||
@@ -147,6 +159,45 @@ class ModifyBuild
|
|||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_menu_groups(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
groups = build_groups(doc.css(".menu-items > span"))
|
||||||
|
menu_el = doc.css(".menu-items")[0]
|
||||||
|
html = ""
|
||||||
|
groups.each do |group|
|
||||||
|
out = ""
|
||||||
|
group.each do |g|
|
||||||
|
if g.to_html.length > 0
|
||||||
|
out += %Q{<div class="menu-entry">#{g.to_html}</div>}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
html += %Q{<div class="menu-group">
|
||||||
|
<div class="menu-inner">
|
||||||
|
#{out}
|
||||||
|
</div>
|
||||||
|
<img class="menu-arrow" src="arrow.png" />
|
||||||
|
</div>}
|
||||||
|
end
|
||||||
|
menu_el.inner_html = html
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_groups(menu_items)
|
||||||
|
final_groups = []
|
||||||
|
tmp_groups = []
|
||||||
|
menu_items.each_with_index do |el, index|
|
||||||
|
# Get next item and check if it is a lower entry level in the menu.
|
||||||
|
next_item = menu_items[index + 1]
|
||||||
|
if next_item && next_item["class"].include?("chapterToc") || next_item.nil?
|
||||||
|
final_groups.push(tmp_groups.push(el))
|
||||||
|
tmp_groups = []
|
||||||
|
else
|
||||||
|
tmp_groups.push(el)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
final_groups
|
||||||
|
end
|
||||||
|
|
||||||
# By default the titles look boring. This changes the titles of all the
|
# By default the titles look boring. This changes the titles of all the
|
||||||
# pages and adds the book name as appendix
|
# pages and adds the book name as appendix
|
||||||
def fix_titles(text)
|
def fix_titles(text)
|
||||||
@@ -232,7 +283,7 @@ class ModifyBuild
|
|||||||
content = doc.css("body > .main-content")[0]
|
content = doc.css("body > .main-content")[0]
|
||||||
menu = doc.css("body > nav")[0]
|
menu = doc.css("body > nav")[0]
|
||||||
content = %Q{
|
content = %Q{
|
||||||
<main class="titlepage">
|
<main class="titlepage main-content">
|
||||||
<a href="Thehistoryofsourdough.html">
|
<a href="Thehistoryofsourdough.html">
|
||||||
<img src="cover-page.jpg" />
|
<img src="cover-page.jpg" />
|
||||||
<div class="version"><p>#{version}</p></div>
|
<div class="version"><p>#{version}</p></div>
|
||||||
@@ -252,7 +303,7 @@ class ModifyBuild
|
|||||||
menu = doc.css(".menu-items")[0]
|
menu = doc.css(".menu-items")[0]
|
||||||
return text if menu.nil?
|
return text if menu.nil?
|
||||||
|
|
||||||
home_html = %Q{<span class="chapterToc home-link"><a href="/">The Sourdough Framework</a></span>}
|
home_html = %Q{<span class="chapterToc home-link"><a href="/">🍞 The Sourdough Framework</a></span>}
|
||||||
# Normally the flowcharts link should be automatically added, but there
|
# Normally the flowcharts link should be automatically added, but there
|
||||||
# seems to be a problem in the generation. See:
|
# seems to be a problem in the generation. See:
|
||||||
# https://github.com/hendricius/the-sourdough-framework/pull/188 for more
|
# https://github.com/hendricius/the-sourdough-framework/pull/188 for more
|
||||||
@@ -263,12 +314,12 @@ class ModifyBuild
|
|||||||
<span class="link_text">List of Flowcharts</span>
|
<span class="link_text">List of Flowcharts</span>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="chapterToc">
|
<span class="chapterToc listtables-menu">
|
||||||
<a href="listtablename.html">
|
<a href="listtablename.html">
|
||||||
<span class="link_text">List of Tables</span>
|
<span class="link_text">List of Tables</span>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="chapterToc">
|
<span class="chapterToc listfigures-menu">
|
||||||
<a href="listfigurename.html">
|
<a href="listfigurename.html">
|
||||||
<span class="link_text">List of Figures</span>
|
<span class="link_text">List of Figures</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -305,7 +356,7 @@ class ModifyBuild
|
|||||||
<span class="chapterToc">
|
<span class="chapterToc">
|
||||||
<a href="https://breadco.de/kofi">
|
<a href="https://breadco.de/kofi">
|
||||||
<span class="chapter_number">⭐️</span>
|
<span class="chapter_number">⭐️</span>
|
||||||
<span class="link_text">Donate</span>
|
<span class="link_text">Support me</span>
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
@@ -313,6 +364,38 @@ class ModifyBuild
|
|||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Adds a header banner to each page
|
||||||
|
def add_header_banner(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
body = doc.css("body")[0]
|
||||||
|
footnotes = doc.css(".footnotes")[0]
|
||||||
|
main = doc.css(".main-content")[0]
|
||||||
|
menu = doc.css(".menu")[0]
|
||||||
|
if main.nil? || menu.nil?
|
||||||
|
#raise ArgumentError.new("Don't know how to handle")
|
||||||
|
return doc.to_html
|
||||||
|
end
|
||||||
|
body.inner_html = %Q{
|
||||||
|
<div class='wrapper'>
|
||||||
|
#{build_header_html}
|
||||||
|
<div class='book-content'>
|
||||||
|
#{menu.to_html}
|
||||||
|
<main class='main-content'>
|
||||||
|
#{main.inner_html}
|
||||||
|
#{footnotes ? footnotes.to_html : ''}
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
return doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_header_html
|
||||||
|
%Q{
|
||||||
|
<div class="header"><a href="/"><img src="banner.png"></a></div>
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
# Some of the menu links are added in the wrong order. Remove them since we
|
# Some of the menu links are added in the wrong order. Remove them since we
|
||||||
# later on add them in the structure that we want.
|
# later on add them in the structure that we want.
|
||||||
def remove_duplicate_entries_menu(text)
|
def remove_duplicate_entries_menu(text)
|
||||||
@@ -430,13 +513,14 @@ class ModifyBuild
|
|||||||
"Sourdoughstartertypes.html" => "og_image_sourdough_starter_types.png",
|
"Sourdoughstartertypes.html" => "og_image_sourdough_starter_types.png",
|
||||||
"Storingbread.html" => "og_image_storing_bread.png",
|
"Storingbread.html" => "og_image_storing_bread.png",
|
||||||
"Thehistoryofsourdough.html" => "og_image_the_history_of_sourdough.png",
|
"Thehistoryofsourdough.html" => "og_image_the_history_of_sourdough.png",
|
||||||
"Wheatsourdough.html" => "og_image_troubleshooting.png",
|
"Wheatsourdough.html" => "og_image_wheat_sourdough.png",
|
||||||
|
"Troubleshooting.html" => "og_image_troubleshooting.png",
|
||||||
|
"Mixins.html" => "og_image_mixins.png",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def mark_menu_as_selected_if_on_page(text, filename)
|
def mark_menu_as_selected_if_on_page(text, filename)
|
||||||
doc = build_doc(text)
|
doc = build_doc(text)
|
||||||
return doc.to_html
|
|
||||||
|
|
||||||
selected = doc.css(".menu-items .chapterToc > a").find do |el|
|
selected = doc.css(".menu-items .chapterToc > a").find do |el|
|
||||||
el["href"] == ""
|
el["href"] == ""
|
||||||
@@ -451,7 +535,17 @@ class ModifyBuild
|
|||||||
# Special case for the flowcharts page which is added by us to the menu.
|
# Special case for the flowcharts page which is added by us to the menu.
|
||||||
# This needs to be done for future manually added pages too
|
# This needs to be done for future manually added pages too
|
||||||
if "listoflocname.html" == filename
|
if "listoflocname.html" == filename
|
||||||
doc.css(".menu-items .chapterToc.flowcharts-menu")[0].add_class("selected")
|
doc.css(".menu-items .chapterToc.flowcharts-menu")[0].ancestors(".menu-group")[0].add_class("selected")
|
||||||
|
return doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
if "listtablename.html" == filename
|
||||||
|
doc.css(".menu-items .chapterToc.listtables-menu")[0].ancestors(".menu-group")[0].add_class("selected")
|
||||||
|
return doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
if "listfigurename.html" == filename
|
||||||
|
doc.css(".menu-items .chapterToc.listfigures-menu")[0].ancestors(".menu-group")[0].add_class("selected")
|
||||||
return doc.to_html
|
return doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -460,7 +554,7 @@ class ModifyBuild
|
|||||||
# Fix that when the menu is selected the href is empty. This way users can
|
# Fix that when the menu is selected the href is empty. This way users can
|
||||||
# click the menu and the page will reload.
|
# click the menu and the page will reload.
|
||||||
selected["href"] = filename
|
selected["href"] = filename
|
||||||
selected.parent.add_class("selected")
|
selected.ancestors(".menu-group")[0].add_class("selected")
|
||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -491,14 +585,28 @@ class ModifyBuild
|
|||||||
def add_text_to_coverpage(text, filename)
|
def add_text_to_coverpage(text, filename)
|
||||||
return text unless is_cover_page?(filename)
|
return text unless is_cover_page?(filename)
|
||||||
doc = build_doc(text)
|
doc = build_doc(text)
|
||||||
content = doc.css(".titlepage")[0]
|
content = doc.css(".main-content")[0]
|
||||||
raise ArgumentError.new(".titlepage not found in HTML") if content.nil?
|
|
||||||
|
|
||||||
content.add_class("main-content")
|
|
||||||
content.inner_html = "#{build_cover_page_content} #{content.inner_html}"
|
content.inner_html = "#{build_cover_page_content} #{content.inner_html}"
|
||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def add_anchors_to_glossary_items(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
content = doc.css("dt.description")
|
||||||
|
content.each do |el|
|
||||||
|
term = el.css("span")[0]
|
||||||
|
item_name = term&.text
|
||||||
|
# No anchor for whatever reason
|
||||||
|
next unless item_name
|
||||||
|
|
||||||
|
anchor = item_name.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
|
||||||
|
copy_link = %Q{<a href="#term-#{anchor}" class="permalink">🔗</a>}
|
||||||
|
el.set_attribute("id", "term-#{anchor}")
|
||||||
|
term.inner_html = "#{term.inner_html}#{copy_link}"
|
||||||
|
end
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
def build_cover_page_content
|
def build_cover_page_content
|
||||||
%Q{
|
%Q{
|
||||||
<h2 class="chapterHead home-title">
|
<h2 class="chapterHead home-title">
|
||||||
@@ -521,7 +629,9 @@ class ModifyBuild
|
|||||||
to everyone, I have decided to make it available as a free digital download.
|
to everyone, I have decided to make it available as a free digital download.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<a href="bread.jpg">
|
||||||
<img alt="One of my best Sourdough Breads" class="home-bread" src="bread.jpg" />
|
<img alt="One of my best Sourdough Breads" class="home-bread" src="bread.jpg" />
|
||||||
|
</a>
|
||||||
|
|
||||||
<p class="noindent">
|
<p class="noindent">
|
||||||
However, producing and maintaining resources like this requires
|
However, producing and maintaining resources like this requires
|
||||||
@@ -605,13 +715,10 @@ class ModifyBuild
|
|||||||
# this.
|
# this.
|
||||||
def fix_menus_list_figures_tables(text)
|
def fix_menus_list_figures_tables(text)
|
||||||
doc = build_doc(text)
|
doc = build_doc(text)
|
||||||
content = doc.css(".menu-items > .subsectionToc, .menu-items > .sectionToc")
|
content = doc.css(".menu-group .subsectionToc, .menu-group .sectionToc")
|
||||||
content.each do |node|
|
content.each do |node|
|
||||||
node.remove
|
node.ancestors(".menu-entry")[0].remove
|
||||||
end
|
end
|
||||||
doc.css(".menu-items > .lotToc").each(&:remove)
|
|
||||||
doc.css(".menu-items > .lofToc").each(&:remove)
|
|
||||||
doc.css(".menu-items > br").each(&:remove)
|
|
||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -623,7 +730,7 @@ class ModifyBuild
|
|||||||
doc.to_html
|
doc.to_html
|
||||||
end
|
end
|
||||||
|
|
||||||
# For some reason the depdency is missing a // in the url.
|
# For some reason the dependency is missing a // in the url.
|
||||||
def fix_js_dependency_link(text)
|
def fix_js_dependency_link(text)
|
||||||
text.gsub("https:/cdn.jsdelivr.net", "https://cdn.jsdelivr.net")
|
text.gsub("https:/cdn.jsdelivr.net", "https://cdn.jsdelivr.net")
|
||||||
end
|
end
|
||||||
@@ -651,6 +758,63 @@ class ModifyBuild
|
|||||||
def fix_https_links(text)
|
def fix_https_links(text)
|
||||||
text.gsub(/https:\/(?!\/)/, 'https://')
|
text.gsub(/https:\/(?!\/)/, 'https://')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def fix_top_links(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
el = doc.css(".crosslinks-top")[0]
|
||||||
|
el.remove if el
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def remove_empty_menu_links(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
menus = doc.css(".menu-group")
|
||||||
|
menus.each do |m|
|
||||||
|
element = m.css("span.chapterToc")[0]
|
||||||
|
next unless element
|
||||||
|
if element.inner_html == "" || element.inner_html == " "
|
||||||
|
m.remove
|
||||||
|
end
|
||||||
|
end
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def insert_mobile_header_graphic(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
content = doc.css(".TOC.menu")[0]
|
||||||
|
content.after('<div class="mobile-banner"><a href="/"><img src="banner.png" /></a></div>')
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def fix_flowchart_background(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
images = doc.css("img")
|
||||||
|
images.each do |img|
|
||||||
|
src = img.attr("src")
|
||||||
|
is_flowchart = src.include?(".svg")
|
||||||
|
next unless is_flowchart
|
||||||
|
img.parent.add_class("flowchart-image-wrapper")
|
||||||
|
|
||||||
|
end
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
|
|
||||||
|
def fix_bottom_cross_links(text)
|
||||||
|
doc = build_doc(text)
|
||||||
|
link_cont = doc.css(".crosslinks-bottom")[0]
|
||||||
|
return doc.to_html unless link_cont
|
||||||
|
|
||||||
|
links = doc.css(".crosslinks-bottom a")
|
||||||
|
prev_link = links.find {|l| l.inner_html == "prev" }
|
||||||
|
next_link = links.find {|l| l.inner_html == "next" }
|
||||||
|
prev_html = prev_link ? "<a class='prev' href='#{prev_link.attr('href')}'>Previous page</a>" : ''
|
||||||
|
next_html = next_link ? "<a class='next' href='#{next_link.attr('href')}'>Next page</a>" : ''
|
||||||
|
link_cont.inner_html = %Q{
|
||||||
|
#{prev_html}
|
||||||
|
#{next_html}
|
||||||
|
}
|
||||||
|
doc.to_html
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ModifyBuild.build
|
ModifyBuild.build
|
||||||
|
|||||||
Reference in New Issue
Block a user