From f6afbfcd58558f49cc25ba5422c6019810469225 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sun, 9 Mar 2025 07:28:48 +0100 Subject: [PATCH 001/347] prep note for v0.2.0 --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index c0a2a50..9175ff4 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -15,7 +15,7 @@ When creating books, you might want to reuse material from other people or from Previously, this book feature was implemented using [submodules](../external/Nested-Books/README.md), but the implementation was more difficult to use. Despite this, submodules are still a widely used Git feature that can be very useful for book authors, so check out the [submodules page](../external/Nested-Books/README.md) to learn more, especially if the External TOC tool does not satisfy your needs. Submodules have a few additional features not (yet) implemented using the External TOC. ```{warning} -The External TOC features are not incorporated in the new deploy book workflow yet (this will happen once the workflow specifies `teachbooks>=0.2.0`). +The External TOC features are incorporated in `v0.2.0` of the TeachBooks package. If you are using a TeachBooks Template book or our deploy-book-workflow this will become part of your book builds in GitHub Actions as the cache for your book expires (typically around 1 week after not editing your book branch). We do not expect it to cause issues with existing books, but if it does, you can use the following in your requirements file: `teachbooks<0.2.0`. ``` ## What does it do? From 22eacbfe2738536294f97d98d35c41351a854d0a Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sun, 9 Mar 2025 07:31:47 +0100 Subject: [PATCH 002/347] typo --- book/features/teachbooks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 2561e70..b2780f8 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -8,7 +8,7 @@ This page is useful for user type 3-5. {bdg-secondary}`Python Package: teachbooks` -Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}Deploy Book Workflow `, which builds our TeachBooks). +Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}`Deploy Book Workflow `, which builds our TeachBooks). ```{admonition} Why is this useful? :class: tip From a25cdfe4c5de3f8a8d2b3b21e23601b3d428c08a Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sun, 9 Mar 2025 07:31:57 +0100 Subject: [PATCH 003/347] filename change --- book/_toc.yml | 2 +- book/features/{teachbooks.md => draft-release.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename book/features/{teachbooks.md => draft-release.md} (100%) diff --git a/book/_toc.yml b/book/_toc.yml index 0219d36..223bb61 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -57,7 +57,7 @@ parts: - file: features/easy-editing.md sections: - file: external/template/README.md - - file: features/teachbooks + - file: features/draft-release - file: external/deploy-book-workflow/README.md - file: features/pull_request_build.md - file: features/local_server diff --git a/book/features/teachbooks.md b/book/features/draft-release.md similarity index 100% rename from book/features/teachbooks.md rename to book/features/draft-release.md From 53fdeda76078ac204f91e0899cb524a64ca2ffb2 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sun, 9 Mar 2025 07:45:36 +0100 Subject: [PATCH 004/347] add draft-release page ref --- book/features/draft-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index b2780f8..9b62b51 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -1,4 +1,4 @@ -(teachbooks-package)= +(draft-release)= # Draft-Release Workflow ```{admonition} User types From 88670064288f38fca39043cd6b85b49ccec49190 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 20 Mar 2025 11:23:21 +0100 Subject: [PATCH 005/347] add script for live code --- book/features/directories.py | 22 ++++++++++++++++++++++ book/features/live_code.ipynb | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 book/features/directories.py diff --git a/book/features/directories.py b/book/features/directories.py new file mode 100644 index 0000000..02bb2a8 --- /dev/null +++ b/book/features/directories.py @@ -0,0 +1,22 @@ +import os +import json + +def list_file_types(directory): + file_types = set() + for root, _, files in os.walk(directory): + for file in files: + _, ext = os.path.splitext(file) + if ext: # Only include files with extensions + file_types.add(ext) + return sorted(file_types) + +def format_file_types(file_types): + formatted = [f"**/*{ext}" for ext in file_types] + return formatted + +if __name__ == "__main__": + book_directory = r"c:\Users\tomvanwoudenbe\Git\book\book" + file_types = list_file_types(book_directory) + formatted_file_types = format_file_types(file_types) + print("File types in the directory (formatted):") + print(json.dumps(formatted_file_types)) \ No newline at end of file diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 3971cac..a4703a7 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -85,7 +85,7 @@ "The `html_js_files` link calls for some required javascript files. `use_thebe_lite` makes sure you initiate our adapted sphinx thebe extensions. The `exclude_patterns` makes sure you import all files so that they can be accessed from your code, except for the files matching the patterns shown.\n", "\n", ":::{note}\n", - "If you've a lot of big files which are not used by the code, the build book repository might grow a lot in size. Include unnecessary filetypes like images (i.e. `\"**/*.png`) to `exclude_patterns`. Make sure you use proper markdown or MyST syntax for referencing to images. Using HTML code might lead to figures not being available in the final book.\n", + "If you've a lot of big files which are not used by the code, the build book repository might grow a lot in size. Include unnecessary filetypes like images (i.e. `\"**/*.png`) to `exclude_patterns`. Make sure you use proper markdown or MyST syntax for referencing to images. Using HTML code might lead to figures not being available in the final book. You can use [this python script](./directories.py) to list all filetypes in your book.\n", ":::\n", "\n", "By `launch_buttons` you initiate the {fa}`rocket` --> {guilabel}`Live Code` on the top right corner of every page generated from a `.ipynb` file. \n", From 9270ac543bce1b9df529377b91bd1651aa4d7c31 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 21 Mar 2025 15:12:00 +0100 Subject: [PATCH 006/347] update manual --- book/external/deploy-book-workflow | 2 +- book/external/template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index b9c7623..b655fb1 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit b9c76239ed042eb5befb6fa47f14d44de5113c51 +Subproject commit b655fb125d39ad35b980357ed5ea20f3ed4204a4 diff --git a/book/external/template b/book/external/template index a8958fe..43f37f9 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit a8958fe48c839729226e1d1765dbf26617cf6c59 +Subproject commit 43f37f9bafcfa91f82be765302d505bc64c114ee From 25044d4c93b86869a2736f390885fe98527447e2 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 21 Mar 2025 15:25:37 +0100 Subject: [PATCH 007/347] Update Nested-Books --- book/external/Nested-Books | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Nested-Books b/book/external/Nested-Books index a8e57da..134fcc3 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit a8e57da25302d47806ad1fe4288950c438562199 +Subproject commit 134fcc3384f0e01591881b59265a58b4eeee849b From e5426cc81e8f878da913146ea88fd453bc3f97f2 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sat, 22 Mar 2025 07:26:52 +0100 Subject: [PATCH 008/347] small notes sphinx-extrensions page --- book/features/sphinx_extensions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/sphinx_extensions.md b/book/features/sphinx_extensions.md index fa53945..f74ed20 100644 --- a/book/features/sphinx_extensions.md +++ b/book/features/sphinx_extensions.md @@ -5,4 +5,4 @@ This section is useful for user type 4-5. ``` -This sections includes the features developed by TeachBooks which add functionality to the book. Most of them are implemented as sphinx extensions, which are plugins developed for the Sphinx documentation ecosystem (which Jupyter Book is built upon). They extend or modify Sphinx’s capabilities. Since Sphinx extensions are not an integral part of jupyter-book, as opposed to original jupyter-book features, they must be installed and configured explicitly, for example in the `_config.yml` file. \ No newline at end of file +This sections includes the features developed by TeachBooks which add functionality to the book. Most of them are implemented as sphinx extensions {bdg-primary}`Sphinx Extension`, which are plugins developed for the Sphinx documentation ecosystem (which Jupyter Book is built upon). They extend or modify Sphinx’s capabilities. Since Sphinx extensions are not an integral part of jupyter-book, as opposed to original jupyter-book features, they must be installed and configured explicitly, for example in the `_config.yml` and `requirements.txt` files. \ No newline at end of file From 2bd4db8be3588130ec214cb964bff087063f864f Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 08:18:36 +0100 Subject: [PATCH 009/347] rm submodule JupyterBook-Patches --- .gitmodules | 4 ---- book/external/JupyterBook-Patches | 1 - 2 files changed, 5 deletions(-) delete mode 100644 book/external/JupyterBook-Patches diff --git a/.gitmodules b/.gitmodules index 5cabeb7..9f77bd4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -18,10 +18,6 @@ path = book/external/Sphinx-Image-Inverter url = https://github.com/TeachBooks/Sphinx-Image-Inverter.git branch = Manual -[submodule "book/external/JupyterBook-Patches"] - path = book/external/JupyterBook-Patches - url = https://github.com/TeachBooks/JupyterBook-Patches.git - branch = manual_docs [submodule "book/external/Download-Link-Replacer"] path = book/external/Download-Link-Replacer url = https://github.com/TeachBooks/Download-Link-Replacer.git diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches deleted file mode 100644 index d5efad9..0000000 --- a/book/external/JupyterBook-Patches +++ /dev/null @@ -1 +0,0 @@ -3a1ed3738693931fb735810cbc7a9a5734e85788 \ No newline at end of file From 88fd03fea5f2974e05138991f96da30e6d318745 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 08:19:57 +0100 Subject: [PATCH 010/347] add jupyterboko-patcches backin --- .gitmodules | 4 ++++ book/external/JupyterBook-Patches | 1 + 2 files changed, 5 insertions(+) create mode 160000 book/external/JupyterBook-Patches diff --git a/.gitmodules b/.gitmodules index 9f77bd4..4b36129 100644 --- a/.gitmodules +++ b/.gitmodules @@ -54,3 +54,7 @@ path = book/external/Sphinx-PRIME-applets url = https://github.com/TeachBooks/Sphinx-PRIME-applets.git branch = manual +[submodule "book/external/JupyterBook-Patches"] + path = book/external/JupyterBook-Patches + url = https://github.com/TeachBooks/JupyterBook-Patches.git + branch = manual_docs diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches new file mode 160000 index 0000000..3a1ed37 --- /dev/null +++ b/book/external/JupyterBook-Patches @@ -0,0 +1 @@ +Subproject commit 3a1ed3738693931fb735810cbc7a9a5734e85788 From a8915bfcaf3ae4a9991acbe5129dadac2c2e66de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 07:21:09 +0000 Subject: [PATCH 011/347] Bump book/external/template from `43f37f9` to `1a29a78` Bumps [book/external/template](https://github.com/TeachBooks/template) from `43f37f9` to `1a29a78`. - [Commits](https://github.com/TeachBooks/template/compare/43f37f9bafcfa91f82be765302d505bc64c114ee...1a29a7826bb6327347799a37a40a6b73badc5ff8) --- updated-dependencies: - dependency-name: book/external/template dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/template b/book/external/template index 43f37f9..1a29a78 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 43f37f9bafcfa91f82be765302d505bc64c114ee +Subproject commit 1a29a7826bb6327347799a37a40a6b73badc5ff8 From 3b8f143ad31e5d3f7e01b68a5ba1f86ed1dd832f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 07:21:11 +0000 Subject: [PATCH 012/347] Bump book/external/deploy-book-workflow from `b655fb1` to `01eef2d` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `b655fb1` to `01eef2d`. - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/b655fb125d39ad35b980357ed5ea20f3ed4204a4...01eef2d619bbe8dd2558fde924e6efb2ba23c136) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index b655fb1..01eef2d 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit b655fb125d39ad35b980357ed5ea20f3ed4204a4 +Subproject commit 01eef2d619bbe8dd2558fde924e6efb2ba23c136 From 40c9f63cb94b5c7abdfc80a98e6342f70545e43a Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Sat, 22 Mar 2025 17:10:41 +0100 Subject: [PATCH 013/347] WIP --- book/_toc.yml | 1 + book/features/draft-release.md | 2 +- book/features/external_toc.md | 2 +- book/features/local_server.md | 2 +- book/features/overview.md | 2 +- book/features/teachbooks.md | 28 ++++++++++++++++++++++++++++ 6 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 book/features/teachbooks.md diff --git a/book/_toc.yml b/book/_toc.yml index 223bb61..e04ffc8 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -98,6 +98,7 @@ parts: sections: - file: external/annotater/README.md - file: basic-features/hypothesis.md + - file: features/teachbooks - caption: Examples chapters: diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 9b62b51..8e36ea5 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-secondary}`Python Package: teachbooks` +{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}`Deploy Book Workflow `, which builds our TeachBooks). diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 9175ff4..30a460a 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-secondary}`Python Package: teachbooks` +{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` ## Introduction diff --git a/book/features/local_server.md b/book/features/local_server.md index fcdbbc1..8539b0b 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -6,7 +6,7 @@ This section is useful for user type 4-5. ``` -{bdg-secondary}`Python Package: teachbooks` +{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` Perhaps you have already noticed that when building a book and testing it locally on your computer, some features do not work the way you expect, or worse---do not work at all! This is because many interactive features rely on browser functionality to work properly, for example: Grasple/H5p iframe exercises, Sphinx-Thebe Python interactivity and HTML/Javascript elements. Although the website is _static_ (i.e., there is no code running on a webserver that generates the content), modern web browsers have their own internal computing environments that run processes to deliver the rich content we desire in our books. diff --git a/book/features/overview.md b/book/features/overview.md index 4a6cd20..e59742d 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -13,7 +13,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-warning}`Javascript overlay` - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` -- {bdg-secondary}`Python Package: teachbooks` +- {bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` - {bdg-light}`GitHub Reusable Action` - {bdg-light}`GitHub Template` - {bdg-dark}`Git Workflow` diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md new file mode 100644 index 0000000..9a7d127 --- /dev/null +++ b/book/features/teachbooks.md @@ -0,0 +1,28 @@ +# TeachBooks Python Package + +```{admonition} User types +:class: tip +This section is useful for user type 4-5. +``` + +{bdg-secondary}`Python Package: teachbooks` + +The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](./teachbooks-template.md). This raises two important points: + +1. If you are a book user using the [TeachBooks Template](./teachbooks-template.md) or the [Deploy Book Workflow](./deploy-book-workflow.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). +2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). + +For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. It adds a few commands to the CLI (e.g., `serve`), but otherwise is meant to be used instead of the `jupyter-book` commands. It is conventionally used in an identical way: + +``` +teachbooks build book +``` + +## List of Features + +Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: +- Draft-Release Workflow: read more here +- External Contents: +- Local Server: + +The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. \ No newline at end of file From 2229dd7a7b1ad9abc612bd1c31c9d05af84b63a5 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:32:39 +0100 Subject: [PATCH 014/347] Update teachbooks.md --- book/features/teachbooks.md | 43 +++++++++++++------------------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 9a7d127..7cb8b65 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -1,28 +1,15 @@ -# TeachBooks Python Package - -```{admonition} User types -:class: tip -This section is useful for user type 4-5. -``` - -{bdg-secondary}`Python Package: teachbooks` - -The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](./teachbooks-template.md). This raises two important points: - -1. If you are a book user using the [TeachBooks Template](./teachbooks-template.md) or the [Deploy Book Workflow](./deploy-book-workflow.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). -2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). - -For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. It adds a few commands to the CLI (e.g., `serve`), but otherwise is meant to be used instead of the `jupyter-book` commands. It is conventionally used in an identical way: - -``` -teachbooks build book -``` - -## List of Features - -Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: -- Draft-Release Workflow: read more here -- External Contents: -- Local Server: - -The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. \ No newline at end of file + + + + + + + Page Redirection + + + + If you are not redirected automatically, follow this link to example. + + From 92b026d9053ab140631ca30ae8287615db15488a Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:34:06 +0100 Subject: [PATCH 015/347] Update overview.md --- book/features/overview.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/book/features/overview.md b/book/features/overview.md index e59742d..78dc3e1 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -22,4 +22,32 @@ Additionally, not all features are built and shared in the same way. We do our b Finally, the purpose, installation process and usage of each features is elaborated on in the respective sub-sections. -To see examples for these features, go to the [Examples chapter](../examples/overview.md). \ No newline at end of file +To see examples for these features, go to the [Examples chapter](../examples/overview.md). + +(teachbooks_package)= +## TeachBooks Python Package + +```{admonition} User types +:class: tip +This section is useful for user type 4-5. +``` + +The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](./teachbooks-template.md). This raises two important points: + +1. If you are a book user using the [TeachBooks Template](./teachbooks-template.md) or the [Deploy Book Workflow](./deploy-book-workflow.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). +2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). + +For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. It adds a few commands to the CLI (e.g., `serve`), but otherwise is meant to be used instead of the `jupyter-book` commands. It is conventionally used in an identical way: + +``` +teachbooks build book +``` + +### List of Features + +Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: +- Draft-Release Workflow: read more here +- External Contents: +- Local Server: + +The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. From 50131ee8479bb832b9fefc5255b66ad8d5675f3d Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:37:47 +0100 Subject: [PATCH 016/347] Update teachbooks.md --- book/features/teachbooks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 7cb8b65..1443ae7 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -1,3 +1,4 @@ +# TeachBooks Python Package From de6ba9e0fade30ae24e0716e52dd126159d2ce29 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:42:56 +0100 Subject: [PATCH 017/347] Update teachbooks.md --- book/features/teachbooks.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 1443ae7..8e652a4 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -3,14 +3,14 @@ - + Page Redirection - If you are not redirected automatically, follow this link to example. + If you are not redirected automatically, follow this link to example. From b78aa6ac84cfaee90e12557187a75525b6eb83ba Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:46:25 +0100 Subject: [PATCH 018/347] Update teachbooks.md --- book/features/teachbooks.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 8e652a4..2683330 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -3,14 +3,14 @@ - + Page Redirection - If you are not redirected automatically, follow this link to example. + If you are not redirected automatically, follow this link to example. From d572a0fd644ae61d38ffa3ab971d56383a684f25 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:49:37 +0100 Subject: [PATCH 019/347] Update teachbooks.md --- book/features/teachbooks.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 2683330..b60553d 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -3,14 +3,14 @@ - + Page Redirection - If you are not redirected automatically, follow this link to example. + If you are not redirected automatically, follow this link to example. From 9b82c05b553100ec795e32d18e0a2ae847868b03 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:50:40 +0100 Subject: [PATCH 020/347] Update overview.md --- book/features/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/overview.md b/book/features/overview.md index 78dc3e1..aa8c7a4 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -13,7 +13,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-warning}`Javascript overlay` - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` -- {bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` +- {bdg-link-secondary}`Python Package: teachbooks <./overview.html#teachbooks-python-package>` - {bdg-light}`GitHub Reusable Action` - {bdg-light}`GitHub Template` - {bdg-dark}`Git Workflow` From 3f77301b61e9ee4d01e9274a7f47ddad77b431f0 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:57:21 +0100 Subject: [PATCH 021/347] Delete book/features/teachbooks.md --- book/features/teachbooks.md | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 book/features/teachbooks.md diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md deleted file mode 100644 index b60553d..0000000 --- a/book/features/teachbooks.md +++ /dev/null @@ -1,16 +0,0 @@ -# TeachBooks Python Package - - - - - - - Page Redirection - - - - If you are not redirected automatically, follow this link to example. - - From ef4b94c9ce1a0493866fec0b4292f9f5c9297925 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:58:45 +0100 Subject: [PATCH 022/347] Update _toc.yml --- book/_toc.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/book/_toc.yml b/book/_toc.yml index e04ffc8..28e8a80 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -98,7 +98,6 @@ parts: sections: - file: external/annotater/README.md - file: basic-features/hypothesis.md - - file: features/teachbooks - caption: Examples chapters: @@ -127,4 +126,4 @@ parts: - file: references.md - file: credits - file: changelog - - file: contact \ No newline at end of file + - file: contact From 05f0045b400cd0573f5bb87545acce472a8a09ac Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 21:59:52 +0100 Subject: [PATCH 023/347] Update draft-release.md --- book/features/draft-release.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 8e36ea5..3666efa 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}`Deploy Book Workflow `, which builds our TeachBooks). @@ -70,4 +70,4 @@ We recommend you install this in an environment that is specifically dedicated f The package is a CLI tool that primarily provides a wrapper around the Jupyter Book package which is used for pre- and postprocessing. In this case "wrapper" refers to the CLI usage: CLI commands generally invoke `jupyter-book` commands internally; the `jupyter-book` package is _not_ distributed within the `teachbooks` package. -The source code and function of the package will eventually be documented on a Sphinx-built website ([teachbooks.io/TeachBooks/](https://teachbooks.io/TeachBooks/)), however, this is currently still under construction. \ No newline at end of file +The source code and function of the package will eventually be documented on a Sphinx-built website ([teachbooks.io/TeachBooks/](https://teachbooks.io/TeachBooks/)), however, this is currently still under construction. From b33bd13be5bf62ae621819aa941721e9ed85c8f9 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 22:00:14 +0100 Subject: [PATCH 024/347] Update external_toc.md --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 30a460a..46fa6cb 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` ## Introduction From fac95545dbbec7d8953f368884cfdc2eeb01bb55 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 22:00:38 +0100 Subject: [PATCH 025/347] Update local_server.md --- book/features/local_server.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/local_server.md b/book/features/local_server.md index 8539b0b..cd90463 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -6,7 +6,7 @@ This section is useful for user type 4-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./teachbooks.html>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` Perhaps you have already noticed that when building a book and testing it locally on your computer, some features do not work the way you expect, or worse---do not work at all! This is because many interactive features rely on browser functionality to work properly, for example: Grasple/H5p iframe exercises, Sphinx-Thebe Python interactivity and HTML/Javascript elements. Although the website is _static_ (i.e., there is no code running on a webserver that generates the content), modern web browsers have their own internal computing environments that run processes to deliver the rich content we desire in our books. @@ -138,4 +138,4 @@ A Windows-specific command for the CMD prompt or Powershell is: ``` TASKKILL /IM python.exe /F -``` \ No newline at end of file +``` From e1f25a8a48e6d1341bf6c28326db8e07638afc7e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 22:04:14 +0100 Subject: [PATCH 026/347] Update draft-release.md --- book/features/draft-release.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 3666efa..fb7f3db 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}`Deploy Book Workflow `, which builds our TeachBooks). From 55b68627bb5c5379a55d11c1ea4f51640341afdb Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 22:04:44 +0100 Subject: [PATCH 027/347] Update external_toc.md --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 46fa6cb..c80c8c8 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` ## Introduction From 62ddb348f6161784012481bf232ca24325191107 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 22 Mar 2025 22:05:08 +0100 Subject: [PATCH 028/347] Update local_server.md --- book/features/local_server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/local_server.md b/book/features/local_server.md index cd90463..2efb418 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -6,7 +6,7 @@ This section is useful for user type 4-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachBooks-python-package>` +{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` Perhaps you have already noticed that when building a book and testing it locally on your computer, some features do not work the way you expect, or worse---do not work at all! This is because many interactive features rely on browser functionality to work properly, for example: Grasple/H5p iframe exercises, Sphinx-Thebe Python interactivity and HTML/Javascript elements. Although the website is _static_ (i.e., there is no code running on a webserver that generates the content), modern web browsers have their own internal computing environments that run processes to deliver the rich content we desire in our books. From 761b6572aec8557115a6c8e278ce35235d011e90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Mar 2025 18:30:22 +0000 Subject: [PATCH 029/347] Bump book/external/deploy-book-workflow from `01eef2d` to `26afa87` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `01eef2d` to `26afa87`. - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/01eef2d619bbe8dd2558fde924e6efb2ba23c136...26afa87f90a4191de0e07f89c6de674ea8b81b8d) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 01eef2d..26afa87 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 01eef2d619bbe8dd2558fde924e6efb2ba23c136 +Subproject commit 26afa87f90a4191de0e07f89c6de674ea8b81b8d From 5d7ddb270771dfd8e12ebcc5386fd2075d8bd9be Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 23 Mar 2025 19:33:08 +0100 Subject: [PATCH 030/347] Update versions_URLs.md --- book/installation-and-setup/versions_URLs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/installation-and-setup/versions_URLs.md b/book/installation-and-setup/versions_URLs.md index 836ebaf..d948409 100644 --- a/book/installation-and-setup/versions_URLs.md +++ b/book/installation-and-setup/versions_URLs.md @@ -6,7 +6,7 @@ If you plan on maintaining only one public version, it is advisable to set `BEHA To share the built book / website of old versions for your book on GitHub you have a few options: - Create a branch for each version. When doing this, [the GitHub workflow](../external/deploy-book-workflow/README.md) will build it on GitHub pages. Here's a few tips: - - It's advised to use the version as branch name. In case of versions per academic year, you can just name each branch to the current academic year, this leads to the URL with the same name. In that case. + - It's advised to use the version as branch name. In case of versions per academic year, you can just name each branch to the current academic year, this leads to the URL with the same academic year.. - It is recommended to update the primary branch as the `PRIMARY BRANCH` when using the [GitHub workflow](gh-workflow-settings) whenever a new version is considered to be the most primary one. This ensures that readers are redirected to a consistent URL, even when new versions of the book are added later. - Eventually, you can add old branches to the list of `BRANCHES_ARCHIVED` when using the [GitHub workflow](gh-workflow-settings) to include a banner on the page indicating its archived state. Alternatively, you can add a banner manually to `_config.yml`, as explained [here](../basic-features/banner.md). - If you're using tags (as will be explained in [later](./versioning_changelog.md)), you can create a branch from a tag locally by running: `git branch `. From 9cb3724878cafe5ab8de3ad9552a22e7be9ad54b Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 24 Mar 2025 09:04:17 +0100 Subject: [PATCH 031/347] Update collab.md --- book/installation-and-setup/collab.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/installation-and-setup/collab.md b/book/installation-and-setup/collab.md index 9db1239..201c1c9 100644 --- a/book/installation-and-setup/collab.md +++ b/book/installation-and-setup/collab.md @@ -13,7 +13,7 @@ Finally, ensure that team members identify themselves according to the user type ## Review process Furthermore, establish a clear editing and review process. -For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {fa}`fa-github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/en/stable/basics/repository.html) is advised. +For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {fa}`github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/en/stable/basics/repository.html) is advised. (draft_book)= ## Define draft version of book @@ -46,4 +46,4 @@ Additionally, it is advisable to document the branch protection strategy and the - Block force pushes ## Private, internally or public -Choose whether you want to share your source code and built book privately, internally or publicly. In any case, you need to obey copyright-rules. We advise public repositories and books in line with a vision on open education. \ No newline at end of file +Choose whether you want to share your source code and built book privately, internally or publicly. In any case, you need to obey copyright-rules. We advise public repositories and books in line with a vision on open education. From 9665fb50270a6b813798f414e44c84202621dcbe Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 27 Mar 2025 09:42:42 +0100 Subject: [PATCH 032/347] add script to move images --- book/_toc.yml | 1 + book/helper_code/move_images.md | 3 + book/helper_code/parse_images.py | 207 +++++++++++++++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 book/helper_code/move_images.md create mode 100644 book/helper_code/parse_images.py diff --git a/book/_toc.yml b/book/_toc.yml index d841379..5088086 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -118,6 +118,7 @@ parts: - file: helper_code/intro.md sections: - file: helper_code/converter.md + - file: helper_code/move_images.md - file: external/Useful_python_code/snippit.ipynb - file: external/Useful_python_code/extensionfildownloadreturn.ipynb - file: external/Useful_python_code/figshrinker.ipynb diff --git a/book/helper_code/move_images.md b/book/helper_code/move_images.md new file mode 100644 index 0000000..1657c32 --- /dev/null +++ b/book/helper_code/move_images.md @@ -0,0 +1,3 @@ +# Move images to separate hosting + +Storing big binary files like images in your git repository and book is not good practice: diffs on binary files don't make sense and blow up the size of your repository. Furthermore, the size of your book website blows up too. Therefore, you can consider hosting your binary files on a different server, as explained [here in an example for the MUDE-book](https://tudelft-mude.github.io/teacher/FTP.html). To take all the images of your existing book and update the relative links, [a Python script](./parse_images.py) has been developed. This script processes Markdown (`.md`) and Jupyter Notebook (`.ipynb`) files listed in a `_toc.yml` file. It identifies local image references (including MyST `figure` syntax) in these files, copies the images to a specified folder (`new_images`), and replaces the local image paths with a public URL (e.g., `https://files.mude.citg.tudelft.nl/`). \ No newline at end of file diff --git a/book/helper_code/parse_images.py b/book/helper_code/parse_images.py new file mode 100644 index 0000000..e72f22d --- /dev/null +++ b/book/helper_code/parse_images.py @@ -0,0 +1,207 @@ +""" +Script: parse_images.py + +Description: +This script processes Markdown (.md) and Jupyter Notebook (.ipynb) files listed in a `_toc.yml` file. +It identifies local image references (including MyST `figure` syntax) in these files, copies the images +to a specified folder (`new_images`), and replaces the local image paths with a public URL +(e.g., `https://files.mude.citg.tudelft.nl/`). + +Key Features: +- Parses `_toc.yml` to extract all Markdown and Notebook files. +- Detects image references in Markdown files (e.g., `![alt text](image.png "title")`). +- Detects MyST `figure` syntax (e.g., `{figure} /path/to/image.png`). +- Resolves image paths relative to the file or project root. +- Handles image paths with optional titles (e.g., `"title"`) in Markdown and Notebook files. +- Skips processing images that are already converted to the public URL. +- Copies images to the `new_images` folder. +- Updates the files to replace local image paths with public URLs. + +How to Use: +1. Place this script in the root directory of your project (where `_toc.yml` is located). +2. Ensure `_toc.yml` contains the list of files to process. +3. Run the script using Python: python parse_images.py +4. The script will: +- Copy referenced images to the `new_images` folder. +- Update the Markdown and Notebook files with the new image URLs. + +Dependencies: +- Python 3.x +- PyYAML (install using `pip install pyyaml`) + +Notes: +- Ensure the script is run from the project root directory. +- The `base_url` variable should be updated to match your desired public URL prefix. +- The script handles image paths in the following formats: + - Relative paths (e.g., `image.png`, `./image.png`). + - Absolute paths (e.g., `/path/to/image.png`). + - Paths with optional titles (e.g., `![alt text](image.png "title")`). +""" + +import os +import re +import shutil +import yaml +import json + +# Define the folder where images will be copied +output_folder = "new_images" +base_url = "https://files.mude.citg.tudelft.nl/" + +# Ensure the output folder exists +os.makedirs(output_folder, exist_ok=True) + +# Function to parse the _toc.yml file and extract all Markdown and Notebook files +def get_files_from_toc(toc_file): + files = [] + with open(toc_file, "r", encoding="utf-8") as f: + toc = yaml.safe_load(f) + + # Recursive function to extract file paths + def extract_files(item): + if isinstance(item, dict): + if "file" in item: + # Add the file with the appropriate extension + file_path = item["file"] + if not file_path.endswith((".md", ".ipynb")): + if os.path.isfile(file_path + ".md"): + file_path += ".md" + elif os.path.isfile(file_path + ".ipynb"): + file_path += ".ipynb" + files.append(file_path) + if "sections" in item: + for section in item["sections"]: + extract_files(section) + if "chapters" in item: + for chapter in item["chapters"]: + extract_files(chapter) + elif isinstance(item, list): + for sub_item in item: + extract_files(sub_item) + + # Start extracting files from the "parts" section + extract_files(toc.get("parts", [])) + return files + +# Function to normalize image paths +def normalize_image_path(file_dir, image_path): + # Check if the path starts with a `/` (absolute path relative to the project root) + if image_path.startswith("/"): + # Resolve the path relative to the project root + project_root = os.getcwd() # Assuming the script is run from the project root + resolved_path = os.path.join(project_root, image_path.lstrip("/")) + else: + # Resolve the path relative to the file's directory + resolved_path = os.path.normpath(os.path.join(file_dir, image_path)) + return resolved_path + +# Function to find and replace local image references +def process_file(file_path): + if file_path.endswith(".md"): + process_markdown(file_path) + elif file_path.endswith(".ipynb"): + process_notebook(file_path) + +# Process Markdown files +def process_markdown(file_path): + file_dir = os.path.dirname(file_path) # Get the directory of the file + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + + # Find all standard Markdown image references (e.g., ![alt text](path "title")) + matches = re.findall(r"!\[.*?\]\((.*?)(?:\s+\".*?\")?\)", content) + # Find all MyST figure syntax references (e.g., {figure} path) + # Handles cases where the `---` block is missing or caption follows directly + myst_matches = re.findall(r"\{figure\}\s+(.*?)\s*(?:\n|$)", content) + matches.extend(myst_matches) + + for match in matches: + # Skip if the image path is already converted to the public URL + if match.startswith(base_url): + continue + + # Normalize and resolve the image path + image_path = normalize_image_path(file_dir, match) + + if os.path.isfile(image_path): + print(f"Image found: {image_path}") # Debugging output + # Copy the image to the output folder + image_name = os.path.basename(image_path) + new_path = os.path.join(output_folder, image_name) + shutil.copy(image_path, new_path) + + # Replace the local URL with the new URL + new_url = base_url + image_name + content = content.replace(match, new_url) + else: + print(f"Warning: Image not found: {image_path}") # Debugging output + + # Write the updated content back to the file + with open(file_path, "w", encoding="utf-8") as f: + f.write(content) + +# Process Jupyter Notebook files +def process_notebook(file_path): + file_dir = os.path.dirname(file_path) # Get the directory of the file + with open(file_path, "r", encoding="utf-8") as f: + notebook = json.load(f) + + updated = False + for cell in notebook.get("cells", []): + if cell.get("cell_type") == "markdown": + # Join all lines in the cell into a single string + cell_content = "".join(cell.get("source", [])) + + # Find all standard Markdown image references (e.g., ![alt text](path "title")) + matches = re.findall(r"!\[.*?\]\((.*?)(?:\s+\".*?\")?\)", cell_content) + # Find all MyST figure syntax references (e.g., {figure} path) + myst_matches = re.findall(r"\{figure\}\s+(.*?)\s*(?:\n|$)", cell_content) + matches.extend(myst_matches) + + for match in matches: + # Skip if the image path is already converted to the public URL + if match.startswith(base_url): + continue + + # Normalize and resolve the image path + image_path = normalize_image_path(file_dir, match) + + if os.path.isfile(image_path): + print(f"Image found: {image_path}") # Debugging output + # Copy the image to the output folder + image_name = os.path.basename(image_path) + new_path = os.path.join(output_folder, image_name) + shutil.copy(image_path, new_path) + + # Replace the local URL with the new URL + new_url = base_url + image_name + cell_content = cell_content.replace(match, new_url) + updated = True + else: + print(f"Warning: Image not found: {image_path}") # Debugging output + + # Split the updated content back into lines and update the cell + cell["source"] = cell_content.splitlines(keepends=True) + + # Write the updated notebook back to the file if changes were made + if updated: + with open(file_path, "w", encoding="utf-8") as f: + json.dump(notebook, f, indent=2) + +# Main function +def main(): + toc_file = "_toc.yml" # Replace with the path to your _toc.yml file + files = get_files_from_toc(toc_file) + + print("Files extracted from TOC:", files) # Debugging output + + for file_path in files: + # Ensure the file has the correct extension and exists + if os.path.isfile(file_path): + print(f"Processing file: {file_path}") # Debugging output + process_file(file_path) + else: + print(f"Warning: File {file_path} not found or unsupported.") + +if __name__ == "__main__": + main() \ No newline at end of file From eb87bd47f58b3c01d5727064b3d0d08f52140479 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 27 Mar 2025 09:46:13 +0100 Subject: [PATCH 033/347] fix relative link --- book/basic-features/badges.md | 6 +++--- book/features/overview.md | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/book/basic-features/badges.md b/book/basic-features/badges.md index 14fbff4..6fe1ad2 100644 --- a/book/basic-features/badges.md +++ b/book/basic-features/badges.md @@ -49,13 +49,13 @@ The basic code syntax for creating a button is as follows: :color: primary ``` ``` - -```{button-ref} ../features/overview.md +[](../features/overview.md) +```{button-ref} feature_overview :color: secondary ``` ``` - ```{button-ref} ../features/overview.md + ```{button-ref} feature_overview :color: secondary ``` ``` diff --git a/book/features/overview.md b/book/features/overview.md index 4a6cd20..35dd27f 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -1,3 +1,4 @@ +(feature_overview)= # Overview As TeachBooks, we collect a suite of existing open-source software so you don't have to! Some of the software is developed with our TA's to improve the learning experience of our students and ease the book-development process for our teachers. As the open-source software landscape changes rapidly, it is essential to keep in contact and share resources amongst ourselves to minimize maintenance and downtime for our book websites and focus on what really matters: teaching! From 3a08f5cf8c2fbe1dd222a9e83093ef97d45e3934 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 27 Mar 2025 09:46:56 +0100 Subject: [PATCH 034/347] fix link --- book/features/widgets.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/widgets.ipynb b/book/features/widgets.ipynb index cf1f593..63a0846 100644 --- a/book/features/widgets.ipynb +++ b/book/features/widgets.ipynb @@ -6,7 +6,7 @@ "source": [ "# Ipywidgets\n", "\n", - "If you publish widgets in a jupyter book they might (depending on your implementation) require an active python kernel for the output to be interactive. Using the [thebe-integration](../examples/live_code.md), this is possible. Note: You can circumvent the use of a kernel by using packages which don't need such a kernel, for example the [non-kernel-based widgets using Plotly](interactive_element).\n", + "If you publish widgets in a jupyter book they might (depending on your implementation) require an active python kernel for the output to be interactive. Using the [thebe-integration](../examples/live_code.md), this is possible. Note: You can circumvent the use of a kernel by using packages which don't need such a kernel, for example the [non-kernel-based widgets using Plotly](./plotly.ipynb).\n", "\n", "## `matplotlib` widgets\n", "When you'd like to use `ipywidgets` in combinations with a `matplotlib` figure, import the following packages:\n", From f97d42083925aec35ecdba7bd031104c498eeb6e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 27 Mar 2025 09:49:52 +0100 Subject: [PATCH 035/347] small fixes --- book/basic-features/equations.md | 8 +++++--- book/external/template | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/book/basic-features/equations.md b/book/basic-features/equations.md index 4f6d293..5ec7a99 100644 --- a/book/basic-features/equations.md +++ b/book/basic-features/equations.md @@ -29,9 +29,11 @@ $$ F = m \cdot a = 10 \cdot 9.81 = 98 \text{N}$$ To number the equations and refer in text, you need to provide a label to the equation. Just put the label between brackets and place it after the last \$\$, like this: - $$ - F = m \cdot a - $$ (newtons_second_law) +```md +$$ + F = m \cdot a +$$ (newtons_second_law) +``` Resulting in: diff --git a/book/external/template b/book/external/template index 1a29a78..82b2de6 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 1a29a7826bb6327347799a37a40a6b73badc5ff8 +Subproject commit 82b2de6a80b824482dd38f350a9aaf5f4a7a5fe0 From 4213bdc58739525adcf5523de47d9524167ed7ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 10:24:48 +0000 Subject: [PATCH 036/347] Bump book/external/JupyterBook-Patches from `3a1ed37` to `763b59d` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `3a1ed37` to `763b59d`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/3a1ed3738693931fb735810cbc7a9a5734e85788...763b59d720217a29b811e2c33449832cb443180f) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 3a1ed37..763b59d 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 3a1ed3738693931fb735810cbc7a9a5734e85788 +Subproject commit 763b59d720217a29b811e2c33449832cb443180f From 95134f24b4ffd119abb9d91ae62ca1d3c122070f Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 28 Mar 2025 11:04:05 +0100 Subject: [PATCH 037/347] Create CITATION.cff --- CITATION.cff | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..11e3ba9 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,41 @@ +# This CITATION.cff file was generated with cffinit. +# Visit https://bit.ly/cffinit to generate yours today! + +cff-version: 1.2.0 +message: 'If you use this Book, please cite it using these metadata.' +preferred-citation: + type: book + authors: + - email: info@teachbooks.io + name: 'TeachBooks Development Team' + website: 'https://teachbooks.io/' + url: 'https://teachbooks.io/manual/' + identifiers: + - type: url + value: 'https://teachbooks.io/manual/' + description: 'Published book on GitHub Pages' + - type: url + value: 'https://github.com/TeachBooks/manual' + description: 'GitHub repository' + abstract: >- + his manual assists you in creating and collaborating on JupyterBooks + for educational purposes. Some parts are specifically aimed for + teachers at Delft University of Technology, although all material and + tools are openly available. This manual aims at providing an easy start + and advanced usages for new and existing users with or without skills + on this topic. + keywords: + - TeachBooks + - Manual + - 'Jupyter Book' + title: 'TeachBooks Manual' + institution: + name: 'TeachBooks' + license: CC-BY-4.0 + license-url: 'https://creativecommons.org/licenses/by/4.0/' + copyright: '© 2025 TeachBooks' + languages: + - en + contact: + - email: info@teachbooks.io + name: 'TeachBooks Development Team' From f95a2b4e2a9bf97ff201780486d631d4039e9a71 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 28 Mar 2025 11:32:41 +0100 Subject: [PATCH 038/347] Update CITATION.cff --- CITATION.cff | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CITATION.cff b/CITATION.cff index 11e3ba9..87c0266 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -3,6 +3,11 @@ cff-version: 1.2.0 message: 'If you use this Book, please cite it using these metadata.' +authors: + - email: info@teachbooks.io + name: 'TeachBooks Development Team' + website: 'https://teachbooks.io/' +title: 'TeachBooks Manual source code' preferred-citation: type: book authors: From 5c61c64b0e4945dd67ef82ace097878c4dac790c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 28 Mar 2025 11:44:19 +0100 Subject: [PATCH 039/347] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 72d5d51..6ec7aee 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # TeachBooks Manual +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) [![call-deploy-book](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml/badge.svg)](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml) This manual assists you in creating and collaborating on [JupyterBooks](https://jupyterbook.org/) for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start and advanced usages for new and existing users with or without skills on this topic. it is part of TeachBooks, for more information visit [https://teachbooks.io/](https://teachbooks.io/). From 49e396a296622366e31abd63de235b090fbb58bf Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 28 Mar 2025 11:44:34 +0100 Subject: [PATCH 040/347] Update intro.md --- book/intro.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/book/intro.md b/book/intro.md index a918590..5e9715b 100644 --- a/book/intro.md +++ b/book/intro.md @@ -1,5 +1,7 @@ # TeachBooks Manual +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) + This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on Jupyter book. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users. We hope you find this resource useful and refer back to it often. TeachBooks originated at Delft University of Technology in the Netherlands, and some of the material in this Manual reflects tools and resources specific to TU Delft. With the exception of a few tools for which we have educational licenses at Delft, everything in this Manual is open source. Despite this, we are happy to grow our community beyond Delft and welcome contributions from all users. @@ -16,4 +18,4 @@ There are several "parts" to the manual: - The **Features** part describes a suite of tools that are useful for teachers, many of which are developed by TeachBooks contributors specifically for use in education. Many of these tools are illustrated in the **Examples**. - A few special tools are included in the **Editing Tools** that are useful when writing content. -See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. \ No newline at end of file +See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. From 5bb1d3275c3291d25e6c88504d73fdc0223d82a4 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 28 Mar 2025 11:46:12 +0100 Subject: [PATCH 041/347] Update credits.md --- book/credits.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/credits.md b/book/credits.md index 64caec1..cd2a79a 100644 --- a/book/credits.md +++ b/book/credits.md @@ -3,13 +3,13 @@ You can refer to this book in its entirety as: -> TeachBooks Development Team (2024), _TeachBooks Manual_. https://github.com/TeachBooks/manual. Retreived [Month, Year]. CC BY 4.0. +> TeachBooks Development Team (2024), _TeachBooks Manual_. https://doi.org/10.5281/zenodo.15100848. Retreived [Month, Year]. CC BY 4.0. The introduction, structure and decisions on content is done under direction of the TeachBooks Development Team. The content is written by many contributors, of which there are many. -We anticipate that the content of this book will change continuously. Therefore, if you'd like to refer to a specific chapter, we recommend using the source code directly with the citation that refers to the GitHub repository and lists the date and name of the file. Although content will be added over time, chapter titles and URL's in this book are expected to remain relatively static after Spring 2025. You can refer to individual chapters or pages within this book as: +We anticipate that the content of this book will change continuously. Therefore, if you'd like to refer to a specific chapter, we recommend using the source code directly with the citation that refers to the GitHub repository and lists the date and name of the file. Although content will be added over time, chapter titles and URL's in this book are expected to remain relatively static. You can refer to individual chapters or pages within this book as: -> `` (2024), ``. In _TeachBooks Manual_. https://github.com/TeachBooks/manual (chapter `./book/intro/`, retrieved [`<date>`]). +> `<Title of Chapter or Page>`. In TeachBooks Development Team (2024), _TeachBooks Manual_. https://doi.org/10.5281/zenodo.15100848. CC BY 4.0. (chapter `./book/intro/`, retrieved [`<date>`]). Better yet, include a link to the specific commit! _If you know what this means, we assume you know how to do it._ From ffdecc307dad1117bb3b7069828107e11d17c905 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Fri, 28 Mar 2025 11:47:39 +0100 Subject: [PATCH 042/347] Update CITATION.cff --- CITATION.cff | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 87c0266..72d95e1 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -14,8 +14,11 @@ preferred-citation: - email: info@teachbooks.io name: 'TeachBooks Development Team' website: 'https://teachbooks.io/' - url: 'https://teachbooks.io/manual/' + url: 'https://doi.org/10.5281/zenodo.15100847' identifiers: + - type: doi + value: 10.5281/zenodo.15100848 + description: Zenodo record - type: url value: 'https://teachbooks.io/manual/' description: 'Published book on GitHub Pages' @@ -39,6 +42,8 @@ preferred-citation: license: CC-BY-4.0 license-url: 'https://creativecommons.org/licenses/by/4.0/' copyright: '© 2025 TeachBooks' + version: v1.2.1 + date-released: '2025-03-28' languages: - en contact: From 3c6620ba1a39555e429f3acb266125959af5470d Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Fri, 28 Mar 2025 15:21:15 +0100 Subject: [PATCH 043/347] Create WAIVER --- WAIVER | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 WAIVER diff --git a/WAIVER b/WAIVER new file mode 100644 index 0000000..9979091 --- /dev/null +++ b/WAIVER @@ -0,0 +1,4 @@ +Technische Universiteit Delft hereby disclaims all copyright interest in the +program “TeachBooks Manual” (a book serving as documentation for various tooling +surrounding TeachBooks) written by the Author(s). +Stefan Aarninkhof, Dean of Civil Engineering & Geosciences From 3e24d222808fc608259f515c40cac4c7aec1ff53 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Fri, 28 Mar 2025 15:59:14 +0100 Subject: [PATCH 044/347] Revert "Update credits.md" This reverts commit 5bb1d3275c3291d25e6c88504d73fdc0223d82a4. --- book/credits.md | 6 ++++-- book/intro.md | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/book/credits.md b/book/credits.md index cd2a79a..dfdef48 100644 --- a/book/credits.md +++ b/book/credits.md @@ -3,13 +3,15 @@ You can refer to this book in its entirety as: -> TeachBooks Development Team (2024), _TeachBooks Manual_. https://doi.org/10.5281/zenodo.15100848. Retreived [Month, Year]. CC BY 4.0. +> TeachBooks Development Team (2024), _TeachBooks Manual_. https://github.com/TeachBooks/manual. Retreived [Month, Year]. CC BY 4.0. + +This book is already registered on Zenodo: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) The introduction, structure and decisions on content is done under direction of the TeachBooks Development Team. The content is written by many contributors, of which there are many. We anticipate that the content of this book will change continuously. Therefore, if you'd like to refer to a specific chapter, we recommend using the source code directly with the citation that refers to the GitHub repository and lists the date and name of the file. Although content will be added over time, chapter titles and URL's in this book are expected to remain relatively static. You can refer to individual chapters or pages within this book as: -> `<Title of Chapter or Page>`. In TeachBooks Development Team (2024), _TeachBooks Manual_. https://doi.org/10.5281/zenodo.15100848. CC BY 4.0. (chapter `./book/intro/`, retrieved [`<date>`]). +> `<Title of Chapter or Page>`. In _TeachBooks Manual_. https://github.com/TeachBooks/manual (chapter `./book/intro/`, retrieved [`<date>`]). Better yet, include a link to the specific commit! _If you know what this means, we assume you know how to do it._ diff --git a/book/intro.md b/book/intro.md index 5e9715b..f5784e3 100644 --- a/book/intro.md +++ b/book/intro.md @@ -1,7 +1,5 @@ # TeachBooks Manual -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) - This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on <a href="https://jupyterbook.org/"><img style="display:inline-block; height:1.5em; width:auto; transform:translate(0, -0.15em)" src="images/logo-wide.svg" alt="Jupyter book"></a>. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users. We hope you find this resource useful and refer back to it often. TeachBooks originated at Delft University of Technology in the Netherlands, and some of the material in this Manual reflects tools and resources specific to TU Delft. With the exception of a few tools for which we have educational licenses at Delft, everything in this Manual is open source. Despite this, we are happy to grow our community beyond Delft and welcome contributions from all users. From e434477333a62c81ee75e3bb07f2def48fcb4300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:27:09 +0000 Subject: [PATCH 045/347] Bump book/external/JupyterBook-Patches from `763b59d` to `aa93fc5` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `763b59d` to `aa93fc5`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/763b59d720217a29b811e2c33449832cb443180f...aa93fc51bf95876f8034005ffcd777045ea9ddc6) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 763b59d..aa93fc5 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 763b59d720217a29b811e2c33449832cb443180f +Subproject commit aa93fc51bf95876f8034005ffcd777045ea9ddc6 From 7e53a8d5bb1e8ad75673cfb63f6c07c50709a29e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:40:07 +0000 Subject: [PATCH 046/347] Bump jupyterbook-patches from 1.4.2 to 1.4.4 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.4.2 to 1.4.4. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.4.2...v1.4.4) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2532827..0451ff4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.1.0 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches==1.4.2 +jupyterbook_patches==1.4.4 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From e41e6744dc8a4fc94a0927ab420d06b30c78c819 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 1 Apr 2025 13:36:53 +0200 Subject: [PATCH 047/347] update attributions --- book/_config.yml | 2 +- book/_static/attribution.css | 4 ++ book/external/Download-Link-Replacer | 2 +- book/external/JupyterBook-Patches | 2 +- book/external/Nested-Books | 2 +- book/external/Sphinx-Grasple-public | 2 +- book/external/Sphinx-Image-Inverter | 2 +- book/external/Sphinx-Named-Colors | 2 +- book/external/Sphinx-PRIME-applets | 2 +- book/external/Sphinx-TUDelft-theme | 2 +- book/external/Sphinx-launch-buttons | 2 +- book/external/Useful_python_code | 2 +- book/external/annotater | 2 +- book/external/deploy-book-workflow | 2 +- book/external/sphinx-iframes | 2 +- book/external/teachbooks-sphinx-tippy | 2 +- book/external/template | 2 +- book/installation-and-setup/copyright.md | 5 +- .../copyright/considerations.md | 5 +- .../copyright/licenses.md | 5 +- .../copyright/recommendations.md | 59 +++++++++++++++++-- book/references.bib | 16 +++++ 22 files changed, 101 insertions(+), 25 deletions(-) create mode 100644 book/_static/attribution.css diff --git a/book/_config.yml b/book/_config.yml index 03274cc..eaa1a16 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -51,7 +51,7 @@ sphinx: tex: macros: "newcolor": ['\definecolor{newcolor}{RGB}{111, 29, 119}{\color{newcolor}#1}',1] - named_colors_custom_colors: {'onlylight':[165,21,160],'lightanddark':[45,180,117,204,158,110],'hyphen-color':[45,180,117,165,21,160]} + named_colors_custom_colors: {'onlylight':[165,21,160],'lightanddark':[45,180,117,204,158,110],'hyphen-color':[45,180,117,165,21,160],'attributiongrey':[150,150,150]} local_extensions: apastyle: _ext/ bracket_citation_style: _ext/ diff --git a/book/_static/attribution.css b/book/_static/attribution.css new file mode 100644 index 0000000..3c23cc3 --- /dev/null +++ b/book/_static/attribution.css @@ -0,0 +1,4 @@ +/* Attribution */ +div.attribution > .admonition-title::after { + content: "\f10d"; +} \ No newline at end of file diff --git a/book/external/Download-Link-Replacer b/book/external/Download-Link-Replacer index f69e970..b658d1c 160000 --- a/book/external/Download-Link-Replacer +++ b/book/external/Download-Link-Replacer @@ -1 +1 @@ -Subproject commit f69e970a8da7d85e5473c7e5f58299a2ee3cf331 +Subproject commit b658d1c6e1791097b225357025ebe7267d4dccb5 diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index aa93fc5..1a8e996 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit aa93fc51bf95876f8034005ffcd777045ea9ddc6 +Subproject commit 1a8e9960f0a37ce210df51198e0079430f1a2c6e diff --git a/book/external/Nested-Books b/book/external/Nested-Books index 134fcc3..dcdecc4 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit 134fcc3384f0e01591881b59265a58b4eeee849b +Subproject commit dcdecc4a7335163ce0f5a8975bfd366a17d5fb94 diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index f4eff8d..e13743c 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit f4eff8d1565eaf127898f2fe216cf5208684fb27 +Subproject commit e13743c7dd2d1de8a0dd7137da2841344ea0f330 diff --git a/book/external/Sphinx-Image-Inverter b/book/external/Sphinx-Image-Inverter index 250103c..8365d4a 160000 --- a/book/external/Sphinx-Image-Inverter +++ b/book/external/Sphinx-Image-Inverter @@ -1 +1 @@ -Subproject commit 250103c723aa782bcec785ae3d241cb1ffebd3d0 +Subproject commit 8365d4a366433bbbdfe7d7d0fbd617270c0e7130 diff --git a/book/external/Sphinx-Named-Colors b/book/external/Sphinx-Named-Colors index 191c2f4..6c5a0f4 160000 --- a/book/external/Sphinx-Named-Colors +++ b/book/external/Sphinx-Named-Colors @@ -1 +1 @@ -Subproject commit 191c2f4ac1755d3b50c6a63950eb6c2e5c035d75 +Subproject commit 6c5a0f4aa9a11b0ba9d5a8f68929ba5773c3312a diff --git a/book/external/Sphinx-PRIME-applets b/book/external/Sphinx-PRIME-applets index 43ea44c..29b5b48 160000 --- a/book/external/Sphinx-PRIME-applets +++ b/book/external/Sphinx-PRIME-applets @@ -1 +1 @@ -Subproject commit 43ea44ccdc917234513fcd0ea1b9d5159a7dc81f +Subproject commit 29b5b48126fadde3839ef20a6256bdbda72d4ef9 diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index e4b71f8..5f26d31 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit e4b71f810a66e302243377876f39e1dc4c4a8a6b +Subproject commit 5f26d318bf0696229041d20518900695d6ff935f diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index ccec26f..5acbe14 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit ccec26fd77d3b6f1bb3415b5eb824b3155a397f1 +Subproject commit 5acbe14ac0bfa4ab532b9b7c64e6462f16a7dbda diff --git a/book/external/Useful_python_code b/book/external/Useful_python_code index 7fbdbbf..1fb335f 160000 --- a/book/external/Useful_python_code +++ b/book/external/Useful_python_code @@ -1 +1 @@ -Subproject commit 7fbdbbf720c27112fb58bcf7826225197e39357b +Subproject commit 1fb335fb81ec9b88186161352f379e315a19d2f8 diff --git a/book/external/annotater b/book/external/annotater index 9340b4e..832cee0 160000 --- a/book/external/annotater +++ b/book/external/annotater @@ -1 +1 @@ -Subproject commit 9340b4e2856b6f2de331c31d2b74bd9dc286d276 +Subproject commit 832cee034927c9a51efd328e6e1d5c9157b94e32 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 26afa87..4415690 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 26afa87f90a4191de0e07f89c6de674ea8b81b8d +Subproject commit 44156900a23360478983a0920340ff2298110b78 diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 077ba23..0ebb0ed 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 077ba23fa29ef1f0dd454f2ebf93c107923d1068 +Subproject commit 0ebb0edea5f14144c6548e417f5b79c6d7721d77 diff --git a/book/external/teachbooks-sphinx-tippy b/book/external/teachbooks-sphinx-tippy index 338ad14..e37225d 160000 --- a/book/external/teachbooks-sphinx-tippy +++ b/book/external/teachbooks-sphinx-tippy @@ -1 +1 @@ -Subproject commit 338ad14d39115c620c57476931ce8fa177cf20d8 +Subproject commit e37225de883df69e0933849dfc4880d41e7c75b0 diff --git a/book/external/template b/book/external/template index 82b2de6..17b99b2 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 82b2de6a80b824482dd38f350a9aaf5f4a7a5fe0 +Subproject commit 17b99b2de4edbcbf4d8a92fed52c3d335431699b diff --git a/book/installation-and-setup/copyright.md b/book/installation-and-setup/copyright.md index f825244..1deaa0d 100644 --- a/book/installation-and-setup/copyright.md +++ b/book/installation-and-setup/copyright.md @@ -1,7 +1,10 @@ (copyright)= # Copyright and Licenses checklist -> This page reuses adapted CC BY content from the TU Delft Library. {cite:p}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +```{attributiongrey} Attribution +:class: attribution +This page reuses adapted CC BY content from the TU Delft Library. {cite:p}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +``` ```{admonition} User types :class: tip diff --git a/book/installation-and-setup/copyright/considerations.md b/book/installation-and-setup/copyright/considerations.md index b507d7f..80fa6aa 100644 --- a/book/installation-and-setup/copyright/considerations.md +++ b/book/installation-and-setup/copyright/considerations.md @@ -1,7 +1,10 @@ (copyright_considerations)= # Copyright Considerations -> This page reuses adapted CC BY content from {cite:t}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +```{attributiongrey} Attribution +:class: attribution +This page reuses adapted CC BY content from {cite:t}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +``` Copyright law dictates how online book material can and should be created, maintained and shared. An author should understand a few key concepts, as well as best practices, in order to create a book that not only is a useful resource, but, also fairly reuses the work of others and, if provided with an open license, enables original content to also be reused. diff --git a/book/installation-and-setup/copyright/licenses.md b/book/installation-and-setup/copyright/licenses.md index 40fb5d7..1cd3f4d 100644 --- a/book/installation-and-setup/copyright/licenses.md +++ b/book/installation-and-setup/copyright/licenses.md @@ -1,7 +1,10 @@ (copyright_licenses)= # Licenses -> This page reuses adapted CC BY content from {cite:t}`hall21`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +```{attributiongrey} Attribution +:class: attribution +This page reuses adapted CC BY content from {cite:t}`hall21`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +``` Here we present an overview of various license types, with a particular focus on the preference of TeachBooks to use Permissive Open Licenses, regardless of whether material is _content, code or data_ (described below). diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index 16ea6b8..118283a 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -52,20 +52,67 @@ Note that there are several types of pages and files that can be incorporated in (copyright_recc_content)= ### Content Pages -Make sure you show the source of your content where it is provided. We adopt a standard icon and link to help readers recognize this: {fa}`quote-left`{ref}`Find out more here.<external_resources>` +Make sure you show the source of your content where it is provided. We adopt a standard icon and link to help readers recognize this: {fa}`quote-left`{ref}`Find out more here.<external_resources>`. This can be used to provide attribution to authors for specific pages too #### How to implement this in your book -Copy the following line into your content file -```md -> This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` -``` - Some examples can be found in this manual: - [](../../external/deploy-book-workflow/README.md): a content page which is taken fully from another repository - Figure {ref}`fig_license_types`: a single licensed figure added to a page taken from another website - [](../copyright.md): a content page which adapts material from another website +##### Format as citation +Copy the following line into your content file + +```md +> Written by `<author(s)>` +> This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` +``` + +This produces + +> This page reuses CC BY content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` + +##### Format as custom admonition +The previous syntax might be used for other purposes as well. An alternative is a custom attribution admonition: + +```{attributiongrey} Attribution +:class: attribution +This page reuses CC BY 4.0 licensed content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +``` + +Therefore, use the following syntax: + +`````md +```{attributiongrey} Attribution +:class: attribution +Written by <author(s)> +This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` +``` +````` + +Or to place this attribution in the margin: + +````{margin} +```{attributiongrey} Attribution +:class: attribution +Written by <author(s)> +This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` +``` +```` + +`````md +````{margin} +```{attributiongrey} Attribution +:class: attribution +Written by <author(s)> +This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` +``` +```` +````` +To make this possible we use the custom admonitions of [the custom named colors sphinx extension](https://teachbooks.io/manual/external/Sphinx-Named-Colors/README.html#admonitions) in combination with a [custom css file](../../_static/attribution.css) in `book/_static/` and the line `named_colors_custom_colors: {'attributiongrey':[150,150,150]}` in `book/_config.yml` under `sphinx: config: ` + + (copyright_recc_credits)= ### Credits and License Page diff --git a/book/references.bib b/book/references.bib index 3b54aed..fd81c05 100644 --- a/book/references.bib +++ b/book/references.bib @@ -142,3 +142,19 @@ year = {2025}, note = {Retrieved February 2025. CC BY 3.0.} } + +@misc{sphinx-iframes, + author = {{TeachBooks}}, + title = {Sphinx iframes}, + url = {https://github.com/TeachBooks/sphinx-iframes}, + year = {2025}, + note = {Retrieved April 2025. MIT.} +} + +@misc{sphinx-prime-applets, + author = {{TeachBooks}}, + title = {Sphinx PRIME applets}, + url = {https://github.com/TeachBooks/Sphinx-PRIME-applets}, + year = {2025}, + note = {Retrieved April 2025. MIT.} +} \ No newline at end of file From 0c579a229af31afb1d7391039bc1b3e1548ef4e5 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 1 Apr 2025 13:47:03 +0200 Subject: [PATCH 048/347] attribution in margin --- book/external/annotater | 2 +- book/installation-and-setup/copyright/recommendations.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/book/external/annotater b/book/external/annotater index 832cee0..ff37537 160000 --- a/book/external/annotater +++ b/book/external/annotater @@ -1 +1 @@ -Subproject commit 832cee034927c9a51efd328e6e1d5c9157b94e32 +Subproject commit ff3753731bd65f4351fb09e88327aba15383b1d2 diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index 118283a..0f446ca 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -97,7 +97,7 @@ Or to place this attribution in the margin: ```{attributiongrey} Attribution :class: attribution Written by <author(s)> -This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` +This page reuses CC BY 4.0 licensed content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` ``` ```` From 748f68d6d9523b48bf78fb744a5f250986a26ca4 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 1 Apr 2025 13:57:19 +0200 Subject: [PATCH 049/347] attributions in margin --- book/external/Download-Link-Replacer | 2 +- book/external/JupyterBook-Patches | 2 +- book/external/Nested-Books | 2 +- book/external/Sphinx-Grasple-public | 2 +- book/external/Sphinx-Image-Inverter | 2 +- book/external/Sphinx-Named-Colors | 2 +- book/external/Sphinx-PRIME-applets | 2 +- book/external/Sphinx-TUDelft-theme | 2 +- book/external/Sphinx-launch-buttons | 2 +- book/external/Useful_python_code | 2 +- book/external/annotater | 2 +- book/external/deploy-book-workflow | 2 +- book/external/sphinx-iframes | 2 +- book/external/teachbooks-sphinx-tippy | 2 +- book/installation-and-setup/copyright.md | 9 +++++--- .../copyright/considerations.md | 10 ++++++--- .../copyright/licenses.md | 8 ++++--- .../copyright/recommendations.md | 22 ++++--------------- 18 files changed, 36 insertions(+), 41 deletions(-) diff --git a/book/external/Download-Link-Replacer b/book/external/Download-Link-Replacer index b658d1c..6318fd9 160000 --- a/book/external/Download-Link-Replacer +++ b/book/external/Download-Link-Replacer @@ -1 +1 @@ -Subproject commit b658d1c6e1791097b225357025ebe7267d4dccb5 +Subproject commit 6318fd9db4b465bf56b06085ca55c79a8a818471 diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 1a8e996..8346c8c 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 1a8e9960f0a37ce210df51198e0079430f1a2c6e +Subproject commit 8346c8c3c8be3d221a62a2f18c4ee1d4570ee003 diff --git a/book/external/Nested-Books b/book/external/Nested-Books index dcdecc4..70dfd28 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit dcdecc4a7335163ce0f5a8975bfd366a17d5fb94 +Subproject commit 70dfd28f5f288118bb75d219b809f03474aa89a2 diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index e13743c..ce057a2 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit e13743c7dd2d1de8a0dd7137da2841344ea0f330 +Subproject commit ce057a20bb234006ddebc80c9894842d125a5b1b diff --git a/book/external/Sphinx-Image-Inverter b/book/external/Sphinx-Image-Inverter index 8365d4a..573bb66 160000 --- a/book/external/Sphinx-Image-Inverter +++ b/book/external/Sphinx-Image-Inverter @@ -1 +1 @@ -Subproject commit 8365d4a366433bbbdfe7d7d0fbd617270c0e7130 +Subproject commit 573bb66332f682bdfe1d7936048780199e4a0e2d diff --git a/book/external/Sphinx-Named-Colors b/book/external/Sphinx-Named-Colors index 6c5a0f4..b4b1a2e 160000 --- a/book/external/Sphinx-Named-Colors +++ b/book/external/Sphinx-Named-Colors @@ -1 +1 @@ -Subproject commit 6c5a0f4aa9a11b0ba9d5a8f68929ba5773c3312a +Subproject commit b4b1a2e5d087336108bc15b176af1999b61dc86a diff --git a/book/external/Sphinx-PRIME-applets b/book/external/Sphinx-PRIME-applets index 29b5b48..14dc36b 160000 --- a/book/external/Sphinx-PRIME-applets +++ b/book/external/Sphinx-PRIME-applets @@ -1 +1 @@ -Subproject commit 29b5b48126fadde3839ef20a6256bdbda72d4ef9 +Subproject commit 14dc36bfdbf89d2d363ea2bdcbc30a64c0f7b00f diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index 5f26d31..103caec 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit 5f26d318bf0696229041d20518900695d6ff935f +Subproject commit 103caecd4844353c68c166fa6ebed24a868c848c diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index 5acbe14..f6435cb 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit 5acbe14ac0bfa4ab532b9b7c64e6462f16a7dbda +Subproject commit f6435cb0a795062a7d695a246a332ff79f3f74b9 diff --git a/book/external/Useful_python_code b/book/external/Useful_python_code index 1fb335f..81e9235 160000 --- a/book/external/Useful_python_code +++ b/book/external/Useful_python_code @@ -1 +1 @@ -Subproject commit 1fb335fb81ec9b88186161352f379e315a19d2f8 +Subproject commit 81e923516e06441fb0c04f4946819f5dae9b0a68 diff --git a/book/external/annotater b/book/external/annotater index ff37537..d1f41f9 160000 --- a/book/external/annotater +++ b/book/external/annotater @@ -1 +1 @@ -Subproject commit ff3753731bd65f4351fb09e88327aba15383b1d2 +Subproject commit d1f41f93ffe87a305956de405dac47daaad3bc69 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 4415690..ea450f3 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 44156900a23360478983a0920340ff2298110b78 +Subproject commit ea450f3c0c4f9aba6438333c122543fca02c472d diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 0ebb0ed..062c54a 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 0ebb0edea5f14144c6548e417f5b79c6d7721d77 +Subproject commit 062c54a679c6dd44b948549498e755c7c5df1d73 diff --git a/book/external/teachbooks-sphinx-tippy b/book/external/teachbooks-sphinx-tippy index e37225d..e4166e1 160000 --- a/book/external/teachbooks-sphinx-tippy +++ b/book/external/teachbooks-sphinx-tippy @@ -1 +1 @@ -Subproject commit e37225de883df69e0933849dfc4880d41e7c75b0 +Subproject commit e4166e1389ab48ea9059e6576e56d270e66199dd diff --git a/book/installation-and-setup/copyright.md b/book/installation-and-setup/copyright.md index 1deaa0d..82b60a0 100644 --- a/book/installation-and-setup/copyright.md +++ b/book/installation-and-setup/copyright.md @@ -1,6 +1,4 @@ -(copyright)= -# Copyright and Licenses checklist - +````{margin} ```{attributiongrey} Attribution :class: attribution This page reuses adapted CC BY content from the TU Delft Library. {cite:p}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` @@ -10,6 +8,11 @@ This page reuses adapted CC BY content from the TU Delft Library. {cite:p}`tud_c :class: tip This page is useful for all user types. ``` +```` + +(copyright)= +# Copyright and Licenses checklist + The previous sections have familiarized you with the necessary software for your user type, the basics of Git, and how to collaborate with your team using Git. Now it's time to create your own content. This section will provide an overview of the copy right laws which need to be taking into account when creating and including content at TU Delft! diff --git a/book/installation-and-setup/copyright/considerations.md b/book/installation-and-setup/copyright/considerations.md index 80fa6aa..4180108 100644 --- a/book/installation-and-setup/copyright/considerations.md +++ b/book/installation-and-setup/copyright/considerations.md @@ -1,10 +1,14 @@ -(copyright_considerations)= -# Copyright Considerations - +````{margin} ```{attributiongrey} Attribution :class: attribution This page reuses adapted CC BY content from {cite:t}`tud_cip_24`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` ``` +```` + +(copyright_considerations)= +# Copyright Considerations + + Copyright law dictates how online book material can and should be created, maintained and shared. An author should understand a few key concepts, as well as best practices, in order to create a book that not only is a useful resource, but, also fairly reuses the work of others and, if provided with an open license, enables original content to also be reused. diff --git a/book/installation-and-setup/copyright/licenses.md b/book/installation-and-setup/copyright/licenses.md index 1cd3f4d..05033af 100644 --- a/book/installation-and-setup/copyright/licenses.md +++ b/book/installation-and-setup/copyright/licenses.md @@ -1,10 +1,12 @@ -(copyright_licenses)= -# Licenses - +````{margin} ```{attributiongrey} Attribution :class: attribution This page reuses adapted CC BY content from {cite:t}`hall21`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` ``` +```` + +(copyright_licenses)= +# Licenses Here we present an overview of various license types, with a particular focus on the preference of TeachBooks to use Permissive Open Licenses, regardless of whether material is _content, code or data_ (described below). diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index 0f446ca..c018533 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -76,31 +76,16 @@ This produces ##### Format as custom admonition The previous syntax might be used for other purposes as well. An alternative is a custom attribution admonition: +````{margin} ```{attributiongrey} Attribution :class: attribution +Written by <author(s)> This page reuses CC BY 4.0 licensed content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` ``` +```` Therefore, use the following syntax: -`````md -```{attributiongrey} Attribution -:class: attribution -Written by <author(s)> -This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}`Find out more here.<link to external resources section on credits and license page>` -``` -````` - -Or to place this attribution in the margin: - -````{margin} -```{attributiongrey} Attribution -:class: attribution -Written by <author(s)> -This page reuses CC BY 4.0 licensed content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` -``` -```` - `````md ````{margin} ```{attributiongrey} Attribution @@ -110,6 +95,7 @@ This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}` ``` ```` ````` + To make this possible we use the custom admonitions of [the custom named colors sphinx extension](https://teachbooks.io/manual/external/Sphinx-Named-Colors/README.html#admonitions) in combination with a [custom css file](../../_static/attribution.css) in `book/_static/` and the line `named_colors_custom_colors: {'attributiongrey':[150,150,150]}` in `book/_config.yml` under `sphinx: config: ` From ae4f209be2f67375328ede3bafae4e922dc2fbca Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 1 Apr 2025 15:00:43 +0200 Subject: [PATCH 050/347] user types in margins --- book/basic-features/hypothesis.md | 6 ++-- book/basic-features/overview.md | 6 ++-- book/basic-features/utterances.md | 6 ++-- book/features/HTML_javascript.md | 5 ++- book/features/adding_HTML_elements.md | 6 ++-- book/features/apa.md | 8 +++-- book/features/custom-launch-button.md | 6 ++-- book/features/easy-editing.md | 6 ++-- book/features/external_toc.md | 8 +++-- book/features/github_deploy.md | 33 ------------------- book/features/h5p.md | 6 ++-- book/features/jupyterquiz.ipynb | 8 +++-- book/features/live_code.ipynb | 6 ++-- book/features/local_server.md | 8 +++-- book/features/plotly.ipynb | 6 ++-- book/features/pull_request_build.md | 6 ++-- book/features/sphinx_extensions.md | 6 ++-- book/features/students.md | 7 ++-- book/features/teachbooks.md | 8 +++-- book/features/update_env.md | 6 ++-- book/features/versioning.md | 8 +++-- book/features/visuals.md | 6 ++-- book/installation-and-setup/anaconda.md | 6 ++-- book/installation-and-setup/collab.md | 6 ++-- .../installation-and-setup/git-setup_local.md | 6 ++-- book/installation-and-setup/git.md | 6 ++-- .../git_bash_conda_vs-code.md | 6 ++-- .../jupyter-book-setup.md | 6 ++-- book/installation-and-setup/overview.md | 6 ++-- book/installation-and-setup/tools.md | 6 ++-- book/installation-and-setup/versioning.md | 6 ++-- book/installation-and-setup/vscode-setup.md | 6 ++-- book/tools/figmaker.md | 6 ++-- book/workflows/collaboration.md | 6 ++-- 34 files changed, 141 insertions(+), 102 deletions(-) delete mode 100644 book/features/github_deploy.md diff --git a/book/basic-features/hypothesis.md b/book/basic-features/hypothesis.md index 0f42e79..49ebe28 100644 --- a/book/basic-features/hypothesis.md +++ b/book/basic-features/hypothesis.md @@ -1,11 +1,13 @@ -# Making comments on the website: Hypothesis - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 1-5. ``` {bdg-warning}`Javascript overlay` {bdg-success}`Chrome Extension` +```` + +# Making comments on the website: Hypothesis Hypothesis is a third-party application that allows anyone to make publicly visible comments on a website (once you create a free account). This section explains how to use and install the extension. As this tool requires an account with a third-party, we advise to use our [local-annotator](../external/annotater/README.md) with similar capabilities but which store annotations locally. By default Hypothesis stores annotations publicly, which might confuse other students. diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index df68f69..a37acfb 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -1,8 +1,10 @@ -# Original Jupyter Book and Sphinx Features - +````{margin} ```{admonition} User types :class: tip This section is useful for [user type 3-5](../installation-and-setup/user_types.md). ``` +```` + +# Original Jupyter Book and Sphinx Features These pages will provide a list of some common, basic book features which are all available in the original <a href="https://jupyterbook.org/"><img style="display:inline-block; height:1.5em; width:auto; transform:translate(0, -0.15em)" src="../images/logo-wide.svg" alt="Jupyter book"></a> package. Additionally, this page includes also best-practices. diff --git a/book/basic-features/utterances.md b/book/basic-features/utterances.md index f82a44f..cbdc82e 100644 --- a/book/basic-features/utterances.md +++ b/book/basic-features/utterances.md @@ -1,11 +1,13 @@ -# Discussions in your book: Utterances - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 3-5. ``` {bdg-white}`GitHub app and Javascript script` +```` + +# Discussions in your book: Utterances [Utterances 🔮](https://utteranc.es/) is a lightweight open-source widget which allows you, your colleages and your students to discuss stuff in a blog post in your book. It is build on GitHub issues, so requires a GitHub repository, although the book can be hosted anywhere (so also on GitLab). diff --git a/book/features/HTML_javascript.md b/book/features/HTML_javascript.md index dc1abdc..d579423 100644 --- a/book/features/HTML_javascript.md +++ b/book/features/HTML_javascript.md @@ -1,4 +1,4 @@ -# Interactive HTML/JavaScript elements +````{margin} ```{admonition} User types :class: tip @@ -6,6 +6,9 @@ This section is useful for user type 5. ``` {bdg-danger}`iframe` +```` + +# Interactive HTML/JavaScript elements In this section, we will discuss how to [create](creating_basic_HTML_elements.md) and [embed](adding_HTML_elements.md) interactive HTML/Javascript elements created in HTML/JavaScript in a TeachBook. These HTML/Javascript element work very fluently and don't require a python kernel running in the background. diff --git a/book/features/adding_HTML_elements.md b/book/features/adding_HTML_elements.md index 3e46b49..e9cbc59 100644 --- a/book/features/adding_HTML_elements.md +++ b/book/features/adding_HTML_elements.md @@ -1,6 +1,8 @@ -# Adding interactive HTML/JavaScript elements - +````{margin} {bdg-danger}`iframe` +```` + +# Adding interactive HTML/JavaScript elements In this section, we will discuss how to embed interactive elements created in HTML/JavaScript in a TeachBook. If you are interested in learning how to create these elements yourself, we will discuss an example in the [next article](creating_basic_HTML_elements.md). As an example, let us discuss how to embed an interactive 3D model of a subsurface environment I created: diff --git a/book/features/apa.md b/book/features/apa.md index 1a91714..49bdf3f 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -1,12 +1,14 @@ -(apa)= -# APA References - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4 and 5. ``` {bdg-primary}`(To be converted into) Sphinx Extension` +```` + +(apa)= +# APA References ```{note} This feature is stable but because it relies on a local extension that is part of your book files and _not_ managed as part of a computing environment (e.g., `pip` or `conda`), unknown issues may arise. We would like to convert this feature into an independent Sphinx extension and/or Pybtext plugin. Visit the [project page on GitHub](https://github.com/orgs/TeachBooks/projects/17) to learn more. diff --git a/book/features/custom-launch-button.md b/book/features/custom-launch-button.md index b935a7c..b83e67d 100644 --- a/book/features/custom-launch-button.md +++ b/book/features/custom-launch-button.md @@ -1,11 +1,13 @@ -# Multilingual book - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4 and 5. ``` {bdg-primary}`Sphinx Extension` +```` + +# Multilingual book The custom launch button extension allows you to create a customizable button in the top right of your jupyter book. This may have many applications, one of them being that you can create different language versions of the book available for the user. diff --git a/book/features/easy-editing.md b/book/features/easy-editing.md index 418f55b..d06734b 100644 --- a/book/features/easy-editing.md +++ b/book/features/easy-editing.md @@ -1,8 +1,10 @@ -# Easy Editing Process - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 3-5. ``` +```` + +# Easy Editing Process The following tools are created by TeachBooks to ease the process of making books. We acknowledge that making books is a difficult process; it requires advanced knowledge on CLI, python packages, html-files, data-storage and website hosting. The tools in this chapter are intended for those users who lack knowledge on these topics (which includes most of the TeachBooks' community members itself). \ No newline at end of file diff --git a/book/features/external_toc.md b/book/features/external_toc.md index c0a2a50..a55ec7d 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -1,12 +1,14 @@ -(external-toc)= -# Sharing content between books in table of contents - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 3-5. ``` {bdg-secondary}`Python Package: teachbooks` +```` + +(external-toc)= +# Sharing content between books in table of contents ## Introduction diff --git a/book/features/github_deploy.md b/book/features/github_deploy.md deleted file mode 100644 index 8908f66..0000000 --- a/book/features/github_deploy.md +++ /dev/null @@ -1,33 +0,0 @@ -# Publish online with GitHub Pages - -```{admonition} User types -:class: tip -This page is useful for user type 3, 4 and 5. -``` - -We developed a workflow which builds the Jupyter books in your repository for all branches, and publishes them online via GitHub Pages. The [GitHub template book](../workflows/githubtemplate.md) uses this functionality for example. - -To use this feature, add the workflow [`call-deploy-book.yml`](https://github.com/TeachBooks/deploy-book-workflow/blob/main/.github/workflows/call-deploy-book.yml) to the `/.github/workflows` folder in your repository. Furthermore, set source for GitHub pages to GitHub Actions under <svg aria-label="Edit repository metadata" role="img" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gear float-right"> <path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path> </svg>`Settings` - <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-browser"> <path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25ZM14.5 6h-13v7.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm-6-3.5v2h6V2.75a.25.25 0 0 0-.25-.25ZM5 2.5v2h2v-2Zm-3.25 0a.25.25 0 0 0-.25.25V4.5h2v-2Z"></path> </svg> `Pages` - `Build and deployment` - `Source` - `GitHub Actions`. Additional tip: set repository website as your GitHub Pages website under <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg>`Code`- `About` - <svg aria-label="Edit repository metadata" role="img" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gear float-right"> <path d="M8 0a8.2 8.2 0 0 1 .701.031C9.444.095 9.99.645 10.16 1.29l.288 1.107c.018.066.079.158.212.224.231.114.454.243.668.386.123.082.233.09.299.071l1.103-.303c.644-.176 1.392.021 1.82.63.27.385.506.792.704 1.218.315.675.111 1.422-.364 1.891l-.814.806c-.049.048-.098.147-.088.294.016.257.016.515 0 .772-.01.147.038.246.088.294l.814.806c.475.469.679 1.216.364 1.891a7.977 7.977 0 0 1-.704 1.217c-.428.61-1.176.807-1.82.63l-1.102-.302c-.067-.019-.177-.011-.3.071a5.909 5.909 0 0 1-.668.386c-.133.066-.194.158-.211.224l-.29 1.106c-.168.646-.715 1.196-1.458 1.26a8.006 8.006 0 0 1-1.402 0c-.743-.064-1.289-.614-1.458-1.26l-.289-1.106c-.018-.066-.079-.158-.212-.224a5.738 5.738 0 0 1-.668-.386c-.123-.082-.233-.09-.299-.071l-1.103.303c-.644.176-1.392-.021-1.82-.63a8.12 8.12 0 0 1-.704-1.218c-.315-.675-.111-1.422.363-1.891l.815-.806c.05-.048.098-.147.088-.294a6.214 6.214 0 0 1 0-.772c.01-.147-.038-.246-.088-.294l-.815-.806C.635 6.045.431 5.298.746 4.623a7.92 7.92 0 0 1 .704-1.217c.428-.61 1.176-.807 1.82-.63l1.102.302c.067.019.177.011.3-.071.214-.143.437-.272.668-.386.133-.066.194-.158.211-.224l.29-1.106C6.009.645 6.556.095 7.299.03 7.53.01 7.764 0 8 0Zm-.571 1.525c-.036.003-.108.036-.137.146l-.289 1.105c-.147.561-.549.967-.998 1.189-.173.086-.34.183-.5.29-.417.278-.97.423-1.529.27l-1.103-.303c-.109-.03-.175.016-.195.045-.22.312-.412.644-.573.99-.014.031-.021.11.059.19l.815.806c.411.406.562.957.53 1.456a4.709 4.709 0 0 0 0 .582c.032.499-.119 1.05-.53 1.456l-.815.806c-.081.08-.073.159-.059.19.162.346.353.677.573.989.02.03.085.076.195.046l1.102-.303c.56-.153 1.113-.008 1.53.27.161.107.328.204.501.29.447.222.85.629.997 1.189l.289 1.105c.029.109.101.143.137.146a6.6 6.6 0 0 0 1.142 0c.036-.003.108-.036.137-.146l.289-1.105c.147-.561.549-.967.998-1.189.173-.086.34-.183.5-.29.417-.278.97-.423 1.529-.27l1.103.303c.109.029.175-.016.195-.045.22-.313.411-.644.573-.99.014-.031.021-.11-.059-.19l-.815-.806c-.411-.406-.562-.957-.53-1.456a4.709 4.709 0 0 0 0-.582c-.032-.499.119-1.05.53-1.456l.815-.806c.081-.08.073-.159.059-.19a6.464 6.464 0 0 0-.573-.989c-.02-.03-.085-.076-.195-.046l-1.102.303c-.56.153-1.113.008-1.53-.27a4.44 4.44 0 0 0-.501-.29c-.447-.222-.85-.629-.997-1.189l-.289-1.105c-.029-.11-.101-.143-.137-.146a6.6 6.6 0 0 0-1.142 0ZM11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0ZM9.5 8a1.5 1.5 0 1 0-3.001.001A1.5 1.5 0 0 0 9.5 8Z"></path> </svg> - `Website` - `Use your GitHub Pages Website` - -This workflow requires a `requirements.txt` file with `teachbooks` in your root folder, and all the book files (including `_config.yml` and `_toc.yml`) should be in a subdirectory `book/`. - -You can adapt the behaviour by setting repository variables in GitHub as explained [here](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository). Define the following repository variables: -- `PRIMARY_BRANCH` which is set to `main` whenever it's not defined in the repository variables. - - This sets the branch which is hosted on root. - - It is advised to make it `published` to start using draft-publish-workflow -- `BRANCH_ALIASES` which is set to `draft:main` whenever it's not defined in the repository variables. - - This defines aliases for branches - - It should be a space-separated list of alias-rules, e.g. 'draft:main alias:really-long-branch-name` - - It is advised to link `book` to `publish`. - - If no aliases are wanted, BRANCH_ALIASES may be set to ' ' (space). -- `BRANCHES_TO_DEPLOY` which is set to `*` (all branches) whenever it's not defined in the repository variables. - - This defines the branches to deploy. - - It should be a space-separated list of branch names, e.g. 'main second third'.- - -In `call-deploy-book.yml` itself you can specify the trigger for this workflow. By default, a push to any branch trigger the workflow. You can limit the branches or subdirectories. - -Whenever the workflow is triggered, progress can be seen under the <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> - <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> -</svg>`Actions` tab in GitHub. From this tab, you can also initiate it without any trigger commits. - -When the workflow has finished, visit your build book at `https://<username/organization_name>.github.io/<repository_name>` (case sensitive). Eg. for the [template book](https://github.com/TeachBooks/template) it is [https://teachbooks.github.io/template](https://teachbooks.github.io/template). diff --git a/book/features/h5p.md b/book/features/h5p.md index fab49f2..3934544 100644 --- a/book/features/h5p.md +++ b/book/features/h5p.md @@ -1,11 +1,13 @@ -# H5p interactive elements - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 3-5. ``` {bdg-danger}`iframe` +```` + +# H5p interactive elements ## Instruction H5p elements are interactive HTML-blocks which can be embedded in a Jupyter Book using an iframe. An H5p element can be created in the [TU Delft portal on the H5p website](https://tudelft.h5p.com/content) (sign in via Brightspace to H5p required first). The iframe code can be copied at Edit - Publish - Public - Embed code. This html code can be directly added to your markdown file using [](../external/sphinx-iframes/README.md): diff --git a/book/features/jupyterquiz.ipynb b/book/features/jupyterquiz.ipynb index 20f73e3..c4ee03e 100644 --- a/book/features/jupyterquiz.ipynb +++ b/book/features/jupyterquiz.ipynb @@ -7,14 +7,16 @@ "hidePrompt": true }, "source": [ - "# JupyterQuiz\n", - "\n", + "````{margin}\n", "```{admonition} User types\n", ":class: tip\n", "This section is useful for user type 4-5.\n", "```\n", "\n", - "- {bdg-secondary}`Python Package: jupyterquiz`\n", + "{bdg-secondary}`Python Package: jupyterquiz`\n", + "````\n", + "\n", + "# JupyterQuiz\n", "\n", "JupyterQuiz is a code-based implementation of multiple-choiche questions and numerical answer questions. This is a basic open course tool which requires you to write your quiz questions in Python language as a `dict` or to a `.json` file. An example is given below:\n", "\n", diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index a4703a7..55b620f 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -4,12 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Interactive content: Run Python inside your book\n", - "\n", + "````{margin}\n", "```{admonition} User types\n", ":class: tip\n", "This section is useful for user type 5.\n", "```\n", + "```` \n", + "\n", + "# Interactive content: Run Python inside your book\n", "\n", "{bdg-primary}`Sphinx Extension`\n", "\n", diff --git a/book/features/local_server.md b/book/features/local_server.md index fcdbbc1..db13af7 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -1,12 +1,14 @@ -(setup-local-server)= -# Local Server to view interactive elements locally - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 4-5. ``` {bdg-secondary}`Python Package: teachbooks` +```` + +(setup-local-server)= +# Local Server to view interactive elements locally Perhaps you have already noticed that when building a book and testing it locally on your computer, some features do not work the way you expect, or worse---do not work at all! This is because many interactive features rely on browser functionality to work properly, for example: Grasple/H5p iframe exercises, Sphinx-Thebe Python interactivity and HTML/Javascript elements. Although the website is _static_ (i.e., there is no code running on a webserver that generates the content), modern web browsers have their own internal computing environments that run processes to deliver the rich content we desire in our books. diff --git a/book/features/plotly.ipynb b/book/features/plotly.ipynb index ec889da..6852a21 100644 --- a/book/features/plotly.ipynb +++ b/book/features/plotly.ipynb @@ -7,12 +7,14 @@ "hidePrompt": true }, "source": [ - "# Interactive plots: plotly\n", - "\n", + "````{margin}\n", "```{admonition} User types\n", ":class: tip\n", "This section is useful for user type 5.\n", "```\n", + "````\n", + "\n", + "# Interactive plots: plotly\n", "\n", "The use of the [plotly](https://plotly.com/python/getting-started/) package is an example which allows you to create HTML/Javascript widgets from python code without any knowledge on HTML/Javascript." ] diff --git a/book/features/pull_request_build.md b/book/features/pull_request_build.md index 1ce4265..f6f94f2 100644 --- a/book/features/pull_request_build.md +++ b/book/features/pull_request_build.md @@ -1,9 +1,11 @@ -# Build pull requests from forks - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 3-5. ``` +```` + +# Build pull requests from forks When writing a TeachBook it is useful to automatically build and view these changes online. This exactly why we designed and build the [deploy-book-workflow](../external/deploy-book-workflow/README.md) tool, which also allows for multiple versions of your book to exist at any time with customizable URL's. However, it doesn't cover all use cases. Luckily, **Read the Docs** is a free tool that can easily be used for this purpose. It also provides a very easy way to view differences between versions on each page! diff --git a/book/features/sphinx_extensions.md b/book/features/sphinx_extensions.md index fa53945..d957b74 100644 --- a/book/features/sphinx_extensions.md +++ b/book/features/sphinx_extensions.md @@ -1,8 +1,10 @@ -# Additional functionality - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 4-5. ``` +```` + +# Additional functionality This sections includes the features developed by TeachBooks which add functionality to the book. Most of them are implemented as sphinx extensions, which are plugins developed for the Sphinx documentation ecosystem (which Jupyter Book is built upon). They extend or modify Sphinx’s capabilities. Since Sphinx extensions are not an integral part of jupyter-book, as opposed to original jupyter-book features, they must be installed and configured explicitly, for example in the `_config.yml` file. \ No newline at end of file diff --git a/book/features/students.md b/book/features/students.md index 46a6993..e16a668 100644 --- a/book/features/students.md +++ b/book/features/students.md @@ -1,8 +1,11 @@ -# TeachBooks Student-view Features - +```` ```{admonition} User types :class: tip This section is useful for user type 1-5. ``` +```` + +# TeachBooks Student-view Features + This chapter includes some TeachBooks features which aim to improve the way students can use TeachBooks. These tools are fully student-side, they don't influence the book website and the author doesn't have to setup anything. Nevertheless, the author could point the students to the availability of these tools and use it as part of the didactical approach. These tools could also be useful for other users. diff --git a/book/features/teachbooks.md b/book/features/teachbooks.md index 2561e70..1349331 100644 --- a/book/features/teachbooks.md +++ b/book/features/teachbooks.md @@ -1,5 +1,4 @@ -(teachbooks-package)= -# Draft-Release Workflow +````{margin} ```{admonition} User types :class: tip @@ -8,6 +7,11 @@ This page is useful for user type 3-5. {bdg-secondary}`Python Package: teachbooks` +```` + +(teachbooks-package)= +# Draft-Release Workflow + Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}Deploy Book Workflow <deploy-book-workflow>`, which builds our TeachBooks). ```{admonition} Why is this useful? diff --git a/book/features/update_env.md b/book/features/update_env.md index 442512a..8f7000c 100644 --- a/book/features/update_env.md +++ b/book/features/update_env.md @@ -1,11 +1,13 @@ -# Auto-updating packages - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4-5. ``` {bdg-dark}`Git Workflow` +```` + +# Auto-updating packages When building your book, your making use of packages: the teachbooks and jupyterbook packages themselves, but also packages for extensions. These are regularly updated, while those updates are not necessarily taken into your book. This is all defined in the `requirements.txt` file, which is provided as part of the [template](../external/template/README.md). There are three options: 1. `requirements.txt` only contains names of packages like: `download_link_replacer`. In that case, your [deploy-book-workflow](../external/deploy-book-workflow/README.md) will take the most up-to-date version when making your book website once a week (as the chache will be cleared once a week). This might lead to unexpected changes when new version come out, although new version are in general backwards compatible. diff --git a/book/features/versioning.md b/book/features/versioning.md index c769c82..a84aa27 100644 --- a/book/features/versioning.md +++ b/book/features/versioning.md @@ -1,6 +1,10 @@ -# TeachBooks Versioning +````{margin} +```{attributiongrey} Attribution +:class: attribution +This page reuses adapted CC BY 3.0 content from Tom Preston-Werner {cite:t}`semver`. {fa}`quote-left`{ref}`Find out more here.<external_resources>```` +```` -> This page reuses adapted CC BY 3.0 content from Tom Preston-Werner {cite:t}`semver`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +# TeachBooks Versioning Inspired by versioning systems in software management (i.e. semantic and CalVer versioning) TeachBooks suggests a versioning guideline in which the version number tells the reader about the impact of the change. This might more suitable for your online books than the more traditional way of versioning paper books (version 1, 2, etc.), because of the amount of edits which online books allow. We recommend TeachBooks versioning, which comes in two flavors: diff --git a/book/features/visuals.md b/book/features/visuals.md index 3ae37b8..249de89 100644 --- a/book/features/visuals.md +++ b/book/features/visuals.md @@ -1,8 +1,10 @@ -# Book styling - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 1-5. ``` +```` + +# Book styling TeachBooks developed a few improvements of the book which improve the visual book styling. \ No newline at end of file diff --git a/book/installation-and-setup/anaconda.md b/book/installation-and-setup/anaconda.md index 502ffe9..967a376 100644 --- a/book/installation-and-setup/anaconda.md +++ b/book/installation-and-setup/anaconda.md @@ -1,9 +1,11 @@ -# Managing code-related software: Anaconda - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 5. ``` +```` + +# Managing code-related software: Anaconda Before you can start using python in your book, you need Anaconda. 'Anaconda's conda tool simplifies package and environment management across operating systems' (Anaconda.com), such as windows or MacOS. It makes getting started with python a lot easier because it already has a lot of useful python packages pre-installed. Unfortunately, each of these packages are themselves require a number of different packages to function properly. Do you like installing all of them? You shouldn't---but where do you get them come from? Many of those packages are packages required by only a few specific packages. These packages are called _dependencies_, and are necessary to make your Python packages function as expected. When you run install a specific package, `conda` (part of Anaconda) checks all of the dependent packages that are needed and makes sure they are also provided in the `environment` (collection of software with a specific version) that is being created. In reality, this is simply a folder on your computer with all of the `*.py` files stored in it. This _package management_ is what `conda` and `pip` are really doing when you use them to install a package. It also checks that it has a suitable _version_ of each dependency; this is why it sometime takes a long time to install a package Unfortunately, this means that as you add more packages to a particular environment, it gets more and more difficult to make sure everything works well together. Luckily, there is a practical solution: create new environments for specific projects to make sure the proper packages can function properly! diff --git a/book/installation-and-setup/collab.md b/book/installation-and-setup/collab.md index 201c1c9..f63cba5 100644 --- a/book/installation-and-setup/collab.md +++ b/book/installation-and-setup/collab.md @@ -1,9 +1,11 @@ -# Organize editing team, collaboration and visibility - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4-5. ``` +```` + +# Organize editing team, collaboration and visibility ## Roles and responsibilities To ensure smooth collaboration, it is essential to define the roles and responsibilities within your team. Firstly, designate who will be in charge of team organization ('administrators') who should be at least user type 4. Additionally, assign 'maintainers' responsible for combining content, also requiring at least user type 4. 'Editors' should be identified for editing and reviewing content, requiring at least user type 3. diff --git a/book/installation-and-setup/git-setup_local.md b/book/installation-and-setup/git-setup_local.md index b765577..b2d7e62 100644 --- a/book/installation-and-setup/git-setup_local.md +++ b/book/installation-and-setup/git-setup_local.md @@ -1,9 +1,11 @@ -# Git: GitHub Desktop / Git in VS Code - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4 and 5. ``` +```` + +# Git: GitHub Desktop / Git in VS Code In this section you will learn how to install Git locally. Courses on Git usually make use of the command line interface to do run Git, but this introduces a steep learning curve. Instead, using Git from VS Code / GitHub Desktop is much more visual (i.e., more "clicky"), and therefore easier to use for those inexperienced with the command line. diff --git a/book/installation-and-setup/git.md b/book/installation-and-setup/git.md index 4434739..90489d5 100644 --- a/book/installation-and-setup/git.md +++ b/book/installation-and-setup/git.md @@ -1,9 +1,11 @@ -# Collaboration tool: Git - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 3-5. ``` +```` + +# Collaboration tool: Git You will need to interact with Git to collaborate on a TeachBook, even if you are working by yourself! You've been introduced to it in the [exercises in the template](../intro/template.md) and you'll be guided through all of the steps in detail in [](../workflows/collaboration.md), but what is this "thing" that sounds suspiciously like something only a computer scientist would want to use? diff --git a/book/installation-and-setup/git_bash_conda_vs-code.md b/book/installation-and-setup/git_bash_conda_vs-code.md index b11dd01..fb00ae9 100644 --- a/book/installation-and-setup/git_bash_conda_vs-code.md +++ b/book/installation-and-setup/git_bash_conda_vs-code.md @@ -1,9 +1,11 @@ -# Combining Git Bash, VS Code and Conda - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 5. ``` +```` + +# Combining Git Bash, VS Code and Conda ## Conda in Git Bash Git Bash is a shell (also referred to as "the terminal") that is automatically installed with git. It provides Unix-like commands on a Windows OS, and is recommended for working with open source projects like Jupyter (for example `pip install`, building Jupyter books, using Git Bash in VS Code, etc). To do this, `conda` needs to be setup properly; this is described here: diff --git a/book/installation-and-setup/jupyter-book-setup.md b/book/installation-and-setup/jupyter-book-setup.md index a947a77..066c6d8 100644 --- a/book/installation-and-setup/jupyter-book-setup.md +++ b/book/installation-and-setup/jupyter-book-setup.md @@ -1,9 +1,11 @@ -# Build your book: JupyterBook - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 5. ``` +```` + +# Build your book: JupyterBook <a href="https://jupyterbook.org/"><img style="display:inline-block; height:1.5em; width:auto; transform:translate(0, -0.15em)" src="../images/logo-wide.svg" alt="Jupyter book"></a> is a regular Python package which converts our content into a website. It's part of all of the `requirements.txt` files for a book repository. At TeachBooks we developed a Python package called `teachbooks` which takes over the these features and adds [additional features](../features/overview.md). One of those additional features, for example, is the workflow to GitHub Pages. diff --git a/book/installation-and-setup/overview.md b/book/installation-and-setup/overview.md index eb209c9..48e90c2 100644 --- a/book/installation-and-setup/overview.md +++ b/book/installation-and-setup/overview.md @@ -1,9 +1,11 @@ -# Install & authenticate required software - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4-5. ``` +```` + +# Install & authenticate required software Now that the types of users have been explained, you might have an idea which type corresponds to you! diff --git a/book/installation-and-setup/tools.md b/book/installation-and-setup/tools.md index 1314325..a58e536 100644 --- a/book/installation-and-setup/tools.md +++ b/book/installation-and-setup/tools.md @@ -1,9 +1,11 @@ -# Which git provider to choose - +```` ```{admonition} User types :class: tip This page is useful for user type 4-5. ``` +```` + +# Which git provider to choose The setup of tools and URLs is dependent on agreements you've made on [collaboration](./collab.md). diff --git a/book/installation-and-setup/versioning.md b/book/installation-and-setup/versioning.md index e265115..a2597ea 100644 --- a/book/installation-and-setup/versioning.md +++ b/book/installation-and-setup/versioning.md @@ -1,9 +1,11 @@ -# Versioning and URLs - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4-5. ``` +```` + +# Versioning and URLs Online books can be easily updated, however, this might confuse readers. Therefore, it's good practice to be aware of this and, where needed, provide an explicit version to the readers. diff --git a/book/installation-and-setup/vscode-setup.md b/book/installation-and-setup/vscode-setup.md index a2e76d7..089633e 100644 --- a/book/installation-and-setup/vscode-setup.md +++ b/book/installation-and-setup/vscode-setup.md @@ -1,9 +1,11 @@ -# Editing text: VS Code - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4 and 5. ``` +```` + +# Editing text: VS Code VS Code is a text editor with some extra features, such as integrated source control and a file browser. Moreover, extensions are available to add functionality to VS Code. diff --git a/book/tools/figmaker.md b/book/tools/figmaker.md index 534a57d..9e9be86 100644 --- a/book/tools/figmaker.md +++ b/book/tools/figmaker.md @@ -1,9 +1,11 @@ -# Figure syntax maker - +````{margin} ```{admonition} User types :class: tip This section is useful for user type 3-5. ``` +```` + +# Figure syntax maker One might quickely forget the code for making figures, here is a useful tool to make your figures, just specify all information and the code is produced for you: diff --git a/book/workflows/collaboration.md b/book/workflows/collaboration.md index 1453a39..02cd9f0 100644 --- a/book/workflows/collaboration.md +++ b/book/workflows/collaboration.md @@ -1,9 +1,11 @@ -# Collaborative book-editing - +````{margin} ```{admonition} User types :class: tip This page is useful for user type 3, 4 and 5. ``` +```` + +# Collaborative book-editing A jupyter book is composed out of many files which contain the educational content produced by you. Through the use of branches it is possible to work on the book at the same time as your team-members. Working on content for the book is mainly individual work, the beauty of Git comes in when everybody's changes are merged into the main branch. From 19f579147113ea843e8c50cbef5366a08eee30e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:41:54 +0000 Subject: [PATCH 051/347] Bump book/external/Sphinx-launch-buttons from `f6435cb` to `e6070de` Bumps [book/external/Sphinx-launch-buttons](https://github.com/TeachBooks/Sphinx-launch-buttons) from `f6435cb` to `e6070de`. - [Release notes](https://github.com/TeachBooks/Sphinx-launch-buttons/releases) - [Commits](https://github.com/TeachBooks/Sphinx-launch-buttons/compare/f6435cb0a795062a7d695a246a332ff79f3f74b9...e6070ded6ca77662a3a951893cafe265fa333e5e) --- updated-dependencies: - dependency-name: book/external/Sphinx-launch-buttons dependency-version: e6070ded6ca77662a3a951893cafe265fa333e5e dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/Sphinx-launch-buttons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index f6435cb..e6070de 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit f6435cb0a795062a7d695a246a332ff79f3f74b9 +Subproject commit e6070ded6ca77662a3a951893cafe265fa333e5e From 4cc865170afadebf65ab2679bb21e71705ca97a0 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 05:43:32 +0200 Subject: [PATCH 052/347] update teachbooks text on overview --- book/features/overview.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index aa8c7a4..0bfc8ce 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -37,7 +37,7 @@ The TeachBooks Python package is a collection of tools that are used to enhance 1. If you are a book user using the [TeachBooks Template](./teachbooks-template.md) or the [Deploy Book Workflow](./deploy-book-workflow.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). 2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). -For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. It adds a few commands to the CLI (e.g., `serve`), but otherwise is meant to be used instead of the `jupyter-book` commands. It is conventionally used in an identical way: +For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: ``` teachbooks build book @@ -46,8 +46,8 @@ teachbooks build book ### List of Features Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: -- Draft-Release Workflow: read more here -- External Contents: -- Local Server: +- [Draft-Release Workflow](./draft-release.md) +- [External Contents](./external_toc.md) +- [Local Server](./local_server.md) The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. From 6d3e647a94ca63bf1442cfad8ada0fa9f6d808a1 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 06:14:24 +0200 Subject: [PATCH 053/347] update updated_env text for clarity --- book/features/update_env.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/book/features/update_env.md b/book/features/update_env.md index 8f7000c..ca661ec 100644 --- a/book/features/update_env.md +++ b/book/features/update_env.md @@ -9,18 +9,21 @@ This page is useful for user type 4-5. # Auto-updating packages -When building your book, your making use of packages: the teachbooks and jupyterbook packages themselves, but also packages for extensions. These are regularly updated, while those updates are not necessarily taken into your book. This is all defined in the `requirements.txt` file, which is provided as part of the [template](../external/template/README.md). There are three options: -1. `requirements.txt` only contains names of packages like: `download_link_replacer`. In that case, your [deploy-book-workflow](../external/deploy-book-workflow/README.md) will take the most up-to-date version when making your book website once a week (as the chache will be cleared once a week). This might lead to unexpected changes when new version come out, although new version are in general backwards compatible. +When building your book, you are making use of various Python packages: the `teachbooks` and `jupyter-book` packages themselves, but also packages for extensions. These are regularly updated, however, those updates are not necessarily incorporated into your book automatically. The list of packages and their versions are defined in the `requirements.txt` file, which is provided as part of the [template](../external/template/README.md). Consider the following three options for how packages can be specified: +1. `requirements.txt` only contains names of packages like: `download_link_replacer`. In that case, your [deploy-book-workflow](../external/deploy-book-workflow/README.md) will take the most up-to-date version when making your book website once a week (as the chache will be cleared once a week). This might lead to unexpected changes when a new version has been released (although new versions will generally be backwards compatible). 1. `requirements.txt` contains names of packages with a specified version like: `download_link_replacer==1.0.4`. In that case, your [deploy-book-workflow](../external/deploy-book-workflow/README.md) always uses that specific version. In doing so, you'll never get a new update unless you explicitly adapt the version in `requirements.txt`. If you'd like to get notified for updates, you might consider using GitHub's Dependabot. -1. A combination of 1. and 2.: In that case (once a week at most) you will receive new versions for only the unfixed packages, no updates for the fixed versions. In this case you can also use GitHub's Dependabot. +1. A combination of 1. and 2.: In that case (once a week at most) you will receive new versions for only the unfixed packages, no updates for the fixed versions. + +For the case of specified versions, you can use GitHub's Dependabot to notify you that a new version is available _and_ to automatically set up a Pull Request to update your book with the new version. ## Notifications updated packages with Dependabot -Dependabot checks the specified version of packages in your `requirements.txt` file and opens a branch and pull requests whenever there's an update available for that package. Note that package without a fixed version are ignored by Dependabot. +Dependabot checks the specified version of packages in your `requirements.txt` file and, if a new version is found, will create a new branch, update the `requirements.txt` file and open a Pull Request whenever there's an update available for that package. Note that packages without a fixed version are ignored by Dependabot. To activate this feature: 1. Specify version for all packages you want to be notified on in your `requirements.txt` file. See [`requirements.txt`](https://github.com/TeachBooks/manual/blob/release/requirements.txt) of this manual as an example 1. In the `.github/` directory, add a file named `dependabot.yml` with the following content (note that sphinx-thebe (used in [python live coding](./live_code.ipynb)) and docutils (using in [APA referencing](./apa.md)) are ignored because these require a very specific version to work): + ```yaml version: 2 updates: @@ -35,11 +38,12 @@ updates: - dependency-name: "docutils" ``` -This will check every sunday around midnight (UTC) whether any of the fixed-version packages are updated. If so, several things will happen: -1. A new branch starting with _dependabot_ will be created in the repository and any relevant workflows will be triggered. -1. A _pull request_ will be created to pull the new branch into the _default_ branch. This pull request must be manually reviewed and merged. Afterwards the _dependabot_ branch can be deleted (automatically). +This check will run every Sunday around midnight (UTC) whether any of the fixed-version packages are updated. If so, several things will happen: +1. A new branch is created with a name that begins with `dependabot...` in the repository +1. A commit is made updating `requirements.txt` (e.g., `jupyterbook_patches==1.4.2` is changed to `jupyterbook_patches==1.4.4`) +1. A _pull request_ will be created to merge the new branch into the _default_ branch. This pull request must be manually reviewed and merged. Afterwards the _dependabot_ branch can be deleted (automatically). -If the workflow `call-deploy-book` is used, and you don't want the _dependabot_ branches to be built and deployed (and all other branches you do want), you can achieve this by adding the next to the file `call-deploy-book.yml`: +Note that these activities will occur automatically and may trigger other workflows in your repository (for example, the building of a book on another branch). If the workflow `call-deploy-book` is used, and you don't want the _dependabot_ branches to be built and deployed (and all other branches you do want), you can achieve this by adding the following text to the file `call-deploy-book.yml`: ```yaml on: From 6f3294e66fc9573c49bdd4085d03cbc7b1a68afa Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 06:51:15 +0200 Subject: [PATCH 054/347] overview update --- book/features/overview.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index a13fbda..c048368 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -25,6 +25,8 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). +As the TeachBooks Python Package and the Deploy Book Workflow are important tools that incorporate and deploy more than one feature, an additional explanation is provided on this page in more detail, with links to the pages in this manual where individual features are described. + (teachbooks_package)= ## TeachBooks Python Package @@ -33,9 +35,9 @@ To see examples for these features, go to the [Examples chapter](../examples/ove This section is useful for user type 4-5. ``` -The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](./teachbooks-template.md). This raises two important points: +The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: -1. If you are a book user using the [TeachBooks Template](./teachbooks-template.md) or the [Deploy Book Workflow](./deploy-book-workflow.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). +1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the {ref}`Deploy Book Workflow <deploy-book-workflow-intro>`, your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). 2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: @@ -52,3 +54,25 @@ Items in the list here are currently implemented in the TeachBooks package and d - [Local Server](./local_server.md) The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. + +(deploy-book-workflow-intro)= +## Deploy Book Workflow + +The [Deploy Book Workflow](../external/deploy-book-workflow/README.md) is by default incorporated into any book that has been created using the [TeachBooks Template](../external/template/README.md). We also strongly encourage anyone to consider this tool as an alternative to the "standard" workflow provided by Jupyter Book, as ours automatically builds a different version of your book for every branch in your respository, along with a number of settings that can be used to customize the build process and URL structure of your book(s). This tool is described in more detail on [the Deploy Book Workflow page of this manual](../external/deploy-book-workflow/README.md), and one should note that it influences a number of other aspects of a TeachBook. + +### Related Features + +A list of tools and features that are dependent on, or related to, the Deploy Book Workflow (DBW) is provided here: + +Important for these features: +- [](../external/deploy-book-workflow/README.md): the main DBW page +- [](../external/template/README.md): books created from Template include DBW by default +- [](./draft-release.md): can be configured directly using the DBW +- [](./update_env.md): behaviors of this tool may influence the DBW +- {ref}`TeachBooks Python Package <teachbooks_package>`: included by default in the DBW +- [](./pull_request_build.md): created to provide DBW-like behavior for PR's from forked repositories +- [](./apa.md): a temporary fix is included in `teachbooks` to enable use in the DBW + +### Environmnets and Caching + +_Work in progress._ \ No newline at end of file From bc23d90cccfbde4469e94c83daa48481dead1315 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 14:03:37 +0200 Subject: [PATCH 055/347] meaningless bump: should reuse cache but still check dependencies --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6ec7aee..832a3c7 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,4 @@ The released book can be found on on https://teachbooks.io/manual. This page sho Some parts of this book are taken from other sources in the form of submodules (linked in the folder [book/external](book/external)). To contribute to those pages, contribute to the source repository directly with a fork and merge/pull request. If you intent to clone this book including its submodules, clone using: `git clone --recurse-submodules git@github.com:TeachBooks/manual.git` Happy book building! + From 31d96bd25bdafa85cb9fa3fde56412179cab3681 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 14:11:37 +0200 Subject: [PATCH 056/347] meaningless change to book: should result in new venv created, even though requirements not changed --- book/intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/intro.md b/book/intro.md index f5784e3..a918590 100644 --- a/book/intro.md +++ b/book/intro.md @@ -16,4 +16,4 @@ There are several "parts" to the manual: - The **Features** part describes a suite of tools that are useful for teachers, many of which are developed by TeachBooks contributors specifically for use in education. Many of these tools are illustrated in the **Examples**. - A few special tools are included in the **Editing Tools** that are useful when writing content. -See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. +See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. \ No newline at end of file From 374bd794d27672be57cd6d74694bede934233b9b Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Wed, 2 Apr 2025 14:20:01 +0200 Subject: [PATCH 057/347] last check didnt work. this one will confirm that requirements.txt change makes new venv created --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0451ff4..7edb00d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,5 +12,4 @@ sphinx-prime-applets == 1.0.2 git+https://github.com/TeachBooks/Sphinx-Thebe -docutils==0.17.1 - +docutils==0.17.1 \ No newline at end of file From c5bee6c13339585d5df01ffa0c73d6d922e8a1ea Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 3 Apr 2025 14:25:51 +0200 Subject: [PATCH 058/347] Update tools.md --- book/installation-and-setup/tools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/installation-and-setup/tools.md b/book/installation-and-setup/tools.md index a58e536..105947d 100644 --- a/book/installation-and-setup/tools.md +++ b/book/installation-and-setup/tools.md @@ -1,4 +1,4 @@ -```` +````{margin} ```{admonition} User types :class: tip This page is useful for user type 4-5. From 8d18777177ae93efc04af74e81deb9aa5fbbb2ec Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 3 Apr 2025 14:26:54 +0200 Subject: [PATCH 059/347] Update collaboration.md --- book/workflows/collaboration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/workflows/collaboration.md b/book/workflows/collaboration.md index 02cd9f0..11b20e3 100644 --- a/book/workflows/collaboration.md +++ b/book/workflows/collaboration.md @@ -9,7 +9,7 @@ This page is useful for user type 3, 4 and 5. A jupyter book is composed out of many files which contain the educational content produced by you. Through the use of branches it is possible to work on the book at the same time as your team-members. Working on content for the book is mainly individual work, the beauty of Git comes in when everybody's changes are merged into the main branch. -We have previously introduced the notions of using Git in the online environment (remote) or locally. All the (text, figures, etc.) files that make up the book are contained on the remote repository on GitLab or GitHub. This could be on an open repository on `gitlab.com` or `github.com`. In the context of creating educational books for students at TU Delft, the repository will most likely be located on `gitlab.tudelft.nl` or `github.com/teachbooks`. If this is the first time you interact with books, you're advise to use `github.com`. +We have previously introduced the notions of using Git in the online environment (remote) or locally. All the (text, figures, etc.) files that make up the book are contained on the remote repository on GitLab or GitHub. This could be on an open repository on `gitlab.com` or `github.com`. In the context of creating educational books for students at TU Delft, the repository will most likely be located on `github.com` or `gitlab.tudelft.nl`. If this is the first time you interact with books, you're advise to use `github.com`. The steps involved are as follows: @@ -132,4 +132,4 @@ The steps involved are as follows: ``````` 4. **Check changes online** 5. **Repeat steps 3 and 4 until you're satisfied** - 6. **Reviewing (merge request), (eventually repeat steps 3 and 4) and combine (merging) your version with main draft version of book** \ No newline at end of file + 6. **Reviewing (merge request), (eventually repeat steps 3 and 4) and combine (merging) your version with main draft version of book** From 2a52bf3c05b4324bf9d62d991ab58ace83808d3a Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 3 Apr 2025 14:28:26 +0200 Subject: [PATCH 060/347] Update collab.md --- book/installation-and-setup/collab.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/installation-and-setup/collab.md b/book/installation-and-setup/collab.md index f63cba5..73ca862 100644 --- a/book/installation-and-setup/collab.md +++ b/book/installation-and-setup/collab.md @@ -15,7 +15,7 @@ Finally, ensure that team members identify themselves according to the user type ## Review process Furthermore, establish a clear editing and review process. -For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {fa}`github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/en/stable/basics/repository.html) is advised. +For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {octicon}`mark-github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/en/stable/basics/repository.html) is advised. (draft_book)= ## Define draft version of book From ed03441951b17c652aae9dce1a6da0b40419a239 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 3 Apr 2025 14:30:05 +0200 Subject: [PATCH 061/347] Update credits.md --- book/credits.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/credits.md b/book/credits.md index dfdef48..51b3ab4 100644 --- a/book/credits.md +++ b/book/credits.md @@ -5,7 +5,7 @@ You can refer to this book in its entirety as: > TeachBooks Development Team (2024), _TeachBooks Manual_. https://github.com/TeachBooks/manual. Retreived [Month, Year]. CC BY 4.0. -This book is already registered on Zenodo: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) +This book is registered on Zenodo too: [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) The introduction, structure and decisions on content is done under direction of the TeachBooks Development Team. The content is written by many contributors, of which there are many. From a6045e7d1efe1c0258c49bb24ab43f059a947d5e Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Fri, 4 Apr 2025 16:49:13 +0200 Subject: [PATCH 062/347] DBW and packages note ready --- book/features/overview.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index c048368..dbfc3c8 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -66,7 +66,7 @@ A list of tools and features that are dependent on, or related to, the Deploy Bo Important for these features: - [](../external/deploy-book-workflow/README.md): the main DBW page -- [](../external/template/README.md): books created from Template include DBW by default +- [](../external/template/README.md): books created from the Template include DBW by default - [](./draft-release.md): can be configured directly using the DBW - [](./update_env.md): behaviors of this tool may influence the DBW - {ref}`TeachBooks Python Package <teachbooks_package>`: included by default in the DBW @@ -75,4 +75,6 @@ Important for these features: ### Environmnets and Caching -_Work in progress._ \ No newline at end of file +As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. As this would mostly occur when multiple branches are being actively used (new commits on each branch at least once per week), and a package from the `requirements.txt` file is updated in the time between creation of two or more branches, which _also_ has a significant impact on the book building process...we except this to have a relatively low risk of occurring. + +Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. \ No newline at end of file From a9d7fab8b44899493cbb5ca0d10fc849b99e2a25 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Fri, 4 Apr 2025 16:54:34 +0200 Subject: [PATCH 063/347] remove warning on external toc page --- book/features/external_toc.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 1df92ea..b2287e8 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -16,9 +16,7 @@ When creating books, you might want to reuse material from other people or from Previously, this book feature was implemented using [submodules](../external/Nested-Books/README.md), but the implementation was more difficult to use. Despite this, submodules are still a widely used Git feature that can be very useful for book authors, so check out the [submodules page](../external/Nested-Books/README.md) to learn more, especially if the External TOC tool does not satisfy your needs. Submodules have a few additional features not (yet) implemented using the External TOC. -```{warning} -The External TOC features are incorporated in `v0.2.0` of the TeachBooks package. If you are using a TeachBooks Template book or our deploy-book-workflow this will become part of your book builds in GitHub Actions as the cache for your book expires (typically around 1 week after not editing your book branch). We do not expect it to cause issues with existing books, but if it does, you can use the following in your requirements file: `teachbooks<0.2.0`. -``` +The External TOC features are incorporated in the teachbooks package starting with version `0.2.0`. ## What does it do? From b7352c2d6ac137e95adc78ed9fce85f377ac50f8 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Fri, 4 Apr 2025 16:54:45 +0200 Subject: [PATCH 064/347] add note about deleting cache --- book/features/overview.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/book/features/overview.md b/book/features/overview.md index dbfc3c8..2fa3ce8 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -77,4 +77,6 @@ Important for these features: As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. As this would mostly occur when multiple branches are being actively used (new commits on each branch at least once per week), and a package from the `requirements.txt` file is updated in the time between creation of two or more branches, which _also_ has a significant impact on the book building process...we except this to have a relatively low risk of occurring. -Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. \ No newline at end of file +Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. + +If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). \ No newline at end of file From e5bed622e03a20f11bb988cb2c9761608137a3df Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Fri, 4 Apr 2025 17:13:32 +0200 Subject: [PATCH 065/347] remove duplicate text --- book/features/draft-release.md | 1 - 1 file changed, 1 deletion(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index adfaed7..88b61be 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -9,7 +9,6 @@ This page is useful for user type 3-5. {bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` -Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}`Deploy Book Workflow <deploy-book-workflow>`, which builds our TeachBooks). ```` (teachbooks-package)= From f6f8164f9b89721b67fd12fc2413d26824617ab7 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Fri, 4 Apr 2025 17:14:51 +0200 Subject: [PATCH 066/347] User type in margin --- book/features/overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/book/features/overview.md b/book/features/overview.md index 2fa3ce8..9b43a92 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -30,10 +30,12 @@ As the TeachBooks Python Package and the Deploy Book Workflow are important tool (teachbooks_package)= ## TeachBooks Python Package +````{margin} ```{admonition} User types :class: tip This section is useful for user type 4-5. ``` +```` The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: From 4dfffb1206359aa5e9554466c55cb1c7de0d4e2d Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Sat, 5 Apr 2025 06:03:52 +0200 Subject: [PATCH 067/347] clarify that an venv issue will be 1 week max --- book/features/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/overview.md b/book/features/overview.md index 9b43a92..3b442fb 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -77,7 +77,7 @@ Important for these features: ### Environmnets and Caching -As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. As this would mostly occur when multiple branches are being actively used (new commits on each branch at least once per week), and a package from the `requirements.txt` file is updated in the time between creation of two or more branches, which _also_ has a significant impact on the book building process...we except this to have a relatively low risk of occurring. +As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. From b3183b8e858ad338438a0c503bd5b481948186c0 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame <lanzafame.robert@gmail.com> Date: Sat, 5 Apr 2025 06:12:07 +0200 Subject: [PATCH 068/347] note build commands --- book/features/overview.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/book/features/overview.md b/book/features/overview.md index 3b442fb..49c62c5 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -48,6 +48,8 @@ For those who wish to use the package, it is available on [PyPI](https://pypi.or teachbooks build book ``` +This Manual describes the main features and usage of the package. For those who wish to understand more of hte technical details, note that the implementation the API is is documented at [teachbooks.readthedocs.io/](https://teachbooks.readthedocs.io/). + ### List of Features Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: @@ -75,6 +77,18 @@ Important for these features: - [](./pull_request_build.md): created to provide DBW-like behavior for PR's from forked repositories - [](./apa.md): a temporary fix is included in `teachbooks` to enable use in the DBW +### Book Build Commands + +By default the DBW builds books using the following command: +``` +teachbooks build book/ +``` + +To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Workflow the `BRANCHES_TO_PREPROCESS` variable must be configured for a specific branch, which will then execute the following command: +``` +teachbooks build --release book/ +``` + ### Environmnets and Caching As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. From 306cb1defa073d7099a702edc43bdc8bf788d01d Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 8 Apr 2025 08:38:45 +0200 Subject: [PATCH 069/347] Update versioning.md --- book/features/versioning.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/versioning.md b/book/features/versioning.md index a84aa27..6f0f55d 100644 --- a/book/features/versioning.md +++ b/book/features/versioning.md @@ -1,7 +1,7 @@ ````{margin} ```{attributiongrey} Attribution :class: attribution -This page reuses adapted CC BY 3.0 content from Tom Preston-Werner {cite:t}`semver`. {fa}`quote-left`{ref}`Find out more here.<external_resources>```` +This page reuses adapted CC BY 3.0 content from {cite:t}`semver`. {fa}`quote-left`{ref}`Find out more here.<external_resources>```` ```` # TeachBooks Versioning @@ -39,4 +39,4 @@ An example can be seen in [the source repository of the Engineering Systems Opti ```` ````` -Read [](../installation-and-setup/versioning_changelog.md) on how to combine this with a changelog, tags and releases! \ No newline at end of file +Read [](../installation-and-setup/versioning_changelog.md) on how to combine this with a changelog, tags and releases! From 9430b2de5b7edaa279b76122b080f6b5d902bdf4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 07:00:38 +0000 Subject: [PATCH 070/347] Bump book/external/deploy-book-workflow from `ea450f3` to `c534383` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `ea450f3` to `c534383`. - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/ea450f3c0c4f9aba6438333c122543fca02c472d...c534383e3726f8c40bae223052b13bf98f8caa75) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-version: c534383e3726f8c40bae223052b13bf98f8caa75 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index ea450f3..c534383 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit ea450f3c0c4f9aba6438333c122543fca02c472d +Subproject commit c534383e3726f8c40bae223052b13bf98f8caa75 From 6663cc56bdbc46e9767a1364191166837f7fb159 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 07:37:07 +0000 Subject: [PATCH 071/347] Bump book/external/Sphinx-TUDelft-theme from `103caec` to `d845f78` Bumps [book/external/Sphinx-TUDelft-theme](https://github.com/TeachBooks/Sphinx-TUDelft-theme) from `103caec` to `d845f78`. - [Release notes](https://github.com/TeachBooks/Sphinx-TUDelft-theme/releases) - [Commits](https://github.com/TeachBooks/Sphinx-TUDelft-theme/compare/103caecd4844353c68c166fa6ebed24a868c848c...d845f78e04bc0a4feca0c917f88599bdd1f02ecb) --- updated-dependencies: - dependency-name: book/external/Sphinx-TUDelft-theme dependency-version: d845f78e04bc0a4feca0c917f88599bdd1f02ecb dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/Sphinx-TUDelft-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index 103caec..d845f78 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit 103caecd4844353c68c166fa6ebed24a868c848c +Subproject commit d845f78e04bc0a4feca0c917f88599bdd1f02ecb From 3b45ce2f45732680df54a7511ef26dc123f3827d Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Mon, 14 Apr 2025 11:25:55 +0200 Subject: [PATCH 072/347] Update draft-release.md --- book/features/draft-release.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 88b61be..01d48a9 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -1,5 +1,4 @@ -(draft-release)= -# Draft-Release Workflow + ````{margin} ```{admonition} User types @@ -11,7 +10,7 @@ This page is useful for user type 3-5. ```` -(teachbooks-package)= +(draft-release)= # Draft-Release Workflow Often it is necessary to prepare, review and edit materials in parallel to material that is currently being used by students, or another target audience. This workflow enables an author to easily maintain separate versions of a book without having to repeatedly comment out lines of a table of contents or page when building different versions. It is also easy to implement in CI/CD settings (it is already implemented in the {ref}Deploy Book Workflow <deploy-book-workflow>`, which builds our TeachBooks). From 17ef250435ce37bb994c962f1bff4d69491d5fe0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:26:14 +0000 Subject: [PATCH 073/347] Bump book/external/template from `17b99b2` to `352ce20` Bumps [book/external/template](https://github.com/TeachBooks/template) from `17b99b2` to `352ce20`. - [Commits](https://github.com/TeachBooks/template/compare/17b99b2de4edbcbf4d8a92fed52c3d335431699b...352ce2076e32e852f0d718f8f4ed414898821365) --- updated-dependencies: - dependency-name: book/external/template dependency-version: 352ce2076e32e852f0d718f8f4ed414898821365 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/template b/book/external/template index 17b99b2..352ce20 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 17b99b2de4edbcbf4d8a92fed52c3d335431699b +Subproject commit 352ce2076e32e852f0d718f8f4ed414898821365 From e25245ff005fb4d6e81ba2de4cb61464a231dc09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 09:29:10 +0000 Subject: [PATCH 074/347] Bump book/external/Download-Link-Replacer from `6318fd9` to `10ff656` Bumps [book/external/Download-Link-Replacer](https://github.com/TeachBooks/Download-Link-Replacer) from `6318fd9` to `10ff656`. - [Release notes](https://github.com/TeachBooks/Download-Link-Replacer/releases) - [Commits](https://github.com/TeachBooks/Download-Link-Replacer/compare/6318fd9db4b465bf56b06085ca55c79a8a818471...10ff656dc4b871330dd2271d00d2e8b9a9a57613) --- updated-dependencies: - dependency-name: book/external/Download-Link-Replacer dependency-version: 10ff656dc4b871330dd2271d00d2e8b9a9a57613 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/Download-Link-Replacer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Download-Link-Replacer b/book/external/Download-Link-Replacer index 6318fd9..10ff656 160000 --- a/book/external/Download-Link-Replacer +++ b/book/external/Download-Link-Replacer @@ -1 +1 @@ -Subproject commit 6318fd9db4b465bf56b06085ca55c79a8a818471 +Subproject commit 10ff656dc4b871330dd2271d00d2e8b9a9a57613 From 1a52bdf87d354be69b06594f74a9bcb9684365b4 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Mon, 14 Apr 2025 11:32:29 +0200 Subject: [PATCH 075/347] Update students.md --- book/features/students.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/students.md b/book/features/students.md index e16a668..0ce5bca 100644 --- a/book/features/students.md +++ b/book/features/students.md @@ -1,4 +1,4 @@ -```` +````{margin} ```{admonition} User types :class: tip This section is useful for user type 1-5. From 2df1be74cb38758efbd146f2e5fbd378084b9d0a Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Tue, 22 Apr 2025 15:31:46 +0200 Subject: [PATCH 076/347] Update overview.md --- book/features/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index 49c62c5..33e603f 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -89,10 +89,10 @@ To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Wor teachbooks build --release book/ ``` -### Environmnets and Caching +### Environments and Caching As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. -If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). \ No newline at end of file +If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). From 937acab401594dfb88a5603e2def6f5dda7aef8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Apr 2025 13:41:43 +0000 Subject: [PATCH 077/347] Bump book/external/deploy-book-workflow from `c534383` to `910542a` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `c534383` to `910542a`. - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/c534383e3726f8c40bae223052b13bf98f8caa75...910542a3ac426020f738dfb0de313f66d9d3f43f) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-version: 910542a3ac426020f738dfb0de313f66d9d3f43f dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index c534383..910542a 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit c534383e3726f8c40bae223052b13bf98f8caa75 +Subproject commit 910542a3ac426020f738dfb0de313f66d9d3f43f From 8f7006bd80beca1c77ab5214bffac9a5e1286360 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 15:44:02 +0200 Subject: [PATCH 078/347] Update live_code.ipynb --- book/features/live_code.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 55b620f..44c153d 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -9,12 +9,12 @@ ":class: tip\n", "This section is useful for user type 5.\n", "```\n", + "\n", + "{bdg-primary}`Sphinx Extension`\n", "```` \n", "\n", "# Interactive content: Run Python inside your book\n", "\n", - "{bdg-primary}`Sphinx Extension`\n", - "\n", "Our book has been enable to run Python code live in the browser (thanks Max!). This extension makes code cells in your `.ipynb` book pages editable and executable by the reader! Opposed to the original sphinx-thebe extensions, our extension runs python in the reader's browser and doesn't rely on an external webserver for the python kernel. We highly recommend this extension as it allows you to use the strength of combining text/figures and code of a jupyter book with interactivity!\n", "\n", "This page contains some installation instructions and the other sections show how to use this functionality to create interactive figures and feedback on code\n", From b5baeca981349e16f734226c294d6a5023c2a04e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 15:52:53 +0200 Subject: [PATCH 079/347] Add recombiner to share content page --- book/features/external_toc.md | 11 ++++++++--- book/features/overview.md | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index b2287e8..b60c445 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -5,6 +5,7 @@ This page is useful for user type 3-5. ``` {bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` +{bdg-succes}`WebApp` ```` (external-toc)= @@ -12,18 +13,20 @@ This page is useful for user type 3-5. ## Introduction -When creating books, you might want to reuse material from other people or from other books you made. In some cases you might even want to have the exact same material into your book. You could do so by manually copying material over. However, whenever the source material is updated, you have to do that again. As an alternative, you can use the underlying git system to refer to the source file directly. This allows you to pick a specific version, or keep the most up-to-date version of it. This pages explains how to do so directly in the table of contents using the **External Content** (or **External TOC**) feature which is part of the TeachBooks Python package. +When creating books, you might want to reuse material from other people or from other books you made. In some cases you might even want to have the exact same material into your book. You could do so by manually copying material over. However, whenever the source material is updated, you have to do that again. As an alternative, you can use the underlying git system to refer to the source file directly. This allows you to pick a specific version, or keep the most up-to-date version of it. This pages explains how to do so directly in the table of contents using the **External Content** (or **External TOC**) feature which is part of the TeachBooks Python package, or with making use of the [TeachBooks Recombiner](https://teachbooks.io/recombiner/) Previously, this book feature was implemented using [submodules](../external/Nested-Books/README.md), but the implementation was more difficult to use. Despite this, submodules are still a widely used Git feature that can be very useful for book authors, so check out the [submodules page](../external/Nested-Books/README.md) to learn more, especially if the External TOC tool does not satisfy your needs. Submodules have a few additional features not (yet) implemented using the External TOC. -The External TOC features are incorporated in the teachbooks package starting with version `0.2.0`. +The External TOC features are incorporated in the teachbooks package starting with version `0.2.0`. The [TeachBooks Recombiner](https://teachbooks.io/recombiner/) is a webapp to ease that process. ## What does it do? This functionality, part of the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) allows you to refer to `.ipynb`, `.md` and `.rst` files stored on public repositories. These files are then handles as if they were normal files in your book, leading to a the file as a page in your built book. To prevent issues it validates that the external content has a permissive license, automatically combines any `reference.bib` files, and warns you if there's a mismatch in `requirements.txt` or with plugins in `_config.yml`. +To ease the process, the webapp [TeachBooks Recombiner](https://teachbooks.io/recombiner/) allows you to select the pages to take from other books and generate the syntax to add them to your book. + ## Installation -To use this extenstion, follow these steps: +To use this extension, follow these steps: **Step 1: Install the Package** @@ -65,6 +68,8 @@ The link can be pointing to a file on a branch (which will take the most recent - `external: https://github.com/TeachBooks/manual/blob/06d67e8a0110c94d9147ce07090656dedc7d0e64/README.md` will take the file during the state of a specific commit (06d67e8). - `external: https://github.com/TeachBooks/manual/blob/v1.1.1/README.md` will take the file during the state of a specific tag (v1.1.1) +These links can be created manually, copied from your browser, or by using the [TeachBooks Recombiner](https://teachbooks.io/recombiner/). For the TeachBooks Recombiner: add the book you want to take content from, select the chapters and follow the instructions which gives you the syntax to add to your `_toc.yml`. + If you're building your book online in GitHub, the [deploy-book-workflow](../external/deploy-book-workflow/README.md) will deal with these files during the `teachbooks build` command. If you want to build the book locally, run the command `teachbooks build`. If the source file is from another book, the contents of the `requirements.txt`, `_config.yml` are checked for any missing/incompatible entries. If this leads to compatibility issue, you'll be warned during the build which will help you solve these dependencies or plugins manually by updating your main book's `_config.yml` and `requirements.txt` diff --git a/book/features/overview.md b/book/features/overview.md index 33e603f..4512da2 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -20,6 +20,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` - {bdg-danger}`iframe` +- {bdg-succes}`WebApp` Finally, the purpose, installation process and usage of each features is elaborated on in the respective sub-sections. From d90c0287f5fb7b006bd6f774f52d7f9cf6bf59f9 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 15:57:23 +0200 Subject: [PATCH 080/347] Update external_toc.md --- book/features/external_toc.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index b60c445..3d68754 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -5,6 +5,7 @@ This page is useful for user type 3-5. ``` {bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` + {bdg-succes}`WebApp` ```` From 59d2320eee697d08dee89fae6d1b1029a1873f0e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 15:57:44 +0200 Subject: [PATCH 081/347] typo fix --- book/features/external_toc.md | 2 +- book/features/overview.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 3d68754..fb9dd22 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. {bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` -{bdg-succes}`WebApp` +{bdg-success}`WebApp` ```` (external-toc)= diff --git a/book/features/overview.md b/book/features/overview.md index 4512da2..f7cf5db 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -20,7 +20,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` - {bdg-danger}`iframe` -- {bdg-succes}`WebApp` +- {bdg-success}`WebApp` Finally, the purpose, installation process and usage of each features is elaborated on in the respective sub-sections. From 8e1420603813f6e0a1a579b219faa2973f7471ab Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 17:03:15 +0200 Subject: [PATCH 082/347] Update book/features/external_toc.md Co-authored-by: Bart Schilperoort <b.schilperoort@gmail.com> --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index fb9dd22..15d0cb7 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -14,7 +14,7 @@ This page is useful for user type 3-5. ## Introduction -When creating books, you might want to reuse material from other people or from other books you made. In some cases you might even want to have the exact same material into your book. You could do so by manually copying material over. However, whenever the source material is updated, you have to do that again. As an alternative, you can use the underlying git system to refer to the source file directly. This allows you to pick a specific version, or keep the most up-to-date version of it. This pages explains how to do so directly in the table of contents using the **External Content** (or **External TOC**) feature which is part of the TeachBooks Python package, or with making use of the [TeachBooks Recombiner](https://teachbooks.io/recombiner/) +When creating books, you might want to reuse material from other people or from other books you made. In some cases you might even want to have the exact same material into your book. You could do so by manually copying material over. However, whenever the source material is updated, you have to do that again. As an alternative, you can use the underlying git system to refer to the source file directly. This allows you to pick a specific version, or keep the most up-to-date version of it. This pages explains how to do so directly in the table of contents using the **External Content** (or **External TOC**) feature which is part of the TeachBooks Python package, or by making use of the [TeachBooks Recombiner](https://teachbooks.io/recombiner/). Previously, this book feature was implemented using [submodules](../external/Nested-Books/README.md), but the implementation was more difficult to use. Despite this, submodules are still a widely used Git feature that can be very useful for book authors, so check out the [submodules page](../external/Nested-Books/README.md) to learn more, especially if the External TOC tool does not satisfy your needs. Submodules have a few additional features not (yet) implemented using the External TOC. From c2f38e8c417d72aca294693cac203dc240d9a056 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 23 Apr 2025 17:03:29 +0200 Subject: [PATCH 083/347] Update book/features/external_toc.md Co-authored-by: Bart Schilperoort <b.schilperoort@gmail.com> --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 15d0cb7..40c28fc 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -69,7 +69,7 @@ The link can be pointing to a file on a branch (which will take the most recent - `external: https://github.com/TeachBooks/manual/blob/06d67e8a0110c94d9147ce07090656dedc7d0e64/README.md` will take the file during the state of a specific commit (06d67e8). - `external: https://github.com/TeachBooks/manual/blob/v1.1.1/README.md` will take the file during the state of a specific tag (v1.1.1) -These links can be created manually, copied from your browser, or by using the [TeachBooks Recombiner](https://teachbooks.io/recombiner/). For the TeachBooks Recombiner: add the book you want to take content from, select the chapters and follow the instructions which gives you the syntax to add to your `_toc.yml`. +These links can be created manually, copied from your browser, or generated using the [TeachBooks Recombiner](https://teachbooks.io/recombiner/). For the TeachBooks Recombiner: add the book you want to take content from, select the chapters and follow the instructions which gives you the syntax to add to your `_toc.yml`. If you're building your book online in GitHub, the [deploy-book-workflow](../external/deploy-book-workflow/README.md) will deal with these files during the `teachbooks build` command. If you want to build the book locally, run the command `teachbooks build`. From ff32af1ddcb1b7bc59796fd5bef0ea7bdc5cb78c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 24 Apr 2025 15:28:01 +0200 Subject: [PATCH 084/347] Added custom admonition configuration --- book/credits.md | 2 +- book/features/external_toc.md | 43 ++++++++++++++++++- .../copyright/recommendations.md | 1 + book/references.bib | 8 ++++ 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/book/credits.md b/book/credits.md index 51b3ab4..7e00316 100644 --- a/book/credits.md +++ b/book/credits.md @@ -63,7 +63,7 @@ The following pages contain content written by others, part of has been reused a - Page {ref}`copyright_licenses`: {numref}`Figure %s<fig_license_types>` is included unmodified, along with paraphrased and quoted text (including hyperlinks) from {cite:t}`hall21`. Work is licensed under CC BY. - Page {ref}`copyright_licenses`: {numref}`Figure %s<fig_license_compatibility>` is included unmodified. Work is provided by Kennisland under a CC0 license. Accessed at [](https://wiki.creativecommons.org/wiki/File:CC_License_Compatibility_Chart.png) on December 17, 2024. - page [](./features/versioning.md): includes text from {cite:t}`semver` that has been modified. Original content licensed under CC BY 3.0. - +- page [](./features/external_toc.md): includes text from {cite:t}`teachbooks_package` that has been modified. Original content licensed under MIT. diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 40c28fc..b814e24 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -1,4 +1,9 @@ ````{margin} +```{attributiongrey} Attribution +:class: attribution +This page reuses MIT licensed content from {cite:t}`teachbooks_package`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +``` + ```{admonition} User types :class: tip This page is useful for user type 3-5. @@ -22,7 +27,7 @@ The External TOC features are incorporated in the teachbooks package starting wi ## What does it do? -This functionality, part of the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) allows you to refer to `.ipynb`, `.md` and `.rst` files stored on public repositories. These files are then handles as if they were normal files in your book, leading to a the file as a page in your built book. To prevent issues it validates that the external content has a permissive license, automatically combines any `reference.bib` files, and warns you if there's a mismatch in `requirements.txt` or with plugins in `_config.yml`. +This functionality, part of the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) allows you to refer to `.ipynb`, `.md` and `.rst` files stored on public repositories. These files are then handles as if they were normal files in your book, leading to a the file as a page in your built book. To prevent issues it validates that the external content has a permissive license, automatically combines any `reference.bib` files, and warns you if there's a mismatch in `requirements.txt` or with plugins in `_config.yml`. Furthermore, it adds an attribution admonition (like the one on this page) to the page, showing the source of the file in the built book. To ease the process, the webapp [TeachBooks Recombiner](https://teachbooks.io/recombiner/) allows you to select the pages to take from other books and generate the syntax to add them to your book. @@ -76,6 +81,42 @@ If you're building your book online in GitHub, the [deploy-book-workflow](../ext If the source file is from another book, the contents of the `requirements.txt`, `_config.yml` are checked for any missing/incompatible entries. If this leads to compatibility issue, you'll be warned during the build which will help you solve these dependencies or plugins manually by updating your main book's `_config.yml` and `requirements.txt` Additionally, any `references.bib` files are merged into your main book's `references.bib` file, and the licenses of the external content are validated to allow for re-use. External content without a permissive license will result in an error to try to prevent any accidental copyright infringement. +### Configuration +The attribution admonition can be configured in the `_config.yml` file. You can adapt the location (top or margin), colour (making use of the sphinx extension [Sphinx-Named-Colors](../external/Sphinx-Named-Colors/README.md)), and symbol (by adding a custom CSS class). This leads to a similar admonition as mentioned [in the chapter on recommendations for copyright and licenses](custom_attribution). + +To adapt the location of the admonition (margin or top, top is default option), you can use the following configuration: + +```yaml +teachbooks: + attribution_location: margin +``` + +To adapt the colour of the admonition (with for example a grey colour, default is blue), you can use the following configuration. Make sure to add the `sphinx-named-colors` extension to your environment (e.g., `requirements.txt`): + +```yaml +sphinx: + config: + named_colors_custom_colors: {'attributiongrey':[150,150,150]} + extra_extensions: + - sphinx_named_colors + +teachbooks: + attribution_color: attributiongrey +``` + +To adapt the symbol of the admonition (with for example double quotes), you can add the following [custom CSS class](../_static/attribution.css) to `book/_static/attribution.css`: + +```css +/* Attribution */ +div.attribution > .admonition-title::after { + content: "\f10d"; +} +``` + +Note that, when making a changes for the configuration locally they are not incorporated to existing external content. +You will need to remove the `_git/` folder and re-run the build command to see the changes. When building the book on i.e. GitHub Actions, the `_git/` folder is always rebuild from scratch. + + ## Contribute This tool's repository is stored on [GitHub](https://github.com/TeachBooks/TeachBooks). If you'd like to contribute, you can create a fork and open a pull request on the [GitHub repository](https://github.com/TeachBooks/TeachBooks). diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index c018533..68a0fd7 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -73,6 +73,7 @@ This produces > This page reuses CC BY content from {cite:t}`jason_moore`. {fa}`quote-left`{ref}`Find out more here.<external_resources>` +(custom_attribution)= ##### Format as custom admonition The previous syntax might be used for other purposes as well. An alternative is a custom attribution admonition: diff --git a/book/references.bib b/book/references.bib index fd81c05..ed12b0f 100644 --- a/book/references.bib +++ b/book/references.bib @@ -157,4 +157,12 @@ url = {https://github.com/TeachBooks/Sphinx-PRIME-applets}, year = {2025}, note = {Retrieved April 2025. MIT.} +} + +@misc{teachbooks_package, + author = {{TeachBooks}}, + title = {TeachBooks Package: Jupyter Book Wrappe}, + url = {https://github.com/TeachBooks/TeachBooks}, + year = {2024}, + note = {Retrieved April, 2025. MIT License.} } \ No newline at end of file From a38cd11ccdbcc7b04f5ff382403aed48931a6efa Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 24 Apr 2025 15:34:22 +0200 Subject: [PATCH 085/347] update license pages with full instructions --- .../copyright/recommendations.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index 68a0fd7..a23439e 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -97,7 +97,24 @@ This page reuses <license> content from {cite:t}`bib_id`. {fa}`quote-left`{ref}` ```` ````` -To make this possible we use the custom admonitions of [the custom named colors sphinx extension](https://teachbooks.io/manual/external/Sphinx-Named-Colors/README.html#admonitions) in combination with a [custom css file](../../_static/attribution.css) in `book/_static/` and the line `named_colors_custom_colors: {'attributiongrey':[150,150,150]}` in `book/_config.yml` under `sphinx: config: ` +To make this possible we use the custom admonitions of [the custom named colors sphinx extension](https://teachbooks.io/manual/external/Sphinx-Named-Colors/README.html#admonitions) in combination with a custom css file. `_config.yml` needs to be configured as follows, making sure to add the `sphinx-named-colors` extension to your environment (e.g., `requirements.txt`): + +```yaml +sphinx: + config: + named_colors_custom_colors: {'attributiongrey':[150,150,150]} + extra_extensions: + - sphinx_named_colors +``` + +To adapt the symbol of the admonition (to double quotes), you can add the following [custom CSS class](../../_static/attribution.css) to `book/_static/attribution.css`: + +```css +/* Attribution */ +div.attribution > .admonition-title::after { + content: "\f10d"; +} +``` (copyright_recc_credits)= From b0c9f6c22e21e2d1f8660fb24bf7aba7e5ccfe2d Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 24 Apr 2025 15:36:32 +0200 Subject: [PATCH 086/347] Update _config.yml --- book/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_config.yml b/book/_config.yml index eaa1a16..8e790c7 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -1,5 +1,5 @@ title: TeachBooks Manual -author: TeachBooks Team, built with <a href="https://teachbooks.io/">TeachBooks</a> and <a href="https://jupyterbook.org/">Jupyter Book</a>, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer"">CC BY 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt=""></a> +author: TeachBooks Development Team and TeachBooks users, built with <a href="https://teachbooks.io/">TeachBooks</a> and <a href="https://jupyterbook.org/">Jupyter Book</a>, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer"">CC BY 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt=""></a> execute: execute_notebooks: 'off' From b1c95eacd42492886238573d79b8c2808351bfaa Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 24 Apr 2025 15:37:11 +0200 Subject: [PATCH 087/347] move text --- book/installation-and-setup/copyright/recommendations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/installation-and-setup/copyright/recommendations.md b/book/installation-and-setup/copyright/recommendations.md index a23439e..4e3f253 100644 --- a/book/installation-and-setup/copyright/recommendations.md +++ b/book/installation-and-setup/copyright/recommendations.md @@ -77,6 +77,8 @@ This produces ##### Format as custom admonition The previous syntax might be used for other purposes as well. An alternative is a custom attribution admonition: +Therefore, use the following syntax: + ````{margin} ```{attributiongrey} Attribution :class: attribution @@ -85,8 +87,6 @@ This page reuses CC BY 4.0 licensed content from {cite:t}`jason_moore`. {fa}`quo ``` ```` -Therefore, use the following syntax: - `````md ````{margin} ```{attributiongrey} Attribution From 535c681808a6d44ef9bd7afa40b82f166bb2f6e7 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 13:31:30 +0200 Subject: [PATCH 088/347] Added shpinx-indexed-defintions --- book/_toc.yml | 1 + book/references.bib | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/book/_toc.yml b/book/_toc.yml index d6badc4..5fa8b99 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -87,6 +87,7 @@ parts: - file: features/exercise_checking.ipynb - file: features/jupyterquiz.ipynb - file: external/sphinx-iframes/README.md + - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md - file: external/Sphinx-PRIME-applets/README.md - file: features/visuals.md sections: diff --git a/book/references.bib b/book/references.bib index fd81c05..65a4761 100644 --- a/book/references.bib +++ b/book/references.bib @@ -157,4 +157,20 @@ url = {https://github.com/TeachBooks/Sphinx-PRIME-applets}, year = {2025}, note = {Retrieved April 2025. MIT.} +} + +@misc{teachbooks_package, + author = {{TeachBooks}}, + title = {TeachBooks Package: Jupyter Book Wrapper}, + url = {https://github.com/TeachBooks/TeachBooks}, + year = {2024}, + note = {Retrieved April, 2025. MIT License.} +} + +@misc{sphinx-indexed-definitions, + author = {{TeachBooks}}, + title = {Sphinx Indexed Definitions}, + url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, + year = {2025}, + note = {Retrieved April, 2025. MIT License.} } \ No newline at end of file From a9ade696a8c413fdc616ed771abac839ebd3161e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:36:18 +0000 Subject: [PATCH 089/347] Bump book/external/sphinx-iframes from `062c54a` to `e21273d` Bumps [book/external/sphinx-iframes](https://github.com/TeachBooks/sphinx-iframes) from `062c54a` to `e21273d`. - [Release notes](https://github.com/TeachBooks/sphinx-iframes/releases) - [Commits](https://github.com/TeachBooks/sphinx-iframes/compare/062c54a679c6dd44b948549498e755c7c5df1d73...e21273da134cbf4753da5faf9adc277b8f1c3a1c) --- updated-dependencies: - dependency-name: book/external/sphinx-iframes dependency-version: e21273da134cbf4753da5faf9adc277b8f1c3a1c dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/sphinx-iframes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 062c54a..e21273d 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 062c54a679c6dd44b948549498e755c7c5df1d73 +Subproject commit e21273da134cbf4753da5faf9adc277b8f1c3a1c From 811afc005986cf648030d92c558c4ae96b4aac4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 11:36:20 +0000 Subject: [PATCH 090/347] Bump book/external/Sphinx-TUDelft-theme from `d845f78` to `2ab5d1d` Bumps [book/external/Sphinx-TUDelft-theme](https://github.com/TeachBooks/Sphinx-TUDelft-theme) from `d845f78` to `2ab5d1d`. - [Release notes](https://github.com/TeachBooks/Sphinx-TUDelft-theme/releases) - [Commits](https://github.com/TeachBooks/Sphinx-TUDelft-theme/compare/d845f78e04bc0a4feca0c917f88599bdd1f02ecb...2ab5d1d708aed595b9630c94081e05c11a84b18c) --- updated-dependencies: - dependency-name: book/external/Sphinx-TUDelft-theme dependency-version: 2ab5d1d708aed595b9630c94081e05c11a84b18c dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/Sphinx-TUDelft-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index d845f78..2ab5d1d 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit d845f78e04bc0a4feca0c917f88599bdd1f02ecb +Subproject commit 2ab5d1d708aed595b9630c94081e05c11a84b18c From 84358418fbeb38ae13f76f194d99765a8248bd1a Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 13:38:00 +0200 Subject: [PATCH 091/347] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 7edb00d..30d3abd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -teachbooks == 0.1.0 +teachbooks == 0.2.0 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches==1.4.4 download_link_replacer == 1.0.4 @@ -12,4 +12,4 @@ sphinx-prime-applets == 1.0.2 git+https://github.com/TeachBooks/Sphinx-Thebe -docutils==0.17.1 \ No newline at end of file +docutils==0.17.1 From 8c0551b106e47d5e0b6652bbd887298c1dcd4e01 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 13:55:38 +0200 Subject: [PATCH 092/347] add ref-graph --- book/_toc.yml | 1 + book/references.bib | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/book/_toc.yml b/book/_toc.yml index 5fa8b99..daee2b3 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -97,6 +97,7 @@ parts: - file: external/teachbooks-sphinx-tippy/README.md - file: features/apa - file: external/Sphinx-Named-Colors/README.md + - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md - file: features/students sections: - file: external/annotater/README.md diff --git a/book/references.bib b/book/references.bib index 65a4761..7b3d706 100644 --- a/book/references.bib +++ b/book/references.bib @@ -173,4 +173,12 @@ url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, year = {2025}, note = {Retrieved April, 2025. MIT License.} +} + +@misc{sphinx-interactive-graph, + author = {{TeachBooks}}, + title = {Sphinx Indexed Definitions}, + url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, + year = {2025}, + note = {Retrieved April, 2025. MIT License.} } \ No newline at end of file From 140c6e6418585e0acb55a1d14c629113cbdfbd58 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 14:11:37 +0200 Subject: [PATCH 093/347] reference exercises in template --- book/basic-features/jupyterbook.md | 3 +++ book/external/Sphinx-Named-Colors | 2 +- book/external/deploy-book-workflow | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/book/basic-features/jupyterbook.md b/book/basic-features/jupyterbook.md index 6737a17..22dc777 100644 --- a/book/basic-features/jupyterbook.md +++ b/book/basic-features/jupyterbook.md @@ -116,6 +116,9 @@ parts: - file: section_1_2 ``` +#### Exercise +Check out [this exercise](https://teachbooks.io/template/syntax_exercises/007.html) in the TeachBooks template to see for yourself how to structure files with titles! + ### Including a chapter twice In some cases you want to include the same chapter in two different places in your book (for instance parts). However, you do not want to make the same adjustments in different files, the content should only 'live' in one place. The solution is to use `include`: diff --git a/book/external/Sphinx-Named-Colors b/book/external/Sphinx-Named-Colors index b4b1a2e..57ecdd8 160000 --- a/book/external/Sphinx-Named-Colors +++ b/book/external/Sphinx-Named-Colors @@ -1 +1 @@ -Subproject commit b4b1a2e5d087336108bc15b176af1999b61dc86a +Subproject commit 57ecdd887e8bbc32a04aca20e9fc9cb60409b7d0 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 910542a..427215f 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 910542a3ac426020f738dfb0de313f66d9d3f43f +Subproject commit 427215f1ccc048847abd8cd86a1ba2e85c2dd549 From da92178a8b701f24ef6e75c7ff209be2a3b33eae Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 14:14:18 +0200 Subject: [PATCH 094/347] added indexed defintions to credits --- book/credits.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/credits.md b/book/credits.md index 51b3ab4..5cf5abe 100644 --- a/book/credits.md +++ b/book/credits.md @@ -56,6 +56,7 @@ The following pages are included directly from an external resource and is not e - Page [](./external/teachbooks-sphinx-tippy/README.md). Original content licensed under MIT license. - Page [](./external/template/README.md). Original content licensed under CC BY 4.0 license. - Page [](./external/Sphinx-Named-Colors/README.md). Original content licensed under MIT license. +- Page [](indexed_defintions). Original content licensed under MIT license. - Pages [](./external/Useful_python_code/extensionfildownloadreturn.ipynb), [](./external/Useful_python_code/figshrinker.ipynb) and [](./external/Useful_python_code/snippit.ipynb). Original content licensed under BSD 3-Clause license. The following pages contain content written by others, part of has been reused and/or modified by the TeachBooks Team: From 128d382d93126723b0d482fd6b2648d49d43b5d1 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Wed, 30 Apr 2025 14:15:43 +0200 Subject: [PATCH 095/347] Update credits.md --- book/credits.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/credits.md b/book/credits.md index 5cf5abe..492180c 100644 --- a/book/credits.md +++ b/book/credits.md @@ -57,6 +57,7 @@ The following pages are included directly from an external resource and is not e - Page [](./external/template/README.md). Original content licensed under CC BY 4.0 license. - Page [](./external/Sphinx-Named-Colors/README.md). Original content licensed under MIT license. - Page [](indexed_defintions). Original content licensed under MIT license. +- Page [](interactive_graph_content). Original content licensed under MIT license. - Pages [](./external/Useful_python_code/extensionfildownloadreturn.ipynb), [](./external/Useful_python_code/figshrinker.ipynb) and [](./external/Useful_python_code/snippit.ipynb). Original content licensed under BSD 3-Clause license. The following pages contain content written by others, part of has been reused and/or modified by the TeachBooks Team: From 70e582105e9aec95259bad077b240af421bb21f3 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:07:38 +0200 Subject: [PATCH 096/347] Update template --- book/external/template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/template b/book/external/template index 352ce20..8424c5e 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 352ce2076e32e852f0d718f8f4ed414898821365 +Subproject commit 8424c5e1fb5631474250859482b92fc1761c502f From 560913c2333ac43ff409dde092d37aeacd395028 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:12:53 +0200 Subject: [PATCH 097/347] Update h5p.md --- book/features/h5p.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/book/features/h5p.md b/book/features/h5p.md index 3934544..776c0c9 100644 --- a/book/features/h5p.md +++ b/book/features/h5p.md @@ -10,14 +10,16 @@ This section is useful for user type 3-5. # H5p interactive elements ## Instruction -H5p elements are interactive HTML-blocks which can be embedded in a Jupyter Book using an iframe. An H5p element can be created in the [TU Delft portal on the H5p website](https://tudelft.h5p.com/content) (sign in via Brightspace to H5p required first). The iframe code can be copied at Edit - Publish - Public - Embed code. This html code can be directly added to your markdown file using [](../external/sphinx-iframes/README.md): +H5p elements are interactive HTML-blocks which can be embedded in a Jupyter Book using an iframe. H5p requires a server to host those elements. For TU Delft employees, this is arranged for on a [TU Delft portal on the H5p website](https://tudelft.h5p.com/content) (sign in via Brightspace to H5p required first as described [here](https://www.tudelft.nl/teaching-support/educational-tools/h5p)). + +After creating an H5p element, the iframe code can be copied at Edit - Publish - Public - Embed code. This html link of that embed can be directly added to your markdown file using [](../external/sphinx-iframes/README.md): ```` ```{h5p} https://....h5p.com/content/.../embed ``` ```` -Alternative, you can use raw html: +Alternative, you can use raw html (lacking proper dark mode conversion): ```html <iframe src="https://....h5p.com/content/.../embed" aria-label="..." width="1088" height="200" frameborder="0" allowfullscreen="allowfullscreen" allow="autoplay *; geolocation *; microphone *; camera *; midi *; encrypted-media *"></iframe><script src="https://tudelft.h5p.com/js/h5p-resizer.js" charset="UTF-8"></script> ``` @@ -39,4 +41,4 @@ Some best-practices on the use of H5p: In the next subpage, these exampled are shown. -More information on H5p using the TU Delft provided hosting: [Teaching Support - Educational Tools - H5P](https://www.tudelft.nl/teaching-support/educational-tools/h5p) \ No newline at end of file +More information on H5p using the TU Delft provided hosting: [Teaching Support - Educational Tools - H5P](https://www.tudelft.nl/teaching-support/educational-tools/h5p) From d8463bf9d7d800299941263129132cf2306beb47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 07:23:50 +0000 Subject: [PATCH 098/347] Bump book/external/Sphinx-Image-Inverter from `573bb66` to `eb21e6a` Bumps [book/external/Sphinx-Image-Inverter](https://github.com/TeachBooks/Sphinx-Image-Inverter) from `573bb66` to `eb21e6a`. - [Release notes](https://github.com/TeachBooks/Sphinx-Image-Inverter/releases) - [Commits](https://github.com/TeachBooks/Sphinx-Image-Inverter/compare/573bb66332f682bdfe1d7936048780199e4a0e2d...eb21e6a80ed33f0102f9025b9ee983148370d753) --- updated-dependencies: - dependency-name: book/external/Sphinx-Image-Inverter dependency-version: eb21e6a80ed33f0102f9025b9ee983148370d753 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> --- book/external/Sphinx-Image-Inverter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-Image-Inverter b/book/external/Sphinx-Image-Inverter index 573bb66..eb21e6a 160000 --- a/book/external/Sphinx-Image-Inverter +++ b/book/external/Sphinx-Image-Inverter @@ -1 +1 @@ -Subproject commit 573bb66332f682bdfe1d7936048780199e4a0e2d +Subproject commit eb21e6a80ed33f0102f9025b9ee983148370d753 From 6b73abdde5ed0bf4591aff9a8b0be0445dbab7f3 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:28:56 +0200 Subject: [PATCH 099/347] Update _config.yml --- book/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_config.yml b/book/_config.yml index 8e790c7..b54b01d 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -1,5 +1,5 @@ title: TeachBooks Manual -author: TeachBooks Development Team and TeachBooks users, built with <a href="https://teachbooks.io/">TeachBooks</a> and <a href="https://jupyterbook.org/">Jupyter Book</a>, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer"">CC BY 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt=""></a> +author: TeachBooks Development Team and TeachBooks users, built with <a href="https://teachbooks.io/">TeachBooks</a>, <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer"">CC BY 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt=""></a> execute: execute_notebooks: 'off' From 11322915b73588ad8212ab747f21233169664239 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:31:13 +0200 Subject: [PATCH 100/347] Update intro.md --- book/intro.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/book/intro.md b/book/intro.md index a918590..efef43c 100644 --- a/book/intro.md +++ b/book/intro.md @@ -1,8 +1,8 @@ # TeachBooks Manual -This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on <a href="https://jupyterbook.org/"><img style="display:inline-block; height:1.5em; width:auto; transform:translate(0, -0.15em)" src="images/logo-wide.svg" alt="Jupyter book"></a>. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users. We hope you find this resource useful and refer back to it often. +This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on <a href="https://jupyterbook.org/"><img style="display:inline-block; height:1.5em; width:auto; transform:translate(0, -0.15em)" src="images/logo-wide.svg" alt="Jupyter book"></a>. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users with many additional features developed for education-purposes. We hope you find this resource useful and refer back to it often. -TeachBooks originated at Delft University of Technology in the Netherlands, and some of the material in this Manual reflects tools and resources specific to TU Delft. With the exception of a few tools for which we have educational licenses at Delft, everything in this Manual is open source. Despite this, we are happy to grow our community beyond Delft and welcome contributions from all users. +TeachBooks originated at Delft University of Technology in the Netherlands, and some of the material in this Manual reflects tools and resources specific to TU Delft. With the exception of a few tools for which we have educational licenses at Delft, everything in this Manual is open source. Despite this, we are happy to grow our open source community beyond Delft and welcome contributions from all users. For more information about TeachBooks, visit [https://teachbooks.io/](https://teachbooks.io/). Do not hesitate to reach out via email at [info@teachbooks.io](mailto:info@teachbooks.io) or contribute on GitHub via discussions, issues or pull requests. @@ -16,4 +16,4 @@ There are several "parts" to the manual: - The **Features** part describes a suite of tools that are useful for teachers, many of which are developed by TeachBooks contributors specifically for use in education. Many of these tools are illustrated in the **Examples**. - A few special tools are included in the **Editing Tools** that are useful when writing content. -See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. \ No newline at end of file +See the final chapters of this book (under **Miscellaneous**) for additional information about References, Credits, etc. From 37c4c5b88a3fe587cc0a84c408c5a1db07e2f9d1 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:34:47 +0200 Subject: [PATCH 101/347] Make distinction teachbooks and jupyter book etc more clear --- book/intro/book.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/book/intro/book.md b/book/intro/book.md index b8e7426..5d4c205 100644 --- a/book/intro/book.md +++ b/book/intro/book.md @@ -1,15 +1,15 @@ # What is a TeachBook? -Never seen a TeachBook before? Here's a small demo of our MUDE-book! +Never seen a TeachBook before? Here's a small demo of the MUDE-book! ```{video} https://www.youtube.com/embed/gbBsWo6em4c?si=ayKhISsx06LmGbDD ``` -So what are you looking at? It's a website generated with the [Jupyter Book package](https://jupyterbook.org/). Various extensions have been added to improve the student-experience, especially for technical topics! The actual website you're looking at now is a Jupyter Book. With TeachBooks we aim to make it easy to collaboratively use it, even if you've little experience with the software package which is part of it. +So what are you looking at? It's a website generated with the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) which in turn makes use of many other tools, of which [Jupyter Book package](https://jupyterbook.org/) and [Sphinx](https://www.sphinx-doc.org/) are the most prominent. Various extensions have been added to improve the student-experience, especially for technical topics! With TeachBooks we aim to make it easy to collaboratively use it, even if you've little experience with the software package which is part of it. ## Three Key Ingredients -To create a Jupyter Book, three key ingredients are needed: +To create a TeachBook, three key ingredients are needed: 1. A **configuration file** to define functionalities, `_config.yml` 2. A **table of contents** file to list which files should end up in the book, `_toc.yml`, as well as define its structure @@ -37,7 +37,7 @@ Note the arrangement of the 3 key book ingredients in a subdirectory called `boo `````{admonition} Text-based files? yml? What is that?! :class: tip, dropdown -Text-based files are digital files on your computer that you can open in a text editor and read directly. There are many file extensions used for text-based files, a few common ones related to Jupyter Book are: Markdown (`*.md`), Jupyter Notebooks (`*.ipynb`), and YAML (`*.yml`). +Text-based files are digital files on your computer that you can open in a text editor and read directly. There are many file extensions used for text-based files, a few common ones related to TeachBooks are: Markdown (`*.md`), Jupyter Notebooks (`*.ipynb`), and YAML (`*.yml`). YAML (or YML) is a text-based file format that is primarily used to store data. It is useful because it is easy for humans to read and write, and easy for machines to _parse_ and generate., which is why YAML is often used for configuration files. Here is an example of a YAML file...can you tell what information is being stored? @@ -63,7 +63,7 @@ You can see quite clearly that a number of files are listed, and that they are o ## How is a book made? -A book is made by by writing content in text-based files such as Markdown (`*.md`), Jupyter Notebooks (`*.ipynb`), etc. After that, software is used to "parse" these files and create the final book (e.g., Jupyter Book). Fortunately when getting started you don't need to worry about the software because TeachBooks has set up GitHub tools for you that take care of this process automatically! The process is illustrated in the diagram below. +A book is made by by writing content in text-based files such as Markdown (`*.md`), Jupyter Notebooks (`*.ipynb`), etc. After that, software is used to "parse" these files and create the final book (e.g., website). Fortunately when getting started you don't need to worry about the software because TeachBooks has set up GitHub tools for you that take care of this process automatically! The process is illustrated in the diagram below. ```{figure} figures/intro-book.svg --- @@ -75,13 +75,13 @@ The process of building a book with TeachBooks. When just getting started, Teach ```{admonition} Familiar with LaTeX? There are similarities! :class: dropdown -Have you ever used LaTeX? It turns out there are a lot of similarities with Jupyter Book. Here is a quick list: +Have you ever used LaTeX? It turns out there are a lot of similarities with TeachBooks. Here is a quick list: 1. Writing "source code" in text-based files (i.e., `*.tex` versus `*.md`, `*.ipynb`, etc) that is generally easy to read without the markup and uses special functions to format rich document objects (e.g., tables, figures, etc). -2. The "book" is created by using a piece of software that parses the source code and creates the final document (a `*.pdf` versus a `*.html` for Jupyter Book). +2. The "book" is created by using a piece of software that parses the source code and creates the final document (a `*.pdf` versus a `*.html` for TeachBooks). 3. Creating the document structure using a list of files that contain source code that automatically generates the Table of Contents and Index.. 4. Sometimes you can spend more time than you like troubleshooting "bugs" that turn out to be simple syntax errors. -If you've used LaTeX before, it will be relatively easy to learn to use a Jupyter Book. +If you've used LaTeX before, it will be relatively easy to learn to use a TeachBook. ``` ## Why are Git and GitHub Important? From bd12c6476d49a29b00081acc39b5d9d66e0baf40 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg <t.r.vanwoudenberg@tudelft.nl> Date: Thu, 1 May 2025 09:57:55 +0200 Subject: [PATCH 102/347] updated figure in intro book --- book/intro/book.md | 6 +- book/intro/figures/intro-book-2.svg | 1455 ++++++++++++++++++++++++++ book/intro/figures/intro-book-2.vsdx | Bin 0 -> 44550 bytes 3 files changed, 1457 insertions(+), 4 deletions(-) create mode 100644 book/intro/figures/intro-book-2.svg create mode 100644 book/intro/figures/intro-book-2.vsdx diff --git a/book/intro/book.md b/book/intro/book.md index b8e7426..0309632 100644 --- a/book/intro/book.md +++ b/book/intro/book.md @@ -65,10 +65,8 @@ You can see quite clearly that a number of files are listed, and that they are o A book is made by by writing content in text-based files such as Markdown (`*.md`), Jupyter Notebooks (`*.ipynb`), etc. After that, software is used to "parse" these files and create the final book (e.g., Jupyter Book). Fortunately when getting started you don't need to worry about the software because TeachBooks has set up GitHub tools for you that take care of this process automatically! The process is illustrated in the diagram below. -```{figure} figures/intro-book.svg ---- -width: 700px ---- +```{figure} figures/intro-book-2.svg + The process of building a book with TeachBooks. When just getting started, TeachBooks tools enables you to focus on what matters most: learning to write content for your book! ``` diff --git a/book/intro/figures/intro-book-2.svg b/book/intro/figures/intro-book-2.svg new file mode 100644 index 0000000..4e6a940 --- /dev/null +++ b/book/intro/figures/intro-book-2.svg @@ -0,0 +1,1455 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<!-- Gegenereerd door Microsoft Visio, SVG Export intro-book-2.svg Pagina-1 --> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" + xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11.034in" height="2.6061in" + viewBox="0 0 794.451 187.64" xml:space="preserve" color-interpolation-filters="sRGB" class="st10"> + <v:documentProperties v:langID="1043" v:metric="true" v:viewMarkup="false"/> + + <style type="text/css"> + <![CDATA[ + .st1 {fill:#85a5ff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st2 {fill:#ffffff;font-family:CoFo Sans Pixel Trial;font-size:4.99999em} + .st3 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st4 {fill:#000000;font-family:CoFo Sans Pixel Trial;font-size:1.16666em} + .st5 {font-size:1em} + .st6 {fill:#ffffff;font-family:Courier New;font-size:1em} + .st7 {fill:#dae5ff;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75} + .st8 {fill:#000000;stroke:none;stroke-linecap:butt;stroke-width:1.275} + .st9 {fill:#24292f;stroke:none;stroke-linecap:butt;stroke-width:0.75} + .st10 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3} + ]]> + </style> + + <g v:mID="0" v:index="1" v:groupContext="foregroundPage"> + <title>Pagina-1 + + + Blad.1 + 1 + + + + 1 + + Blad.3 + Source code (repository) *.md, *.ipynb + + + + Source code (repository)*.md, *.ipynb + + Blad.6 + + + + Blad.7 + + + + Blad.8 + + + + Blad.9 + + + + Blad.11 + 2 + + + + 2 + + Blad.12 + Markup Software Teachbooks, jupyter-book, sphinx, + + + + Markup SoftwareTeachbooks,jupyter-book, sphinx, + + Blad.13 + + + + Blad.14 + + + + Blad.15 + + + + Blad.16 + + + + Blad.18 + + + + Blad.28 + 3 + + + + 3 + + Blad.29 + Local website *.html + + + + Local website*.html + + Blad.30 + + + + Blad.31 + + + + Blad.32 + + + + Blad.33 + + + + Blad.34 + + + + Blad.38 + 4 + + + + 4 + + Blad.39 + Online book Webserver, GitHub pages + + + + Online bookWebserver, GitHub pages + + Blad.40 + + + + Blad.41 + + + + Blad.42 + + + + Blad.43 + + + + Blad.44 + + + + Blad.45 + + + + Blad.46 + + + + Blad.47 + + + + Blad.48 + + + + Blad.49 + TeachBooks tools and GitHub do the rest! + + + + TeachBooks tools and GitHub do the rest! + + Blad.52 + + + + Blad.53 + You edit text-based files + + + + You edit text-based files + + Blad.620 + + Blad.621 + + + + Blad.622 + + + + Blad.623 + + + + Blad.624 + + + + Blad.625 + + + + Blad.626 + + + + Blad.627 + + + + Blad.628 + + + + Blad.629 + + + + Blad.630 + + + + Blad.631 + + + + Blad.632 + + + + Blad.633 + + + + Blad.634 + + + + Blad.635 + + + + Blad.636 + + + + Blad.637 + + + + Blad.638 + + + + Blad.639 + + + + Blad.640 + + + + Blad.641 + + + + Blad.642 + + + + Blad.643 + + + + Blad.644 + + + + Blad.645 + + + + Blad.646 + + + + Blad.647 + + + + Blad.648 + + + + Blad.649 + + + + Blad.650 + + + + Blad.651 + + + + Blad.652 + + + + Blad.653 + + + + Blad.654 + + + + Blad.655 + + + + Blad.656 + + + + Blad.657 + + + + Blad.658 + + + + Blad.659 + + + + Blad.660 + + + + Blad.661 + + + + Blad.662 + + + + Blad.663 + + + + Blad.664 + + + + Blad.665 + + + + Blad.666 + + + + Blad.667 + + + + Blad.668 + + + + Blad.669 + + + + Blad.670 + + + + Blad.671 + + + + Blad.672 + + + + Blad.673 + + + + Blad.674 + + + + Blad.675 + + + + Blad.676 + + + + Blad.677 + + + + Blad.678 + + + + Blad.679 + + + + Blad.680 + + + + Blad.681 + + + + Blad.682 + + + + Blad.683 + + + + Blad.684 + + + + Blad.685 + + + + Blad.686 + + + + Blad.687 + + + + Blad.688 + + + + Blad.689 + + + + Blad.690 + + + + Blad.691 + + + + Blad.692 + + + + Blad.693 + + + + Blad.694 + + + + Blad.695 + + + + Blad.696 + + + + Blad.697 + + + + Blad.698 + + + + Blad.699 + + + + Blad.700 + + + + Blad.701 + + + + Blad.702 + + + + Blad.703 + + + + Blad.704 + + + + Blad.705 + + + + Blad.706 + + + + Blad.707 + + + + Blad.708 + + Blad.709 + + + + Blad.710 + + + + Blad.711 + + + + Blad.712 + + + + Blad.713 + + + + Blad.714 + + + + Blad.715 + + + + Blad.716 + + + + Blad.717 + + + + Blad.718 + + + + Blad.719 + + + + Blad.720 + + + + Blad.721 + + + + Blad.722 + + + + Blad.723 + + + + Blad.724 + + + + Blad.725 + + + + Blad.726 + + + + Blad.727 + + + + Blad.728 + + + + + Blad.729 + + + + Blad.730 + + + + Blad.731 + + + + Blad.732 + + + + Blad.733 + + + + Blad.734 + + + + Blad.735 + + + + Blad.736 + + + + Blad.737 + + + + Blad.738 + + + + Blad.739 + + + + Blad.740 + + + + Blad.741 + + + + Blad.742 + + + + Blad.743 + + + + Blad.744 + + + + Blad.745 + + + + Blad.746 + + + + Blad.747 + + + + Blad.748 + + + + Blad.749 + + + + Blad.750 + + + + Blad.751 + + + + Blad.752 + + + + Blad.753 + + + + Blad.754 + + + + Blad.755 + + + + Blad.756 + + + + Blad.757 + + + + Blad.758 + + + + Blad.759 + + + + Blad.760 + + + + Blad.761 + + + + Blad.762 + + + + Blad.763 + + + + Blad.764 + + + + Blad.765 + + + + Blad.766 + + + + Blad.767 + + + + Blad.768 + + + + Blad.769 + + + + Blad.770 + + + + Blad.771 + + + + Blad.772 + + + + Blad.773 + + + + Blad.774 + + + + Blad.775 + + + + Blad.776 + + + + Blad.777 + + + + Blad.778 + + + + Blad.779 + + + + Blad.780 + + + + Blad.781 + + + + Blad.782 + + + + Blad.783 + + + + Blad.784 + + + + Blad.785 + + + + Blad.786 + + + + Blad.787 + + + + Blad.788 + + + + Blad.789 + + + + Blad.790 + + + + Blad.791 + + + + Blad.792 + + + + Blad.793 + + + + Blad.794 + + + + Blad.795 + + + + Blad.796 + + + + Blad.797 + + + + Blad.798 + + + + Blad.799 + + + + Blad.800 + + + + Blad.801 + + + + Blad.802 + + + + Blad.803 + + + + Blad.804 + + + + Blad.805 + + + + Blad.806 + + + + + Blad.807 + + Blad.808 + + + + Blad.809 + + + + Blad.810 + + + + Blad.811 + + + + Blad.812 + + + + Blad.813 + + + + Blad.814 + + + + Blad.815 + + + + Blad.816 + + + + Blad.817 + + + + Blad.818 + + + + Blad.819 + + + + Blad.820 + + + + Blad.821 + + + + Blad.822 + + + + Blad.823 + + + + Blad.824 + + + + Blad.825 + + + + Blad.826 + + + + Blad.827 + + + + Blad.828 + + + + Blad.829 + + + + Blad.830 + + + + Blad.831 + + + + Blad.832 + + + + Blad.833 + + + + Blad.834 + + + + Blad.835 + + + + Blad.836 + + + + Blad.837 + + + + Blad.838 + + + + Blad.839 + + + + Blad.840 + + + + Blad.841 + + + + Blad.842 + + + + Blad.843 + + + + Blad.844 + + + + Blad.845 + + + + Blad.846 + + + + Blad.847 + + + + Blad.848 + + + + Blad.849 + + + + Blad.850 + + + + Blad.851 + + + + Blad.852 + + + + Blad.853 + + + + Blad.854 + + + + Blad.855 + + Blad.856 + + + + Blad.857 + + + + Blad.858 + + + + Blad.859 + + + + Blad.860 + + + + Blad.861 + + + + Blad.862 + + + + Blad.863 + + + + Blad.864 + + + + Blad.865 + + + + Blad.866 + + + + Blad.867 + + + + Blad.868 + + + + Blad.869 + + + + Blad.870 + + + + Blad.871 + + + + Blad.872 + + + + + Blad.873 + + + + Blad.874 + + + + Blad.875 + + + + Blad.876 + + + + Blad.877 + + + + Blad.878 + + + + Blad.879 + + + + Blad.880 + + + + Blad.881 + + + + Blad.882 + + + + Blad.883 + + + + Blad.884 + + Blad.885 + + + + Blad.886 + + + + Blad.887 + + + + Blad.888 + + + + Blad.889 + + + + + Blad.890 + + + + Blad.891 + + + + Blad.892 + + + + Blad.893 + + Blad.894 + + + + Blad.895 + + + + Blad.896 + + + + Blad.897 + + + + Blad.898 + + + + Blad.899 + + + + Blad.900 + + + + Blad.901 + + + + + Blad.902 + + + + Blad.903 + + + + Blad.904 + + + + Blad.905 + + + + Blad.906 + + + + Blad.907 + + + + Blad.908 + + + + Blad.909 + + + + Blad.910 + + + + Blad.911 + + + + Blad.912 + + + + Blad.913 + + + + Blad.914 + + + + Blad.915 + + + + Blad.916 + + + + Blad.917 + + + + Blad.918 + + + + Blad.919 + + + + Blad.920 + + + + Blad.921 + + + + Blad.922 + + + + Blad.923 + + + + Blad.924 + + + + Blad.925 + + + + Blad.926 + + + + Blad.927 + + + + Blad.928 + + + + + Blad.929 + + Blad.930 + + + + + diff --git a/book/intro/figures/intro-book-2.vsdx b/book/intro/figures/intro-book-2.vsdx new file mode 100644 index 0000000000000000000000000000000000000000..e9f160d1672f3f3a76f8c2a801d6b7455a06ffae GIT binary patch literal 44550 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

RcG- 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 PgwJGf>HaMGz4X5TO1ZLj literal 0 HcmV?d00001 From a9c6621ccb18698d8a02a4d87306342e0dd8abc7 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 1 May 2025 10:27:20 +0200 Subject: [PATCH 103/347] small t in logo --- book/intro/figures/intro-book-2.svg | 4 ++-- book/intro/figures/intro-book-2.vsdx | Bin 44550 -> 44516 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/book/intro/figures/intro-book-2.svg b/book/intro/figures/intro-book-2.svg index 4e6a940..ec895cf 100644 --- a/book/intro/figures/intro-book-2.svg +++ b/book/intro/figures/intro-book-2.svg @@ -65,12 +65,12 @@ 2 Blad.12 - Markup Software Teachbooks, jupyter-book, sphinx, + Markup Software teachbooks, jupyter-book, sphinx, Markup SoftwareTeachbooks,jupyterteachbooks,jupyter-book, sphinx, Blad.13 diff --git a/book/intro/figures/intro-book-2.vsdx b/book/intro/figures/intro-book-2.vsdx index e9f160d1672f3f3a76f8c2a801d6b7455a06ffae..087c81c6d0c6a492c90058703a3084677bcd07ef 100644 GIT binary patch delta 31982 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 delta 32012 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 Date: Thu, 1 May 2025 10:29:58 +0200 Subject: [PATCH 104/347] other colour --- book/intro/figures/intro-book-2.svg | 627 ++++++++++++++------------- book/intro/figures/intro-book-2.vsdx | Bin 44516 -> 44476 bytes 2 files changed, 314 insertions(+), 313 deletions(-) diff --git a/book/intro/figures/intro-book-2.svg b/book/intro/figures/intro-book-2.svg index ec895cf..bc35954 100644 --- a/book/intro/figures/intro-book-2.svg +++ b/book/intro/figures/intro-book-2.svg @@ -3,7 +3,7 @@ + viewBox="0 0 794.451 187.64" xml:space="preserve" color-interpolation-filters="sRGB" class="st11"> @@ -164,19 +165,19 @@ Blad.45 - + Blad.46 - + Blad.47 - + Blad.48 - + Blad.49 @@ -187,7 +188,7 @@ TeachBooks tools and GitHub do the rest! Blad.52 - + Blad.53 @@ -201,1222 +202,1222 @@ Blad.620 Blad.621 - + Blad.622 - + Blad.623 - + Blad.624 - + Blad.625 - + Blad.626 - + Blad.627 - + Blad.628 - + Blad.629 - + Blad.630 - + Blad.631 - + Blad.632 - + Blad.633 - + Blad.634 - + Blad.635 - + Blad.636 - + Blad.637 - + Blad.638 - + Blad.639 - + Blad.640 - + Blad.641 - + Blad.642 - + Blad.643 - + Blad.644 - + Blad.645 - + Blad.646 - + Blad.647 - + Blad.648 - + Blad.649 - + Blad.650 - + Blad.651 - + Blad.652 - + Blad.653 - + Blad.654 - + Blad.655 - + Blad.656 - + Blad.657 - + Blad.658 - + Blad.659 - + Blad.660 - + Blad.661 - + Blad.662 - + Blad.663 - + Blad.664 - + Blad.665 - + Blad.666 - + Blad.667 - + Blad.668 - + Blad.669 - + Blad.670 - + Blad.671 - + Blad.672 - + Blad.673 - + Blad.674 - + Blad.675 - + Blad.676 - + Blad.677 - + Blad.678 - + Blad.679 - + Blad.680 - + Blad.681 - + Blad.682 - + Blad.683 - + Blad.684 - + Blad.685 - + Blad.686 - + Blad.687 - + Blad.688 - + Blad.689 - + Blad.690 - + Blad.691 - + Blad.692 - + Blad.693 - + Blad.694 - + Blad.695 - + Blad.696 - + Blad.697 - + Blad.698 - + Blad.699 - + Blad.700 - + Blad.701 - + Blad.702 - + Blad.703 - + Blad.704 - + Blad.705 - + Blad.706 - + Blad.707 - + Blad.708 Blad.709 - + Blad.710 - + Blad.711 - + Blad.712 - + Blad.713 - + Blad.714 - + Blad.715 - + Blad.716 - + Blad.717 - + Blad.718 - + Blad.719 - + Blad.720 - + Blad.721 - + Blad.722 - + Blad.723 - + Blad.724 - + Blad.725 - + Blad.726 - + Blad.727 - + Blad.728 - + Blad.729 - + Blad.730 - + Blad.731 - + Blad.732 - + Blad.733 - + Blad.734 - + Blad.735 - + Blad.736 - + Blad.737 - + Blad.738 - + Blad.739 - + Blad.740 - + Blad.741 - + Blad.742 - + Blad.743 - + Blad.744 - + Blad.745 - + Blad.746 - + Blad.747 - + Blad.748 - + Blad.749 - + Blad.750 - + Blad.751 - + Blad.752 - + Blad.753 - + Blad.754 - + Blad.755 - + Blad.756 - + Blad.757 - + Blad.758 - + Blad.759 - + Blad.760 - + Blad.761 - + Blad.762 - + Blad.763 - + Blad.764 - + Blad.765 - + Blad.766 - + Blad.767 - + Blad.768 - + Blad.769 - + Blad.770 - + Blad.771 - + Blad.772 - + Blad.773 - + Blad.774 - + Blad.775 - + Blad.776 - + Blad.777 - + Blad.778 - + Blad.779 - + Blad.780 - + Blad.781 - + Blad.782 - + Blad.783 - + Blad.784 - + Blad.785 - + Blad.786 - + Blad.787 - + Blad.788 - + Blad.789 - + Blad.790 - + Blad.791 - + Blad.792 - + Blad.793 - + Blad.794 - + Blad.795 - + Blad.796 - + Blad.797 - + Blad.798 - + Blad.799 - + Blad.800 - + Blad.801 - + Blad.802 - + Blad.803 - + Blad.804 - + Blad.805 - + Blad.806 - + Blad.807 Blad.808 - + Blad.809 - + Blad.810 - + Blad.811 - + Blad.812 - + Blad.813 - + Blad.814 - + Blad.815 - + Blad.816 - + Blad.817 - + Blad.818 - + Blad.819 - + Blad.820 - + Blad.821 - + Blad.822 - + Blad.823 - + Blad.824 - + Blad.825 - + Blad.826 - + Blad.827 - + Blad.828 - + Blad.829 - + Blad.830 - + Blad.831 - + Blad.832 - + Blad.833 - + Blad.834 - + Blad.835 - + Blad.836 - + Blad.837 - + Blad.838 - + Blad.839 - + Blad.840 - + Blad.841 - + Blad.842 - + Blad.843 - + Blad.844 - + Blad.845 - + Blad.846 - + Blad.847 - + Blad.848 - + Blad.849 - + Blad.850 - + Blad.851 - + Blad.852 - + Blad.853 - + Blad.854 - + Blad.855 Blad.856 - + Blad.857 - + Blad.858 - + Blad.859 - + Blad.860 - + Blad.861 - + Blad.862 - + Blad.863 - + Blad.864 - + Blad.865 - + Blad.866 - + Blad.867 - + Blad.868 - + Blad.869 - + Blad.870 - + Blad.871 - + Blad.872 - + Blad.873 - + Blad.874 - + Blad.875 - + Blad.876 - + Blad.877 - + Blad.878 - + Blad.879 - + Blad.880 - + Blad.881 - + Blad.882 - + Blad.883 - + Blad.884 Blad.885 - + Blad.886 - + Blad.887 - + Blad.888 - + Blad.889 - + Blad.890 - + Blad.891 - + Blad.892 - + Blad.893 Blad.894 - + Blad.895 - + Blad.896 - + Blad.897 - + Blad.898 - + Blad.899 - + Blad.900 - + Blad.901 - + Blad.902 - + Blad.903 - + Blad.904 - + Blad.905 - + Blad.906 - + Blad.907 - + Blad.908 - + Blad.909 - + Blad.910 - + Blad.911 - + Blad.912 - + Blad.913 - + Blad.914 - + Blad.915 - + Blad.916 - + Blad.917 - + Blad.918 - + Blad.919 - + Blad.920 - + Blad.921 - + Blad.922 - + Blad.923 - + Blad.924 - + Blad.925 - + Blad.926 - + Blad.927 @@ -1428,11 +1429,11 @@ L6.87 187.64 L8.25 187.64 L8.25 186.26 L8.25 184.89 L8.25 183.52 L8.25 182.14 L8.25 180.77 L8.25 179.39 L8.25 178.02 L8.25 176.64 L8.25 175.27 L9.62 175.27 L9.62 173.89 L11 173.89 L11 172.52 L11.27 172.52 L12.37 172.52 L12.37 171.14 L12.37 169.77 L12.37 168.39 L12.37 167.02 L12.37 165.64 L11 165.64 Z" - class="st8"/> + class="st9"/> Blad.928 - + @@ -1448,7 +1449,7 @@ 36.13 150.77 36.13 150.77 C37.43 154.05 36.6 156.5 36.37 157.09 C37.9 158.75 38.8 160.88 38.8 163.49 C38.8 172.66 33.27 174.68 27.97 175.27 C28.83 176.02 29.58 177.44 29.58 179.7 C29.58 182.9 29.54 185.47 29.54 186.26 C29.54 186.89 29.97 187.64 31.15 187.4 C40.56 184.24 47.35 175.31 47.35 164.76 C47.39 151.56 - 36.76 140.89 23.69 140.89 Z" class="st9"/> + 36.76 140.89 23.69 140.89 Z" class="st10"/> diff --git a/book/intro/figures/intro-book-2.vsdx b/book/intro/figures/intro-book-2.vsdx index 087c81c6d0c6a492c90058703a3084677bcd07ef..d0deade432c423c819a4fc40aa2a193fb4134a2a 100644 GIT binary patch delta 39164 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 From a92bb1a578092ba9c97fe7bdd0df6fa329ea11fd Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 1 May 2025 10:32:10 +0200 Subject: [PATCH 105/347] add blend to demo --- book/intro/book.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/intro/book.md b/book/intro/book.md index 71444b5..d70bfb6 100644 --- a/book/intro/book.md +++ b/book/intro/book.md @@ -3,6 +3,7 @@ Never seen a TeachBook before? Here's a small demo of the MUDE-book! ```{video} https://www.youtube.com/embed/gbBsWo6em4c?si=ayKhISsx06LmGbDD +:class: blend ``` So what are you looking at? It's a website generated with the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) which in turn makes use of many other tools, of which [Jupyter Book package](https://jupyterbook.org/) and [Sphinx](https://www.sphinx-doc.org/) are the most prominent. Various extensions have been added to improve the student-experience, especially for technical topics! With TeachBooks we aim to make it easy to collaboratively use it, even if you've little experience with the software package which is part of it. From c0c5551c08fcf23cef2e076fa1ccdda38cbc7868 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 1 May 2025 15:17:24 +0200 Subject: [PATCH 106/347] Update draft-release.md --- book/features/draft-release.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 01d48a9..4a7915d 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -29,7 +29,7 @@ The workflow is enabled by a `teachbooks` CLI feature that identifies and remove For example, pages in a developed book (e.g., `draft` branch) can be manually stripped out of the table of contents when a merge request from `draft` to `release` is made. This prevents the page being included in the released book. Pages marked with this feature are still visible in the `draft` book. Lines tagged in the configuration file `_config.yml` can be used in exactly the same manner. The tag is applied as follows: -``` +```yaml format: jb-book root: intro @@ -38,9 +38,9 @@ parts: chapters: - file: ... ... -# START REMOVE-FROM-PUBLISH +# START REMOVE-FROM-RELEASE - file: files_to_remove -# END REMOVE-FROM-PUBLISH +# END REMOVE-FROM-RELEASE ``` There is no limit to the number of stripped sections, they can be sequential and indentation does not matter. @@ -48,9 +48,11 @@ There is no limit to the number of stripped sections, they can be sequential and To invoke the tag and remove content during the book build process, use the following optional argument when building the book with the `teachbooks` package: ``` -teachbooks build --publish book +teachbooks build --release book ``` +This is done in the [deploy-book-workflow](deploy-book-workflow) by including the branches for which preprocessing needs to be done the repository variable `BRANCHES_TO_PREPROCESS` which is by default set to ` ` (just a space = no branch). It should be a space-separated list of branch names, e.g. 'main second third'. + Note that `teachbooks build book` would build a book without stripping the tagged lines, just as `jupyter-book build book` would. This is called "draft mode" and is the default behavior. You can recognize it in the stdout after running the `build` command: ```bash From e48a170f8e408fb5c0dbdd3896af9c93813fefed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 13:20:05 +0000 Subject: [PATCH 107/347] Bump book/external/deploy-book-workflow from `427215f` to `d90524b` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `427215f` to `d90524b`. - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/427215f1ccc048847abd8cd86a1ba2e85c2dd549...d90524baa6d989dc2f49ee3d5d2ae1885fe679a9) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-version: d90524baa6d989dc2f49ee3d5d2ae1885fe679a9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 427215f..d90524b 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 427215f1ccc048847abd8cd86a1ba2e85c2dd549 +Subproject commit d90524baa6d989dc2f49ee3d5d2ae1885fe679a9 From 4f814bea7e3a0f372b318aba2aae8b836350d32e Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Fri, 2 May 2025 08:18:02 +0200 Subject: [PATCH 108/347] Force update --- book/_git/cloned_repos.txt | 2 + book/_toc_with_local_paths.yml | 130 ++++++++++++++++++ book/references.bib | 235 +++++++++++++++++---------------- 3 files changed, 250 insertions(+), 117 deletions(-) create mode 100644 book/_git/cloned_repos.txt create mode 100644 book/_toc_with_local_paths.yml diff --git a/book/_git/cloned_repos.txt b/book/_git/cloned_repos.txt new file mode 100644 index 0000000..1b24cb4 --- /dev/null +++ b/book/_git/cloned_repos.txt @@ -0,0 +1,2 @@ +C:\Users\douden\Documents\GitHub\manual\book\_git/github.com_TeachBooks_Sphinx-Indexed-Definitions/manual +C:\Users\douden\Documents\GitHub\manual\book\_git/github.com_TeachBooks_Sphinx-ref-graph/manual diff --git a/book/_toc_with_local_paths.yml b/book/_toc_with_local_paths.yml new file mode 100644 index 0000000..cdc4924 --- /dev/null +++ b/book/_toc_with_local_paths.yml @@ -0,0 +1,130 @@ +# ToC file with localized paths. Used for Teachbooks' external content feature. +format: jb-book +parts: +- caption: Your First TeachBook! + chapters: + - file: intro/book.md + - file: intro/workflow.md + - file: intro/template.md + - file: intro/next.md +- caption: Getting Going! + chapters: + - file: installation-and-setup/user_types.md + - file: installation-and-setup/git.md + sections: + - file: installation-and-setup/tools + - file: installation-and-setup/overview.md + sections: + - file: installation-and-setup/vscode-setup.md + - file: installation-and-setup/git-setup_local.md + - file: installation-and-setup/anaconda.md + - file: installation-and-setup/git_bash_conda_vs-code.md + - file: installation-and-setup/jupyter-book-setup.md + - file: workflows/collaboration.md + sections: + - file: workflows/milestones_issues.md + - file: workflows/branches.md + - file: workflows/edit_book.md + - file: workflows/check_changes_online.md + - file: workflows/merge_request.md + - file: installation-and-setup/collab + - file: installation-and-setup/versioning + sections: + - file: installation-and-setup/versions_URLs + - file: installation-and-setup/versioning_changelog + - file: installation-and-setup/publisher + - file: installation-and-setup/copyright.md + sections: + - file: installation-and-setup/copyright/considerations + - file: installation-and-setup/copyright/licenses + - file: installation-and-setup/copyright/recommendations +- caption: Features + chapters: + - file: features/overview.md + - file: basic-features/overview.md + sections: + - file: basic-features/jupyterbook.md + - file: basic-features/figures.md + - file: basic-features/equations.md + - file: basic-features/videos.md + - file: basic-features/References.md + - file: basic-features/code.md + - file: basic-features/Code_block_figures + - file: basic-features/badges.md + - file: basic-features/banner + title: Banner or Announcement + - file: features/easy-editing.md + sections: + - file: external/template/README.md + - file: features/draft-release + - file: external/deploy-book-workflow/README.md + - file: features/pull_request_build.md + - file: features/local_server + - file: features/external_toc + sections: + - file: external/Nested-Books/README.md + title: (Deprecated) Share content between books using submodules + - file: features/update_env + - file: features/versioning + - file: features/sphinx_extensions.md + sections: + - file: external/Download-Link-Replacer/README.md + - file: external/Sphinx-launch-buttons/README.md + - file: basic-features/utterances.md + - file: features/h5p.md + sections: + - file: examples/h5p_examples.md + - file: features/plotly.ipynb + - file: external/Sphinx-Grasple-public/README.md + - file: features/HTML_javascript.md + sections: + - file: features/adding_HTML_elements.md + - file: features/creating_basic_HTML_elements.md + - file: features/live_code + sections: + - file: features/widgets.ipynb + - file: features/exercise_checking.ipynb + - file: features/jupyterquiz.ipynb + - file: external/sphinx-iframes/README.md + - file: _git/github.com_TeachBooks_Sphinx-Indexed-Definitions/manual/README.md + - file: external/Sphinx-PRIME-applets/README.md + - file: features/visuals.md + sections: + - file: external/Sphinx-Image-Inverter/README.md + - file: external/JupyterBook-Patches/README.md + - file: external/Sphinx-TUDelft-theme/README.md + - file: external/teachbooks-sphinx-tippy/README.md + - file: features/apa + - file: external/Sphinx-Named-Colors/README.md + - file: _git/github.com_TeachBooks_Sphinx-ref-graph/manual/README.md + - file: features/students + sections: + - file: external/annotater/README.md + - file: basic-features/hypothesis.md +- caption: Examples + chapters: + - file: examples/overview.md + - file: examples/book_structure.md + - file: examples/live_code.md + - file: examples/example_gumbel.ipynb + - file: examples/theory_questions.md + - file: examples/example_quiz_interactive.ipynb + - file: examples/coding_theory_widgets.ipynb + - file: examples/parametric_questions.ipynb +- caption: Editing Tools + chapters: + - file: tools/figmaker + - file: helper_code/intro.md + sections: + - file: helper_code/converter.md + - file: helper_code/move_images.md + - file: external/Useful_python_code/snippit.ipynb + - file: external/Useful_python_code/extensionfildownloadreturn.ipynb + - file: external/Useful_python_code/figshrinker.ipynb +- caption: Miscallaneous + chapters: + - file: references.md + - file: credits + - file: changelog + - file: contact +root: intro diff --git a/book/references.bib b/book/references.bib index 7b3d706..61219ae 100644 --- a/book/references.bib +++ b/book/references.bib @@ -1,184 +1,185 @@ @misc{timon_latex, - title={LaTeX to Markdown conversion}, - author={Idema (Delft University of Technology), Timon}, - institution ={Delft University of Technology}, - url={https://gitlab.tudelft.nl/opentextbooks/latex-to-markdown-conversion}, - year={2024}, - note = {Retrieved December, 2024. BSD-3.} + title = {LaTeX to Markdown conversion}, + author = {Idema (Delft University of Technology), Timon}, + institution = {Delft University of Technology}, + url = {https://gitlab.tudelft.nl/opentextbooks/latex-to-markdown-conversion}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3.}, } @misc{hall21, - author = {Hall, Matt}, - title = {Which open licence should I choose?}, - institution = {Agile Scientific}, - url = {https://agilescientific.com/blog/2021/2/17/which-open-licence-should-i-choose}, - year = {2021}, - note = {Online; posted 17-February-2021. CC BY.} + author = {Hall, Matt}, + title = {Which open licence should I choose?}, + institution = {Agile Scientific}, + url = {https://agilescientific.com/blog/2021/2/17/which-open-licence-should-i-choose}, + year = {2021}, + note = {Online; posted 17-February-2021. CC BY.}, } @misc{jason_moore, - title={Learn Multibody Dynamics, SymPy}, - author={Moore, Jason}, - url={https://moorepants.github.io/learn-multibody-dynamics/sympy.html}, - year={2023} + title = {Learn Multibody Dynamics, SymPy}, + author = {Moore, Jason}, + url = {https://moorepants.github.io/learn-multibody-dynamics/sympy.html}, + year = {2023}, } @misc{tud_cip_24, - author = {{TU Delft Library}}, - title = {Copyright Information Point}, - url = {https://www.tudelft.nl/library/support/copyright}, - year = {2024}, - note = {Retrieved December, 2024. CC BY 4.0.} + author = {{TU Delft Library}}, + title = {Copyright Information Point}, + url = {https://www.tudelft.nl/library/support/copyright}, + year = {2024}, + note = {Retrieved December, 2024. CC BY 4.0.}, } @misc{deploy_book, - author = {{TeachBooks}}, - title = {GitHub reusable action: publish your book online to GitHub Pages}, - url = {https://github.com/TeachBooks/deploy-book-workflow}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {GitHub reusable action: publish your book online to GitHub Pages}, + url = {https://github.com/TeachBooks/deploy-book-workflow}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{download_link, - author = {{TeachBooks}}, - title = {Sphinx extension: download link replacer}, - url = {https://github.com/TeachBooks/Download-Link-Replacer}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Sphinx extension: download link replacer}, + url = {https://github.com/TeachBooks/Download-Link-Replacer}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{patches, - author = {{TeachBooks}}, - title = {Sphinx extension: JupyterBook-Patches}, - url = {https://github.com/TeachBooks/JupyterBook-Patches}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Sphinx extension: JupyterBook-Patches}, + url = {https://github.com/TeachBooks/JupyterBook-Patches}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{annotator, - author = {{TeachBooks}}, - title = {Local Annotator Extension}, - url = {https://github.com/TeachBooks/annotator}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Local Annotator Extension}, + url = {https://github.com/TeachBooks/annotator}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{nested, - author = {{TeachBooks}}, - title = {Git workflow: Share content between book}, - url = {https://github.com/TeachBooks/Nested-Books}, - year = {2024}, - note = {Retrieved December, 2024. CC BY 4.0.} + author = {{TeachBooks}}, + title = {Git workflow: Share content between book}, + url = {https://github.com/TeachBooks/Nested-Books}, + year = {2024}, + note = {Retrieved December, 2024. CC BY 4.0.}, } @misc{grasple, - author = {{TeachBooks}}, - title = {Sphinx extension: Grasple}, - url = {https://github.com/TeachBooks/Sphinx-Grasple-public}, - year = {2024}, - note = {Retrieved December, 2024. MIT.} + author = {{TeachBooks}}, + title = {Sphinx extension: Grasple}, + url = {https://github.com/TeachBooks/Sphinx-Grasple-public}, + year = {2024}, + note = {Retrieved December, 2024. MIT.}, } @misc{image, - author = {{TeachBooks}}, - title = {Sphinx extension: Image Inverter}, - url = {https://github.com/TeachBooks/Sphinx-Image-Inverter}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Sphinx extension: Image Inverter}, + url = {https://github.com/TeachBooks/Sphinx-Image-Inverter}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{tudelft_theme, - author = {{TeachBooks}}, - title = {Sphinx extension: TU Delft theme}, - url = {https://github.com/TeachBooks/Sphinx-TUDelft-theme}, - year = {2024}, - note = {Retrieved December, 2024. MIT.} + author = {{TeachBooks}}, + title = {Sphinx extension: TU Delft theme}, + url = {https://github.com/TeachBooks/Sphinx-TUDelft-theme}, + year = {2024}, + note = {Retrieved December, 2024. MIT.}, } @misc{tippy, - author = {{TeachBooks}}, - title = {TeachBooks Sphinx extension: Rich hover over tips}, - url = {https://github.com/TeachBooks/teachbooks-sphinx-tippy}, - year = {2024}, - note = {Retrieved December, 2024. MIT.} + author = {{TeachBooks}}, + title = {TeachBooks Sphinx extension: Rich hover over tips}, + url = {https://github.com/TeachBooks/teachbooks-sphinx-tippy}, + year = {2024}, + note = {Retrieved December, 2024. MIT.}, } @misc{template, - author = {{TeachBooks}}, - title = {Your first TeachBook using the GitHub template}, - url = {https://github.com/TeachBooks/template}, - year = {2024}, - note = {Retrieved December, 2024. CC BY 4.0.} + author = {{TeachBooks}}, + title = {Your first TeachBook using the GitHub template}, + url = {https://github.com/TeachBooks/template}, + year = {2024}, + note = {Retrieved December, 2024. CC BY 4.0.}, } @misc{useful_code, - author = {{TeachBooks}}, - title = {Useful python code}, - url = {https://github.com/TeachBooks/Useful_python_code}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Useful python code}, + url = {https://github.com/TeachBooks/Useful_python_code}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{launch_buttons, - author = {{TeachBooks}}, - title = {Custom launch buttons}, - url = {https://github.com/TeachBooks/Sphinx-launch-buttons}, - year = {2024}, - note = {Retrieved December, 2024. BSD-3-Clause.} + author = {{TeachBooks}}, + title = {Custom launch buttons}, + url = {https://github.com/TeachBooks/Sphinx-launch-buttons}, + year = {2024}, + note = {Retrieved December, 2024. BSD-3-Clause.}, } @misc{sphinx-colors, - author = {{TeachBooks}}, - title = {Sphinx Named Colors}, - url = {https://github.com/TeachBooks/Sphinx-Named-Colors}, - year = {2024}, - note = {Retrieved January 2025. MIT.} + author = {{TeachBooks}}, + title = {Sphinx Named Colors}, + url = {https://github.com/TeachBooks/Sphinx-Named-Colors}, + year = {2024}, + note = {Retrieved January 2025. MIT.}, } @misc{semver, - author = {Tom Preston-Werner}, - title = {Semantic Versioning specification}, - url = {https://semver.org/}, - year = {2025}, - note = {Retrieved February 2025. CC BY 3.0.} + author = {Tom Preston-Werner}, + title = {Semantic Versioning specification}, + url = {https://semver.org/}, + year = {2025}, + note = {Retrieved February 2025. CC BY 3.0.}, } @misc{sphinx-iframes, - author = {{TeachBooks}}, - title = {Sphinx iframes}, - url = {https://github.com/TeachBooks/sphinx-iframes}, - year = {2025}, - note = {Retrieved April 2025. MIT.} + author = {{TeachBooks}}, + title = {Sphinx iframes}, + url = {https://github.com/TeachBooks/sphinx-iframes}, + year = {2025}, + note = {Retrieved April 2025. MIT.}, } @misc{sphinx-prime-applets, - author = {{TeachBooks}}, - title = {Sphinx PRIME applets}, - url = {https://github.com/TeachBooks/Sphinx-PRIME-applets}, - year = {2025}, - note = {Retrieved April 2025. MIT.} + author = {{TeachBooks}}, + title = {Sphinx PRIME applets}, + url = {https://github.com/TeachBooks/Sphinx-PRIME-applets}, + year = {2025}, + note = {Retrieved April 2025. MIT.}, } @misc{teachbooks_package, - author = {{TeachBooks}}, - title = {TeachBooks Package: Jupyter Book Wrapper}, - url = {https://github.com/TeachBooks/TeachBooks}, - year = {2024}, - note = {Retrieved April, 2025. MIT License.} + author = {{TeachBooks}}, + title = {TeachBooks Package: Jupyter Book Wrapper}, + url = {https://github.com/TeachBooks/TeachBooks}, + year = {2024}, + note = {Retrieved April, 2025. MIT License.}, } @misc{sphinx-indexed-definitions, - author = {{TeachBooks}}, - title = {Sphinx Indexed Definitions}, - url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, - year = {2025}, - note = {Retrieved April, 2025. MIT License.} + author = {{TeachBooks}}, + title = {Sphinx Indexed Definitions}, + url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, + year = {2025}, + note = {Retrieved April, 2025. MIT License.}, } @misc{sphinx-interactive-graph, - author = {{TeachBooks}}, - title = {Sphinx Indexed Definitions}, - url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, - year = {2025}, - note = {Retrieved April, 2025. MIT License.} -} \ No newline at end of file + author = {{TeachBooks}}, + title = {Sphinx Indexed Definitions}, + url = {https://github.com/TeachBooks/Sphinx-Indexed-Definitions}, + year = {2025}, + note = {Retrieved April, 2025. MIT License.}, +} + From 72e394a10401db84f725104f806b10184c594a61 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Fri, 2 May 2025 08:25:11 +0200 Subject: [PATCH 109/347] Oops --- book/_git/cloned_repos.txt | 2 - book/_toc_with_local_paths.yml | 130 --------------------------------- 2 files changed, 132 deletions(-) delete mode 100644 book/_git/cloned_repos.txt delete mode 100644 book/_toc_with_local_paths.yml diff --git a/book/_git/cloned_repos.txt b/book/_git/cloned_repos.txt deleted file mode 100644 index 1b24cb4..0000000 --- a/book/_git/cloned_repos.txt +++ /dev/null @@ -1,2 +0,0 @@ -C:\Users\douden\Documents\GitHub\manual\book\_git/github.com_TeachBooks_Sphinx-Indexed-Definitions/manual -C:\Users\douden\Documents\GitHub\manual\book\_git/github.com_TeachBooks_Sphinx-ref-graph/manual diff --git a/book/_toc_with_local_paths.yml b/book/_toc_with_local_paths.yml deleted file mode 100644 index cdc4924..0000000 --- a/book/_toc_with_local_paths.yml +++ /dev/null @@ -1,130 +0,0 @@ -# ToC file with localized paths. Used for Teachbooks' external content feature. -format: jb-book -parts: -- caption: Your First TeachBook! - chapters: - - file: intro/book.md - - file: intro/workflow.md - - file: intro/template.md - - file: intro/next.md -- caption: Getting Going! - chapters: - - file: installation-and-setup/user_types.md - - file: installation-and-setup/git.md - sections: - - file: installation-and-setup/tools - - file: installation-and-setup/overview.md - sections: - - file: installation-and-setup/vscode-setup.md - - file: installation-and-setup/git-setup_local.md - - file: installation-and-setup/anaconda.md - - file: installation-and-setup/git_bash_conda_vs-code.md - - file: installation-and-setup/jupyter-book-setup.md - - file: workflows/collaboration.md - sections: - - file: workflows/milestones_issues.md - - file: workflows/branches.md - - file: workflows/edit_book.md - - file: workflows/check_changes_online.md - - file: workflows/merge_request.md - - file: installation-and-setup/collab - - file: installation-and-setup/versioning - sections: - - file: installation-and-setup/versions_URLs - - file: installation-and-setup/versioning_changelog - - file: installation-and-setup/publisher - - file: installation-and-setup/copyright.md - sections: - - file: installation-and-setup/copyright/considerations - - file: installation-and-setup/copyright/licenses - - file: installation-and-setup/copyright/recommendations -- caption: Features - chapters: - - file: features/overview.md - - file: basic-features/overview.md - sections: - - file: basic-features/jupyterbook.md - - file: basic-features/figures.md - - file: basic-features/equations.md - - file: basic-features/videos.md - - file: basic-features/References.md - - file: basic-features/code.md - - file: basic-features/Code_block_figures - - file: basic-features/badges.md - - file: basic-features/banner - title: Banner or Announcement - - file: features/easy-editing.md - sections: - - file: external/template/README.md - - file: features/draft-release - - file: external/deploy-book-workflow/README.md - - file: features/pull_request_build.md - - file: features/local_server - - file: features/external_toc - sections: - - file: external/Nested-Books/README.md - title: (Deprecated) Share content between books using submodules - - file: features/update_env - - file: features/versioning - - file: features/sphinx_extensions.md - sections: - - file: external/Download-Link-Replacer/README.md - - file: external/Sphinx-launch-buttons/README.md - - file: basic-features/utterances.md - - file: features/h5p.md - sections: - - file: examples/h5p_examples.md - - file: features/plotly.ipynb - - file: external/Sphinx-Grasple-public/README.md - - file: features/HTML_javascript.md - sections: - - file: features/adding_HTML_elements.md - - file: features/creating_basic_HTML_elements.md - - file: features/live_code - sections: - - file: features/widgets.ipynb - - file: features/exercise_checking.ipynb - - file: features/jupyterquiz.ipynb - - file: external/sphinx-iframes/README.md - - file: _git/github.com_TeachBooks_Sphinx-Indexed-Definitions/manual/README.md - - file: external/Sphinx-PRIME-applets/README.md - - file: features/visuals.md - sections: - - file: external/Sphinx-Image-Inverter/README.md - - file: external/JupyterBook-Patches/README.md - - file: external/Sphinx-TUDelft-theme/README.md - - file: external/teachbooks-sphinx-tippy/README.md - - file: features/apa - - file: external/Sphinx-Named-Colors/README.md - - file: _git/github.com_TeachBooks_Sphinx-ref-graph/manual/README.md - - file: features/students - sections: - - file: external/annotater/README.md - - file: basic-features/hypothesis.md -- caption: Examples - chapters: - - file: examples/overview.md - - file: examples/book_structure.md - - file: examples/live_code.md - - file: examples/example_gumbel.ipynb - - file: examples/theory_questions.md - - file: examples/example_quiz_interactive.ipynb - - file: examples/coding_theory_widgets.ipynb - - file: examples/parametric_questions.ipynb -- caption: Editing Tools - chapters: - - file: tools/figmaker - - file: helper_code/intro.md - sections: - - file: helper_code/converter.md - - file: helper_code/move_images.md - - file: external/Useful_python_code/snippit.ipynb - - file: external/Useful_python_code/extensionfildownloadreturn.ipynb - - file: external/Useful_python_code/figshrinker.ipynb -- caption: Miscallaneous - chapters: - - file: references.md - - file: credits - - file: changelog - - file: contact -root: intro From f15a92e7e337dd7d917a1097dd7b01c09854af26 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 2 May 2025 09:01:42 +0200 Subject: [PATCH 110/347] Update .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1d59fdc..bb960ab 100644 --- a/.gitignore +++ b/.gitignore @@ -137,4 +137,6 @@ _output/ book/.jupyterlite.doit.db # TeachBooks -**.teachbooks/ \ No newline at end of file +**.teachbooks/ +book/_toc_with_local_paths.yml +book/_git/ \ No newline at end of file From c16b2afa29ab1cca4a6f18cbab35aa12976747ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 08:23:57 +0000 Subject: [PATCH 111/347] Bump book/external/JupyterBook-Patches from `8346c8c` to `22cba56` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `8346c8c` to `22cba56`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/8346c8c3c8be3d221a62a2f18c4ee1d4570ee003...22cba56474f18574fbeecdf996e0d4028ce24608) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-version: 22cba56474f18574fbeecdf996e0d4028ce24608 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 8346c8c..22cba56 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 8346c8c3c8be3d221a62a2f18c4ee1d4570ee003 +Subproject commit 22cba56474f18574fbeecdf996e0d4028ce24608 From 507c38a425f9515458b7fed3b79ffa4aedd7cf69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 08:24:13 +0000 Subject: [PATCH 112/347] Bump jupyterbook-patches from 1.4.4 to 1.5.0 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.4.4 to 1.5.0. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.4.4...v1.5.0) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-version: 1.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 30d3abd..e051ce7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.0 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches==1.4.4 +jupyterbook_patches==1.5.0 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From 4f9e428c62199603f720d77dcc5ff967e828b81e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 2 May 2025 11:02:56 +0200 Subject: [PATCH 113/347] Update publisher.md --- book/installation-and-setup/publisher.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/installation-and-setup/publisher.md b/book/installation-and-setup/publisher.md index 236715f..efa15af 100644 --- a/book/installation-and-setup/publisher.md +++ b/book/installation-and-setup/publisher.md @@ -1,6 +1,6 @@ # Publishing your book with a publisher -You can choose to publish your online book with a publisher. This could increase findability of your book, but may have consequenses on the ease of editing, choice of platforms, versioning restrictions, and copyright and licensing considerations. +You can choose to publish your online book with a publisher. Publishers might have access to databases to place your book in, increasing findability of your book. Futhermore, you can benefit from the publisher's brand. However, it may have consequenses on the ease of editing, choice of platforms, versioning restrictions, and copyright and licensing considerations. For TU Delft employees, you can decide to publish via TU Delft OPEN interactive textbooks. Publishing will give you a copyright check, ISBN or DOI number, and registration in several shared databases but limits the amount of changes you can make to your book: for substantial changes a new published version is needed with an updated copyright checks. Small changes like typos can always be made, which are processed in the published version every hour. In case of editing a book for a course during that actual course and/or your book has limited value outside your course's content, we advise you only to publish an archived version of your book whenever the academic year is over. From c9a8aee6c8a9e58bf8131b8bc4f4421a71711dda Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 2 May 2025 11:08:00 +0200 Subject: [PATCH 114/347] remove warning --- book/installation-and-setup/copyright/considerations.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/book/installation-and-setup/copyright/considerations.md b/book/installation-and-setup/copyright/considerations.md index 4180108..ea24246 100644 --- a/book/installation-and-setup/copyright/considerations.md +++ b/book/installation-and-setup/copyright/considerations.md @@ -66,12 +66,6 @@ The use of open licenses actually does not prohibit the author from using the ma **Still don't agree?** Sorry. Please take this up with your nearest library or copyright expert and let us know if you get a different response! In the meantime, we will simply list ourselves as authors, use CC BY licenses and remember that TU Delft holds the copyright for our work produced as teachers. -```{warning} -The TeachBooks Team isn't sure where code and data lie here. Since TeachBooks is oriented towards education, we assume that TU Delft also owns the copyright for this. - -Do you have a better answer? Let us know! -``` - ## Licensing This dictates how others may or may not be able to share or (re)use your work. It is (fortunately) becoming more common to include licenses with educational material (including books), which makes it much easier to understand how specific material can be used. Note that _in the absence of a license, you must assume that nothing can be reused!_ In this case you have to ask permission to the copyright holder, which can be a time-consuming process. License considerations are described in more detail in the following pages. @@ -90,4 +84,4 @@ There are many legal aspects to consider when creating an online book. Hopefully 2. Clearly **indicate where and how you have used the work of others** in your book (i.e., within the _content_ of your book). 3. **Summarize all sources** used in your book, as well as what may or may not be included under the license which you have chosen. -The following pages illustrate how to do this. It turns out to be not only a clear set of instructions for (re)users of your content, but also to help you remember what you have used in your book and where to find it later if changes are needed. \ No newline at end of file +The following pages illustrate how to do this. It turns out to be not only a clear set of instructions for (re)users of your content, but also to help you remember what you have used in your book and where to find it later if changes are needed. From 04e44069d11ba9dd114bf26c67c9733088249ed9 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 2 May 2025 11:46:53 +0200 Subject: [PATCH 115/347] BUMP --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e051ce7..7b3f2ad 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.0 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches==1.5.0 +jupyterbook_patches == 1.5.0 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From 93ddfc1491c31087c1d7599886146e50dae14b19 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 2 May 2025 14:26:29 +0200 Subject: [PATCH 116/347] Update external_toc.md --- book/features/external_toc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/external_toc.md b/book/features/external_toc.md index b814e24..d8aaec5 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -114,7 +114,7 @@ div.attribution > .admonition-title::after { ``` Note that, when making a changes for the configuration locally they are not incorporated to existing external content. -You will need to remove the `_git/` folder and re-run the build command to see the changes. When building the book on i.e. GitHub Actions, the `_git/` folder is always rebuild from scratch. +You will need to remove the `_git/` folder or run `teachbooks clean --external` and re-run the build command to see the changes. When building the book on i.e. GitHub Actions, the `_git/` folder is always rebuild from scratch. ## Contribute From 709aeda6b860693f3553db73ac6c61e21aa007eb Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 3 May 2025 09:01:22 +0200 Subject: [PATCH 117/347] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7b3f2ad..b9c80e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -teachbooks == 0.2.0 +teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.5.0 download_link_replacer == 1.0.4 From 805d624f19317f2a5d620f775b626e224b7f8323 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 3 May 2025 09:02:02 +0200 Subject: [PATCH 118/347] Update _config.yml --- book/_config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/book/_config.yml b/book/_config.yml index b54b01d..e3c2dfc 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -56,6 +56,9 @@ sphinx: apastyle: _ext/ bracket_citation_style: _ext/ +teachbooks: + attribution_location: margin + attribution_color: attributiongrey bibtex_bibfiles: - references.bib From ce9e1cf2af96b84fff7fe084cc458a1b2fedd5e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 06:36:00 +0000 Subject: [PATCH 119/347] Bump book/external/JupyterBook-Patches from `22cba56` to `91dbbcb` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `22cba56` to `91dbbcb`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/22cba56474f18574fbeecdf996e0d4028ce24608...91dbbcbc5bbf8387bc1ad4ed3b4d06479ff6c1e9) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-version: 91dbbcbc5bbf8387bc1ad4ed3b4d06479ff6c1e9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 22cba56..91dbbcb 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 22cba56474f18574fbeecdf996e0d4028ce24608 +Subproject commit 91dbbcbc5bbf8387bc1ad4ed3b4d06479ff6c1e9 From ec7744a556f58d7a2b6abb486f5982cefe749a4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 May 2025 06:36:18 +0000 Subject: [PATCH 120/347] Bump jupyterbook-patches from 1.5.0 to 1.6.0 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.5.0 to 1.6.0. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.5.0...v1.6.0) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-version: 1.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index b9c80e4..4eeabc1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches == 1.5.0 +jupyterbook_patches == 1.6.0 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From 51f2d62ee58535e2f07b6ebcd3215f34ae2dfae9 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 9 May 2025 11:28:41 +0200 Subject: [PATCH 121/347] Update _toc.yml --- book/_toc.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/_toc.yml b/book/_toc.yml index daee2b3..33f8eff 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -87,7 +87,7 @@ parts: - file: features/exercise_checking.ipynb - file: features/jupyterquiz.ipynb - file: external/sphinx-iframes/README.md - - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md + - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md #BUMP - file: external/Sphinx-PRIME-applets/README.md - file: features/visuals.md sections: @@ -97,7 +97,7 @@ parts: - file: external/teachbooks-sphinx-tippy/README.md - file: features/apa - file: external/Sphinx-Named-Colors/README.md - - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md + - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md #BUMP - file: features/students sections: - file: external/annotater/README.md From 6ced994619ea0fbde4a0baf010ae8ff3e4f3c5ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 May 2025 22:03:58 +0000 Subject: [PATCH 122/347] Bump jupyterbook-patches from 1.6.0 to 1.6.1 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.6.0 to 1.6.1. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.6.0...v1.6.1) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-version: 1.6.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4eeabc1..3fc3002 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches == 1.6.0 +jupyterbook_patches == 1.6.1 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From bcba8bd07cfa1783d9cb10bb55d15fc0aa3e9125 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 14 May 2025 09:39:36 +0200 Subject: [PATCH 123/347] formatting fix --- book/basic-features/figures.md | 104 ++++++++++++++++----------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/book/basic-features/figures.md b/book/basic-features/figures.md index 8fcf942..97d82ee 100644 --- a/book/basic-features/figures.md +++ b/book/basic-features/figures.md @@ -2,29 +2,29 @@ To add a figure, just copy the figure to the correct directory. Then, in your markdown file, include the figure as follows: -```` - ```{figure} .png/.jpg - --- - height/width: - name: - align: left / center / right - figclass: left blank or "margin" - --- -

- ``` +````md +```{figure} .png/.jpg +--- +height/width: +name: +align: left / center / right +figclass: left blank or "margin" +--- +
+``` ```` For example: -```` - ```{figure} ../images/TUDelft_logo_rgb.png - --- - width: 70% - name: demoexample1 - align: center - --- - example 1: width (70%) as percentage, align center - ``` +````md +```{figure} ../images/TUDelft_logo_rgb.png +--- +width: 70% +name: demoexample1 +align: center +--- +example 1: width (70%) as percentage, align center +``` ```` provides this output, which looks nice. @@ -43,15 +43,15 @@ You can find more documentation on including figures [here](https://jupyterbook. There are many settings, for instance aligning right: -```` - ```{figure} ../images/TUDelft_logo_rgb.png - --- - width: 50% - name: demoexample2 - align: right - --- - example 2: width (50%) as percentage, align right - ``` +````md +```{figure} ../images/TUDelft_logo_rgb.png +--- +width: 50% +name: demoexample2 +align: right +--- +example 2: width (50%) as percentage, align right +``` ```` with the result: @@ -67,22 +67,22 @@ example 2: width (50%) as percentage, align right Aligning right can come with the potential downside (not always wanted) that text is wrapped around the figure. To avoid this one can use `
` elements, both before and after the text (make sure to leave an empty line after the `
`!): -```` -
- and the output -
-
+````html +
+and the output +
+
- ```{figure} ../images/TUDelft_logo_rgb.png - --- - width: 50% - name: demoexample3 - align: right - --- - example 3: width (50%) as percentage, align right with additional div style - ``` +```{figure} ../images/TUDelft_logo_rgb.png +--- +width: 50% +name: demoexample3 +align: right +--- +example 3: width (50%) as percentage, align right with additional div style +``` -
+
````
@@ -108,16 +108,16 @@ including `figclass: margin` sets the figure to the column at the right.
-```` - ```{figure} demo97/demo97_figure1.jpg - --- - figclass: margin - width: 50% - name: demoexample2 - - --- - example 2:including figclass: margin - ``` +````md +```{figure} demo97/demo97_figure1.jpg +--- +figclass: margin +width: 50% +name: demoexample2 + +--- +example 2:including figclass: margin +``` ````
From 10543a9eef4895c8782e0ba2c43bf3d6ceafb69c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 22:28:01 +0000 Subject: [PATCH 124/347] Bump jupyterbook-patches from 1.6.1 to 1.6.2 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.6.1 to 1.6.2. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.6.1...v1.6.2) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-version: 1.6.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3fc3002..1e6c468 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches == 1.6.1 +jupyterbook_patches == 1.6.2 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.0.5 sphinx-image-inverter == 1.1.2 From f2daa9cc2ce4d20764754fb3e0c82a825829c19c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jun 2025 22:42:43 +0000 Subject: [PATCH 125/347] Bump teachbooks-sphinx-grasple from 1.0.5 to 1.1.1 Bumps [teachbooks-sphinx-grasple](https://github.com/TeachBooks/Sphinx-Grasple-public) from 1.0.5 to 1.1.1. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Changelog](https://github.com/TeachBooks/Sphinx-Grasple-public/blob/main/CHANGELOG.md) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/v1.0.5...v1.1.1) --- updated-dependencies: - dependency-name: teachbooks-sphinx-grasple dependency-version: 1.1.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 3fc3002..bd166f1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.6.1 download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.0.5 +teachbooks-sphinx-grasple == 1.1.1 sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 From 3fff6511f82cd1aed05b99e1eb2b60be23a0f4cb Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 9 Jun 2025 11:22:00 +0200 Subject: [PATCH 126/347] Update tools.md --- book/installation-and-setup/tools.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/book/installation-and-setup/tools.md b/book/installation-and-setup/tools.md index 105947d..ecb32c9 100644 --- a/book/installation-and-setup/tools.md +++ b/book/installation-and-setup/tools.md @@ -11,6 +11,11 @@ The setup of tools and URLs is dependent on agreements you've made on [collabora Choosing between GitHub and GitLab depends on multiple criteria. GitHub provides more functionalities, but you might prefer the TU Delft-closed GitLab system if you're a TU Delft employee. +## Account +GitHub is owned by Microsoft and anyone can make an account. This allows anyone to interact with the source code of your book by posting issues, forking (duplicating while allowing to sync) your book and suggesting changes with pull requests. + +For the TU-Delft closed GitLab system only TU Delft account holders can interact with the source code your book, making it not as open as GitHub: collaboration and reuse is inly pissible with manual exports of the source code. Individual external accounts can be requested for. + ## Book URL Github allows you to host your book on the GitHub server using GitHub pages (to be recognized by the `.github.io/` url, for example the [template book](https://teachbooks.github.io/template/)), which takes all the steps of hosting out of your hands. Next to GitHub-provided URLs, you can set up a custom owned URL, although this requires some additional skills on a domain which you should own. @@ -54,6 +59,7 @@ GitHub has a nice integration with the [GitHub Desktop application](git-setup_lo Here's a table summarizing the information: | | GitHub | TU Delft GitLab | |--|----------|-------------| +| Account | Free GitHub account (owned by Microsoft) 🤝 | Closed, TU Delft account 🔒 | | Book url | GitHub pages (`.github.io/`), for TU Delft books a custom URL (`oit.tudelft.nl/`), for private books on TU Delft GitHub Enterprise with SSO a random URL (`.github.io/`), or custom url `./`> 🌐 | TU Delft OIT (`interactivetextbooks.tudelft.nl/`) 🎓 | | Real-time book editing | Automated and flexible (multiple version of the book, building error insights, fast, custom urls) 🚀 | Automated but simplistic (not easily adaptable, no caching environments, no visual summaries, no parallel processes) 🛵 For TU Delft OIT: restricted adaptations because of copyright checks 🚫 | | Setting up book website | Immediate and automated with [template](../external/template/README.md) ⚡️ | Manual setup on personal webserver, or access required by TeachBooks or TU Delft OIT 🚧 | From 284be0871849000febf85267ef5c49f8e4bc92f0 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 12 Jun 2025 12:30:20 +0200 Subject: [PATCH 127/347] Typo Fixes #174 from @xtinamark --- book/_toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_toc.yml b/book/_toc.yml index 33f8eff..a97c215 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -125,7 +125,7 @@ parts: - file: external/Useful_python_code/extensionfildownloadreturn.ipynb - file: external/Useful_python_code/figshrinker.ipynb - - caption: Miscallaneous + - caption: Miscellaneous chapters: - file: references.md - file: credits From 24cf56a74ab807c359d6d46dad2bb201b7d60745 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 12 Jun 2025 15:11:45 +0200 Subject: [PATCH 128/347] Update tools.md --- book/installation-and-setup/tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/installation-and-setup/tools.md b/book/installation-and-setup/tools.md index ecb32c9..ff81171 100644 --- a/book/installation-and-setup/tools.md +++ b/book/installation-and-setup/tools.md @@ -61,9 +61,9 @@ Here's a table summarizing the information: |--|----------|-------------| | Account | Free GitHub account (owned by Microsoft) 🤝 | Closed, TU Delft account 🔒 | | Book url | GitHub pages (`.github.io/`), for TU Delft books a custom URL (`oit.tudelft.nl/`), for private books on TU Delft GitHub Enterprise with SSO a random URL (`.github.io/`), or custom url `./`> 🌐 | TU Delft OIT (`interactivetextbooks.tudelft.nl/`) 🎓 | -| Real-time book editing | Automated and flexible (multiple version of the book, building error insights, fast, custom urls) 🚀 | Automated but simplistic (not easily adaptable, no caching environments, no visual summaries, no parallel processes) 🛵 For TU Delft OIT: restricted adaptations because of copyright checks 🚫 | +| Real-time book editing | Automated and flexible (multiple version of the book, building error insights, fast, custom urls) with [DBW](deploy-book-workflow-intro) 🚀 | Some automated scripts exist, but simplistic (not easily adaptable, no caching environments, no visual summaries, no parallel processes) 🛵 For TU Delft OIT: restricted adaptations because of copyright checks 🚫 | | Setting up book website | Immediate and automated with [template](../external/template/README.md) ⚡️ | Manual setup on personal webserver, or access required by TeachBooks or TU Delft OIT 🚧 | -| Book access with SSO | Only available for GitHub pages on GitHub Enterprise of TU Delft 🎓, optional with custom URL ✅ | Optional ✅ | +| Book access with SSO | Only available for GitHub pages on GitHub Enterprise of TU Delft 🎓, optional with custom URL ✅ | Optional ✅ | | Access to source code | Private (if part of organization linked to educational account) /public / internally TU Delft (on GitHub Enterprise of TU Delft) 👥 | Private / public (read-only) / internally TU Delft, editing requires requires SSO login 👥 👀 | | Book size limits | 1 GB for all branches 📚 | 150 MB per book 📕 | | GitHub Desktop | Well integrated 😎 | Basic integration 🙂 | From 50e20fba06f6358c1c399256907f1ee54566bab4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 29 Jun 2025 22:55:28 +0000 Subject: [PATCH 129/347] Bump teachbooks-sphinx-grasple from 1.1.1 to 1.1.2 Bumps [teachbooks-sphinx-grasple](https://github.com/TeachBooks/Sphinx-Grasple-public) from 1.1.1 to 1.1.2. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Changelog](https://github.com/TeachBooks/Sphinx-Grasple-public/blob/main/CHANGELOG.md) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/v1.1.1...v1.1.2) --- updated-dependencies: - dependency-name: teachbooks-sphinx-grasple dependency-version: 1.1.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d2a1b97..92658c4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.6.2 download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.1.1 +teachbooks-sphinx-grasple == 1.1.2 sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 From 0e444c1be00f4951f513ff06955b5e3983d4d438 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 2 Jul 2025 09:58:54 +0200 Subject: [PATCH 130/347] Update git-setup_local.md --- book/installation-and-setup/git-setup_local.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/book/installation-and-setup/git-setup_local.md b/book/installation-and-setup/git-setup_local.md index b2d7e62..95ec937 100644 --- a/book/installation-and-setup/git-setup_local.md +++ b/book/installation-and-setup/git-setup_local.md @@ -27,9 +27,9 @@ Open up a terminal window (*Command + Space*, type in `terminal`). Then, type th Click on `install`. The installation may take a couple of minutes. Once it's finished, check if everything has been installed correctly by executing `git` again. ```` -## Setting up SSH-keys +## Setting up SSH-keys, for GitLab only -When we want to visit repositories on GitLab or GitHub, we need to log in. The same holds if we want to interact with these repositories with Git from VS Code. This means that everytime we make a commit, pull, et cetera, we need to provide our password, which becomes very tedious. Alternatively, we can provide GitLab/GitHub with an SSH-key of our system, so that GitLab/GitHub knows it is indeed us that are making the changes to the repository, removing the need to provide a password. If you're only using GitHub and GitHub desktop, SSH-keys aren't strictly required, but it's still advised you set these up. +When we want to visit repositories on GitLab or GitHub, we need to log in. The same holds if we want to interact with these repositories with Git from VS Code. This means that everytime we make a commit, pull, et cetera, we need to provide our password, which becomes very tedious. Alternatively, we can provide GitLab/GitHub with an SSH-key of our system, so that GitLab/GitHub knows it is indeed us that are making the changes to the repository, removing the need to provide a password. If you're only using GitHub and GitHub desktop, SSH-keys aren't required! 1. Open up a terminal window (Git Bash on Windows). Next, type (or copy and paste) the following command: @@ -103,7 +103,7 @@ When we want to visit repositories on GitLab or GitHub, we need to log in. The s ## Updating the local Git environment -The final step is to provide a username and email address to Git, so our commits can be identified. To do this, in the terminal (Git Bash on Windows) type in the following command for the username: +The final step is to provide a username and email address to Git, so our commits can be identified. If you use GitHub Desktop, there will be a notification which guides you through this. If you want to do it manually: in the terminal (Git Bash on Windows) type in the following command for the username: git config --global user.name " " @@ -131,4 +131,4 @@ This is a (non-exhaustive) list of terminology that will be used in Git for loca ## More on GitLab/GitHub -To get to know more about working in GitLab/GitHub and getting familiar with its features, click [here](../workflows/collaboration.md) or watch this [video](https://www.youtube.com/watch?v=1SBtM3znviU&t=1s)! \ No newline at end of file +To get to know more about working in GitLab/GitHub and getting familiar with its features, click [here](../workflows/collaboration.md) or watch this [video](https://www.youtube.com/watch?v=1SBtM3znviU&t=1s)! From 68d3cecc53ec37da3742286d79e31e73e1c92bb4 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:10:42 +0200 Subject: [PATCH 131/347] Update _toc.yml --- book/_toc.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/book/_toc.yml b/book/_toc.yml index a97c215..176a0d9 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -89,6 +89,7 @@ parts: - file: external/sphinx-iframes/README.md - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md #BUMP - file: external/Sphinx-PRIME-applets/README.md + - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - file: features/visuals.md sections: - file: external/Sphinx-Image-Inverter/README.md From d2e2a4d2b68a428f0a88498beb7d06bdc84eed23 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:16:23 +0200 Subject: [PATCH 132/347] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 92658c4..8ac5bfb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ sphinx-proof == 0.2.1 sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 +sphinx-dropdown-toggle == 0.0.2 git+https://github.com/TeachBooks/Sphinx-Thebe From 906fa93976626d4ff9a52819c881939efacfaac2 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:16:56 +0200 Subject: [PATCH 133/347] Update _config.yml --- book/_config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/book/_config.yml b/book/_config.yml index e3c2dfc..cb1ac1c 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -23,6 +23,7 @@ sphinx: - sphinx_named_colors - sphinx_iframes - sphinx_prime_applets + - sphinx_dropdown_toggle config: html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js From 7facf23ecb28550d2ff722450cc1f24de24973a2 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:22:46 +0200 Subject: [PATCH 134/347] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8ac5bfb..c5d04bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ sphinx-proof == 0.2.1 sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 -sphinx-dropdown-toggle == 0.0.2 +sphinx-dropdown-toggle == 0.0.3 git+https://github.com/TeachBooks/Sphinx-Thebe From f7efec93eee4e09c95456b1c4379a5c5e2359df4 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Wed, 2 Jul 2025 14:33:08 +0200 Subject: [PATCH 135/347] Update requirements.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c5d04bc..062e84c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ sphinx-proof == 0.2.1 sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 -sphinx-dropdown-toggle == 0.0.3 +sphinx-dropdown-toggle == 1.0.0 git+https://github.com/TeachBooks/Sphinx-Thebe From 47e4cc60b3fa1a214f519543b8c2f8d97d4de44d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Jul 2025 22:48:26 +0000 Subject: [PATCH 136/347] Bump teachbooks-sphinx-grasple from 1.1.2 to 1.1.5 Bumps [teachbooks-sphinx-grasple](https://github.com/TeachBooks/Sphinx-Grasple-public) from 1.1.2 to 1.1.5. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Changelog](https://github.com/TeachBooks/Sphinx-Grasple-public/blob/main/CHANGELOG.md) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/v1.1.2...v1.1.5) --- updated-dependencies: - dependency-name: teachbooks-sphinx-grasple dependency-version: 1.1.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 062e84c..f260fb8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.6.2 download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.1.2 +teachbooks-sphinx-grasple == 1.1.5 sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 From 7ed983917278709579c813dae0978877ca16ea76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 20 Jul 2025 22:51:45 +0000 Subject: [PATCH 137/347] Bump book/external/sphinx-iframes from `e21273d` to `89f544c` Bumps [book/external/sphinx-iframes](https://github.com/TeachBooks/sphinx-iframes) from `e21273d` to `89f544c`. - [Release notes](https://github.com/TeachBooks/sphinx-iframes/releases) - [Commits](https://github.com/TeachBooks/sphinx-iframes/compare/e21273da134cbf4753da5faf9adc277b8f1c3a1c...89f544c46ca36b9e57e3f0b724fcc81667c083bf) --- updated-dependencies: - dependency-name: book/external/sphinx-iframes dependency-version: 89f544c46ca36b9e57e3f0b724fcc81667c083bf dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/sphinx-iframes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index e21273d..89f544c 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit e21273da134cbf4753da5faf9adc277b8f1c3a1c +Subproject commit 89f544c46ca36b9e57e3f0b724fcc81667c083bf From 9d091ac6a17661a34ea318c61c797c307d62a833 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Thu, 24 Jul 2025 17:06:24 +0200 Subject: [PATCH 138/347] Add sphinx-code-examples extension to project Integrated the sphinx-code-examples extension by updating _config.yml, _toc.yml, and requirements.txt. This adds support for code example features and links to its manual in the table of contents. --- book/_config.yml | 1 + book/_toc.yml | 1 + requirements.txt | 2 ++ 3 files changed, 4 insertions(+) diff --git a/book/_config.yml b/book/_config.yml index cb1ac1c..483e6e2 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -20,6 +20,7 @@ sphinx: - sphinx_image_inverter - sphinx_exercise - sphinx_proof + - sphinx_code_examples - sphinx_named_colors - sphinx_iframes - sphinx_prime_applets diff --git a/book/_toc.yml b/book/_toc.yml index 176a0d9..235ecf1 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -90,6 +90,7 @@ parts: - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md #BUMP - file: external/Sphinx-PRIME-applets/README.md - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md + - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" - file: features/visuals.md sections: - file: external/Sphinx-Image-Inverter/README.md diff --git a/requirements.txt b/requirements.txt index f260fb8..e40890d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,3 +14,5 @@ sphinx-dropdown-toggle == 1.0.0 git+https://github.com/TeachBooks/Sphinx-Thebe docutils==0.17.1 + +git+https://github.com/TeachBooks/Sphinx-Code-Examples \ No newline at end of file From 92baff0ddbddc1fbfa7ff38ff21e0fe09cab8332 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Fri, 25 Jul 2025 14:29:14 +0200 Subject: [PATCH 139/347] Add sphinx-code-examples to requirements and docs Added 'sphinx-code-examples' to requirements.txt and updated live_code.ipynb to mention Sphinx-Exercises and Sphinx-Code-Examples for including executable code in exercises and examples. Cleaned up requirements.txt by removing a duplicate git reference. --- book/features/live_code.ipynb | 6 +++++- requirements.txt | 5 ++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 44c153d..1d9aa0c 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -173,6 +173,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## Exercises and examples with executable code\n", + "\n", + "To include executable code in your book inside exercises and/or examples, you can use the Sphinx extension [Sphinx-Exercises](https://ebp-sphinx-exercise.readthedocs.io/en/latest/syntax.html#alternative-gated-syntax) and/or the Sphinx extension {ref}`Sphinx-Code-Examples `.\n", + "\n", "## Alternative with JupyterLite (less well integrated)\n", "\n", "Another option to use python in your browser is to use [JupyterLite](https://jupyterlite.readthedocs.io/en/stable/). However, compared to Sphinx-Thebe, described above, this doesn't give a similar seamless interface within your page. Nevertheless, depending on your application, JupyterLite could be a useful tool, especially as it allows for three IDE types: Jupyter Notebook, Jupyter Lab and the iPython REPL.\n", @@ -181,7 +185,7 @@ "\n", "```{tip}\n", "The TeachBooks Team has focused primarily on the use of Sphinx-Thebe and has not looked at JupyterLite over the last couple years. If you have an interesting application of this tool for teaching, please get in touch, we would love to see it! You can use [GitHub Discussions](https://github.com/orgs/TeachBooks/discussions) or sent us an email at [info@teachbooks.io](mailto:info@teachbooks.io).\n", - "```" + "```\n" ] } ], diff --git a/requirements.txt b/requirements.txt index e40890d..a87b25b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,9 +10,8 @@ sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 +sphinx-code-examples == 1.0.1 git+https://github.com/TeachBooks/Sphinx-Thebe -docutils==0.17.1 - -git+https://github.com/TeachBooks/Sphinx-Code-Examples \ No newline at end of file +docutils==0.17.1 \ No newline at end of file From 854f558aaa6a64e7c740d3fe484dd8ee6a277fad Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Sat, 26 Jul 2025 21:34:39 +0200 Subject: [PATCH 140/347] Update requirements.txt --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index a87b25b..80269dd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,8 +10,8 @@ sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 -sphinx-code-examples == 1.0.1 +sphinx-code-examples == 1.0.2 git+https://github.com/TeachBooks/Sphinx-Thebe -docutils==0.17.1 \ No newline at end of file +docutils==0.17.1 From 9d45844418ea4d7bc8b834768f904e9b6de61b58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 27 Jul 2025 22:15:20 +0000 Subject: [PATCH 141/347] Bump book/external/Sphinx-Grasple-public from `ce057a2` to `9f6f68a` Bumps [book/external/Sphinx-Grasple-public](https://github.com/TeachBooks/Sphinx-Grasple-public) from `ce057a2` to `9f6f68a`. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/ce057a20bb234006ddebc80c9894842d125a5b1b...9f6f68a8eaf28952c996fa3604f9201e7c40f271) --- updated-dependencies: - dependency-name: book/external/Sphinx-Grasple-public dependency-version: 9f6f68a8eaf28952c996fa3604f9201e7c40f271 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Sphinx-Grasple-public | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index ce057a2..9f6f68a 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit ce057a20bb234006ddebc80c9894842d125a5b1b +Subproject commit 9f6f68a8eaf28952c996fa3604f9201e7c40f271 From fda97facee456a86323eece761fc4a259e432a44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:12:45 +0000 Subject: [PATCH 142/347] Bump book/external/Nested-Books from `70dfd28` to `9436769` Bumps [book/external/Nested-Books](https://github.com/TeachBooks/Nested-Books) from `70dfd28` to `9436769`. - [Commits](https://github.com/TeachBooks/Nested-Books/compare/70dfd28f5f288118bb75d219b809f03474aa89a2...943676969d6e42b9c6d9c25d5313d9c0fbceea97) --- updated-dependencies: - dependency-name: book/external/Nested-Books dependency-version: 943676969d6e42b9c6d9c25d5313d9c0fbceea97 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Nested-Books | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Nested-Books b/book/external/Nested-Books index 70dfd28..9436769 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit 70dfd28f5f288118bb75d219b809f03474aa89a2 +Subproject commit 943676969d6e42b9c6d9c25d5313d9c0fbceea97 From 9005d03d6c6fa9e8dee6c2aaff434141f5fffe02 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 30 Jul 2025 14:14:23 +0200 Subject: [PATCH 143/347] Create CODEOWNERS --- CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..e5d7b22 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +# All files in the repo +* @Tom-van-Woudenberg From 1a82eebbeed1f345b43dba24dd0dbb20637280bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:13:54 +0000 Subject: [PATCH 144/347] Bump book/external/JupyterBook-Patches from `91dbbcb` to `9ce68e1` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `91dbbcb` to `9ce68e1`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/91dbbcbc5bbf8387bc1ad4ed3b4d06479ff6c1e9...9ce68e10be18c7b51f53f92375169fbee64f65d8) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-version: 9ce68e10be18c7b51f53f92375169fbee64f65d8 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 91dbbcb..9ce68e1 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 91dbbcbc5bbf8387bc1ad4ed3b4d06479ff6c1e9 +Subproject commit 9ce68e10be18c7b51f53f92375169fbee64f65d8 From 98fcc7c8bd1c4c3784e6f590606e985a52407d30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 22:15:10 +0000 Subject: [PATCH 145/347] Bump teachbooks-sphinx-grasple from 1.1.5 to 1.2.2 Bumps [teachbooks-sphinx-grasple](https://github.com/TeachBooks/Sphinx-Grasple-public) from 1.1.5 to 1.2.2. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Changelog](https://github.com/TeachBooks/Sphinx-Grasple-public/blob/main/CHANGELOG.md) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/v1.1.5...v1.2.2) --- updated-dependencies: - dependency-name: teachbooks-sphinx-grasple dependency-version: 1.2.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 80269dd..356b870 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.6.2 download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.1.5 +teachbooks-sphinx-grasple == 1.2.2 sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 From 4fbe511a2016de3e2c2d094f36caf23c33d1c88c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 22:15:13 +0000 Subject: [PATCH 146/347] Bump jupyterbook-patches from 1.6.2 to 1.7.0 Bumps [jupyterbook-patches](https://github.com/TeachBooks/JupyterBook-Patches) from 1.6.2 to 1.7.0. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/v1.6.2...v1.7.0) --- updated-dependencies: - dependency-name: jupyterbook-patches dependency-version: 1.7.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 80269dd..fe1d5be 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches == 1.6.2 +jupyterbook_patches == 1.7.0 download_link_replacer == 1.0.4 teachbooks-sphinx-grasple == 1.1.5 sphinx-image-inverter == 1.1.2 From e12006158e6322c8a4cb1ca22f5980b07fbc9cde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:15:28 +0000 Subject: [PATCH 147/347] Bump book/external/deploy-book-workflow from `d90524b` to `ceb2bdb` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `d90524b` to `ceb2bdb`. - [Release notes](https://github.com/TeachBooks/deploy-book-workflow/releases) - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/d90524baa6d989dc2f49ee3d5d2ae1885fe679a9...ceb2bdbe9bed7d7d81ea7342c4bb93044f3879d5) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-version: ceb2bdbe9bed7d7d81ea7342c4bb93044f3879d5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index d90524b..ceb2bdb 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit d90524baa6d989dc2f49ee3d5d2ae1885fe679a9 +Subproject commit ceb2bdbe9bed7d7d81ea7342c4bb93044f3879d5 From f53722da5f5892e0c8fa57c7f9a784eb60eec495 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 20 Aug 2025 09:45:23 +0200 Subject: [PATCH 148/347] Update versioning.md --- book/features/versioning.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/book/features/versioning.md b/book/features/versioning.md index 6f0f55d..ed2a626 100644 --- a/book/features/versioning.md +++ b/book/features/versioning.md @@ -20,10 +20,11 @@ We have come up with guidelines how to use the two TeachBooks-versioning options 3. Errata versions MUST be incremented if a small change is made which should be communicated to the reader in both the source code and in the book itself. If the small change is not crucial (like a simple typo), you might consider not defining it as a new version but combining it with other changes in the next errata or additions version. 4. Additions version MUST be incremented if an addition is made to the book. It MUST be communicated in both the source code and in the book itself. It MAY include errata level changes. The errata version MUST be reset to 0 when the addition version is incremented. 5. Academic year version MUST be incremented if a fresh book is started for which additions will follow later. It MUST be communicated in both the source code and in the book itself. Additions and errata versions MUST be reset to 0 when academic version is incremented. -6. Precedence refers to how versions are compared to each other when ordered. +6. A pre-release version MAY be denoted by appending `.pre-release`. Pre-release versions have a lower precedence than the associated normal version. A pre-release version indicates that the version is not complete. +7. Precedence refers to how versions are compared to each other when ordered. 1. Precedence MUST be calculated by separating the version into academic year, additions and errata identifiers in that order. 2. Precedence is determined by the first difference when comparing each of these identifiers from left to right as follows: Academic year, additions and errata versions are always compared numerically. Example: 2024.0.0 < 2025.0.0 < 2025.1.0 < 2025.1.1. -7. The way in which the version number is incremented after the initial release should be explained in the README of the source code and in the book itself. +8. The way in which the version number is incremented after the initial release should be explained in the README of the source code and in the book itself. An example can be seen in [the source repository of the Engineering Systems Optimization book](https://github.com/TUDelft-books/CME4501/tags) showing tags for different versions. ```` From a67eb479651a1f2ef7528c3da656bf1a6ad13cef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 23 Aug 2025 19:06:22 +0000 Subject: [PATCH 149/347] Bump book/external/sphinx-iframes from `89f544c` to `583163e` Bumps [book/external/sphinx-iframes](https://github.com/TeachBooks/sphinx-iframes) from `89f544c` to `583163e`. - [Release notes](https://github.com/TeachBooks/sphinx-iframes/releases) - [Commits](https://github.com/TeachBooks/sphinx-iframes/compare/89f544c46ca36b9e57e3f0b724fcc81667c083bf...583163ebf970a83ff45d80bb9ace9922d1e1615b) --- updated-dependencies: - dependency-name: book/external/sphinx-iframes dependency-version: 583163ebf970a83ff45d80bb9ace9922d1e1615b dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/sphinx-iframes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 89f544c..583163e 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 89f544c46ca36b9e57e3f0b724fcc81667c083bf +Subproject commit 583163ebf970a83ff45d80bb9ace9922d1e1615b From 82b78f1df7aaa432880af804bd52266ac84eac4e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 23 Aug 2025 21:13:24 +0200 Subject: [PATCH 150/347] Update sphinx-code-examples version to 1.2.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bb65967..5a8df1f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ sphinx-named-colors == 1.0.1 sphinx-iframes == 1.0.5 sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 -sphinx-code-examples == 1.0.2 +sphinx-code-examples == 1.2.0 git+https://github.com/TeachBooks/Sphinx-Thebe From 098bb72ac10e30b7c56de39eb8496b767cc6682c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 23 Aug 2025 21:22:10 +0200 Subject: [PATCH 151/347] Update sphinx-iframes version to 1.0.7 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 5a8df1f..2025bcb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 sphinx-named-colors == 1.0.1 -sphinx-iframes == 1.0.5 +sphinx-iframes == 1.0.7 sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 sphinx-code-examples == 1.2.0 From 892755a5027a10866c449fa521edfe8c0fb7ab6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 22:21:32 +0000 Subject: [PATCH 152/347] Bump teachbooks-sphinx-grasple from 1.2.2 to 1.2.3 Bumps [teachbooks-sphinx-grasple](https://github.com/TeachBooks/Sphinx-Grasple-public) from 1.2.2 to 1.2.3. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Changelog](https://github.com/TeachBooks/Sphinx-Grasple-public/blob/main/CHANGELOG.md) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/v1.2.2...v1.2.3) --- updated-dependencies: - dependency-name: teachbooks-sphinx-grasple dependency-version: 1.2.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2025bcb..741918a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 jupyterbook_patches == 1.7.0 download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.2.2 +teachbooks-sphinx-grasple == 1.2.3 sphinx-image-inverter == 1.1.2 sphinx-exercise == 1.0.1 sphinx-proof == 0.2.1 From f0b989617aace98aac94b1f3ca478a222ebaa1cf Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Wed, 27 Aug 2025 14:07:19 +0200 Subject: [PATCH 153/347] Add sphinx-accessibility extension and docs link Included the sphinx-accessibility extension in the Sphinx configuration and requirements. Updated the table of contents to reference the Sphinx-Accessibility manual for improved documentation coverage. --- book/_config.yml | 1 + book/_toc.yml | 1 + requirements.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/book/_config.yml b/book/_config.yml index 483e6e2..ff8c7bd 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -25,6 +25,7 @@ sphinx: - sphinx_iframes - sphinx_prime_applets - sphinx_dropdown_toggle + - sphinx_accessibility config: html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js diff --git a/book/_toc.yml b/book/_toc.yml index 235ecf1..c8a3365 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -93,6 +93,7 @@ parts: - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" - file: features/visuals.md sections: + - external: https://github.com/TeachBooks/Sphinx-Accessibility/blob/manual/README.md - file: external/Sphinx-Image-Inverter/README.md - file: external/JupyterBook-Patches/README.md - file: external/Sphinx-TUDelft-theme/README.md diff --git a/requirements.txt b/requirements.txt index 741918a..74226c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ sphinx-iframes == 1.0.7 sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 sphinx-code-examples == 1.2.0 +sphinx-accessibility == 1.0.1 git+https://github.com/TeachBooks/Sphinx-Thebe From 7ed5c12545500320d38f8aa9e6b801db5c21db5e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 27 Aug 2025 16:10:13 +0200 Subject: [PATCH 154/347] Add teachbooks-sphinx-tippy to requirements --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 74226c8..fe2ca1e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ sphinx-prime-applets == 1.0.2 sphinx-dropdown-toggle == 1.0.0 sphinx-code-examples == 1.2.0 sphinx-accessibility == 1.0.1 +teachbooks-sphinx-tippy == 1.0.13 git+https://github.com/TeachBooks/Sphinx-Thebe From cd62b39c6d03dabae8f624dc9203ccb8ba0d2533 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Wed, 27 Aug 2025 16:10:53 +0200 Subject: [PATCH 155/347] Update _config.yml --- book/_config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/book/_config.yml b/book/_config.yml index ff8c7bd..4e32db5 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -26,6 +26,7 @@ sphinx: - sphinx_prime_applets - sphinx_dropdown_toggle - sphinx_accessibility + - teachbooks_sphinx_tippy config: html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js From 17974a889972df316b78027769bbd2ee07eff138 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 1 Sep 2025 10:07:59 +0200 Subject: [PATCH 156/347] replace extensions by favourites --- book/_config.yml | 14 +------------- requirements.txt | 15 +-------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/book/_config.yml b/book/_config.yml index 4e32db5..367f437 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -14,19 +14,7 @@ sphinx: extra_extensions: - sphinx_inline_tabs - sphinx.ext.imgconverter - - download_link_replacer - - jupyterbook_patches - - teachbooks_sphinx_grasple - - sphinx_image_inverter - - sphinx_exercise - - sphinx_proof - - sphinx_code_examples - - sphinx_named_colors - - sphinx_iframes - - sphinx_prime_applets - - sphinx_dropdown_toggle - - sphinx_accessibility - - teachbooks_sphinx_tippy + - teachbooks_favourites config: html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js diff --git a/requirements.txt b/requirements.txt index fe2ca1e..aaae7f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,19 +1,6 @@ teachbooks == 0.2.1 sphinx-inline-tabs == 2023.4.21 -jupyterbook_patches == 1.7.0 -download_link_replacer == 1.0.4 -teachbooks-sphinx-grasple == 1.2.3 -sphinx-image-inverter == 1.1.2 -sphinx-exercise == 1.0.1 -sphinx-proof == 0.2.1 -sphinx-named-colors == 1.0.1 -sphinx-iframes == 1.0.7 -sphinx-prime-applets == 1.0.2 -sphinx-dropdown-toggle == 1.0.0 -sphinx-code-examples == 1.2.0 -sphinx-accessibility == 1.0.1 -teachbooks-sphinx-tippy == 1.0.13 -git+https://github.com/TeachBooks/Sphinx-Thebe +git+https://github.com/TeachBooks/TeachBooks-Favourites docutils==0.17.1 From 8084df38970d5af0b53abd03845f6f54dfba42b4 Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst Date: Thu, 4 Sep 2025 19:05:05 +0200 Subject: [PATCH 157/347] Update external links in _toc.yml Removed a comment from the Sphinx-Indexed-Definitions link and added a new external link to Sphinx-NB-Execution-Patterns in the table of contents. --- book/_toc.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/book/_toc.yml b/book/_toc.yml index c8a3365..2711112 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -87,10 +87,11 @@ parts: - file: features/exercise_checking.ipynb - file: features/jupyterquiz.ipynb - file: external/sphinx-iframes/README.md - - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md #BUMP + - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md - file: external/Sphinx-PRIME-applets/README.md - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" + - external: https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md - file: features/visuals.md sections: - external: https://github.com/TeachBooks/Sphinx-Accessibility/blob/manual/README.md From d84f7b680f487e54420199df0c4772f403a8619e Mon Sep 17 00:00:00 2001 From: Dennis den Ouden-van der Horst <49307154+douden@users.noreply.github.com> Date: Thu, 4 Sep 2025 19:11:42 +0200 Subject: [PATCH 158/347] Fix formatting of external link in _toc.yml --- book/_toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_toc.yml b/book/_toc.yml index 2711112..cd93e64 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -91,7 +91,7 @@ parts: - file: external/Sphinx-PRIME-applets/README.md - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" - - external: https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md + - external: "https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md" - file: features/visuals.md sections: - external: https://github.com/TeachBooks/Sphinx-Accessibility/blob/manual/README.md From 804c646569175aec2cd5f1e1ef003ff55b247d06 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 6 Sep 2025 07:45:33 +0200 Subject: [PATCH 159/347] Add teachbooks-sphinx-grasple to requirements --- requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/requirements.txt b/requirements.txt index aaae7f2..90deb40 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,6 @@ sphinx-inline-tabs == 2023.4.21 git+https://github.com/TeachBooks/TeachBooks-Favourites +teachbooks-sphinx-grasple + docutils==0.17.1 From 1cbb112432379acd87243e43d3c3620e0ee0ca12 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 6 Sep 2025 07:45:55 +0200 Subject: [PATCH 160/347] Add teachbooks_sphinx_grasple to extra_extensions --- book/_config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/book/_config.yml b/book/_config.yml index 367f437..a81c825 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -15,6 +15,7 @@ sphinx: - sphinx_inline_tabs - sphinx.ext.imgconverter - teachbooks_favourites + - teachbooks_sphinx_grasple config: html_js_files: - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js From 77da9807d217f0fe255f75d780100d94d9c06137 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 14 Sep 2025 09:08:58 +0200 Subject: [PATCH 161/347] WIP add favourites --- book/features/favourites.md | 28 ++++++++++++++++++++++++++++ book/features/overview.md | 10 +++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 book/features/favourites.md diff --git a/book/features/favourites.md b/book/features/favourites.md new file mode 100644 index 0000000..7b39d96 --- /dev/null +++ b/book/features/favourites.md @@ -0,0 +1,28 @@ +````{margin} +```{admonition} User types +:class: tip +This page is useful for user type 3-5. +``` + +{bdg-primary}`Sphinx Extension` + +``` +```` + +# TeachBooks Favourites + +TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' favourite features in one place (including tools originally by TeachBooks and from other sources). It is included by default in the [TeachBooks Template](../external/template/README.md) and can be installed independently using `pip install teachbooks-favourites`. The features included are: + +- [Sphinx-Thebe from TeachBooks](./live_code.ipynb) +- [Jupyterbook patches](../external/jupyterbook-patches/README.md) +- [Download link replacer](../external/download-link-replacer/README.md) +- [Sphinx image inverter](../external/sphinx-image-inverter/README.md) +- [Sphinx iframes](../external/sphinx-iframes/README.md) +- [Sphinx exercise (TeachBooks contribution to the original)](https://ebp-sphinx-exercise.readthedocs.io/en/latest/) +- [Teachbooks Sphinx tippy](../external/teachbooks-sphinx-tippy/README.html) +- [Sphinx named colors](../external/sphinx-named-colors/README.md) +- [Sphinx dropdown toggle](../_git/github.com_TeachBooks_Sphinx-Dropdown-Toggle/main/MANUAL.md) +- [Sphinx proof (TeachBooks contribution to the original)](https://sphinx-proof.readthedocs.io/en/latest/) +- [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.md) +- [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.html) +- [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) diff --git a/book/features/overview.md b/book/features/overview.md index f7cf5db..cbeefd6 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -19,6 +19,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-light}`GitHub Template` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` +- {bdg-primary-line}`Part of TeachBooks Favourites` - {bdg-danger}`iframe` - {bdg-success}`WebApp` @@ -26,7 +27,7 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the TeachBooks Python Package and the Deploy Book Workflow are important tools that incorporate and deploy more than one feature, an additional explanation is provided on this page in more detail, with links to the pages in this manual where individual features are described. +As the TeachBooks Python Package, the Deploy Book Workflow and TeachBooks Favourites are important tools that incorporate and deploy more than one feature, an additional explanation is provided on this page in more detail, with links to the pages in this manual where individual features are described. (teachbooks_package)= ## TeachBooks Python Package @@ -81,11 +82,13 @@ Important for these features: ### Book Build Commands By default the DBW builds books using the following command: + ``` teachbooks build book/ ``` To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Workflow the `BRANCHES_TO_PREPROCESS` variable must be configured for a specific branch, which will then execute the following command: + ``` teachbooks build --release book/ ``` @@ -97,3 +100,8 @@ As described on the [DBW page](../external/deploy-book-workflow/README.md), ther Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). + +(teachbooks-favourites-intro)= +## TeachBooks Favourites + +The [TeachBooks Favourites](./favourites.md) is a sphinx extension which collects all of TeachBooks favourite features in one place. It is included by default in the [TeachBooks Template](../external/template/README.md). All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like ot use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. \ No newline at end of file From 2bdfcff7c1a0f55281f94c8d022d52d9e1ac071c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Sep 2025 22:05:56 +0000 Subject: [PATCH 162/347] Bump book/external/JupyterBook-Patches from `9ce68e1` to `eb505b3` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `9ce68e1` to `eb505b3`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/9ce68e10be18c7b51f53f92375169fbee64f65d8...eb505b3013d4019e01e448495e3eb1586f573a00) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-version: eb505b3013d4019e01e448495e3eb1586f573a00 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 9ce68e1..eb505b3 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 9ce68e10be18c7b51f53f92375169fbee64f65d8 +Subproject commit eb505b3013d4019e01e448495e3eb1586f573a00 From 16b12087c6f601ab4d6d9e012850c29215c715e3 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 13:23:54 +0200 Subject: [PATCH 163/347] Update favourites.md --- book/features/favourites.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/features/favourites.md b/book/features/favourites.md index 7b39d96..a19fbcd 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -26,3 +26,4 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.md) - [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.html) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) +- [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.html) \ No newline at end of file From 76ab30859cab25c9b414efef98450a7d1c8d0e11 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 13:36:41 +0200 Subject: [PATCH 164/347] Refactor features overview and add intro pages Split the TeachBooks Python Package and Deploy Book Workflow documentation into dedicated intro pages (teachbooks_intro.md, DBW_intro.md), update references and links throughout feature pages, and revise the _toc.yml structure to include new sections. Added clarifications to favourites and live_code features, improving organization and navigation for users. --- book/_toc.yml | 4 ++ book/features/DBW_intro.md | 40 +++++++++++++++ book/features/draft-release.md | 2 +- book/features/external_toc.md | 2 +- book/features/favourites.md | 4 +- book/features/live_code.ipynb | 2 + book/features/local_server.md | 2 +- book/features/overview.md | 83 ++----------------------------- book/features/teachbooks_intro.md | 35 +++++++++++++ 9 files changed, 90 insertions(+), 84 deletions(-) create mode 100644 book/features/DBW_intro.md create mode 100644 book/features/teachbooks_intro.md diff --git a/book/_toc.yml b/book/_toc.yml index cd93e64..1cbe995 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -42,6 +42,10 @@ parts: - caption: Features chapters: - file: features/overview.md + sections: + - file: features/teachbooks_intro.md + - file: features/DBW_intro.md + - file: features/favourites.md - file: basic-features/overview.md sections: - file: basic-features/jupyterbook.md diff --git a/book/features/DBW_intro.md b/book/features/DBW_intro.md new file mode 100644 index 0000000..fba7911 --- /dev/null +++ b/book/features/DBW_intro.md @@ -0,0 +1,40 @@ + +(deploy-book-workflow-intro)= +## Deploy Book Workflow + +The [Deploy Book Workflow](../external/deploy-book-workflow/README.md) is by default incorporated into any book that has been created using the [TeachBooks Template](../external/template/README.md). We also strongly encourage anyone to consider this tool as an alternative to the "standard" workflow provided by Jupyter Book, as ours automatically builds a different version of your book for every branch in your respository, along with a number of settings that can be used to customize the build process and URL structure of your book(s). This tool is described in more detail on [the Deploy Book Workflow page of this manual](../external/deploy-book-workflow/README.md), and one should note that it influences a number of other aspects of a TeachBook. + +### Related Features + +A list of tools and features that are dependent on, or related to, the Deploy Book Workflow (DBW) is provided here: + +Important for these features: +- [](../external/deploy-book-workflow/README.md): the main DBW page +- [](../external/template/README.md): books created from the Template include DBW by default +- [](./draft-release.md): can be configured directly using the DBW +- [](./update_env.md): behaviors of this tool may influence the DBW +- {ref}`TeachBooks Python Package `: included by default in the DBW +- [](./pull_request_build.md): created to provide DBW-like behavior for PR's from forked repositories +- [](./apa.md): a temporary fix is included in `teachbooks` to enable use in the DBW + +### Book Build Commands + +By default the DBW builds books using the following command: + +``` +teachbooks build book/ +``` + +To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Workflow the `BRANCHES_TO_PREPROCESS` variable must be configured for a specific branch, which will then execute the following command: + +``` +teachbooks build --release book/ +``` + +### Environments and Caching + +As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. + +Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. + +If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). \ No newline at end of file diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 4a7915d..c194753 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,7 +6,7 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` +{bdg-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` ```` diff --git a/book/features/external_toc.md b/book/features/external_toc.md index d8aaec5..ea770fa 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -9,7 +9,7 @@ This page reuses MIT licensed content from {cite:t}`teachbooks_package`. {fa}`qu This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` +{bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` {bdg-success}`WebApp` ```` diff --git a/book/features/favourites.md b/book/features/favourites.md index a19fbcd..a855105 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -26,4 +26,6 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.md) - [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.html) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) -- [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.html) \ No newline at end of file +- [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.html) + +All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. \ No newline at end of file diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 1d9aa0c..5eb4eed 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -11,6 +11,8 @@ "```\n", "\n", "{bdg-primary}`Sphinx Extension`\n", + "{bdg-primary-line}`Part of TeachBooks Favourites`\n", + "\n", "```` \n", "\n", "# Interactive content: Run Python inside your book\n", diff --git a/book/features/local_server.md b/book/features/local_server.md index 415e964..ec21dcc 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -4,7 +4,7 @@ This section is useful for user type 4-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./overview#teachbooks-python-package>` +{bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` ```` (setup-local-server)= diff --git a/book/features/overview.md b/book/features/overview.md index cbeefd6..38a4857 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -14,8 +14,8 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-warning}`Javascript overlay` - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` -- {bdg-link-secondary}`Python Package: teachbooks <./overview.html#teachbooks-python-package>` -- {bdg-light}`GitHub Reusable Action` +- {bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` +- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <./DBW_intro.html>` - {bdg-light}`GitHub Template` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` @@ -27,81 +27,4 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the TeachBooks Python Package, the Deploy Book Workflow and TeachBooks Favourites are important tools that incorporate and deploy more than one feature, an additional explanation is provided on this page in more detail, with links to the pages in this manual where individual features are described. - -(teachbooks_package)= -## TeachBooks Python Package - -````{margin} -```{admonition} User types -:class: tip -This section is useful for user type 4-5. -``` -```` - -The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: - -1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the {ref}`Deploy Book Workflow `, your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). -2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). - -For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: - -``` -teachbooks build book -``` - -This Manual describes the main features and usage of the package. For those who wish to understand more of hte technical details, note that the implementation the API is is documented at [teachbooks.readthedocs.io/](https://teachbooks.readthedocs.io/). - -### List of Features - -Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: -- [Draft-Release Workflow](./draft-release.md) -- [External Contents](./external_toc.md) -- [Local Server](./local_server.md) - -The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. - -(deploy-book-workflow-intro)= -## Deploy Book Workflow - -The [Deploy Book Workflow](../external/deploy-book-workflow/README.md) is by default incorporated into any book that has been created using the [TeachBooks Template](../external/template/README.md). We also strongly encourage anyone to consider this tool as an alternative to the "standard" workflow provided by Jupyter Book, as ours automatically builds a different version of your book for every branch in your respository, along with a number of settings that can be used to customize the build process and URL structure of your book(s). This tool is described in more detail on [the Deploy Book Workflow page of this manual](../external/deploy-book-workflow/README.md), and one should note that it influences a number of other aspects of a TeachBook. - -### Related Features - -A list of tools and features that are dependent on, or related to, the Deploy Book Workflow (DBW) is provided here: - -Important for these features: -- [](../external/deploy-book-workflow/README.md): the main DBW page -- [](../external/template/README.md): books created from the Template include DBW by default -- [](./draft-release.md): can be configured directly using the DBW -- [](./update_env.md): behaviors of this tool may influence the DBW -- {ref}`TeachBooks Python Package `: included by default in the DBW -- [](./pull_request_build.md): created to provide DBW-like behavior for PR's from forked repositories -- [](./apa.md): a temporary fix is included in `teachbooks` to enable use in the DBW - -### Book Build Commands - -By default the DBW builds books using the following command: - -``` -teachbooks build book/ -``` - -To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Workflow the `BRANCHES_TO_PREPROCESS` variable must be configured for a specific branch, which will then execute the following command: - -``` -teachbooks build --release book/ -``` - -### Environments and Caching - -As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. - -Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. - -If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). - -(teachbooks-favourites-intro)= -## TeachBooks Favourites - -The [TeachBooks Favourites](./favourites.md) is a sphinx extension which collects all of TeachBooks favourite features in one place. It is included by default in the [TeachBooks Template](../external/template/README.md). All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like ot use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. \ No newline at end of file +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](./DBW_intro.md) and [TeachBooks Favourites](./favourites.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md new file mode 100644 index 0000000..89d6b73 --- /dev/null +++ b/book/features/teachbooks_intro.md @@ -0,0 +1,35 @@ + +````{margin} +```{admonition} User types +:class: tip +This section is useful for user type 4-5. + +{bdg-link-secondary}`Python Package: TeachBooks` + +``` +```` + +(teachbooks_package)= +## TeachBooks Python Package + +The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: + +1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the {ref}`Deploy Book Workflow `, your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). +2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). + +For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: + +``` +teachbooks build book +``` + +This Manual describes the main features and usage of the package. For those who wish to understand more of hte technical details, note that the implementation the API is is documented at [teachbooks.readthedocs.io/](https://teachbooks.readthedocs.io/). + +### List of Features + +Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: +- [Draft-Release Workflow](./draft-release.md) +- [External Contents](./external_toc.md) +- [Local Server](./local_server.md) + +The package is also set up to handle [APA references](./apa) when using the Draft-Release Workflow (the `_ext` subdirectory and its contents are manually copied during the pre-build phase). This will not be necessary once the APA Reference feature is turned into a proper Sphinx extension or Pybtext plugin. \ No newline at end of file From 627f2f28b558666984bfa161ac868a5c43cb08c7 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 14:00:43 +0200 Subject: [PATCH 165/347] Refactor and reorganize _toc.yml structure Moved basic features into a new 'Original Jupyter Book and Sphinx Features' section, consolidated and reordered feature sections, and updated references to external documentation. This improves the logical organization and clarity of the table of contents. --- book/_toc.yml | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/book/_toc.yml b/book/_toc.yml index 1cbe995..65066cc 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -44,25 +44,12 @@ parts: - file: features/overview.md sections: - file: features/teachbooks_intro.md - - file: features/DBW_intro.md + - file: external/deploy-book-workflow/README.md - file: features/favourites.md - - file: basic-features/overview.md - sections: - - file: basic-features/jupyterbook.md - - file: basic-features/figures.md - - file: basic-features/equations.md - - file: basic-features/videos.md - - file: basic-features/References.md - - file: basic-features/code.md - - file: basic-features/Code_block_figures - - file: basic-features/badges.md - - file: basic-features/banner - title: Banner or Announcement - file: features/easy-editing.md sections: - file: external/template/README.md - file: features/draft-release - - file: external/deploy-book-workflow/README.md - file: features/pull_request_build.md - file: features/local_server - file: features/external_toc @@ -110,17 +97,31 @@ parts: sections: - file: external/annotater/README.md - file: basic-features/hypothesis.md - + - caption: Original Jupyter Book and Sphinx Features + chapters: + - file: basic-features/overview.md + sections: + - file: basic-features/jupyterbook.md + - file: basic-features/figures.md + - file: basic-features/equations.md + - file: basic-features/videos.md + - file: basic-features/References.md + - file: basic-features/code.md + - file: basic-features/Code_block_figures + - file: basic-features/badges.md + - file: basic-features/banner + title: Banner or Announcement - caption: Examples chapters: - file: examples/overview.md - - file: examples/book_structure.md - - file: examples/live_code.md - - file: examples/example_gumbel.ipynb - - file: examples/theory_questions.md - - file: examples/example_quiz_interactive.ipynb - - file: examples/coding_theory_widgets.ipynb - - file: examples/parametric_questions.ipynb + sections: + - file: examples/book_structure.md + - file: examples/live_code.md + - file: examples/example_gumbel.ipynb + - file: examples/theory_questions.md + - file: examples/example_quiz_interactive.ipynb + - file: examples/coding_theory_widgets.ipynb + - file: examples/parametric_questions.ipynb - caption: Editing Tools chapters: From f075c648cf7117aa6329e373a5cc38d35761cd61 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 14:02:30 +0200 Subject: [PATCH 166/347] typo --- book/features/favourites.md | 1 - 1 file changed, 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index a855105..4371054 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -6,7 +6,6 @@ This page is useful for user type 3-5. {bdg-primary}`Sphinx Extension` -``` ```` # TeachBooks Favourites From e7c48faf2d43660e67f887b7ca917435b1fd37d2 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 14:02:37 +0200 Subject: [PATCH 167/347] Add lnks to general tools --- book/features/overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index 38a4857..71f1089 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -15,11 +15,11 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` - {bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` -- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <./DBW_intro.html>` +- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` - {bdg-light}`GitHub Template` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` -- {bdg-primary-line}`Part of TeachBooks Favourites` +- {bdg-link-primary-line}`Part of TeachBooks Favourites <./favourites.html>` - {bdg-danger}`iframe` - {bdg-success}`WebApp` From f26356200638cd1ff28dd8c2a3f1707250b800d2 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 14:50:47 +0200 Subject: [PATCH 168/347] Update --- book/_toc.yml | 2 + book/external/deploy-book-workflow | 2 +- book/features/DBW_intro.md | 40 ----- book/features/overview.md | 6 +- book/features/release_book_online.md | 238 +++++++++++++++++++++++++++ book/features/write_online.md | 62 +++++++ 6 files changed, 306 insertions(+), 44 deletions(-) delete mode 100644 book/features/DBW_intro.md create mode 100644 book/features/release_book_online.md create mode 100644 book/features/write_online.md diff --git a/book/_toc.yml b/book/_toc.yml index 65066cc..289d240 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -49,6 +49,8 @@ parts: - file: features/easy-editing.md sections: - file: external/template/README.md + - file: features/write_online.md + - file: features/release_book_online.md - file: features/draft-release - file: features/pull_request_build.md - file: features/local_server diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index ceb2bdb..1b35fe8 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit ceb2bdbe9bed7d7d81ea7342c4bb93044f3879d5 +Subproject commit 1b35fe87afc980274f5731af7b7b74f7df27540c diff --git a/book/features/DBW_intro.md b/book/features/DBW_intro.md deleted file mode 100644 index fba7911..0000000 --- a/book/features/DBW_intro.md +++ /dev/null @@ -1,40 +0,0 @@ - -(deploy-book-workflow-intro)= -## Deploy Book Workflow - -The [Deploy Book Workflow](../external/deploy-book-workflow/README.md) is by default incorporated into any book that has been created using the [TeachBooks Template](../external/template/README.md). We also strongly encourage anyone to consider this tool as an alternative to the "standard" workflow provided by Jupyter Book, as ours automatically builds a different version of your book for every branch in your respository, along with a number of settings that can be used to customize the build process and URL structure of your book(s). This tool is described in more detail on [the Deploy Book Workflow page of this manual](../external/deploy-book-workflow/README.md), and one should note that it influences a number of other aspects of a TeachBook. - -### Related Features - -A list of tools and features that are dependent on, or related to, the Deploy Book Workflow (DBW) is provided here: - -Important for these features: -- [](../external/deploy-book-workflow/README.md): the main DBW page -- [](../external/template/README.md): books created from the Template include DBW by default -- [](./draft-release.md): can be configured directly using the DBW -- [](./update_env.md): behaviors of this tool may influence the DBW -- {ref}`TeachBooks Python Package `: included by default in the DBW -- [](./pull_request_build.md): created to provide DBW-like behavior for PR's from forked repositories -- [](./apa.md): a temporary fix is included in `teachbooks` to enable use in the DBW - -### Book Build Commands - -By default the DBW builds books using the following command: - -``` -teachbooks build book/ -``` - -To use the [Draft-Release Workflow](./draft-release.md) with the Deploy Book Workflow the `BRANCHES_TO_PREPROCESS` variable must be configured for a specific branch, which will then execute the following command: - -``` -teachbooks build --release book/ -``` - -### Environments and Caching - -As described on the [DBW page](../external/deploy-book-workflow/README.md), there is a lot going on "under the hood" with regards to caching of GitHub Action artifacts. This can lead to undesired behavior when using the DBW, especially if package version numbers are not precisely defined. In general we expect the risk of this occurring to be low, as it should only happen when multiple branches are being actively used (new commits on each branch at least once per week), a package from the `requirements.txt` file is updated in the time between creation of two or more branches, and that package _also_ has a significant impact on the book building process. As the Python virtual environment cache is replaced by default if older than one week, the issue should resolve itself within that time frame. - -Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. - -If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). \ No newline at end of file diff --git a/book/features/overview.md b/book/features/overview.md index 71f1089..a095121 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -16,10 +16,10 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-white}`GitHub App and Javascript script` - {bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` - {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -- {bdg-light}`GitHub Template` +- {bdg-link-light}`GitHub Template: TeachBooks Template ` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` -- {bdg-link-primary-line}`Part of TeachBooks Favourites <./favourites.html>` +- {bdg-link-primary-line}`TeachBooks Favourites <./favourites.html>` - {bdg-danger}`iframe` - {bdg-success}`WebApp` @@ -27,4 +27,4 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](./DBW_intro.md) and [TeachBooks Favourites](./favourites.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) and [TeachBooks Favourites](./favourites.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md new file mode 100644 index 0000000..3171c07 --- /dev/null +++ b/book/features/release_book_online.md @@ -0,0 +1,238 @@ +````{margin} +```{admonition} User types +:class: tip +This section is useful for user type 3-5. +``` + +{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` +{bdg-link-light}`Part of TeachBooks Template ` + +```` + +# Share book online for multiple versions + +As you'll start working on your TeachBook, you'll probably want to share it online. And over time you'll create more and more versions of your book, for example for different academic years. + +Our Deploy Book Workflow (described in general [here](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html)) allows you to do so. It builds your book for all branches in your repository and releases them online via GitHub Pages. In simplified terms, it automatically builds the book website based on updates to your repository, creates multiple instances of your book (defined by each branch) and provides the ability to customize the URL's at which each instance of the book can be accessed. This tool is designed specifically for educational contexts, for example, when you may want to preserve book versions from multiple academic years so that students are able to access it later. + +Sharing your book online has many features and customizations: +- Automatic and manual building and releasing of your book online via GitHub Pages using a Reusable GitHub Actions. See explanation [below](how_to_start). +- Ability to release both private (GitHub Pro, GitHub Team, GitHub Enterprise Cloud, or GitHub Enterprise Server required) and public (GitHub Free is enough) repositories. GitHub Teams is free for teachers as described in the [GitHub documentation](https://docs.github.com/en/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-education-for-teachers/about-github-education-for-teachers#github-education-features-for-teachers). If you have an organization for your TeachBook on GitHub, link your GitHub team rights to your organization as described on the [GitHub website](https://github.com/team#organizations). +- Releasing all or a selection of branches, allowing to build a draft version of the TeachBook online which reduces the need for local builds of the book. See explanation [below](gh-workflow-settings). +- Allowing use of submodules within your book. For private submodules, see the explanation [below](private_submodules) +- Converting branch-names to well-defined URLs. See explanation [below](gh-workflow-settings). +- Customizable settings on where the books should be deployed including alias for branch-names and selection of one branch to be deployed on root. The workflow will gives warnings if these settings are ill-defined or conflicting. Although aliases are generally not allowed by GitHub Pages, it seems you can use one alias, but not more. See explanation [below](gh-workflow-settings). +- Customizable behavior of book URL root directory, either by redirecting the root to one of the branches or by copying or moving one of the branches to root. See explanation [below](gh-workflow-settings). +- Adds an 'archived'-banner to old branches / branches of previous years. See explanation [below](gh-workflow-settings). +- Custom 404 "Page Not Found" page with buttons for redirecting to Homepage (e.g., book intro page), "Go Back" or Repository home. +- Provides a summary describing where the TeachBook is released, errors in the build process per branch and how the release step is configured. See explanation [below](gh-workflow-summary) +- Caching of already built books so that it can be partially reused when another branch is released or the next build contains critical errors. See explanation [below](gh-caching) +- Caching of python environment to speed up the workflow. See explanation [below](gh-caching) + +(how_to_start)= +## How to start using this workflow + +The Deploy Book Workflow is by default incorporated into any book that has been created using the [TeachBooks Template](https://github.com/TeachBooks/template). + +Feel free to use it for your existing TeachBook as well: +1. Add [`teachbooks`](https://github.com/TeachBooks/TeachBooks) to your `requirements.txt` file in your root folder +2. Move all the TeachBook files (including `_config.yml` and `_toc.yml`) to a subdirectory `book/`. +3. Copy the [`call-deploy-book.yml`](https://github.com/TeachBooks/template/blob/main/.github/workflows/call-deploy-book.yml) workflow to the `/.github/workflows` folder in your repository (the file is located in the TeachBooks Template repository becuase that file then refers to the file `deploy-book.yml` located in _this_ repository). +4. Set source for GitHub pages to GitHub Actions under `Settings` - `Pages` - `Build and deployment` - `Source` - `GitHub Actions` (as long as you don't do this the workflow deploys all branches which build successfully). +5. Trigger the workflow by making an edit to the TeachBook by editing and committing changes to one of the files in the `book/` subdirectory (available under `Code`) or manually activating the workflow under `Actions` - `All workflows` - `call-deploy-book` - `Run workflow` - `Use workflow from branch: ` - `Run workflow` (this workflow). +6. Now checkout the progress and summary of the releasing workflow under `Actions` - `All workflows` - `call-deploy-book` -``. + +(gh-workflow-settings)= +## Customize the workflow: TeachBook releasing settings +You can adapt the behaviour by setting repository variables as explained [here](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository) or using the [VS Code Extension GitHub Actions](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-github-actions). Define the following repository variables: +- `PRIMARY_BRANCH` which is set to `main` whenever it's not defined in the repository variables. + - This sets the branch or alias (when using 'redirect' for `BEHAVIOR_PRIMARY`) which is shown on root. + - It is advised to show either your default branch on root, or the branch shared with your primary/active book audience (e.g., your current students). +- `BEHAVIOR_PRIMARY` which is set to `redirect` whenever it's not defined in the repository variables. + - This indicates whether to copy the PRIMARY_BRANCH to root ('copy'), move the PRIMARY_BRANCH to root ('move') or redirect from root to the PRIMARY_BRANCH ('redirect') + - Advised to use 'redirect' if you expect to archive a version in the future so that the URL doesn't change for the reader (e.g., to preserve URL containing the current academic year shared with students). + - Use copy or move when you only expect readers to use the root URL. Move is useful to remove unnecessary build artifacts and if you don't need to visit the URL containing the branch or alias name. +- `BRANCH_ALIASES` which is set to ` ` (just a space) whenever it's not defined in the repository variables. + - This defines an alias (custom URL) for a branch + - Variables should be a space-separated list of branch names, e.g. 'alias:really-long-branch-name` + - If no alias is wanted, `BRANCH_ALIASES` may be set to ` ` (just a space) +- `BRANCHES_TO_DEPLOY` which is set to `*` (all branches) whenever it's not defined in the repository variables. + - This defines the branches to deploy. + - It should be a space-separated list of branch names, e.g. 'main second third'. +- `BRANCHES_TO_PREPROCESS` which is set to ` ` (just a space = no branch) whenever it's not defined in the repository variables + - This defines the branches to preprocess with the [`TeachBooks` package](https://teachbooks.io/manual/external-content-teachbooks-v0.2.0/features/draft-release.html), which removed book-pages and config lines defined with `# START REMOVE-FROM-RELEASE` and `# END REMOVE-FROM-RELEASE` + - It should be a space-separated list of branch names, e.g. 'main second third'. + - If no preprocessing is required, `BRANCH_TO_PREPROCESS` may be set to ' ' (space). +- `BRANCHES_ARCHIVED` which is set to ` ` (space, no branch) whenever it's not defined in the repository variables + - This adds a banner to the released branch: You are viewing an archived version of the book. Click here for the latest version. + - It should be a space-separate list of branch names, e.g. 'main second third'. + +In `call-deploy-book.yml` itself you can specify the trigger for this workflow. By default, a push to any branch triggers the workflow. You can limit the branches or subdirectories. + +## Additional GitHub settings +We advise you to enable two options in the general repository setting regarding pull requests in GitHub: +- Enable `Always suggest updating pull request branches`, suggesting a merge from the default branch into any separate branch before merging into main. +- Enable `Automatically delete head branches` to delete branches after they are merged (you'll still be able to restore those). + +## Common Usage Examples + +Relevant use cases are explained here, along with an explanation for how to set up the workflow accordingly. Note that it is not required to set your `PRIMARY_BRANCH` to the default branch of your GitHub repository; this is a choice that is determined by what version of the source code you want visitors to see (i.e., work in progress, or the most recent "complete" or "released" version of a book). + +### Books with active users of different versions (academic years) + +Consider a case where each academic year you would like to create a new book for your students. However, you need to ensure that students from previous years can still access "their" version of the book. + +Assume for this example that we are working in the "my_organization" GitHub Organization in repository "my_book" and that the current academic year is 2025, and that we have one or more books in our repository from previous years. The desired URL structure is thus: +- students from this year use the book at `my_organization.github.io/my_book/2025/` +- students from last year use the book at `my_organization.github.io/my_book/2024/` +- visitors to `my_organization.github.io/my_book/` will automatically be redirected to the book from the current year + +To create this behavior, do the following: + +- Create a branch for each year: a logical name would have format `YYYY`, (technically it can be anything, as the URL can be set to `YYYY` with `BRANCH_ALIASES`). +- Set `PRIMARY_BRANCH` to the branch for the current academic year (e.g., `2025`) +- Set `BEHAVIOR_PRIMARY` to `redirect` (default) + +#### Alternative without redirect to current year + +One possible modification to this setup would be if you are progressively releasing content to your current students (e.g., `2025`) but you wanted visitors to `my_organization.github.io/my_book/` to see a complete version of your book. Assuming that the ideal version for such visitors is the completed book from the previous year (`2024`), you could do this: +- Set `PRIMARY_BRANCH` to `2024` +- Set `BEHAVIOR_PRIMARY` to `copy` + +As your current students may then accidentally go to the older version of the book, we recommend you use a banner to indicate to readers that there is a (partial) new version available, and advise them where to find it. You can add a banner using this workflow (`BRANCHES_ARCHIVED`) or the [standard Jupyter Book banner feature](https://jupyterbook.org/en/stable/web/announcements.html). + +### Books with active editors working in parallel + +Consider a case where several authors are working on material for a book and you would like to be able to see the work of any author at any time. You also have a branch that is used to share finalized material with your readers (we call this a "release" branch) and a branch that is used to collect and review the work of all authors before releasing it (we call this a "draft" branch). + +Assume for this example that we are working in the "my_organization" GitHub Organization in repository "my_book." The released book is on branch `release` the draft book is on branch `draft`; author branches are `author_1`, `author_2`, etc. The desired URL structure is thus: +- official (released) version of the book is at `my_organization.github.io/my_book/` +- draft version of the book is at `my_organization.github.io/my_book/draft/` +- the work of each author can be found at `my_organization.github.io/my_book/author_1/`, etc. + +To create this behavior, do the following: + +- Create a branch for each author as well as `release` and `draft` branches +- Set `draft` to the default branch +- Set `PRIMARY_BRANCH` to `release` +- Set `BEHAVIOR_PRIMARY` to `copy` + +Note that in this situation we strongly recommend using the Draft-Release workflow that is incorporated in the TeachBooks Python package, which allows you to restrict specific content from appearing in the `release` book that is already incorporated in the `draft` book. [Find out more here](https://teachbooks.io/manual/features/draft-release.html). This is useful, for example, if you would like to review many chapters, but release only one at a time, or use a banner in the draft book (e.g., via `_config.yml`) but not the released book. + +#### Why make the draft branch default? + +What if you want to make sure the source code for the released book is visible in the repository, rather than the draft version (e.g., you want to make sure external visitors see this version of the material)? You can do this by making `release` your default branch instead of `draft`. However, this also means that Pull Requests will be default be made into the `release` branch instead of `draft`, which may alter the working method of your team in an undesirable way (e.g., not being able to use a `draft` branch, accidentally releasing material before checking on `draft`, or having to manually adjust every PR that is created by GitHub to merge into `draft` instead of `release`). + +(private_submodules)= +## Private submodules +In case your book includes private submodules, you'll need to create a Personal Access Token (classic) with at least the scope `repo` as described in the [github documentation](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens), and add this token with the name `GH_PAT` as a `Repository secret` or `Organization secret` ( `Settings` > `Secrets and variables` > `Actions` > `Repository secrets` or `Organization secrets`.) Furthermore, manually copy the workflow (.github/workflows/deploy-book.yml) in your own repository as the authorization doesn't work with the called workflow. + +(gh-workflow-summary)= +## View the workflow progress and summary + +Whenever the workflow is triggered, its progress and a summary can be seen under the `Actions`- `All workflows` - `call-deploy-book` in GitHub! It shows you a descriptive summary: +- Ill-defined repository configuration variables (in `Annotations`) +- Which branches are released and where (`https://.github.io/` (case sensitive)) including which branch is released on the website root and the applied alias +- Errors in the build process +- How the repository variables are defined during the build. + +Here's an example for a summary for the template book: + +> ### Branches deployed +> | Branch 🎋 | Link 🔗 | Build status ☑️ | +> | :--- | :--- | :--- | +> | main | [https://teachbooks.github.io/template/main](https://teachbooks.github.io/template/main) | ✅ `Released` | +> | version2 | [https://teachbooks.github.io/template/version2](https://teachbooks.github.io/template/version2) | 🔴 `Build failed [1]` | +> | version3 | [https://teachbooks.github.io/template/version3](https://teachbooks.github.io/template/version3) | ⭕ `Build failed [2]` | +> +> #### Legend for build status +> ✅ `Released` - build success, new version released. +> +> 🔴 `Build failed [1]` - build failure, previous version of the book reused. +> +> ⭕ `Build failed [2]` - build failure, no previous version reused. +> +> #### Primary book at root +> The book at the website root redirects to the primary branch `main` (status: ✅ `Released`). +> +> ### Aliases +> | Alias ➡️ | Target 🎯 | Link 🔗 | Build status ☑️ | +> | :--- | :--- | :--- | :---- | +> | draft | main | [https://teachbooks.github.io/template/draft](https://teachbooks.github.io/template/draft) | ✅ `Released` | +> +> ### Preview of build errors & warnings +> For more details please see the corresponding `build-books` jobs in the left pane. +> +> On branch `version2`: +> ``` +> �[91m/home/runner/work/template/template/book/some_content/overview.md:5: WARNING: Non-consecutive header level increase; H1 to H3 [myst.header]�[39;49;00m +> ``` +> +> On branch `version3`: +> ``` +> /home/runner/work/_temp/ff8c8325-8d8b-4c0b-a2b2-32d2169c55bc.sh: line 8: teachbooks: command not found +> ``` +> +> ### Repository configuration variables +> Variables can be set at +> +> ``` +> PRIMARY_BRANCH=main (default value used) +> BRANCH_ALIASES=draft:main +> BRANCHES_TO_DEPLOY=* (default value used) +> BRANCHES_TO_PREPROCESS=main +> BEHAVIOR_PRIMARY=redirect (default value used) +> BRANCHES_ARCHIVED= (default value used) +> ``` + +(gh-caching)= +## Caching + +The GitHub Action [Cache](https://github.com/actions/cache) is used in the Deploy Book Workflow (DBW) to save time when building the book. This is accompliched by caching two sets of files for each branch: 1) the Python virtual environment, and 2) the build artifact (the HTML files forming each book website). + +The reason for doing this stems from the primary purpose of the Deploy Book Workflow, which builds many versions of a book based on each branch, as well as creating a Python virtual environment from the `requirements.txt` file in the repository. A unique environment for each branch is necessary to test changes to book dependencies and configuration in an isolated way, but can dramatically increase the time required to build all versions of the book when the DBW runs. In addition, it also takes time to build the book itself. For this reason, both of these sets of files are cached (although at the moment, most of the time savings is primarily caching the build artifact). + +This works by hashing a specific set of files and including that in the filename of the cache. Every time the workflow is triggered, a new hashed filename is created and compared to the list of existing caches to see if one with the same name exists; if so, the cache is reused. If not, a new environment and/or build artifact is constructed and a new cache is made. + +Cached files can be found in GitHub under the Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen. For example, this link shows the [caches for this TeachBooks Manual](https://github.com/TeachBooks/manual/actions/caches). If needed, caches can be deleted manually from this page. A cache will expire if unused for longer than 1 week or if the maximum allowed disk space for all cached files is exceeded (both are GitHub policies). + +Files created during a GitHub Action are called [artifacts](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/storing-and-sharing-data-from-a-workflow). Although this is _not_ the same thing as a cache, the files in a specific cache or artifact are identical. Artifacts have their own expiration period, which is possible to [customize in the repository settings](https://docs.github.com/en/organizations/managing-organization-settings/configuring-the-retention-period-for-github-actions-artifacts-and-logs-in-your-organization) (default is 90 days). Unexpired artifacts can be viewed at the bottom of any workflow run summary that is available on the Actions tab of a GitHub repository. + +To add even more confusion to the situation, if an artifact built during an Action is a set of HTML files (a website) that are used to create a GitHub Pages website, the files served when visiting the URL for that are stored on a webserver; they are _not_ the artifact files, but are identical. Fortunately webserver files are preserved indefinitely (or until GitHub changes this policy), meaning that even though your cache or artifact may be deleted, the website will still remain active. + +The cache is a key component of the DBW and leads to several considerations for the building and maintenance of a book, which are explained below, after the criteria for each cache type are described. + +### Cached Environment + +The DBW uses [Python virtual environments](https://docs.python.org/3/library/venv.html) (`python -m venv .venv`) and `python -m pip install -r requirements.txt` to install packages and create the book building environment. The entire `.venv` directory is preserved in the cache with a file name beginning with `venv-...`. The week number is also included in the file hash, which ensures that a new hash is created at least once per week. + +Once created during a successful build action, an existing cached environment will be found and reused unless two specific criteria are met: 1) a book build is required (replacing the cached build artifact), _and_ 2) the `requirements.txt` file is changed. Requirements for a "book build" are described in the next section. + +Note that any change to the `requirements.txt` file will trigger creation of a new environment, not necessarily one that specifies the version number of a package. + +Note that Specifying package version numbers explicitly and updating them via [Dependabot](https://teachbooks.io/manual/favourites/features/update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. + +If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). + +### Cached Build Artifacts + +Build artifacts are the HTML files that define the website (i.e., the book) and are typically located in the subdirectory `book/_build/html` of a repository once the book is built. Note that these files are typically only visible if you are building the book locally, as they are not committed to the repository by default (i.e., `.gitignore`). For users only using the DBW and the GitHub browswer editor, downloading the build cache is the easiest way to view these files, which have filenames beginnig with `html-build--...`. + +Once created during a successful build action, an existing cached build artifact will be found and reused unless _any_ of three specific criteria are met: 1) a change is made to a file in `book/`, 2) the `requirements.txt` file is changed, or 3) the status of a branch as archive or preprocess has changed (`BRANCHES_TO_PREPROCESS` of `BRANCHES_ARCHIVED`). + +Immediately after a successful build action, the book website files exist in three places: cache, artifact and on a GitHub webserver. However, as described at the beginning of this section, the cache will be automatically deleted after 1 week, if unused, and the artifact will be deleted based on the setting in your repository (90 days by default). + +### Effect of Caching on Book Workflow + +Implementation of the DBW has several characteristics that should be noted which could help understand certain behaviors of the book build and website deployment process. These points may be useful to consider if you are experiencing undesired behavior in your Actions builds and/or your actual book websites. + +- Remember that the DBW action will only run if a commit is made that changes `requirements.txt` or contents of `book/` +- When first creating a repository, the action may not run, or may run and fail; occasionally it is needed to make a new commit to get the workflow to run for the first time (remember to modify something in `book/`) or you may try to re-run the job from the Actions tab +- when using multiple branches, only the branch that is edited will be updated +- the website for each branch may be built with a different Python environments (different package versions) + +Unlike the virtual environments (next subsection), caches of the book build do not influence subsequent builds of the book, as this artifact is replaced whenever a commit to a specific branch triggers a new build process. As described above, old cached build artifacts are used if the build process from a new commit fails, ensuring that the URL of a website does not return a 404 page. + +### Effect of Caching on Virtual Environment + +In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](https://teachbooks.io/manual/features/update_env.html). \ No newline at end of file diff --git a/book/features/write_online.md b/book/features/write_online.md new file mode 100644 index 0000000..a50673a --- /dev/null +++ b/book/features/write_online.md @@ -0,0 +1,62 @@ +````{margin} +```{admonition} User types +:class: tip +This section is useful for user type 3-5. +``` + +{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` +{bdg-link-light}`Part of TeachBooks Template ` + +```` + +# Write book fully in GitHub interface + +Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](https://teachbooks.io/manual/favourites/external/template/README.html) after which they make use of the [Deploy Book Workflow](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) to automatically build and release their book online. + +## How to do this + +New users can start writing their book by following the steps shown in the [TeachBooks Template repository](https://github.com/TeachBooks/template). + +Users who already have a TeachBook repository can add the Deploy Book Workflow as explained [here](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) + +After that, users can start writing and editing their book fully online in the GitHub interface. This is supported with: +- [Automatic book builds for all version](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) +- A summary describing where the TeachBook is released, errors in the build process per branch and how the release step is configured + +## Example of summary + +Whenever the workflow is triggered, its progress and a summary can be seen under the `Actions`- `All workflows` - `call-deploy-book` in GitHub! It shows you a descriptive summary. This summary includes, among others: +- Errors in the build process + +Here's an example for a summary for the template book: + +> ### Branches deployed +> | Branch 🎋 | Link 🔗 | Build status ☑️ | +> | :--- | :--- | :--- | +> | main | [https://teachbooks.github.io/template/main](https://teachbooks.github.io/template/main) | ✅ `Released` | +> | version2 | [https://teachbooks.github.io/template/version2](https://teachbooks.github.io/template/version2) | 🔴 `Build failed [1]` | +> | version3 | [https://teachbooks.github.io/template/version3](https://teachbooks.github.io/template/version3) | ⭕ `Build failed [2]` | +> +> #### Legend for build status +> ✅ `Released` - build success, new version released. +> +> 🔴 `Build failed [1]` - build failure, previous version of the book reused. +> +> ⭕ `Build failed [2]` - build failure, no previous version reused. +> +> ### Preview of build errors & warnings +> For more details please see the corresponding `build-books` jobs in the left pane. +> +> On branch `version2`: +> ``` +> �[91m/home/runner/work/template/template/book/some_content/overview.md:5: WARNING: Non-consecutive header level increase; H1 to H3 [myst.header]�[39;49;00m +> ``` +> +> On branch `version3`: +> ``` +> /home/runner/work/_temp/ff8c8325-8d8b-4c0b-a2b2-32d2169c55bc.sh: line 8: teachbooks: command not found +> ``` +> + +## Exercise +Check out [the exercises](https://teachbooks.io/template/exercises.html) in the TeachBooks template to see for yourself how you can write and edit your book fully online in GitHub! From f34b176742c155639cb4745f584de2a0de9f9794 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 14:52:35 +0200 Subject: [PATCH 169/347] WIP --- book/basic-features/overview.md | 2 +- book/examples/overview.md | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index a37acfb..eb60ffe 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -5,6 +5,6 @@ This section is useful for [user type 3-5](../installation-and-setup/user_types. ``` ```` -# Original Jupyter Book and Sphinx Features +# Overview These pages will provide a list of some common, basic book features which are all available in the original
Jupyter book package. Additionally, this page includes also best-practices. diff --git a/book/examples/overview.md b/book/examples/overview.md index 595f6a1..d26cadb 100644 --- a/book/examples/overview.md +++ b/book/examples/overview.md @@ -1,7 +1,3 @@ -# TeachBooks Examples +# Overview This chapter will showcase some TeachBooks making great use of Jupyter Book and TeachBooks features. They can serve as an inspiring starting point for structuring your own TeachBook or just to get an idea of how other teachers and students are using it. Lastly some example pages are shown which combine theory and interactive questions and coding to different degrees. - - - - From be4473842a65135c7f03c0027310ee0ec17ce4ac Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 15:57:36 +0200 Subject: [PATCH 170/347] Add exercise and proof feature documentation Added new pages for Sphinx exercise and Sphinx proof extensions, including installation and usage instructions. Updated references, credits, and feature pages to reflect inclusion in TeachBooks Template and Favourites. Improved consistency of external links and badges, and updated submodules to latest versions. --- book/_toc.yml | 4 +- book/basic-features/overview.md | 2 +- book/credits.md | 5 +- book/external/Download-Link-Replacer | 2 +- book/external/JupyterBook-Patches | 2 +- book/external/Nested-Books | 2 +- book/external/Sphinx-Image-Inverter | 2 +- book/external/Sphinx-Named-Colors | 2 +- book/external/Sphinx-launch-buttons | 2 +- book/external/deploy-book-workflow | 2 +- book/external/sphinx-iframes | 2 +- book/external/teachbooks-sphinx-tippy | 2 +- book/external/template | 2 +- book/features/apa.md | 3 + book/features/draft-release.md | 4 +- book/features/exercise.md | 88 +++++++++++++++++++++++++++ book/features/external_toc.md | 2 +- book/features/favourites.md | 62 ++++++++++++++++--- book/features/live_code.ipynb | 3 +- book/features/local_server.md | 2 +- book/features/overview.md | 6 +- book/features/release_book_online.md | 9 +-- book/features/sphinx-proof.md | 80 ++++++++++++++++++++++++ book/features/teachbooks_intro.md | 3 +- book/features/write_online.md | 11 ++-- book/references.bib | 15 +++++ 26 files changed, 278 insertions(+), 41 deletions(-) create mode 100644 book/features/exercise.md create mode 100644 book/features/sphinx-proof.md diff --git a/book/_toc.yml b/book/_toc.yml index 289d240..09cd976 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -46,9 +46,9 @@ parts: - file: features/teachbooks_intro.md - file: external/deploy-book-workflow/README.md - file: features/favourites.md + - file: external/template/README.md - file: features/easy-editing.md sections: - - file: external/template/README.md - file: features/write_online.md - file: features/release_book_online.md - file: features/draft-release @@ -84,7 +84,9 @@ parts: - file: external/Sphinx-PRIME-applets/README.md - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" + - file: features/sphinx-proof.md - external: "https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md" + - file: features/exercise.md - file: features/visuals.md sections: - external: https://github.com/TeachBooks/Sphinx-Accessibility/blob/manual/README.md diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index eb60ffe..8790d60 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -7,4 +7,4 @@ This section is useful for [user type 3-5](../installation-and-setup/user_types. # Overview -These pages will provide a list of some common, basic book features which are all available in the original Jupyter book package. Additionally, this page includes also best-practices. +These pages will provide a list of some common, basic book features which are all available in the original Jupyter book package without addition of any additional software. Additionally, this page includes also best-practices. diff --git a/book/credits.md b/book/credits.md index e98ad9c..0fe26e7 100644 --- a/book/credits.md +++ b/book/credits.md @@ -66,6 +66,5 @@ The following pages contain content written by others, part of has been reused a - Page {ref}`copyright_licenses`: {numref}`Figure %s` is included unmodified. Work is provided by Kennisland under a CC0 license. Accessed at [](https://wiki.creativecommons.org/wiki/File:CC_License_Compatibility_Chart.png) on December 17, 2024. - page [](./features/versioning.md): includes text from {cite:t}`semver` that has been modified. Original content licensed under CC BY 3.0. - page [](./features/external_toc.md): includes text from {cite:t}`teachbooks_package` that has been modified. Original content licensed under MIT. - - - +- Page [](./features/exercise.md): includes text from {cite:t}`sphinx-exercise` that has been modified. Original content licensed under MIT license. +- Page [](./features/sphinx-proof.md): includes text from {cite:t}`sphinx-proof` that has been modified. Original content licensed under MIT license. \ No newline at end of file diff --git a/book/external/Download-Link-Replacer b/book/external/Download-Link-Replacer index 10ff656..d6f318f 160000 --- a/book/external/Download-Link-Replacer +++ b/book/external/Download-Link-Replacer @@ -1 +1 @@ -Subproject commit 10ff656dc4b871330dd2271d00d2e8b9a9a57613 +Subproject commit d6f318f52cef2f64f44f195c95ea8a449cf37fe2 diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index eb505b3..e6e2706 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit eb505b3013d4019e01e448495e3eb1586f573a00 +Subproject commit e6e27067f60a576e3db745361601a1c43bbae5f4 diff --git a/book/external/Nested-Books b/book/external/Nested-Books index 9436769..abb9e70 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit 943676969d6e42b9c6d9c25d5313d9c0fbceea97 +Subproject commit abb9e707d66ad26e55dfd037835f7f7cc86f2620 diff --git a/book/external/Sphinx-Image-Inverter b/book/external/Sphinx-Image-Inverter index eb21e6a..2351ab0 160000 --- a/book/external/Sphinx-Image-Inverter +++ b/book/external/Sphinx-Image-Inverter @@ -1 +1 @@ -Subproject commit eb21e6a80ed33f0102f9025b9ee983148370d753 +Subproject commit 2351ab0e25a067d6420be078232e5a6e3d9c3168 diff --git a/book/external/Sphinx-Named-Colors b/book/external/Sphinx-Named-Colors index 57ecdd8..c85d64e 160000 --- a/book/external/Sphinx-Named-Colors +++ b/book/external/Sphinx-Named-Colors @@ -1 +1 @@ -Subproject commit 57ecdd887e8bbc32a04aca20e9fc9cb60409b7d0 +Subproject commit c85d64eacbc6b0980530134b08406193f452cf0f diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index e6070de..2d85abc 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit e6070ded6ca77662a3a951893cafe265fa333e5e +Subproject commit 2d85abc35c533a6e756d2c16344fe107be24e427 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 1b35fe8..f983f1e 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 1b35fe87afc980274f5731af7b7b74f7df27540c +Subproject commit f983f1e3ec7d99b14fb50631ea48f1f23a15ee76 diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 583163e..a572035 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 583163ebf970a83ff45d80bb9ace9922d1e1615b +Subproject commit a57203589e1acfaa216a436ea57d17b0b1e76824 diff --git a/book/external/teachbooks-sphinx-tippy b/book/external/teachbooks-sphinx-tippy index e4166e1..4d246da 160000 --- a/book/external/teachbooks-sphinx-tippy +++ b/book/external/teachbooks-sphinx-tippy @@ -1 +1 @@ -Subproject commit e4166e1389ab48ea9059e6576e56d270e66199dd +Subproject commit 4d246da43ec7848928e673ca9223458028d3e473 diff --git a/book/external/template b/book/external/template index 8424c5e..efa0edb 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 8424c5e1fb5631474250859482b92fc1761c502f +Subproject commit efa0edbb1180081e8ab57ba95eeaece195d786af diff --git a/book/features/apa.md b/book/features/apa.md index 49bdf3f..547e547 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -5,6 +5,9 @@ This page is useful for user type 4 and 5. ``` {bdg-primary}`(To be converted into) Sphinx Extension` +{bdg-link-secondary}`Supported by TeachBooks package ` + + ```` (apa)= diff --git a/book/features/draft-release.md b/book/features/draft-release.md index c194753..7e8de38 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,7 +6,9 @@ This page is useful for user type 3-5. ``` -{bdg-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` +{bdg-link-secondary}`Uses TeachBooks package ` +{bdg-link-light}`Included in TeachBooks Template ` +{bdg-link-light}`Supported by Deploy Book workflow ` ```` diff --git a/book/features/exercise.md b/book/features/exercise.md new file mode 100644 index 0000000..9f88cfd --- /dev/null +++ b/book/features/exercise.md @@ -0,0 +1,88 @@ +````{margin} +```{attributiongrey} Attribution +:class: attribution +This page reuses MIT licensed content from {cite:t}`sphinx-exercise`. {fa}`quote-left`{ref}`Find out more here.` +``` + +```{admonition} User types +:class: tip +This section is useful for user type 3-5. +``` ++++ +{bdg-primary}`Sphinx Extension` +{bdg-link-light}`Included in TeachBooks Template ` +{bdg-link-primary-line}`Included in TeachBooks Favourites ` +```` + +# Sphinx exercise + +This extensions provides an easy way to add exercises and solutions to your book. It is documented on https://ebp-sphinx-exercise.readthedocs.io/en/latest/. + +TeachBooks has made some small modifications to the original extension, such that it works well with translated books. + +## What does it do? + +This extension defines exercises and solutions as new admonition types: + +```{exercise} +:label: my-exercise + +Recall that $n!$ is read as "$n$ factorial" and defined as +$n! = n \times (n - 1) \times \cdots \times 2 \times 1$. + +There are functions to compute this in various modules, but let's +write our own version as an exercise. + +In particular, write a function `factorial` such that `factorial(n)` returns $n!$ +for any positive integer $n$. +``` + +````{solution} my-exercise +:label: my-solution + +Here's one solution. + +```{code-block} python +def factorial(n): + k = 1 + for i in range(n): + k = k * (i + 1) + return k + +factorial(4) +``` +```` + +More information can be found in the [official documentation](https://ebp-sphinx-exercise.readthedocs.io/en/latest/). + +## Installation +To use this extenstion, follow these steps: + +**Step 1: Install the Package** + +Install the TeachBooks' version of `sphinx-exercise` package using `pip`: +``` +pip install sphinx-exercise @ git+https://github.com/TeachBooks/sphinx-exercise.git +``` + +**Step 2: Add to `requirements.txt`** + +Make sure that the package is included in your project's `requirements.txt` to track the dependency: +``` +sphinx-exercise @ git+https://github.com/TeachBooks/sphinx-exercise.git +``` + +**Step 3: Enable in `_config.yml`** + +In your `_config.yml` file, add the extension to the list of Sphinx extra extensions (**important**: underscore, not dash this time): +``` +sphinx: + extra_extensions: + . + . + . + - sphinx_exercise + . + . + . +``` diff --git a/book/features/external_toc.md b/book/features/external_toc.md index ea770fa..24dd53c 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -9,7 +9,7 @@ This page reuses MIT licensed content from {cite:t}`teachbooks_package`. {fa}`qu This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` +{bdg-link-secondary}`Uses TeachBooks package ` {bdg-success}`WebApp` ```` diff --git a/book/features/favourites.md b/book/features/favourites.md index 4371054..a0771d2 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -5,26 +5,70 @@ This page is useful for user type 3-5. ``` {bdg-primary}`Sphinx Extension` +{bdg-link-light}`Included in TeachBooks Template ` + ```` # TeachBooks Favourites -TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' favourite features in one place (including tools originally by TeachBooks and from other sources). It is included by default in the [TeachBooks Template](../external/template/README.md) and can be installed independently using `pip install teachbooks-favourites`. The features included are: +TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' favourite features in one place (including tools originally by TeachBooks and from other sources). It is included by default in the [TeachBooks Template](../external/template/README.md) or can be installed independently. The features included are: - [Sphinx-Thebe from TeachBooks](./live_code.ipynb) -- [Jupyterbook patches](../external/jupyterbook-patches/README.md) -- [Download link replacer](../external/download-link-replacer/README.md) -- [Sphinx image inverter](../external/sphinx-image-inverter/README.md) +- [Jupyterbook patches](../external/JupyterBook-Patches/README.md) +- [Download link replacer](../external/Download-Link-Replacer/README.md) +- [Sphinx image inverter](../external/Sphinx-Image-Inverter/README.md) - [Sphinx iframes](../external/sphinx-iframes/README.md) - [Sphinx exercise (TeachBooks contribution to the original)](https://ebp-sphinx-exercise.readthedocs.io/en/latest/) -- [Teachbooks Sphinx tippy](../external/teachbooks-sphinx-tippy/README.html) -- [Sphinx named colors](../external/sphinx-named-colors/README.md) +- [Teachbooks Sphinx tippy](../external/teachbooks-sphinx-tippy/README.md) +- [Sphinx named colors](../external/Sphinx-Named-Colors/README.md) - [Sphinx dropdown toggle](../_git/github.com_TeachBooks_Sphinx-Dropdown-Toggle/main/MANUAL.md) - [Sphinx proof (TeachBooks contribution to the original)](https://sphinx-proof.readthedocs.io/en/latest/) - [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.md) -- [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.html) +- [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.md) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) -- [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.html) +- [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) -All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. \ No newline at end of file +All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. + +## Installation +To install TeachBooks-Favourites, follow these steps: + +**Step 1: Install the Package** + +Install the `teachbooks-favourites` package using `pip`: +``` +pip install git+https://github.com/TeachBooks/TeachBooks-Favourites +``` + +**Step 2: Add to `requirements.txt`** + +Make sure that the package is included in your project's `requirements.txt` to track the dependency: +``` +git+https://github.com/TeachBooks/TeachBooks-Favourites +``` + +**Step 3: Enable in `_config.yml`** + +In your `_config.yml` file, add the extension to the list of Sphinx extra extensions (**important**: underscore, not dash this time): +``` +sphinx: + extra_extensions: + - teachbooks_favourites +``` + +## Usage + +For using the various package we refer to the different manuals linked above. + +All extensions are loaded with their default settings. + +## Contribute + +Do you think we missed an extension that should really be included? Let us know by either + +- creating a fork of this repository and submitting a pull request, in which you added the extension to the files + - `README.md` + - `pyproject.toml` + - `src\teachbooks_favourites\__init__.py` +- opening an issue. \ No newline at end of file diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 5eb4eed..d0bfa2d 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -11,7 +11,8 @@ "```\n", "\n", "{bdg-primary}`Sphinx Extension`\n", - "{bdg-primary-line}`Part of TeachBooks Favourites`\n", + "{bdg-link-light}`Included in TeachBooks Template `\n", + "{bdg-link-primary-line}`Included in TeachBooks Favourites `\n", "\n", "```` \n", "\n", diff --git a/book/features/local_server.md b/book/features/local_server.md index ec21dcc..f3bf55e 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -4,7 +4,7 @@ This section is useful for user type 4-5. ``` -{bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` +{bdg-link-secondary}`Uses TeachBooks package ` ```` (setup-local-server)= diff --git a/book/features/overview.md b/book/features/overview.md index a095121..81a291f 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -15,8 +15,8 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` - {bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` -- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -- {bdg-link-light}`GitHub Template: TeachBooks Template ` +- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` +- {bdg-link-light}`GitHub Template: TeachBooks Template ` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` - {bdg-link-primary-line}`TeachBooks Favourites <./favourites.html>` @@ -27,4 +27,4 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) and [TeachBooks Favourites](./favourites.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html), [TeachBooks Favourites](./favourites.md) and the TeachBook template are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index 3171c07..5f494c5 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -4,8 +4,9 @@ This section is useful for user type 3-5. ``` -{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -{bdg-link-light}`Part of TeachBooks Template ` +{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` +{bdg-link-light}`Part of TeachBooks Template ` +{bdg-link-secondary}`Uses TeachBooks package ` ```` @@ -13,7 +14,7 @@ This section is useful for user type 3-5. As you'll start working on your TeachBook, you'll probably want to share it online. And over time you'll create more and more versions of your book, for example for different academic years. -Our Deploy Book Workflow (described in general [here](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html)) allows you to do so. It builds your book for all branches in your repository and releases them online via GitHub Pages. In simplified terms, it automatically builds the book website based on updates to your repository, creates multiple instances of your book (defined by each branch) and provides the ability to customize the URL's at which each instance of the book can be accessed. This tool is designed specifically for educational contexts, for example, when you may want to preserve book versions from multiple academic years so that students are able to access it later. +Our Deploy Book Workflow (described in general [here](https://teachbooks.io/manual/external/deploy-book-workflow/README.html)) allows you to do so. It builds your book for all branches in your repository and releases them online via GitHub Pages. In simplified terms, it automatically builds the book website based on updates to your repository, creates multiple instances of your book (defined by each branch) and provides the ability to customize the URL's at which each instance of the book can be accessed. This tool is designed specifically for educational contexts, for example, when you may want to preserve book versions from multiple academic years so that students are able to access it later. Sharing your book online has many features and customizations: - Automatic and manual building and releasing of your book online via GitHub Pages using a Reusable GitHub Actions. See explanation [below](how_to_start). @@ -210,7 +211,7 @@ Once created during a successful build action, an existing cached environment wi Note that any change to the `requirements.txt` file will trigger creation of a new environment, not necessarily one that specifies the version number of a package. -Note that Specifying package version numbers explicitly and updating them via [Dependabot](https://teachbooks.io/manual/favourites/features/update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. +Note that Specifying package version numbers explicitly and updating them via [Dependabot](https://teachbooks.io/manual/features/update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). diff --git a/book/features/sphinx-proof.md b/book/features/sphinx-proof.md new file mode 100644 index 0000000..fd0e0ce --- /dev/null +++ b/book/features/sphinx-proof.md @@ -0,0 +1,80 @@ +````{margin} +```{attributiongrey} Attribution +:class: attribution +This page reuses MIT licensed content from {cite:t}`sphinx-proof`. {fa}`quote-left`{ref}`Find out more here.` +``` + +```{admonition} User types +:class: tip +This section is useful for user type 3-5. +``` ++++ +{bdg-primary}`Sphinx Extension` +{bdg-link-light}`Included in TeachBooks Template ` +{bdg-link-primary-line}`Included in TeachBooks Favourites ` +```` + +# Sphinx proof + +This extensions provides an easy way to add proofs, theorem, axioms and much more to your book. It is documented on https://sphinx-proof.readthedocs.io/en/latest/. + +TeachBooks has made some small modifications to the original extension, such that it works well with translated books. + +## What does it do? + +This extension defines proofs, theorems, axioms and other similar concepts as new admonition types: + +````{prf:example} +:label: my-example + +Next, we shut down randomness in demand and assume that the demand shock +$\nu_t$ follows a deterministic path: + + +```{math} +\nu_t = \alpha + \rho \nu_{t-1} +``` + +Again, we’ll compute and display outcomes in some figures + +```python +ex2 = SmoothingExample(C2=[[0], [0]]) + +x0 = [0, 1, 0] +ex2.simulate(x0) +``` +```` + +More information can be found in the [official documentation](https://sphinx-proof.readthedocs.io/en/latest/index.html). It can be [configured in combination the TeachBooks extension to include examples with executable code and visuals](https://teachbooks.io/manual/_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.html). + +## Installation +To use this extenstion, follow these steps: + +**Step 1: Install the Package** + +Install the TeachBooks' version of `sphinx-exercise` package using `pip`: +``` +pip install sphinx-proof @ git+https://github.com/TeachBooks/sphinx-proof.git +``` + +**Step 2: Add to `requirements.txt`** + +Make sure that the package is included in your project's `requirements.txt` to track the dependency: +``` +sphinx-proof @ git+https://github.com/TeachBooks/sphinx-proof.git +``` + +**Step 3: Enable in `_config.yml`** + +In your `_config.yml` file, add the extension to the list of Sphinx extra extensions (**important**: underscore, not dash this time): +``` +sphinx: + extra_extensions: + . + . + . + - sphinx_proof + . + . + . +``` diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 89d6b73..e521c54 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -5,12 +5,13 @@ This section is useful for user type 4-5. {bdg-link-secondary}`Python Package: TeachBooks` +{bdg-link-light}`Included in TeachBooks Template ` ``` ```` (teachbooks_package)= -## TeachBooks Python Package +# TeachBooks Python Package The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: diff --git a/book/features/write_online.md b/book/features/write_online.md index a50673a..3b64812 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -4,23 +4,24 @@ This section is useful for user type 3-5. ``` -{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -{bdg-link-light}`Part of TeachBooks Template ` +{bdg-link-light}`Uses Deploy Book workflow ` +{bdg-link-light}`Uses TeachBooks Template ` + ```` # Write book fully in GitHub interface -Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](https://teachbooks.io/manual/favourites/external/template/README.html) after which they make use of the [Deploy Book Workflow](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) to automatically build and release their book online. +Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](https://teachbooks.io/manual/external/template/README.html) after which they make use of the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html) to automatically build and release their book online. ## How to do this New users can start writing their book by following the steps shown in the [TeachBooks Template repository](https://github.com/TeachBooks/template). -Users who already have a TeachBook repository can add the Deploy Book Workflow as explained [here](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) +Users who already have a TeachBook repository can add the Deploy Book Workflow as explained [here](https://teachbooks.io/manual/external/deploy-book-workflow/README.html) After that, users can start writing and editing their book fully online in the GitHub interface. This is supported with: -- [Automatic book builds for all version](https://teachbooks.io/manual/favourites/external/deploy-book-workflow/README.html) +- Automatic book builds for all version. See [](./release_book_online.md) for more information - A summary describing where the TeachBook is released, errors in the build process per branch and how the release step is configured ## Example of summary diff --git a/book/references.bib b/book/references.bib index 61219ae..292c741 100644 --- a/book/references.bib +++ b/book/references.bib @@ -183,3 +183,18 @@ note = {Retrieved April, 2025. MIT License.}, } +@misc{sphinx-proof, + author = {{executablebooks}}, + title = {Sphinx Proof}, + url = {https://github.com/executablebooks/sphinx-exercise}, + year = {2024}, + note = {Retrieved September, 2025. MIT License.}, +} + +@misc{sphinx-exercise, + author = {{executablebooks}}, + title = {Sphinx Exercise}, + url = {https://github.com/executablebooks/sphinx-exercise}, + year = {2024}, + note = {Retrieved September, 2025. MIT License.}, +} \ No newline at end of file From 476b2f5fc6659aecb1b31fd925de410681950d4c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:02:42 +0200 Subject: [PATCH 171/347] Update favourites.md --- book/features/favourites.md | 1 + 1 file changed, 1 insertion(+) diff --git a/book/features/favourites.md b/book/features/favourites.md index a0771d2..4645ac1 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -28,6 +28,7 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.md) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) +- [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. From 6fb1d7231f83c1858fa96e3083fed273ad38d533 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:03:55 +0200 Subject: [PATCH 172/347] Update feature docs for clarity and links Improved the overview and write_online feature documentation by clarifying the description of the TeachBook template and updating its link. Also refined the summary section to specify error reporting per branch and release location. --- book/features/overview.md | 2 +- book/features/write_online.md | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index 81a291f..e86e124 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -27,4 +27,4 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html), [TeachBooks Favourites](./favourites.md) and the TeachBook template are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html), [TeachBooks Favourites](./favourites.md) and the [TeachBook template](../external/template/README.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file diff --git a/book/features/write_online.md b/book/features/write_online.md index 3b64812..df0e1cb 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -26,8 +26,7 @@ After that, users can start writing and editing their book fully online in the G ## Example of summary -Whenever the workflow is triggered, its progress and a summary can be seen under the `Actions`- `All workflows` - `call-deploy-book` in GitHub! It shows you a descriptive summary. This summary includes, among others: -- Errors in the build process +Whenever the workflow is triggered, its progress and a summary can be seen under the `Actions`- `All workflows` - `call-deploy-book` in GitHub! It shows you a descriptive summary. This summary includes, among others, the errors in the build process per branch and where the book is released online. Here's an example for a summary for the template book: From 3e4eb3e9ec7e3c0dcc9535f64f64b1ec3ed907ca Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:05:23 +0200 Subject: [PATCH 173/347] Update deploy-book-workflow --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index f983f1e..e4e3249 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit f983f1e3ec7d99b14fb50631ea48f1f23a15ee76 +Subproject commit e4e324964468a21493b92df6771f37b1d0ec69f3 From 1501b290cde246013cdeed55d55332a7d0830cf6 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:40:56 +0200 Subject: [PATCH 174/347] fix relative links --- book/external/Download-Link-Replacer | 2 +- book/external/JupyterBook-Patches | 2 +- book/external/Nested-Books | 2 +- book/external/Sphinx-Grasple-public | 2 +- book/external/Sphinx-Image-Inverter | 2 +- book/external/Sphinx-Named-Colors | 2 +- book/external/Sphinx-PRIME-applets | 2 +- book/external/Sphinx-TUDelft-theme | 2 +- book/external/Sphinx-launch-buttons | 2 +- book/external/Useful_python_code | 2 +- book/external/deploy-book-workflow | 2 +- book/external/sphinx-iframes | 2 +- book/external/teachbooks-sphinx-tippy | 2 +- book/external/template | 2 +- book/features/apa.md | 2 +- book/features/draft-release.md | 6 +++--- book/features/exercise.md | 4 ++-- book/features/external_toc.md | 2 +- book/features/favourites.md | 2 +- book/features/live_code.ipynb | 4 ++-- book/features/local_server.md | 2 +- book/features/overview.md | 6 +++--- book/features/release_book_online.md | 18 ++++++++---------- book/features/sphinx-proof.md | 6 +++--- book/features/teachbooks_intro.md | 2 +- book/features/write_online.md | 8 ++++---- 26 files changed, 44 insertions(+), 46 deletions(-) diff --git a/book/external/Download-Link-Replacer b/book/external/Download-Link-Replacer index d6f318f..89235af 160000 --- a/book/external/Download-Link-Replacer +++ b/book/external/Download-Link-Replacer @@ -1 +1 @@ -Subproject commit d6f318f52cef2f64f44f195c95ea8a449cf37fe2 +Subproject commit 89235af168099dfc6af2be6cab19ca9a5565e1c8 diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index e6e2706..541f4a3 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit e6e27067f60a576e3db745361601a1c43bbae5f4 +Subproject commit 541f4a3220f6d8d07ed2909de66a779fd46b23bf diff --git a/book/external/Nested-Books b/book/external/Nested-Books index abb9e70..97780fc 160000 --- a/book/external/Nested-Books +++ b/book/external/Nested-Books @@ -1 +1 @@ -Subproject commit abb9e707d66ad26e55dfd037835f7f7cc86f2620 +Subproject commit 97780fc7ad1ac36ba7079421a1326343c2488cfb diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index 9f6f68a..2ca3894 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit 9f6f68a8eaf28952c996fa3604f9201e7c40f271 +Subproject commit 2ca3894ef285f238cae1ba120ccf2c0f36e73b31 diff --git a/book/external/Sphinx-Image-Inverter b/book/external/Sphinx-Image-Inverter index 2351ab0..215a5b9 160000 --- a/book/external/Sphinx-Image-Inverter +++ b/book/external/Sphinx-Image-Inverter @@ -1 +1 @@ -Subproject commit 2351ab0e25a067d6420be078232e5a6e3d9c3168 +Subproject commit 215a5b9a8e205dba9ddf27052dba9e56d27c341e diff --git a/book/external/Sphinx-Named-Colors b/book/external/Sphinx-Named-Colors index c85d64e..1307f44 160000 --- a/book/external/Sphinx-Named-Colors +++ b/book/external/Sphinx-Named-Colors @@ -1 +1 @@ -Subproject commit c85d64eacbc6b0980530134b08406193f452cf0f +Subproject commit 1307f44c8d64fb98ce4649f585805666e90ec3aa diff --git a/book/external/Sphinx-PRIME-applets b/book/external/Sphinx-PRIME-applets index 14dc36b..6217c86 160000 --- a/book/external/Sphinx-PRIME-applets +++ b/book/external/Sphinx-PRIME-applets @@ -1 +1 @@ -Subproject commit 14dc36bfdbf89d2d363ea2bdcbc30a64c0f7b00f +Subproject commit 6217c862633bbbbce3365d9b121a7815a09f58a7 diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index 2ab5d1d..86f5772 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit 2ab5d1d708aed595b9630c94081e05c11a84b18c +Subproject commit 86f5772bedd64ccbb2ab9ab16577215803ef238c diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index 2d85abc..63d5397 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit 2d85abc35c533a6e756d2c16344fe107be24e427 +Subproject commit 63d539763e9b9ce13f4dab2ef4c4a17c46e953ef diff --git a/book/external/Useful_python_code b/book/external/Useful_python_code index 81e9235..c80863d 160000 --- a/book/external/Useful_python_code +++ b/book/external/Useful_python_code @@ -1 +1 @@ -Subproject commit 81e923516e06441fb0c04f4946819f5dae9b0a68 +Subproject commit c80863d19f7fde7a452200baa4b4fafe12debc95 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index e4e3249..65010c7 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit e4e324964468a21493b92df6771f37b1d0ec69f3 +Subproject commit 65010c7dc0eff87eb4d7729ee251d0df221c44f8 diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index a572035..69e6028 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit a57203589e1acfaa216a436ea57d17b0b1e76824 +Subproject commit 69e6028e79a3e5aa521093155ee54201299630ff diff --git a/book/external/teachbooks-sphinx-tippy b/book/external/teachbooks-sphinx-tippy index 4d246da..6122c67 160000 --- a/book/external/teachbooks-sphinx-tippy +++ b/book/external/teachbooks-sphinx-tippy @@ -1 +1 @@ -Subproject commit 4d246da43ec7848928e673ca9223458028d3e473 +Subproject commit 6122c67f86a7c9b95f349c80316571e277f0a66b diff --git a/book/external/template b/book/external/template index efa0edb..ba0733a 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit efa0edbb1180081e8ab57ba95eeaece195d786af +Subproject commit ba0733abc6e31eccd7a478f8dd2a433faf5333f7 diff --git a/book/features/apa.md b/book/features/apa.md index 547e547..d2ece83 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -5,7 +5,7 @@ This page is useful for user type 4 and 5. ``` {bdg-primary}`(To be converted into) Sphinx Extension` -{bdg-link-secondary}`Supported by TeachBooks package ` +{bdg-link-secondary}`Supported by TeachBooks package <./teachbooks_intro.html>` ```` diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 7e8de38..227d113 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -6,9 +6,9 @@ This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Uses TeachBooks package ` -{bdg-link-light}`Included in TeachBooks Template ` -{bdg-link-light}`Supported by Deploy Book workflow ` +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +{bdg-link-light}`Supported by Deploy Book workflow <../external/deploy-book-workflow/README.html>` ```` diff --git a/book/features/exercise.md b/book/features/exercise.md index 9f88cfd..a798ee2 100644 --- a/book/features/exercise.md +++ b/book/features/exercise.md @@ -10,8 +10,8 @@ This section is useful for user type 3-5. ``` +++ {bdg-primary}`Sphinx Extension` -{bdg-link-light}`Included in TeachBooks Template ` -{bdg-link-primary-line}`Included in TeachBooks Favourites ` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +{bdg-link-primary-line}`Included in TeachBooks Favourites <./favourites.html>` ```` # Sphinx exercise diff --git a/book/features/external_toc.md b/book/features/external_toc.md index 24dd53c..d00d478 100644 --- a/book/features/external_toc.md +++ b/book/features/external_toc.md @@ -9,7 +9,7 @@ This page reuses MIT licensed content from {cite:t}`teachbooks_package`. {fa}`qu This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Uses TeachBooks package ` +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` {bdg-success}`WebApp` ```` diff --git a/book/features/favourites.md b/book/features/favourites.md index 4645ac1..a5c4ec8 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -5,7 +5,7 @@ This page is useful for user type 3-5. ``` {bdg-primary}`Sphinx Extension` -{bdg-link-light}`Included in TeachBooks Template ` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` ```` diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index d0bfa2d..6674962 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -11,8 +11,8 @@ "```\n", "\n", "{bdg-primary}`Sphinx Extension`\n", - "{bdg-link-light}`Included in TeachBooks Template `\n", - "{bdg-link-primary-line}`Included in TeachBooks Favourites `\n", + "{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>`\n", + "{bdg-link-primary-line}`Included in TeachBooks Favourites <./favourites.html>`\n", "\n", "```` \n", "\n", diff --git a/book/features/local_server.md b/book/features/local_server.md index f3bf55e..c43f3cc 100644 --- a/book/features/local_server.md +++ b/book/features/local_server.md @@ -4,7 +4,7 @@ This section is useful for user type 4-5. ``` -{bdg-link-secondary}`Uses TeachBooks package ` +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` ```` (setup-local-server)= diff --git a/book/features/overview.md b/book/features/overview.md index e86e124..49d95c1 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -15,8 +15,8 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-success}`Chrome Extension` - {bdg-white}`GitHub App and Javascript script` - {bdg-link-secondary}`Python Package: teachbooks <./teachbooks_intro.html>` -- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -- {bdg-link-light}`GitHub Template: TeachBooks Template ` +- {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <../external/deploy-book-workflow/README.html>` +- {bdg-link-light}`GitHub Template: TeachBooks Template <../external/template/README.html>` - {bdg-dark}`Git Workflow` - {bdg-primary}`Sphinx Extension` - {bdg-link-primary-line}`TeachBooks Favourites <./favourites.html>` @@ -27,4 +27,4 @@ Finally, the purpose, installation process and usage of each features is elabora To see examples for these features, go to the [Examples chapter](../examples/overview.md). -As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html), [TeachBooks Favourites](./favourites.md) and the [TeachBook template](../external/template/README.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](../external/deploy-book-workflow/README.md), [TeachBooks Favourites](./favourites.md) and the [TeachBook template](../external/template/README.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index 5f494c5..f8d7b23 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -4,17 +4,15 @@ This section is useful for user type 3-5. ``` -{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow ` -{bdg-link-light}`Part of TeachBooks Template ` -{bdg-link-secondary}`Uses TeachBooks package ` - -```` +{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <../external/deploy-book-workflow/README.html>` +{bdg-link-light}`Part of TeachBooks Template <../external/template/README.html>` +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` # Share book online for multiple versions As you'll start working on your TeachBook, you'll probably want to share it online. And over time you'll create more and more versions of your book, for example for different academic years. -Our Deploy Book Workflow (described in general [here](https://teachbooks.io/manual/external/deploy-book-workflow/README.html)) allows you to do so. It builds your book for all branches in your repository and releases them online via GitHub Pages. In simplified terms, it automatically builds the book website based on updates to your repository, creates multiple instances of your book (defined by each branch) and provides the ability to customize the URL's at which each instance of the book can be accessed. This tool is designed specifically for educational contexts, for example, when you may want to preserve book versions from multiple academic years so that students are able to access it later. +Our Deploy Book Workflow (described in general [here](../external/deploy-book-workflow/README.md)) allows you to do so. It builds your book for all branches in your repository and releases them online via GitHub Pages. In simplified terms, it automatically builds the book website based on updates to your repository, creates multiple instances of your book (defined by each branch) and provides the ability to customize the URL's at which each instance of the book can be accessed. This tool is designed specifically for educational contexts, for example, when you may want to preserve book versions from multiple academic years so that students are able to access it later. Sharing your book online has many features and customizations: - Automatic and manual building and releasing of your book online via GitHub Pages using a Reusable GitHub Actions. See explanation [below](how_to_start). @@ -61,7 +59,7 @@ You can adapt the behaviour by setting repository variables as explained [here]( - This defines the branches to deploy. - It should be a space-separated list of branch names, e.g. 'main second third'. - `BRANCHES_TO_PREPROCESS` which is set to ` ` (just a space = no branch) whenever it's not defined in the repository variables - - This defines the branches to preprocess with the [`TeachBooks` package](https://teachbooks.io/manual/external-content-teachbooks-v0.2.0/features/draft-release.html), which removed book-pages and config lines defined with `# START REMOVE-FROM-RELEASE` and `# END REMOVE-FROM-RELEASE` + - This defines the branches to preprocess with the [`TeachBooks` package](./draft-release.md), which removed book-pages and config lines defined with `# START REMOVE-FROM-RELEASE` and `# END REMOVE-FROM-RELEASE` - It should be a space-separated list of branch names, e.g. 'main second third'. - If no preprocessing is required, `BRANCH_TO_PREPROCESS` may be set to ' ' (space). - `BRANCHES_ARCHIVED` which is set to ` ` (space, no branch) whenever it's not defined in the repository variables @@ -118,7 +116,7 @@ To create this behavior, do the following: - Set `PRIMARY_BRANCH` to `release` - Set `BEHAVIOR_PRIMARY` to `copy` -Note that in this situation we strongly recommend using the Draft-Release workflow that is incorporated in the TeachBooks Python package, which allows you to restrict specific content from appearing in the `release` book that is already incorporated in the `draft` book. [Find out more here](https://teachbooks.io/manual/features/draft-release.html). This is useful, for example, if you would like to review many chapters, but release only one at a time, or use a banner in the draft book (e.g., via `_config.yml`) but not the released book. +Note that in this situation we strongly recommend using the Draft-Release workflow that is incorporated in the TeachBooks Python package, which allows you to restrict specific content from appearing in the `release` book that is already incorporated in the `draft` book. [Find out more here](./draft-release.html). This is useful, for example, if you would like to review many chapters, but release only one at a time, or use a banner in the draft book (e.g., via `_config.yml`) but not the released book. #### Why make the draft branch default? @@ -211,7 +209,7 @@ Once created during a successful build action, an existing cached environment wi Note that any change to the `requirements.txt` file will trigger creation of a new environment, not necessarily one that specifies the version number of a package. -Note that Specifying package version numbers explicitly and updating them via [Dependabot](https://teachbooks.io/manual/features/update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. +Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). @@ -236,4 +234,4 @@ Unlike the virtual environments (next subsection), caches of the book build do n ### Effect of Caching on Virtual Environment -In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](https://teachbooks.io/manual/features/update_env.html). \ No newline at end of file +In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](./update_env.html). \ No newline at end of file diff --git a/book/features/sphinx-proof.md b/book/features/sphinx-proof.md index fd0e0ce..cc3110d 100644 --- a/book/features/sphinx-proof.md +++ b/book/features/sphinx-proof.md @@ -10,8 +10,8 @@ This section is useful for user type 3-5. ``` +++ {bdg-primary}`Sphinx Extension` -{bdg-link-light}`Included in TeachBooks Template ` -{bdg-link-primary-line}`Included in TeachBooks Favourites ` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +{bdg-link-primary-line}`Included in TeachBooks Favourites <./favourites.html>` ```` # Sphinx proof @@ -45,7 +45,7 @@ ex2.simulate(x0) ``` ```` -More information can be found in the [official documentation](https://sphinx-proof.readthedocs.io/en/latest/index.html). It can be [configured in combination the TeachBooks extension to include examples with executable code and visuals](https://teachbooks.io/manual/_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.html). +More information can be found in the [official documentation](https://sphinx-proof.readthedocs.io/en/latest/index.html). It can be [configured in combination the TeachBooks extension to include examples with executable code and visuals](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.html). ## Installation To use this extenstion, follow these steps: diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index e521c54..bf7d323 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -5,7 +5,7 @@ This section is useful for user type 4-5. {bdg-link-secondary}`Python Package: TeachBooks` -{bdg-link-light}`Included in TeachBooks Template ` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` ``` ```` diff --git a/book/features/write_online.md b/book/features/write_online.md index df0e1cb..c42ec23 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -4,21 +4,21 @@ This section is useful for user type 3-5. ``` -{bdg-link-light}`Uses Deploy Book workflow ` -{bdg-link-light}`Uses TeachBooks Template ` +{bdg-link-light}`Uses Deploy Book workflow <../external/deploy-book-workflow/README.html>` +{bdg-link-light}`Uses TeachBooks Template <../external/template/README.html>` ```` # Write book fully in GitHub interface -Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](https://teachbooks.io/manual/external/template/README.html) after which they make use of the [Deploy Book Workflow](https://teachbooks.io/manual/external/deploy-book-workflow/README.html) to automatically build and release their book online. +Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](../external/template/README.html) after which they make use of the [Deploy Book Workflow](../external/deploy-book-workflow/README.html) to automatically build and release their book online. ## How to do this New users can start writing their book by following the steps shown in the [TeachBooks Template repository](https://github.com/TeachBooks/template). -Users who already have a TeachBook repository can add the Deploy Book Workflow as explained [here](https://teachbooks.io/manual/external/deploy-book-workflow/README.html) +Users who already have a TeachBook repository can add the Deploy Book Workflow as explained [here](./release_book_online.md). After that, users can start writing and editing their book fully online in the GitHub interface. This is supported with: - Automatic book builds for all version. See [](./release_book_online.md) for more information From 6acc6897947bbfbd5af41a685044120fcc04b201 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:44:14 +0200 Subject: [PATCH 175/347] fixes --- book/features/favourites.md | 2 +- book/features/teachbooks_intro.md | 4 ++-- book/installation-and-setup/tools.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index a5c4ec8..d747655 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -24,7 +24,7 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx named colors](../external/Sphinx-Named-Colors/README.md) - [Sphinx dropdown toggle](../_git/github.com_TeachBooks_Sphinx-Dropdown-Toggle/main/MANUAL.md) - [Sphinx proof (TeachBooks contribution to the original)](https://sphinx-proof.readthedocs.io/en/latest/) -- [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.md) +- [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.ipynb) - [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.md) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index bf7d323..d4c86d2 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -13,9 +13,9 @@ This section is useful for user type 4-5. (teachbooks_package)= # TeachBooks Python Package -The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](./deploy-book-workflow.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: +The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](../external/deploy-book-workflow/README.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: -1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the {ref}`Deploy Book Workflow `, your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). +1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the [Deploy Book Workflow](../external/deploy-book-workflow/README.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). 2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: diff --git a/book/installation-and-setup/tools.md b/book/installation-and-setup/tools.md index ff81171..0e83db0 100644 --- a/book/installation-and-setup/tools.md +++ b/book/installation-and-setup/tools.md @@ -61,7 +61,7 @@ Here's a table summarizing the information: |--|----------|-------------| | Account | Free GitHub account (owned by Microsoft) 🤝 | Closed, TU Delft account 🔒 | | Book url | GitHub pages (`.github.io/`), for TU Delft books a custom URL (`oit.tudelft.nl/`), for private books on TU Delft GitHub Enterprise with SSO a random URL (`.github.io/`), or custom url `./`> 🌐 | TU Delft OIT (`interactivetextbooks.tudelft.nl/`) 🎓 | -| Real-time book editing | Automated and flexible (multiple version of the book, building error insights, fast, custom urls) with [DBW](deploy-book-workflow-intro) 🚀 | Some automated scripts exist, but simplistic (not easily adaptable, no caching environments, no visual summaries, no parallel processes) 🛵 For TU Delft OIT: restricted adaptations because of copyright checks 🚫 | +| Real-time book editing | Automated and flexible (multiple version of the book, building error insights, fast, custom urls) with [DBW](../external/deploy-book-workflow/README.md) 🚀 | Some automated scripts exist, but simplistic (not easily adaptable, no caching environments, no visual summaries, no parallel processes) 🛵 For TU Delft OIT: restricted adaptations because of copyright checks 🚫 | | Setting up book website | Immediate and automated with [template](../external/template/README.md) ⚡️ | Manual setup on personal webserver, or access required by TeachBooks or TU Delft OIT 🚧 | | Book access with SSO | Only available for GitHub pages on GitHub Enterprise of TU Delft 🎓, optional with custom URL ✅ | Optional ✅ | | Access to source code | Private (if part of organization linked to educational account) /public / internally TU Delft (on GitHub Enterprise of TU Delft) 👥 | Private / public (read-only) / internally TU Delft, editing requires requires SSO login 👥 👀 | From 0a525a1fb8dec0ba4ad9bb090054d4e7b224a139 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:47:00 +0200 Subject: [PATCH 176/347] fixes --- book/external/JupyterBook-Patches | 2 +- book/external/template | 2 +- book/features/overview.md | 2 +- book/features/release_book_online.md | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index 541f4a3..fe2dd75 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit 541f4a3220f6d8d07ed2909de66a779fd46b23bf +Subproject commit fe2dd75143631d9b3d6501eb0294b94ba3348e3c diff --git a/book/external/template b/book/external/template index ba0733a..ca6fc6a 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit ba0733abc6e31eccd7a478f8dd2a433faf5333f7 +Subproject commit ca6fc6aed3fc852796c5ced256cf3c9946d1e022 diff --git a/book/features/overview.md b/book/features/overview.md index 49d95c1..229071c 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -22,7 +22,7 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-link-primary-line}`TeachBooks Favourites <./favourites.html>` - {bdg-danger}`iframe` - {bdg-success}`WebApp` - +) Finally, the purpose, installation process and usage of each features is elaborated on in the respective sub-sections. To see examples for these features, go to the [Examples chapter](../examples/overview.md). diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index f8d7b23..e32c784 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -7,6 +7,7 @@ This section is useful for user type 3-5. {bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <../external/deploy-book-workflow/README.html>` {bdg-link-light}`Part of TeachBooks Template <../external/template/README.html>` {bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` +```` # Share book online for multiple versions From 40cd85952b46f3e3ac4df4e4ea95f92894980105 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:51:17 +0200 Subject: [PATCH 177/347] Update template --- book/external/template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/template b/book/external/template index ca6fc6a..68eb3b3 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit ca6fc6aed3fc852796c5ced256cf3c9946d1e022 +Subproject commit 68eb3b31ccb8d9aa7e36cbb00509e033f7061f54 From cc6cccd366271c869ee252eec90456595fe11c92 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 27 Sep 2025 16:53:28 +0200 Subject: [PATCH 178/347] Typos --- book/external/template | 2 +- book/features/release_book_online.md | 6 +++--- book/features/sphinx-proof.md | 2 +- book/features/teachbooks_intro.md | 2 +- book/features/write_online.md | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/book/external/template b/book/external/template index 68eb3b3..5183c16 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 68eb3b31ccb8d9aa7e36cbb00509e033f7061f54 +Subproject commit 5183c1616932c85a398e561124cf046288695101 diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index e32c784..b5dd27c 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -117,7 +117,7 @@ To create this behavior, do the following: - Set `PRIMARY_BRANCH` to `release` - Set `BEHAVIOR_PRIMARY` to `copy` -Note that in this situation we strongly recommend using the Draft-Release workflow that is incorporated in the TeachBooks Python package, which allows you to restrict specific content from appearing in the `release` book that is already incorporated in the `draft` book. [Find out more here](./draft-release.html). This is useful, for example, if you would like to review many chapters, but release only one at a time, or use a banner in the draft book (e.g., via `_config.yml`) but not the released book. +Note that in this situation we strongly recommend using the Draft-Release workflow that is incorporated in the TeachBooks Python package, which allows you to restrict specific content from appearing in the `release` book that is already incorporated in the `draft` book. [Find out more here](./draft-release.md). This is useful, for example, if you would like to review many chapters, but release only one at a time, or use a banner in the draft book (e.g., via `_config.yml`) but not the released book. #### Why make the draft branch default? @@ -210,7 +210,7 @@ Once created during a successful build action, an existing cached environment wi Note that any change to the `requirements.txt` file will trigger creation of a new environment, not necessarily one that specifies the version number of a package. -Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.html) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. +Note that Specifying package version numbers explicitly and updating them via [Dependabot](./update_env.md) is an excellent way to ensure that environments in the DBW are always up to date and this issue is avoided. If you are _not_ using Dependabot and are not able to get your packages updated when the DBW is running, delete the cache manually and rerun your GitHub Actions job (go to Actions tab, then looking for the "Caches" section under the "Management" pane on the left hand side of the screen). @@ -235,4 +235,4 @@ Unlike the virtual environments (next subsection), caches of the book build do n ### Effect of Caching on Virtual Environment -In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](./update_env.html). \ No newline at end of file +In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](./update_env.md). \ No newline at end of file diff --git a/book/features/sphinx-proof.md b/book/features/sphinx-proof.md index cc3110d..b65a796 100644 --- a/book/features/sphinx-proof.md +++ b/book/features/sphinx-proof.md @@ -45,7 +45,7 @@ ex2.simulate(x0) ``` ```` -More information can be found in the [official documentation](https://sphinx-proof.readthedocs.io/en/latest/index.html). It can be [configured in combination the TeachBooks extension to include examples with executable code and visuals](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.html). +More information can be found in the [official documentation](https://sphinx-proof.readthedocs.io/en/latest/index.html). It can be [configured in combination the TeachBooks extension to include examples with executable code and visuals](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.ipynb). ## Installation To use this extenstion, follow these steps: diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index d4c86d2..878dc0e 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -26,7 +26,7 @@ teachbooks build book This Manual describes the main features and usage of the package. For those who wish to understand more of hte technical details, note that the implementation the API is is documented at [teachbooks.readthedocs.io/](https://teachbooks.readthedocs.io/). -### List of Features +## List of Features Items in the list here are currently implemented in the TeachBooks package and described on other pages of this manual: - [Draft-Release Workflow](./draft-release.md) diff --git a/book/features/write_online.md b/book/features/write_online.md index c42ec23..d919dd6 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -12,7 +12,7 @@ This section is useful for user type 3-5. # Write book fully in GitHub interface -Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](../external/template/README.html) after which they make use of the [Deploy Book Workflow](../external/deploy-book-workflow/README.html) to automatically build and release their book online. +Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](../external/template/README.md) after which they make use of the [Deploy Book Workflow](../external/deploy-book-workflow/README.md) to automatically build and release their book online. ## How to do this From 5c21367b7a767e023288299e95e1e2e795acc334 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:05:34 +0000 Subject: [PATCH 179/347] Bump book/external/Useful_python_code from `81e9235` to `c80863d` Bumps [book/external/Useful_python_code](https://github.com/TeachBooks/Useful_python_code) from `81e9235` to `c80863d`. - [Commits](https://github.com/TeachBooks/Useful_python_code/compare/81e923516e06441fb0c04f4946819f5dae9b0a68...c80863d19f7fde7a452200baa4b4fafe12debc95) --- updated-dependencies: - dependency-name: book/external/Useful_python_code dependency-version: c80863d19f7fde7a452200baa4b4fafe12debc95 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Useful_python_code | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Useful_python_code b/book/external/Useful_python_code index 81e9235..c80863d 160000 --- a/book/external/Useful_python_code +++ b/book/external/Useful_python_code @@ -1 +1 @@ -Subproject commit 81e923516e06441fb0c04f4946819f5dae9b0a68 +Subproject commit c80863d19f7fde7a452200baa4b4fafe12debc95 From 37492149f2586de0cfddd5f6fe89bc23e0c14547 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:05:36 +0000 Subject: [PATCH 180/347] Bump book/external/Sphinx-Grasple-public from `9f6f68a` to `2ca3894` Bumps [book/external/Sphinx-Grasple-public](https://github.com/TeachBooks/Sphinx-Grasple-public) from `9f6f68a` to `2ca3894`. - [Release notes](https://github.com/TeachBooks/Sphinx-Grasple-public/releases) - [Commits](https://github.com/TeachBooks/Sphinx-Grasple-public/compare/9f6f68a8eaf28952c996fa3604f9201e7c40f271...2ca3894ef285f238cae1ba120ccf2c0f36e73b31) --- updated-dependencies: - dependency-name: book/external/Sphinx-Grasple-public dependency-version: 2ca3894ef285f238cae1ba120ccf2c0f36e73b31 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Sphinx-Grasple-public | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index 9f6f68a..2ca3894 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit 9f6f68a8eaf28952c996fa3604f9201e7c40f271 +Subproject commit 2ca3894ef285f238cae1ba120ccf2c0f36e73b31 From ac0dbd7331f4c2249bcbbe89b4d3f92fb800d1e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:05:38 +0000 Subject: [PATCH 181/347] Bump book/external/Sphinx-TUDelft-theme from `2ab5d1d` to `86f5772` Bumps [book/external/Sphinx-TUDelft-theme](https://github.com/TeachBooks/Sphinx-TUDelft-theme) from `2ab5d1d` to `86f5772`. - [Release notes](https://github.com/TeachBooks/Sphinx-TUDelft-theme/releases) - [Commits](https://github.com/TeachBooks/Sphinx-TUDelft-theme/compare/2ab5d1d708aed595b9630c94081e05c11a84b18c...86f5772bedd64ccbb2ab9ab16577215803ef238c) --- updated-dependencies: - dependency-name: book/external/Sphinx-TUDelft-theme dependency-version: 86f5772bedd64ccbb2ab9ab16577215803ef238c dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Sphinx-TUDelft-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-TUDelft-theme b/book/external/Sphinx-TUDelft-theme index 2ab5d1d..86f5772 160000 --- a/book/external/Sphinx-TUDelft-theme +++ b/book/external/Sphinx-TUDelft-theme @@ -1 +1 @@ -Subproject commit 2ab5d1d708aed595b9630c94081e05c11a84b18c +Subproject commit 86f5772bedd64ccbb2ab9ab16577215803ef238c From 877d05cae37b340d30a425c878744481c2c266c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:05:40 +0000 Subject: [PATCH 182/347] Bump book/external/JupyterBook-Patches from `eb505b3` to `fe2dd75` Bumps [book/external/JupyterBook-Patches](https://github.com/TeachBooks/JupyterBook-Patches) from `eb505b3` to `fe2dd75`. - [Release notes](https://github.com/TeachBooks/JupyterBook-Patches/releases) - [Commits](https://github.com/TeachBooks/JupyterBook-Patches/compare/eb505b3013d4019e01e448495e3eb1586f573a00...fe2dd75143631d9b3d6501eb0294b94ba3348e3c) --- updated-dependencies: - dependency-name: book/external/JupyterBook-Patches dependency-version: fe2dd75143631d9b3d6501eb0294b94ba3348e3c dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/JupyterBook-Patches | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/JupyterBook-Patches b/book/external/JupyterBook-Patches index eb505b3..fe2dd75 160000 --- a/book/external/JupyterBook-Patches +++ b/book/external/JupyterBook-Patches @@ -1 +1 @@ -Subproject commit eb505b3013d4019e01e448495e3eb1586f573a00 +Subproject commit fe2dd75143631d9b3d6501eb0294b94ba3348e3c From 5671439b2b4cb7ac32b4751c8540074c27a120f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:05:41 +0000 Subject: [PATCH 183/347] Bump book/external/Sphinx-launch-buttons from `e6070de` to `63d5397` Bumps [book/external/Sphinx-launch-buttons](https://github.com/TeachBooks/Sphinx-launch-buttons) from `e6070de` to `63d5397`. - [Release notes](https://github.com/TeachBooks/Sphinx-launch-buttons/releases) - [Commits](https://github.com/TeachBooks/Sphinx-launch-buttons/compare/e6070ded6ca77662a3a951893cafe265fa333e5e...63d539763e9b9ce13f4dab2ef4c4a17c46e953ef) --- updated-dependencies: - dependency-name: book/external/Sphinx-launch-buttons dependency-version: 63d539763e9b9ce13f4dab2ef4c4a17c46e953ef dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/Sphinx-launch-buttons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/Sphinx-launch-buttons b/book/external/Sphinx-launch-buttons index e6070de..63d5397 160000 --- a/book/external/Sphinx-launch-buttons +++ b/book/external/Sphinx-launch-buttons @@ -1 +1 @@ -Subproject commit e6070ded6ca77662a3a951893cafe265fa333e5e +Subproject commit 63d539763e9b9ce13f4dab2ef4c4a17c46e953ef From 12e518259744ded26d33a13bb67859c751edf6ea Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 08:59:46 -0700 Subject: [PATCH 184/347] feature overview page --- book/features/overview.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/book/features/overview.md b/book/features/overview.md index 229071c..c4f8b33 100644 --- a/book/features/overview.md +++ b/book/features/overview.md @@ -4,11 +4,11 @@ As TeachBooks, we collect a suite of existing open-source software so you don't have to! Some of the software is developed with our TA's to improve the learning experience of our students and ease the book-development process for our teachers. As the open-source software landscape changes rapidly, it is essential to keep in contact and share resources amongst ourselves to minimize maintenance and downtime for our book websites and focus on what really matters: teaching! Since the list of TeachBook features is getting quite long, we have grouped them in categories: -- Original Jupyter Book and Sphinx features -- Easy editing process -- Additional functionality -- Book styling -- TeachBooks student-view features +- [Original Jupyter Book and Sphinx features](../basic-features/overview.md) +- [Easy editing process](./easy-editing.md) +- [Additional functionality](./sphinx_extensions.md) +- [Book styling](./visuals.md) +- [TeachBooks student-view features](./students.md) Additionally, not all features are built and shared in the same way. We do our best to make sure that as many tools as possible are included automatically when using our TeachBooks Template Book; if you are not using the Template, we try to make sure each of our tools can be used independently. For transparency, tags will help differentiate between the different backgrounds of the features: - {bdg-warning}`Javascript overlay` @@ -22,9 +22,9 @@ Additionally, not all features are built and shared in the same way. We do our b - {bdg-link-primary-line}`TeachBooks Favourites <./favourites.html>` - {bdg-danger}`iframe` - {bdg-success}`WebApp` -) -Finally, the purpose, installation process and usage of each features is elaborated on in the respective sub-sections. -To see examples for these features, go to the [Examples chapter](../examples/overview.md). +For each feature, the purpose, installation process and usage is elaborated in the respective sub-sections. -As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](../external/deploy-book-workflow/README.md), [TeachBooks Favourites](./favourites.md) and the [TeachBook template](../external/template/README.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages in more detail, with links to the pages in this manual where individual features are described. \ No newline at end of file +To see examples of these features, go to the [Examples chapter](../examples/overview.md). + +As the [TeachBooks Python Package](./teachbooks_intro.md), the [Deploy Book Workflow](../external/deploy-book-workflow/README.md), [TeachBooks Favourites](./favourites.md) and the [TeachBook template](../external/template/README.md) are important tools that incorporate and deploy more than one feature, an additional explanation is provided here in subpages to this page in more detail, with links to other pages in this manual where individual features are described. \ No newline at end of file From 1cb1b805f861d04af3e233b760a41185abac281e Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 09:02:19 -0700 Subject: [PATCH 185/347] basic-features/overview update --- book/basic-features/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index 8790d60..eb75beb 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -7,4 +7,4 @@ This section is useful for [user type 3-5](../installation-and-setup/user_types. # Overview -These pages will provide a list of some common, basic book features which are all available in the original Jupyter book package without addition of any additional software. Additionally, this page includes also best-practices. +These pages itemize some of the more common, basic book features which are all available in the original Jupyter book package, without requiring any additional software. They are, of course, selected with teachers and teaching applications in mind. On each page best-practices are illustrated. From 1b4b25461cac54b5dae585bf69ab82d74a6da6a0 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 09:59:51 -0700 Subject: [PATCH 186/347] fix figmaker text --- book/tools/figmaker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/tools/figmaker.md b/book/tools/figmaker.md index 9e9be86..cdd73c8 100644 --- a/book/tools/figmaker.md +++ b/book/tools/figmaker.md @@ -7,7 +7,7 @@ This section is useful for user type 3-5. # Figure syntax maker -One might quickely forget the code for making figures, here is a useful tool to make your figures, just specify all information and the code is produced for you: +One might quickly forget the code for making figures, so here we provide a useful tool to make the source code for figures. Simply specify the information in the empty fields below and the code is produced for you automatically:
From 2fa1592de43e140b41682785afb47128c0f85cab Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 10:02:06 -0700 Subject: [PATCH 187/347] scripts page text --- book/helper_code/intro.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/book/helper_code/intro.md b/book/helper_code/intro.md index 6e8f8e7..b06a321 100644 --- a/book/helper_code/intro.md +++ b/book/helper_code/intro.md @@ -1,6 +1,7 @@ # Scripts for automating workflow -This chapter contains a few scripts which can be useful in the book-editing process: +This chapter contains a few scripts which can be useful in the book-editing process, all of which are scripts and/or files stored in other repositories (they are _not_ Sphinx extensions). + - [LaTeX to markdown conversion](tex_md_converter) to convert a LaTeX file into jupyter-book compatible markdown. - [Snippitall](Snippitall) to insert the same code snippet at a certain point in each md file in a specific folder and all subfolder. - [Snippitonce](Snippitonce) to insert the same code snippet at a certain point in each md file only in a specific folder. From 708f14a6216c5e6c29386d8fc78e66b7816956cc Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 10:10:00 -0700 Subject: [PATCH 188/347] sphinx exercise text --- book/features/exercise.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/exercise.md b/book/features/exercise.md index a798ee2..69d5636 100644 --- a/book/features/exercise.md +++ b/book/features/exercise.md @@ -16,9 +16,9 @@ This section is useful for user type 3-5. # Sphinx exercise -This extensions provides an easy way to add exercises and solutions to your book. It is documented on https://ebp-sphinx-exercise.readthedocs.io/en/latest/. +This extensions provides an easy way to add exercises and solutions to your book. It is created by the Executable Books team and is [documented here](https://ebp-sphinx-exercise.readthedocs.io/en/latest/). -TeachBooks has made some small modifications to the original extension, such that it works well with translated books. +TeachBooks has made some small modifications to the original extension, such that it works well with translated books; this modified version is located in the repository [github.com/TeachBooks/sphinx-exercise](https://github.com/TeachBooks/sphinx-exercise). ## What does it do? From 75221ef14dae075285d306285848431b5ad079df Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 10:12:09 -0700 Subject: [PATCH 189/347] favourites text --- book/features/favourites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index d747655..2d71de2 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -30,7 +30,7 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) - [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) -All features which are part of TeachBooks Favourites are indicated with {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. +All features which are part of TeachBooks Favourites are include the following label on their respective pages in this manual: {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. ## Installation To install TeachBooks-Favourites, follow these steps: From 83256dda73772d08a99aaa8e81b69079af4e768c Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Mon, 29 Sep 2025 10:17:08 -0700 Subject: [PATCH 190/347] sphinx proof text - copy updated format of exercise --- book/features/sphinx-proof.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/sphinx-proof.md b/book/features/sphinx-proof.md index b65a796..7627adb 100644 --- a/book/features/sphinx-proof.md +++ b/book/features/sphinx-proof.md @@ -16,9 +16,9 @@ This section is useful for user type 3-5. # Sphinx proof -This extensions provides an easy way to add proofs, theorem, axioms and much more to your book. It is documented on https://sphinx-proof.readthedocs.io/en/latest/. +This extensions provides an easy way to add proofs, theorem, axioms and much more to your book. It is created by the Executable Books team and is [documented here](https://sphinx-proof.readthedocs.io/en/latest/). -TeachBooks has made some small modifications to the original extension, such that it works well with translated books. +TeachBooks has made some small modifications to the original extension, such that it works well with translated books; this modified version is located in the repository [github.com/TeachBooks/sphinx-proof](https://github.com/TeachBooks/sphinx-proof). ## What does it do? From 1e11478d4d8ce313a74e229eaf8f74ad464a85ce Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 10 Oct 2025 16:58:34 +0200 Subject: [PATCH 191/347] Add Sphinx new tab link to favourites Added a new link to the Sphinx new tab link project in the favourites section. --- book/features/favourites.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index 2d71de2..2037936 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -29,6 +29,7 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) - [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) +- [Sphinx new tab link](https://pypi.org/project/sphinx-new-tab-link/) All features which are part of TeachBooks Favourites are include the following label on their respective pages in this manual: {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. @@ -72,4 +73,4 @@ Do you think we missed an extension that should really be included? Let us know - `README.md` - `pyproject.toml` - `src\teachbooks_favourites\__init__.py` -- opening an issue. \ No newline at end of file +- opening an issue. From ec814ee8ab96b4b4904ae62fcc16993300b3a860 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 10 Oct 2025 17:46:05 +0200 Subject: [PATCH 192/347] Remove specific version for sphinx-inline-tabs --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 90deb40..01ba289 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ teachbooks == 0.2.1 -sphinx-inline-tabs == 2023.4.21 +sphinx-inline-tabs git+https://github.com/TeachBooks/TeachBooks-Favourites From 731063b0b525e7626151fa5886a22e3c42ca2075 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 10 Oct 2025 17:47:59 +0200 Subject: [PATCH 193/347] Update TeachBooks-Favourites version in requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 01ba289..69482d8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs -git+https://github.com/TeachBooks/TeachBooks-Favourites +git+https://github.com/TeachBooks/TeachBooks-Favourites@v1.3.5 teachbooks-sphinx-grasple From 1551e9b5cbdf9e03113b49f8c69686e2377c599a Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Fri, 10 Oct 2025 17:53:38 +0200 Subject: [PATCH 194/347] Update TeachBooks-Favourites dependency version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 69482d8..01ba289 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ teachbooks == 0.2.1 sphinx-inline-tabs -git+https://github.com/TeachBooks/TeachBooks-Favourites@v1.3.5 +git+https://github.com/TeachBooks/TeachBooks-Favourites teachbooks-sphinx-grasple From 68f4531d123edfdf04ec6963f1486ac8ace5213b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 22:04:50 +0000 Subject: [PATCH 195/347] Bump book/external/sphinx-iframes from `69e6028` to `d92bc03` Bumps [book/external/sphinx-iframes](https://github.com/TeachBooks/sphinx-iframes) from `69e6028` to `d92bc03`. - [Release notes](https://github.com/TeachBooks/sphinx-iframes/releases) - [Commits](https://github.com/TeachBooks/sphinx-iframes/compare/69e6028e79a3e5aa521093155ee54201299630ff...d92bc03af5f067453caf104a424e0cc0ebdbf04b) --- updated-dependencies: - dependency-name: book/external/sphinx-iframes dependency-version: d92bc03af5f067453caf104a424e0cc0ebdbf04b dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/sphinx-iframes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/sphinx-iframes b/book/external/sphinx-iframes index 69e6028..d92bc03 160000 --- a/book/external/sphinx-iframes +++ b/book/external/sphinx-iframes @@ -1 +1 @@ -Subproject commit 69e6028e79a3e5aa521093155ee54201299630ff +Subproject commit d92bc03af5f067453caf104a424e0cc0ebdbf04b From 5efe4d04582ba4a84f675cf2d1c7e84a372640c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Oct 2025 22:04:52 +0000 Subject: [PATCH 196/347] Bump teachbooks from 0.2.1 to 0.2.2 Bumps [teachbooks](https://github.com/teachbooks/teachbooks) from 0.2.1 to 0.2.2. - [Release notes](https://github.com/teachbooks/teachbooks/releases) - [Changelog](https://github.com/TeachBooks/TeachBooks/blob/develop/CHANGELOG.md) - [Commits](https://github.com/teachbooks/teachbooks/compare/v0.2.1...v0.2.2) --- updated-dependencies: - dependency-name: teachbooks dependency-version: 0.2.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 01ba289..5d664df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -teachbooks == 0.2.1 +teachbooks == 0.2.2 sphinx-inline-tabs git+https://github.com/TeachBooks/TeachBooks-Favourites From 37919cb95730dd32a4695bb77cdc1f2562957636 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 13 Oct 2025 11:02:48 +0200 Subject: [PATCH 197/347] Remove Sphinx new tab link from favourites Removed the Sphinx new tab link from the favourites list. --- book/features/favourites.md | 1 - 1 file changed, 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index 2037936..61b3da5 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -29,7 +29,6 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) - [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) -- [Sphinx new tab link](https://pypi.org/project/sphinx-new-tab-link/) All features which are part of TeachBooks Favourites are include the following label on their respective pages in this manual: {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. From 409025478d1ba77df41956269e9075ed9543f6a2 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 13 Oct 2025 11:05:50 +0200 Subject: [PATCH 198/347] Update favourites.md with extension compatibility info Added note about compatibility of 'Open in new tab' extension. --- book/features/favourites.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/book/features/favourites.md b/book/features/favourites.md index 61b3da5..2465fe6 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -30,6 +30,8 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) - [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) +The extension [Open in new tab](https://pypi.org/project/sphinx-new-tab-link/) is nice, but is not compatible with all setups (dependency clash) so is not included in TeachBooks-Favourites. + All features which are part of TeachBooks Favourites are include the following label on their respective pages in this manual: {bdg-primary-line}`Part of TeachBooks Favourites`. If you'd like to use specific features, but not the entire TeachBooks Favourites, you can remove this extension and replace it with the individual extensions you want to use. ## Installation From fb0f0c783aa28a6de5fad46c72fa495f4411fead Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Tue, 14 Oct 2025 08:44:20 +0200 Subject: [PATCH 199/347] Update external links in _toc.yml --- book/_toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_toc.yml b/book/_toc.yml index 09cd976..7989918 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -82,7 +82,6 @@ parts: - file: external/sphinx-iframes/README.md - external: https://github.com/TeachBooks/Sphinx-Indexed-Definitions/blob/manual/README.md - file: external/Sphinx-PRIME-applets/README.md - - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - external: "https://github.com/TeachBooks/sphinx-code-examples/blob/main/MANUAL.ipynb" - file: features/sphinx-proof.md - external: "https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md" @@ -96,6 +95,7 @@ parts: - file: external/teachbooks-sphinx-tippy/README.md - file: features/apa - file: external/Sphinx-Named-Colors/README.md + - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md #BUMP - file: features/students sections: From 4c51053011384afae710dd346d1889b21b49a5c3 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Tue, 14 Oct 2025 08:52:51 +0200 Subject: [PATCH 200/347] Add external link to Sphinx-ref-graph README --- book/_toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/_toc.yml b/book/_toc.yml index 7989918..9ad0ef5 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -86,6 +86,7 @@ parts: - file: features/sphinx-proof.md - external: "https://github.com/TeachBooks/Sphinx-NB-Execution-Patterns/blob/Manual/README.md" - file: features/exercise.md + - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md #BUMP - file: features/visuals.md sections: - external: https://github.com/TeachBooks/Sphinx-Accessibility/blob/manual/README.md @@ -96,7 +97,6 @@ parts: - file: features/apa - file: external/Sphinx-Named-Colors/README.md - external: https://github.com/TeachBooks/Sphinx-Dropdown-Toggle/blob/main/MANUAL.md - - external: https://github.com/TeachBooks/Sphinx-ref-graph/blob/manual/README.md #BUMP - file: features/students sections: - file: external/annotater/README.md From d85db4da1fb2c993482a090c6f559575b4235e43 Mon Sep 17 00:00:00 2001 From: "T.P. van der Ven" <118564498+thom-vdv@users.noreply.github.com> Date: Sun, 19 Oct 2025 14:25:32 +0200 Subject: [PATCH 201/347] Clarify SVG selection in D3 example --- book/features/creating_basic_HTML_elements.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/creating_basic_HTML_elements.md b/book/features/creating_basic_HTML_elements.md index 5bedc30..88346f9 100644 --- a/book/features/creating_basic_HTML_elements.md +++ b/book/features/creating_basic_HTML_elements.md @@ -53,7 +53,7 @@ The first few lines of our JavaScript code are simple. To scale our element with var width = vw; // Create the canvas. We will use only part of it for the main plot - var svg = d3.select("#click") // This selects the div + var svg = d3.select("#click") // This selects the svg using its id .attr("width", width) // This defines the canvas' width .attr("height", height) // This defines the canvas' height ``` @@ -853,4 +853,4 @@ Here is the code for the element above in full: -``` \ No newline at end of file +``` From 223983d37067ba1b79d81d5bcbc707e1bbf3c401 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 20 Oct 2025 15:40:51 +0200 Subject: [PATCH 202/347] Update Sphinx proof link and add new contributions --- book/features/favourites.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index 2465fe6..35c4c75 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -23,12 +23,13 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Teachbooks Sphinx tippy](../external/teachbooks-sphinx-tippy/README.md) - [Sphinx named colors](../external/Sphinx-Named-Colors/README.md) - [Sphinx dropdown toggle](../_git/github.com_TeachBooks_Sphinx-Dropdown-Toggle/main/MANUAL.md) -- [Sphinx proof (TeachBooks contribution to the original)](https://sphinx-proof.readthedocs.io/en/latest/) +- [Sphinx proof (including TeachBooks contributions)](https://sphinx-proof.readthedocs.io/en/latest/) - [Sphinx code examples](../_git/github.com_TeachBooks_sphinx-code-examples/main/MANUAL.ipynb) - [Sphinx accessibility](../_git/github.com_TeachBooks_Sphinx-Accessibility/manual/README.md) - [Sphinx toggle button (TeachBooks contribution to the original)](https://sphinx-togglebutton.readthedocs.io/en/latest/) - [Notebook execution patterns](../_git/github.com_TeachBooks_Sphinx-NB-Execution-Patterns/Manual/README.md) - [Sphinx Launch Buttons](../external/Sphinx-launch-buttons/README.md) +- [Sphinx External ToC (TeachBooks contribution to the original)](https://github.com/TeachBooks/sphinx-external-toc/blob/main/README.md) The extension [Open in new tab](https://pypi.org/project/sphinx-new-tab-link/) is nice, but is not compatible with all setups (dependency clash) so is not included in TeachBooks-Favourites. From c15681c2dc8ae79f1d6b25476ea27505c62a031c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Thu, 23 Oct 2025 10:20:51 +0200 Subject: [PATCH 203/347] Update Sphinx exercise link description --- book/features/favourites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/favourites.md b/book/features/favourites.md index 35c4c75..cdd678e 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -19,7 +19,7 @@ TeachBooks Favourites is a Sphinx extension which collects all of TeachBooks' fa - [Download link replacer](../external/Download-Link-Replacer/README.md) - [Sphinx image inverter](../external/Sphinx-Image-Inverter/README.md) - [Sphinx iframes](../external/sphinx-iframes/README.md) -- [Sphinx exercise (TeachBooks contribution to the original)](https://ebp-sphinx-exercise.readthedocs.io/en/latest/) +- [Sphinx exercise (including TeachBooks contributions)](https://ebp-sphinx-exercise.readthedocs.io/en/latest/) - [Teachbooks Sphinx tippy](../external/teachbooks-sphinx-tippy/README.md) - [Sphinx named colors](../external/Sphinx-Named-Colors/README.md) - [Sphinx dropdown toggle](../_git/github.com_TeachBooks_Sphinx-Dropdown-Toggle/main/MANUAL.md) From d9b063eec90d776904dd196c444c93b542198656 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Thu, 23 Oct 2025 10:03:55 -0700 Subject: [PATCH 204/347] add fix: CSS rule to hide label spans --- book/_config.yml | 2 +- book/_static/apastyle.css | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 book/_static/apastyle.css diff --git a/book/_config.yml b/book/_config.yml index a81c825..17a416d 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -37,7 +37,7 @@ sphinx: thebe: true html_show_copyright: false html_last_updated_fmt: '%B %-d, %Y' - html_static_path: ["images"] + html_static_path: ["images", "_static"] bibtex_default_style: myapastyle bibtex_reference_style: author_year_round mathjax3_config: diff --git a/book/_static/apastyle.css b/book/_static/apastyle.css new file mode 100644 index 0000000..cea8eed --- /dev/null +++ b/book/_static/apastyle.css @@ -0,0 +1,3 @@ +span.label { + display:none; +} From abe5f2206a527c5cb09c67f90cf4189a1ffd4543 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Thu, 23 Oct 2025 10:05:32 -0700 Subject: [PATCH 205/347] unpin docutils --- requirements.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5d664df..b96ca4c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,4 @@ sphinx-inline-tabs git+https://github.com/TeachBooks/TeachBooks-Favourites -teachbooks-sphinx-grasple - -docutils==0.17.1 +teachbooks-sphinx-grasple \ No newline at end of file From 58cfcc523cf4aa54ee90f468fe78fb19ae0c5265 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Thu, 23 Oct 2025 10:30:04 -0700 Subject: [PATCH 206/347] update Manual page --- book/features/_ext.zip | Bin 10416 -> 0 bytes book/features/apa.md | 39 +++++++++++++++++++++++------------ book/features/apa_config.zip | Bin 0 -> 13136 bytes 3 files changed, 26 insertions(+), 13 deletions(-) delete mode 100644 book/features/_ext.zip create mode 100644 book/features/apa_config.zip diff --git a/book/features/_ext.zip b/book/features/_ext.zip deleted file mode 100644 index 34e2f8fde9bb50d1e4b06e092002ef828b849459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10416 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 ``` -**Step 2: Add to `requirements.txt`** +Note that you may or may not already have a `_static` subdirectory, to which the file `apastyle.css` should be added. -Add a specific version of `docutils` to your requirements file: -``` -docutils==0.17.1 -``` +**Step 2: Enable in `_config.yml`** -**Step 3: Enable in `_config.yml`** +In your `_config.yml` file, add a `bibtex_default_style`, `bybtex_reference_style` and the local extensions `apastyle` and `bracket_citation_style.py`. This enables the (local) extension. -In your `_config.yml` file, add a `bibtex_default_style`, `bybtex_reference_style` and the local extensions `apastyle` and `bracket_citation_style.py` ``` sphinx: config: @@ -68,6 +69,18 @@ sphinx: ... ``` +**Step 3: Enable in `_config.yml`** + +In your `_config.yml` file, add a `_static` is listed under `html_static_path`. This ensures the CSS file is included. + +``` +sphinx: + config: + ... + html_static_path: ["_static", ...] + ... +``` + ## Usage All references are now made in APA-style. See for example this reference: {cite:t}`jason_moore` which shows up on the [references page](../references.md) too. The form of the citation looks like this: @@ -98,8 +111,8 @@ The extension is based on [`pybtex`](https://pybtex.org/), which is a BibTeX-com Although some customization is possible with the standard Jupyter Book features, [as described here](https://jupyterbook.org/en/stable/content/citations.html#change-the-in-line-citation-style), this extension implements the complete APA style, as well as enforcing round brackets (like this). -The need to enforce `docutils==0.17.1` version is the only known solution to the issue where empty brackets `[]` are left on the references page. +The need to include a CSS file is an easy solution to the issue where empty brackets `[]` are left on the references page (to try it, simply delete `apastyle.css`). ## Contribute -This tool needs to be developed further to make it into a proper sphinx-extension (and/or an independent `pybtext` plugin). The process is described in this [project page on GitHub](https://github.com/orgs/TeachBooks/projects/17). If you've ideas or questions, please reach out to us at info@teachbooks.io! +This tool needs to be developed further to make it into a proper sphinx-extension (and/or an independent `pybtext` plugin). The process is described in the README of this [project page on GitHub](https://github.com/orgs/TeachBooks/projects/17?pane=info). If you've ideas or questions, please reach out to us at info@teachbooks.io! diff --git a/book/features/apa_config.zip b/book/features/apa_config.zip new file mode 100644 index 0000000000000000000000000000000000000000..b8007bbe299a9d012036d26559e6b3de3dbbbfaa GIT binary patch literal 13136 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 Q0Q2?-@-YCwL Date: Thu, 23 Oct 2025 10:34:32 -0700 Subject: [PATCH 207/347] missing _ --- book/features/apa.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/apa.md b/book/features/apa.md index db0cdbf..443922b 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -20,7 +20,7 @@ The instructions provided here will work under conventional usage with Jupyter B A temporary fix has also been implemented in the TeachBooks package for use with the Deploy Book Workflow (release mode) (see [release notes from v0.1.0](https://github.com/TeachBooks/TeachBooks/releases/tag/v0.1.0)). -_Update, October 21, 2025: a new fix was necessitated due to dependency issues with docutils making it no longer necessary to pin this package. See [PR 207 of the Manual for a description](https://github.com/TeachBooks/manual/pull/207). +_Update, October 21, 2025:_ a new fix was necessitated due to dependency issues with docutils making it no longer necessary to pin this package. See [PR 207 of the Manual for a description](https://github.com/TeachBooks/manual/pull/207). ``` ## Introduction From 72b4199ebf4d25a864ed8864140829a6f7fd9577 Mon Sep 17 00:00:00 2001 From: Robert Lanzafame Date: Thu, 23 Oct 2025 13:56:42 -0700 Subject: [PATCH 208/347] remove _static include --- book/_config.yml | 2 +- book/features/apa.md | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/book/_config.yml b/book/_config.yml index 17a416d..a81c825 100644 --- a/book/_config.yml +++ b/book/_config.yml @@ -37,7 +37,7 @@ sphinx: thebe: true html_show_copyright: false html_last_updated_fmt: '%B %-d, %Y' - html_static_path: ["images", "_static"] + html_static_path: ["images"] bibtex_default_style: myapastyle bibtex_reference_style: author_year_round mathjax3_config: diff --git a/book/features/apa.md b/book/features/apa.md index 443922b..aad0ff9 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -69,18 +69,6 @@ sphinx: ... ``` -**Step 3: Enable in `_config.yml`** - -In your `_config.yml` file, add a `_static` is listed under `html_static_path`. This ensures the CSS file is included. - -``` -sphinx: - config: - ... - html_static_path: ["_static", ...] - ... -``` - ## Usage All references are now made in APA-style. See for example this reference: {cite:t}`jason_moore` which shows up on the [references page](../references.md) too. The form of the citation looks like this: From f8fd924734c9731ad9b232ec86f1adeae34e3bcf Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 1 Nov 2025 17:32:38 +0100 Subject: [PATCH 209/347] added icons --- book/features/teachbooks_intro.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 878dc0e..567d4cb 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -6,6 +6,8 @@ This section is useful for user type 4-5. {bdg-link-secondary}`Python Package: TeachBooks` {bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +[{octicon}`mark-github` repository](https://github.com/teachbooks/teachbooks) +[{octicon}`book` documentation](https://teachbooks.readthedocs.io/) ``` ```` From 11f2cead3eb7f105d918d3f470b1aaeaee98a354 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 1 Nov 2025 17:36:23 +0100 Subject: [PATCH 210/347] reformat margin --- book/features/teachbooks_intro.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 567d4cb..67a14b0 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -1,15 +1,23 @@ ````{margin} + +```{topic} +{bdg-link-secondary}`Python Package: TeachBooks` +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +``` + ```{admonition} User types :class: tip This section is useful for user type 4-5. -{bdg-link-secondary}`Python Package: TeachBooks` -{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +``` + +```{seealso} + [{octicon}`mark-github` repository](https://github.com/teachbooks/teachbooks) + [{octicon}`book` documentation](https://teachbooks.readthedocs.io/) -``` ```` (teachbooks_package)= From e54aad55361bc0ea011478af3bf2bb8d7649b0cc Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 1 Nov 2025 17:38:26 +0100 Subject: [PATCH 211/347] fix --- book/features/teachbooks_intro.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 67a14b0..7d3dff1 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -2,8 +2,11 @@ ````{margin} ```{topic} + {bdg-link-secondary}`Python Package: TeachBooks` + {bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` + ``` ```{admonition} User types @@ -18,6 +21,8 @@ This section is useful for user type 4-5. [{octicon}`book` documentation](https://teachbooks.readthedocs.io/) +``` + ```` (teachbooks_package)= From ade15bd7609c6a82d406d60464751f4b636aa876 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 1 Nov 2025 17:41:00 +0100 Subject: [PATCH 212/347] Update teachbooks_intro.md --- book/features/teachbooks_intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 7d3dff1..a7c0eb3 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -1,7 +1,7 @@ ````{margin} -```{topic} +```{topic} Feature type {bdg-link-secondary}`Python Package: TeachBooks` From d49d4ecacf3c6ad940a64ce3bd8080ad6bf3535c Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sat, 1 Nov 2025 17:45:24 +0100 Subject: [PATCH 213/347] Update teachbooks_intro.md --- book/features/teachbooks_intro.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index a7c0eb3..22e1eab 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -1,7 +1,7 @@ ````{margin} -```{topic} Feature type +```{note} {bdg-link-secondary}`Python Package: TeachBooks` @@ -9,8 +9,7 @@ ``` -```{admonition} User types -:class: tip +```{tip} This section is useful for user type 4-5. ``` From d55376cda426684065fd64815125abfa66348d97 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 2 Nov 2025 08:29:38 +0100 Subject: [PATCH 214/347] update margins --- book/features/draft-release.md | 21 +++++++++++++++----- book/features/favourites.md | 19 ++++++++++++++++-- book/features/release_book_online.md | 29 +++++++++++++++++++++++----- book/features/teachbooks_intro.md | 4 ++-- book/features/write_online.md | 28 +++++++++++++++++++++++---- 5 files changed, 83 insertions(+), 18 deletions(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 227d113..6a271e7 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -1,14 +1,25 @@ ````{margin} -```{admonition} User types -:class: tip +```{note} + +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` + +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` + +{bdg-link-light}`Supported by Deploy Book workflow <../external/deploy-book-workflow/README.html>` + +```{tip} This page is useful for user type 3-5. ``` -{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` -{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` -{bdg-link-light}`Supported by Deploy Book workflow <../external/deploy-book-workflow/README.html>` +```{seealso} + +[{octicon}`mark-github` Repository](https://github.com/TeachBooks/teachbooks) + +[{octicon}`book` Documentation](https://teachbooks.readthedocs.io/latest/cli/cli.html) + +``` ```` diff --git a/book/features/favourites.md b/book/features/favourites.md index cdd678e..55cb190 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -1,6 +1,13 @@ ````{margin} -```{admonition} User types -:class: tip + +```{note} +{bdg-primary}`Sphinx Extension` + +{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` + +``` + +```{tip} This page is useful for user type 3-5. ``` @@ -8,6 +15,14 @@ This page is useful for user type 3-5. {bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` +```{seealso} + +[{octicon}`mark-github` Repository](https://github.com/TeachBooks/TeachBooks-Favourites) + +[{octicon}`pencil` Exercise](https://teachbooks.io/template/extension_exercises/017.html) + +``` + ```` # TeachBooks Favourites diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index b5dd27c..98df709 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -1,12 +1,31 @@ ````{margin} -```{admonition} User types -:class: tip + +```{note} + +{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <../external/deploy-book-workflow/README.html>` + +{bdg-link-light}`Part of TeachBooks Template <../external/template/README.html>` + +{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` + +``` + +```{tip} This section is useful for user type 3-5. ``` -{bdg-link-light}`GitHub Reusable Action: Deploy Book workflow <../external/deploy-book-workflow/README.html>` -{bdg-link-light}`Part of TeachBooks Template <../external/template/README.html>` -{bdg-link-secondary}`Uses TeachBooks package <./teachbooks_intro.html>` +```{seealso} + +[{octicon}`mark-github` Repository deploy book workflow](https://github.com/TeachBooks/deploy-book-workflow) + +[{octicon}`book` Documentation](../installation-and-setup/versions_URLs.md) + +{octicon}`pencil` Exercises: +- [Your version of the book](https://teachbooks.io/template/exercises/004.html) +- [Deploy book workflow](https://teachbooks.io/template/extension_exercises/015.html) + +``` + ```` # Share book online for multiple versions diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index 22e1eab..b72a6b9 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -16,9 +16,9 @@ This section is useful for user type 4-5. ```{seealso} -[{octicon}`mark-github` repository](https://github.com/teachbooks/teachbooks) +[{octicon}`mark-github` Repository](https://github.com/teachbooks/teachbooks) -[{octicon}`book` documentation](https://teachbooks.readthedocs.io/) +[{octicon}`book` Documentation](https://teachbooks.readthedocs.io/) ``` diff --git a/book/features/write_online.md b/book/features/write_online.md index d919dd6..f0d0a02 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -1,15 +1,35 @@ ````{margin} -```{admonition} User types -:class: tip + +```{note} + +{bdg-link-light}`Uses Deploy Book workflow <../external/deploy-book-workflow/README.html>` + +{bdg-link-light}`Uses TeachBooks Template <../external/template/README.html>` + +``` + +```{tip} This section is useful for user type 3-5. ``` -{bdg-link-light}`Uses Deploy Book workflow <../external/deploy-book-workflow/README.html>` -{bdg-link-light}`Uses TeachBooks Template <../external/template/README.html>` +```{seealso} +[{octicon}`mark-github` Repository deploy book workflow](https://github.com/TeachBooks/deploy-book-workflow) + +[{octicon}`mark-github` Repository template](https://github.com/TeachBooks/template) + +[{octicon}`book` Documentation](../workflows/collaboration.md) + +{octicon}`pencil` Exercises: +- [First file edit](https://teachbooks.io/template/exercises/001.html) +- [Add a new file to the table of contents](https://teachbooks.io/template/exercises/002.html) +- [Change book configuration](https://teachbooks.io/template/exercises/003.html) +- [Syntax exercises](https://teachbooks.io/template/syntax_exercises.html) +``` ```` + # Write book fully in GitHub interface Using the GitHub tooling in combination with TeachBook's software, users are able to write their book fully online, without the need to install any software locally. This is especially useful for users that are not familiar with Git and GitHub, or do not have the rights to install software on their computer. To make this possible, users can start with the [TeachBooks Template](../external/template/README.md) after which they make use of the [Deploy Book Workflow](../external/deploy-book-workflow/README.md) to automatically build and release their book online. From 582aa690b1d40adbce1d775181789c18f437f7bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 07:35:09 +0000 Subject: [PATCH 215/347] Bump book/external/deploy-book-workflow from `65010c7` to `6801dcf` Bumps [book/external/deploy-book-workflow](https://github.com/TeachBooks/deploy-book-workflow) from `65010c7` to `6801dcf`. - [Release notes](https://github.com/TeachBooks/deploy-book-workflow/releases) - [Commits](https://github.com/TeachBooks/deploy-book-workflow/compare/65010c7dc0eff87eb4d7729ee251d0df221c44f8...6801dcfaedd1baf88ab51ebe360241e4eaf39ed2) --- updated-dependencies: - dependency-name: book/external/deploy-book-workflow dependency-version: 6801dcfaedd1baf88ab51ebe360241e4eaf39ed2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/deploy-book-workflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 65010c7..6801dcf 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 65010c7dc0eff87eb4d7729ee251d0df221c44f8 +Subproject commit 6801dcfaedd1baf88ab51ebe360241e4eaf39ed2 From 739cd512a4445d6a4207f9fb9b04f3427d1704f3 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 2 Nov 2025 08:35:12 +0100 Subject: [PATCH 216/347] typos --- book/features/draft-release.md | 2 ++ book/features/favourites.md | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/book/features/draft-release.md b/book/features/draft-release.md index 6a271e7..eaa75f9 100644 --- a/book/features/draft-release.md +++ b/book/features/draft-release.md @@ -9,6 +9,8 @@ {bdg-link-light}`Supported by Deploy Book workflow <../external/deploy-book-workflow/README.html>` +``` + ```{tip} This page is useful for user type 3-5. ``` diff --git a/book/features/favourites.md b/book/features/favourites.md index 55cb190..8252fb1 100644 --- a/book/features/favourites.md +++ b/book/features/favourites.md @@ -11,10 +11,6 @@ This page is useful for user type 3-5. ``` -{bdg-primary}`Sphinx Extension` -{bdg-link-light}`Included in TeachBooks Template <../external/template/README.html>` - - ```{seealso} [{octicon}`mark-github` Repository](https://github.com/TeachBooks/TeachBooks-Favourites) From beeb6f775ec2eb02467bdfcc8b504e473d9fbabe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 07:35:17 +0000 Subject: [PATCH 217/347] Bump book/external/template from `5183c16` to `6401393` Bumps [book/external/template](https://github.com/TeachBooks/template) from `5183c16` to `6401393`. - [Commits](https://github.com/TeachBooks/template/compare/5183c1616932c85a398e561124cf046288695101...6401393f8d50cc66ecba1e923cdbb221b7db0b3e) --- updated-dependencies: - dependency-name: book/external/template dependency-version: 6401393f8d50cc66ecba1e923cdbb221b7db0b3e dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- book/external/template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/external/template b/book/external/template index 5183c16..6401393 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 5183c1616932c85a398e561124cf046288695101 +Subproject commit 6401393f8d50cc66ecba1e923cdbb221b7db0b3e From a78f2f0af5006bd303205bc6948da61f85395614 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 2 Nov 2025 08:56:36 +0100 Subject: [PATCH 218/347] Update documentation for publishing book versions --- book/features/release_book_online.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index 98df709..3ae47b8 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -18,7 +18,7 @@ This section is useful for user type 3-5. [{octicon}`mark-github` Repository deploy book workflow](https://github.com/TeachBooks/deploy-book-workflow) -[{octicon}`book` Documentation](../installation-and-setup/versions_URLs.md) +[{octicon}`book` Publish version on separate (fixed) URLs](../installation-and-setup/versions_URLs.md) {octicon}`pencil` Exercises: - [Your version of the book](https://teachbooks.io/template/exercises/004.html) @@ -254,4 +254,4 @@ Unlike the virtual environments (next subsection), caches of the book build do n ### Effect of Caching on Virtual Environment -In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](./update_env.md). \ No newline at end of file +In particular, note that older branches may have been built with cached environments that are different than those in a newer branch, leading to (undesired) differences in book appearance or functionality---often without the author being aware! This occurs if a package in `requirements.txt` is updated in the time between the creation of environments on different branches, as `pip` will use the newest version when downloading a package (the first time a venv cache is created in the DBW), but it will not always automatically update a package if `pip install -r requirements.txt` is used on an existing environment (this happens every time an existing cache is used!). This means that, when compared to the venv on a newer branch, a frequently used branch (where the cache has not expired) may retain old and out of date packages long after an updated version is available; however, since the week number is included in the venv file hash, this will last for a maximum of 1 week. A best practice to avoid this situation is to pin version numbers explicitly (e.g., `teachbooks==0.2.0`) if you want book builds to remain consistent. In addition, a feature like dependabot can be used to automatically notify you when an update is made; this is [here](./update_env.md). From 5126a57e676876f8526f1c295f2360f92f685c18 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Sun, 2 Nov 2025 08:57:51 +0100 Subject: [PATCH 219/347] Update documentation for collaborative book editing --- book/features/write_online.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/features/write_online.md b/book/features/write_online.md index f0d0a02..40fa9be 100644 --- a/book/features/write_online.md +++ b/book/features/write_online.md @@ -18,7 +18,7 @@ This section is useful for user type 3-5. [{octicon}`mark-github` Repository template](https://github.com/TeachBooks/template) -[{octicon}`book` Documentation](../workflows/collaboration.md) +[{octicon}`book` Collaborative book-editing](../workflows/collaboration.md) {octicon}`pencil` Exercises: - [First file edit](https://teachbooks.io/template/exercises/001.html) From 816d78262620e6127b4bd2867b93cf1f645e8597 Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 3 Nov 2025 13:58:19 +0100 Subject: [PATCH 220/347] Fix borken jupyterbook links --- README.md | 2 +- book/_static/figuurWidget.js | 2 +- book/basic-features/badges.md | 6 +++--- book/basic-features/banner.md | 2 +- book/basic-features/code.md | 4 ++-- book/basic-features/figures.md | 2 +- book/basic-features/jupyterbook.md | 2 +- book/basic-features/overview.md | 2 +- book/external/Sphinx-Grasple-public | 2 +- book/external/deploy-book-workflow | 2 +- book/external/template | 2 +- book/features/apa.md | 4 ++-- book/features/live_code.ipynb | 2 +- book/features/release_book_online.md | 2 +- book/features/teachbooks_intro.md | 2 +- book/installation-and-setup/collab.md | 2 +- book/installation-and-setup/jupyter-book-setup.md | 6 +++--- book/intro.md | 2 +- book/intro/book.md | 2 +- book/intro/workflow.md | 2 +- 20 files changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 832a3c7..bc19dcd 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) [![call-deploy-book](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml/badge.svg)](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml) -This manual assists you in creating and collaborating on [JupyterBooks](https://jupyterbook.org/) for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start and advanced usages for new and existing users with or without skills on this topic. it is part of TeachBooks, for more information visit [https://teachbooks.io/](https://teachbooks.io/). +This manual assists you in creating and collaborating on [JupyterBooks](https://jupyterbook.org/v1/) for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start and advanced usages for new and existing users with or without skills on this topic. it is part of TeachBooks, for more information visit [https://teachbooks.io/](https://teachbooks.io/). ## Contact If you encounter any issues and you have a TU Delft account, report it by clicking the github icon and lightbulb on the top right corner of this page. Or contribute directly by creating a merge request in the [repository](https://github.com/Teachbooks/manual). diff --git a/book/_static/figuurWidget.js b/book/_static/figuurWidget.js index e5801fd..64f9faa 100644 --- a/book/_static/figuurWidget.js +++ b/book/_static/figuurWidget.js @@ -255,7 +255,7 @@ const createFigureReference = (path, name, caption) => { + "{numref}`{number} <" + name + ">`"; } -//Via https://jupyterbook.org/en/stable/content/references.html#reference-tables +//Via https://jupyterbook.org/v1/content/references.html#reference-tables const createTableReference = (caption, name) => { return " tabel code:
" +"```{table} " + caption + "
" diff --git a/book/basic-features/badges.md b/book/basic-features/badges.md index 6fe1ad2..cc165d6 100644 --- a/book/basic-features/badges.md +++ b/book/basic-features/badges.md @@ -1,6 +1,6 @@ # Badges, Buttons & Icons -Jupyter book provides a range of features which are visually appealing and functional. These elements can enhance the interactivity and visual design of your book, offering additional information or links in a compact and visually engaging way. The badges, buttons and icons are made available through Sphinx and they themselves wrote a [documentation](https://sphinx-design.readthedocs.io/en/latest/badges_buttons.html) about it. +Jupyter book provides a range of features which are visually appealing and functional. These elements can enhance the interactivity and visual design of your book, offering additional information or links in a compact and visually engaging way. The badges, buttons and icons are made available through Sphinx and they themselves wrote a [documentation](https://sphinx-design.readthedocs.io/en/latest/badges_buttons.html) about it. (my_ref)= ## Badges @@ -119,12 +119,12 @@ To add an icon, use the following syntax: **1. Image Icons** -Let's have a look at the first sentence of this chapter again: Jupyter book provides a range of features which are visually appealing and functional. +Let's have a look at the first sentence of this chapter again: Jupyter book provides a range of features which are visually appealing and functional. Here the Jupyter-book logo was inserted for a more professional look. It's including a link `href` and and image saved as `../images/logo-wide.svg` ``` -Jupyter book provides a range of features which are visually appealing and functional. +Jupyter book provides a range of features which are visually appealing and functional. ``` **2. SVG Icons** diff --git a/book/basic-features/banner.md b/book/basic-features/banner.md index f92f110..d9598bf 100644 --- a/book/basic-features/banner.md +++ b/book/basic-features/banner.md @@ -10,7 +10,7 @@ name: banner_mude Example of a banner in the MUDE book. ``` -This is a commonly used feature, described in the [Jupyter Book manual here](https://jupyterbook.org/en/stable/web/announcements.html). However, note that if you are using the Sphinx-Thebe interactive Python feature, or other features that customize the top part of a Jupyter Book website (for example, the download page buttons), the banner does not always work. In this case, the banner should be specified using the `announcement` option in the `html_theme_options` setting in the `_config.yml` file: +This is a commonly used feature, described in the [Jupyter Book manual here](https://jupyterbook.org/v1/web/announcements.html). However, note that if you are using the Sphinx-Thebe interactive Python feature, or other features that customize the top part of a Jupyter Book website (for example, the download page buttons), the banner does not always work. In this case, the banner should be specified using the `announcement` option in the `html_theme_options` setting in the `_config.yml` file: ``` sphinx: diff --git a/book/basic-features/code.md b/book/basic-features/code.md index 0b78694..85ecac6 100644 --- a/book/basic-features/code.md +++ b/book/basic-features/code.md @@ -6,9 +6,9 @@ Note that if you are using a `*.ipynb` file or including a code snippet in a `*. When making notebooks for the Book, you might want to hide certain cells from the reader. For example, when including a simple figure generated from code or making a JupyterQuiz, we have to execute a code cell that generates the quiz. This code cell is ugly and distracting, so we do not want to render this in the final book. -We can change how the compiler treats notebook cells by using cell tags. You can find a detailed explanation on cell tags [here](https://jupyterbook.org/en/stable/interactive/hiding.html?highlight=cell%20tag). Specifically, have a look at the sections on *hiding* cell inputs and *removing* cell inputs. +We can change how the compiler treats notebook cells by using cell tags. You can find a detailed explanation on cell tags [here](https://jupyterbook.org/v1/interactive/hiding.html?highlight=cell%20tag). Specifically, have a look at the sections on *hiding* cell inputs and *removing* cell inputs. -The workflow of editing cell tags depends on your editor. If you're using Jupyter Lab, you can find instructions [here](https://jupyterbook.org/en/stable/content/metadata.html#jupyter-cell-tags). +The workflow of editing cell tags depends on your editor. If you're using Jupyter Lab, you can find instructions [here](https://jupyterbook.org/v1/content/metadata.html#jupyter-cell-tags). For example, the following tag is used to convert the code input into either a drop-down (`hide-input`) or make it invisible (replace `hide-input` with `remove-input`). Replace `input` with `output` to do the same with the cell output: ``` diff --git a/book/basic-features/figures.md b/book/basic-features/figures.md index 97d82ee..3fecfae 100644 --- a/book/basic-features/figures.md +++ b/book/basic-features/figures.md @@ -39,7 +39,7 @@ example 1: width (70%) as percentage, align center Using the name label, you can refer to the figure as done with {numref}`Figure {number} `. -You can find more documentation on including figures [here](https://jupyterbook.org/en/stable/content/figures.html).
+You can find more documentation on including figures [here](https://jupyterbook.org/v1/content/figures.html).
There are many settings, for instance aligning right: diff --git a/book/basic-features/jupyterbook.md b/book/basic-features/jupyterbook.md index 22dc777..12f9f2d 100644 --- a/book/basic-features/jupyterbook.md +++ b/book/basic-features/jupyterbook.md @@ -32,7 +32,7 @@ Technically speaking, a `_config.yml` file is not required to build a Jupyter Bo In addition, the following option can also be useful: -- `execute_notebooks`: *turn on/off* the execution of Jupyter Notebooks during the build process. *On* by default. If you perform heavy computations in your notebook (machine learning, FEM models, et cetera), you might be better off running the notebooks on a more powerful machine as opposed to the CI/CD server. To turn it off, specify the value `'off'`. You can also exclude specific notebooks by creating exclude patterns in the filenames. For more info, see the [Jupyter Book documentation](https://jupyterbook.org/en/stable/content/execute.html#exclude-files-from-execution). +- `execute_notebooks`: *turn on/off* the execution of Jupyter Notebooks during the build process. *On* by default. If you perform heavy computations in your notebook (machine learning, FEM models, et cetera), you might be better off running the notebooks on a more powerful machine as opposed to the CI/CD server. To turn it off, specify the value `'off'`. You can also exclude specific notebooks by creating exclude patterns in the filenames. For more info, see the [Jupyter Book documentation](https://jupyterbook.org/v1/content/execute.html#exclude-files-from-execution). ```{warning} diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index eb75beb..a89cb8d 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -7,4 +7,4 @@ This section is useful for [user type 3-5](../installation-and-setup/user_types. # Overview -These pages itemize some of the more common, basic book features which are all available in the original Jupyter book package, without requiring any additional software. They are, of course, selected with teachers and teaching applications in mind. On each page best-practices are illustrated. +These pages itemize some of the more common, basic book features which are all available in the original Jupyter book package, without requiring any additional software. They are, of course, selected with teachers and teaching applications in mind. On each page best-practices are illustrated. diff --git a/book/external/Sphinx-Grasple-public b/book/external/Sphinx-Grasple-public index 2ca3894..95a060e 160000 --- a/book/external/Sphinx-Grasple-public +++ b/book/external/Sphinx-Grasple-public @@ -1 +1 @@ -Subproject commit 2ca3894ef285f238cae1ba120ccf2c0f36e73b31 +Subproject commit 95a060e2dab5490a362c7f25a8b8954c6cd2aaa7 diff --git a/book/external/deploy-book-workflow b/book/external/deploy-book-workflow index 65010c7..2cb7fc3 160000 --- a/book/external/deploy-book-workflow +++ b/book/external/deploy-book-workflow @@ -1 +1 @@ -Subproject commit 65010c7dc0eff87eb4d7729ee251d0df221c44f8 +Subproject commit 2cb7fc38e67d0aa486829027baee61d46c213e75 diff --git a/book/external/template b/book/external/template index 5183c16..1064963 160000 --- a/book/external/template +++ b/book/external/template @@ -1 +1 @@ -Subproject commit 5183c1616932c85a398e561124cf046288695101 +Subproject commit 1064963a9393a4a910d05435759887610d05bca5 diff --git a/book/features/apa.md b/book/features/apa.md index aad0ff9..5a4af37 100644 --- a/book/features/apa.md +++ b/book/features/apa.md @@ -85,7 +85,7 @@ Here are three examples for making citations: |`{cite:p}`| {cite:p}`jason_moore` | |`{cite}`| {cite}`jason_moore` | -For more options on the in-line citation style, see https://jupyterbook.org/en/stable/content/citations.html#change-the-in-line-citation-style. +For more options on the in-line citation style, see https://jupyterbook.org/v1/content/citations.html#change-the-in-line-citation-style. ### Known Issues @@ -97,7 +97,7 @@ Two issues are known: The extension is based on [`pybtex`](https://pybtex.org/), which is a BibTeX-compatible bibliography processor in Python that is extendible with plugins. -Although some customization is possible with the standard Jupyter Book features, [as described here](https://jupyterbook.org/en/stable/content/citations.html#change-the-in-line-citation-style), this extension implements the complete APA style, as well as enforcing round brackets (like this). +Although some customization is possible with the standard Jupyter Book features, [as described here](https://jupyterbook.org/v1/content/citations.html#change-the-in-line-citation-style), this extension implements the complete APA style, as well as enforcing round brackets (like this). The need to include a CSS file is an easy solution to the issue where empty brackets `[]` are left on the references page (to try it, simply delete `apastyle.css`). diff --git a/book/features/live_code.ipynb b/book/features/live_code.ipynb index 6674962..4b65144 100644 --- a/book/features/live_code.ipynb +++ b/book/features/live_code.ipynb @@ -95,7 +95,7 @@ "\n", "By `launch_buttons` you initiate the {fa}`rocket` --> {guilabel}`Live Code` on the top right corner of every page generated from a `.ipynb` file. \n", "\n", - "Note, if you're messing around with `html_theme_options` (for example when adding more buttons), all button behaviour is affected. In that case, as opposed to the jupyter book documentation, all buttons have to be specified from within `sphinx: html_theme_options` where you might also specify other buttons as well (ie. the [code repository button](https://jupyterbook.org/en/stable/basics/repository.html)).\n", + "Note, if you're messing around with `html_theme_options` (for example when adding more buttons), all button behaviour is affected. In that case, as opposed to the jupyter book documentation, all buttons have to be specified from within `sphinx: html_theme_options` where you might also specify other buttons as well (ie. the [code repository button](https://jupyterbook.org/v1/basics/repository.html)).\n", "\n", "```yaml\n", "sphinx:\n", diff --git a/book/features/release_book_online.md b/book/features/release_book_online.md index 98df709..527e8e9 100644 --- a/book/features/release_book_online.md +++ b/book/features/release_book_online.md @@ -118,7 +118,7 @@ One possible modification to this setup would be if you are progressively releas - Set `PRIMARY_BRANCH` to `2024` - Set `BEHAVIOR_PRIMARY` to `copy` -As your current students may then accidentally go to the older version of the book, we recommend you use a banner to indicate to readers that there is a (partial) new version available, and advise them where to find it. You can add a banner using this workflow (`BRANCHES_ARCHIVED`) or the [standard Jupyter Book banner feature](https://jupyterbook.org/en/stable/web/announcements.html). +As your current students may then accidentally go to the older version of the book, we recommend you use a banner to indicate to readers that there is a (partial) new version available, and advise them where to find it. You can add a banner using this workflow (`BRANCHES_ARCHIVED`) or the [standard Jupyter Book banner feature](https://jupyterbook.org/v1/web/announcements.html). ### Books with active editors working in parallel diff --git a/book/features/teachbooks_intro.md b/book/features/teachbooks_intro.md index b72a6b9..a08c35b 100644 --- a/book/features/teachbooks_intro.md +++ b/book/features/teachbooks_intro.md @@ -30,7 +30,7 @@ This section is useful for user type 4-5. The TeachBooks Python package is a collection of tools that are used to enhance the Jupyter Book software package by adding features and making customization easier. In general, it is only of interest to user types 4 and 5 when building a book locally. However, it may be important for other users to know what the package does, as it is incorporated in the [Deploy Book Workflow](../external/deploy-book-workflow/README.md) and, therefore, any book created from the [TeachBooks Template](../external/template/README.md). This raises two important points: 1. If you are a book user using the [TeachBooks Template](../external/template/README.md) and/or the [Deploy Book Workflow](../external/deploy-book-workflow/README.md), your book is by default built with the `teachbooks` package, and the way your book is built and features that are included in the book may change automatically when it is updated (these will be non-breaking changes; if not, we will notify our mailing list). -2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/en/stable/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/en/stable/publish/gh-pages.html). +2. If you are using the `jupyter-book` package to build your book, some of the features described in this Manual may not be available to you (i.e., those listed on this page). This will be the case if you are using a [setup described in the Jupyter Book Manual](https://jupyterbook.org/v1/publish/web.html), for example, [this GitHub workflow](https://jupyterbook.org/v1/publish/gh-pages.html). For those who wish to use the package, it is available on [PyPI](https://pypi.org/project/teachbooks/) and can be installed using `pip install teachbooks`. As `teachbooks` is a wrapper, the package is meant to replace the usage of `jupyter-book` commands (although it does indeed add a few new commands to the CLI, e.g., `serve`). It is conventionally used in an identical way, as follows: diff --git a/book/installation-and-setup/collab.md b/book/installation-and-setup/collab.md index 73ca862..c09090c 100644 --- a/book/installation-and-setup/collab.md +++ b/book/installation-and-setup/collab.md @@ -15,7 +15,7 @@ Finally, ensure that team members identify themselves according to the user type ## Review process Furthermore, establish a clear editing and review process. -For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {octicon}`mark-github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/en/stable/basics/repository.html) is advised. +For the editing process, establish some practical rules on whether to use issues, branches and forks for adding content, fixing typos or making other changes. Furthermore, it can help to write down when you expect (draft) merge/pull requests and how to use the assign and review options in GitHub/GitLab. It is advisable to have at least a maintainer review each piece of content to maintain quality and consistency. Provide explanation on how you organize the book-editing and how you'd like to receive feedback in both the readme as the published book. The use of the [repository button {octicon}`mark-github`, suggest edit {fa}`pencil` and issue button {fa}`lightbulb`](https://jupyterbook.org/v1/basics/repository.html) is advised. (draft_book)= ## Define draft version of book diff --git a/book/installation-and-setup/jupyter-book-setup.md b/book/installation-and-setup/jupyter-book-setup.md index 066c6d8..0c0fb97 100644 --- a/book/installation-and-setup/jupyter-book-setup.md +++ b/book/installation-and-setup/jupyter-book-setup.md @@ -7,9 +7,9 @@ This page is useful for user type 5. # Build your book: JupyterBook -Jupyter book is a regular Python package which converts our content into a website. It's part of all of the `requirements.txt` files for a book repository. At TeachBooks we developed a Python package called `teachbooks` which takes over the these features and adds [additional features](../features/overview.md). One of those additional features, for example, is the workflow to GitHub Pages. +Jupyter book is a regular Python package which converts our content into a website. It's part of all of the `requirements.txt` files for a book repository. At TeachBooks we developed a Python package called `teachbooks` which takes over the these features and adds [additional features](../features/overview.md). One of those additional features, for example, is the workflow to GitHub Pages. -Concretely, this means that the teachbooks package can be used to replace the Jupyter book package when calling these features. You could think of it as `jupyter-book` being a dependency of `teachbooks`. +Concretely, this means that the teachbooks package can be used to replace the Jupyter book package when calling these features. You could think of it as `jupyter-book` being a dependency of `teachbooks`. ```{admonition} Note :class: tip @@ -18,7 +18,7 @@ Don't forget to add the package `teachbooks` in the `requirements.txt` files in ## Build a book -As soon as you've installed your book environment with jupyter-book you can build your book locally. The official Jupyter book documentation is quite extensive. You can navigate to the directory where your book is to leave out the `path-to-book`. +As soon as you've installed your book environment with jupyter-book you can build your book locally. The official Jupyter book documentation is quite extensive. You can navigate to the directory where your book is to leave out the `path-to-book`. ``` teachbooks build diff --git a/book/intro.md b/book/intro.md index efef43c..325cb6d 100644 --- a/book/intro.md +++ b/book/intro.md @@ -1,6 +1,6 @@ # TeachBooks Manual -This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on Jupyter book. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users with many additional features developed for education-purposes. We hope you find this resource useful and refer back to it often. +This manual is primarily designed for and by teachers for use in education, but should be a useful resource for anyone interested in creating and collaborating on Jupyter book. Our aim is to provide a simple way to start book-making for new users (it only takes 10 clicks!) through advanced usage for experienced users with many additional features developed for education-purposes. We hope you find this resource useful and refer back to it often. TeachBooks originated at Delft University of Technology in the Netherlands, and some of the material in this Manual reflects tools and resources specific to TU Delft. With the exception of a few tools for which we have educational licenses at Delft, everything in this Manual is open source. Despite this, we are happy to grow our open source community beyond Delft and welcome contributions from all users. diff --git a/book/intro/book.md b/book/intro/book.md index d70bfb6..86b6b0b 100644 --- a/book/intro/book.md +++ b/book/intro/book.md @@ -6,7 +6,7 @@ Never seen a TeachBook before? Here's a small demo of the MUDE-book! :class: blend ``` -So what are you looking at? It's a website generated with the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) which in turn makes use of many other tools, of which [Jupyter Book package](https://jupyterbook.org/) and [Sphinx](https://www.sphinx-doc.org/) are the most prominent. Various extensions have been added to improve the student-experience, especially for technical topics! With TeachBooks we aim to make it easy to collaboratively use it, even if you've little experience with the software package which is part of it. +So what are you looking at? It's a website generated with the [TeachBooks package](https://github.com/TeachBooks/TeachBooks) which in turn makes use of many other tools, of which [Jupyter Book package](https://jupyterbook.org/v1/) and [Sphinx](https://www.sphinx-doc.org/) are the most prominent. Various extensions have been added to improve the student-experience, especially for technical topics! With TeachBooks we aim to make it easy to collaboratively use it, even if you've little experience with the software package which is part of it. ## Three Key Ingredients diff --git a/book/intro/workflow.md b/book/intro/workflow.md index bc0c038..a472ace 100644 --- a/book/intro/workflow.md +++ b/book/intro/workflow.md @@ -26,7 +26,7 @@ Let's create a space for you idea to form. You can create your own version of th width: 100px align: right ``` -Creativity activated, let's start adding content to your book! You'll add text, images, videos, math, interactive quizes, coding, widgets, etc. As editing the book is not directly done in a graphical interface with buttons like Microsoft Word, you'll need to learn a bit of syntax. The [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) will be added to your bookmarks. The changes you'll make have to be added to the GitHub version control system, creating `commits` on the your git `branch`. +Creativity activated, let's start adding content to your book! You'll add text, images, videos, math, interactive quizes, coding, widgets, etc. As editing the book is not directly done in a graphical interface with buttons like Microsoft Word, you'll need to learn a bit of syntax. The [MyST syntax cheat sheet](https://jupyterbook.org/v1/reference/cheatsheet.html) will be added to your bookmarks. The changes you'll make have to be added to the GitHub version control system, creating `commits` on the your git `branch`. ## 4 check changes ```{figure} figures/check.png From fdf2d7c5ef45e501d6234063ce3e15e04742d03e Mon Sep 17 00:00:00 2001 From: Tom van Woudenberg Date: Mon, 3 Nov 2025 17:48:38 +0100 Subject: [PATCH 221/347] Jupyterbook v1 and teachbooks --- .github/workflows/call-deploy-book.yml | 2 +- CITATION.cff | 2 +- README.md | 4 ++-- book/_toc.yml | 2 +- book/basic-features/badges.md | 8 ++++---- book/basic-features/banner.md | 4 ++-- book/basic-features/code.md | 4 ++-- book/basic-features/equations.md | 2 +- book/basic-features/jupyterbook.md | 15 +++++++-------- book/basic-features/overview.md | 2 +- book/basic-features/videos.md | 4 ++-- book/examples/book_structure.md | 4 ++-- book/examples/example_gumbel.ipynb | 4 ++-- book/examples/interactive_templates.md | 4 ++-- book/examples/overview.md | 2 +- book/external/Download-Link-Replacer | 2 +- book/external/JupyterBook-Patches | 2 +- book/external/Nested-Books | 2 +- book/external/Sphinx-Grasple-public | 2 +- book/external/Sphinx-Image-Inverter | 2 +- book/external/Sphinx-TUDelft-theme | 2 +- book/external/Sphinx-launch-buttons | 2 +- book/external/deploy-book-workflow | 2 +- book/external/template | 2 +- book/features/apa.md | 6 +++--- book/features/buildbook.md | 2 +- book/features/custom-launch-button.md | 2 +- book/features/draft-release.md | 2 +- book/features/h5p.md | 2 +- book/features/jupyterlite/configuration.md | 6 +++--- book/features/jupyterlite/jupyterlite.md | 2 +- book/features/live_code.ipynb | 6 +++--- book/features/local_server.md | 2 +- book/features/overview.md | 2 +- book/features/pull_request_build.md | 2 +- book/features/release_book_online.md | 2 +- book/features/sphinx_extensions.md | 2 +- book/features/teachbooks_intro.md | 4 ++-- book/features/update_env.md | 2 +- book/features/widgets.ipynb | 6 +++--- book/helper_code/converter.md | 2 +- book/helper_code/intro.md | 2 +- book/installation-and-setup/anaconda.md | 4 ++-- book/installation-and-setup/copyright/licenses.md | 2 +- .../copyright/recommendations.md | 2 +- book/installation-and-setup/git-setup_local.md | 2 +- .../git_bash_conda_vs-code.md | 2 +- book/installation-and-setup/jupyter-book-setup.md | 6 +++--- book/installation-and-setup/overview.md | 2 +- book/installation-and-setup/user_types.md | 4 ++-- book/installation-and-setup/vscode-setup.md | 2 +- book/intro.md | 4 ++-- book/intro/next.md | 2 +- book/intro/template.md | 4 ++-- book/workflows/collaboration.md | 2 +- book/workflows/edit_book.md | 2 +- book/workflows/user45_check_changes.md | 2 +- 57 files changed, 88 insertions(+), 89 deletions(-) diff --git a/.github/workflows/call-deploy-book.yml b/.github/workflows/call-deploy-book.yml index 43745e9..8a86e57 100644 --- a/.github/workflows/call-deploy-book.yml +++ b/.github/workflows/call-deploy-book.yml @@ -5,7 +5,7 @@ on: branches: - '**' # - '!dependabot**' - # If your git repository has the Jupyter Book within some-subfolder next to + # If your git repository has the TeachBooks / Jupyter Book v1 within some-subfolder next to # unrelated files, you can make this run only if a file within that specific # folder (or the workflow file itself) has been modified. # diff --git a/CITATION.cff b/CITATION.cff index 72d95e1..971b3d2 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -26,7 +26,7 @@ preferred-citation: value: 'https://github.com/TeachBooks/manual' description: 'GitHub repository' abstract: >- - his manual assists you in creating and collaborating on JupyterBooks + his manual assists you in creating and collaborating on TeachBooks for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start diff --git a/README.md b/README.md index bc19dcd..f70233d 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,14 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.15100848.svg)](https://doi.org/10.5281/zenodo.15100848) [![call-deploy-book](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml/badge.svg)](https://github.com/TeachBooks/manual/actions/workflows/call-deploy-book.yml) -This manual assists you in creating and collaborating on [JupyterBooks](https://jupyterbook.org/v1/) for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start and advanced usages for new and existing users with or without skills on this topic. it is part of TeachBooks, for more information visit [https://teachbooks.io/](https://teachbooks.io/). +This manual assists you in creating and collaborating on TeachBooks: [JupyterBooks v1](https://jupyterbook.org/v1/) for educational purposes. Some parts are specifically aimed for teachers at Delft University of Technology, although all material and tools are openly available. This manual aims at providing an easy start and advanced usages for new and existing users with or without skills on this topic. it is part of TeachBooks, for more information visit [https://teachbooks.io/](https://teachbooks.io/). ## Contact If you encounter any issues and you have a TU Delft account, report it by clicking the github icon and lightbulb on the top right corner of this page. Or contribute directly by creating a merge request in the [repository](https://github.com/Teachbooks/manual). If you have questions, contact the TeachBooks Development Team at info@teackbooks.io, also for non-TU Delft account holders. You can also contact us in our [GitHub discussions](https://github.com/orgs/TeachBooks/discussions) -We really value your feedback on this manual. This helps us improving it. Please keep using the manual as you build your own Jupyter Book and come back to fill out this short [survey](https://forms.gle/hXbFUQgN95H8ftxt9). +We really value your feedback on this manual. This helps us improving it. Please keep using the manual as you build your own TeachBooks and come back to fill out this short [survey](https://forms.gle/hXbFUQgN95H8ftxt9). ## Contribute This book will continue to develop, so feel free to contribute https://github.com/TeachBooks/manual! You can do so directly by forking this repository and creating a merge request. diff --git a/book/_toc.yml b/book/_toc.yml index 9ad0ef5..7a2e1c6 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -101,7 +101,7 @@ parts: sections: - file: external/annotater/README.md - file: basic-features/hypothesis.md - - caption: Original Jupyter Book and Sphinx Features + - caption: Original Jupyter Book v1 and Sphinx Features chapters: - file: basic-features/overview.md sections: diff --git a/book/basic-features/badges.md b/book/basic-features/badges.md index cc165d6..41cf07a 100644 --- a/book/basic-features/badges.md +++ b/book/basic-features/badges.md @@ -1,6 +1,6 @@ # Badges, Buttons & Icons -Jupyter book provides a range of features which are visually appealing and functional. These elements can enhance the interactivity and visual design of your book, offering additional information or links in a compact and visually engaging way. The badges, buttons and icons are made available through Sphinx and they themselves wrote a [documentation](https://sphinx-design.readthedocs.io/en/latest/badges_buttons.html) about it. +Jupyter book v1 provides a range of features which are visually appealing and functional. These elements can enhance the interactivity and visual design of your book, offering additional information or links in a compact and visually engaging way. The badges, buttons and icons are made available through Sphinx and they themselves wrote a [documentation](https://sphinx-design.readthedocs.io/en/latest/badges_buttons.html) about it. (my_ref)= ## Badges @@ -36,7 +36,7 @@ Here's an overview of all the available colours: ## Buttons -Buttons provide a way to create clickable elements that are more attractive than links, for example, to link to key sections of your book such as downloads or external resources. Jupyter-Book supports buttons using Markdown making them highly customizable. It is possible to link to external websites as well as chapters within your book. To link to an external page, use `{button-link}`. `{button-ref}` must be used when linking to a part within your book. +Buttons provide a way to create clickable elements that are more attractive than links, for example, to link to key sections of your book such as downloads or external resources. Jupyter-Book v1 supports buttons using Markdown making them highly customizable. It is possible to link to external websites as well as chapters within your book. To link to an external page, use `{button-link}`. `{button-ref}` must be used when linking to a part within your book. The basic code syntax for creating a button is as follows: @@ -119,12 +119,12 @@ To add an icon, use the following syntax: **1. Image Icons** -Let's have a look at the first sentence of this chapter again: Jupyter book provides a range of features which are visually appealing and functional. +Let's have a look at the first sentence of this chapter again: Jupyter book v1 provides a range of features which are visually appealing and functional. Here the Jupyter-book logo was inserted for a more professional look. It's including a link `href` and and image saved as `../images/logo-wide.svg` ``` -Jupyter book provides a range of features which are visually appealing and functional. +Jupyter book v1 provides a range of features which are visually appealing and functional. ``` **2. SVG Icons** diff --git a/book/basic-features/banner.md b/book/basic-features/banner.md index d9598bf..f61f9d1 100644 --- a/book/basic-features/banner.md +++ b/book/basic-features/banner.md @@ -1,6 +1,6 @@ # Banners and Announcements -A banner can be added to the top of a Jupyter Book: +A banner can be added to the top of a TeachBook: ```{figure} banner_mude.png --- @@ -10,7 +10,7 @@ name: banner_mude Example of a banner in the MUDE book. ``` -This is a commonly used feature, described in the [Jupyter Book manual here](https://jupyterbook.org/v1/web/announcements.html). However, note that if you are using the Sphinx-Thebe interactive Python feature, or other features that customize the top part of a Jupyter Book website (for example, the download page buttons), the banner does not always work. In this case, the banner should be specified using the `announcement` option in the `html_theme_options` setting in the `_config.yml` file: +This is a commonly used feature, described in the [Jupyter Book v1 manual here](https://jupyterbook.org/v1/web/announcements.html). However, note that if you are using the Sphinx-Thebe interactive Python feature, or other features that customize the top part of a TeachBook (for example, the download page buttons), the banner does not always work. In this case, the banner should be specified using the `announcement` option in the `html_theme_options` setting in the `_config.yml` file: ``` sphinx: diff --git a/book/basic-features/code.md b/book/basic-features/code.md index 85ecac6..5036154 100644 --- a/book/basic-features/code.md +++ b/book/basic-features/code.md @@ -2,9 +2,9 @@ There are two main ways to include code: directly within a Markdown file or within a Jupyter notebook. More methods are available, but we don't include them here. The first option is great for including simple calculations, or generating simple figures when an image file is not practical. *More will be added later.* -Note that if you are using a `*.ipynb` file or including a code snippet in a `*.md` file, including a blank line between the text and the closing three tick marks will generate an empty code box of one line in the Jupyter Book. +Note that if you are using a `*.ipynb` file or including a code snippet in a `*.md` file, including a blank line between the text and the closing three tick marks will generate an empty code box of one line in the TeachBook. -When making notebooks for the Book, you might want to hide certain cells from the reader. For example, when including a simple figure generated from code or making a JupyterQuiz, we have to execute a code cell that generates the quiz. This code cell is ugly and distracting, so we do not want to render this in the final book. +When making notebooks for the TeachBook, you might want to hide certain cells from the reader. For example, when including a simple figure generated from code or making a JupyterQuiz, we have to execute a code cell that generates the quiz. This code cell is ugly and distracting, so we do not want to render this in the final book. We can change how the compiler treats notebook cells by using cell tags. You can find a detailed explanation on cell tags [here](https://jupyterbook.org/v1/interactive/hiding.html?highlight=cell%20tag). Specifically, have a look at the sections on *hiding* cell inputs and *removing* cell inputs. diff --git a/book/basic-features/equations.md b/book/basic-features/equations.md index 5ec7a99..6223cc1 100644 --- a/book/basic-features/equations.md +++ b/book/basic-features/equations.md @@ -45,5 +45,5 @@ Equation {eq}`show_newtons_second_law` can now be referred to. > **Note** > -> The Jupyter Book uses MathJax to display equations, which provides some LaTeX-like functionality, but not all! For example, the Euro symbol is missing, and packages like `siunitx` are not available (hint, use `\textrm{}` and `\textrm{}`). When something is not working, it's useful to search for MathJax-specific solutions (hint, include "mathjax" in your Google search). +> The TeachBook uses MathJax to display equations, which provides some LaTeX-like functionality, but not all! For example, the Euro symbol is missing, and packages like `siunitx` are not available (hint, use `\textrm{}` and `\textrm{}`). When something is not working, it's useful to search for MathJax-specific solutions (hint, include "mathjax" in your Google search). > \ No newline at end of file diff --git a/book/basic-features/jupyterbook.md b/book/basic-features/jupyterbook.md index 12f9f2d..a9d7a91 100644 --- a/book/basic-features/jupyterbook.md +++ b/book/basic-features/jupyterbook.md @@ -1,18 +1,17 @@ -# Anatomy of a Jupyter Book +# Anatomy of a TeachBook -To build a Jupyter Book, you need three things: +To build a TeachBook, you need three things: 1. A configuration file 2. A table of contents 3. Content ## The configuration file -The configuration file of Jupyter Books is named `_config.yml`. It mainly contains settings that apply when building the book. Here is a basic example of a configuration file, taken from this book: +The configuration file of TeachBooks is named `_config.yml`. It mainly contains settings that apply when building the book. Here is a basic example of a configuration file, taken from this book: ```yaml -title: Jupyter Book Manual -author: Interactive Textbooks CiTG -logo: images/TUDelft_logo_rgb.png +title: TeachBook Manual +author: TeachBooks development team copyright: CC BY-NC execute: @@ -23,7 +22,7 @@ sphinx: - sphinx_inline_tabs ``` -Technically speaking, a `_config.yml` file is not required to build a Jupyter Book. If you don't make one, `jupyter book` will just use all default values. However, you should make a configuration file which includes at least the following settings: +Technically speaking, a `_config.yml` file is not required to build a TeachBook. If you don't make one, your TeachBook will just use all default values. However, you should make a configuration file which includes at least the following settings: - `title`: the title of your book, which appears on the top-left of every page, under the logo. - `author`: authors of the book, which appears in the bottom margin of every page. @@ -32,7 +31,7 @@ Technically speaking, a `_config.yml` file is not required to build a Jupyter Bo In addition, the following option can also be useful: -- `execute_notebooks`: *turn on/off* the execution of Jupyter Notebooks during the build process. *On* by default. If you perform heavy computations in your notebook (machine learning, FEM models, et cetera), you might be better off running the notebooks on a more powerful machine as opposed to the CI/CD server. To turn it off, specify the value `'off'`. You can also exclude specific notebooks by creating exclude patterns in the filenames. For more info, see the [Jupyter Book documentation](https://jupyterbook.org/v1/content/execute.html#exclude-files-from-execution). +- `execute_notebooks`: *turn on/off* the execution of Jupyter Notebooks during the build process. *On* by default. If you perform heavy computations in your notebook (machine learning, FEM models, et cetera), you might be better off running the notebooks on a more powerful machine as opposed to the CI/CD server. To turn it off, specify the value `'off'`. You can also exclude specific notebooks by creating exclude patterns in the filenames. For more info, see the [Jupyter Book v1 documentation](https://jupyterbook.org/v1/content/execute.html#exclude-files-from-execution). ```{warning} diff --git a/book/basic-features/overview.md b/book/basic-features/overview.md index a89cb8d..74b4e04 100644 --- a/book/basic-features/overview.md +++ b/book/basic-features/overview.md @@ -7,4 +7,4 @@ This section is useful for [user type 3-5](../installation-and-setup/user_types. # Overview -These pages itemize some of the more common, basic book features which are all available in the original Jupyter book package, without requiring any additional software. They are, of course, selected with teachers and teaching applications in mind. On each page best-practices are illustrated. +These pages itemize some of the more common, basic book features which are all available in the original Jupyter book v1 package, without requiring any additional software. They are, of course, selected with teachers and teaching applications in mind. On each page best-practices are illustrated. diff --git a/book/basic-features/videos.md b/book/basic-features/videos.md index d623ad1..c3b4e32 100644 --- a/book/basic-features/videos.md +++ b/book/basic-features/videos.md @@ -13,9 +13,9 @@ kernelspec: # Videos -Videos uploaded to YouTube can be embedded in the Jupyter Book. There are several ways to do so: +Videos uploaded to YouTube can be embedded in the TeachBook. There are several ways to do so: -**1.** To embed them in the Jupyter Book, first obtain the embedding link of the video. In order to do so, go to the *YouTube* page of the video (so not the Brightspace page), then click *share* in the description box. There should be a button *embed*, click that. Copy the HTML code that appears in the panel. Then, to embed the video, use the following +**1.** To embed them in the TeachBook, first obtain the embedding link of the video. In order to do so, go to the *YouTube* page of the video (so not the Brightspace page), then click *share* in the description box. There should be a button *embed*, click that. Copy the HTML code that appears in the panel. Then, to embed the video, use the following ```