Full Code of PreTeXtBook/pretext for AI

master 4276a7de3dc8 cached
1077 files
65.9 MB
6.1M tokens
457 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (24,518K chars total). Download the full file to get everything.
Repository: PreTeXtBook/pretext
Branch: master
Commit: 4276a7de3dc8
Files: 1077
Total size: 65.9 MB

Directory structure:
gitextract_8b_dyh9h/

├── .git-blame-ignore-revs
├── .gitignore
├── CONTRIBUTING.md
├── COPYING
├── README.md
├── contrib/
│   ├── hitchman/
│   │   ├── README.md
│   │   ├── tjh-law-html.xsl
│   │   └── tjh-law-print.xsl
│   └── ups-writers/
│       ├── README.md
│       ├── ups-writers-html.xsl
│       └── ups-writers-latex.xsl
├── css/
│   ├── README.md
│   ├── colors/
│   │   ├── _color-helpers.scss
│   │   ├── _color-vars.scss
│   │   ├── _palette-dark.scss
│   │   ├── _palette-dual.scss
│   │   ├── _palette-quad-chunks.scss
│   │   ├── _palette-single-bold.scss
│   │   ├── _palette-single-muted.scss
│   │   └── _palette-single.scss
│   ├── components/
│   │   ├── README.md
│   │   ├── _google-search.scss
│   │   ├── _mystery.scss
│   │   ├── _pretext-search.scss
│   │   ├── _pretext-web.scss
│   │   ├── _pretext.scss
│   │   ├── _printing.scss
│   │   ├── _spacing.scss
│   │   ├── _worksheet.scss
│   │   ├── chunks/
│   │   │   ├── README.md
│   │   │   ├── _asides-basic.scss
│   │   │   ├── _asides-floating.scss
│   │   │   ├── _codelike.scss
│   │   │   ├── _discussion-inline.scss
│   │   │   ├── _exercises.scss
│   │   │   ├── _knowls.scss
│   │   │   ├── _sidebyside.scss
│   │   │   ├── _solutions.scss
│   │   │   └── helpers/
│   │   │       ├── README.md
│   │   │       ├── _C-box-mixin.scss
│   │   │       ├── _L-mixin.scss
│   │   │       ├── _box-mixin.scss
│   │   │       ├── _heading-box-mixin.scss
│   │   │       ├── _horizontal-bars-mixin.scss
│   │   │       ├── _inline-heading-mixin.scss
│   │   │       └── _sidebar-mixin.scss
│   │   ├── elements/
│   │   │   ├── README.md
│   │   │   ├── _description-lists.scss
│   │   │   ├── _figures.scss
│   │   │   ├── _fillin.scss
│   │   │   ├── _footnotes.scss
│   │   │   ├── _front-matter.scss
│   │   │   ├── _headings.scss
│   │   │   ├── _index.scss
│   │   │   ├── _links.scss
│   │   │   ├── _list-styles.scss
│   │   │   ├── _lists.scss
│   │   │   ├── _math.scss
│   │   │   ├── _media.scss
│   │   │   ├── _misc-content.scss
│   │   │   ├── _permalinks.scss
│   │   │   ├── _poem.scss
│   │   │   ├── _prism.scss
│   │   │   ├── _summary-links.scss
│   │   │   ├── _tables.scss
│   │   │   └── extras/
│   │   │       └── _heading-underlines.scss
│   │   ├── helpers/
│   │   │   ├── README.md
│   │   │   ├── _buttons-default.scss
│   │   │   ├── _cols.scss
│   │   │   └── _expandable.scss
│   │   ├── interactives/
│   │   │   ├── README.md
│   │   │   ├── _calculators.scss
│   │   │   ├── _other.scss
│   │   │   ├── _runestone.scss
│   │   │   ├── _sagecell.scss
│   │   │   └── _webwork.scss
│   │   └── page-parts/
│   │       ├── README.md
│   │       ├── _banner.scss
│   │       ├── _body.scss
│   │       ├── _footer.scss
│   │       ├── _navbar.scss
│   │       ├── _toc-basics.scss
│   │       ├── _toc-default.scss
│   │       ├── _toc-overlay.scss
│   │       └── extras/
│   │           ├── README.md
│   │           ├── _navbar-btn-borders.scss
│   │           ├── _toc-borders.scss
│   │           ├── _toc-expand-chevrons.scss
│   │           ├── _toc-hidden-scrollbar.scss
│   │           └── _toc-last-level-plain.scss
│   ├── dist/
│   │   ├── epub.css
│   │   ├── kindle.css
│   │   ├── pretext-reveal.css
│   │   ├── print-worksheet.css
│   │   ├── theme-boulder.css
│   │   ├── theme-crc-legacy.css
│   │   ├── theme-default-legacy.css
│   │   ├── theme-default-modern.css
│   │   ├── theme-denver.css
│   │   ├── theme-greeley.css
│   │   ├── theme-min-legacy.css
│   │   ├── theme-oscarlevin-legacy.css
│   │   ├── theme-salem.css
│   │   ├── theme-soundwriting-legacy.css
│   │   ├── theme-tacoma.css
│   │   └── theme-wide-legacy.css
│   ├── fonts/
│   │   └── _fonts-google.scss
│   ├── legacy/
│   │   ├── colors/
│   │   │   ├── all_colors.scss
│   │   │   ├── colors_blue_green.css
│   │   │   ├── colors_blue_grey.css
│   │   │   ├── colors_blue_red.css
│   │   │   ├── colors_blue_red_dark.css
│   │   │   ├── colors_bluegreen_grey.css
│   │   │   ├── colors_brown_gold.css
│   │   │   ├── colors_darkmartiansands.css
│   │   │   ├── colors_default.css
│   │   │   ├── colors_focused_gray_aqua.css
│   │   │   ├── colors_focused_light.css
│   │   │   ├── colors_green_blue.css
│   │   │   ├── colors_green_plum.css
│   │   │   ├── colors_maroon_grey.css
│   │   │   ├── colors_martiansands.css
│   │   │   ├── colors_orange_navy.css
│   │   │   ├── colors_pastel_blue_orange.css
│   │   │   ├── colors_red_blue.css
│   │   │   ├── colors_ruby_amethyst.css
│   │   │   ├── colors_ruby_emerald.css
│   │   │   ├── colors_ruby_turquoise.css
│   │   │   └── setcolors.css
│   │   ├── pretext.css
│   │   ├── pretext_add_on.css
│   │   └── pretext_search.css
│   ├── other/
│   │   └── catalog.css
│   └── targets/
│       ├── ebook/
│       │   ├── ebook-common.scss
│       │   ├── epub/
│       │   │   └── epub.scss
│       │   └── kindle/
│       │       └── kindle.scss
│       ├── html/
│       │   ├── README.md
│       │   ├── boulder/
│       │   │   ├── _customization.scss
│       │   │   └── theme-boulder.scss
│       │   ├── default-modern/
│       │   │   ├── _chunks-default.scss
│       │   │   ├── _customization.scss
│       │   │   ├── _parts-default.scss
│       │   │   └── theme-default-modern.scss
│       │   ├── denver/
│       │   │   ├── _chunks-denver.scss
│       │   │   ├── _customizations.scss
│       │   │   ├── _parts-paper.scss
│       │   │   └── theme-denver.scss
│       │   ├── greeley/
│       │   │   ├── _chunks-greeley.scss
│       │   │   ├── _customization.scss
│       │   │   └── theme-greeley.scss
│       │   ├── legacy/
│       │   │   ├── crc/
│       │   │   │   ├── banner_crc.css
│       │   │   │   ├── navbar_crc.css
│       │   │   │   ├── shell_crc.css
│       │   │   │   ├── theme-crc.scss
│       │   │   │   └── toc_crc.css
│       │   │   ├── default/
│       │   │   │   ├── banner_default.css
│       │   │   │   ├── knowls_default.css
│       │   │   │   ├── navbar_default.css
│       │   │   │   ├── shell_default.css
│       │   │   │   ├── style_default.css
│       │   │   │   ├── theme-default.scss
│       │   │   │   └── toc_default.css
│       │   │   ├── min/
│       │   │   │   ├── shell_min.css
│       │   │   │   ├── theme-min.scss
│       │   │   │   └── toc_min.css
│       │   │   ├── oscarlevin/
│       │   │   │   ├── style_oscarlevin.css
│       │   │   │   └── theme-oscarlevin.scss
│       │   │   ├── soundwriting/
│       │   │   │   ├── style_soundwriting.css
│       │   │   │   └── theme-soundwriting.scss
│       │   │   └── wide/
│       │   │       ├── banner_wide.scss
│       │   │       ├── navbar_wide.scss
│       │   │       ├── shell_wide.scss
│       │   │       ├── style_wide.scss
│       │   │       ├── theme-wide.scss
│       │   │       └── toc_wide.scss
│       │   ├── salem/
│       │   │   ├── _chunks-salem.scss
│       │   │   ├── _heading-tweaks.scss
│       │   │   ├── _other-widen.scss
│       │   │   ├── _parts-salem.scss
│       │   │   ├── _rs-widen.scss
│       │   │   ├── _sizing-globals.scss
│       │   │   └── theme-salem.scss
│       │   └── tacoma/
│       │       ├── _chunks-minimal.scss
│       │       ├── _customization.scss
│       │       ├── _parts-tacoma.scss
│       │       └── theme-tacoma.scss
│       ├── print-worksheet/
│       │   ├── _chunks-worksheet.scss
│       │   └── print-worksheet.scss
│       └── revealjs/
│           └── reveal.scss
├── doc/
│   ├── guide/
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── appendices/
│   │   │   ├── cli-transition.xml
│   │   │   ├── cli-v1vsv2.xml
│   │   │   ├── editors.xml
│   │   │   ├── gfdl-pretext.xml
│   │   │   ├── git.xml
│   │   │   ├── glossary.xml
│   │   │   ├── journals-table.xml
│   │   │   ├── journals.xml
│   │   │   ├── latex-conversion.xml
│   │   │   ├── liblouis.xml
│   │   │   ├── mac-os.xml
│   │   │   ├── node-npm.xml
│   │   │   ├── offline-mathjax.xml
│   │   │   ├── python.xml
│   │   │   ├── references.xml
│   │   │   ├── schema-install.xml
│   │   │   ├── welcome.xml
│   │   │   ├── windows-cli.xml
│   │   │   ├── windows-wsl.xml
│   │   │   └── windows.xml
│   │   ├── author/
│   │   │   ├── advice.xml
│   │   │   ├── author-faq.xml
│   │   │   ├── overview.xml
│   │   │   ├── processing.xml
│   │   │   ├── schema.xml
│   │   │   ├── topics.xml
│   │   │   └── webwork.xml
│   │   ├── backmatter.xml
│   │   ├── basics/
│   │   │   ├── README.md
│   │   │   ├── aside.ptx
│   │   │   ├── axiom.ptx
│   │   │   ├── basics-part.xml
│   │   │   ├── blockquote.ptx
│   │   │   ├── definition.ptx
│   │   │   ├── example-simple.ptx
│   │   │   ├── example-structured.ptx
│   │   │   ├── exercise-task.ptx
│   │   │   ├── exercise.ptx
│   │   │   ├── exercisegroup.ptx
│   │   │   ├── figure.ptx
│   │   │   ├── image.ptx
│   │   │   ├── md-bare.ptx
│   │   │   ├── md.ptx
│   │   │   ├── ol.ptx
│   │   │   ├── p.ptx
│   │   │   ├── porism.ptx
│   │   │   ├── project.ptx
│   │   │   ├── reading-questions.ptx
│   │   │   ├── remark.ptx
│   │   │   ├── sage.ptx
│   │   │   ├── sageplot.ptx
│   │   │   ├── sbsgroup.ptx
│   │   │   ├── section-sub.ptx
│   │   │   ├── section.ptx
│   │   │   ├── sidebyside.ptx
│   │   │   ├── sidebyside2.ptx
│   │   │   ├── table.ptx
│   │   │   ├── theorem.ptx
│   │   │   ├── tikz.ptx
│   │   │   ├── ul.ptx
│   │   │   └── worksheet.ptx
│   │   ├── developer/
│   │   │   ├── code-style.xml
│   │   │   ├── coding.xml
│   │   │   ├── debugging.xml
│   │   │   ├── git.xml
│   │   │   ├── localization.xml
│   │   │   ├── pretext-script.xml
│   │   │   └── xsltproc.xml
│   │   ├── frontmatter.xml
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   ├── gaussian-histogram.html
│   │   │   │   └── vimodes.html
│   │   │   └── qrcode/
│   │   │       ├── joren-falls-video-url.xml
│   │   │       ├── mozart-piano-sonata-url.xml
│   │   │       ├── topic-youtube-video-8-2-url.xml
│   │   │       ├── tutorial-videos-video-url.xml
│   │   │       ├── video-hotel-california-url.xml
│   │   │       └── windows-cli-3-3-url.xml
│   │   ├── guide.xml
│   │   ├── guideinfo.xml
│   │   ├── introduction/
│   │   │   ├── start-here.xml
│   │   │   └── tutorial.xml
│   │   ├── preface.xml
│   │   ├── project.ptx
│   │   ├── publication-styled.xml
│   │   ├── publication.xml
│   │   └── publisher/
│   │       ├── ancillaries.xml
│   │       ├── braille.xml
│   │       ├── conversions.xml
│   │       ├── cover-design.xml
│   │       ├── custom-versions.xml
│   │       ├── epub.xml
│   │       ├── further-customizations.xml
│   │       ├── instructor-version.xml
│   │       ├── jupyter-notebook.xml
│   │       ├── latex-fonts.xml
│   │       ├── latex-styling.xml
│   │       ├── online-html.xml
│   │       ├── open-licenses.xml
│   │       ├── pdf-print.xml
│   │       ├── print-on-demand.xml
│   │       ├── production.xml
│   │       ├── publication-file.xml
│   │       ├── publisher-faq.xml
│   │       ├── runestone.xml
│   │       ├── slides.xml
│   │       ├── web-hosting.xml
│   │       └── webwork.xml
│   └── quickref/
│       ├── README.md
│       ├── quickref-cli.tex
│       └── quickref-pretext.tex
├── examples/
│   ├── README.md
│   ├── braille/
│   │   ├── braille-test-book.xml
│   │   ├── braille-test.xml
│   │   └── publication.xml
│   ├── custom-theming/
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── css/
│   │   │       ├── more-styles.css
│   │   │       ├── my-styles.css
│   │   │       └── salem-color-vars.css
│   │   ├── mytheme/
│   │   │   ├── _chunks-customized.scss
│   │   │   └── mytheme.scss
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   ├── publication-custom-colors.ptx
│   │   │   ├── publication-custom-theme.ptx
│   │   │   ├── publication-salem.ptx
│   │   │   └── publication.ptx
│   │   └── source/
│   │       ├── ch-chapter-title.ptx
│   │       ├── docinfo.ptx
│   │       ├── frontmatter.ptx
│   │       ├── main.ptx
│   │       └── sec-section-name.ptx
│   ├── epub/
│   │   ├── README.md
│   │   ├── epub-sampler.xml
│   │   ├── gen/
│   │   │   └── prefigure/
│   │   │       └── prefigure-tangent-annotations.xml
│   │   └── publication.xml
│   ├── errors/
│   │   └── sample-errors-and-warnings.xml
│   ├── fonts/
│   │   ├── README.md
│   │   └── fonts-and-characters.xml
│   ├── hello-world/
│   │   ├── README.md
│   │   ├── hello-world.xml
│   │   └── publication.xml
│   ├── humanities/
│   │   ├── README.md
│   │   ├── codechat_config.yaml
│   │   ├── generated-assets/
│   │   │   └── .gitkeep
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   └── publication.ptx
│   │   ├── requirements.txt
│   │   └── source/
│   │       ├── hia.xml
│   │       ├── music.xml
│   │       └── poetry.xml
│   ├── letter/
│   │   ├── README.md
│   │   └── sample-letter.xml
│   ├── memo/
│   │   ├── README.md
│   │   └── sample-memo.xml
│   ├── minimal/
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── .keep
│   │   ├── codechat_config.yaml
│   │   ├── generated-assets/
│   │   │   └── .keep
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   └── publication.ptx
│   │   ├── requirements.txt
│   │   └── source/
│   │       └── main.ptx
│   ├── pug/
│   │   ├── .gitignore
│   │   ├── authors-guide/
│   │   │   └── windows.pug
│   │   ├── build.sh
│   │   ├── package.json
│   │   ├── pug-include.pug
│   │   └── pug.pug
│   ├── sample-article/
│   │   ├── bibliography.xml
│   │   ├── customizations-one.xml
│   │   ├── customizations-two.xml
│   │   ├── gen/
│   │   │   ├── asymptote/
│   │   │   │   ├── asymptote-contour-sbs.html
│   │   │   │   ├── asymptote-contour.html
│   │   │   │   ├── asymptote-lever-integral.html
│   │   │   │   ├── asymptote-lever-sbs.html
│   │   │   │   ├── asymptote-lever-solo.html
│   │   │   │   ├── asymptote-lever.html
│   │   │   │   ├── asymptote-surface.html
│   │   │   │   └── asymptote-workcone.html
│   │   │   ├── dynamic_subs/
│   │   │   │   └── dynamic_substitutions.xml
│   │   │   ├── prefigure/
│   │   │   │   ├── prefigure-fibonacci-a-annotations.xml
│   │   │   │   ├── prefigure-fibonacci-b-annotations.xml
│   │   │   │   ├── prefigure-tangent-annotations.xml
│   │   │   │   └── prefigure-worksheet-vectors-annotations.xml
│   │   │   ├── problems/
│   │   │   │   ├── mom-2168.xml
│   │   │   │   ├── mom-2572.xml
│   │   │   │   ├── mom-7492.xml
│   │   │   │   └── mom-930582.xml
│   │   │   ├── qrcode/
│   │   │   │   ├── airborne-midnight-1-url.xml
│   │   │   │   ├── audio-bach-url.xml
│   │   │   │   ├── audio-organ-finale-url.xml
│   │   │   │   ├── audio-piano-trill-two-url.xml
│   │   │   │   ├── audio-piano-trill-url.xml
│   │   │   │   ├── bareilles-love-song-url.xml
│   │   │   │   ├── big-buck-bunny-best-format-url.xml
│   │   │   │   ├── big-buck-bunny-frame-one-url.xml
│   │   │   │   ├── big-buck-bunny-margins-url.xml
│   │   │   │   ├── big-buck-bunny-mp4-url.xml
│   │   │   │   ├── big-buck-bunny-ogg-url.xml
│   │   │   │   ├── big-buck-bunny-subtitles-url.xml
│   │   │   │   ├── big-buck-bunny-two-subtitles-url.xml
│   │   │   │   ├── big-buck-bunny-webm-url.xml
│   │   │   │   ├── calcplot3d-full-application-url.xml
│   │   │   │   ├── calcplot3d-intersection-planes-url.xml
│   │   │   │   ├── calcplot3d-probability-wavefunction-url.xml
│   │   │   │   ├── desmos-natural-log-url.xml
│   │   │   │   ├── drone-flight-clip-url.xml
│   │   │   │   ├── drone-flight-full-url.xml
│   │   │   │   ├── drone-flight-sbs-url.xml
│   │   │   │   ├── geogebra-SAS-url.xml
│   │   │   │   ├── geogebra-astroid-original-url.xml
│   │   │   │   ├── geogebra-astroid-url.xml
│   │   │   │   ├── geogebra-cycloid-url.xml
│   │   │   │   ├── geogebra-right-triangle-url.xml
│   │   │   │   ├── geogebra-seed-head-url.xml
│   │   │   │   ├── geogebra-train-distance-url.xml
│   │   │   │   ├── ggb_3d-direction-vector_interactive-url.xml
│   │   │   │   ├── interactive-animation-url.xml
│   │   │   │   ├── interactive-archimedian-spiral-url.xml
│   │   │   │   ├── interactive-bspline-url.xml
│   │   │   │   ├── interactive-circuitjs-attribute-url.xml
│   │   │   │   ├── interactive-circuitjs-url.xml
│   │   │   │   ├── interactive-d3-collision-url.xml
│   │   │   │   ├── interactive-d3-graph-layout-url.xml
│   │   │   │   ├── interactive-d3-welsh-url.xml
│   │   │   │   ├── interactive-doenetml-example-url.xml
│   │   │   │   ├── interactive-eigenvectors-url.xml
│   │   │   │   ├── interactive-fermats-spiral-url.xml
│   │   │   │   ├── interactive-infinity-url.xml
│   │   │   │   ├── interactive-layout-circuitjs-big-url.xml
│   │   │   │   ├── interactive-layout-circuitjs-small-url.xml
│   │   │   │   ├── interactive-layout-desmos-url.xml
│   │   │   │   ├── interactive-layout-grow-one-url.xml
│   │   │   │   ├── interactive-layout-grow-three-url.xml
│   │   │   │   ├── interactive-layout-grow-two-url.xml
│   │   │   │   ├── interactive-layout-map-medium-url.xml
│   │   │   │   ├── interactive-layout-map-tall-url.xml
│   │   │   │   ├── interactive-layout-map-wide-url.xml
│   │   │   │   ├── interactive-map-california-url.xml
│   │   │   │   ├── interactive-numerical-integral-url.xml
│   │   │   │   ├── interactive-oscillating-secant-url.xml
│   │   │   │   ├── interactive-phet-fourier-url.xml
│   │   │   │   ├── interactive-piecewise-url.xml
│   │   │   │   ├── interactive-quadratic-tangent-url.xml
│   │   │   │   ├── interactive-sage-jupyter-iframe-url.xml
│   │   │   │   ├── interactive-simple-eigenvector-url.xml
│   │   │   │   ├── interactive-simple-js-script-url.xml
│   │   │   │   ├── interactive-slopes-url.xml
│   │   │   │   ├── interactive-threejs-catenoid-surface-url.xml
│   │   │   │   ├── interactive-threejs-saddle-url.xml
│   │   │   │   ├── js-module-test-url.xml
│   │   │   │   ├── kinematics-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-generic-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-solo-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-url.xml
│   │   │   │   ├── minelli-newyork-newyork-url.xml
│   │   │   │   ├── pre-roll-countdown-1-url.xml
│   │   │   │   ├── pre-roll-countdown-10-url.xml
│   │   │   │   ├── pre-roll-countdown-11-url.xml
│   │   │   │   ├── pre-roll-countdown-12-url.xml
│   │   │   │   ├── pre-roll-countdown-13-url.xml
│   │   │   │   ├── pre-roll-countdown-14-url.xml
│   │   │   │   ├── pre-roll-countdown-2-url.xml
│   │   │   │   ├── pre-roll-countdown-3-url.xml
│   │   │   │   ├── pre-roll-countdown-4-url.xml
│   │   │   │   ├── pre-roll-countdown-5-url.xml
│   │   │   │   ├── pre-roll-countdown-6-url.xml
│   │   │   │   ├── pre-roll-countdown-7-url.xml
│   │   │   │   ├── pre-roll-countdown-8-url.xml
│   │   │   │   ├── pre-roll-countdown-9-url.xml
│   │   │   │   ├── section-video-5-5-2-url.xml
│   │   │   │   ├── ups-promo-1-url.xml
│   │   │   │   ├── ups-promo-10-url.xml
│   │   │   │   ├── ups-promo-11-url.xml
│   │   │   │   ├── ups-promo-12-url.xml
│   │   │   │   ├── ups-promo-13-url.xml
│   │   │   │   ├── ups-promo-14-url.xml
│   │   │   │   ├── ups-promo-2-url.xml
│   │   │   │   ├── ups-promo-3-url.xml
│   │   │   │   ├── ups-promo-4-url.xml
│   │   │   │   ├── ups-promo-5-url.xml
│   │   │   │   ├── ups-promo-6-url.xml
│   │   │   │   ├── ups-promo-7-url.xml
│   │   │   │   ├── ups-promo-8-url.xml
│   │   │   │   ├── ups-promo-9-url.xml
│   │   │   │   ├── ups-promo-frame-one-url.xml
│   │   │   │   ├── ups-promo-generic-url.xml
│   │   │   │   ├── ups-promo-preview-url.xml
│   │   │   │   ├── ups-promo-sbs-url.xml
│   │   │   │   ├── ups-promo-side-by-side-url.xml
│   │   │   │   ├── vimeo-move-url.xml
│   │   │   │   ├── yt-list-vars-url.xml
│   │   │   │   ├── zeppelin-playlist-named-url.xml
│   │   │   │   └── zeppelin-playlist-url.xml
│   │   │   ├── sageplot/
│   │   │   │   └── sageplot-implicit-surface.html
│   │   │   ├── stack/
│   │   │   │   ├── stack-integration.ptx
│   │   │   │   ├── stack-matrix.ptx
│   │   │   │   ├── stack-mcq.ptx
│   │   │   │   ├── stack-plot.ptx
│   │   │   │   └── stack-typesetting.ptx
│   │   │   └── trace/
│   │   │       └── python-hello-world-code-lens.js
│   │   ├── media/
│   │   │   ├── code/
│   │   │   │   ├── asymptote/
│   │   │   │   │   └── bezier-patch.js
│   │   │   │   ├── austin/
│   │   │   │   │   ├── animation.js
│   │   │   │   │   ├── eigenvectors.js
│   │   │   │   │   ├── figures.js
│   │   │   │   │   └── simple-ev.js
│   │   │   │   ├── d3/
│   │   │   │   │   ├── collision.js
│   │   │   │   │   ├── graph-layout.js
│   │   │   │   │   ├── mention_network.json
│   │   │   │   │   ├── welsh.css
│   │   │   │   │   └── welsh.js
│   │   │   │   ├── dray/
│   │   │   │   │   └── SAS.ggb
│   │   │   │   ├── haynes/
│   │   │   │   │   ├── 3d-direction-vector.ggb
│   │   │   │   │   └── 3d-direction-vector.js
│   │   │   │   ├── jsxgraph/
│   │   │   │   │   ├── archimedian.js
│   │   │   │   │   ├── bspline.js
│   │   │   │   │   ├── cts-not-diff-oscillate.jc
│   │   │   │   │   ├── fermats-spiral.js
│   │   │   │   │   ├── infinity.js
│   │   │   │   │   └── piecewise.js
│   │   │   │   ├── mcclure/
│   │   │   │   │   ├── slope.css
│   │   │   │   │   └── slope.js
│   │   │   │   ├── roesler/
│   │   │   │   │   └── kinematics.js
│   │   │   │   ├── rosoff/
│   │   │   │   │   ├── astroid.ggb
│   │   │   │   │   └── epi-hypocycloids-default.ggb
│   │   │   │   ├── splice/
│   │   │   │   │   └── splice-resize.js
│   │   │   │   └── threejs/
│   │   │   │       ├── catenoid.js
│   │   │   │       ├── saddle.js
│   │   │   │       └── splines.js
│   │   │   ├── favicon/
│   │   │   │   └── README.md
│   │   │   ├── iframe/
│   │   │   │   └── sage-jupyter.html
│   │   │   ├── images/
│   │   │   │   └── complete-graph.tex
│   │   │   ├── pytutor/
│   │   │   │   └── happy.json
│   │   │   ├── stack/
│   │   │   │   ├── 01_integration_with_feedback.xml
│   │   │   │   ├── Adding-vectors-in-triangles.xml
│   │   │   │   ├── Checkbox.xml
│   │   │   │   ├── Matrix.xml
│   │   │   │   └── basic-plot.xml
│   │   │   └── video/
│   │   │       ├── BigBuckBunnyAcapella.vtt
│   │   │       └── ups-visitor-guide-360.webm
│   │   ├── numerical/
│   │   │   └── spreadsheet/
│   │   │       └── runningstatisticstemplate.ots
│   │   ├── privatesolutions.xml
│   │   ├── project.ptx
│   │   ├── publication-crc.xml
│   │   ├── publication-oscarlevin.xml
│   │   ├── publication-print.xml
│   │   ├── publication-solution-manual.xml
│   │   ├── publication.xml
│   │   └── sample-article.xml
│   ├── sample-book/
│   │   ├── README.md
│   │   ├── appendix-two.xml
│   │   ├── backmatter.xml
│   │   ├── bookinfo.xml
│   │   ├── code/
│   │   │   └── symmetric-group-8.sage
│   │   ├── codechat_config.yaml
│   │   ├── cyclic.xml
│   │   ├── exercises/
│   │   │   ├── cyclic.xml
│   │   │   ├── groups.xml
│   │   │   ├── integers.xml
│   │   │   └── sets.xml
│   │   ├── ext/
│   │   │   ├── datafiles/
│   │   │   │   └── stackoverflow.csv
│   │   │   └── splice/
│   │   │       └── splice-resize.js
│   │   ├── frontmatter.xml
│   │   ├── gen/
│   │   │   ├── datafile/
│   │   │   │   ├── beach-datafile.xml
│   │   │   │   ├── file-picture-classes-jar.xml
│   │   │   │   ├── flower1-datafile.xml
│   │   │   │   ├── flower2-datafile.xml
│   │   │   │   ├── golden-gate.xml
│   │   │   │   ├── golden-gate2.xml
│   │   │   │   ├── luther-bell.xml
│   │   │   │   └── stack-overflow-survey.xml
│   │   │   ├── dynamic_subs/
│   │   │   │   └── dynamic_substitutions.xml
│   │   │   ├── qrcode/
│   │   │   │   ├── OpenDSA-integration-bs-url.xml
│   │   │   │   ├── OpenDSA-integration-dijkstra-url.xml
│   │   │   │   ├── OpenDSA-list-insertion-exercise-url.xml
│   │   │   │   ├── OpenDSA-list-insertion-url.xml
│   │   │   │   ├── doenet-velocity-url.xml
│   │   │   │   ├── interactive-doenetml-example-url.xml
│   │   │   │   ├── interactive-horstmann-codecheck-url.xml
│   │   │   │   ├── opendsa-slideshow-pop-url.xml
│   │   │   │   ├── show-eval-visualization-url.xml
│   │   │   │   ├── splice-resize-example-url.xml
│   │   │   │   ├── youtube-list-vars-eight-url.xml
│   │   │   │   ├── youtube-list-vars-eleven-url.xml
│   │   │   │   ├── youtube-list-vars-five-url.xml
│   │   │   │   ├── youtube-list-vars-four-url.xml
│   │   │   │   ├── youtube-list-vars-nine-url.xml
│   │   │   │   ├── youtube-list-vars-one-url.xml
│   │   │   │   ├── youtube-list-vars-seven-url.xml
│   │   │   │   ├── youtube-list-vars-six-url.xml
│   │   │   │   ├── youtube-list-vars-ten-url.xml
│   │   │   │   ├── youtube-list-vars-three-url.xml
│   │   │   │   ├── youtube-list-vars-two-url.xml
│   │   │   │   └── youtube-list-vars-url.xml
│   │   │   └── trace/
│   │   │       ├── c-hello-world-code-lens.js
│   │   │       ├── exploration-with-always-static-program.js
│   │   │       ├── java-hello-world-code-lens.js
│   │   │       ├── program-codelens-cpp-questions.js
│   │   │       ├── python-code-lens-questions.js
│   │   │       ├── python-hello-world-code-lens.js
│   │   │       ├── sieve-codelens-cpp.js
│   │   │       ├── sieve-codelens-java.js
│   │   │       └── sieve-codelens-python.js
│   │   ├── gfdl-mathbook.xml
│   │   ├── groups.xml
│   │   ├── integers.xml
│   │   ├── project.ptx
│   │   ├── publication-decorative.xml
│   │   ├── publication-noparts.xml
│   │   ├── publication-runestone-academy.xml
│   │   ├── publication-solution-manual.xml
│   │   ├── publication-structural.xml
│   │   ├── rune-examples/
│   │   │   ├── activecode-ambles.xml
│   │   │   ├── activecode-unittest.xml
│   │   │   └── static-listing-java.xml
│   │   ├── rune.xml
│   │   ├── sage/
│   │   │   ├── cyclic-info.xml
│   │   │   ├── cyclic-sage-exercises.xml
│   │   │   ├── groups-info.xml
│   │   │   ├── groups-sage-exercises.xml
│   │   │   ├── groups-sage.xml
│   │   │   ├── integers-info.xml
│   │   │   ├── integers-sage-exercises.xml
│   │   │   ├── integers-sage.xml
│   │   │   ├── sets-info.xml
│   │   │   ├── sets-sage-exercises.xml
│   │   │   └── sets-sage.xml
│   │   ├── sample-book-parts.xml
│   │   ├── sample-book-solutions-manual.xml
│   │   ├── sample-book-solutions-manual.xsl
│   │   ├── sample-book.xml
│   │   ├── sets.xml
│   │   └── tikz/
│   │       └── cyclic-roots-unity.tex
│   ├── sample-slideshow/
│   │   ├── external/
│   │   │   └── custom.css
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   └── img-asymptote.html
│   │   │   └── prefigure/
│   │   │       └── annotated-prefigure-network-annotations.xml
│   │   ├── publication.xml
│   │   └── sample-slideshow.xml
│   ├── showcase/
│   │   ├── README.md
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   ├── AreaUnderCurve.asy
│   │   │   │   ├── AreaUnderCurve.eps
│   │   │   │   ├── AreaUnderCurve.html
│   │   │   │   ├── Deathstar.asy
│   │   │   │   ├── Deathstar.eps
│   │   │   │   ├── Deathstar.html
│   │   │   │   ├── FiveVenn.asy
│   │   │   │   ├── FiveVenn.eps
│   │   │   │   ├── FiveVenn.html
│   │   │   │   ├── cflag.asy
│   │   │   │   ├── cflag.eps
│   │   │   │   ├── cflag.html
│   │   │   │   ├── eflag.asy
│   │   │   │   ├── eflag.eps
│   │   │   │   ├── eflag.html
│   │   │   │   ├── image-rotational-solid.eps
│   │   │   │   ├── image-washer.eps
│   │   │   │   ├── usflag.asy
│   │   │   │   ├── usflag.eps
│   │   │   │   └── usflag.html
│   │   │   ├── latex-image/
│   │   │   │   ├── image-building-parabola.eps
│   │   │   │   ├── image-building-parabola.tex
│   │   │   │   ├── image-gaussian-sum-proof.eps
│   │   │   │   ├── image-gaussian-sum-proof.tex
│   │   │   │   ├── image-implicitly-defined-curve.eps
│   │   │   │   ├── image-implicitly-defined-curve.tex
│   │   │   │   ├── image-parametrized-surface.eps
│   │   │   │   ├── image-parametrized-surface.tex
│   │   │   │   ├── worksheet-midpoints-of-quadrilateral.eps
│   │   │   │   ├── worksheet-midpoints-of-quadrilateral.tex
│   │   │   │   ├── worksheet-triangle-cyclic-medians-copy.eps
│   │   │   │   ├── worksheet-triangle-cyclic-medians-copy.tex
│   │   │   │   ├── worksheet-triangle-cyclic-medians.eps
│   │   │   │   ├── worksheet-triangle-cyclic-medians.tex
│   │   │   │   ├── worksheet-triangle-cyclic-vectors.eps
│   │   │   │   └── worksheet-triangle-cyclic-vectors.tex
│   │   │   └── webwork/
│   │   │       ├── answer-type-variety.xml
│   │   │       ├── images/
│   │   │       │   └── string-answers-image-1.tex
│   │   │       ├── open-problem-library.xml
│   │   │       ├── pg/
│   │   │       │   └── PreTeXt_Showcase/
│   │   │       │       ├── 6_1-Answer_Type_Variety.pg
│   │   │       │       ├── 6_2-Special_Feedback.pg
│   │   │       │       ├── 6_3-String_Answers.pg
│   │   │       │       ├── 6_5-Structured_with_Tasks.pg
│   │   │       │       ├── 6_6-Units_in_Answers.pg
│   │   │       │       ├── def/
│   │   │       │       │   └── setPreTeXt_Showcase.def
│   │   │       │       ├── header/
│   │   │       │       │   └── PreTeXt_Showcase.pg
│   │   │       │       └── macros/
│   │   │       │           └── PTXSC.pl
│   │   │       ├── special-feedback.xml
│   │   │       ├── string-answers.xml
│   │   │       ├── structured-with-tasks.xml
│   │   │       └── units-in-answers.xml
│   │   ├── project.ptx
│   │   ├── publisher/
│   │   │   └── publication.xml
│   │   └── source/
│   │       ├── environments.ptx
│   │       ├── exercises.ptx
│   │       ├── latex-image.ptx
│   │       ├── mathematics.ptx
│   │       ├── pretext-showcase.ptx
│   │       ├── webwork.ptx
│   │       └── worksheets.ptx
│   ├── stack/
│   │   ├── README.md
│   │   └── minimal/
│   │       ├── assets/
│   │       │   └── stack/
│   │       │       └── 01_integration_with_feedback.xml
│   │       ├── project.ptx
│   │       ├── publication/
│   │       │   └── publication.ptx
│   │       └── source/
│   │           └── main.ptx
│   ├── webwork/
│   │   ├── Makefile
│   │   ├── Makefile.paths.example
│   │   ├── Makefile.paths.original
│   │   ├── README.md
│   │   ├── minimal/
│   │   │   ├── generated/
│   │   │   │   └── webwork/
│   │   │   │       ├── add-integers.xml
│   │   │   │       ├── cylinder-volume.xml
│   │   │   │       ├── pg/
│   │   │   │       │   └── WeBWorK_Minimal_Example/
│   │   │   │       │       ├── 1-WeBWorK_Minimal_Section/
│   │   │   │       │       │   ├── 1_1.pg
│   │   │   │       │       │   └── 1_3.pg
│   │   │   │       │       ├── def/
│   │   │   │       │       │   └── set1-WeBWorK_Minimal_Section.def
│   │   │   │       │       ├── header/
│   │   │   │       │       │   └── 1-WeBWorK_Minimal_Section.pg
│   │   │   │       │       └── macros/
│   │   │   │       │           └── WeBWorK_Minimal_Example.pl
│   │   │   │       └── value-of-pi.xml
│   │   │   ├── mini.xml
│   │   │   ├── pg/
│   │   │   │   └── newProblem.pg
│   │   │   └── publication.xml
│   │   └── sample-chapter/
│   │       ├── my-generated/
│   │       │   ├── .gitkeep
│   │       │   └── webwork/
│   │       │       ├── an-exercisegroup-exercise.xml
│   │       │       ├── answer-arrays.xml
│   │       │       ├── antiderivative-exp.xml
│   │       │       ├── antiderivative-sin.xml
│   │       │       ├── box-diagonal-five.xml
│   │       │       ├── box-diagonal-thirteen.xml
│   │       │       ├── choose-one.xml
│   │       │       ├── copy-webwork-add-numbers-exploration.xml
│   │       │       ├── copy-webwork-add-numbers.xml
│   │       │       ├── copy-with-tasks.xml
│   │       │       ├── cylinder-volume.xml
│   │       │       ├── deep-nested-lists.xml
│   │       │       ├── divisional-bare.xml
│   │       │       ├── divisional-conclusion.xml
│   │       │       ├── divisional-introduction-conclusion.xml
│   │       │       ├── divisional-introduction.xml
│   │       │       ├── divisional-title-conclusion.xml
│   │       │       ├── divisional-title-introduction-conclusion.xml
│   │       │       ├── divisional-title-introduction.xml
│   │       │       ├── divisional-title.xml
│   │       │       ├── empty-statement.xml
│   │       │       ├── exercisegroup-bare.xml
│   │       │       ├── exercisegroup-conclusion.xml
│   │       │       ├── exercisegroup-introduction-conclusion.xml
│   │       │       ├── exercisegroup-introduction.xml
│   │       │       ├── exercisegroup-title-conclusion.xml
│   │       │       ├── exercisegroup-title-introduction-conclusion.xml
│   │       │       ├── exercisegroup-title-introduction.xml
│   │       │       ├── exercisegroup-title.xml
│   │       │       ├── function-with-domain-issues.xml
│   │       │       ├── images/
│   │       │       │   ├── box-diagonal-five-image-1.tex
│   │       │       │   ├── box-diagonal-thirteen-image-1.tex
│   │       │       │   ├── latex-image-with-preamble-image-1.tex
│   │       │       │   ├── randomized-latex-image-image-1.tex
│   │       │       │   ├── special-characters-image-1.tex
│   │       │       │   └── static-latex-image-image-1.tex
│   │       │       ├── inline-bare.xml
│   │       │       ├── inline-conclusion.xml
│   │       │       ├── inline-introduction-conclusion.xml
│   │       │       ├── inline-introduction.xml
│   │       │       ├── inline-title-conclusion.xml
│   │       │       ├── inline-title-introduction-conclusion.xml
│   │       │       ├── inline-title-introduction.xml
│   │       │       ├── inline-title.xml
│   │       │       ├── integer-addition-with-control-seed.xml
│   │       │       ├── integer-addition-with-seed.xml
│   │       │       ├── integer-addition.xml
│   │       │       ├── intertext.xml
│   │       │       ├── latex-image-with-preamble.xml
│   │       │       ├── list-indentation-with-images-and-tables.xml
│   │       │       ├── list-indentation.xml
│   │       │       ├── local-pg-file.xml
│   │       │       ├── local-pg.xml
│   │       │       ├── math-and-alignment.xml
│   │       │       ├── mathobject-string-answers.xml
│   │       │       ├── multiple-choice-popup-or-radio-buttons.xml
│   │       │       ├── multiple-choice.xml
│   │       │       ├── nested-tasks.xml
│   │       │       ├── no-random.xml
│   │       │       ├── number-or-function.xml
│   │       │       ├── options-subset-auto-label.xml
│   │       │       ├── options-subset-explicit-labeling.xml
│   │       │       ├── options-subset.xml
│   │       │       ├── pg/
│   │       │       │   └── Integrating_WeBWorK_into_Textbooks/
│   │       │       │       ├── 1-Instructive_Examples/
│   │       │       │       │   ├── 1_1-Arithmetic/
│   │       │       │       │   │   ├── 1_1_1-Adding_SingleDigit_Integers.pg
│   │       │       │       │   │   ├── 1_1_3-Controlling_Randomness.pg
│   │       │       │       │   │   ├── 1_1_4-Special_Answer_Checking.pg
│   │       │       │       │   │   ├── 1_1_5-Using_Hints.pg
│   │       │       │       │   │   ├── 1_1_6-No_Randomization.pg
│   │       │       │       │   │   ├── 1_1_7-Local_PG.pg
│   │       │       │       │   │   ├── 1_1_8-Local_PG_File.pg
│   │       │       │       │   │   ├── Exploration-1_1_2-Inside_an_exploration.pg
│   │       │       │       │   │   └── Project-1_1_1-Inside_a_project.pg
│   │       │       │       │   ├── 1_2-The_Quadratic_Formula/
│   │       │       │       │   │   ├── 1_2_2-Solving_Quadratic_Equations.pg
│   │       │       │       │   │   └── 1_2_3-Nested_tasks.pg
│   │       │       │       │   ├── 1_4-Antidifferentiation/
│   │       │       │       │   │   ├── 1_4_2_2-Every_Continuous_Function_has_an_Antiderivative.pg
│   │       │       │       │   │   ├── 1_4_2_3-Inverse_Processes.pg
│   │       │       │       │   │   ├── 1_4_2_4.pg
│   │       │       │       │   │   ├── 1_4_2_5.pg
│   │       │       │       │   │   └── 1_4_2_6-Show_Your_Work.pg
│   │       │       │       │   ├── 1_5-Math_Content/
│   │       │       │       │   │   ├── 1_5_1-Math_Elements_and_Alignment.pg
│   │       │       │       │   │   └── 1_5_2-Intertext.pg
│   │       │       │       │   ├── 1_6-Multiple_Choice/
│   │       │       │       │   │   ├── 1_6_1-DropdownPopup.pg
│   │       │       │       │   │   ├── 1_6_2-Choose_one.pg
│   │       │       │       │   │   ├── 1_6_3-Choose_a_Subset_of_Options.pg
│   │       │       │       │   │   ├── 1_6_4-Choose_a_Subset_of_Options_with_Automated_Labeling.pg
│   │       │       │       │   │   └── 1_6_5-Choose_a_Subset_of_Options_with_Explicit_Labeling.pg
│   │       │       │       │   ├── 1_7-Tables/
│   │       │       │       │   │   └── 1_7_1-Complete_this_Table.pg
│   │       │       │       │   └── 1_8-Graphics_in_Exercises/
│   │       │       │       │       ├── 1_8_1-A_static_lateximage_graph.pg
│   │       │       │       │       ├── 1_8_1.pg
│   │       │       │       │       ├── 1_8_2-A_randomized_lateximage_graph.pg
│   │       │       │       │       ├── 1_8_2.pg
│   │       │       │       │       ├── 1_8_3-A_lateximage_graph_affected_by_lateximagepreamble.pg
│   │       │       │       │       ├── 1_8_4-Special_characters.pg
│   │       │       │       │       └── 1_8_5-Solve_using_a_graph.pg
│   │       │       │       ├── 2-Technical_Examples/
│   │       │       │       │   ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics/
│   │       │       │       │   │   ├── 2_1_1-PGML_Formatting.pg
│   │       │       │       │   │   ├── 2_1_2.pg
│   │       │       │       │   │   └── 2_1_3.pg
│   │       │       │       │   ├── 2_2-Subject_Area_Templates/
│   │       │       │       │   │   ├── 2_2_1-Answer_is_a_number_or_a_function.pg
│   │       │       │       │   │   ├── 2_2_2-Answer_is_a_function_with_domain_issues.pg
│   │       │       │       │   │   ├── 2_2_3-Multiple_Choice_by_Popup_Radio_Buttons_or_Checkboxes.pg
│   │       │       │       │   │   ├── 2_2_4.pg
│   │       │       │       │   │   ├── 2_2_5-Tables.pg
│   │       │       │       │   │   └── 2_2_6-Answer_Arrays.pg
│   │       │       │       │   ├── 2_3-Stress_Tests/
│   │       │       │       │   │   ├── 2_3_1-PTX_problem_source_with_servergenerated_images.pg
│   │       │       │       │   │   ├── 2_3_2-Checking_Proper_Indentation_In_Lists.pg
│   │       │       │       │   │   ├── 2_3_3-Checking_Proper_Indentation_In_Lists_with_Images_and_Tables.pg
│   │       │       │       │   │   ├── 2_3_4-Deepnested_lists.pg
│   │       │       │       │   │   ├── 2_3_5.pg
│   │       │       │       │   │   └── 2_3_6.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing/
│   │       │       │       │   │   ├── 2_4_1.pg
│   │       │       │       │   │   ├── 2_4_2-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_1.pg
│   │       │       │       │   │   ├── 2_4_2_10-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_11.pg
│   │       │       │       │   │   ├── 2_4_2_12-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_13.pg
│   │       │       │       │   │   ├── 2_4_2_14-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_15.pg
│   │       │       │       │   │   ├── 2_4_2_16-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_2-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_3.pg
│   │       │       │       │   │   ├── 2_4_2_4-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_5.pg
│   │       │       │       │   │   ├── 2_4_2_6-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_7.pg
│   │       │       │       │   │   ├── 2_4_2_8-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_9.pg
│   │       │       │       │   │   ├── 2_4_3.pg
│   │       │       │       │   │   ├── 2_4_4-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_5.pg
│   │       │       │       │   │   ├── 2_4_6-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_7.pg
│   │       │       │       │   │   └── 2_4_8-Has_a_Title.pg
│   │       │       │       │   └── 2_5-Runestone_Assignment_Testing/
│   │       │       │       │       └── 2_5_1.pg
│   │       │       │       ├── def/
│   │       │       │       │   ├── set1_1-Arithmetic.def
│   │       │       │       │   ├── set1_2-The_Quadratic_Formula.def
│   │       │       │       │   ├── set1_3-Open_Problem_Library.def
│   │       │       │       │   ├── set1_4-Antidifferentiation_Exercises.def
│   │       │       │       │   ├── set1_5-Math_Content.def
│   │       │       │       │   ├── set1_6-Multiple_Choice.def
│   │       │       │       │   ├── set1_7-Tables.def
│   │       │       │       │   ├── set1_8-Graphics_in_Exercises.def
│   │       │       │       │   ├── set1_8-Graphics_in_Exercises_Exercises.def
│   │       │       │       │   ├── set2_1-PGML_Formatting_and_Verbatim_Calisthenics.def
│   │       │       │       │   ├── set2_2-Subject_Area_Templates.def
│   │       │       │       │   ├── set2_3-Stress_Tests.def
│   │       │       │       │   ├── set2_4-Layout_Configuration_Testing.def
│   │       │       │       │   ├── set2_4-Layout_Configuration_Testing_Exercises.def
│   │       │       │       │   └── set2_5-Runestone_Assignment_Testing_Exercises.def
│   │       │       │       ├── header/
│   │       │       │       │   ├── 1_1-Arithmetic.pg
│   │       │       │       │   ├── 1_2-The_Quadratic_Formula.pg
│   │       │       │       │   ├── 1_3-Open_Problem_Library.pg
│   │       │       │       │   ├── 1_4-Antidifferentiation_Exercises.pg
│   │       │       │       │   ├── 1_5-Math_Content.pg
│   │       │       │       │   ├── 1_6-Multiple_Choice.pg
│   │       │       │       │   ├── 1_7-Tables.pg
│   │       │       │       │   ├── 1_8-Graphics_in_Exercises.pg
│   │       │       │       │   ├── 1_8-Graphics_in_Exercises_Exercises.pg
│   │       │       │       │   ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg
│   │       │       │       │   ├── 2_2-Subject_Area_Templates.pg
│   │       │       │       │   ├── 2_3-Stress_Tests.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing_Exercises.pg
│   │       │       │       │   └── 2_5-Runestone_Assignment_Testing_Exercises.pg
│   │       │       │       └── macros/
│   │       │       │           └── WWSC.pl
│   │       │       ├── pgml-data-attribute.xml
│   │       │       ├── ptx-source-with-server-images.xml
│   │       │       ├── quadratic-equation.xml
│   │       │       ├── radio-buttons-with-math.xml
│   │       │       ├── randomized-latex-image.xml
│   │       │       ├── single-quote-in-table-cell.xml
│   │       │       ├── solving-with-graph.xml
│   │       │       ├── special-answer-checking.xml
│   │       │       ├── special-characters.xml
│   │       │       ├── static-latex-image.xml
│   │       │       ├── table-completion.xml
│   │       │       ├── tables.xml
│   │       │       ├── using-hints.xml
│   │       │       ├── ww-PGML-format.xml
│   │       │       ├── ww-antiderivatives.xml
│   │       │       ├── ww-discuss-always-antiderivative.xml
│   │       │       ├── ww-discuss-inverse-processes.xml
│   │       │       └── ww-use-the-definition-of-the-derivative.xml
│   │       ├── pg/
│   │       │   └── Adding_SingleDigit_Integers.pg
│   │       ├── project.ptx
│   │       ├── publisher/
│   │       │   ├── publication-academy.xml
│   │       │   └── publication.xml
│   │       └── sample-chapter.ptx
│   └── workbook/
│       ├── README.md
│       ├── workbook-article-publication.xml
│       ├── workbook-article.xml
│       ├── workbook-book-publication.xml
│       ├── workbook-book.xml
│       ├── ws-activity-with-task.xml
│       ├── ws-dot-products.xml
│       ├── ws-exercisegroup.xml
│       ├── ws-geometric-prelude.xml
│       ├── ws-networks.xml
│       └── ws-testing.xml
├── journals/
│   ├── README.md
│   ├── build.sh
│   ├── journals-to-table.xsl
│   ├── journals.xml
│   └── texstyles/
│       ├── ams.xml
│       ├── dependents/
│       │   ├── bull-amer-math-soc.xml
│       │   ├── conform-geom-dyn.xml
│       │   ├── j-algebraic-geom.xml
│       │   ├── j-amer-math-soc.xml
│       │   ├── math-comp.xml
│       │   ├── proc-amer-math-soc.xml
│       │   ├── quart-appl-math.xml
│       │   ├── represent-theory.xml
│       │   ├── theory-probab-math-statist.xml
│       │   └── trans-ams.xml
│       ├── electron-j-combin.xml
│       ├── elsevier.xml
│       ├── springer-nature.xml
│       └── taylor-francis.xml
├── js/
│   ├── diagcess/
│   │   └── diagcess.js
│   ├── knowl.js
│   ├── lti_iframe_resizer.js
│   ├── mathjax_startup.js
│   ├── pretext-stack/
│   │   ├── stackapicalls.js
│   │   └── stackjsvle.js
│   ├── pretext-webwork/
│   │   ├── 2.16/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.17/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.18/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.19/
│   │   │   └── pretext-webwork.js
│   │   └── 2.20/
│   │       └── pretext-webwork.js
│   ├── pretext.js
│   ├── pretext_add_on.js
│   ├── pretext_search.js
│   ├── ptx_scorm_events.js
│   └── ptx_search.js
├── legal/
│   ├── gpl-license-v2.txt
│   └── gpl-license-v3.txt
├── pretext/
│   ├── README.md
│   ├── __init__.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── braille_format.py
│   │   └── pretext.py
│   ├── module-test.py
│   ├── pretext
│   ├── pretext.cfg
│   └── requirements.txt
├── release-notes.md
├── schema/
│   ├── README.md
│   ├── build.sh
│   ├── pf.xsd
│   ├── pretext-dev.rnc
│   ├── pretext-dev.rng
│   ├── pretext-schematron.xsl
│   ├── pretext-validation-plus.xsl
│   ├── pretext.rnc
│   ├── pretext.rng
│   ├── pretext.xml
│   ├── pretext.xsd
│   ├── publication-schema.rnc
│   ├── publication-schema.rng
│   ├── publication-schema.xml
│   ├── publication-schema.xsd
│   ├── publication.xml
│   └── xml.xsd
├── script/
│   ├── README.md
│   ├── cssbuilder/
│   │   ├── README.md
│   │   ├── cssbuilder.mjs
│   │   └── package.json
│   ├── dynsub/
│   │   ├── README.md
│   │   ├── dynamic_extract.mjs
│   │   └── package.json
│   ├── mbx
│   ├── mjsre/
│   │   ├── README.md
│   │   ├── mj-sre-page.js
│   │   ├── package.json
│   │   └── update-sre
│   └── webwork/
│       └── pg-ptx.pl
└── xsl/
    ├── README.md
    ├── entities.ent
    ├── extract-asymptote.xsl
    ├── extract-biblio-csl.xsl
    ├── extract-datafile.xsl
    ├── extract-dynamic.xsl
    ├── extract-identity.xsl
    ├── extract-interactive.xsl
    ├── extract-latex-image.xsl
    ├── extract-mermaid.xsl
    ├── extract-mom.xsl
    ├── extract-pg.xsl
    ├── extract-prefigure.xsl
    ├── extract-qrcode.xsl
    ├── extract-sageplot.xsl
    ├── extract-stack.xsl
    ├── extract-trace.xsl
    ├── extract-youtube.xsl
    ├── html-symbols.xsl
    ├── latex/
    │   ├── pretext-latex-AIM.xsl
    │   ├── pretext-latex-CLP.xsl
    │   ├── pretext-latex-chaos.xsl
    │   ├── pretext-latex-dyslexic-font.xsl
    │   ├── pretext-latex-guide.xsl
    │   └── pretext-latex-texstyle.xsl
    ├── localizations/
    │   ├── README.md
    │   ├── af-ZA.xml
    │   ├── bg-BG.xml
    │   ├── ca-ES.xml
    │   ├── cs-CZ.xml
    │   ├── de-DE.xml
    │   ├── en-US.xml
    │   ├── es-ES.xml
    │   ├── fi-FI.xml
    │   ├── fr-CA.xml
    │   ├── fr-FR.xml
    │   ├── hu-HU.xml
    │   ├── it-IT.xml
    │   ├── ku-CKB.xml
    │   ├── localizations.xml
    │   ├── nl-NL.xml
    │   ├── pt-BR.xml
    │   ├── pt-PT.xml
    │   └── zh-HANS.xml
    ├── pretext-assembly.xsl
    ├── pretext-basic-html.xsl
    ├── pretext-beamer.xsl
    ├── pretext-braille-preprint.xsl
    ├── pretext-common.xsl
    ├── pretext-dynamic.xsl
    ├── pretext-epub.xsl
    ├── pretext-html.xsl
    ├── pretext-json-manifest.xsl
    ├── pretext-jupyter.xsl
    ├── pretext-latex-classic.xsl
    ├── pretext-latex-common.xsl
    ├── pretext-latex.xsl
    ├── pretext-litprog.xsl
    ├── pretext-merge.xsl
    ├── pretext-numbers.xsl
    ├── pretext-revealjs.xsl
    ├── pretext-runestone-fitb.xsl
    ├── pretext-runestone-static.xsl
    ├── pretext-runestone.xsl
    ├── pretext-sage-doctest.xsl
    ├── pretext-smc.xsl
    ├── pretext-solution-manual-latex.xsl
    ├── pretext-text-utilities.xsl
    ├── pretext-text.xsl
    ├── pretext-units.xsl
    ├── pretext-view-source.xsl
    ├── pretext-ww-problem-sets.xsl
    ├── publisher-variables.xsl
    ├── support/
    │   ├── README.md
    │   ├── extract-math.xsl
    │   ├── package-math.xsl
    │   ├── play-button/
    │   │   └── README.md
    │   ├── pretext-pg-macros.xsl
    │   └── webpack_static_imports.xml
    ├── tests/
    │   ├── README.md
    │   ├── null.xml
    │   └── pretext-text-utilities-test.xsl
    ├── utilities/
    │   ├── README.md
    │   ├── author-report.xsl
    │   ├── deprecate-autoname.sed
    │   ├── deprecate-index.sed
    │   ├── fix-deprecations.xsl
    │   ├── pretext-enhanced-source.xsl
    │   └── report-publisher-variables.xsl
    ├── xml-to-json.xsl
    └── xml-to-string.xsl

================================================
FILE CONTENTS
================================================

================================================
FILE: .git-blame-ignore-revs
================================================
# PreTeXt whitespace/formatting commits
# Commit message (e.g.): "Add whitespace commit to git blame ignore revisions"

# May 2021: "black" formatting on Python pretext script
56a27b3a41ece5a2eee1975e190e49b6cf98c500

# Oct 2023: restructure WW chapter as a book, indentation
87f4f5e712e03024ae85589c8086d273d8241fd3

# Mar 2025: empty elements in sample article
36decdaa299138281dd461d021483a83fb7d1964


================================================
FILE: .gitignore
================================================
user/*
doc/guide/webwork-representations.ptx
script/mjsre/node_modules/
script/mjsre/package-lock.json
script/dynsub/node_modules/
script/dynsub/package-lock.json
pretext/__pycache__/**
pretext/lib/__pycache__/**
.error_schema.log
# WW examples
examples/webwork/Makefile.paths
# any file ending in ~ (backups, usually)
*~
.vscode
**/_build
**/output
**/cli.log
**/rsbuild
**/build
**/node_modules/

# cssbuilder output
css/dist/*.map


================================================
FILE: CONTRIBUTING.md
================================================
Contributing
------------

Thanks for your interest in contributing to [PreTeXt](https://pretextbook.org).

Details on participation in the PreTeXt Community can be found at

[Welcome to the PreTeXt Community](https://pretextbook.org/doc/guide/html/welcome.html)

In particular, discussion almost always begins in the Google Groups,
and once there is consensus about what needs to be done
(bug-fix, new feature, etc.), then an issue is created.

Please do not use issues for support questions and please
initiate feature requests in one of the Google Groups.  Pull
requests are welcome without discussion when something is clearly
in error and the change is readily apparent.

Thanks for adapting to the idosyncracies of our project!
Some specific details follow.

(2022-06-19)

Reporting Errors
----------------

If you have output that you think might be incorrect or misbehaved, please follow this procedure:

* Check that your input conforms to the schema [Author's Guide](https://pretextbook.org/doc/author-guide/html/schema.html)
* Add a small example of your problem to the "minimal" example in the `examples/minimal` directory and test there
* Search the [pretext-support](https://groups.google.com/forum/#!forum/pretext-support) and [pretext-dev](https://groups.google.com/forum/#!forum/pretext-dev) Google Groups, and the [GitHub issues](https://github.com/rbeezer/mathbook/issues), to see if the problem is known (if so, please add any new information there)
* Post on one of the Google Groups, and include the source of your adjusted minimal example, along with a copy of the problematic output
* If your problem involves HTML output, it is usually easier for us to understand if you host a live example and provide a URL in your post
* If you have discovered a new problem, you can help when asked by filing an issue on GitHub (and it is OK to cut/paste from th Google Group discussion and/or link to a discussion there)

Thanks for your help keeping all the volunteers on this project working efficiently.

(2018-08-27)


Contributing to PreTeXt
-----------------------

Thanks for your interest in making PreTeXt better.  Contributions from users are an important part of its development.  The following suggestions are meant to make the process of creating and accepting a contribution easier for you, and easier for the maintainers.

*  Use the [pretext-dev](https://groups.google.com/forum/#!forum/pretext-dev) Google Group to float your idea before starting.  You will get some good feedback that will make your contribution better and you may get some cautions that will save you some effort.
*  Pull requests on GitHub are the easiest way to contribute and are really the only practical way for us to review, test, and incorporate your work.  If you are new to Git, there is lots of information on the Internet, and some of it is even helpful and accurate.  You can also read a guide we put together, [Git for Authors](https://pretextbook.org/gfa/html/). Despite the title, it has general principles and techniques that work equally well for software.
*  **Always** begin a new branch for a contribution.  And keep topically distinct contributions on different branches.  Small and compact is better than large and diverse.
*  Pull frequently from the main line of development for official PreTeXt (`master` at this writing) to update current progress.  Then **rebase** your topic branch onto the tip of this official branch as you work, as follows.
```
git switch master
git pull origin master
git switch topic
git rebase master
```
*  In particular, **do not merge** `master` into your `topic` branch, that makes our job harder when we add your work into the official repository.
*  Once you have your branch in good shape, be sure you update `master` one last time and rebase onto the tip of `master`.  Then make a pull request with that branch.
*  While your work is being reviewed, do not add any new commits to your branch, and do not rebase it again, unless you are asked to add changes.  If you later need to build on your work, then say so in the discussion area and we can plot how to accomodate that.  But it would be better to not make a pull request until you are completely finished with a task.
*  We are likely to combine your commits, and maybe even then distribute them into logical chunks.  We will edit your commit messages, deleting anything beyond a single line (so do not spend time on that).
*  We will preserve your authorship, and mark the commit(s) with the pull request number so there is a record of where it came from and how (or we will merge and put the pull request number on the merge commit).
*  Once we incorporate your work into the mainline of the official repository, then you can pull those changes and delete your topic branch.

(2018-08-27)


================================================
FILE: COPYING
================================================
Copyright 2013 Robert A. Beezer

This file is part of PreTeXt.

PreTeXt is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 or version 3 of the
License (at your option).

PreTeXt is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with PreTeXt.  If not, see <http://www.gnu.org/licenses/>.


================================================
FILE: README.md
================================================
PreTeXt
=======

An authoring and publishing system for authors of textbooks, research articles, and monographs, especially in STEM disciplines.

GPL License.

Quickstart instructions at project website:  [pretextbook.org](https://pretextbook.org)

Help and development discussions:
* Support forum/mailing-list: [pretext-support](https://groups.google.com/forum/#!forum/pretext-support)
* Announcements only, low-volume: [pretext-announce](https://groups.google.com/forum/#!forum/pretext-announce)
* Submitting an issue is the last option for receiving help. See the [Contributing Guide](CONTRIBUTING.md).

PreTeXt is guided by the following principles:
----------------------------------------------
1. PreTeXt is a markup language that captures the structure of
textbooks and research papers.
2. PreTeXt is human-readable and human-writable.
3. PreTeXt documents serve as a single source which can be
easily converted to multiple other formats, current and future.
4. PreTeXt respects the good design practices which have been
developed over the past centuries.
5. PreTeXt makes it easy for authors to implement features which
are both common and reasonable.
6. PreTeXt supports online documents which make use of the full
capabilities of the Web.
7. PreTeXt output is styled by selecting from a list of available
templates, relieving the author of the burden involved
in micromanaging the output format.
8. PreTeXt is free: the software is available at no cost, with an
open license. The use of PreTeXt does not impose any constraints
on documents prepared with the system.
9. PreTeXt is not a closed system: documents can be converted to
LaTeX and then developed using standard LaTeX tools.
10. PreTeXt recognizes that scholarly documents involve the
interaction of authors, publishers, scholars, curators, instructors,
students, and readers, with each group having its own needs
and goals.
11. PreTeXt recognizes the inherent value in producing material
that is accessible to everyone.


================================================
FILE: contrib/hitchman/README.md
================================================
Hitchman's Linear Algebra Workbook
==================================

Compatibility layers to support TJ Hitchman's Linear Algebra workbook for his IBL course.

First used Fall 2014.  Principally a new "Task" environment was added.  But with the addition of a `task` element, and its subsequent re-purposing in Summer 2017, that code has been removed.


================================================
FILE: contrib/hitchman/tjh-law-html.xsl
================================================
<?xml version='1.0'?> <!-- As XML file -->

<!-- For TJ Hitchman's Linear Algebra Workbook     -->
<!-- 2014/09/09  R. Beezer, implemented "tasks"    -->
<!-- 2017/08/04  R. Beezer, removed "tasks"        -->

<!-- Identify as a stylesheet -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<!-- Import the usual LaTeX conversion templates            -->
<!-- Place this file in  mathbook/user  (mkdir if necessary)-->
<xsl:import href="../xsl/mathbook-html.xsl" />

<!-- Intend output for rendering by pdflatex -->
<xsl:output method="html" />

<!-- Style code output to have red text -->
<!-- And pump up the font size          -->
<xsl:template match="c">
	<tt class="code-inline" style="color: red; font-size: 120%">
		<xsl:apply-templates />
	</tt>
</xsl:template>

<!-- custom numbering flags -->
<xsl:param name="numbering.maximum.level">
	<xsl:text>2</xsl:text>
</xsl:param>
<xsl:param name="numbering.theorems.level">
	<xsl:text>1</xsl:text>
</xsl:param>

</xsl:stylesheet>


================================================
FILE: contrib/hitchman/tjh-law-print.xsl
================================================
<?xml version='1.0'?> <!-- As XML file -->

<!-- For TJ Hitchman's Linear Algebra Workbook     -->
<!-- 2014/09/04  R. Beezer, page break at sections -->
<!-- 2014/09/09  R. Beezer, implemented "tasks"    -->
<!-- 2017/08/04  R. Beezer, removed "tasks"        -->

<!-- Identify as a stylesheet -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<!-- Import the usual LaTeX conversion templates            -->
<!-- Place this file in  mathbook/user  (mkdir if necessary)-->
<xsl:import href="../xsl/mathbook-latex.xsl" />

<!-- Intend output for rendering by pdflatex -->
<xsl:output method="text" />

<!-- Examples of items you usually set as "stringparam" on the command line -->
<xsl:param name="latex.font.size" select="'10pt'" />

<!-- Makes hyperlinks, program listings, etc. black & white -->
<xsl:param name="latex.print">
	<xsl:text>yes</xsl:text>
</xsl:param>

<!-- custom numbering flags -->
<xsl:param name="numbering.maximum.level">
	<xsl:text>2</xsl:text>
</xsl:param>
<xsl:param name="numbering.theorems.level">
	<xsl:text>1</xsl:text>
</xsl:param>

<!-- Enhance processing of sections    -->
<!-- Add a \clearpage to the end, plus -->
<!-- a newline for very clean source   -->
<xsl:template match="section">
	<xsl:apply-imports />
	<xsl:text>\clearpage&#xa;</xsl:text>
</xsl:template>

</xsl:stylesheet>


================================================
FILE: contrib/ups-writers/README.md
================================================
University of Puget Sound's "Writer's Handbook"
===============================================

Compatibility layers to support extra features for discussing aspects of writing.

* Different styles of underlining.
* Colors to indicate parts of bibliography entries.
* A different ellipsis for text use.

First used Fall 2016.  None of this should be taken as especially semantic, so is not a good example of the PreTeXt philosophy.


================================================
FILE: contrib/ups-writers/ups-writers-html.xsl
================================================
<?xml version='1.0'?> <!-- As XML file -->

<!-- For University of Puget Sound, Writer's Handbook      -->
<!-- 2016/07/29  R. Beezer, rough underline styles         -->

<!-- Identify as a stylesheet -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<!-- Import the usual HTML conversion templates          -->
<!-- Place ups-writers-html.xsl file into  mathbook/user -->
<xsl:import href="../xsl/mathbook-html.xsl" />

<xsl:output method="html" />

<xsl:param name="html.css.file" select="'mathbook-ups.css'"/>
<xsl:param name="html.knowl.example" select="'no'"/>

<xsl:param name="chunk.level" select="'3'" />

<!-- Make marked <p>s hanging indented for citiation chapter. -->
<xsl:template match="p[@indent='hanging']" mode="body">
    <xsl:param name="block-type" />
    <xsl:param name="b-original" select="true()" />
    <xsl:if test="$block-type = 'xref'">
        <xsl:apply-templates select="." mode="heading-xref-knowl" />
    </xsl:if>
    <xsl:element name="p">
        <!-- Beginning of customization -->
        <xsl:attribute name="style">
            <xsl:text>padding-left: 2em; text-indent: -2em;</xsl:text>
        </xsl:attribute>
        <!-- End of customization -->
        <xsl:if test="$b-original">
            <xsl:attribute name="id">
                <xsl:apply-templates select="." mode="internal-id" />
            </xsl:attribute>
        </xsl:if>
        <xsl:apply-templates select="*|text()">
            <xsl:with-param name="b-original" select="$b-original" />
        </xsl:apply-templates>
    </xsl:element>
</xsl:template>

<xsl:template match="un[@s='1']">
    <xsl:element name="span">
        <xsl:attribute name="class">
            <xsl:text>underline-single</xsl:text>
        </xsl:attribute>
        <xsl:attribute name="style">
            <xsl:text>border-bottom: 1px solid;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<!-- http://stackoverflow.com/questions/15643614/double-underline-tag -->
<xsl:template match="un[@s='2']">
    <xsl:element name="span">
        <xsl:attribute name="class">
            <xsl:text>underline-double</xsl:text>
        </xsl:attribute>
        <xsl:attribute name="style">
            <xsl:text>border-bottom: 3px double;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<xsl:template match="un[@s='3']">
    <xsl:element name="span">
        <xsl:attribute name="class">
            <xsl:text>underline-dashed</xsl:text>
        </xsl:attribute>
        <xsl:attribute name="style">
            <xsl:text>border-bottom: 1px dashed;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<xsl:template match="un[@s='4']">
    <xsl:element name="span">
        <xsl:attribute name="class">
            <xsl:text>underline-dotted</xsl:text>
        </xsl:attribute>
        <xsl:attribute name="style">
            <xsl:text>border-bottom: 1px dotted;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates />
    </xsl:element>
</xsl:template>

<!-- A wavy underline, potential '5':                               -->
<!--   (1) won't span lines (needs non-breaking space for snippets) -->
<!--   (2) must go into CSS, becaue of "after" pseudo-class         -->
<!-- http://stackoverflow.com/questions/28152175/a-wavy-underline-in-css -->

<!-- .mathbook-content .underline-wavy { -->
<!-- border-bottom:2px dotted black; -->
<!-- display: inline; -->
<!-- position: relative; -->
<!-- } -->
<!--  -->
<!-- .underline-wavy:after { -->
<!-- content: ''; -->
<!-- height: 5px; -->
<!-- width: 100%; -->
<!-- border-bottom:2px dotted black; -->
<!-- position: absolute; -->
<!-- bottom: -3px; -->
<!-- left: -2px; -->
<!-- } -->

<!-- Ellipsis (dots), for text, not math -->
<xsl:template match="ellipsis">
    <xsl:text>.&#xa0;.&#xa0;.</xsl:text>
</xsl:template>

<!-- Bibliography Formatting -->
<xsl:template match="i">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>font-style: italic;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<!-- Bibliography Colors -->
<xsl:template match="black">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: black;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="red">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: red;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="lightblue">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: lightblue;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="lightgreen">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: lightgreen;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="lightpurple">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: violet;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="maroon">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: maroon;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="pink">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: pink;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="darkred">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: darkred;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="blue">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: blue;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="orange">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: orange;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="teal">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: teal;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="darkpurple">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: darkviolet;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="lightpink">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: lightpink;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="green">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: green;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="darkgreen">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: darkgreen;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="navy">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: navy;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
<xsl:template match="gray">
    <xsl:element name="span">
        <xsl:attribute name="style">
            <xsl:text>color: gray;</xsl:text>
        </xsl:attribute>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>


================================================
FILE: contrib/ups-writers/ups-writers-latex.xsl
================================================
<?xml version='1.0'?> <!-- As XML file -->

<!-- For University of Puget Sound, Writer's Handbook      -->
<!-- 2016/07/29  R. Beezer, rough underline styles         -->

<!DOCTYPE xsl:stylesheet [
    <!ENTITY % entities SYSTEM "../xsl/entities.ent">
    %entities;
]>

<!-- Identify as a stylesheet -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<!-- Import the usual LaTeX conversion templates          -->
<!-- Place ups-writers-latex.xsl file into  mathbook/user -->
<xsl:import href="../xsl/mathbook-latex.xsl" />

<xsl:output method="text" />

<!-- Make marked <p>s hanging indented for citiation chapter. -->
<xsl:template match="p[@indent='hanging']">
    <xsl:if test="preceding-sibling::*[not(&SUBDIVISION-METADATA-FILTER;)][1][self::p or self::paragraphs or self::sidebyside]">
        <xsl:text>\par&#xa;</xsl:text>
    </xsl:if>
    <!-- Beginning of customization -->
    <xsl:text>\hangindent=\parindent{}\hangafter=1{}\noindent{}</xsl:text>
    <!-- End of customization -->
    <xsl:apply-templates/>
    <xsl:text>%&#xa;</xsl:text>
</xsl:template>

<!-- If also loaded for insert, delete, stale,       -->
<!-- presumably not a problem to attempt second load -->
<xsl:param name="latex.preamble.late">
    <xsl:text>\usepackage{ulem}&#xa;</xsl:text>
    <xsl:text>\normalem&#xa;</xsl:text>
    <xsl:text>\raggedbottom&#xa;</xsl:text>
</xsl:param>

<!-- General commands from the "ulem" package -->
<!-- Make semantic versions if made official  -->

<!-- single -->
<xsl:template match="un[@s='1']">
    <xsl:text>\uline{</xsl:text>
    <xsl:apply-templates />
    <xsl:text>}</xsl:text>
</xsl:template>

<!-- double -->
<xsl:template match="un[@s='2']">
    <xsl:text>\uuline{</xsl:text>
    <xsl:apply-templates />
    <xsl:text>}</xsl:text>
</xsl:template>

<!-- dashed -->
<xsl:template match="un[@s='3']">
    <xsl:text>\dashuline{</xsl:text>
    <xsl:apply-templates />
    <xsl:text>}</xsl:text>
</xsl:template>

<!-- dotted -->
<xsl:template match="un[@s='4']">
    <xsl:text>\dotuline{</xsl:text>
    <xsl:apply-templates />
    <xsl:text>}</xsl:text>
</xsl:template>

<!-- A wavy underline, potential '5': \uwave{} -->

<!-- Ellipsis (dots), for text, not math -->
<xsl:template match="ellipsis">
    <xsl:text>{.~.~.}</xsl:text>
</xsl:template>

<!-- Bibliography Formatting -->
<xsl:template match="i">
    <xsl:text>\textit{</xsl:text>
    <xsl:apply-templates/>
    <xsl:text>}</xsl:text>
</xsl:template>

<!-- Bibliography Colors -->
<xsl:template match="black">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{black}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="red">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{red}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="lightblue">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{LightBlue}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="lightgreen">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{LightGreen}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="lightpurple">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{Lavender}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="maroon">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{Maroon}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="pink">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{pink}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="darkred">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{DarkRed}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="blue">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{blue}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="orange">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{orange}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="teal">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{teal}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="darkpurple">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{DarkViolet}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="lightpink">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{LightPink}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="green">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{green}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="darkgreen">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{DarkGreen}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="navy">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{Navy}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
<xsl:template match="gray">
    <xsl:if test="$latex.print='no'">
        <xsl:text>\textcolor{gray}{</xsl:text>
    </xsl:if>
    <xsl:apply-templates/>
    <xsl:if test="$latex.print='no'">
        <xsl:text>}</xsl:text>
    </xsl:if>
</xsl:template>
</xsl:stylesheet>


================================================
FILE: css/README.md
================================================
# Notes on CSS structure and development

PreTeXt books expect to use a `theme.css` file for its styling. SCSS is used to build that CSS file.

A few themes (the default-modern one and legacy ones that predate SCSS overhaul) are provided "prerolled" in `css/dist`. These can be used without rebuilding from SCSS and even gently modified via the appending of CSS `variables` to customize things like `primary-color`.

Other themes, or using `options` to more substantially change a "prerolled" theme, require that the theme is rebuilt.

## Building

If a book's theme requires building, the pretext script or CLI should handle all of the build details. If you are using the CLI, it should handle installing the build tools as well. If you are using the pretext script, you will need to [install Node and the build script dependencies manually](../script/cssbuilder/README.md#installing-node-and-dependencies)

For more advanced use, including rebuilding themes by hand, see the [CSS Builder script README](../script/cssbuilder/README.md)

### Installing NPM

You will need to [install node](https://nodejs.org/en/download/package-manager).

Install the needed dependencies by switching to the `pretext/script/cssbuilder` and doing `npm install`.

Run `npm run build` to build all the default targets to the output directory (default is `pretext/css/dist`). You can change the directory the build product is produced into with `-o PATH`. If using a relative path, make sure to specify it from the `cssbuilder` folder.

## Folders

### colors

Color palettes that ideally can be used across multiple themes, though it is not expected every palette will be available in every theme. These are all designed to produce a variable `$colors` containing a map of variable definitions. The theme is responsible for turning that map into CSS variables via the `scss-to-css` function.

If a shared palette needs slight modifications by a given theme, the theme can simply override the individual variables (or add new ones). See the comment in `theme-default-modern` for an example.

### components

Shared files that are (or are expected to be) used across many **targets**.

Some of these files are in need of refactoring and modularization.

See README.md in subfolders of `components/` for tips on organization of subcomponents.

### dist

Built CSS ready for inclusion by pretext.

Files in the directory **should not be modified by hand**. The CSS build script in `script/cssbuilder` will produce these files from the items in the `targets` directory.

### fonts

Mechanisms for selection of fonts by a theme

### legacy

Files only used by legacy (pre scss) styles

### targets

Root targets that produce a CSS file. Anything that represents a self-contained final product belongs here.

Any files that are designed only to be used in one target also belong here, grouped with the target they belong to. For example, if `foo.scss` is only intended to be used by the `reveal` target, that file should be placed in the `revealjs` folder.

### other

CSS that is not a part of producing PreTeXt volumes and is not bundled into any target in `dist/` e.g. CSS related to the PreTeXt catalog.

## File "ownership", @use, and copy/paste

Files in the `target` folder are considered "owned" by the folder they are in. When making changes to those files you are encouraged to think about other targets in the same "family" that may @use the files, but are not expected to go out of your way to fix issues in those other targets that result from the changes.

Files in `components` are "shared". Changes to them should consider (and test) all targets that @use the component.

There is a balancing act between the complexity of the include tree for targets and avoiding duplication of effort. Avoid coping/pasting large numbers of rules from one target to another. If you want to reuse some of the rules from another target, consider factoring out those rules into a `component` that the old file and your new one can both @use. But doing so to reuse a small number of CSS rules likely creates more complexity than simply duplicating those rules in your target.

## Tips on differentiating theme code

1) In cases of significantly different CSS, we try to provide different scss files that themes can choose to import (see `_toc-default` vs `_toc-overlay`). As any given theme will only (hopefully) import one of the options, we don't have to worry about cross talk between the CSS. Common features of the two can be factored out into a sheet they both import (`_toc-basics`).

2) In cases of more minor variations, especially those that end up affecting multiple rules (e.g. how much margin to apply, whether or not to round off border corners) we try to pass in a variable to the scss file to control that aspect. Those variables can have defaults that are applied if a theme does not specify a default. The downside here is that variables need to be passed all the way down through any stylesheets that are between the theme and the target sheet. So in this case a theme file like `theme-default-modern` would have to pass $toc-expander-style to  `_toc-default` as it imports that and `_to-default` would then have to pass it to `_toc-basics` where it is applied.

3) Differences that are only value differences in CSS properties can be set as cssvaraibles. We use that for lots of the colors. A low level file can set `border-right: 1px solid var(--toc-border-color);`. Then a theme can change --toc-border-color` and the new color is used.

4) The last approach is to just define CSS in the theme SCSS file that adds to or overrides what is produced in the import. This works well if the change only makes sense in the context of a particular theme AND if they are extending what is already there instead of undoing all of the defaults to replace them with something new.  We do this for things like Salem making a bunch of the RS elements wider. If the same logic needs to be applied to multiple themes, consider making a mixin file that they can opt into (see `toc-expand-chevrons`).


================================================
FILE: css/colors/_color-helpers.scss
================================================
// This file contains functions and mixins for working with colors in SCSS

@use "sass:map";
@use "sass:color";

@mixin set-root-colors($colors, $dark-colors: null) {
  :root {
    color-scheme: light;
    // prevent variable leak through to dark
    &:not(.dark-mode) {
      @include scss-to-css($colors);
    }
  }

  @if $dark-colors {
    :root.dark-mode {
      color-scheme: dark;
      @include scss-to-css($dark-colors);
    }
  }
}

// Renders a map of SCSS variables as CSS variables
@mixin scss-to-css($colors) {
  @each $name, $value in $colors {
    --#{$name}: #{$value};
  }
}

// Create a map of colors that blend $color with $other at $mix-amounts
// The resulting map will have keys of the form 'color-other-10'
// Indicating 10% of other mixed into color
@function mixes($color, $other, $mix-amounts) {
  $result: ();

  @each $i in $mix-amounts {
    $result: map.set($result, '#{$color}-#{$other}-#{$i}', 'color-mix(in oklab, var(--#{$color}), #{$other} #{$i}%)');
  }

  @return $result;
}

$std-mixes: (1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 50, 60, 65, 70, 75, 80, 85, 90, 95, 96, 97, 98, 99);

// Creates a map of color blends for a given color
// By default it creates blends with black, white, and gray at $std-mixes amounts
// Mixing is done using css color-mix function so that if a theme file has the base
// css variable overridden, the blends will be updated accordingly
@function get-blends($color, $shades: $std-mixes, $tints: $std-mixes, $tones: $std-mixes, ) {
  $shades: mixes($color, black, $std-mixes);
  $tints: mixes($color, white, $std-mixes);
  $tones: mixes($color, gray, $std-mixes);

  $blends: map.merge(
    $tints,
    $shades
  );

  $blends: map.merge(
    $blends,
    $tones
  );
  @return $blends;
}

//--------------------------------------------------------------------------
// https://jonnykates.medium.com/automating-colour-contrast-ratios-with-sass-e201f3b52797
// Formula there has a typo, need parens around the sum of the three color channels

@function text-contrast($color, $light: #ffffff, $dark: #000000) {
  $color-brightness: round(
    (
      (color.red($color) * 299) +
      (color.green($color) * 587) +
      (color.blue($color) * 114)
    ) / 1000
  );

  $light-color: round(
    (
      (color.red(#ffffff) * 299) +
      (color.green(#ffffff) * 587) +
      (color.blue(#ffffff) * 114)
    ) / 1000
  );

  @if abs($color-brightness) < calc($light-color / 2){
    @return $light;
  } @else {
    @return $dark;
  }
}

// @debug "text-contrast(#7b7b55) should be #ffffff: " text-contrast(#7b7b55);
// @debug "text-contrast(#9b9b70) should be #000000: " text-contrast(#9b9b70);
// @debug "text-contrast(#766f7a) should be #ffffff: " text-contrast(#766f7a);
// @debug "text-contrast(#70909b) should be #000000: " text-contrast(#70909b);
//--------------------------------------------rgb(25, 25, 24)-----------------------


================================================
FILE: css/colors/_color-vars.scss
================================================
/*
  Master list of color variables and default values.
  Variables are defined in SCSS to allow for calculation of values. They are
  then converted to CSS variables for use in the HTML so authors can, if
  need be, override them with custom CSS.

  Any new variable should be added to this file and either defined to another
  variable or given a reasonable default value for the red-blue default theme.

  Variables should be semantic, not descriptive
  i.e. --link-color, not --pretty-blue
*/

@use "sass:map";

// ==============================================================================
// Light theme

// ==============================================================================
// Page structures

$colors: (
  // Background of page (gutters if any)
  "page-color": white,
  // Background of content area
  "content-background": white,
  // Border around content area - also possibly used for internal borders
  "page-border-color": #ccc,

  // ------------------------------------------------------------------------------
  // Banner/nav related

  "doc-title-color": #932919,
  "byline-color": #333,
  "banner-background": #fafafa,
  "navbar-background": #ededed,
  "footer-background": var(--banner-background),

  // ------------------------------------------------------------------------------
  // TOC related

  "toc-border-color": #666,
  "toc-background": var(--content-background),

  "tocitem-background": var(--toc-background),
  "toc-text-color": var(--body-text-color),

  // highlight styles are used for hover
  "tocitem-highlight-background": #671d12,
  "tocitem-highlight-text-color": white,
  "tocitem-highlight-border-color": var(--toc-border-color),
  
  // active styles are used for the current toc item
  "tocitem-active-background": #671d12,
  "tocitem-active-text-color": white,
  "tocitem-active-border-color": var(--toc-border-color),

  // level based colors for TOC
  // levels are not necessarily all used
  // see the toc-basics.scss for how these are determined
  "toclevel1-background": var(--content-background),
  "toclevel1-text-color": var(--toc-text-color),
  "toclevel2-background": var(--content-background),
  "toclevel2-text-color": var(--toc-text-color),
  "toclevel3-background": var(--content-background),
  "toclevel3-text-color": var(--toc-text-color),


  // ==============================================================================
  // Content
  // ==============================================================================

  // ------------------------------------------------------------------------------
  // Text & titles

  "body-text-color": #000,
  "body-title-color": #000,

  "ptx-image-bg": transparent,
  "activated-content-bg": rgba(241, 185, 255, 30%),

  "summary-link-background": var(--button-background),
  "summary-link-text-color": var(--button-text-color),
  "summary-link-hover-background": var(--button-hover-background),
  "summary-link-hover-text-color": var(--button-hover-text-color),

  // ------------------------------------------------------------------------------
  // Links & knowls

  "link-text-color": #2B5F82,
  "link-background": transparent,
  "link-active-text-color": var(--link-text-color),
  "link-active-background": #cad2e1,

  "link-alt-text-color": #A62E1C,
  "link-alt-background": transparent,
  "link-alt-active-text-color": var(--link-alt-text-color),
  "link-alt-active-background": #e3d1ce,

  "knowl-link-color": var(--link-text-color),
  "knowl-background": #f5f8ff,
  "knowl-border-color": #e0e9ff,
  "knowl-nested-1-background": #f5f5ff,
  "knowl-nested-2-background": #fffff5,
  "knowl-nested-3-background": #f5ffff,
  "knowl-nested-4-background": #fff5f5,

  // ------------------------------------------------------------------------------
  // Blocks

  // Fall back generic block colors:
  "block-body-background": var(--content-background),
  "block-border-color": var(--knowl-border-color),
  "block-head-color": var(--body-text-color),

  // See below for specific block types
  
  "aside-like-link-color": var(--link-text-color),

  // ------------------------------------------------------------------------------
  // Buttons & Widgets

  "button-background": #ededed,
  "button-text-color": #333333,
  "button-border-color": #ccc,
  "button-hover-background": #c7c7c7,
  "button-hover-text-color": var(--button-text-color),

  "dropdown-background": var(--content-background),
  "dropdown-border-color": var(--toc-border-color),
  "dropdown-text-color": var(--toc-text-color),
  "dropdown-hover-background": var(--tocitem-active-background),
  "dropdown-hover-text-color": var(--tocitem-active-text-color),

  // ------------------------------------------------------------------------------
  // Other
  "code-background": #fdfdfd,
  "code-inline-background": #ededed,
);

// ==============================================================================
// Block types

// Variables for specific block types should look like those below. In this file
// only "top level" blocks from the -like families are defined. 
// Other themes/color palettes may define
// more specific ones - see palette_quad_chunks.scss for an example.

// block-types based on those in entities.ent
$block-types: "assemblage-like", "definition-like", "theorem-like", "theorem-like", "axiom-like", "remark-like", "computation-like", "openproblem-like", "aside-like", "proof-like", "example-like", "project-like", "goal-like", "solution-like";
// TODO - "proof" should probably be updated to "proof-like" in HTML css

@each $block in $block-types {
  $colors: map.merge(
    $colors,
    (
      // define background and border, but default to generic block colors
      "#{$block}-body-background": var(--block-body-background),
      "#{$block}-border-color": var(--block-border-color),
    )
  );
}


================================================
FILE: css/colors/_palette-dark.scss
================================================
// Implements a dark theme single color palette using a --primary-color

@use "sass:meta";
@use "sass:color";
@use "sass:map";
@use "colors/color-helpers" as colorHelpers;
@use "colors/color-vars.scss" as color-vars;

$primary-color: #6285ca !default;
$background-color: #23241f !default;

// Grab all color variables, override some for palette
$colors: map.merge(
  color-vars.$colors,
  (
  "primary-color": $primary-color,
  "background-color": $background-color,

  // Background of page (gutters if any)
  "page-color": var(--background-color),
  // Background of content area
  "content-background": var(--page-color),
  // Border around content area - also possibly used for internal borders
  "page-border-color": var(--background-color-white-25),

  // ------------------------------------------------------------------------------
  // Banner/nav related

  "doc-title-color": var(--primary-color),
  "banner-background": $background-color,
  "navbar-background": var(--background-color-gray-15),
  "footer-background": var(--background-color-black-10),

  // ------------------------------------------------------------------------------
  // TOC related

  "toc-border-color": #555,
  "toc-text-color": var(--body-text-color),

  // highlight styles are used for hover/active states
  "tocitem-highlight-background": var(--primary-color-gray-5),
  // "tocitem-highlight-text-color": white,
  "tocitem-highlight-text-color": var(--background-color-black-50),
  
  "tocitem-active-background": var(--primary-color-gray-5),
  // "tocitem-active-text-color": white,
  "tocitem-active-text-color": var(--background-color-black-50),

  "toclevel1-background": var(--background-color-gray-10),
  "toclevel1-text-color": var(--primary-color-white-40),
  "toclevel2-background": var(--toclevel1-background),
  "toclevel2-text-color": var(--toclevel1-text-color),
  "toclevel3-background": var(--content-background),
  "toclevel3-text-color": var(--toc-text-color),

  // ==============================================================================
  // Content
  // ==============================================================================

  // ------------------------------------------------------------------------------
  // Text & titles

  "body-text-color": #f2f2f2,
  "body-title-color": var(--primary-color-white-20),
  "byline-color": var(--background-color-white-50),
  
  "ptx-image-bg": white,

  "activated-content-bg": rgba(255, 237, 185, 20%),

  // ------------------------------------------------------------------------------
  // Links & knowls

  "link-text-color": var(--primary-color-white-10),
  "link-active-background": var(--background-color-gray-30),
  "link-active-text-color": var(--primary-color-white-40),
  "link-alt-text-color": var(--link-text-color),
  "link-alt-active-background": var(--link-active-text-color),
  "knowl-link-color": var(--doc-title-color),
  "knowl-background": var(--background-color-black-10),
  "knowl-border-color": var(--background-color-white-20),
  "knowl-nested-1-background": var(--background-color-gray-10),
  "knowl-nested-2-background": var(--background-color-black-10),
  "knowl-nested-3-background": var(--background-color-gray-10),
  "knowl-nested-4-background": var(--background-color-black-10),

  // ------------------------------------------------------------------------------
  // Groupings (assemblages, etc...)

  // ------------------------------------------------------------------------------
  // Buttons & Widgets
  "button-background": var(--background-color-gray-15),
  "button-border-color": var(--background-color-white-25),
  "button-hover-background": var(--primary-color-black-50),
  "button-text-color": var(--body-text-color),

  // ------------------------------------------------------------------------------
  // Other
  "code-background": var(--background-color-gray-20),
  "code-inline-background": var(--background-color-gray-20),
  )
);


// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('background-color');
$colors: map.merge(
  $colors,
  $blends
);

// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('primary-color');
$colors: map.merge(
  $colors,
  $blends
);


================================================
FILE: css/colors/_palette-dual.scss
================================================
// Implements a palette with two main colors, --primary-color and --secondary-color

@use "sass:meta";
@use "sass:color";
@use "sass:map";
@use "colors/color-helpers" as colorHelpers;
@use "colors/color-vars" as color-vars;

$schemes: (
  "blue-red": (
    "primary-color": #195684,
    "secondary-color": #932c1c,
  ),
  "blue-green": (
    "primary-color": #195684,
    "secondary-color": #28803f,
  ),
  "green-blue": (
    "primary-color": #1a602d,
    "secondary-color": #2a5ea4,
  ),
  "greens": (
    "primary-color": #193e1c,
    "secondary-color": #347a3a,
  ),
  "blues": (
    "primary-color": hsl(217, 70%, 20%),
    "secondary-color": hsl(216, 42%, 47%),
  ),
);

$palette: 'red-blue' !default;

@if not map.has-key($schemes, $palette) {
  @error "Unknown color scheme #{$palette} for theme. Valid schemes are: #{map.keys($schemes)}";
}

// if primary-color or secondary-color are not set, use the scheme colors
$primary-color: null !default;
$secondary-color: null !default;

@if $primary-color == null {
  $scheme-primary-color: map.get(map.get($schemes, $palette), "primary-color");
  $primary-color: $scheme-primary-color;
}
@if $secondary-color == null {
  $scheme-secondary-color: map.get(map.get($schemes, $palette), "secondary-color");
  $secondary-color: $scheme-secondary-color;
}

// Start with values from color-vars
$colors: map.merge(
  color-vars.$colors, ()
);

// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('primary-color');
$colors: map.merge(
  $colors,
  $blends
);
$blends: colorHelpers.get-blends('secondary-color');
$colors: map.merge(
  $colors,
  $blends
);

// Override some colors
$colors: map.merge(
  $colors,
  (
    "primary-color": $primary-color,
    "secondary-color": $secondary-color,

    "link-text-color": var(--primary-color),
    "link-active-text-color": var(--primary-color-black-20),
    "link-background": var(--primary-color-white-97),
    "link-active-background": var(--link-background),

    "link-alt-text-color": var(--secondary-color-black-10),
    "link-alt-active-background": var(--secondary-color-white-97),
    "link-alt-background": var(--secondary-color-white-97),

    "toc-border-color": var(--primary-color-white-30),

    "toclevel1-background": var(--primary-color),
    "toclevel1-text-color": white,
    "toclevel2-background": var(--primary-color-white-10),
    "toclevel2-text-color": var(--toclevel1-text-color),

    "tocitem-highlight-background": var(--secondary-color-white-10),
    "tocitem-highlight-text-color": white,
    
    "tocitem-active-background": var(--secondary-color),
    "tocitem-active-text-color": white,

    "doc-title-color": var(--primary-color),

    "aside-like-body-background": var(--knowl-background),
    "aside-like-border-color": var(--knowl-border-color),

    "assemblage-like-body-background": var(--knowl-background),
    "assemblage-like-border-color": var(--knowl-border-color),

    "activated-content-bg": color.scale($secondary-color, $lightness: 90%),

    "goal-like-border-color": var(--secondary-color-white-20),

    "knowl-background": var(--primary-color-white-97),
    "knowl-border-color": var(--primary-color-white-30),
    "knowl-nested-1-background": var(--secondary-color-white-97),
    "knowl-nested-2-background": var(--primary-color-white-97),
    "knowl-nested-3-background": var(--secondary-color-white-97),
    "knowl-nested-4-background": var(--primary-color-white-97),
  )
);


================================================
FILE: css/colors/_palette-quad-chunks.scss
================================================
// Defines colors for grouping elements based on four colors to identify 
// block elements as either main, do, fact, or meta.

// Intended to be used as a supplement to a palette that handles non-block elements
// See theme-denver.scss for an example

// Hint: color palettes general make the most sense if all four colors are distinct
// or, if they are not, the close/identical colors are main/fact or do/meta

@use 'sass:color';
@use 'sass:map';

$schemes: (
  "earth-sea": (
    "color-main": #573d31,
    "color-do": #0f6385,
    "color-fact": #997562,
    "color-meta": #358292,
  ),
  "leaves": (
    "color-main": #105b2f,
    "color-do": #987436,
    "color-fact": #29895c,
    "color-meta": #c7522a,
  ),
  "ice-fire": (
    "color-main": hsl(210, 45%, 27%),
    "color-do": hsl(208, 7%, 49%),
    "color-fact": #0f80b0,
    "color-meta": #a13838,
  ),
  "slate": (
    "color-main": hsl(210, 12%, 20%),
    "color-do": #165976,
    "color-fact": hsl(210, 5%, 32%),
    "color-meta": #021e2a,
  ),
  "bold": (
    "color-main": hsl(221, 61%, 21%),
    "color-do": #51b39a,
    "color-fact": #9a51b3,
    "color-meta": #b3516a,
  ),
  "bold2": (
    "color-main": hsl(221, 61%, 21%),
    "color-do": hsl(118, 51%, 42%),
    "color-fact": hsl(182, 90%, 35%),
    "color-meta": hsl(51, 84%, 63%),
  ),
  "primaries": (
    "color-main": #195684,
    "color-do": #28803f,
    "color-fact": #195684,
    "color-meta": #932c1c, 
  ),
  "primaries2": (
    "color-main": #28803f,
    "color-do": #195684,
    "color-fact": #28803f,
    "color-meta": #932c1c,
  ),
);

$palette: 'bold' !default;

@if not map.has-key($schemes, $palette) {
  @error "Unknown color scheme #{$palette} in theme. Valid schemes are: #{map.keys($schemes)}";
}

// color-main is for basic groupings and knowls
$color-main: null !default;

// color-do is for examples and things for the reader to do
$color-do: null !default;

// color-fact is for statements of fact (definitions/theorems/etc...)
$color-fact: null !default;

// color-meta is for meta information for the reader (notes/objectives/etc...)
$color-meta: null !default;

// if a color is not set, use the scheme colors
@if $color-main == null {
  $scheme-color: map.get(map.get($schemes, $palette), "color-main");
  $color-main: $scheme-color;
}
@if $color-do == null {
  $scheme-color: map.get(map.get($schemes, $palette), "color-do");
  $color-do: $scheme-color;
}
@if $color-fact == null {
  $scheme-color: map.get(map.get($schemes, $palette), "color-fact");
  $color-fact: $scheme-color;
}
@if $color-meta == null {
  $scheme-color: map.get(map.get($schemes, $palette), "color-meta");
  $color-meta: $scheme-color;
}


// text color for headings
$heading-text-color: white !default;

$body-light: 96%;
$body-light-alt: 93%;
$body-sat: -20%;

//lighter version of color-main for knowl borders
$color-main-alt: color.adjust(color.scale($color-main, $lightness: 25%), $saturation: $body-sat);

//Make light versions of the 4 colors for backgrounds behind 
$color-main-light: color.adjust(color.change($color-main, $lightness: $body-light), $saturation: $body-sat);
$color-do-light: color.adjust(color.change($color-do, $lightness: $body-light), $saturation: $body-sat);
$color-fact-light: color.adjust(color.change($color-fact, $lightness: $body-light), $saturation: $body-sat);
$color-meta-light: color.adjust(color.change($color-meta, $lightness: $body-light), $saturation: $body-sat);
//and an alt of color-main for nested knowls
$color-main-light-alt: color.change($color-main, $lightness: $body-light-alt);

$colors: (
  "color-main": $color-main,
  "color-meta": $color-meta,
  "color-do": $color-do,
  "color-fact": $color-fact,

  // color-main
  "block-body-background": $color-main-light,
  "block-border-color": $color-main-alt,
  "block-head-color": $heading-text-color,

  "knowl-background": $color-main-light,
  "knowl-border-color": $color-main-alt,
  "knowl-nested-1-background": $color-main-light-alt,
  "knowl-nested-2-background": $color-main-light,
  "knowl-nested-3-background": $color-main-light-alt,
  "knowl-nested-4-background": $color-main-light,
);


// block-types based on those in entities.ent
$do-types: "exercise-like", "project-like", "solution-like", "example-like";
@each $block in $do-types {
  $colors: map.merge(
    $colors,
    (
      // define background and border, but default to generic block colors
      "#{$block}-body-background": $color-do-light,
      "#{$block}-border-color": $color-do,
    )
  );
}

$fact-types: "definition-like", "proof-like", "theorem-like", "computation-like";
@each $block in $fact-types {
  $colors: map.merge(
    $colors,
    (
      // define background and border, but default to generic block colors
      "#{$block}-body-background": $color-fact-light,
      "#{$block}-border-color": $color-fact,
    )
  );
}

$meta-types: "goal-like", "asside-like", "remark-like";
@each $block in $meta-types {
  $colors: map.merge(
    $colors,
    (
      // define background and border, but default to generic block colors
      "#{$block}-body-background": $color-meta-light,
      "#{$block}-border-color": $color-meta,
    )
  );
}


================================================
FILE: css/colors/_palette-single-bold.scss
================================================
// Implements a palette with one main --primary-color
// More dramatic than _palette-single.scss

@use "sass:meta";
@use "sass:color";
@use "sass:map";
@use "colors/color-helpers" as colorHelpers;
@use "colors/color-vars" as color-vars;

$primary-color: #2a5ea4 !default;

// Start with values from color-vars
$colors: map.merge(
  color-vars.$colors, ()
);

// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('primary-color');
$colors: map.merge(
  $colors,
  $blends
);

$slate: #3a3a3a;

// Override some colors
$colors: map.merge(
  $colors,
  (
    "primary-color": $primary-color,
    "doc-title-color": var(--primary-color),
    "banner-background": #f8f8f8,

    "toc-text-color": var(--primary-color-black-30),
    "toc-border": var(--primary-color-gray-10),

    "tocitem-highlight-background": $slate,
    "tocitem-highlight-text-color": #fff,
    "tocitem-highlight-border-color": $slate,

    "tocitem-active-background": var(--primary-color-white-15),

    "toclevel1-text-color": var(--toc-text-color),
    "toclevel1-background": var(--content-background),

    "toclevel2-background": var(--primary-color-white-98),
    "toclevel3-background": var(--primary-color-white-96),

    "link-text-color": var(--primary-color),
    "link-active-text-color": var(--primary-color),
    "link-active-background": var(--primary-color-white-96),
    "link-alt-text-color": var(--link-text-color),
    "link-alt-active-background": var(--primary-color-white-96),

    "body-title-color": var(--primary-color-black-20),
    "navbar-background": var(--primary-color),
    "button-background": var(--primary-color),
    "button-border-color": $slate,
    "button-text-color": var(--primary-color-white-90),
    "button-hover-background": $slate,

    "knowl-background": #f8f8f8,
    "knowl-border-color": var(--primary-color-gray-80),
  )
);


================================================
FILE: css/colors/_palette-single-muted.scss
================================================
// Implements a palette with one main --primary-color used in a very sparing fashion

@use "sass:meta";
@use "sass:color";
@use "sass:map";
@use "colors/color-helpers" as colorHelpers;
@use "colors/color-vars" as color-vars;

$primary-color: #2a5ea4 !default;

// Start with values from color-vars
$colors: map.merge(
  color-vars.$colors, ()
);

// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('primary-color');
$colors: map.merge(
  $colors,
  $blends
);

// Override some colors
$colors: map.merge(
  $colors,
  (
    "primary-color": $primary-color,

    "link-text-color": var(--primary-color),
    "link-active-text-color": var(--primary-color-white-40),
    "link-active-background": var(--background-color-gray-30),
    "link-alt-text-color": var(--link-text-color),
    "link-alt-active-background": var(--link-active-text-color),

    "banner-background": "#fafafa",

    "toc-border-color": #c9c9c9,
    "toc-text-color": var(--primary-color-black-30),
    "tocitem-background": #f2f2f2,

    "tocitem-active-background": var(--primary-color),
    "tocitem-highlight-background": var(--primary-color-white-10),

    // "toclevel1-background": var(--primary-color-white-95),
    "toclevel2-background": var(--primary-color-white-98),
    "toclevel3-background": var(--primary-color-white-95),

    "doc-title-color": var(--primary-color),
    "body-title-color": "black",

    "knowl-background": #f8f8f8,
    "knowl-nested-1-background": var(--knowl-background),
    "knowl-nested-2-background": var(--knowl-background),
    "knowl-nested-3-background": var(--knowl-background),
    "knowl-nested-4-background": var(--knowl-background),
    "knowl-border-color": var(--primary-color-gray-80),
    "block-border-color": black,

    "goal-border-color": var(--primary-color-white-20),
  )
);


================================================
FILE: css/colors/_palette-single.scss
================================================
// Implements a palette with one main --primary-color

@use "sass:meta";
@use "sass:color";
@use "sass:map";
@use "colors/color-helpers" as colorHelpers;
@use "colors/color-vars" as color-vars;

$primary-color: #2a5ea4 !default;

// Start with values from color-vars
$colors: map.merge(
  color-vars.$colors, ()
);

// Compute color blends and add them as variables
$blends: colorHelpers.get-blends('primary-color');
$colors: map.merge(
  $colors,
  $blends
);

// Override some colors
$colors: map.merge(
  $colors,
  (
    "primary-color": $primary-color,

    "banner-background": "#fafafa",

    "link-text-color": var(--primary-color),
    "link-active-text-color": var(--primary-color-white-40),
    "link-active-background": var(--background-color-gray-30),
    "link-alt-text-color": var(--link-text-color),
    "link-alt-active-background": var(--link-active-text-color),

    "toc-border-color": var(--primary-color-white-80),

    "toc-text-color": var(--primary-color-black-30),

    "tocitem-active-background": var(--primary-color-white-15),
    "tocitem-highlight-background": var(--primary-color-white-15),

    "toclevel2-background": var(--primary-color-white-95),
    "toclevel3-background": var(--primary-color-white-90),

    "doc-title-color": var(--primary-color),
    "body-title-color": var(--primary-color-black-20),
    "button-hover-background": var(--primary-color-white-80),
    "assemb-border-color": var(--primary-color-white-50),

    "block-head-color": white,
    "knowl-background": var(--primary-color-white-95),
    "knowl-border-color": var(--primary-color),
  )
);


================================================
FILE: css/components/README.md
================================================
# Notes on components folder

Components contains pieces shared by all modern scss themes. They are divided into:

## chunks

Grouping elements that are generally PreTeXt specific - exercises, knowls, etc...

Generally all these will be included by a `chunks-XXXX` file like `_chunks-default.scss`.

## elements

Small, relatively self contained pieces of content.

These are all included from `components/_pretext.scss`

## helpers

Mixins used to help build multiple other components

## interactives

Interactive widgets like Runestone, Sage, etc...

`interactives/extras` contains optional modifications that a theme can use.

## page-parts

Macro structures of the page - TOC, navbar, etc...

`page-parts/extras` contains optional modifications that a theme can use.


================================================
FILE: css/components/_google-search.scss
================================================
// TODO - refactor
// Make conditional on use of google search???

.pretext .searchwrapper {
  max-width: 900px;
  position: absolute;
  right: 0;
  bottom: 0;
  margin-bottom: 39px;
}

.pretext .searchwrapper .cse .gsc-control-cse,
.pretext .searchwrapper .cse .gsc-control-cse input,
.searchwrapper .gsc-control-cse {
  padding: 5px;
}

// .pretext .searchwrapper .cse .gsc-search-button input.gsc-search-button-v2,
// .searchwrapper input.gsc-search-button-v2 {
//   padding: 2px 2px;
// }

// .pretext .searchwrapper form.gsc-search-box {
//   margin: 0;
// }

// .pretext .searchwrapper table.gsc-search-box {
//   margin: 0;
// }

// .pretext .searchwrapper .gsc-search-box-tools .gsc-search-box .gsc-input {
//   padding: 0;
// }

// .pretext .searchwrapper .gsib_a {
//   padding: 0 0 0 5px;
// }

// .pretext .searchwrapper .gsc-input-box {
//   height: 3.0ex;
// }

// .pretext .searchwrapper form.gsc-search-box {
//   font-size: 12px;
// }


================================================
FILE: css/components/_mystery.scss
================================================
// Chunks of code that seem like one off fixes for books that may not exist
// This file is not included anywhere else - kept around temporarily for reference

.APEXlogo {
  white-space: nowrap;
}
.APEXlogo .A {
  margin-right: -0.07em;
}
.APEXlogo .P {
  margin-right: -0.33em;
  position: relative;
  top: -0.30em;
}
.APEXlogo .E {
  position: relative;
 top: 0.33em;
}


#aboelkins-ACS .ptx-main .ptx-content > section:first-of-type > section:first-of-type > .project-like:first-of-type li {
  font-size: 300%
}

.toolBPanel {
    overflow: hidden !important;
}
.toolBPanel:hover {
    overflow: auto !important;
}

.unprocessed {
    padding: 8px;
    background-color: rgb(255,230,230)
}

.unprocessed .unprocessed {
    margin: 8px;
    background-color: rgb(255,200,255)
}

.unprocessed .unprocessed .unprocessed {
    margin: 8px;
    background-color: rgb(205,205,255)
}


.ptx-navbar .preferences_menu_holder .active  > li {
  color: #ddd;
}
.ptx-navbar .preferences_menu_holder > ol > li:focus {
  background: #eef;
  border: 2px solid #909;
  padding: 2px 24px 2px 8px;
}
.ptx-navbar .preferences_menu_holder > ol > li > ol > li:focus {
  background: #eef;
  border: 2px solid #909;
  padding: 4px 4px 2px 4px;
}

.ptx-navbar .preferences_menu_holder .active .selected {
  background: #eef;
  color: #111;
}
.ptx-navbar .button.user-preferences-button {
  overflow: visible;
  display: none;
}
.preferences_menu_holder {
  z-index: 30;
  background: #fee;
  color: #222;
  position: absolute;
  left: -11em;
  top: 4em;
}
.preferences_menu_holder ol {
  list-style-type: none;
  padding: 0;
  margin: 0;
}
.preferences_menu_holder > ol {
  width: 12.5em;
}
.preferences_menu_holder > ol > li {
  padding: 4px 26px 4px 10px;
}
.preferences_menu_holder ol li ol {
  z-index: 40;
  position: absolute;
  left: 13em;
  top: -2em;
  background: #fee;
}
.preferences_menu_holder ol li ol li {
  padding: 6px 6px 4px 6px;
  display: flex;
  align-items: center;
}
.preferences_menu_holder ol.fonts:not(.hidden) {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr;
}
.preferences_menu_holder ol.fonts li:nth-child(8n+1),
.preferences_menu_holder ol.fonts li:nth-child(8n+2),
.preferences_menu_holder ol.fonts li:nth-child(8n+3),
.preferences_menu_holder ol.fonts li:nth-child(8n+4) {
    background-color: #eff;
}
.preferences_menu_holder ol.fonts li:nth-child(4n+2) {
 width: 4em;
 justify-content: center;
 text-align: center;
 align-items: center;
}
.preferences_menu_holder ol.fonts li:nth-child(4n+1) {
  padding-left: 14px;
}

.preferences_menu_holder .wrap_to_submenu {
  float: right;
  line-height: 0.95em;
  margin-right: -7px;
}
.preferences_menu_holder .to_submenu {
  position: absolute;
}
.preferences_menu_holder .avatars li {
  font-size: 200%;
  text-align: center;
}
.preferences_menu_holder .fontfamily .name {
  margin-right: 2em;
}
.preferences_menu_holder .fontfamily .sample {
  margin-left: auto;
}
.preferences_menu_holder .fonts .byunits {
  font-size: 80%;
  margin-bottom: -0.3em;
}
#choose_topic {
  background: #eef;
}
.ffcheck,
.atmospherecheck,
.avatarcheck,
.rulercheck,
.motioncheck {
  width: 1em;
  margin-left: 0.2em;
  margin-right: 0.7em;
  font-size: 11pt;
}

.preferences_menu_holder .moveQ {
  padding-top: 0.5em;
  border-top: 0.3em solid #eef;
}
.preferences_menu_holder .moveQ,
.preferences_menu_holder .moveQ ~ li {
  background: #efe;
}



// No sign of continuation class
.para.continuation {
  margin-top: 0;
}
pre + .para.continuation,
pre + form,
div + form {
  margin-top: 1em;
}
ul + .para.continuation,
ol + .para.continuation,
dl + .para.continuation {
  margin-top: 0.75em;
}


// theoretically in colophon, but do not match actual html
section .para.credit + .para.credit {
  margin-top: 0.25em;
}
section .para.credit > .title {
  font-weight: 700;
  margin-right: 0.5em;
}

// No sign of contributors class
.frontmatter .contributors, .book .contributors {
  text-align: center;
  font-style: normal;
}

// exercise-stage??
article .exercise-stage {
  font-family: var(--font-headings);
  font-weight: 700;
  color: inherit;
  font-size: 100%;
  margin-top: 0.4em;
}


// .status ???
.discussion-like.status > .heading {
  display: none;
}
.discussion-like.status > .heading + .para,
.discussion-like.status > .para {
  font-style: italic;
  display: block;
  padding-left: 1em;
}


// schema doesn't allow for title in paragraph?
 .paragraphs .para .title {
  font-family: var(--font-headings);
  font-size: 1.125em;
  font-weight: 700;
}



// ---------------------------------------------------
// bug chunk of styles for older style knowls


// This entire section causes issues with non-white backgounds. Can't identify actual problem it solves
// /* show wide equation overflow even when no scroll bars,
// from Jiří Lebl */
// .MJXc-display, .knowl-output .knowl-output .knowl-output .knowl-output .MJXc-display ,
// pre.prettyprint,
// pre.plainprint,
// pre.console,
// .code-box {

//     // background-image: linear-gradient(to right, white, white), linear-gradient(to right, white, white), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,255,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,255,0));
//     // background-position: left center, right center, left center, right center;
//     // background-repeat: no-repeat;
//     // background-color: inherit;
//     // background-size: 20px 100%, 20px 100%, 10px 100%, 10px 100%;
//     // background-attachment: local, local, scroll, scroll;
// }
// .knowl-output .MJXc-display {
//     background-image: linear-gradient(to right, var(--knowl-background), var(--knowl-background)), linear-gradient(to right, var(--knowl-background), var(--knowl-background)), linear-gradient(to right, rgba(0,0,0,.25), var(--knowl-background)), linear-gradient(to left, rgba(0,0,0,.25), var(--knowl-background));
// }
// /* this should have a variable name, maybe? */
// .knowl-output.original .MJXc-display {
//     background: inherit;
// }
// .assemblage-like .MJXc-display {
// /*
//     background-image: none;
//     background-image: linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, #f4f4fe, #f4f4fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(242,242,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(242,242,254,0));
// */
//     background-image: linear-gradient(to right, var(--assemb-body-background), var(--assemb-body-background)), linear-gradient(to right, var(--assemb-body-background), var(--assemb-body-background)), linear-gradient(to right, rgba(0,0,0,.25), var(--assemb-body-background)), linear-gradient(to left, rgba(0,0,0,.25), var(--assemb-body-background));
// }
// .knowl-output .knowl-output .MJXc-display {
//     background-image: none;
//     background-image: linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, #fffff5, #fffff5), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,255,243,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,255,243,0));
// }
// .knowl-output .knowl-output .knowl-output .MJXc-display {
//     background-image: none;
//     background-image: linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, #fff5fe, #fff5fe), linear-gradient(to right, rgba(0,0,0,.25), rgba(255,243,254,0)), linear-gradient(to left, rgba(0,0,0,.25), rgba(255,243,254,0));
// }



/* not sure where this was being used, but it made short knowls
 * look bad, like the hint here:
 * SAFurtherReading.html
*/
.knowl-output .knowl-content > *:last-child:not(.incontext) {
  margin-bottom: 0.5em;
}
.knowl-output .knowl .knowl-content > .solution-like,
.knowl-output .knowl .knowl-content > .solution-like:not(.incontext) {
  margin-bottom: 0.15em;
}
.knowl-output .knowl .knowl-content > .solution-like.hint {
  border-left: 1px solid #0f0;
  padding-left: 0.35em;
  background: #efe;
}
.knowl-output .knowl .knowl-content > .solution-like.answer {
  border-left: 2px solid #00f;
  padding-left: 0.35em;
  background: #eef;
}
.knowl-output .knowl .knowl-content > .solution-like.solution {
  border-left: 3px solid #c0c;
  padding-left: 0.5em;
  background: #fef;
}

.knowl-content > article:first-child,
.knowl-content > .solution-like:first-child {
/* padding, not margin, to get colored background (and not be absorbed) */
  padding-top: 0.25em;
}


.hidden-knowl-wrapper [data-knowl]::after, .hidden-knowl-wrapper [data-knowl]:hover::after, .hidden-knowl-wrapper .active[data-knowl]::after {
  right: 7px;
}



.exercisegroup .exercisegroup-exercises.cols1 .knowl-output {
  display: block;
}

.standalone.worksheet article > .knowl-output.original {
    margin: 0;
}

.cols2 .knowl-output, .cols3 .knowl-output, .cols4 .knowl-output, .cols5 .knowl-output, .cols5 .knowl-output {
    width: 100%;
}

.standalone.worksheet .knowl-content {
    padding: 0;
}

// ---------------------------------------------------

// Obsoluete mathjax styling?


/* maybe the remainder of this case is subsumed by the above,
   and also does not apply to MJ3 */
   .mjx-chtml.MJXc-display {
    /*Allow users on smaller screens to scroll equations*/
    /*horizontally when they don't fit on the screen*/
    overflow-x: auto;
    overflow-y: hidden;
  }

  #MathJax_ZoomFrame {
    position: static;
    background: white;
  }
  #MathJax_Zoom {
    background-color: inherit;
    border: 0;
    padding: 0;
    position: absolute;
    overflow-x: auto;
    overflow-y: visible;
    left: 10% !important;
    max-height: none !important;
  }

/*  http://sites.wcsu.edu/mbxml/OER_Linear_Alg/glossary.html
   to fix the extra margin on top of the next term when
   the previous definition ends in display math
   May need to make less specific
*/
dd .displaymath:last-child .MJXc-display {
  margin-bottom: 0;
}

/* Example 4.8 of sample article (compare main page of sample book (4^{th} edition)`*/
a .heading .mjx-chtml {
    z-index: 1;
    background: #fff;
}

/* solution to Example 4.2.12 in http://spot.pcc.edu/math/orcca-draft/orcca/section-radical-expressions-and-rational-exponents.html
*/
.solution ol li > .para:first-child, .solution ol li > .displaymath:first-child {
  vertical-align: top;
  display: inline-block;
  margin-top: 0;
}
.solution ol li > .displaymath:first-child .MJXc-display {
  margin-top: 0;
}


/* to stop things being blue when rendering MathJax with SVG */
a.mjx-svg-href  {
  fill: inherit;
  stroke: inherit;
}



// Old UI for sage cell?
.ui-dialog.ui-widget.ui-widget-content.ui-corner-all.ui-draggable.ui-resizable {
  left: 0 !important;
  top: 0 !important;
}




// no sign of posterior /* Currently only for Solution to example */
.posterior .heading {
  font-weight: normal;
  font-size: 1.125em;
  line-height: 1.125em;
  margin-top: 0;
}
/* if hints and solutions are in .posterior, then
 * some of the above styling does not apply */
article.exercise-like + .posterior {
    margin-top: -0.75em;
}
// Currently only for Solution to example
.posterior .heading {
  font-weight: normal;
  font-size: 1.125em;
  line-height: 1.125em;
  margin-top: 0;
}






// Can't find use of .wrap
figcaption .wrap {
  margin: 10px;
  font-size: 100%;
  text-align: center;
}
no sign of wrap class
&.wrap img {
  width: 250px;
}
figure.wrap {
  float: right;
  margin-right: 0;
  margin-left: 30px;
}
figure img.wrap {
  float: right;
  margin: 0;
}

// Permalinks break these and have for years... currently useless
figure.table-like figcaption:first-child {
  font-style: oblique;
  margin-top: 0;
}
figure.table-like figcaption:first-child .type,
figure.table-like figcaption:first-child .codenumber {
  font-style: normal;
}


// autoterm??
.autoterm [knowl], .autoterm [knowl]:after {
  font-weight: inherit;
  color: inherit;
  padding: 0;
  margin-bottom: inherit;
  border-bottom: inherit;
  border-bottom-color: inherit;
}
.autoterm [knowl]:hover {
  background: #ffddff;
  border-top: 2px dotted purple;
  border-bottom: 1px dotted red;
  border-top-left-radius: 0;
  border-top-right-radius: 0;
}



// floatnav??
.floatnav {
  margin-top: 8px;
  margin-left: 50px;
}

.floatnav a {
  padding-left: 3px;
/*
*  omitted, because we put a space in the source
  padding-right: 3px;
*/
  margin-right: -1px;
  color: inherit;
}

.floatnav a:hover {
    background: #eeaaff;
}



// tt ??
a > tt {
  font-size: 110%;
}





/* next is for the old code formatting js */
pre.prettyprint,
pre.plainprint {
  margin-top: 0;
  padding-left: 15px;
  border-left: 1px solid #aaa;
  font-size: 93%;
  overflow: auto;
/* preveiously turned off the border and padding from pretty.css */
}

pre.prettyprint:before,
pre.plainprint:before {
  content:'';
  font-size: 50%;
  border-top: 1px solid #aaa;
  display: block;
  margin-right: auto;
  margin-left: -15px;
  width: 2.5em;
}



/* math directly adajacent to words is wrapped to avoid bad line breaks */
.mathword {
  white-space: nowrap;
}



/* Born-hidden example with a very long title */
/* http://physics.thomasmore.edu/ConnectedPhysics/sss-netforce.html */
a .heading {
  white-space: normal;
}



.minipage  + .minipage {
  display: inline-block;
}


// Early attempt at merging Runestone???
/* Runestone nav for Runestone-wide features */
.pretext #brand-navbar,
.pretext .brand-navbar {
  left: 0;
  position: fixed;
  right: 0;
  z-index: 1030;
  height: 50px;
  border-width: 0 0 1px;
  top: 0;
  margin-bottom: 0;
}
.pretext #brand-navbar > .container::before,
.pretext .brand-navbar > .container::before,
.pretext #brand-navbar > .container::after,
.pretext .brand-navbar > .container::after {
  display: none;
}
.pretext #brand-navbar + .ptx-masthead,
.pretext .brand-navbar + .ptx-masthead {
  margin-top: 50px;
}
.pretext #brand-navbar .navbar-collapse.collapse,
.pretext .brand-navbar .navbar-collapse.collapse {
  overflow: hidden !important;
}
.pretext #brand-navbar ~ .ptx-navbar,
.pretext .brand-navbar ~ .ptx-navbar {
  top: 50px;
}
@media screen and (max-width: 800px) {
  .pretext #brand-navbar ~ .ptx-navbar,
  .pretext .brand-navbar ~ .ptx-navbar {
    top: auto;
  }
}




// does not match any current output from xsl
hr.ptx-pagebreak {
  width: 30em;
  text-align: center;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 2.0em;
  margin-top: 0;
  height: 4em;
  border: 0;
  border-bottom: 1px dashed #ccc;
}

hr.ptx-pagebreak:after {
  content: "page";
  display: inline-block;
  position: relative;
  top: 4.0em;
  font-size: 80%;
  padding: 0 0.25em;
  background: white;
}



// consecutive headings? need sample
.exercise-like .task > .heading + .heading {
  font-weight: 600;  /* should be slightly less bold, but some browsers make it bold */
}
.exercise-like .task > .heading + .heading + .para,
.exercise-like .task > .heading + .heading + div {
  display: block;
  margin-top: 0;
}




// ---------------------------------------------------
// spacing rules - these were in pretext/pretext_add_on
// attempting to forgo them with simpler spacing rules

// table + article {
//     margin-top: 1em;
// }


// .image-box + table,
// .image-box + .sidebyside > .sbsrow:first-child > .sbspanel > table:first-child {
//     margin-top: 1.5em;
// }


// section.introduction + section {
//     margin-top: 2em;
// }


// section section + section {
//     margin-top: 3em;
// }


// .solution > ol li + li {
//     margin-top: 0.5em;
// }


// section > ol:last-child,
// section > ul:last-child {
//     margin-bottom: 1.5em;
// }

// .objectives {
//     margin-bottom: 1.25em;
// }


// li > .heading + ol,
// li > .heading + ul {
//   margin-top: 0.25em;
// }


// li > .heading + ol > li:nth-child(1),
// li > .heading + ul > li:nth-child(1) {
//   margin-top: 0;
// }

// li > .heading + ol.cols2 > li:nth-child(2),
// li > .heading + ul.cols2 > li:nth-child(2) {
//   margin-top: 0;
// }

// /* http://spot.pcc.edu/math/APEXCalculus/sec_prod_quot_rules.html
//  * solution to Example 2.4.14
//  */
// .solution ol li {
//     margin-top: 1em;
//     padding-left: 0.5em;
// }

// /*
// nested tasks. see
// https://pretextbook.org/examples/sample-article/html/interesting-corollary.html#aBc
// */

// article.example-like > .heading + .introduction {
//     display: inline;
// }
// article.example-like > .heading + .introduction > .para:first-child {
//     display: inline;
// }
// article.example-like > .exercise-like > .para {
//     margin-top: 1.25em;
// }

/* end of nested tasks */

// /*
//    See 10.1.8c in http://faculty.valpo.edu/calculus3ibl/ch10_01_gradient.html
// and condider having this replace line 3338 of the general code (which uses .heading + p)
// */
// .example-like > .exercise-like > .para:first-of-type {
//     display: inline;
// }
// .example-like > .exercise-like > .aside-like {
//     margin-top: -3em;
// }
// .example-like > .exercise-like > .aside-like.front {
//     margin-top: 0;
// }

// don't appear to work due to permalinks. But not needed
// /* we use .para as a wrapper around some "compound" p, so the
//    first p in .para is block-like because of the .pare */
// .para > p:first-child,
// .para > .para:first-child {
//     display: inline;
// }



// .paragraphs + .paragraphs {
//   margin-top: 3em;
// }


// /* spacing around and after .para, and around and after article */

// .aside-like > .para:first-child,
// td > .para:first-child,
// .solution-like > .para:first-child {
//     margin-top: 0;
// }
// /* for assemblages without a title */
// .assemblage-like > .para:first-of-type {
//     margin-top: 0;
// }
// .assemblage-like > .heading + .para {
//     margin-top: 0.25em;
// }
// .assemblage-like + .para {
//     margin-top: 1.75em;
// }


// .para + table {
//     margin-top: 1em;
// }

// table tr td .para + .para {
//     margin-top: 1em;
// }

// table + .para {
//     margin-top: 1.5em;
// }

// .para + figure.figure-like > table {
//     margin-top: 1em;
// }

// .para + pre.prettyprint,
// .para + pre.plainprint {
//     margin-top: 1.25em;
// }
// .para + .code-box {
//     margin-top: 1.25em;
// }

// /* 1.25 = ol top + li top ?  looked too big with 0.75 below */
// .exercise-like .para + ol {
//   margin-top: 0.5em;
// }


// /* this > may be too restrictive.  The purpose is to not put a
//    top margin on an article at the top of a knowl */
// section > article, section > section.paragraphs, .paragraphs > article {
//     margin-top: 1.25em;
// }
// section article + article,
// section .introduction + article,
// section .para + article,
// section .posterior + article {
//     margin-top: 1.75em;
// }
// section article > .introduction + article {
//     margin-top: 1em;
// }

// section article > .discussion-like {
//     margin-top: 1em;
// }
// section article > .discussion-like .para {
//     margin-top: 1em;
// }

// article + .posterior {
//     margin-top: 0.5em;
// }
// section .para + .tabular-box {
//     margin-top: 0.75em;
// }
// section .tabular-box + .tabular-box {
//     margin-top: 1.0em;
// }
// section .proof,
// section .hiddenproof {
//     margin-top: 0.75em;
// }

// section > pre, .para + pre {
//     margin-top: 1.25em;
// }

// ol .para + .para, ul .para + .para {
//     margin-top: 1em;
// }

// /* see Ex 29 https://yoshiwarabooks.org/linear-functions.html
// and ex 2.91 in
// https://yoshiwarabooks.org/mfg/MathModels.html */
// .introduction + .sidebyside,
// .para + .sidebyside,
// ol + .sidebyside,
// ul + .sidebyside {
//     margin-top: 1em;
// }



// section .heading + .para,
// section .title + .para, /* list items have bare .title, not in a .heading */
// section .heading + .introduction > .para:first-child,
// section .blob > .para:first-child {
//     margin-top: 0.25em;
// }

// /*
//  * Contents of articles
//  */

// .conclusion {
//     margin-top: 1em;
// }
// .conclusion > .para:first-child {
//     margin-top: 0.5em;
// }

// .exercise-like > ol:first-child,
// .exercise-like > ul:first-child {
//     margin-top: 0;
// }

// .heading + ol, .heading + ul {
//     margin-top: 0.45em;
// }

// article .para:first-child {
//     margin-top: 0;
// }


================================================
FILE: css/components/_pretext-search.scss
================================================

@use 'components/helpers/buttons-default' as buttons;

.searchbox {

  .searchwidget {
    height: 100%;
  }
  
  .searchresultsplaceholder {
    position: fixed;
    top: 5vh;
    bottom: 5vh;
    padding: 1em;
    left: max(10vw, calc(100vw - 800px) / 2);
    width: 80vw;
    max-width: 800px;
    border: 2px solid var(--body-text-color);
    background: var(--knowl-background, #eaf0f6);
    z-index: 5000;
    display: flex;
    flex-direction: column;
  }

  .searchresultsplaceholder article {
    width: 60%;
    margin-left: auto;
    margin-right: auto;
    font-family: sans-serif;
  }

  .search-results-controls {
    display: flex;
    justify-content: space-between;
    align-items: stretch;
    gap: 10px;
    margin-bottom: 1em;
    height: 35px;
  }

  .ptxsearch {
    flex: 1 1;
  }
  

  .closesearchresults {
    @include buttons.ptx-button;
  }

  .detailed_result {
    margin-bottom: 10px;
  }

  .searchresults a:hover {
    text-decoration: underline;
    background: var(--link-active-background);
  }


  .searchresults {
    padding-left: 10px;
    margin-top: 0;
    overflow-y: auto;
    flex: 1 1;
    background: var(--content-background, white);
    border: 1px solid var(--page-border-color, #ccc);
  }

  .searchresults:empty {
    display: none;
  }
  
  .search-result-bullet {
    list-style-type: none;
  }

  .search-result-score {
    display: none;
  }

  //result qualities
  .no_result {
    font-size: 90%;
    font-weight: 200;
  }

  .low_result {
    font-weight: 200;
  }

  .medium_result {
    font-weight: 500;
  }
  .high_result {
    font-weight: 700;
  }

  .searchempty {
    display: none;
    padding-left: 10px;
    padding-top: 5px;
  }

  .search-results-unshown-count {
    margin-top: 0.6em;
  }

  .search-result-clip-highlight {
    background: var(--searchresultshighlight);
  }

  .searchresultsbackground {
    position: fixed;
    top: 0;
    background: var(--searchresultsbackground, white);
    width: 100vw;
    height: 100%;
    left: 0;
    z-index: 4999;
  }

  @media screen and (max-width: 800px) {
    .searchresultsplaceholder {
      bottom: 10vh;
    }
  }
}

:root {
  --searchresultsbackground: #fff8;
  --searchresultshighlight: rgba(255, 255, 0, 50%);
}

:root.dark-mode {
  --searchresultsbackground: #0008;
  --searchresultshighlight: rgba(255, 255, 0, 15%);
}


================================================
FILE: css/components/_pretext-web.scss
================================================
// Entry point for web-based themes. Incorporates common PreTeXt styles
// and web-specific styles.

// Todo - analyze interactives/ and other scss files for items
// that belong here

// Breakpoint at which the navbar moves to the bottom of the screen
$navbar-breakpoint: 800px !default;

@use 'components/pretext';


@use 'printing';
@use 'worksheet';

@use 'google-search';
@use 'pretext-search';
@use 'interactives/runestone';
@use 'interactives/other';
@use 'interactives/webwork';
@use 'interactives/sagecell';

@use 'interactives/calculators' with (
  $navbar-breakpoint: $navbar-breakpoint,
);

@use 'elements/permalinks';


================================================
FILE: css/components/_pretext.scss
================================================
// Entry point for common styling

// It is assumed these are used by both web and epub stylesheets
// page-parts/ and chunks/ are not included here as they vary more from theme to theme

@use 'spacing';
@use 'elements/lists';
@use 'elements/fillin';
@use 'elements/headings';
@use 'elements/links';
@use 'elements/tables';
@use 'elements/front-matter';
@use 'elements/summary-links';
@use 'elements/footnotes';
@use 'elements/index';
@use 'elements/media';
@use 'elements/figures';
@use 'elements/poem';
@use 'elements/prism';
@use 'elements/math';
@use 'elements/misc-content';

================================================
FILE: css/components/_printing.scss
================================================
// Basic rules for printing a standard PreTeXt page

// Get rid of UI elements.
// Leave margin fiddling for system print dialog.

// Worksheet and handout printing is handled in print-worksheet.scss

@media print {
  .pretext .ptx-masthead,
  .pretext .ptx-navbar,
  body.pretext > a.assistive,
  .pretext .ptx-page > .ptx-sidebar,
  .pretext  .ptx-page-footer,
  .pretext .ptx-main > div.ptx-content-footer {
    display:none;
  }

  .ptx-page, .ptx-main, .ptx-main .ptx-content {
    all: unset !important;
    width: 100%;
    border: none;
    padding: 0;
    margin: 0;
  }

  .ptx-sagecell, .tabular, .table-like, .figure-like, .exercise-like {
    break-inside: avoid;
  }

  .heading {
    break-after: avoid;
  }

  .code-inline {
    border: unset;
    background: unset;
  }

  @page {
    margin: 0.75in 0.75in 0.75in 0.75in;
  }
}


================================================
FILE: css/components/_spacing.scss
================================================
// Basic spacing for content

// Breakpoint at which the navbar moves to the bottom of the screen
$navbar-breakpoint: 800px !default;

// all styling assumes border-box layout measurement
* {
  box-sizing: border-box;
}

//----------------------------------------------------------
// Inter item vertical spacing
//
// Set some baseline minimal inter-item vertical spacings
//
// Individual items can override this with their own margin. The
// user of @layer here forces these rules to all have less precedence
// than any rules not in a layer.
// Most spacing should be done with margin-top.

@layer spacing {
  // inter-item spacing high level containers
  :is(section, article, .knowl__content) > *:not(:first-child) {
    margin-top: 1.5em;
  }

  // but tighten up spacing slightly for adjacent paragraphs in a section
  :is(section, article, .knowl__content) > .para + .para {
    margin-top: 1em;
  }

  // lower-level container elements that are expected to contain sequences of items
  // tighter spacing here to avoid visually breaking up the minor container
  .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) {
    margin-top: 0.5em;
  }
}

================================================
FILE: css/components/_worksheet.scss
================================================
// TODO refactor

// Rules in this file apply to both screen and print
// Print specific rules should go in a file in targets/print-worksheet stylesheet
@use 'components/helpers/buttons-default' as buttons;

.heading .print-links {
  float: right;
  position: relative;
  z-index: 100;
  vertical-align: bottom;
  .print-link {
    font-family: var(--font-body);
    padding: 0.1em 0.2em;
  }
  .material-symbols-outlined {
    margin-top:5pt;
  }
}



================================================
FILE: css/components/chunks/README.md
================================================
Styling for "chunks" of content - containers that are designed to hold
other elements and are likely to vary significantly from theme to theme.

_chunks-default.scss in css/targets/html/default-modern is a sample aggregator
file that provides a one import way to get styling for the chunks.


================================================
FILE: css/components/chunks/_asides-basic.scss
================================================
$border-width: 2px !default;
$side-margins: 30px !default;

.aside-like {
  & > .knowl__link {
    color: var(--aside-like-link-color);
    border-bottom-color: var(--aside-like-link-color);
  }
  & > .knowl__content{
    margin-left: $side-margins;
    margin-right: $side-margins;
    border: $border-width solid var(--aside-like-border-color);
    background-color: var(--aside-like-body-background);
  }
}

================================================
FILE: css/components/chunks/_asides-floating.scss
================================================
$float-width: 200px !default;
$float-offset: -248px !default;
$min-float-width: 1280px !default;

@use 'asides-basic';

@media screen and (min-width: $min-float-width) {
  details.aside-like {
    position: relative;
    margin-left: $float-offset;
    width: $float-width;
    right: $float-offset;
    float: right;
    clear: right;
  }

  /* disable in any multicolumn list/exercisegroup */
  .multicolumn details.aside-like {
    position: relative;
    margin-left: inherit;
    width: auto;
    right: 0;
    float: none;
    clear: none;
  }

  details.aside-like > .knowl__content {
    margin-left:0;
    margin-right:0;
    background-color: var(--aside-like-body-background);
    z-index: 100;
  }
}

================================================
FILE: css/components/chunks/_codelike.scss
================================================
@mixin code-text {
  font-family: var(--font-monospace);
  background: var(--code-background);
  font-size: .93rem;
  line-height: 1.2;
}

@mixin code-inline-spacing {
  line-height: normal;  //prevent extra "padding" based on line-height
  padding: 0.0625em .15em;
}

// wide programs need to be scrollable
.code-box {
  overflow-x: auto;
}

.code-display {
  overflow-x: auto;      //scroll if overflowing
  font-family: var(--font-monospace);
  // code-display appears inside .paras and may need space around it
  margin: 0.5em 0;
}

.console,
.program {
  border: 1px solid var(--page-border-color);
  padding: 5px 15px;
  overflow-x: auto;
  margin: 0;
  @include code-text();
}

.code-inline {
  font-family: var(--font-monospace);
  white-space: pre;
  color: var(--body-text-color);
  background: var(--code-inline-background);
  border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888);
  border-radius: 0.2em;
  display: inline-block;
  overflow-x: auto;
  max-width: 100%;
  vertical-align: middle;
  @include code-inline-spacing();
}


.prompt.unselectable {
  user-select: none;
}

// code blocks are preformatted text that is not a program
.code-block {
  border-left: 1px solid #aaa;
  padding: 0 15px 5px;
  overflow-x: auto;
  background: var(--code-background);
  margin-top: 0;
  margin-bottom: 0;
  @include code-text();
}

.code-block::before {
  content:' ';
  font-size: 50%;
  border-top: 1px solid #aaa;
  display: block;
  margin-right: auto;
  margin-left: -15px;
  width: 3.0em;
}


@media print {
  .code-copy {
    display: none;
  }
}


================================================
FILE: css/components/chunks/_discussion-inline.scss
================================================
@use './helpers/inline-heading-mixin';

.discussion-like {
  @include inline-heading-mixin.heading;
  & > .heading {
    ::after {
      content: "\2009";
    }

    & + .para {
      display: inline;
    }

    .space,
    .codenumber,
    .period {
      display: none;
    }

    .type::after {
      content: ". ";
    }
  }
}


================================================
FILE: css/components/chunks/_exercises.scss
================================================
@use '../helpers/cols';

// generate multi column rules for exercises
@include cols.allow-cols('.exercise-like');

.exercise-like > .heading {
  // exercise heading/numbers regular size
  font-size: inherit;
}

.exercisegroup {

  .exercise-like {
    margin-top: 1em;
  }

  > .heading {
    font-size: 1.10em;
    line-height: 1.05em;
    margin-top: 0.75em;
    display: inline;

    & + .introduction {
      display: inline;

      & > .para:first-child {
        display: inline;
      }
    }
  }

  // push the actual exercises down from any possible heading/intro
  .exercisegroup-exercises {
    margin-top: 1em;
  
    //indent items with padding so cols works correctly on them
    padding-left: 40px;
  }

  .conclusion {
    margin-left: 40px;  // match the padding of the exercisegroup-exercises
  
    .heading {
      // exercise heading/numbers regular size
      font-size: inherit;
    } 
  }
}

// subtasks are indented
.exercise-like > .exercise-like.task {
  margin-left: 20px;
}



// ---------------------------------------------------------
// exercise-wrapper is used for WW problems
// these rules need testing/refactoring

.exercise-wrapper form button:hover {
  cursor: pointer;
  background-color: #e0e0ff;
  border: 1px solid #000;
}
.exercise-wrapper form button:active {
  background-color: #f0f0f0;
}
.exercise-wrapper form button + button {
  margin-left: 0.8em;
}

.exercise-wrapper,
.exercise-wrapper form,
.exercise-wrapper form > div:first-child {
  display: inline-block;
  vertical-align: top;
  width: 100%; /* for live ww to open at 100% wide */
}

.knowl .exercise-wrapper,
.knowl .exercise-wrapper form,
.knowl .exercise-wrapper form > div:first-child {
  width: 100%;
}

.exercise-wrapper > .para:first-child,
.exercisegroup .exercise-wrapper > .para:first-child {
  margin-top: 0;
  display: inline;
}

/* next is related to having exercises start in-line with their exercise number,
 including when a static WW problem is made interactive */
/* not sure this was the right way to do it */
/* see https://opentext.uleth.ca/apex-calculus/sec_antider.html#exercise-722 */
.heading + .exercise-wrapper {
  display: inline-block;
  max-width: 95%;
  width: 100%;
}

.cols2 .heading + .exercise-wrapper {
  width: auto;
}


================================================
FILE: css/components/chunks/_knowls.scss
================================================
/*
  main knowls styles
*/

$border-radius: 0px !default;
$border-width: 3px !default;
$pad: 12px !default;

.source-view__link,
.knowl__link {
  cursor: pointer;
  margin-left: 0.1em;
  margin-right: 0.1em;
  color: var(--knowl-link-color);
  border-bottom: 1px dotted var(--knowl-link-color);
}

.source-view {
  margin: 0.5em 0;
}

summary.source-view__link,
summary.knowl__link {
  display: list-item inline;
}

.source-view__link > *,
.knowl__link > * {
  display: inline;
}

.source-view__link:is(:hover, :focus, [open]),
.knowl__link:is(:hover, :focus, [open]) {
  background-color: var(--knowl-background);
  border-bottom-color: transparent;
}

.source-view__content {
  margin: 0.2em 0;
}

.knowl__content {
  margin: 0.75em 0;  //at least this much space above/below
  border: $border-width solid var(--knowl-border-color);
  border-radius: $border-radius;
  padding: $pad;
  background-color: var(--knowl-background);

  .incontext {
    display: block;
    font-size: 85%;
    text-align: right;
  }
}

/* nested knowl alt colors */
.knowl__content .knowl__content {
  background-color: var(--knowl-nested-1-background);
}

.knowl__content .knowl__content .knowl__content {
  background-color: var(--knowl-nested-2-background);
}

.knowl__content .knowl__content .knowl__content .knowl__content {
  background-color: var(--knowl-nested-3-background);
}

.knowl__content .knowl__content .knowl__content .knowl__content .knowl__content {
  background-color: var(--knowl-nested-4-background);
}


/* spacing tweaks inside knowls */
.knowl__content > figure {
  margin-left: 0;
  margin-right: 0;
}


================================================
FILE: css/components/chunks/_sidebyside.scss
================================================
// Space all rows in a sbsgroup, no other styling
.sbsgroup > *:not(:first-child)
{
    margin-top: 1.5em;
}


// sidebysides get laid out into a grid with two rows. "Plain panels" without
// a caption are in the first row. Panels with things like tables/figures with
// captions we want to align are decomposed across two rows.
// If there is no content (no captions) in a second row, it will collapse.

// 1| plain panel | figure-like/table-like
// 2|             | figcaption
.sbsrow {
  display: grid;
  grid-template-rows: auto auto;
}

.sbspanel {
  // most sbspanels are in the first row
  grid-row: 1; 

  // tables and their captions get centered when in panels
  & > .table > figcaption {
    text-align: center;
  }
  .tabular {
    overflow-x: auto;
    margin-left: auto;
    margin-right: auto;
  }
}


// panel content alignment options
.sbspanel--top {
  align-self: start;
}

.sbspanel--middle {
  align-self: center;
}

.sbspanel--bottom {
  align-self: end;
}


// sbspanels with figures or tables get decomposed into two rows
// both the panel and the figure-like/table-like element should
// be ignored by the grid layout so we can place the items inside
// the *-like into the grid
.sbspanel:has(.figure-like, .table-like),
.sbspanel > :is(.figure-like, .table-like) {
  display: contents;
}


// first child of decomposed *-like goes to the first row
.sbspanel > :is(.figure-like, .table-like) > *:first-child {
  grid-row: 1;
  align-items: start;
  align-self: start;
}

// and gets alignment info
.sbspanel--top > :is(.figure-like, .table-like) > *:first-child {
  align-items: start;
  align-self: start;
}

.sbspanel--middle > :is(.figure-like, .table-like) > *:first-child {
  align-items: center;
  align-self: center;
}

.sbspanel--bottom > :is(.figure-like, .table-like) > *:first-child {
  align-items: end;
  align-self: end;
}


// second child of decomposed *-like goes to the second row
.sbspanel > :is(.figure-like, .table-like) > *:nth-child(2) {
  margin-top: 0.5em;
  grid-row: 2;
  width: 100%;
}


// make sure content for a panel stays in the correct column
// otherwise captions may shift left into columns that do not have
// second row content
@for $col from 2 through 10 {
  .sbspanel:nth-of-type(#{$col}) * {
    grid-column: #{$col};
  }
}

================================================
FILE: css/components/chunks/_solutions.scss
================================================
// 

/* stacked headings in the solutions backmatter */
section.solutions > .heading + .heading {
  margin-top: 0.5em;
}

section.solutions > h3.heading,
section.solutions section > h3.heading {
  font-size: 1.6em;
}

section.solutions > h4.heading,
section.solutions section > h4.heading {
  font-size: 1.45em;
}

section.solutions > h5.heading,
section.solutions section > h5.heading {
  font-size: 1.35em;
}

section.solutions > h6.heading,
section.solutions section > h6.heading {
  font-size: 1.25em;
}


================================================
FILE: css/components/chunks/helpers/README.md
================================================
Helpers used to style block elements


================================================
FILE: css/components/chunks/helpers/_C-box-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$padding: 20px !default;
$padding-top: $padding !default;
$padding-bottom: $padding !default;
$padding-left: $padding !default;
$padding-right: $padding !default;
$border-radius: 0px !default;
$border-width: 3px !default;
$font-style: 'normal' !default;
$box-padding: 5px !default;
$background-color: var(--content-background-background) !default;
$border-color: var(--block-border-color) !default;
$heading-background: var(--block-border-color) !default;
$heading-color: var(--block-head-color) !default;

// Block title and left/bottom wrapper
@mixin box($border-width: $border-width,
  $background-color: $background-color,
  $border-color: $border-color,
  $heading-background: $heading-background,
  $heading-color: $heading-color,
  $padding: $padding,
  $padding-top: $padding-top,
  $padding-bottom: $padding-bottom,
  $padding-right: $padding-right,
  $padding-left: $padding-left,
  $font-style: $font-style,
  $border-radius: $border-radius,
  $box-padding: $box-padding,
  $hide-number: false)
{
  
  &:not(.knowl__content, .born-hidden-knowl) {
    border-left: $border-width solid $border-color;
    border-bottom: $border-width solid $border-color;
    background-color: $background-color;
    //top padding turns into margin below header
    padding: 0 $padding-right $padding-bottom $padding-left;


    @if $border-radius > 0 {
      border-bottom-left-radius: $border-radius;
    }

    & > .heading:first-child {
      background-color: $heading-background;
      display: inline-block;
      color: $heading-color;
      padding: $box-padding (2 * $box-padding);
      margin-left: -$padding-left;
      margin-top: 0;

      @if $font-style != 'normal' {
        font-style: $font-style;
      }

      @if $hide-number {
        .codenumber {
          display: none;
        }
      }

      @if $border-radius > 0 {
        border-top-right-radius: $border-radius;
        border-bottom-right-radius: $border-radius;
      }

      &:after {
        //disable any extra junk
        display: none;
      }

      // fake padding under the heading
      & {  //turn off sass warning
        margin-bottom: $padding-bottom;
      }
      //prevent child from adding space
      & + * {
        margin-top: 0;
      }

    }
  }
}


================================================
FILE: css/components/chunks/helpers/_L-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$pad: 10px !default;

// Generate styles for an L shaped border 
@mixin border(
  $border-width: 2px,
  $style: solid,
  $head-color: var(--block-head-color),
  $border-color: var(--block-border-color),
  $padding: $pad,
  $L-side: left) 
{
  //determine side opposite L
  $alt-side: if($L-side ==left, right, left);

  &:not(.knowl__content, .born-hidden-knowl) {
    padding-#{$L-side}: $padding;
    border-#{$L-side}: $border-width $style $border-color;

    & > .heading:first-child {
      color: $head-color;
    }

    &::after {
      content: '';
      border-bottom: $border-width $style $border-color;
      display: block;
      margin-#{$alt-side}: auto;
      margin-#{$L-side}: -$padding;
      padding-top: $padding;
      width: 1.5em;
    }
  }

  @at-root .knowl__content & {
    padding-#{$L-side}: 0;
    border-#{$L-side}: 0;

    &::after {
      display: none;
    }
  }
}


================================================
FILE: css/components/chunks/helpers/_box-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$pad: 10px !default;
$border-radius: 0px !default;
$border-width: 2px !default;

// Generate styles for a surrounding box
@mixin box($border-width: $border-width,
  $style: solid,
  $background-color: var(--block-body-background),
  $border-color: var(--block-border-color),
  $head-color: var(--block-head-color),
  $padding: $pad,
  $border-radius: $border-radius)
{

  &:not(.knowl__content, .born-hidden-knowl) {
    border: $border-width $style $border-color;
    background-color: $background-color;
    padding: $padding;

    @if $border-radius > 0 {
      border-radius: $border-radius;
    }

    & > .heading:first-child {
      display: block;
      color: $head-color;
      margin-bottom: 0.5em;
    }

    & > *:first-child {
      margin-top: 0;
    }
  }
}


================================================
FILE: css/components/chunks/helpers/_heading-box-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$pad: 20px !default;
$border-radius: 0px !default;
$border-width: 3px !default;
$margin-top: 2.5em !default;
$font-style: 'normal' !default;
// $font-size: 1.25em !default;
$box-padding: 5px !default;
$background-color: var(--block-body-background) !default;
$border-color: var(--block-border-color) !default;
$heading-background: var(--content-background) !default;
$heading-color: var(--block-head-color) !default;
$side-borders: true !default;

// Generate styles for a box with inset heading
@mixin box($border-width: $border-width,
  $style: solid,
  $background-color: $background-color,
  $border-color: $border-color,
  $heading-background: $heading-background,
  $heading-color: $heading-color,
  $padding: $pad,
  $border-radius: $border-radius,
  $side-borders: $side-borders,
  $margin-top: $margin-top,
  $font-style: $font-style,
  $box-padding: $box-padding,
  // $font-size: $font-size,
  $hide-number: false)
{
  // this *should* always work well for reasonable padding/font sizes
  //$heading-top: calc(-1 * $box-padding - 1.65ex);
  $heading-top: calc(-1 * ($padding + $box-padding) - 1.65ex);
  
  &:not(.knowl__content, .born-hidden-knowl) {
    border: $border-width $style $border-color;
    @if not $side-borders {
      border-left: 0;
      border-right: 0;
    }
    background-color: $background-color;
    padding: $pad;
    //extra top-padding to make room for heading
    padding-top: calc($pad + 0.25ex);

    // need to control margin to overcome negative margin on heading
    // !important to override default article styling
    margin-top: $margin-top !important;

    @if $border-radius > 0 {
      border-radius: $border-radius;
    }

    & > .heading:first-child {
      background-color: $heading-background;
      display: block;
      color: $heading-color;
      margin-bottom: 0.5em;
      padding: $box-padding (2 * $box-padding);
      // font-size: $font-size;
      margin-top: $heading-top;
      width: fit-content;
      border: 0;  //in case picking up border from elsewhere

      @if $font-style != 'normal' {
        font-style: $font-style;
      }
      @if $border-radius > 0 {
        border-radius: $border-radius;
      }

      @if $hide-number {
        .codenumber {
          display: none;
        }
      }

      &:after {
        //disable any extra junk
        display: none;
      }
    }
  }

  // if the first child of a knowl, need just enough margin to clear exposed heading
  @at-root {
    .knowl__content *:first-child & {
      margin-top: 1em;
    }
  }
}


================================================
FILE: css/components/chunks/helpers/_horizontal-bars-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$pad: 0px !default;   //all sides
$border-color: var(--block-border-color) !default;
$background-color: var(--content-background) !default;
$border-width: 3px !default;
$title-pos: "border" !default; // can be "border", "inside", or "outside"
$heading-background: var(--content-background) !default;
$heading-color: var(--body-text-colorolor) !default;
$font-style: 'normal' !default;

// Generate styles for a box with horizontal rules
@mixin bars($border-width: $border-width,
  $style: solid,
  $border-color: $border-color,
  $background-color: $background-color,
  $padding: $pad,
  $title-pos: $title-pos,
  $heading-background: $heading-background,
  $heading-color: $heading-color,
  $font-style: $font-style
  )
{
    $heading-top: 0;
    $heading-left: 0;
    @if $title-pos == "border" {
        $heading-top: -1.5em;
        $heading-left: 10px;
    } @else if $title-pos == "inside" {
        $heading-top: 0;
    } @else if $title-pos == "outside" {
        $heading-top: 3em;
    }

    &:not(.knowl__content, .born-hidden-knowl) {
    padding: $padding;
    border-top: $border-width $style $border-color;
    border-bottom: $border-width $style $border-color;
    border-left: none;
    border-right: none;
    background-color: $background-color;
    margin-top: 2em;
    margin-bottom: 1em;
    }


    & > .heading:first-child {
        background-color: $heading-background;
        display: block;
        color: $heading-color;
        margin-bottom: 0.5em;
        // font-size: $font-size;
        margin-top: $heading-top;
        margin-left: $heading-left;
        width: fit-content;
        padding: 5px 1em;
        $font-style: $font-style;

  }
}


================================================
FILE: css/components/chunks/helpers/_inline-heading-mixin.scss
================================================
// Generate styles for an inline heading
@mixin heading {
  & > .heading:first-child {
    display: inline;
    line-height: initial;
    border-bottom: 0;  // disable underline that may come from underlined headings

    &:after {
      content: "\2009";
    }

    // Following sibling also needs to be inline for heading to line up correctly
    // For now limit to logical paragraphs and introductions as they seem to cover
    // the plain text cases. Not clear we would want same treatment for other
    // kinds of content
    & + :is(.para, .para.logical, .introduction) {
      display: inline;
      // possible first child that is the actual text
      & > .para:first-child {
        display: inline;
        }
      // an introduction could have a para.logical with a para
      & > .para.logical:first-child > .para:first-child {
        display: inline;
      }
    }
  }
}


================================================
FILE: css/components/chunks/helpers/_sidebar-mixin.scss
================================================
// These values can be set on @use to avoid repeating values in each @import
$pad: 10px !default;   //all sides
$padside: 15px !default;   //on side with border
$border-radius: 0px !default;   //on side with border
$border-color: var(--block-border-color) !default;
$background-color: var(--content-background) !default;
$side: left !default;
$border-width: 2px !default;

// Generate styles for a sidebar down left or right of content
@mixin box($border-width: $border-width,
  $style: solid,
  $border-color: $border-color,
  $background-color: $background-color,
  $padding: $pad,
  $padside: $padside,
  $side: $side,
  $border-radius: $border-radius) 
{
  &:not(.knowl__content, .born-hidden-knowl) {
    padding: $padding;
    padding-#{$side}: $padside;
    border-#{$side}: $border-width $style $border-color;
    background-color: $background-color;

    @if $border-radius > 0 {
      border-radius: $border-radius;
    }

    > .heading:first-child {
      margin-top: 0;
    }
  }
}


================================================
FILE: css/components/elements/README.md
================================================
Styling for basic content elements


================================================
FILE: css/components/elements/_description-lists.scss
================================================
/* dl is used for glossaries and descriptions lists.
   Glossaries are simple:  bold word by itself on a line.
        Definition indented on the next line.
        Vertical space before the next term.

   Description lists are more complicated.  The wider version
   (refering to the horizontal indentation of the definition;
    this is the default)
   has the (wrapped) term inline with the definition.

   The narrow version is complicated because the term is inline
   with its definition if it fits, otherwise it is on the line above.
   That means the vertical space between entries can't be handled by
   a top margin on the dt.  Instead we have an ::after on the dd .
 */

$wide-dt-width: 25ex;

dl:is(.description-list, .glossary) {
  margin: 0;
  //overflow: hidden; // Removed to show permalinks

  dt {
    font-weight: bold;
    max-width: 55ex;
  }

  dd::after {
    content: "";
    display: block;
    clear: both;
  }
}

.para > dl:is(.description-list) {
  // add some space when inside a .para
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

dl.glossary {
  dt {
    margin-top: 1.25em;

    &:first-of-type {
      margin-top: 0;
    }
  }

  dd {
    margin-left: 5ex;
  }
}

dl.description-list {

  dt,
  dd {
    margin-top: 1em;

    &:first-of-type {
      margin-top: 0;
    }
  }

  dt {
    float: left;
    clear: both;
    text-align: right;
    width: 18ex;
    margin-right: 1ex;
  }

  dd {
    margin-left: 22ex;
  }

  &.narrow {
    dt {
      width: 11ex;
    }

    dd {
      margin-left: 15ex;
    }
  }

  &.wide {
    dt {
      width: $wide-dt-width;
    }

    dd {
      margin-left: 29ex;
    }
  }
}

dl.description-list dt:first-of-type {
  clear: none;
}

.description-list + * {
  clear: both;
}

/* where do we have nested dl? */
dl.description-list dl dt {
  width: 8ex;
}

dl.description-list dd dd {
  margin-left: 18ex;
}

dl.description-list dl dd {
  margin-left: 12ex;
}


@media screen and (max-width: 480px) {
  dl.description-list dt,
  dl.description-list.narrow dt {
    float: none;
    margin-left: 0;
    text-align: left;
    width: $wide-dt-width;
  }

  dl.description-list dd,
  dl.description-list.narrow dd,
  dl.description-list.wide dd {
    margin-top: 0.5em;
    margin-left: 3em;
    max-width: calc(100% - 3em);
  }
}


================================================
FILE: css/components/elements/_figures.scss
================================================
figure {
  clear: both;
  position: relative;

  // override browser margins
  margin-left: 0;
  margin-right: 0;
}

figcaption {
  margin-left: auto;
  margin-right: auto;
  margin-top: 0.5em;

  code.code-inline {
    white-space: pre;
  }
  
  .codenumber,
  .type {
    font-weight: 700;
  }

  // add n-dashes
  .codenumber::after,
  .type:last-of-type::after {
    content: "\2002";
  }

  // make sure first para comes right after title
  .para:first-of-type {
    display: inline;
  }
}

// tables are inset
figure.table-like {
  margin-left: 30px;
  margin-right: 30px;

  // but lists can go full right
  .list {
    margin-right: 0;
  }
}

@media (max-width <= 943px){
  .figure-like {
    overflow-x: auto;
  }
}


================================================
FILE: css/components/elements/_fillin.scss
================================================

.fillin {
  display: inline-block;
  border: none;
  border-width: 1px;
  margin-right: 0.1em;
  margin-left: 0.1em;
  margin-bottom: -0.25em;

  &.underline {
    border-bottom-style: solid;
    border-width: 1px;
  }

  &.box {
    outline: 1px solid var(--body-text-color);
    height: 1.3em;
  }

  &.shade {
    background-color: var(--fillin-background-color, #eee);
    height: 1.3em;
  }
}


:root.dark-mode {
  --fillin-background-color: #444;
}


================================================
FILE: css/components/elements/_footnotes.scss
================================================
$border-radius: 0px !default;

.ptx-footnote {
  display: inline-block;
  position: relative;
}

.ptx-footnote[open] {
  display: contents;
}


.ptx-footnote[open] .ptx-footnote__number::before {
  font-size: smaller;
  content: "[x]";
  visibility: visible;
  vertical-align: super;
}

.ptx-footnote[open] .ptx-footnote__number sup {
  display: none;
}

.ptx-footnote__number {
  display: inline-block;
  cursor: pointer;
  min-width: 1em; //hopefully enough space...
}

.ptx-footnote__number::marker {
  content: "";
}

.ptx-footnote__contents {
  display: block;
  font-style: italic;
  background: var(--knowl-background);
  border-radius: $border-radius;
  padding: 8px;
  margin: 4px auto;
  width: fit-content;
  max-width: calc(100% - 60px);
  border: 2px solid var(--knowl-border-color);
  //reset color/weight/size in case used in block that changed them
  // e.g. theorem title in denver
  color: var(--body-text-color);
  font-weight: normal;
  font-size: var(1rem);
}


================================================
FILE: css/components/elements/_front-matter.scss
================================================
// Styles for the items that are (at least generally) a part of the front matter
// There are some pretty generic class names. Those get wrapped with a class
// limiting their scope to the expected page

.frontmatter {
  & > .heading {
    display: block;
    text-align: center;
  }

  & > .heading .title,
  .book > .heading .title {
    font-size: 1.3em;
  }

  & > .heading .subtitle,
  .book > .heading .subtitle {
    display: block;
    font-weight: normal;
    color: var(--byline-color);
    font-size: 0.875em;
    line-height: 1.42857em;
    margin-top: 0.35714em;
  }

  & > .para:first-of-type {
    margin-top: 4em;
  }

  & > .author,
  & > .credit {
    margin-top: 2em;
    text-align: center;
  }

  .author:first-of-type {
    margin-top: 4em;
  }

  & > .author .author-name {
    font-size: 120%;
  }

  .date {
    display: block;
    margin-top: 2em;
    text-align: center;
  }

  .credit .title {
    font-size: 1em;
  }

  .credit .author {
    font-size: 0.9em;
    margin-top: 0.75em;
  }

  .author-info {
    font-size: 90%;
  }

  .summary-links {
    margin-top: 4em;
  }

  .abstract {
    margin: 4em 2em;
  }

  .keywords, .support {
    margin-top: 2em;
  }

  .abstract, .keywords, .support {
    & > .title {
      font-size: 1.125em;
      font-weight: 600;
      line-height: 1.125em;
      display: inline;
    }

    & > .title::after {
      content: ".\2009\2009\2009";
    }

    & > .title + .para {
      display: inline;
    }
  }

  .colophon {
    .copyright {
      margin-top: 2.5em;
    }

    .license {
      margin-top: 2.5em;
    }
  }
}


================================================
FILE: css/components/elements/_headings.scss
================================================
// headings for standard page elements - sections/articles/etc...
// more specialized headings (exercises) should be defined in the specific component
// complex stylizing (like boxes) should be done by "chunks"

// reset size/margin for headings
.heading:is(h1, h2, h3, h4, h5, h6) {
  margin: 0;
  font-size: unset;
}

.heading {
  line-height: 1.1;
  font-family: var(--font-headings);
  font-weight: 700;
  margin-top: 0;
  margin-bottom: 0;
}

section > .heading {
  font-size: 1.75em;
  color: var(--body-title-color);
  line-height: 1.25em;
  margin-top: 2.5em;
  margin-bottom: 0.5em;

  // pull in any following items that default to a larger top margin
  & + * {
    margin-top: 0.5em;
  }
}

.ptx-content > section > .heading {
  //first heading on page
  margin-top: 0.5em;
}

section section > .heading {
  font-size: 1.5em;
  margin-top: 2em;
}

section section section > .heading {
  font-size: 1.40em;
  margin-top: 2em;
}


article > .heading {
  font-size: 1.25em;
  margin-top: 1.5em;

  // pull in any following items that default to a larger top margin
  & + * {
    margin-top: 0.5em;
  }
}

.paragraphs > .heading {
  font-size: 1.125em;
}

// heading followed by no content and then a subsection that starts with heading
:is(section, article) > .heading + :is(section, article) > .heading {
  margin-top: 0.5em;
}

// smaller headings on phone screens
@media screen and (max-width: 480px) {
  section > .heading {
      font-size: 1.5em;
      line-height: 1.33em;
      margin-top: 1em;
  }
  section section > .heading {
      font-size: 1.3em;
      line-height: 1.15em;
  }
  section section section > .heading {
      font-size: 1.15em;
      line-height: 1em;
  }
}

.heading.hide-type > .type {
  display: none;
}


================================================
FILE: css/components/elements/_index.scss
================================================


/* the index at the back of the book */
// TODO - refactor


.navbar .indexnav {
  position: absolute;
  top: 46px;
  right: 0;
}

.mininav {
  float: left;
  padding-top: 0.7ex;
  padding-left: 1ex;
}


.indexjump {
  margin-left: 1.5ex;
  margin-top: 0.2ex;
  padding-top: 0;
  float: left;
  line-height: 0.95;
}

.indexjump a {
  padding-left: 2.5px;
  padding-right: 0.5px;
  width: 2.5ex;
/*
*  *  omitted, because we put a space in the source
*      padding-right: 3px;
*      */
  margin-right: -1px;
  color: inherit;
  font-size: 80%;
  text-align: center;
}
.indexjump a::after{
  content: "";
  display: inline-block;
}
.indexjump a:nth-of-type(14){
  padding-left: 1.8ex;
}
.indexjump a:last-child {
  padding-right: 10px;
}

.indexjump a:hover {
  background: var(--activated-content-bg);
}

.indexitem {
  margin-top: 4px;
}

.subindexitem {
  margin-left: 2em;
  font-size: 95%;
  margin-top: -1px;
}

.subsubindexitem {
  margin-left: 3.5em;
  font-size: 95%;
  margin-top: -1px;
}

.indexknowl {
  margin-left: 0.11em;
}
em + .indexknowl  {
  margin-left: -0.25em;
}
.indexknowl a {
  margin-left: 2em;
}

.indexitem .see,
.subindexitem .see,
.subsubindexitem .see {
  margin-left: 1em;
  margin-right: 0;
}
.indexitem .seealso,
.subindexitem .seealso,
.subsubindexitem .seealso {
  margin-left: 1em;
  margin-right: 0;
}
.indexitem .see em,
.subindexitem .see em,
.subsubindexitem .see em,
.indexitem .seealso em,
.subindexitem .seealso em,
.subsubindexitem .seealso em {
  margin-right: 0.25em;
  font-style: italic;
}
/*  note that multiple things after "see" are in separate spans */
.indexitem .see + .see,
.subindexitem .see + .see,
.subsubindexitem .see + .see,
.indexitem .seealso + .seealso,
.subindexitem .seealso + .seealso,
.subsubindexitem .seealso + .seealso {
   margin-left: 0;
   margin-right: 0;
}

.indexitem .indexknowl {
  font-size: 90%;
}

.indexitem [data-knowl], .subindexitem [data-knowl], .indexitem [data-knowl]:hover {
  padding-right: 2px;
  padding-left: 2px;
}
.indexknowl [data-knowl]:hover, .indexknowl .active[data-knowl] {
  margin-left: 2em;
}

.subindexitem .indexknowl {
  font-size: 95%;
}
.subsubindexitem .indexknowl {
  font-size: 95%;
}

.indexletter {
  margin-top: 1.5em;
}


================================================
FILE: css/components/elements/_links.scss
================================================

// Reset for all links
a {
  color: var(--link-text-color);
  text-decoration: none;

  &:hover,
  &:focus {
    text-decoration: none;
  }
}


a[href^="mailto:"] {
  white-space: pre;
}


// Body links. .ptx-content to avoid hitting navbar, toc, etc...
.ptx-content {
  a.internal {
    color: var(--link-text-color);
    font-weight: bold;
  }
  a.external {
    color: var(--link-alt-text-color);
    font-weight: bold;
  }
  a.internal:hover, a.internal:hover *,
  a.internal:focus, a.internal:focus * {
    color: var(--link-active-text-color);
    background-color: var(--link-active-background);
    font-weight: bold;
  }
  a.external:hover, a.external:hover *,
  a.external:focus, a.external:focus * {
    color: var(--link-alt-active-text-color);
    background-color: var(--link-alt-active-background);
    font-weight: bold;
  }
}


================================================
FILE: css/components/elements/_list-styles.scss
================================================
// Types of ol/ul - used by web and ebooks
// Any spacing should be in _lists.scss, not here

ol.no-marker,
ul.no-marker,
li.no-marker {
    list-style-type: none;
}

ol.decimal {
    list-style-type: decimal;
}

ol.lower-alpha {
    list-style-type: lower-alpha;
}

// Match LaTeX style for second level (i.e. level="1") lists
ol.lower-alpha-level-1 > li::marker {
    content: "("counter(list-item,lower-alpha)") ";
}

ol.upper-alpha {
    list-style-type: upper-alpha;
}

ol.lower-roman {
    list-style-type: lower-roman;
}

ol.upper-roman {
    list-style-type: upper-roman;
}

ul.disc {
    list-style-type: disc;
}

ul.square {
    list-style-type: square;
}

ul.circle {
    list-style-type: circle;
}


================================================
FILE: css/components/elements/_lists.scss
================================================
// Entry point for ol/ul/dl web styling

@use "list-styles";
@use "description-lists";
@use '../helpers/cols';

// generate multi column rules for lists
@include cols.allow-cols('li');

// use .ptx-content to avoid styling lists in toc/header/etc...
.ptx-content {
  ol,
  ul {

    ol,
    ul {
      // margin-top: 0.5em;
    }
  }

  li {
    margin-top: 0.5em;
    // margin-bottom: 0;

    // & > .para:first-child {
    //     margin-top: 0;
    // }

    .li--heading-title {
      font-size: 100%;
      font-weight: normal;
      font-style: italic;
    }
  }
}   // .ptx-content

.para > :is(ol, ul) {
  // add some space when inside a .para
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

// provide space for custom markers
ol > li {
  padding-left: 0.25em;
}


================================================
FILE: css/components/elements/_math.scss
================================================
// TODO - refactor

.displaymath {
  overflow-x: auto;
  overflow-y: hidden;
}

.displaymath mjx-container[jax="CHTML"][display="true"] {
  margin: 0 0 0 0;  // container is going to apply margin, so remove it from mjx-container
  padding-top: .3em; // backport MJ4 padding to MJ3
}

.process-math mjx-container svg {
  // remove the background that is normally applied to svg's by PreTeXt CSS
  // we use .process-math instead of .displaymath to get inline math as well.
  background: none;
}

// ?
[data-knowl] > mjx-mrow .TEX-I {
  font-family: MJXZERO !important;
  font-style: normal !important;
}

/* remove this when MathJax fixes the bug that was setting the width to 0 */
/* as in  $x=0$.  becomes  $x=0\text{.}$ */
.knowl mjx-mtext > mjx-utext,
mjx-mtext > mjx-utext {
    width: revert !important;
}
mjx-msup mjx-utext,
mjx-msub mjx-utext {
    display: inline;
}


================================================
FILE: css/components/elements/_media.scss
================================================
// ---------------------------------------------
// containers for images, audio, video, and asymptote
.image-box,
.audio-box,
.video-box,
.asymptote-box {
    position: relative;
}

.image-box .asymptote-box iframe.asymptote,
iframe.asymptote,
.video-box .video,
.video-box .video-poster {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
}

// images in containers should grow to fit space
.image-box img,
img.contained {
    width: 100%;
}

.asymptote-fullsize-link {
    text-align: center;
    font-size: 0.9em;
}

// ---------------------------------------------
// images
.ptx-content img, .ptx-content svg {
  // for body images in dark mode, we want to be able to force a light colored background
  // as most transparent images will assume that the background is white
  background: var(--ptx-image-bg);
}
// but mermaid svg should always have a transparent background
.mermaid > svg {
  background: none;
}

.image-description {
  summary {
    list-style: none; // no marker
    cursor: pointer;
  }
}

// download links after an image
.image-archive {
  margin: 0.75em auto 0;
  font-family: var(--font-monospace);
  justify-content: center;
  display: flex;
  gap: 0.5em;
}

// TODO - refactor mag_popup JS and CSS
// was .ptx-content .image-box > img:not(.draw_on_me):not(.mag_popup)
.image-box > img:not(.mag_popup) {
  cursor: zoom-in;
}

img.mag_popup {
  border: 1px solid #666;
  box-shadow: 4px 6px 4px #999;
  cursor: zoom-out;
}

.mag_popup_container {
  width:100%;
  position:absolute;
  z-index:1001;
  overflow-x: visible;
}

// ---------------------------------------------
// other
.audio {
    width: 100%;
}

.video-poster {
    cursor: pointer;
}


================================================
FILE: css/components/elements/_misc-content.scss
================================================

// Miscellaneous stylized content blocks that are not complex enough
// to warrant their own file

em.alert {
  font-weight: bold;
}

.bib {
  margin-top: 0.25em;

  .bibitem {
    display: inline-block;
    vertical-align: top;
    width: 7%;
    margin-right: 0;
  }
  
  .bibitem + .bibentry {
    display: inline-block;
    width: 90%;
    margin-top: 0;
  }
}



.caption {
  margin-top: 10px;
  margin-left: auto;
  margin-right: auto;
  font-size: 100%;
  text-align: center;
}


.contributor {
  margin-top: 1.5ex;

  &:first-child {
    margin-top: 0em;
  }

  & + .para {
    margin-top: 3ex;
  }

  .contributor-name {
    font-variant: small-caps;
  }

  .contributor-info {
    font-size: 88%;
    font-style: italic;
    margin-left: 3ex;
  }
}


// Icon font settings
.material-symbols-outlined {
  font-variation-settings:
  'FILL' 0,
  'wght' 400,
  'GRAD' 0,
  'opsz' 24
}


iframe {
  margin: 0;
  border: none;
}


.kbdkey {
  background: #f1f1f1;
  color: #333;
  border: 1px solid #dddddd;
  border-radius: 3px;
  padding: 1px 2px 0 2px;
  vertical-align: 0.1em;
  font-size: 110%;
  line-height: 1;
  box-shadow: 2px 2px grey;
  display: inline-block;
  margin-right: 3px;
}


.unit,
.quantity {
    white-space: nowrap;
    word-spacing: -0.25ex;
    margin-right: 0.125em;

    sub, sup {
      word-spacing: normal;
    }
}


.terminology {
  font-style: italic;
  font-weight: bold;
}



.times-sign {
  font-size: larger;
  vertical-align: -0.15ex;
}


.emphasis {
  font-style: italic;

  .emphasis {
      font-weight: bold;
  }
}

.definition-like .emphasis {
  font-weight: 700;
}
article.theorem-like .emphasis {
  font-weight: 700;
}

.para {
  line-height: 1.35;
}

.hidden {
  display: none !important;
}

/* genus and species in italics */
.taxon {
  font-style: italic;
}

.quote {
    padding-left: 40px;
    padding-right: 10px;
    margin-bottom: 1em;
}

.booktitle {
    font-style: oblique;
}

/* Adapted from William Hammond (attributed to David Carlisle) */
/* "mathjax-users" Google Group, 2015-12-27 */

.latex-logo {font-family: "PT Serif", "Times New Roman", Times, serif;}

.latex-logo .A {font-size: 75%; text-transform: uppercase; vertical-align: .5ex;
         margin-left: -.48em; margin-right: -.2em;}

.latex-logo .E {vertical-align:-.5ex; text-transform: uppercase;
         margin-left: -.18em; margin-right: -.12em; }


================================================
FILE: css/components/elements/_permalinks.scss
================================================
// TODO - refactor
$opacity: 0.0 !default;

/*
So that we can position things (like .autopermalink) absolutely wrt these items.
Any element whose permalink should be positioned directly to the left of it
should be in this list.
*/
section,
article,
li,
blockquote,
figcaption,
dt,
.exercisegroup,
.discussion-like,
.solution-like,
.para {
  position: relative;
}

.autopermalink {
  position: absolute;
  display: inline-block;
  top: 0.5ex;
  left: -2em;
  font-size: 85%;
  // variable allows theme to set different opacities for dark/light
  opacity: var(--permalink-opacity, $opacity);
  transition: opacity 0.2s;
  margin-top: 0 !important;
  user-select: none;
}

li > .autopermalink {
  left: -3.5em;
}

.autopermalink > * {
  padding-left: 0.2em;
  padding-right: 0.2em;
}


// Move permalink for division titles etc a little bit lower
.appendix > .autopermalink,
.chapter > .autopermalink,
.index > .autopermalink,
.section > .autopermalink,
.subsection > .autopermalink,
.references > .autopermalink,
.exercises > .autopermalink {
  top: 1.5ex;
}

// In some styles, the autopermalink for paras land right on the border line.
// This is an attempt to fix that.  TODO: find a more robust solution, maybe
// using a variable for the left offset of paras inside blocks.
.assemblage-like > .para > .autopermalink,
.example-like > .para > .autopermalink,
.example-like > .exercise-like > .autopermalink,
.project-like > .para > .autopermalink,
.project-like > .exercise-like > .autopermalink,
.project-like > .exercise-like > .introduction > .para > .autopermalink,
.project-like > .exercise-like > .conclusion > .para > .autopermalink,
.remark-like > .para > .autopermalink {
  left: -2.9em;
}


.axiom-like, .example-like, .exercise-like, .solution-like, .assemblage-like, .definition-like, .remark-like, .project-like, .openproblem-like, .computation-like, .theorem-like, .proof, .case, li, dd {
  > .para:first-of-type > .autopermalink {
    display:none;
  }

  > .introduction > .para:first-of-type > .autopermalink {
    display:none;
  }
}


// Hover effects

.ptx-content:has(.autopermalink:hover) .autopermalink {
  opacity: 0.2;
}

.ptx-content:has(.autopermalink:hover) .autopermalink:hover {
  opacity: 1;
}

.autopermalink:has(a:focus-visible) {
  opacity: 1;
}

.permalink-alert {
  position: absolute;
  top: -3em;
  left: 5em;
  padding: 1.5em 2em;
  background: var(--content-background);
  border: 3px solid var(--page-border-color);
  z-index: 2001;
}


/* when jumping to a permalink, push down so sticky navbar does not cover */
:target {
  scroll-margin-top: 45px;
  // the "pink flash" when navigating to a target
  animation: target-fade 10s 1;
}

@keyframes target-fade {
    0% { background-color: var(--activated-content-bg) }
    100% {
      background-color: inherit;
      opacity: 1;
    }
}


================================================
FILE: css/components/elements/_poem.scss
================================================
/* style for poems */
.poem {
  display: table;
  margin: 0 auto;
  width: auto;
  max-width: 90%;
}

.poem > .heading {
  display: block;
  text-align: center;
}

section article.poem > .heading::after {
  content: "";
}

.poem > .heading > .title {
  font-weight: bold;
  font-size: 1.2em;
  line-height: 1.2em;
}

.poem .author {
  font-style: italic;
  margin-top: 0.75em;
}

.poem .author.left {
  text-align: left;
}

.poem .author.center {
  text-align: center;
}

.poem .author.right {
  text-align: right;
}

.poem .stanza > .heading {
  text-align: center;
  font-weight: bold;
  font-size: 1em;
  line-height: 1em;
}

.poem .stanza + .stanza {
  margin-top: 1em;
}

.poem .heading + .stanza {
  margin-top: 0.2em;
}

.poem .heading + .line {
  margin-top: 0.2em;
}

.poem .line.left {
  text-align: left;
  margin-left: 4em;
  text-indent: -4em;
}

.poem .line.center {
  text-align: center;
}

.poem .line.right {
  text-align: right;
}

.poem .tab {
  margin-left: 2em;
}


================================================
FILE: css/components/elements/_prism.scss
================================================
@use '../chunks/codelike';

// Prism stylesheets built locally as default ones don't support light/dark switching
// this is a merged version of the default and dark themes

// Default prism styling
// Blocks
pre[class*="language-"] {
  margin: 0;
  overflow: auto;
  border: 1px solid #e1e1e1;
}

// Inline code
:not(pre) > code[class*="language-"] {
  padding: .1em;
  border-radius: .3em;
  white-space: normal;
}

code[class*="language-"],
pre[class*="language-"] {
  color: black;
  background: #fdfdfd;
  text-shadow: none;
  font-family: var(--font-monospace);
  text-align: left;
  white-space: pre;
  word-spacing: normal;
  word-break: normal;
  word-wrap: normal;
  line-height: 1.2;
  tab-size: 4;
  hyphens: none;

  &.code-inline {
    // unclobber some inline code styles
    @include codelike.code-inline-spacing();
  }

  &::selection,
  & ::selection {
    background: #b3d4fc;
  }

  .token {
    
    &:is(.comment,
    .prolog,
    .doctype,
    .cdata) {
      color: #2a9716;
    }
    
    &.punctuation {
      color: #000;
    }
    
    &.namespace {
      opacity: .9;
    }
    
    &:is(.property,
    .tag,
    .boolean,
    .number,
    .constant,
    .symbol,
    .deleted) {
      color: rgb(41, 120, 15);
    }
    
    &:is(.selector,
    .attr-name,
    .string,
    .char,
    .builtin,
    .regex,
    .inserted) {
      color: #a11;
    }
    
    &:is(.operator,
    .entity,
    .url) {
      color: #000;
      background: none;
    }
    
    &:is(.atrule,
    .attr-value,
    .keyword) {
      color: #0679B7;
    }
    
    &.function,
    &.class-name {
      color: #30a;
    }
    
    &.important,
    &.variable {
      color: rgb(0, 0, 0);
    }
    
    
    &.important,
    &.bold {
      font-weight: bold;
    }
    
    &.italic {
      font-style: italic;
    }
    
    &.entity {
      cursor: help;
    }
  }
  
  // -------------------------------------------
  // Line numbers
  &.line-numbers {
    position: relative;
    padding-left: 3.8em;
    counter-reset: linenumber;
    overflow: auto;
    
    > code {
      position: relative;
      white-space: inherit
    }
    
    .line-numbers-rows {
      position: absolute;
      pointer-events: none;
      top: 0;
      font-size: 100%;
      left: -3.8em;
      width: 3em;
      letter-spacing: -1px;
      border-right: 1px solid #999;
      user-select: none
    }
    
    .line-numbers-rows > span {
      display: block;
      counter-increment: linenumber
    }
    
    .line-numbers-rows > span::before {
      content: counter(linenumber);
      color: #999;
      display: block;
      padding-right: .8em;
      text-align: right
    }
  }
  
  
  // -------------------------------------------
  // Line highlighting
  .line-highlight {
    position: absolute;
    margin-top: 4px;    // tune to match padding of containing pre
    left: 0;
    right: 0;
    padding: inherit 0;
    font-size: inherit;
    background: hsla(24, 20%, 50%, 8%);
    pointer-events: none;
    line-height: inherit;
    white-space: pre
  }
}

// -------------------------------------------
// Dark mode
:root.dark-mode {
  
  /* Code blocks */
  pre[class*="language-"] {
    border: 1px solid #3d3d3d;
  }
  
  
  // Darker styling to match Runesone's code mirror theme
  code[class*="language-"],
  pre[class*="language-"] {
    color: white;
    background: hsl(0, 0%, 8%);
    
    &::selection,
    & ::selection {
      background: hsl(200, 4%, 16%);
    }
    
    /* Make the tokens sit above the line highlight so the colours don't look faded. */
    .token {
      position: relative;
      z-index: 1;
      
      &:is(.comment,
      .prolog,
      .doctype,
      .cdata) {
        color: #68a950;
      }
      
      &.punctuation {
        color: white;
        opacity: 1;
      }
      
      &.namespace {
        opacity: .9;
      }
      
      &:is(.property,
      .tag,
      .boolean,
      .number,
      .constant,
      .symbol,
      .deleted) {
        color: #abc792;
      }
      
      &:is(.selector,
      .attr-name,
      .string,
      .char,
      .builtin,
      .regex,
      .inserted) {
        color: #ca9147;
      }
      
      &:is(.operator,
      .entity,
      .url) {
        color: white;
      }
      
      &:is(.atrule,
      .attr-value,
      .keyword) {
        color: #2d94fb;
      }
      
      &.function,
      &.class-name {
        color: #e3e1c2;
      }
      
      &.important,
      &.bold {
        font-weight: bold;
      }
      
      &.italic {
        font-style: italic;
      }
      
      &.entity {
        cursor: help;
      }
      
    }
  }
  
  .line-highlight {
    background: hsla(0, 0%, 33%, 10%);
    border-bottom: 1px dashed hsl(0, 0%, 33%);
    border-top: 1px dashed hsl(0, 0%, 33%);
    z-index: 0;
  }
}

@media print {
  code[class*="language-"],
  pre[class*="language-"] {
    .line-highlight {
      color-adjust: exact
    }
  }
}


================================================
FILE: css/components/elements/_summary-links.scss
================================================

/* Start of division toc links */
// .ptx-content to override _links rules
.ptx-content .summary-links {
  font-family: var(--font-headings);
  display: block;
  margin-top: 1em;

  a {
    color: var(--summary-link-text-color);
    background: var(--summary-link-background);
    font-size: 1.5em;
    line-height: 1.25em;
    padding: 10px 20px;
    padding-right: 60px;
    border-radius: 3px;
    position: relative;
    display: block;
    font-weight: unset;

    .title{
      font-style: normal;
    }

    .codenumber {
      margin-right: 0.41667em;
    }

    &::after {
      // triangles
      right: 0.83333em;
      content: "";
      position: absolute;
      top: 50%;
      margin-top: -0.4em;
      width: 0;
      height: 0;
      border-top: 0.4em solid transparent;
      border-bottom: 0.4em solid transparent;
      border-left: 0.4em solid var(--summary-link-text-color);
    }

    &:hover {
      color: var(--summary-link-hover-text-color);
      background: var(--summary-link-hover-background);

      // need to override work done in _links
      * {
        color: var(--summary-link-hover-text-color);
        background: var(--summary-link-hover-background);
      }
      .title {
        font-weight: normal;
      }

      &::after {
        border-left: 0.4em solid var(--summary-link-hover-text-color);
      } 
    } 
  }

  ul {
      list-style-type: none;
      padding: 0;
      margin-top: 0;
  }

  li {
      margin-top: 5px;
  }
}

@media screen and (width <= 480px) {
  .ptx-content .summary-links a {
    //shrink on mobile
    font-size: 100%;
    line-height: 1.25em;
  }
}


================================================
FILE: css/components/elements/_tables.scss
================================================
// limit rules targeting basic elements to just content area
.ptx-content {
  table {
    border-spacing: 0;
    border-collapse: collapse;
  }

  td {
    padding: 2px 5px;
    font-size: 90%;

    img {
      max-width: 200px;
      margin-right: 30px;
    }
  }

  th {
    padding: 2px 5px;
  }

  // generate alignment/border mixin classes for both th and td
  @each $cell-type in (th, td) {
    #{$cell-type} {
      .lines {
        white-space: nowrap;
      }

      // horizontal alignment options
      @each $class, $align in (l: left, c: center, r: right, j: justify) {
        &.#{$class} {
          text-align: $align;
        }
      }

      // vertical alignment options
      @each $class, $align in (t: top, b: bottom, m: middle) {
        &.#{$class} {
          vertical-align: $align;
        }
      }

      // border options
      @each $side, $side-symbol in (left: l, right: r, top: t, bottom: b) {
        @for $i from 0 through 3 {
          &.#{$side-symbol}#{$i} {
            @if $i ==0 {
              border-#{$side}: none;
            }

            @else {
              border-#{$side}: #{$i}px solid var(--body-text-color);
            }
          }
        }
      }
    }
  }


  // when cells do not have a border on left and right, add padding
  th.r0.l0,
  td.r0.l0  {
    padding-left: 0.8em;
    padding-right: 0.8em;
  }

  tr.header-vertical {
    th {
      writing-mode: vertical-rl;
      transform: rotate(180deg);  // match LaTeX's vertical header orientation
      padding-top: 5px;  // bottom after rotation
    }
  }

  .center {
    table {
      text-align: center;
      margin-left: auto;
      margin-right: auto;
    }
  }
}

// Rules with non-generic targeting

.tabular-box {
  margin-top: 0.5em;  //minimum space above to separate from figcaption
  overflow-x: auto;
}

.tabular-box.natural-width table {
  margin-left: auto;
  margin-right: auto;
}

// More specific types of tables

table.notation-list {
  tr {
    th {
      text-align: left;
      margin-left: 1em;
    }

    td {
      text-align: left;
      vertical-align: top;
    }
  }
}





================================================
FILE: css/components/elements/extras/_heading-underlines.scss
================================================
$color-light: var(--primary-color-white-30) !default;
$color-dark: var(--primary-color-black-30) !default;
$thickness: 2px !default;
$padding: 3px !default;
$thickness-h2: 4px !default;
$thickness-h3: 3px !default;


section > .heading {
  padding-bottom: $padding;
  border-bottom: $thickness solid $color-light;
}
section > h2.heading {
  border-bottom-width: $thickness-h2;
}
section > h3.heading {
  border-bottom-width: $thickness-h3;
}

:root.dark-mode {
  section > .heading {
    border-bottom-color: $color-dark;
  }
}


================================================
FILE: css/components/helpers/README.md
================================================
Mixins used to build style rules in other files


================================================
FILE: css/components/helpers/_buttons-default.scss
================================================
$border-radius: 0 !default;

@mixin ptx-button(
  $border-radius: $border-radius
) {
  font: inherit;
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 0 10px;
  gap: 10px;
  min-height: 34px;
  color: var(--button-text-color);
  background-color: var(--button-background);
  border-width: 1px;
  border-color: var(--button-border-color);
  border-style: solid;
  border-radius: $border-radius;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  cursor: pointer;

  // Disable accidental text-selection
  user-select: none;

  &:hover:not(.disabled) {
    color: var(--button-hover-text-color);
    background-color: var(--button-hover-background);
  }

  &:focus-visible {
    outline: 2px solid var(--button-text-color);
    outline-offset: -2px;
  }

  &.disabled {
    opacity: .4;
    cursor: not-allowed;
  }

  &.hidden {
    display: none;
  }

  &.open {
    color: var(--button-hover-text-color);
    background-color: var(--button-hover-background);
  }
}

@mixin ptx-dropdown-button {
  position: relative;

  .dropdown-content {
    display: none;
    position: absolute;
    background-color: var(--dropdown-background);
    min-width: 160px;
    z-index: 100;
    border: 1px solid var(--dropdown-border-color);
    right: 0;
    top: 35px;
    text-align: start;
    padding: 0;

    a {
      display: block;
      text-decoration: none;
      color: var(--dropdown-text-color);
      padding: 2px 8px;

      &:is(:hover, :focus-visible) {
        background-color: var(--dropdown-hover-background);
        color: var(--dropdown-hover-text-color);
      }
    }

    hr {
      color: var(--dropdown-border-color);
      margin: 4px 0;
    }
  }

  &:is(:hover, :focus-visible, :focus-within) {
    overflow: visible;

    .dropdown-content {
      display: block;
    }
  }
}


================================================
FILE: css/components/helpers/_cols.scss
================================================

// columns are arranged in row-major order to match print output in LaTeX
:is(.cols2, .cols3, .cols4, .cols5, .cols6) {
  display: flex;
  flex-wrap: wrap;
  justify-content: start;
}

// see lists and exercises for sample use
@mixin allow-cols($el, $col-gap: 2em) {
  @for $i from 2 through 6 {
    .cols#{$i} > #{$el} {
      // columns are a suggestion enforced by a minimum size
      // content that needs to be wider can reduce number of columns
      // in its row
      min-width: calc(100% / $i - #{$col-gap});
      width: min-content;
      margin-right: $col-gap;
    }
  }
}



================================================
FILE: css/components/helpers/_expandable.scss
================================================
// Styling for elements in ptx-main that are allowed to expand past normal width
// of ptx-content.

// Assumes that $content-padding is set to the padding of ptx-content
// and that element normally takes up 100% of parent width. (Like display-math)

// for responsive elements
$width-hard-cap: 900px !default;
$base-content-width: 600px !default;
$content-padding: 48px !default;
$always-expand: false !default;  // whether to always expand to the max width
$centered: false !default;  // whether to center the content if not max width
$content-with-padding-width: $base-content-width + 2 * $content-padding;

// for scrollable
$overflow-y-scroll: hidden !default;


// An element that has some minimum authored width which may be larger
// than the available width. We want it to scroll horizontally.
@mixin scrollable(
  $overflow-y-scroll: $overflow-y-scroll
) {
  overflow-x: auto;
  $overflow-y: $overflow-y-scroll;
}

// An element with no minimum width that we want to allow to expand
// to whatever width is available to maximize the display area.
@mixin responsive(
  $base-content-width: $base-content-width,
  $width-hard-cap: $width-hard-cap,
  $content-padding: $content-padding,
  $always-expand: $always-expand,
  $centered: $centered
) {
  @container ptx-main (width > #{$base-content-width + 2 * $content-padding}) {
    --max-width: calc(min((100cqw - 2 * #{$content-padding}), #{$width-hard-cap}));
    min-width: 100%;
    clear: right; // clear any floats
    @if $always-expand {
      width: var(--max-width);
    } @else {
      width: fit-content;      //grow if space needed
    }
    max-width: var(--max-width);
    @if $centered {
      margin-left: calc(-0.5 * (100cqw - #{$content-with-padding-width}));
    }
  }
}

// An element that has some minimum authored width which we want to allow to expand
// to whatever width is available to maximize visible content.
// Content that is still not visible will be scrollable.
@mixin expandable(
  $base-content-width: $base-content-width,
  $width-hard-cap: $width-hard-cap,
  $content-padding: $content-padding,
  $always-expand: $always-expand,
  $centered: $centered,
  $overflow-y-scroll: $overflow-y-scroll
) {
  @include scrollable(
    $overflow-y-scroll: $overflow-y-scroll
  );
  @include responsive(
    $base-content-width: $base-content-width,
    $width-hard-cap: $width-hard-cap,
    $content-padding: $content-padding,
    $always-expand: $always-expand,
    $centered: $centered
  );
}


================================================
FILE: css/components/interactives/README.md
================================================
Interactive elements.

These could be made conditional in the build process if we passed the requisite info from PTX to cssbuilder.


================================================
FILE: css/components/interactives/_calculators.scss
================================================
// GeoGebra calculator

$navbar-breakpoint: 856px !default;

.calculator-container {
  position: fixed;
  z-index: 100;
  bottom: 5px;
  right: 5px;
  width: 253px;
  height: 460px;
}

@media screen and (max-width: $navbar-breakpoint) {
  .calculator-container {
    //assumes navbar moves to bottom of screen
    bottom: 50px !important;
  }
}


================================================
FILE: css/components/interactives/_other.scss
================================================
// Misc styles for interactive bits that should only be incldued in a web context
// (not ebook)

.interactive-iframe-container {
  max-width: 100%;
  overflow: auto;
  & > iframe {
    margin-left: auto;
    margin-right: auto;
    display: block;
  }
}

.interactive__instructions {
  // ensure interactive instructions stay normal width
  max-width: var(--base-content-width);
}

// center instructions and iframes on standalone pages
.standalone-page .interactive-iframe-container {
  margin-left: auto;
  margin-right: auto;
}
.standalone-page .interactive__instructions {
  margin: 5px auto 20px;
}

.interactive-iframe-container__opener {
  display: block;
  margin-right: 5px;
  margin-top: 11px;
  margin-bottom: 5px;
  font-size: 0.8rem;
  & .icon {
    font-size: 18px;
  }

  // if figcaption or instructions follow, this should float next to that
  &:has(+ figcaption, + .instructions) {
    float: left;
    z-index: 1; // place above fig caption in render stack
    position: relative;  // for z-index
  }

  // and if both, the figcaption should clear
  + .instructions + figcaption {
    clear: left;
  }

  + .instructions {
    margin-top: .5em;
  }
}


.clipboardable {
  position: relative;  // To anchor the code-copy button
  display: flow-root;

  .code-copy {
    position: absolute;
    right: 0;
    top: 0;
    opacity: 0.25;
    border-width: 0;
    background: none;
    cursor: pointer;
    z-index: 1;
    white-space-collapse: collapse;
    padding: 1px;
    scale: 0.85;

    &:hover {
      opacity: 0.7;
    }

    .checkmark {
      display: none;
    }

    &.copied {
      opacity: 1;
      color: mediumseagreen;
      cursor: not-allowed;
      pointer-events: none;

      .copyicon {
        display: none;
      }

      .checkmark {
        display: inline;
      }
    }
  }
}

// if code-display clipboardable, move margin to that container and turn some into padding
// to help make sure clipboard icon is contained inside the code-display in dark mode
.clipboardable:has(.code-display) {
  margin: 0.25em 0;

  .code-display {
    margin: 0;
    padding: 0.25em 0;
  }
}

================================================
FILE: css/components/interactives/_runestone.scss
================================================
// extra specific to override Runestone margin
.ptx-content .ptx-runestone-container .runestone {
  margin: unset;
  border-radius: 0;
  border-width: 1px;
}

// avoid label splitting into multiple lines
.multiplechoice_section label > .para {
  display: inline;
}

// extra specific to override Runestone margin
.ptx-content .ptx-runestone-container .ac_question { 
  max-width: var(--base-content-width);
  margin: 0 auto 10px;
}

.runestone .runestone_caption {
  // caption is always just something like "ActiveCode" in PTX
  display: none;
}


/* to undo Runestone's draganddrop.css */
.ptx-content .ptx-runestone-container .rsdraggable {
  font-size: 100%;
}

// Unsure if still needed
/* hack for runestone */
/* to undo Runestone's presentermode.css */
.ptx-content .bottom {
    position: unset;
}

// override Runestone's pre formatting with these extra specific rules
.ptx-runestone-container .runestone code,
.ptx-runestone-container .runestone pre {
  font-size: .93rem;
  line-height: 1.2;
  font-family: var(--font-monospace);
}

// override Runestone's pre formatting with these extra specific rules
.ptx-runestone-container code[class*="language-"],
.ptx-runestone-container pre[class*="language-"] {
  color: black;
  background: #fdfdfd;
}

//Fixup datafile captions
.runestone.datafile {
  .datafile_caption {
    background: var(--code-inline-background);
    border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888);
    display: block;
    width: fit-content;
    margin: 0 auto;
  }
  img {
    margin: 0 auto;
    display: block;
    border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888);
  }
  pre, textarea {
    margin: 0 auto;
    border: 1px solid color-mix(in oklab, var(--code-inline-background) 50%, #888);
    background-color: var(--page-color);
  }
}
.runestone.datafile + .program {
  margin-top: 0;
}

// RS does not care what kind of element is used
// PTX chooses to use a ul, so we will fix margins for it here instead of RS
ul[data-component="timedAssessment"] {
  margin: 0;
  padding: 0;
}

:root.dark-mode {
  // Darker styling to match Runesone's code mirror theme
  .ptx-runestone-container code[class*="language-"],
  .ptx-runestone-container pre[class*="language-"] {
    color: white;
    background: hsl(0, 0%, 8%);
  }
}

// Similar to rules in _spacing.scss
// <statments> exercise content divs that are hoisted into a RS interactive
// should get one of these classes.
@layer spacing {
  .runestone :is(.exercise-statement, .exercise-content) > *:not(:first-child) {
    margin-top: 1em;
  }
  .ptx-runestone-container + .solutions {
    margin-top: 0.5em;
  }
}


================================================
FILE: css/components/interactives/_sagecell.scss
================================================
// TODO - refactor

.sagecell_sessionOutput pre {
  font-family: var(--font-monospace);
}

.sagecell {
  white-space: normal;
  margin-top: 1.25em;
  margin-bottom: 1.25em;
}

.sage-interact.sagecell {
  margin: 0;
}

.sagecell_evalButton {
  font-family: var(--font-body);
  font-size: 16px;
  padding: 0 0.65em;
}

.sagecell_evalButton {
  cursor: pointer;
  display: inline-block;
  vertical-align: middle;
  /* Disable accidental text-selection */
  user-select: none;
  /* Truncate overflowing text with ellipsis */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  border-width: 1px;
  border-style: solid;
  font-weight: bold;
  border-radius: 3px;
}

.sagecell_evalButton {
  color: #383838;
  background-image: linear-gradient(#f7f7f7, #bbbbbb);
  border-color: #c4c4c4;
}

.sagecell_evalButton:hover {
  color: #181868;
  background-image: linear-gradient(#bbbbbb, #f7f7f7);
}

.sagecell_evalButton:focus,
.sagecell_evalButton:active {
  color: #20160b;
  background-image: linear-gradient(#ff6852, #ffd7d1);
  border-color: #ff2822;
}

.sagecell .sagecell_editor {
  margin-bottom: 8px;
}

.sageanswer {
  font-family: monospace;
  white-space: pre;
  margin-left: 3em;
  margin-bottom: 2em;
}

.sageanswer .key {
  display: inline-block;
  vertical-align: top;
  margin-right: 1em;
}

.sageanswer .output {
  display: inline-block;
  vertical-align: top;
}


================================================
FILE: css/components/interactives/_webwork.scss
================================================
// TODO - needs refactoring and dark mode update

@use 'components/helpers/buttons-default' as buttons;

/*  WW problems */
.ptx-content .wwprob table.attemptResults {
  margin-left: 2em;
  background: #efefef;
  padding: 0.2em;
}

.ptx-content .wwprob table.attemptResults + .attemptResultsSummary {
  margin-top: 1em;
}

.ptx-content .wwprob .problem-main-form {
  margin-top: 1em;
  background: #eeeeff;
  padding: 0.5em;
}

.ptx-content .wwprob td.ResultsWithoutError {
  background: #9f9;
}

.ptx-content .wwprob td.ResultsWithError {
  background: #f99;
}

.ptx-content .wwprob tr th {
  text-align: center;
  padding: 0.2em 1em 0.2em 1em;
}

.ptx-content .wwprob tr td {
  text-align: center;
}

.ptx-content .wwprob tr td:empty {
  background: #fff;
}

.ptx-content .wwprob ol,
.ptx-content .wwprob ul {
  margin-top: 0.75em !important;
}

.ptx-content .wwprob .problem {
  background: #fdfdfd;
}

.ptx-content .wwprob .problem a {
  text-decoration: none;
}

.ptx-content .wwprob #footer {
  font-size: 70%;
  text-align: right;
}

/* interactive WeBWorK */

label.webwork {
  display: inline-flex;
  flex-direction: column;
}

label.correct .status {
  background-color: #a0f0a0;
}

label.partly-correct .status {
  color: #ffcc66;
}

label.incorrect .status {
  color: #b00;
}

label.incorrect .status::before {
  content: " ";
}

label.feedback {
  word-wrap: break-word;
}

label.correct .feedback {
  background-color: #00ffcc;
}

label.partly-correct .feedback {
  color: #ffcc66;
}

label.incorrect .feedback {
  color: #e07070;
}

.webwork img,
.webwork + .knowl-output img {
  max-width: 100%;
}

// Make the default margin for items inside the exercise-wrapper similar to
// default for items in a section
.exercise-wrapper > *:not(:first-child) {
  margin-top: 1.5em;
}

.ptx-content .problem-buttons {
  display: flex;
}

.ptx-content .webwork-button {
  @include buttons.ptx-button;
}

//.hidden-content used to be used for knowls and got repurposed for hiding webwork contents
// now just used by webwork
.problem-buttons.hidden-content,
.problem-contents.hidden-content {
  display: none;
}


================================================
FILE: css/components/page-parts/README.md
================================================
Styling for large display regions on the page

It is expected that a file like `_parts-default.scss` will be used to aggregate the
parts. Themes that wish to use a different mix of parts should provide their own
version of a parts file.


================================================
FILE: css/components/page-parts/_banner.scss
================================================
$max-width: 1200px !default;  // 0 == no max width
$navbar-breakpoint: 800px !default;
$centered-content: false !default;

.ptx-masthead {
  position: relative;
  background: var(--banner-background);
  width: 100%;
  display:flex;
  justify-content: center;

  .ptx-banner {
    border-top: 1px solid transparent;
    overflow: hidden;
    padding: 10px 10px;
    border-bottom: none;
    display:flex;
    width: 100%;
    align-items: center;
    @if $max-width > 0 {
      max-width: $max-width;
    }
    @if $centered-content  {
      justify-content: center;
    }
  }

  a {
    color: var(--doc-title-color, #2a5ea4);
  }

  a:active {
    color: var(--link-active-text-color);
  }

  .title-container {
    font-family: var(--font-headings);
    font-size: 2em;
    padding-left: 9.68px;
    overflow: hidden;
    flex: 1;

    .heading {
      font-weight: 700;
      font-size: 100%;
      line-height: 1.25em;
    }

    .title:has(+ .subtitle)::after {
      content: ":";
    }

    .subtitle {
      font-weight: normal;
    }
  }

  .logo-link {
    height: 5em;
    display: flex;

    img {
      max-height: 100%; //fix rendering bug on safari with large images
    }
    img[src$=".svg"] {
      height: 100%; //svg's in safari don't get a correct width with max-height
      // don't use this for all images as we wouldn't want to stretch raster images
    }
  }

  // // Insert a placeholder icon if the logo-link is empty
  // .logo-link:empty::before {
  //   display: flex;
  //   font-family: var(--font-body);
  //   font-size: 4rem;
  //   margin-top: -0.7rem;
  //   content: "\2211"; //sigma symbol
  //   color: var(--page-border-color)
  // }

  .byline {
    color: var(--byline-color);
    font-weight: normal;
    margin: 0;
    font-size: 62.5%;
    min-height: inherit;
  }
}

@media screen and (max-width: $navbar-breakpoint) {
  .ptx-masthead {
    border-bottom: 1px solid var(--page-border-color);

    .ptx-banner {
      padding: 10px 28px;
      display: flex;
      justify-content: center;
    }

    .logo-link::before {
      font-size: 1rem;
      margin-top: 0;
    }

    .title-container {
      width: fit-content;
      flex: unset;
      .heading {
        line-height: 1em;

        .subtitle {
          /* Force the subtitle onto a separate line */
          display: block;
          font-size: 80%;
          line-height: 1em;
        }
      }
    }

    .byline {
      font-size: 50%;
    }
  }
}


@media screen and (width <= 480px) {
  .ptx-masthead {

    .title-container {
      padding: 0;
      text-align: center;
      font-size: 1em;
    }

    .logo-link {
      display: none;
    }

    .byline {
      display: none;
    }
  }
}


================================================
FILE: css/components/page-parts/_body.scss
================================================
// Body level styling
$max-width: 1200px !default;  // 0 == no max width
$standalone-max-width: 1600px !default;  // used for iframe standalones

$content-width: 600px !default;                 // without padding
$content-side-padding: 48px !default;
$centered-content: false !default;

$footer-button-border-radius: 0 !default;

$content-with-padding-width: $content-width + 2 * $content-side-padding;

@use 'components/helpers/buttons-default' as buttons;

// set content width up as a CSS variables so other files can ask
// "how wide is standard content?"
:root {
  --base-content-width: #{$content-width};
  --content-padding: #{$content-side-padding};
}

// hits regular pages and generated iframe pages
body {
  margin: 0;
  min-height: 100vh;

  display: flex;
  flex-direction: column;
  align-items: stretch;

  &.pretext {
    color: var(--body-text-color);
    font-family: var(--font-body);
  }
}

.ptx-page {
  position: relative;
  display: flex;
  flex-grow: 1;  // fill space in body
  width: 100%;
}

.ptx-main {
  flex-grow: 1;
  position: relative;
  max-width: 100%;
  container-name: ptx-main;  // for container queries elsewhere
  container-type: inline-size;  // for container queries elsewhere
}

// Base width/padding
// ptx-main ensures iframe pages don't get these
.ptx-main .ptx-content {
  max-width: $content-with-padding-width;   // bad for worksheets
  padding: 24px $content-side-padding 60px;

  @if $centered-content {
    margin-left: auto;
    margin-right: auto;
  }
}
.worksheet .ptx-main .ptx-content {
    max-width: 960px;
}

@if $max-width > 0 {
  .ptx-page {
    max-width: $max-width;
    margin-left: auto;
    margin-right: auto;
  }
}

body.pretext,
body.standalone {
  margin: 0;
  padding: 0;
  font-size: 16px;
  background: var(--page-color, white);
}

// Hide print preview header div in normal view
.ptx-content .print-preview-header {
  display: none;
}

body.pretext > a.assistive {
  padding:6px;
  position: absolute;
  top:-40px; // hide off screen until keyboard focus
  left: 0px;
  color:white;
  border-right:1px solid white;
  border-bottom:1px solid white;
  border-bottom-right-radius:8px;
  background:#BF1722; // always have correct contrast
  z-index: 10000;

  &:focus {
    top:0px; // move into view when keyboard focus
    outline:0;
    transition: top .1s ease-in, background .5s linear;
  }
}


.ptx-content-footer {
  display: flex;
  justify-content: space-around;
  max-width: $content-with-padding-width;

  padding-top: 2em;
  padding-bottom: 2em;
  padding-left: $content-side-padding;
  padding-right: $content-side-padding;

  @if $centered-content {
    margin-left: auto;
    margin-right: auto;
  }

  .button {
    @include buttons.ptx-button(
      $border-radius: $footer-button-border-radius
    );
    .icon {
      margin: 0 -7px; // current icons have lots of whitespace
    }
  }
}

// Give iframe popout pages a wider max width, since they have no sidebars
// and content should be free to grow to reasonable size
body.standalone-page .ptx-page {
    max-width: $standalone-max-width;
}

================================================
FILE: css/components/page-parts/_footer.scss
================================================
$max-width: 0 !default;  // 0 == no max width
$navbar-breakpoint: 856px !default;
$nav-height: 36px !default;

@use 'components/helpers/buttons-default' as buttons;

.ptx-page-footer {
  background: var(--footer-background);
  padding-top: 0;
  border-top: 2px solid var(--page-border-color);
  border-bottom: 2px solid var(--page-border-color);
  display: flex;
  flex-direction: row;
  justify-content: center;
  width: 100%;
  gap: 90px;
  position: relative;
  @if $max-width > 0 {
    max-width: $max-width;
  }
  
  
  & > a {
    margin: 1em 0;
    color: var(--body-text-color);
  }

  & > a > .logo:first-child {
    height: 3em;
    width: unset;
    margin: 0;
  }

  .feedback-link {
    @include buttons.ptx-button;
  }
}


@media screen and (max-width: $navbar-breakpoint) {
  .ptx-page-footer {
    // prevent icons from spreading too much
    gap: 20px;
    justify-content: center;
    margin-bottom: $nav-height - 2;

    & > a > .logo:first-child {
      height: 2em;
    }
  }
}


================================================
FILE: css/components/page-parts/_navbar.scss
================================================
$max-width: 1200px !default;  // 0 == no max width
// applied to the contents of the navbar

$nav-height: 36px !default;
$border-width: 1px !default;
$navbar-breakpoint: 800px !default;
$center-content: true !default;

@use 'components/helpers/buttons-default' as buttons;

@use 'components/page-parts/extras/navbar-btn-borders';

.ptx-navbar {
  position: sticky;
  top: 0;
  height: $nav-height;
  width: 100%;
  background: var(--navbar-background);
  border: 0;
  border-top: 1px solid var(--page-border-color);
  border-bottom: 1px solid var(--page-border-color);
  margin: 0;
  z-index: 500;
  overflow: visible;
  display: flex;

  .ptx-navbar-contents {
    position: relative;
    display: flex;
    flex: 1;
    justify-content: center;
    align-items: center;
    max-width: $max-width;
    @if $center-content {
      margin: 0 auto;
    }
  }

  .button {
    @include buttons.ptx-button;

    & {
      height: 100%; //always fill container
      // Disable normal borders - top/bottom provided by container
      // Use extras/_navbar-btn-borders.scss for side borders if desired
      border-width: 0;

    }
  }

  .toc-toggle {
    width: 240px;
    gap: 0.4em;
    margin-left: 0; //assumes is first button
  }

  :is(.treebuttons, .nav-runestone-controls, .nav-other-controls) {
    display: flex;
  }

  .treebuttons {
    flex: 1 1 210px;
    justify-content: end;
  }

  .nav-runestone-controls {
    flex: 1 1 70px;
    justify-content: end;
  }

  .pretext .navbar .dropdown {
    height: 34px;
  }

  .embed-popup {
    padding: 10px;
    background-color: var(--navbar-background);
    position: absolute;
    margin-top: $nav-height;
    border: 1px solid var(--page-border-color);
    border-radius: 3px;
    box-shadow: 0 0 5px var(--primary-color-gray-80);
    color: var(--button-text-color);

    .embed-code-container {
      width: "100%";
      padding:5px;
      .embed-code-textbox {
        width: 100%;
        padding: 10px;
        height: 5em;
      }
    }
  }

  .treebuttons > * {
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 75px;
  }

  .treebuttons .icon {
    margin: 0 -7px; // chevrons have lots of horizontal padding
  }

  :is(.index-button) .icon {
    display: none;
  }

  :is(.runestone-profile, .activecode-toggle, .searchbutton, .calculator-toggle, .light-dark-button, .embed-button) .name {
    display: none;
  }

  .index-button {
    min-width: 70px;
  }

}

// Button in the navbar, but needs to be less specific so not nested in previous
.runestone-profile {
  @include buttons.ptx-dropdown-button;
}

@if $max-width > 0 {
  @media screen and (min-width: $max-width) {
    body.pretext .ptx-navbar {
      //forces navbar to line up cleanly with sidebar
      // need padding because there is no container around the items in navbar
      // padding: 0 calc((100% - $max-width) / 2);
      // border-left-width: 1px;

      // //tug contents of first button to left
      // & .ptx-navbar-contents > *:first-child {
      //   justify-content: start;
      // }
    }
  }
}

@media screen and (max-width: $navbar-breakpoint) {
  @include navbar-btn-borders.navbar-btn-borders();

  .ptx-navbar {
    position: fixed;
    top: auto;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 1100;
    background: var(--button-border-color);
    max-width: 100vw;

    .ptx-navbar-contents {
      max-width: 100vw;
    }

    .nav-runestone-controls {
      flex: 0;
    }

    .toc-toggle {
      flex: 2 1 100px;
    }

    .treebuttons {
      flex: 3 1 150px;
      /* 3:2 ratio with toc-toggle */
    }

    .treebuttons > * {
      flex: 1 1;
      min-width: 35px
    }

    .index-button {
      display: none;
    }

    .embed-popup {
      margin-top: unset;
      bottom: $nav-height;
    }

    .dropdown-content {
      top: unset;
      bottom: $nav-height;
    }

    :is(.toc-toggle, .previous-button, .up-button, .next-button, .calculator-toggle, .index-button, .embed-button) .name {
      display: none;
    }
  }
}


================================================
FILE: css/components/page-parts/_toc-basics.scss
================================================
// shared toc styling used by _toc-default, etc...

$sidebar-width: 240px !default;
$nav-height: 36px !default;



.ptx-sidebar {
  align-self: flex-start; // needed for sticky inside a flex

  &.visible {
    display: block;
  }

  &.hidden {
    display: none;
    height: 0;
  }
}

.ptx-toc {
  --codenumber-pad-left: 0.3rem;
  --codenumber-pad-right: 0.5rem;

  --toc-indent-first: calc(1.0rem + var(--codenumber-pad-left) + var(--codenumber-pad-right));
  --toc-indent-second: calc(1.7rem + var(--codenumber-pad-left) + var(--codenumber-pad-right));
  --toc-indent-third: calc(2.2rem + var(--codenumber-pad-left) + var(--codenumber-pad-right));

  background: var(--toc-background);

  margin: 0;
  font-size: 0.9rem;

  /* -------------------toc-items-------------------- */
  // will be less indentation, add some padding
  &:is(.depth1, .parts.depth2) {
    --codenumber-pad-right: 0.5rem;
  }

  .toc-item-list {
    margin: 0;
    padding: 0;
    list-style: none;
    background: var(--tocitem-background);

    .active {
      list-style: none; // clobber runestone css
    }
  }

  .toc-item {
    background-color: var(--tocitem-background);
    color: var(--toc-text-color);
    border-color: var(--toc-border-color);

    a {
      color: inherit;
    }

    // only highlight lowest level active item
    // need !important to override later depth based css
    &.active:not(:has(.toc-item.active)) {
      color: var(--tocitem-active-text-color) !important;
      background-color: var(--tocitem-active-background) !important;
      border-color: var(--tocitem-active-border-color) !important;
    }

    // hoving over a toc item
    & > .toc-title-box > a:is(:hover, :focus) {
      color: var(--tocitem-highlight-text-color);
      background-color: var(--tocitem-highlight-background);
      border-color: var(--tocitem-highlight-border-color);
    }
  }

  /* -------------------title-box------------------- */

  .toc-title-box {
    display: flex;
  }

  .toc-title-box > .internal {
    position: relative;
    display: flex;
    flex-grow: 1;
    padding: 0.2em;
    font-weight: 500;
  }

  /* at second level, switch fonts */
  .toc-item-list .toc-item-list .toc-title-box > .internal {
    font-weight: normal;
  }

  /* -------------------codenumbers-------------------- */
  .codenumber {
    min-width: var(--toc-indent-first);
    padding-left: var(--codenumber-pad-left);
    padding-right: var(--codenumber-pad-right);
    display: inline-block;
    text-align: left;
    flex-grow: 0;
  }
}



// --------------------------------------------------------------------------
// Conditional styling based on depth

.ptx-toc .toc-item {
  color: var(--toclevel1-text-color);
  background-color: var(--toclevel1-background);
}

.ptx-toc .toc-item .toc-item {
  color: var(--toclevel2-text-color);
  background-color: var(--toclevel2-background);
}
.ptx-toc .toc-item  .toc-item .toc-item {
  color: var(--toclevel3-text-color);
  background-color: var(--toclevel3-background);
}


/* second level of numbering */
/*  anything 1+ levels deeper than a chapter in a book */
.book .ptx-toc .toc-chapter .toc-item-list .codenumber,
/*  anything 1+ levels deeper than a section in an article */
.article .ptx-toc .toc-section .toc-item-list .codenumber,
/*  anything 1+ levels deeper than backmatter */
.ptx-toc .toc-backmatter .toc-item-list .codenumber {
  font-size: 80%;
  padding-top: 0.16em;
  min-width: var(--toc-indent-second);
}

/* third level of numbering */
/*  anything 2+ levels deeper than a chapter in a book */
.book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .codenumber,
/*  anything 2+ levels deeper than a section in an article */
.article .ptx-toc .toc-section .toc-item-list .toc-item-list .codenumber,
/*  anything 2+ levels deeper than backmatter */
.ptx-toc .toc-backmatter .toc-item-list .toc-item-list .codenumber {
  min-width: var(--toc-indent-third);
  visibility: hidden;
}

/* reveal hidden numbers on interaction */
.ptx-toc .toc-item-list .toc-item-list .toc-item-list a:is(:hover, :focus) > .codenumber {
  visibility: visible;
}

/* Any toc item without a codenumber needs indentation
Can't select absence of a preceeding, so indent all titles
and then clear indent if there is a codenumber */
.ptx-toc .toc-item .toc-title-box .title {
  margin-left: var(--toc-indent-first);
}

/* second level as defined by codenumber selectors */
.book .ptx-toc .toc-chapter .toc-item-list .title,
.article .ptx-toc .toc-section .toc-item-list .title,
.ptx-toc .toc-backmatter .toc-item-list .title {
  margin-left: var(--toc-indent-second);
}

/* third level as defined by codenumber selectors */
.book .ptx-toc .toc-chapter .toc-item-list .toc-item-list .title,
.article .ptx-toc .toc-section .toc-item-list .toc-item-list .title,
.ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title {
  margin-left: var(--toc-indent-third);
}

/* unless there is a codenumber */
.ptx-toc .toc-item > .toc-title-box .codenumber + .title {
  margin-left: 0 !important;
}

// --------------------------------------------------------------------------
// Conditional styling based on depth


.ptx-toc .toc-chapter .toc-item-list .title,
.ptx-toc .toc-section .toc-item-list .title,
/* 2 levels deep in back matter */
.ptx-toc .toc-backmatter .toc-item-list .toc-item-list .title {
  font-size: 90%;
}

.ptx-toc .toc-chapter .toc-item-list .toc-item-list .title,
.ptx-toc .toc-section .toc-item-list .toc-item-list .title,
/* 3 levels deep in back matter */
.ptx-toc .toc-backmatter .toc-item-list .toc-item-list .toc-item-list .title {
  font-style: italic;
}

/* -------------------depth controls-------------------- */
.ptx-toc.depth0 ul.structural {
  display: none;
}

.ptx-toc.depth1 ul.structural ul.structural {
  display: none;
}

.ptx-toc.depth2 ul.structural ul.structural ul.structural {
  display: none;
}

.ptx-toc.depth3 ul.structural ul.structural ul.structural ul.structural {
  display: none;
}

.ptx-toc.depth4 ul.structural ul.structural ul.structural ul.structural ul.structural {
  display: none;
}

/* if depth is shallow, identify best available toc item */
.ptx-toc.depth1 ul.structural .toc-item.contains-active {
  background-color: var(--tocitem-active-backgrounde);
  color: var(--tocitem-active-text-color);
}

.ptx-toc.depth2 ul.structural ul.structural .toc-item.contains-active {
  background-color: var(--tocitem-active-background);
  color: var(--tocitem-active-text-color);
}


// --------------------------------------------------------------------------
// Focused toc

/* Hide all but active area of book */
.ptx-toc.focused {

  ul.structural:not(.contains-active) > .toc-item {
    display: none;

    &.visible {
      display: block;
    }
  }

  ul.structural .toc-item.active > ul.structural > .toc-item {
    display: block;

    &.hidden {
      display: none;
    }
  }

  .toc-expander {
    border: 0;
    padding: 2px 5px;
    background: inherit;
    color: inherit;
    display: flex;
    align-items: center;

    .icon {
      font-size: 1.25em;
      line-height: 18px;
      font-variation-settings: 'wght' 200;
    }

    &:is(:hover) {
      background-color: var(--tocitem-highlight-background);
      color: var(--tocitem-highlight-text-color);

      .icon {
        fill: var(--tocitem-highlight-text-color);
      }
    }
  }

  /* ---------------icon customization----------------- */
  .toc-item > .toc-title-box > .toc-expander > .icon:before {
    content: "add";
  }

  .toc-item.expanded > .toc-title-box > .toc-expander > .icon:before {
    content: "remove";
  }
}


================================================
FILE: css/components/page-parts/_toc-default.scss
================================================
$scrolling: true !default;
$sidebar-width: 240px !default;
$nav-height: 36px !default;
$sidebar-breakpoint: 856px !default;
$navbar-breakpoint: 800px !default;

@use 'toc-basics' with (
  $sidebar-width: $sidebar-width,
  $nav-height: $nav-height
);

.ptx-sidebar {
  flex: 0 0 $sidebar-width;
  @if $scrolling {
    position: sticky;
    top: $nav-height;
    overflow-y: hidden;
  }
}

.ptx-toc {
  @if $scrolling {
    position: sticky;
    top: $nav-height;
    overflow-y: auto;
    overflow-x: hidden;
    height: calc(100vh - $nav-height);
    margin-top: -1px; // partially hide top border of first toc item

    // border under the last item before the pretext icon
    & > .toc-item-list:first-child > .toc-item:last-child {
      border-bottom: 3px solid var(--toc-border-color);
    }
  }
  @else {
    // not scrolling
    scrollbar-width: none;
    padding: 10px 0;
    box-sizing: border-box;
    border-right: 1px solid var(--toc-border-color);
  }
}

// Hide once we get too narrow
@media screen and (max-width: $sidebar-breakpoint) {
  .ptx-sidebar {
    display: none;
    position: sticky;
    top: $nav-height;
    background: var(--content-background);
    min-height: 30vh;
    border-right: 2px solid var(--toc-border-color);
    border-bottom: 2px solid var(--toc-border-color);
    width: $sidebar-width;
  }

  @if not $scrolling {
    .ptx-sidebar {
      overflow-y: scroll;
    }
  }
}

// flip sidebar to bottom one navbar moves
@media screen and (max-width: min($sidebar-breakpoint, $navbar-breakpoint)) {
  .ptx-sidebar {
    position: fixed;
    z-index: 1000;
    top: unset;
    height: auto;
    max-height: 80vh;
    max-width: 80vw;
    bottom: $nav-height;
    border-right: 2px solid var(--toc-border-color);
    border-top: 2px solid var(--toc-border-color);
  }
  .ptx-toc {
    border-top: 2px solid var(--toc-border-color);
    border-bottom: 0;
    max-height: 80vh;
  }
}


================================================
FILE: css/components/page-parts/_toc-overlay.scss
================================================
$sidebar-width: 240px !default;
$nav-height: 36px !default;
$navbar-breakpoint: 800px !default;
$border-width: 1px !default;
$initially-visible: false !default;

@use 'toc-basics' with (
  $sidebar-width: 0,
  $nav-height: $nav-height
);

.ptx-sidebar {
  position: sticky;
  width: 0;
  @if $initially-visible {
    display: block;
  }
  @else {
    display: none;
  }
  z-index: 200;
  height: 0;
  top: 35px;
}

.ptx-toc {
  border-right: $border-width solid var(--toc-border-color);
  border-bottom: $border-width solid var(--toc-border-color);
  max-height: calc(100vh - 200px);
  overflow-y: auto;
  background: var(--page-color);
  width: $sidebar-width;

  // border under the last item before the pretext icon
  & > .toc-item-list:first-child > .toc-item:last-child {
    border-bottom: 3px solid var(--toc-border-color);
  }
}

// flip sidebar to bottom one navbar moves
@media screen and (max-width: $navbar-breakpoint) {
  .ptx-sidebar {
    position: fixed;
    top: unset;
    height: auto;
    max-height: 80vh;
    max-width: 80vw;
    bottom: $nav-height;
    border-right: 2px solid var(--toc-border-color);
    border-top: 2px solid var(--toc-border-color);
  }
  .ptx-toc {
    border-top: 2px solid var(--toc-border-color);
    border-bottom: 0;
    max-height: 80vh;
  }
}


================================================
FILE: css/components/page-parts/extras/README.md
================================================
Options that can be added by a theme to tweak a parts file


================================================
FILE: css/components/page-parts/extras/_navbar-btn-borders.scss
================================================

$border-width: 1px !default;

@mixin navbar-btn-borders {
  .ptx-navbar {
    .button {
      border-left-width: $border-width;
      border-right-width: $border-width;
      border-color: var(--page-border-color);
    }
  
    & > *:not(:first-child) {
      //hide double borders
      margin-left: -1 * $border-width;
    }
  }
}


================================================
FILE: css/components/page-parts/extras/_toc-borders.scss
================================================

$border-width: 1px !default;

// apply some borders to the TOC
.toc-item {
  border-top: $border-width solid var(--toc-border-color);
}
.ptx-toc.focused .toc-title-box > a:hover {
  border-right: $border-width solid var(--toc-border-color);
}
.ptx-toc.focused .toc-expander:is(:hover) {
    border-left: $border-width solid var(--toc-border-color);
}
// Extra border above top level items
.ptx-toc > .toc-item-list > .toc-item {
  border-top: $border-width + 1 solid var(--toc-border-color);
}


================================================
FILE: css/components/page-parts/extras/_toc-expand-chevrons.scss
================================================
// Use chevrons instead of +/- in ToC expander control

.ptx-toc.focused {
  .toc-item > .toc-title-box > .toc-expander > .icon {
    font-size: 30px;
    &:before {
      content: "chevron_left";
    }
  }

  .toc-item.expanded > .toc-title-box > .toc-expander > .icon {
    transform: rotate(-90deg);
    &:before {
      content: "chevron_left";
    }
  }
}


================================================
FILE: css/components/page-parts/extras/_toc-hidden-scrollbar.scss
================================================
// blend in with page until hover
.ptx-toc {
  scrollbar-color: var(--content-background) var(--content-background);

  // reveal scroll on hover
  &:hover {
    scrollbar-color: var(--page-border-color) var(--content-background);
  }
}


================================================
FILE: css/components/page-parts/extras/_toc-last-level-plain.scss
================================================
// levels 2 & 3 only get new colors if they contain further levels
// that way bottom level has default styling

.ptx-toc:is(.depth0, .depth1, .depth2) .toc-item .toc-item {
  background-color: var(--tocitem-background);
  color: var(--toc-text-color);
}

.ptx-toc:is(.depth0, .depth1, .depth2, .depth3) .toc-item .toc-item .toc-item  {
  background-color: var(--tocitem-background);
  color: var(--toc-text-color);
}


================================================
FILE: css/dist/epub.css
================================================
@charset "UTF-8";

/* ../../css/targets/ebook/epub/epub.scss */
* {
  box-sizing: border-box;
}
@layer spacing {
  :is(section, article, .knowl__content) > *:not(:first-child) {
    margin-top: 1.5em;
  }
  :is(section, article, .knowl__content) > .para + .para {
    margin-top: 1em;
  }
  .ptx-content :is(ul, td, li, dd, .blockquote, .sbspanel, .para.logical) > *:not(:first-child) {
    margin-top: 0.5em;
  }
}
ol.no-marker,
ul.no-marker,
li.no-marker {
  list-style-type: none;
}
ol.decimal {
  list-style-type: decimal;
}
ol.lower-alpha {
  list-style-type: lower-alpha;
}
ol.lower-alpha-level-1 > li::marker {
  content: "(" counter(list-item, lower-alpha) ") ";
}
ol.upper-alpha {
  list-style-type: upper-alpha;
}
ol.lower-roman {
  list-style-type: lower-roman;
}
ol.upper-roman {
  list-style-type: upper-roman;
}
ul.disc {
  list-style-type: disc;
}
ul.square {
  list-style-type: square;
}
ul.circle {
  list-style-type: circle;
}
dl:is(.description-list, .glossary) {
  margin: 0;
}
dl:is(.description-list, .glossary) dt {
  font-weight: bold;
  max-width: 55ex;
}
dl:is(.description-list, .glossary) dd::after {
  content: "";
  display: block;
  clear: both;
}
.para > dl:is(.description-list) {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}
dl.glossary dt {
  margin-top: 1.25em;
}
dl.glossary dt:first-of-type {
  margin-top: 0;
}
dl.glossary dd {
  margin-left: 5ex;
}
dl.description-list dt,
dl.description-list dd {
  margin-top: 1em;
}
dl.description-list dt:first-of-type,
dl.description-list dd:first-of-type {
  margin-top: 0;
}
dl.description-list dt {
  float: left;
  clear: both;
  text-align: right;
  width: 18ex;
  margin-right: 1ex;
}
dl.description-list dd {
  margin-left: 22ex;
}
dl.description-list.narrow dt {
  width: 11ex;
}
dl.description-list.narrow dd {
  margin-left: 15ex;
}
dl.description-list.wide dt {
  width: 25ex;
}
dl.description-list.wide dd {
  margin-left: 29ex;
}
dl.description-list dt:first-of-type {
  clear: none;
}
.description-list + * {
  clear: both;
}
dl.description-list dl dt {
  width: 8ex;
}
dl.description-list dd dd {
  margin-left: 18ex;
}
dl.description-list dl dd {
  margin-left: 12ex;
}
@media screen and (max-width: 480px) {
  dl.description-list dt,
  dl.description-list.narrow dt {
    float: none;
    margin-left: 0;
    text-align: left;
    width: 25ex;
  }
  dl.description-list dd,
  dl.description-list.narrow dd,
  dl.description-list.wide dd {
    margin-top: 0.5em;
    margin-left: 3em;
    max-width: calc(100% - 3em);
  }
}
:is(.cols2, .cols3, .cols4, .cols5, .cols6) {
  display: flex;
  flex-wrap: wrap;
  justify-content: start;
}
.cols2 > li {
  min-width: calc(50% - 2em);
  width: min-content;
  margin-right: 2em;
}
.cols3 > li {
  min-width: calc(33.3333333333% - 2em);
  width: min-content;
  margin-right: 2em;
}
.cols4 > li {
  min-width: calc(25% - 2em);
  width: min-content;
  margin-right: 2em;
}
.cols5 > li {
  min-width: calc(20% - 2em);
  width: min-content;
  margin-right: 2em;
}
.cols6 > li {
  min-width: calc(16.6666666667% - 2em);
  width: min-content;
  margin-right: 2em;
}
.ptx-content li {
  margin-top: 0.5em;
}
.ptx-content li .li--heading-title {
  font-size: 100%;
  font-weight: normal;
  font-style: italic;
}
.para > :is(ol, ul) {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}
ol > li {
  padding-left: 0.25em;
}
.fillin {
  display: inline-block;
  border: none;
  border-width: 1px;
  margin-right: 0.1em;
  margin-left: 0.1em;
  margin-bottom: -0.25em;
}
.fillin.underline {
  border-bottom-style: solid;
  border-width: 1px;
}
.fillin.box {
  outline: 1px solid var(--body-text-color);
  height: 1.3em;
}
.fillin.shade {
  background-color: var(--fillin-background-color, #eee);
  height: 1.3em;
}
:root.dark-mode {
  --fillin-background-color: #444;
}
.heading:is(h1, h2, h3, h4, h5, h6) {
  margin: 0;
  font-size: unset;
}
.heading {
  line-height: 1.1;
  font-family: var(--font-headings);
  font-weight: 700;
  margin-top: 0;
  margin-bottom: 0;
}
section > .heading {
  font-size: 1.75em;
  color: var(--body-title-color);
  line-height: 1.25em;
  margin-top: 2.5em;
  margin-bottom: 0.5em;
}
section > .heading + * {
  margin-top: 0.5em;
}
.ptx-content > section > .heading {
  margin-top: 0.5em;
}
section section > .heading {
  font-size: 1.5em;
  margin-top: 2em;
}
section section section > .heading {
  font-size: 1.4em;
  margin-top: 2em;
}
article > .heading {
  font-size: 1.25em;
  margin-top: 1.5em;
}
article > .heading + * {
  margin-top: 0.5em;
}
.paragraphs > .heading {
  font-size: 1.125em;
}
:is(section, article) > .heading + :is(section, article) > .heading {
  margin-top: 0.5em;
}
@media screen and (max-width: 480px) {
  section > .heading {
    font-size: 1.5em;
    line-height: 1.33em;
    margin-top: 1em;
  }
  section section > .heading {
    font-size: 1.3em;
    line-height: 1.15em;
  }
  section section section > .heading {
    font-size: 1.15em;
    line-height: 1em;
  }
}
.heading.hide-type > .type {
  display: none;
}
a {
  color: var(--link-text-color);
  text-decoration: none;
}
a:hover,
a:focus {
  text-decoration: none;
}
a[href^="mailto:"] {
  white-space: pre;
}
.ptx-content a.internal {
  color: var(--link-text-color);
  font-weight: bold;
}
.ptx-content a.external {
  color: var(--link-alt-text-color);
  font-weight: bold;
}
.ptx-content a.internal:hover,
.ptx-content a.internal:hover *,
.ptx-content a.internal:focus,
.ptx-content a.internal:focus * {
  color: var(--link-active-text-color);
  background-color: var(--link-active-background);
  font-weight: bold;
}
.ptx-content a.external:hover,
.ptx-content a.external:hover *,
.ptx-content a.external:focus,
.ptx-content a.external:focus * {
  color: var(--link-alt-active-text-color);
  background-color: var(--link-alt-active-background);
  font-weight: bold;
}
.ptx-content table {
  border-spacing: 0;
  border-collapse: collapse;
}
.ptx-content td {
  padding: 2px 5px;
  font-size: 90%;
}
.ptx-content td img {
  max-width: 200px;
  margin-right: 30px;
}
.ptx-content th {
  padding: 2px 5px;
}
.ptx-content th .lines {
  white-space: nowrap;
}
.ptx-content th.l {
  text-align: left;
}
.ptx-content th.c {
  text-align: center;
}
.ptx-content th.r {
  text-align: right;
}
.ptx-content th.j {
  text-align: justify;
}
.ptx-content th.t {
  vertical-align: top;
}
.ptx-content th.b {
  vertical-align: bottom;
}
.ptx-content th.m {
  vertical-align: middle;
}
.ptx-content th.l0 {
  border-left: none;
}
.ptx-content th.l1 {
  border-left: 1px solid var(--body-text-color);
}
.ptx-content th.l2 {
  border-left: 2px solid var(--body-text-color);
}
.ptx-content th.l3 {
  border-left: 3px solid var(--body-text-color);
}
.ptx-content th.r0 {
  border-right: none;
}
.ptx-content th.r1 {
  border-right: 1px solid var(--body-text-color);
}
.ptx-content th.r2 {
  border-right: 2px solid var(--body-text-color);
}
.ptx-content th.r3 {
  border-right: 3px solid var(--body-text-color);
}
.ptx-content th.t0 {
  border-top: none;
}
.ptx-content th.t1 {
  border-top: 1px solid var(--body-text-color);
}
.ptx-content th.t2 {
  border-top: 2px solid var(--body-text-color);
}
.ptx-content th.t3 {
  border-top: 3px solid var(--body-text-color);
}
.ptx-content th.b0 {
  border-bottom: none;
}
.ptx-content th.b1 {
  border-bottom: 1px solid var(--body-text-color);
}
.ptx-content th.b2 {
  border-bottom: 2px solid var(--body-text-color);
}
.ptx-content th.b3 {
  border-bottom: 3px solid var(--body-text-color);
}
.ptx-content td .lines {
  white-space: nowrap;
}
.ptx-content td.l {
  text-align: left;
}
.ptx-content td.c {
  text-align: center;
}
.ptx-content td.r {
  text-align: right;
}
.ptx-content td.j {
  text-align: justify;
}
.ptx-content td.t {
  vertical-align: top;
}
.ptx-content td.b {
  vertical-align: bottom;
}
.ptx-content td.m {
  vertical-align: middle;
}
.ptx-content td.l0 {
  border-left: none;
}
.ptx-content td.l1 {
  border-left: 1px solid var(--body-text-color);
}
.ptx-content td.l2 {
  border-left: 2px solid var(--body-text-color);
}
.ptx-content td.l3 {
  border-left: 3px solid var(--body-text-color);
}
.ptx-content td.r0 {
  border-right: none;
}
.ptx-content td.r1 {
  border-right: 1px solid var(--body-text-color);
}
.ptx-content td.r2 {
  border-right: 2px solid var(--body-text-color);
}
.ptx-content td.r3 {
  border-right: 3px solid var(--body-text-color);
}
.ptx-content td.t0 {
  border-top: none;
}
.ptx-content td.t1 {
  border-top: 1px solid var(--body-text-color);
}
.ptx-content td.t2 {
  border-top: 2px solid var(--body-text-color);
}
.ptx-content td.t3 {
  border-top: 3px solid var(--body-text-color);
}
.ptx-content td.b0 {
  border-bottom: none;
}
.ptx-content td.b1 {
  border-bottom: 1px solid var(--body-text-color);
}
.ptx-content td.b2 {
  border-bottom: 2px solid var(--body-text-color);
}
.ptx-content td.b3 {
  border-bottom: 3px solid var(--body-text-color);
}
.ptx-content th.r0.l0,
.ptx-content td.r0.l0 {
  padding-left: 0.8em;
  padding-right: 0.8em;
}
.ptx-content tr.header-vertical th {
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  padding-top: 5px;
}
.ptx-content .center table {
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}
.tabular-box {
  margin-top: 0.5em;
  overflow-x: auto;
}
.tabular-box.natural-width table {
  margin-left: auto;
  margin-right: auto;
}
table.notation-list tr th {
  text-align: left;
  margin-left: 1em;
}
table.notation-list tr td {
  text-align: left;
  vertical-align: top;
}
.frontmatter > .heading {
  display: block;
  text-align: center;
}
.frontmatter > .heading .title,
.frontmatter .book > .heading .title {
  font-size: 1.3em;
}
.frontmatter > .heading .subtitle,
.frontmatter .book > .heading .subtitle {
  display: block;
  font-weight: normal;
  color: var(--byline-color);
  font-size: 0.875em;
  line-height: 1.42857em;
  margin-top: 0.35714em;
}
.frontmatter > .para:first-of-type {
  margin-top: 4em;
}
.frontmatter > .author,
.frontmatter > .credit {
  margin-top: 2em;
  text-align: center;
}
.frontmatter .author:first-of-type {
  margin-top: 4em;
}
.frontmatter > .author .author-name {
  font-size: 120%;
}
.frontmatter .date {
  display: block;
  margin-top: 2em;
  text-align: center;
}
.frontmatter .credit .title {
  font-size: 1em;
}
.frontmatter .credit .author {
  font-size: 0.9em;
  margin-top: 0.75em;
}
.frontmatter .author-info {
  font-size: 90%;
}
.frontmatter .summary-links {
  margin-top: 4em;
}
.frontmatter .abstract {
  margin: 4em 2em;
}
.frontmatter .keywords,
.frontmatter .support {
  margin-top: 2em;
}
.frontmatter .abstract > .title,
.fron
Download .txt
gitextract_8b_dyh9h/

├── .git-blame-ignore-revs
├── .gitignore
├── CONTRIBUTING.md
├── COPYING
├── README.md
├── contrib/
│   ├── hitchman/
│   │   ├── README.md
│   │   ├── tjh-law-html.xsl
│   │   └── tjh-law-print.xsl
│   └── ups-writers/
│       ├── README.md
│       ├── ups-writers-html.xsl
│       └── ups-writers-latex.xsl
├── css/
│   ├── README.md
│   ├── colors/
│   │   ├── _color-helpers.scss
│   │   ├── _color-vars.scss
│   │   ├── _palette-dark.scss
│   │   ├── _palette-dual.scss
│   │   ├── _palette-quad-chunks.scss
│   │   ├── _palette-single-bold.scss
│   │   ├── _palette-single-muted.scss
│   │   └── _palette-single.scss
│   ├── components/
│   │   ├── README.md
│   │   ├── _google-search.scss
│   │   ├── _mystery.scss
│   │   ├── _pretext-search.scss
│   │   ├── _pretext-web.scss
│   │   ├── _pretext.scss
│   │   ├── _printing.scss
│   │   ├── _spacing.scss
│   │   ├── _worksheet.scss
│   │   ├── chunks/
│   │   │   ├── README.md
│   │   │   ├── _asides-basic.scss
│   │   │   ├── _asides-floating.scss
│   │   │   ├── _codelike.scss
│   │   │   ├── _discussion-inline.scss
│   │   │   ├── _exercises.scss
│   │   │   ├── _knowls.scss
│   │   │   ├── _sidebyside.scss
│   │   │   ├── _solutions.scss
│   │   │   └── helpers/
│   │   │       ├── README.md
│   │   │       ├── _C-box-mixin.scss
│   │   │       ├── _L-mixin.scss
│   │   │       ├── _box-mixin.scss
│   │   │       ├── _heading-box-mixin.scss
│   │   │       ├── _horizontal-bars-mixin.scss
│   │   │       ├── _inline-heading-mixin.scss
│   │   │       └── _sidebar-mixin.scss
│   │   ├── elements/
│   │   │   ├── README.md
│   │   │   ├── _description-lists.scss
│   │   │   ├── _figures.scss
│   │   │   ├── _fillin.scss
│   │   │   ├── _footnotes.scss
│   │   │   ├── _front-matter.scss
│   │   │   ├── _headings.scss
│   │   │   ├── _index.scss
│   │   │   ├── _links.scss
│   │   │   ├── _list-styles.scss
│   │   │   ├── _lists.scss
│   │   │   ├── _math.scss
│   │   │   ├── _media.scss
│   │   │   ├── _misc-content.scss
│   │   │   ├── _permalinks.scss
│   │   │   ├── _poem.scss
│   │   │   ├── _prism.scss
│   │   │   ├── _summary-links.scss
│   │   │   ├── _tables.scss
│   │   │   └── extras/
│   │   │       └── _heading-underlines.scss
│   │   ├── helpers/
│   │   │   ├── README.md
│   │   │   ├── _buttons-default.scss
│   │   │   ├── _cols.scss
│   │   │   └── _expandable.scss
│   │   ├── interactives/
│   │   │   ├── README.md
│   │   │   ├── _calculators.scss
│   │   │   ├── _other.scss
│   │   │   ├── _runestone.scss
│   │   │   ├── _sagecell.scss
│   │   │   └── _webwork.scss
│   │   └── page-parts/
│   │       ├── README.md
│   │       ├── _banner.scss
│   │       ├── _body.scss
│   │       ├── _footer.scss
│   │       ├── _navbar.scss
│   │       ├── _toc-basics.scss
│   │       ├── _toc-default.scss
│   │       ├── _toc-overlay.scss
│   │       └── extras/
│   │           ├── README.md
│   │           ├── _navbar-btn-borders.scss
│   │           ├── _toc-borders.scss
│   │           ├── _toc-expand-chevrons.scss
│   │           ├── _toc-hidden-scrollbar.scss
│   │           └── _toc-last-level-plain.scss
│   ├── dist/
│   │   ├── epub.css
│   │   ├── kindle.css
│   │   ├── pretext-reveal.css
│   │   ├── print-worksheet.css
│   │   ├── theme-boulder.css
│   │   ├── theme-crc-legacy.css
│   │   ├── theme-default-legacy.css
│   │   ├── theme-default-modern.css
│   │   ├── theme-denver.css
│   │   ├── theme-greeley.css
│   │   ├── theme-min-legacy.css
│   │   ├── theme-oscarlevin-legacy.css
│   │   ├── theme-salem.css
│   │   ├── theme-soundwriting-legacy.css
│   │   ├── theme-tacoma.css
│   │   └── theme-wide-legacy.css
│   ├── fonts/
│   │   └── _fonts-google.scss
│   ├── legacy/
│   │   ├── colors/
│   │   │   ├── all_colors.scss
│   │   │   ├── colors_blue_green.css
│   │   │   ├── colors_blue_grey.css
│   │   │   ├── colors_blue_red.css
│   │   │   ├── colors_blue_red_dark.css
│   │   │   ├── colors_bluegreen_grey.css
│   │   │   ├── colors_brown_gold.css
│   │   │   ├── colors_darkmartiansands.css
│   │   │   ├── colors_default.css
│   │   │   ├── colors_focused_gray_aqua.css
│   │   │   ├── colors_focused_light.css
│   │   │   ├── colors_green_blue.css
│   │   │   ├── colors_green_plum.css
│   │   │   ├── colors_maroon_grey.css
│   │   │   ├── colors_martiansands.css
│   │   │   ├── colors_orange_navy.css
│   │   │   ├── colors_pastel_blue_orange.css
│   │   │   ├── colors_red_blue.css
│   │   │   ├── colors_ruby_amethyst.css
│   │   │   ├── colors_ruby_emerald.css
│   │   │   ├── colors_ruby_turquoise.css
│   │   │   └── setcolors.css
│   │   ├── pretext.css
│   │   ├── pretext_add_on.css
│   │   └── pretext_search.css
│   ├── other/
│   │   └── catalog.css
│   └── targets/
│       ├── ebook/
│       │   ├── ebook-common.scss
│       │   ├── epub/
│       │   │   └── epub.scss
│       │   └── kindle/
│       │       └── kindle.scss
│       ├── html/
│       │   ├── README.md
│       │   ├── boulder/
│       │   │   ├── _customization.scss
│       │   │   └── theme-boulder.scss
│       │   ├── default-modern/
│       │   │   ├── _chunks-default.scss
│       │   │   ├── _customization.scss
│       │   │   ├── _parts-default.scss
│       │   │   └── theme-default-modern.scss
│       │   ├── denver/
│       │   │   ├── _chunks-denver.scss
│       │   │   ├── _customizations.scss
│       │   │   ├── _parts-paper.scss
│       │   │   └── theme-denver.scss
│       │   ├── greeley/
│       │   │   ├── _chunks-greeley.scss
│       │   │   ├── _customization.scss
│       │   │   └── theme-greeley.scss
│       │   ├── legacy/
│       │   │   ├── crc/
│       │   │   │   ├── banner_crc.css
│       │   │   │   ├── navbar_crc.css
│       │   │   │   ├── shell_crc.css
│       │   │   │   ├── theme-crc.scss
│       │   │   │   └── toc_crc.css
│       │   │   ├── default/
│       │   │   │   ├── banner_default.css
│       │   │   │   ├── knowls_default.css
│       │   │   │   ├── navbar_default.css
│       │   │   │   ├── shell_default.css
│       │   │   │   ├── style_default.css
│       │   │   │   ├── theme-default.scss
│       │   │   │   └── toc_default.css
│       │   │   ├── min/
│       │   │   │   ├── shell_min.css
│       │   │   │   ├── theme-min.scss
│       │   │   │   └── toc_min.css
│       │   │   ├── oscarlevin/
│       │   │   │   ├── style_oscarlevin.css
│       │   │   │   └── theme-oscarlevin.scss
│       │   │   ├── soundwriting/
│       │   │   │   ├── style_soundwriting.css
│       │   │   │   └── theme-soundwriting.scss
│       │   │   └── wide/
│       │   │       ├── banner_wide.scss
│       │   │       ├── navbar_wide.scss
│       │   │       ├── shell_wide.scss
│       │   │       ├── style_wide.scss
│       │   │       ├── theme-wide.scss
│       │   │       └── toc_wide.scss
│       │   ├── salem/
│       │   │   ├── _chunks-salem.scss
│       │   │   ├── _heading-tweaks.scss
│       │   │   ├── _other-widen.scss
│       │   │   ├── _parts-salem.scss
│       │   │   ├── _rs-widen.scss
│       │   │   ├── _sizing-globals.scss
│       │   │   └── theme-salem.scss
│       │   └── tacoma/
│       │       ├── _chunks-minimal.scss
│       │       ├── _customization.scss
│       │       ├── _parts-tacoma.scss
│       │       └── theme-tacoma.scss
│       ├── print-worksheet/
│       │   ├── _chunks-worksheet.scss
│       │   └── print-worksheet.scss
│       └── revealjs/
│           └── reveal.scss
├── doc/
│   ├── guide/
│   │   ├── COPYING
│   │   ├── README.md
│   │   ├── appendices/
│   │   │   ├── cli-transition.xml
│   │   │   ├── cli-v1vsv2.xml
│   │   │   ├── editors.xml
│   │   │   ├── gfdl-pretext.xml
│   │   │   ├── git.xml
│   │   │   ├── glossary.xml
│   │   │   ├── journals-table.xml
│   │   │   ├── journals.xml
│   │   │   ├── latex-conversion.xml
│   │   │   ├── liblouis.xml
│   │   │   ├── mac-os.xml
│   │   │   ├── node-npm.xml
│   │   │   ├── offline-mathjax.xml
│   │   │   ├── python.xml
│   │   │   ├── references.xml
│   │   │   ├── schema-install.xml
│   │   │   ├── welcome.xml
│   │   │   ├── windows-cli.xml
│   │   │   ├── windows-wsl.xml
│   │   │   └── windows.xml
│   │   ├── author/
│   │   │   ├── advice.xml
│   │   │   ├── author-faq.xml
│   │   │   ├── overview.xml
│   │   │   ├── processing.xml
│   │   │   ├── schema.xml
│   │   │   ├── topics.xml
│   │   │   └── webwork.xml
│   │   ├── backmatter.xml
│   │   ├── basics/
│   │   │   ├── README.md
│   │   │   ├── aside.ptx
│   │   │   ├── axiom.ptx
│   │   │   ├── basics-part.xml
│   │   │   ├── blockquote.ptx
│   │   │   ├── definition.ptx
│   │   │   ├── example-simple.ptx
│   │   │   ├── example-structured.ptx
│   │   │   ├── exercise-task.ptx
│   │   │   ├── exercise.ptx
│   │   │   ├── exercisegroup.ptx
│   │   │   ├── figure.ptx
│   │   │   ├── image.ptx
│   │   │   ├── md-bare.ptx
│   │   │   ├── md.ptx
│   │   │   ├── ol.ptx
│   │   │   ├── p.ptx
│   │   │   ├── porism.ptx
│   │   │   ├── project.ptx
│   │   │   ├── reading-questions.ptx
│   │   │   ├── remark.ptx
│   │   │   ├── sage.ptx
│   │   │   ├── sageplot.ptx
│   │   │   ├── sbsgroup.ptx
│   │   │   ├── section-sub.ptx
│   │   │   ├── section.ptx
│   │   │   ├── sidebyside.ptx
│   │   │   ├── sidebyside2.ptx
│   │   │   ├── table.ptx
│   │   │   ├── theorem.ptx
│   │   │   ├── tikz.ptx
│   │   │   ├── ul.ptx
│   │   │   └── worksheet.ptx
│   │   ├── developer/
│   │   │   ├── code-style.xml
│   │   │   ├── coding.xml
│   │   │   ├── debugging.xml
│   │   │   ├── git.xml
│   │   │   ├── localization.xml
│   │   │   ├── pretext-script.xml
│   │   │   └── xsltproc.xml
│   │   ├── frontmatter.xml
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   ├── gaussian-histogram.html
│   │   │   │   └── vimodes.html
│   │   │   └── qrcode/
│   │   │       ├── joren-falls-video-url.xml
│   │   │       ├── mozart-piano-sonata-url.xml
│   │   │       ├── topic-youtube-video-8-2-url.xml
│   │   │       ├── tutorial-videos-video-url.xml
│   │   │       ├── video-hotel-california-url.xml
│   │   │       └── windows-cli-3-3-url.xml
│   │   ├── guide.xml
│   │   ├── guideinfo.xml
│   │   ├── introduction/
│   │   │   ├── start-here.xml
│   │   │   └── tutorial.xml
│   │   ├── preface.xml
│   │   ├── project.ptx
│   │   ├── publication-styled.xml
│   │   ├── publication.xml
│   │   └── publisher/
│   │       ├── ancillaries.xml
│   │       ├── braille.xml
│   │       ├── conversions.xml
│   │       ├── cover-design.xml
│   │       ├── custom-versions.xml
│   │       ├── epub.xml
│   │       ├── further-customizations.xml
│   │       ├── instructor-version.xml
│   │       ├── jupyter-notebook.xml
│   │       ├── latex-fonts.xml
│   │       ├── latex-styling.xml
│   │       ├── online-html.xml
│   │       ├── open-licenses.xml
│   │       ├── pdf-print.xml
│   │       ├── print-on-demand.xml
│   │       ├── production.xml
│   │       ├── publication-file.xml
│   │       ├── publisher-faq.xml
│   │       ├── runestone.xml
│   │       ├── slides.xml
│   │       ├── web-hosting.xml
│   │       └── webwork.xml
│   └── quickref/
│       ├── README.md
│       ├── quickref-cli.tex
│       └── quickref-pretext.tex
├── examples/
│   ├── README.md
│   ├── braille/
│   │   ├── braille-test-book.xml
│   │   ├── braille-test.xml
│   │   └── publication.xml
│   ├── custom-theming/
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── css/
│   │   │       ├── more-styles.css
│   │   │       ├── my-styles.css
│   │   │       └── salem-color-vars.css
│   │   ├── mytheme/
│   │   │   ├── _chunks-customized.scss
│   │   │   └── mytheme.scss
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   ├── publication-custom-colors.ptx
│   │   │   ├── publication-custom-theme.ptx
│   │   │   ├── publication-salem.ptx
│   │   │   └── publication.ptx
│   │   └── source/
│   │       ├── ch-chapter-title.ptx
│   │       ├── docinfo.ptx
│   │       ├── frontmatter.ptx
│   │       ├── main.ptx
│   │       └── sec-section-name.ptx
│   ├── epub/
│   │   ├── README.md
│   │   ├── epub-sampler.xml
│   │   ├── gen/
│   │   │   └── prefigure/
│   │   │       └── prefigure-tangent-annotations.xml
│   │   └── publication.xml
│   ├── errors/
│   │   └── sample-errors-and-warnings.xml
│   ├── fonts/
│   │   ├── README.md
│   │   └── fonts-and-characters.xml
│   ├── hello-world/
│   │   ├── README.md
│   │   ├── hello-world.xml
│   │   └── publication.xml
│   ├── humanities/
│   │   ├── README.md
│   │   ├── codechat_config.yaml
│   │   ├── generated-assets/
│   │   │   └── .gitkeep
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   └── publication.ptx
│   │   ├── requirements.txt
│   │   └── source/
│   │       ├── hia.xml
│   │       ├── music.xml
│   │       └── poetry.xml
│   ├── letter/
│   │   ├── README.md
│   │   └── sample-letter.xml
│   ├── memo/
│   │   ├── README.md
│   │   └── sample-memo.xml
│   ├── minimal/
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── .keep
│   │   ├── codechat_config.yaml
│   │   ├── generated-assets/
│   │   │   └── .keep
│   │   ├── project.ptx
│   │   ├── publication/
│   │   │   └── publication.ptx
│   │   ├── requirements.txt
│   │   └── source/
│   │       └── main.ptx
│   ├── pug/
│   │   ├── .gitignore
│   │   ├── authors-guide/
│   │   │   └── windows.pug
│   │   ├── build.sh
│   │   ├── package.json
│   │   ├── pug-include.pug
│   │   └── pug.pug
│   ├── sample-article/
│   │   ├── bibliography.xml
│   │   ├── customizations-one.xml
│   │   ├── customizations-two.xml
│   │   ├── gen/
│   │   │   ├── asymptote/
│   │   │   │   ├── asymptote-contour-sbs.html
│   │   │   │   ├── asymptote-contour.html
│   │   │   │   ├── asymptote-lever-integral.html
│   │   │   │   ├── asymptote-lever-sbs.html
│   │   │   │   ├── asymptote-lever-solo.html
│   │   │   │   ├── asymptote-lever.html
│   │   │   │   ├── asymptote-surface.html
│   │   │   │   └── asymptote-workcone.html
│   │   │   ├── dynamic_subs/
│   │   │   │   └── dynamic_substitutions.xml
│   │   │   ├── prefigure/
│   │   │   │   ├── prefigure-fibonacci-a-annotations.xml
│   │   │   │   ├── prefigure-fibonacci-b-annotations.xml
│   │   │   │   ├── prefigure-tangent-annotations.xml
│   │   │   │   └── prefigure-worksheet-vectors-annotations.xml
│   │   │   ├── problems/
│   │   │   │   ├── mom-2168.xml
│   │   │   │   ├── mom-2572.xml
│   │   │   │   ├── mom-7492.xml
│   │   │   │   └── mom-930582.xml
│   │   │   ├── qrcode/
│   │   │   │   ├── airborne-midnight-1-url.xml
│   │   │   │   ├── audio-bach-url.xml
│   │   │   │   ├── audio-organ-finale-url.xml
│   │   │   │   ├── audio-piano-trill-two-url.xml
│   │   │   │   ├── audio-piano-trill-url.xml
│   │   │   │   ├── bareilles-love-song-url.xml
│   │   │   │   ├── big-buck-bunny-best-format-url.xml
│   │   │   │   ├── big-buck-bunny-frame-one-url.xml
│   │   │   │   ├── big-buck-bunny-margins-url.xml
│   │   │   │   ├── big-buck-bunny-mp4-url.xml
│   │   │   │   ├── big-buck-bunny-ogg-url.xml
│   │   │   │   ├── big-buck-bunny-subtitles-url.xml
│   │   │   │   ├── big-buck-bunny-two-subtitles-url.xml
│   │   │   │   ├── big-buck-bunny-webm-url.xml
│   │   │   │   ├── calcplot3d-full-application-url.xml
│   │   │   │   ├── calcplot3d-intersection-planes-url.xml
│   │   │   │   ├── calcplot3d-probability-wavefunction-url.xml
│   │   │   │   ├── desmos-natural-log-url.xml
│   │   │   │   ├── drone-flight-clip-url.xml
│   │   │   │   ├── drone-flight-full-url.xml
│   │   │   │   ├── drone-flight-sbs-url.xml
│   │   │   │   ├── geogebra-SAS-url.xml
│   │   │   │   ├── geogebra-astroid-original-url.xml
│   │   │   │   ├── geogebra-astroid-url.xml
│   │   │   │   ├── geogebra-cycloid-url.xml
│   │   │   │   ├── geogebra-right-triangle-url.xml
│   │   │   │   ├── geogebra-seed-head-url.xml
│   │   │   │   ├── geogebra-train-distance-url.xml
│   │   │   │   ├── ggb_3d-direction-vector_interactive-url.xml
│   │   │   │   ├── interactive-animation-url.xml
│   │   │   │   ├── interactive-archimedian-spiral-url.xml
│   │   │   │   ├── interactive-bspline-url.xml
│   │   │   │   ├── interactive-circuitjs-attribute-url.xml
│   │   │   │   ├── interactive-circuitjs-url.xml
│   │   │   │   ├── interactive-d3-collision-url.xml
│   │   │   │   ├── interactive-d3-graph-layout-url.xml
│   │   │   │   ├── interactive-d3-welsh-url.xml
│   │   │   │   ├── interactive-doenetml-example-url.xml
│   │   │   │   ├── interactive-eigenvectors-url.xml
│   │   │   │   ├── interactive-fermats-spiral-url.xml
│   │   │   │   ├── interactive-infinity-url.xml
│   │   │   │   ├── interactive-layout-circuitjs-big-url.xml
│   │   │   │   ├── interactive-layout-circuitjs-small-url.xml
│   │   │   │   ├── interactive-layout-desmos-url.xml
│   │   │   │   ├── interactive-layout-grow-one-url.xml
│   │   │   │   ├── interactive-layout-grow-three-url.xml
│   │   │   │   ├── interactive-layout-grow-two-url.xml
│   │   │   │   ├── interactive-layout-map-medium-url.xml
│   │   │   │   ├── interactive-layout-map-tall-url.xml
│   │   │   │   ├── interactive-layout-map-wide-url.xml
│   │   │   │   ├── interactive-map-california-url.xml
│   │   │   │   ├── interactive-numerical-integral-url.xml
│   │   │   │   ├── interactive-oscillating-secant-url.xml
│   │   │   │   ├── interactive-phet-fourier-url.xml
│   │   │   │   ├── interactive-piecewise-url.xml
│   │   │   │   ├── interactive-quadratic-tangent-url.xml
│   │   │   │   ├── interactive-sage-jupyter-iframe-url.xml
│   │   │   │   ├── interactive-simple-eigenvector-url.xml
│   │   │   │   ├── interactive-simple-js-script-url.xml
│   │   │   │   ├── interactive-slopes-url.xml
│   │   │   │   ├── interactive-threejs-catenoid-surface-url.xml
│   │   │   │   ├── interactive-threejs-saddle-url.xml
│   │   │   │   ├── js-module-test-url.xml
│   │   │   │   ├── kinematics-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-generic-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-solo-url.xml
│   │   │   │   ├── led-zeppelin-kashmir-url.xml
│   │   │   │   ├── minelli-newyork-newyork-url.xml
│   │   │   │   ├── pre-roll-countdown-1-url.xml
│   │   │   │   ├── pre-roll-countdown-10-url.xml
│   │   │   │   ├── pre-roll-countdown-11-url.xml
│   │   │   │   ├── pre-roll-countdown-12-url.xml
│   │   │   │   ├── pre-roll-countdown-13-url.xml
│   │   │   │   ├── pre-roll-countdown-14-url.xml
│   │   │   │   ├── pre-roll-countdown-2-url.xml
│   │   │   │   ├── pre-roll-countdown-3-url.xml
│   │   │   │   ├── pre-roll-countdown-4-url.xml
│   │   │   │   ├── pre-roll-countdown-5-url.xml
│   │   │   │   ├── pre-roll-countdown-6-url.xml
│   │   │   │   ├── pre-roll-countdown-7-url.xml
│   │   │   │   ├── pre-roll-countdown-8-url.xml
│   │   │   │   ├── pre-roll-countdown-9-url.xml
│   │   │   │   ├── section-video-5-5-2-url.xml
│   │   │   │   ├── ups-promo-1-url.xml
│   │   │   │   ├── ups-promo-10-url.xml
│   │   │   │   ├── ups-promo-11-url.xml
│   │   │   │   ├── ups-promo-12-url.xml
│   │   │   │   ├── ups-promo-13-url.xml
│   │   │   │   ├── ups-promo-14-url.xml
│   │   │   │   ├── ups-promo-2-url.xml
│   │   │   │   ├── ups-promo-3-url.xml
│   │   │   │   ├── ups-promo-4-url.xml
│   │   │   │   ├── ups-promo-5-url.xml
│   │   │   │   ├── ups-promo-6-url.xml
│   │   │   │   ├── ups-promo-7-url.xml
│   │   │   │   ├── ups-promo-8-url.xml
│   │   │   │   ├── ups-promo-9-url.xml
│   │   │   │   ├── ups-promo-frame-one-url.xml
│   │   │   │   ├── ups-promo-generic-url.xml
│   │   │   │   ├── ups-promo-preview-url.xml
│   │   │   │   ├── ups-promo-sbs-url.xml
│   │   │   │   ├── ups-promo-side-by-side-url.xml
│   │   │   │   ├── vimeo-move-url.xml
│   │   │   │   ├── yt-list-vars-url.xml
│   │   │   │   ├── zeppelin-playlist-named-url.xml
│   │   │   │   └── zeppelin-playlist-url.xml
│   │   │   ├── sageplot/
│   │   │   │   └── sageplot-implicit-surface.html
│   │   │   ├── stack/
│   │   │   │   ├── stack-integration.ptx
│   │   │   │   ├── stack-matrix.ptx
│   │   │   │   ├── stack-mcq.ptx
│   │   │   │   ├── stack-plot.ptx
│   │   │   │   └── stack-typesetting.ptx
│   │   │   └── trace/
│   │   │       └── python-hello-world-code-lens.js
│   │   ├── media/
│   │   │   ├── code/
│   │   │   │   ├── asymptote/
│   │   │   │   │   └── bezier-patch.js
│   │   │   │   ├── austin/
│   │   │   │   │   ├── animation.js
│   │   │   │   │   ├── eigenvectors.js
│   │   │   │   │   ├── figures.js
│   │   │   │   │   └── simple-ev.js
│   │   │   │   ├── d3/
│   │   │   │   │   ├── collision.js
│   │   │   │   │   ├── graph-layout.js
│   │   │   │   │   ├── mention_network.json
│   │   │   │   │   ├── welsh.css
│   │   │   │   │   └── welsh.js
│   │   │   │   ├── dray/
│   │   │   │   │   └── SAS.ggb
│   │   │   │   ├── haynes/
│   │   │   │   │   ├── 3d-direction-vector.ggb
│   │   │   │   │   └── 3d-direction-vector.js
│   │   │   │   ├── jsxgraph/
│   │   │   │   │   ├── archimedian.js
│   │   │   │   │   ├── bspline.js
│   │   │   │   │   ├── cts-not-diff-oscillate.jc
│   │   │   │   │   ├── fermats-spiral.js
│   │   │   │   │   ├── infinity.js
│   │   │   │   │   └── piecewise.js
│   │   │   │   ├── mcclure/
│   │   │   │   │   ├── slope.css
│   │   │   │   │   └── slope.js
│   │   │   │   ├── roesler/
│   │   │   │   │   └── kinematics.js
│   │   │   │   ├── rosoff/
│   │   │   │   │   ├── astroid.ggb
│   │   │   │   │   └── epi-hypocycloids-default.ggb
│   │   │   │   ├── splice/
│   │   │   │   │   └── splice-resize.js
│   │   │   │   └── threejs/
│   │   │   │       ├── catenoid.js
│   │   │   │       ├── saddle.js
│   │   │   │       └── splines.js
│   │   │   ├── favicon/
│   │   │   │   └── README.md
│   │   │   ├── iframe/
│   │   │   │   └── sage-jupyter.html
│   │   │   ├── images/
│   │   │   │   └── complete-graph.tex
│   │   │   ├── pytutor/
│   │   │   │   └── happy.json
│   │   │   ├── stack/
│   │   │   │   ├── 01_integration_with_feedback.xml
│   │   │   │   ├── Adding-vectors-in-triangles.xml
│   │   │   │   ├── Checkbox.xml
│   │   │   │   ├── Matrix.xml
│   │   │   │   └── basic-plot.xml
│   │   │   └── video/
│   │   │       ├── BigBuckBunnyAcapella.vtt
│   │   │       └── ups-visitor-guide-360.webm
│   │   ├── numerical/
│   │   │   └── spreadsheet/
│   │   │       └── runningstatisticstemplate.ots
│   │   ├── privatesolutions.xml
│   │   ├── project.ptx
│   │   ├── publication-crc.xml
│   │   ├── publication-oscarlevin.xml
│   │   ├── publication-print.xml
│   │   ├── publication-solution-manual.xml
│   │   ├── publication.xml
│   │   └── sample-article.xml
│   ├── sample-book/
│   │   ├── README.md
│   │   ├── appendix-two.xml
│   │   ├── backmatter.xml
│   │   ├── bookinfo.xml
│   │   ├── code/
│   │   │   └── symmetric-group-8.sage
│   │   ├── codechat_config.yaml
│   │   ├── cyclic.xml
│   │   ├── exercises/
│   │   │   ├── cyclic.xml
│   │   │   ├── groups.xml
│   │   │   ├── integers.xml
│   │   │   └── sets.xml
│   │   ├── ext/
│   │   │   ├── datafiles/
│   │   │   │   └── stackoverflow.csv
│   │   │   └── splice/
│   │   │       └── splice-resize.js
│   │   ├── frontmatter.xml
│   │   ├── gen/
│   │   │   ├── datafile/
│   │   │   │   ├── beach-datafile.xml
│   │   │   │   ├── file-picture-classes-jar.xml
│   │   │   │   ├── flower1-datafile.xml
│   │   │   │   ├── flower2-datafile.xml
│   │   │   │   ├── golden-gate.xml
│   │   │   │   ├── golden-gate2.xml
│   │   │   │   ├── luther-bell.xml
│   │   │   │   └── stack-overflow-survey.xml
│   │   │   ├── dynamic_subs/
│   │   │   │   └── dynamic_substitutions.xml
│   │   │   ├── qrcode/
│   │   │   │   ├── OpenDSA-integration-bs-url.xml
│   │   │   │   ├── OpenDSA-integration-dijkstra-url.xml
│   │   │   │   ├── OpenDSA-list-insertion-exercise-url.xml
│   │   │   │   ├── OpenDSA-list-insertion-url.xml
│   │   │   │   ├── doenet-velocity-url.xml
│   │   │   │   ├── interactive-doenetml-example-url.xml
│   │   │   │   ├── interactive-horstmann-codecheck-url.xml
│   │   │   │   ├── opendsa-slideshow-pop-url.xml
│   │   │   │   ├── show-eval-visualization-url.xml
│   │   │   │   ├── splice-resize-example-url.xml
│   │   │   │   ├── youtube-list-vars-eight-url.xml
│   │   │   │   ├── youtube-list-vars-eleven-url.xml
│   │   │   │   ├── youtube-list-vars-five-url.xml
│   │   │   │   ├── youtube-list-vars-four-url.xml
│   │   │   │   ├── youtube-list-vars-nine-url.xml
│   │   │   │   ├── youtube-list-vars-one-url.xml
│   │   │   │   ├── youtube-list-vars-seven-url.xml
│   │   │   │   ├── youtube-list-vars-six-url.xml
│   │   │   │   ├── youtube-list-vars-ten-url.xml
│   │   │   │   ├── youtube-list-vars-three-url.xml
│   │   │   │   ├── youtube-list-vars-two-url.xml
│   │   │   │   └── youtube-list-vars-url.xml
│   │   │   └── trace/
│   │   │       ├── c-hello-world-code-lens.js
│   │   │       ├── exploration-with-always-static-program.js
│   │   │       ├── java-hello-world-code-lens.js
│   │   │       ├── program-codelens-cpp-questions.js
│   │   │       ├── python-code-lens-questions.js
│   │   │       ├── python-hello-world-code-lens.js
│   │   │       ├── sieve-codelens-cpp.js
│   │   │       ├── sieve-codelens-java.js
│   │   │       └── sieve-codelens-python.js
│   │   ├── gfdl-mathbook.xml
│   │   ├── groups.xml
│   │   ├── integers.xml
│   │   ├── project.ptx
│   │   ├── publication-decorative.xml
│   │   ├── publication-noparts.xml
│   │   ├── publication-runestone-academy.xml
│   │   ├── publication-solution-manual.xml
│   │   ├── publication-structural.xml
│   │   ├── rune-examples/
│   │   │   ├── activecode-ambles.xml
│   │   │   ├── activecode-unittest.xml
│   │   │   └── static-listing-java.xml
│   │   ├── rune.xml
│   │   ├── sage/
│   │   │   ├── cyclic-info.xml
│   │   │   ├── cyclic-sage-exercises.xml
│   │   │   ├── groups-info.xml
│   │   │   ├── groups-sage-exercises.xml
│   │   │   ├── groups-sage.xml
│   │   │   ├── integers-info.xml
│   │   │   ├── integers-sage-exercises.xml
│   │   │   ├── integers-sage.xml
│   │   │   ├── sets-info.xml
│   │   │   ├── sets-sage-exercises.xml
│   │   │   └── sets-sage.xml
│   │   ├── sample-book-parts.xml
│   │   ├── sample-book-solutions-manual.xml
│   │   ├── sample-book-solutions-manual.xsl
│   │   ├── sample-book.xml
│   │   ├── sets.xml
│   │   └── tikz/
│   │       └── cyclic-roots-unity.tex
│   ├── sample-slideshow/
│   │   ├── external/
│   │   │   └── custom.css
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   └── img-asymptote.html
│   │   │   └── prefigure/
│   │   │       └── annotated-prefigure-network-annotations.xml
│   │   ├── publication.xml
│   │   └── sample-slideshow.xml
│   ├── showcase/
│   │   ├── README.md
│   │   ├── generated/
│   │   │   ├── asymptote/
│   │   │   │   ├── AreaUnderCurve.asy
│   │   │   │   ├── AreaUnderCurve.eps
│   │   │   │   ├── AreaUnderCurve.html
│   │   │   │   ├── Deathstar.asy
│   │   │   │   ├── Deathstar.eps
│   │   │   │   ├── Deathstar.html
│   │   │   │   ├── FiveVenn.asy
│   │   │   │   ├── FiveVenn.eps
│   │   │   │   ├── FiveVenn.html
│   │   │   │   ├── cflag.asy
│   │   │   │   ├── cflag.eps
│   │   │   │   ├── cflag.html
│   │   │   │   ├── eflag.asy
│   │   │   │   ├── eflag.eps
│   │   │   │   ├── eflag.html
│   │   │   │   ├── image-rotational-solid.eps
│   │   │   │   ├── image-washer.eps
│   │   │   │   ├── usflag.asy
│   │   │   │   ├── usflag.eps
│   │   │   │   └── usflag.html
│   │   │   ├── latex-image/
│   │   │   │   ├── image-building-parabola.eps
│   │   │   │   ├── image-building-parabola.tex
│   │   │   │   ├── image-gaussian-sum-proof.eps
│   │   │   │   ├── image-gaussian-sum-proof.tex
│   │   │   │   ├── image-implicitly-defined-curve.eps
│   │   │   │   ├── image-implicitly-defined-curve.tex
│   │   │   │   ├── image-parametrized-surface.eps
│   │   │   │   ├── image-parametrized-surface.tex
│   │   │   │   ├── worksheet-midpoints-of-quadrilateral.eps
│   │   │   │   ├── worksheet-midpoints-of-quadrilateral.tex
│   │   │   │   ├── worksheet-triangle-cyclic-medians-copy.eps
│   │   │   │   ├── worksheet-triangle-cyclic-medians-copy.tex
│   │   │   │   ├── worksheet-triangle-cyclic-medians.eps
│   │   │   │   ├── worksheet-triangle-cyclic-medians.tex
│   │   │   │   ├── worksheet-triangle-cyclic-vectors.eps
│   │   │   │   └── worksheet-triangle-cyclic-vectors.tex
│   │   │   └── webwork/
│   │   │       ├── answer-type-variety.xml
│   │   │       ├── images/
│   │   │       │   └── string-answers-image-1.tex
│   │   │       ├── open-problem-library.xml
│   │   │       ├── pg/
│   │   │       │   └── PreTeXt_Showcase/
│   │   │       │       ├── 6_1-Answer_Type_Variety.pg
│   │   │       │       ├── 6_2-Special_Feedback.pg
│   │   │       │       ├── 6_3-String_Answers.pg
│   │   │       │       ├── 6_5-Structured_with_Tasks.pg
│   │   │       │       ├── 6_6-Units_in_Answers.pg
│   │   │       │       ├── def/
│   │   │       │       │   └── setPreTeXt_Showcase.def
│   │   │       │       ├── header/
│   │   │       │       │   └── PreTeXt_Showcase.pg
│   │   │       │       └── macros/
│   │   │       │           └── PTXSC.pl
│   │   │       ├── special-feedback.xml
│   │   │       ├── string-answers.xml
│   │   │       ├── structured-with-tasks.xml
│   │   │       └── units-in-answers.xml
│   │   ├── project.ptx
│   │   ├── publisher/
│   │   │   └── publication.xml
│   │   └── source/
│   │       ├── environments.ptx
│   │       ├── exercises.ptx
│   │       ├── latex-image.ptx
│   │       ├── mathematics.ptx
│   │       ├── pretext-showcase.ptx
│   │       ├── webwork.ptx
│   │       └── worksheets.ptx
│   ├── stack/
│   │   ├── README.md
│   │   └── minimal/
│   │       ├── assets/
│   │       │   └── stack/
│   │       │       └── 01_integration_with_feedback.xml
│   │       ├── project.ptx
│   │       ├── publication/
│   │       │   └── publication.ptx
│   │       └── source/
│   │           └── main.ptx
│   ├── webwork/
│   │   ├── Makefile
│   │   ├── Makefile.paths.example
│   │   ├── Makefile.paths.original
│   │   ├── README.md
│   │   ├── minimal/
│   │   │   ├── generated/
│   │   │   │   └── webwork/
│   │   │   │       ├── add-integers.xml
│   │   │   │       ├── cylinder-volume.xml
│   │   │   │       ├── pg/
│   │   │   │       │   └── WeBWorK_Minimal_Example/
│   │   │   │       │       ├── 1-WeBWorK_Minimal_Section/
│   │   │   │       │       │   ├── 1_1.pg
│   │   │   │       │       │   └── 1_3.pg
│   │   │   │       │       ├── def/
│   │   │   │       │       │   └── set1-WeBWorK_Minimal_Section.def
│   │   │   │       │       ├── header/
│   │   │   │       │       │   └── 1-WeBWorK_Minimal_Section.pg
│   │   │   │       │       └── macros/
│   │   │   │       │           └── WeBWorK_Minimal_Example.pl
│   │   │   │       └── value-of-pi.xml
│   │   │   ├── mini.xml
│   │   │   ├── pg/
│   │   │   │   └── newProblem.pg
│   │   │   └── publication.xml
│   │   └── sample-chapter/
│   │       ├── my-generated/
│   │       │   ├── .gitkeep
│   │       │   └── webwork/
│   │       │       ├── an-exercisegroup-exercise.xml
│   │       │       ├── answer-arrays.xml
│   │       │       ├── antiderivative-exp.xml
│   │       │       ├── antiderivative-sin.xml
│   │       │       ├── box-diagonal-five.xml
│   │       │       ├── box-diagonal-thirteen.xml
│   │       │       ├── choose-one.xml
│   │       │       ├── copy-webwork-add-numbers-exploration.xml
│   │       │       ├── copy-webwork-add-numbers.xml
│   │       │       ├── copy-with-tasks.xml
│   │       │       ├── cylinder-volume.xml
│   │       │       ├── deep-nested-lists.xml
│   │       │       ├── divisional-bare.xml
│   │       │       ├── divisional-conclusion.xml
│   │       │       ├── divisional-introduction-conclusion.xml
│   │       │       ├── divisional-introduction.xml
│   │       │       ├── divisional-title-conclusion.xml
│   │       │       ├── divisional-title-introduction-conclusion.xml
│   │       │       ├── divisional-title-introduction.xml
│   │       │       ├── divisional-title.xml
│   │       │       ├── empty-statement.xml
│   │       │       ├── exercisegroup-bare.xml
│   │       │       ├── exercisegroup-conclusion.xml
│   │       │       ├── exercisegroup-introduction-conclusion.xml
│   │       │       ├── exercisegroup-introduction.xml
│   │       │       ├── exercisegroup-title-conclusion.xml
│   │       │       ├── exercisegroup-title-introduction-conclusion.xml
│   │       │       ├── exercisegroup-title-introduction.xml
│   │       │       ├── exercisegroup-title.xml
│   │       │       ├── function-with-domain-issues.xml
│   │       │       ├── images/
│   │       │       │   ├── box-diagonal-five-image-1.tex
│   │       │       │   ├── box-diagonal-thirteen-image-1.tex
│   │       │       │   ├── latex-image-with-preamble-image-1.tex
│   │       │       │   ├── randomized-latex-image-image-1.tex
│   │       │       │   ├── special-characters-image-1.tex
│   │       │       │   └── static-latex-image-image-1.tex
│   │       │       ├── inline-bare.xml
│   │       │       ├── inline-conclusion.xml
│   │       │       ├── inline-introduction-conclusion.xml
│   │       │       ├── inline-introduction.xml
│   │       │       ├── inline-title-conclusion.xml
│   │       │       ├── inline-title-introduction-conclusion.xml
│   │       │       ├── inline-title-introduction.xml
│   │       │       ├── inline-title.xml
│   │       │       ├── integer-addition-with-control-seed.xml
│   │       │       ├── integer-addition-with-seed.xml
│   │       │       ├── integer-addition.xml
│   │       │       ├── intertext.xml
│   │       │       ├── latex-image-with-preamble.xml
│   │       │       ├── list-indentation-with-images-and-tables.xml
│   │       │       ├── list-indentation.xml
│   │       │       ├── local-pg-file.xml
│   │       │       ├── local-pg.xml
│   │       │       ├── math-and-alignment.xml
│   │       │       ├── mathobject-string-answers.xml
│   │       │       ├── multiple-choice-popup-or-radio-buttons.xml
│   │       │       ├── multiple-choice.xml
│   │       │       ├── nested-tasks.xml
│   │       │       ├── no-random.xml
│   │       │       ├── number-or-function.xml
│   │       │       ├── options-subset-auto-label.xml
│   │       │       ├── options-subset-explicit-labeling.xml
│   │       │       ├── options-subset.xml
│   │       │       ├── pg/
│   │       │       │   └── Integrating_WeBWorK_into_Textbooks/
│   │       │       │       ├── 1-Instructive_Examples/
│   │       │       │       │   ├── 1_1-Arithmetic/
│   │       │       │       │   │   ├── 1_1_1-Adding_SingleDigit_Integers.pg
│   │       │       │       │   │   ├── 1_1_3-Controlling_Randomness.pg
│   │       │       │       │   │   ├── 1_1_4-Special_Answer_Checking.pg
│   │       │       │       │   │   ├── 1_1_5-Using_Hints.pg
│   │       │       │       │   │   ├── 1_1_6-No_Randomization.pg
│   │       │       │       │   │   ├── 1_1_7-Local_PG.pg
│   │       │       │       │   │   ├── 1_1_8-Local_PG_File.pg
│   │       │       │       │   │   ├── Exploration-1_1_2-Inside_an_exploration.pg
│   │       │       │       │   │   └── Project-1_1_1-Inside_a_project.pg
│   │       │       │       │   ├── 1_2-The_Quadratic_Formula/
│   │       │       │       │   │   ├── 1_2_2-Solving_Quadratic_Equations.pg
│   │       │       │       │   │   └── 1_2_3-Nested_tasks.pg
│   │       │       │       │   ├── 1_4-Antidifferentiation/
│   │       │       │       │   │   ├── 1_4_2_2-Every_Continuous_Function_has_an_Antiderivative.pg
│   │       │       │       │   │   ├── 1_4_2_3-Inverse_Processes.pg
│   │       │       │       │   │   ├── 1_4_2_4.pg
│   │       │       │       │   │   ├── 1_4_2_5.pg
│   │       │       │       │   │   └── 1_4_2_6-Show_Your_Work.pg
│   │       │       │       │   ├── 1_5-Math_Content/
│   │       │       │       │   │   ├── 1_5_1-Math_Elements_and_Alignment.pg
│   │       │       │       │   │   └── 1_5_2-Intertext.pg
│   │       │       │       │   ├── 1_6-Multiple_Choice/
│   │       │       │       │   │   ├── 1_6_1-DropdownPopup.pg
│   │       │       │       │   │   ├── 1_6_2-Choose_one.pg
│   │       │       │       │   │   ├── 1_6_3-Choose_a_Subset_of_Options.pg
│   │       │       │       │   │   ├── 1_6_4-Choose_a_Subset_of_Options_with_Automated_Labeling.pg
│   │       │       │       │   │   └── 1_6_5-Choose_a_Subset_of_Options_with_Explicit_Labeling.pg
│   │       │       │       │   ├── 1_7-Tables/
│   │       │       │       │   │   └── 1_7_1-Complete_this_Table.pg
│   │       │       │       │   └── 1_8-Graphics_in_Exercises/
│   │       │       │       │       ├── 1_8_1-A_static_lateximage_graph.pg
│   │       │       │       │       ├── 1_8_1.pg
│   │       │       │       │       ├── 1_8_2-A_randomized_lateximage_graph.pg
│   │       │       │       │       ├── 1_8_2.pg
│   │       │       │       │       ├── 1_8_3-A_lateximage_graph_affected_by_lateximagepreamble.pg
│   │       │       │       │       ├── 1_8_4-Special_characters.pg
│   │       │       │       │       └── 1_8_5-Solve_using_a_graph.pg
│   │       │       │       ├── 2-Technical_Examples/
│   │       │       │       │   ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics/
│   │       │       │       │   │   ├── 2_1_1-PGML_Formatting.pg
│   │       │       │       │   │   ├── 2_1_2.pg
│   │       │       │       │   │   └── 2_1_3.pg
│   │       │       │       │   ├── 2_2-Subject_Area_Templates/
│   │       │       │       │   │   ├── 2_2_1-Answer_is_a_number_or_a_function.pg
│   │       │       │       │   │   ├── 2_2_2-Answer_is_a_function_with_domain_issues.pg
│   │       │       │       │   │   ├── 2_2_3-Multiple_Choice_by_Popup_Radio_Buttons_or_Checkboxes.pg
│   │       │       │       │   │   ├── 2_2_4.pg
│   │       │       │       │   │   ├── 2_2_5-Tables.pg
│   │       │       │       │   │   └── 2_2_6-Answer_Arrays.pg
│   │       │       │       │   ├── 2_3-Stress_Tests/
│   │       │       │       │   │   ├── 2_3_1-PTX_problem_source_with_servergenerated_images.pg
│   │       │       │       │   │   ├── 2_3_2-Checking_Proper_Indentation_In_Lists.pg
│   │       │       │       │   │   ├── 2_3_3-Checking_Proper_Indentation_In_Lists_with_Images_and_Tables.pg
│   │       │       │       │   │   ├── 2_3_4-Deepnested_lists.pg
│   │       │       │       │   │   ├── 2_3_5.pg
│   │       │       │       │   │   └── 2_3_6.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing/
│   │       │       │       │   │   ├── 2_4_1.pg
│   │       │       │       │   │   ├── 2_4_2-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_1.pg
│   │       │       │       │   │   ├── 2_4_2_10-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_11.pg
│   │       │       │       │   │   ├── 2_4_2_12-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_13.pg
│   │       │       │       │   │   ├── 2_4_2_14-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_15.pg
│   │       │       │       │   │   ├── 2_4_2_16-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_2-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_3.pg
│   │       │       │       │   │   ├── 2_4_2_4-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_5.pg
│   │       │       │       │   │   ├── 2_4_2_6-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_7.pg
│   │       │       │       │   │   ├── 2_4_2_8-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_2_9.pg
│   │       │       │       │   │   ├── 2_4_3.pg
│   │       │       │       │   │   ├── 2_4_4-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_5.pg
│   │       │       │       │   │   ├── 2_4_6-Has_a_Title.pg
│   │       │       │       │   │   ├── 2_4_7.pg
│   │       │       │       │   │   └── 2_4_8-Has_a_Title.pg
│   │       │       │       │   └── 2_5-Runestone_Assignment_Testing/
│   │       │       │       │       └── 2_5_1.pg
│   │       │       │       ├── def/
│   │       │       │       │   ├── set1_1-Arithmetic.def
│   │       │       │       │   ├── set1_2-The_Quadratic_Formula.def
│   │       │       │       │   ├── set1_3-Open_Problem_Library.def
│   │       │       │       │   ├── set1_4-Antidifferentiation_Exercises.def
│   │       │       │       │   ├── set1_5-Math_Content.def
│   │       │       │       │   ├── set1_6-Multiple_Choice.def
│   │       │       │       │   ├── set1_7-Tables.def
│   │       │       │       │   ├── set1_8-Graphics_in_Exercises.def
│   │       │       │       │   ├── set1_8-Graphics_in_Exercises_Exercises.def
│   │       │       │       │   ├── set2_1-PGML_Formatting_and_Verbatim_Calisthenics.def
│   │       │       │       │   ├── set2_2-Subject_Area_Templates.def
│   │       │       │       │   ├── set2_3-Stress_Tests.def
│   │       │       │       │   ├── set2_4-Layout_Configuration_Testing.def
│   │       │       │       │   ├── set2_4-Layout_Configuration_Testing_Exercises.def
│   │       │       │       │   └── set2_5-Runestone_Assignment_Testing_Exercises.def
│   │       │       │       ├── header/
│   │       │       │       │   ├── 1_1-Arithmetic.pg
│   │       │       │       │   ├── 1_2-The_Quadratic_Formula.pg
│   │       │       │       │   ├── 1_3-Open_Problem_Library.pg
│   │       │       │       │   ├── 1_4-Antidifferentiation_Exercises.pg
│   │       │       │       │   ├── 1_5-Math_Content.pg
│   │       │       │       │   ├── 1_6-Multiple_Choice.pg
│   │       │       │       │   ├── 1_7-Tables.pg
│   │       │       │       │   ├── 1_8-Graphics_in_Exercises.pg
│   │       │       │       │   ├── 1_8-Graphics_in_Exercises_Exercises.pg
│   │       │       │       │   ├── 2_1-PGML_Formatting_and_Verbatim_Calisthenics.pg
│   │       │       │       │   ├── 2_2-Subject_Area_Templates.pg
│   │       │       │       │   ├── 2_3-Stress_Tests.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing.pg
│   │       │       │       │   ├── 2_4-Layout_Configuration_Testing_Exercises.pg
│   │       │       │       │   └── 2_5-Runestone_Assignment_Testing_Exercises.pg
│   │       │       │       └── macros/
│   │       │       │           └── WWSC.pl
│   │       │       ├── pgml-data-attribute.xml
│   │       │       ├── ptx-source-with-server-images.xml
│   │       │       ├── quadratic-equation.xml
│   │       │       ├── radio-buttons-with-math.xml
│   │       │       ├── randomized-latex-image.xml
│   │       │       ├── single-quote-in-table-cell.xml
│   │       │       ├── solving-with-graph.xml
│   │       │       ├── special-answer-checking.xml
│   │       │       ├── special-characters.xml
│   │       │       ├── static-latex-image.xml
│   │       │       ├── table-completion.xml
│   │       │       ├── tables.xml
│   │       │       ├── using-hints.xml
│   │       │       ├── ww-PGML-format.xml
│   │       │       ├── ww-antiderivatives.xml
│   │       │       ├── ww-discuss-always-antiderivative.xml
│   │       │       ├── ww-discuss-inverse-processes.xml
│   │       │       └── ww-use-the-definition-of-the-derivative.xml
│   │       ├── pg/
│   │       │   └── Adding_SingleDigit_Integers.pg
│   │       ├── project.ptx
│   │       ├── publisher/
│   │       │   ├── publication-academy.xml
│   │       │   └── publication.xml
│   │       └── sample-chapter.ptx
│   └── workbook/
│       ├── README.md
│       ├── workbook-article-publication.xml
│       ├── workbook-article.xml
│       ├── workbook-book-publication.xml
│       ├── workbook-book.xml
│       ├── ws-activity-with-task.xml
│       ├── ws-dot-products.xml
│       ├── ws-exercisegroup.xml
│       ├── ws-geometric-prelude.xml
│       ├── ws-networks.xml
│       └── ws-testing.xml
├── journals/
│   ├── README.md
│   ├── build.sh
│   ├── journals-to-table.xsl
│   ├── journals.xml
│   └── texstyles/
│       ├── ams.xml
│       ├── dependents/
│       │   ├── bull-amer-math-soc.xml
│       │   ├── conform-geom-dyn.xml
│       │   ├── j-algebraic-geom.xml
│       │   ├── j-amer-math-soc.xml
│       │   ├── math-comp.xml
│       │   ├── proc-amer-math-soc.xml
│       │   ├── quart-appl-math.xml
│       │   ├── represent-theory.xml
│       │   ├── theory-probab-math-statist.xml
│       │   └── trans-ams.xml
│       ├── electron-j-combin.xml
│       ├── elsevier.xml
│       ├── springer-nature.xml
│       └── taylor-francis.xml
├── js/
│   ├── diagcess/
│   │   └── diagcess.js
│   ├── knowl.js
│   ├── lti_iframe_resizer.js
│   ├── mathjax_startup.js
│   ├── pretext-stack/
│   │   ├── stackapicalls.js
│   │   └── stackjsvle.js
│   ├── pretext-webwork/
│   │   ├── 2.16/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.17/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.18/
│   │   │   └── pretext-webwork.js
│   │   ├── 2.19/
│   │   │   └── pretext-webwork.js
│   │   └── 2.20/
│   │       └── pretext-webwork.js
│   ├── pretext.js
│   ├── pretext_add_on.js
│   ├── pretext_search.js
│   ├── ptx_scorm_events.js
│   └── ptx_search.js
├── legal/
│   ├── gpl-license-v2.txt
│   └── gpl-license-v3.txt
├── pretext/
│   ├── README.md
│   ├── __init__.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── braille_format.py
│   │   └── pretext.py
│   ├── module-test.py
│   ├── pretext
│   ├── pretext.cfg
│   └── requirements.txt
├── release-notes.md
├── schema/
│   ├── README.md
│   ├── build.sh
│   ├── pf.xsd
│   ├── pretext-dev.rnc
│   ├── pretext-dev.rng
│   ├── pretext-schematron.xsl
│   ├── pretext-validation-plus.xsl
│   ├── pretext.rnc
│   ├── pretext.rng
│   ├── pretext.xml
│   ├── pretext.xsd
│   ├── publication-schema.rnc
│   ├── publication-schema.rng
│   ├── publication-schema.xml
│   ├── publication-schema.xsd
│   ├── publication.xml
│   └── xml.xsd
├── script/
│   ├── README.md
│   ├── cssbuilder/
│   │   ├── README.md
│   │   ├── cssbuilder.mjs
│   │   └── package.json
│   ├── dynsub/
│   │   ├── README.md
│   │   ├── dynamic_extract.mjs
│   │   └── package.json
│   ├── mbx
│   ├── mjsre/
│   │   ├── README.md
│   │   ├── mj-sre-page.js
│   │   ├── package.json
│   │   └── update-sre
│   └── webwork/
│       └── pg-ptx.pl
└── xsl/
    ├── README.md
    ├── entities.ent
    ├── extract-asymptote.xsl
    ├── extract-biblio-csl.xsl
    ├── extract-datafile.xsl
    ├── extract-dynamic.xsl
    ├── extract-identity.xsl
    ├── extract-interactive.xsl
    ├── extract-latex-image.xsl
    ├── extract-mermaid.xsl
    ├── extract-mom.xsl
    ├── extract-pg.xsl
    ├── extract-prefigure.xsl
    ├── extract-qrcode.xsl
    ├── extract-sageplot.xsl
    ├── extract-stack.xsl
    ├── extract-trace.xsl
    ├── extract-youtube.xsl
    ├── html-symbols.xsl
    ├── latex/
    │   ├── pretext-latex-AIM.xsl
    │   ├── pretext-latex-CLP.xsl
    │   ├── pretext-latex-chaos.xsl
    │   ├── pretext-latex-dyslexic-font.xsl
    │   ├── pretext-latex-guide.xsl
    │   └── pretext-latex-texstyle.xsl
    ├── localizations/
    │   ├── README.md
    │   ├── af-ZA.xml
    │   ├── bg-BG.xml
    │   ├── ca-ES.xml
    │   ├── cs-CZ.xml
    │   ├── de-DE.xml
    │   ├── en-US.xml
    │   ├── es-ES.xml
    │   ├── fi-FI.xml
    │   ├── fr-CA.xml
    │   ├── fr-FR.xml
    │   ├── hu-HU.xml
    │   ├── it-IT.xml
    │   ├── ku-CKB.xml
    │   ├── localizations.xml
    │   ├── nl-NL.xml
    │   ├── pt-BR.xml
    │   ├── pt-PT.xml
    │   └── zh-HANS.xml
    ├── pretext-assembly.xsl
    ├── pretext-basic-html.xsl
    ├── pretext-beamer.xsl
    ├── pretext-braille-preprint.xsl
    ├── pretext-common.xsl
    ├── pretext-dynamic.xsl
    ├── pretext-epub.xsl
    ├── pretext-html.xsl
    ├── pretext-json-manifest.xsl
    ├── pretext-jupyter.xsl
    ├── pretext-latex-classic.xsl
    ├── pretext-latex-common.xsl
    ├── pretext-latex.xsl
    ├── pretext-litprog.xsl
    ├── pretext-merge.xsl
    ├── pretext-numbers.xsl
    ├── pretext-revealjs.xsl
    ├── pretext-runestone-fitb.xsl
    ├── pretext-runestone-static.xsl
    ├── pretext-runestone.xsl
    ├── pretext-sage-doctest.xsl
    ├── pretext-smc.xsl
    ├── pretext-solution-manual-latex.xsl
    ├── pretext-text-utilities.xsl
    ├── pretext-text.xsl
    ├── pretext-units.xsl
    ├── pretext-view-source.xsl
    ├── pretext-ww-problem-sets.xsl
    ├── publisher-variables.xsl
    ├── support/
    │   ├── README.md
    │   ├── extract-math.xsl
    │   ├── package-math.xsl
    │   ├── play-button/
    │   │   └── README.md
    │   ├── pretext-pg-macros.xsl
    │   └── webpack_static_imports.xml
    ├── tests/
    │   ├── README.md
    │   ├── null.xml
    │   └── pretext-text-utilities-test.xsl
    ├── utilities/
    │   ├── README.md
    │   ├── author-report.xsl
    │   ├── deprecate-autoname.sed
    │   ├── deprecate-index.sed
    │   ├── fix-deprecations.xsl
    │   ├── pretext-enhanced-source.xsl
    │   └── report-publisher-variables.xsl
    ├── xml-to-json.xsl
    └── xml-to-string.xsl
Download .txt
SYMBOL INDEX (457 symbols across 32 files)

FILE: examples/sample-article/media/code/austin/animation.js
  function Slider (line 45) | function Slider(id, xpos) {
  function AffineTransform (line 143) | function AffineTransform() {
  function Woody (line 206) | function Woody(id) {

FILE: examples/sample-article/media/code/austin/figures.js
  function Canvas (line 3) | function Canvas(id, bbox) {
  function AffineTransform (line 99) | function AffineTransform() {
  function Plotable (line 174) | function Plotable() {
  function Label (line 223) | function Label(s, p) {
  function Grid (line 242) | function Grid(rx, ry) {
  function TGrid (line 266) | function TGrid(a1, a2) {
  function Axes (line 300) | function Axes() {
  function Slider (line 373) | function Slider(rx, y, sx, update) {
  function VSlider (line 439) | function VSlider(x, ry, sy, update) {
  function Function (line 505) | function Function(f) {
  function Antiderivative (line 530) | function Antiderivative(f, a) {
  function Graph (line 539) | function Graph(f) {
  function ParametricCurve (line 565) | function ParametricCurve(x, y, domain) {
  function Rectangle (line 586) | function Rectangle(ll, dims) {
  function Polygon (line 605) | function Polygon(points) {
  function AreaBetweenCurves (line 622) | function AreaBetweenCurves(f) {
  function Line (line 705) | function Line(p0, p1) {
  function Point (line 733) | function Point(p) {
  function Ellipse (line 799) | function Ellipse(center, a, b) {
  function Circle (line 823) | function Circle(center, radius) {
  function QuadTree (line 829) | function QuadTree(corners, depth) {
  function Implicit (line 918) | function Implicit(f) {
  function Vector (line 963) | function Vector(head) {

FILE: examples/sample-article/media/code/d3/collision.js
  function collide (line 52) | function collide(node) {

FILE: examples/sample-article/media/code/d3/graph-layout.js
  function main (line 16) | function main() {
  function setSize (line 29) | function setSize(data) {
  function drawChart (line 53) | function drawChart(data) {

FILE: examples/sample-article/media/code/d3/welsh.js
  function ticked (line 103) | function ticked() {
  function positionLink (line 110) | function positionLink(d) {
  function positionNode (line 130) | function positionNode(d) {
  function isConnected (line 154) | function isConnected(a, b) {
  function mouseOver (line 159) | function mouseOver(opacity) {
  function mouseOut (line 182) | function mouseOut() {

FILE: examples/sample-article/media/code/haynes/3d-direction-vector.js
  function coordinates (line 8) | function coordinates(){
  function cell (line 12) | function cell(r,c) {
  function xyz (line 16) | function xyz(obj){

FILE: examples/sample-article/media/code/jsxgraph/infinity.js
  function quadrangle (line 28) | function quadrangle(pt, n) {

FILE: examples/sample-article/media/code/jsxgraph/piecewise.js
  function clearTraces_p3 (line 71) | function clearTraces_p3() {
  function animate_p3 (line 139) | function animate_p3(point, direction, count) {
  function toggle (line 149) | function toggle(id) {

FILE: examples/sample-article/media/code/mcclure/slope.js
  function setup_scale_and_axes (line 25) | function setup_scale_and_axes() {
  function draw (line 108) | function draw() {
  function draw_transition (line 129) | function draw_transition() {
  function define_function (line 190) | function define_function() {
  function add_xh_marker (line 221) | function add_xh_marker(x0_in, h, f1, f2) {
  function tangent_line (line 308) | function tangent_line(x0, x) {
  function draw_tangent_line (line 311) | function draw_tangent_line(x0) {
  function secant_slope (line 331) | function secant_slope(x0,h) {
  function secant_line (line 337) | function secant_line(x,x0,h) {
  function draw_secant_line (line 342) | function draw_secant_line(x0,h) {

FILE: examples/sample-article/media/code/threejs/catenoid.js
  function addLabel (line 82) | function addLabel( text, x, y, z ) {
  function addPoint (line 146) | function addPoint( json ) {
  function addLine (line 177) | function addLine( json ) {
  function addSurface (line 199) | function addSurface( json ) {
  function render (line 227) | function render() {

FILE: examples/sample-article/media/code/threejs/saddle.js
  function addLabel (line 89) | function addLabel( text, x, y, z, style ) {
  function createCamera (line 188) | function createCamera() {
  function updateCameraAspect (line 206) | function updateCameraAspect( camera, aspect ) {
  function addText (line 259) | function addText( json ) {
  function addPoint (line 267) | function addPoint( json ) {
  function addLine (line 306) | function addLine( json ) {
  function addSurface (line 340) | function addSurface( json ) {
  function addSurfaceMeshGrid (line 386) | function addSurfaceMeshGrid( json ) {
  function render (line 426) | function render() {
  function toggleMenu (line 442) | function toggleMenu() {
  function saveAsPNG (line 451) | function saveAsPNG() {
  function saveAsHTML (line 460) | function saveAsHTML() {
  function getViewpoint (line 483) | function getViewpoint() {
  function getCamera (line 506) | function getCamera() {

FILE: examples/sample-article/media/code/threejs/splines.js
  function addTube (line 99) | function addTube() {
  function setScale (line 118) | function setScale() {
  function addGeometry (line 125) | function addGeometry( geometry ) {
  function animateCamera (line 137) | function animateCamera() {
  function init (line 147) | function init() {
  function onWindowResize (line 262) | function onWindowResize() {
  function animate (line 273) | function animate() {
  function render (line 283) | function render() {

FILE: js/diagcess/diagcess.js
  function t (line 7) | function t(t,e,n){this.src=t,this.type=e,this.callback=n,this.src=t,this...
  function t (line 7) | function t(t,e){var n,c;this.annotation_=t,this.diagram_=e,this.drawnEle...
  function t (line 7) | function t(t){this.languages=t,this.diagram_={}}
  function s (line 7) | function s(t){var e=t,n=[];do{var o=e.getAttribute("transform");o&&n.uns...
  function l (line 7) | function l(t){var e=document.createElementNS("http://www.w3.org/2000/svg...
  function u (line 7) | function u(t){var e=t;do{(e=e.parentNode).removeAttribute("transform")}w...
  function t (line 7) | function t(t){this.container=t,this._active=!1,this.internalEvents_=[],t...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.ends...
  function t (line 7) | function t(t){this.cmlDocument=t,this.languages={},this.insertLanguages(...
  function t (line 7) | function t(t,e){this.neighbour_=t,this.annotation_=e,this.type_=o.getAtt...
  function t (line 7) | function t(t,e,n,o){this.x=t,this.y=e,this.width=n,this.height=o}
  function t (line 7) | function t(t){this.cmlDocument=t,this.messages={},this.language=this.get...
  function t (line 7) | function t(t){this.svg=t,this.focusgroups=new Map,this.defaultZoomOption...
  function t (line 7) | function t(t){this.cmlDocument=t,this.root=null,this.map=new r.Diagram(i...
  function n (line 7) | function n(t){return e.prefix_+"-"+t}
  function e (line 7) | function e(t,e){t.classList&&t.classList.add?t.classList.add(e):t.classN...
  function n (line 7) | function n(t,e){if(t.classList&&t.classList.remove&&t.classList.remove(e...
  function o (line 7) | function o(t){return"string"!=typeof t}
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.spee...
  function c (line 7) | function c(t){if(t.querySelector("div.svg")){t.setAttribute("has-svg","t...
  function a (line 7) | function a(t,e,n,o){var i=t.getAttribute(n)||s(t,n,o);i?u(i,function(n){...
  function s (line 7) | function s(t,e,n){if(!t.id)return null;var o=l()[t.id];return o?(o+=n,t....
  function l (line 7) | function l(){for(var t,e={},n=window.location.href.slice(window.location...
  function u (line 7) | function u(t,e){if("file:"!==location.protocol){var n=new DOMParser,o=ne...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(e,n){var o=t.call(this,e,n)||this;return o.neighbourhood=[],o}
  function n (line 7) | function n(){this.constructor=t}
  function c (line 7) | function c(t){try{s(o.next(t))}catch(t){i(t)}}
  function a (line 7) | function a(t){try{s(o.throw(t))}catch(t){i(t)}}
  function s (line 7) | function s(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n(...
  function a (line 7) | function a(a){return function(s){return function(a){if(n)throw new TypeE...
  function e (line 7) | function e(e,n){var o=t.call(this,null)||this;return o.key=e,o.mol=n,o.n...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(e){var n=t.call(this,e)||this;return n.container=e,n.setupCon...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function c (line 7) | function c(t){return e.colorSchemes_[t%e.colorSchemes_.length]}
  function a (line 7) | function a(t,e){var n=c(e);return[p(t,n.bkd),s(t,n.bkd),h(t,n.frgd),u(t,...
  function s (line 7) | function s(t,e){var n="";return f(n+="div.".concat(t.node.id," { backgro...
  function l (line 7) | function l(t){var e="svg."+t.id,n="";return n+="".concat(e," { overflow:...
  function u (line 7) | function u(t,e,n){var o="svg."+t.id,r="";return r+="".concat(o," line.")...
  function p (line 7) | function p(t,e){var n="svg."+t.id,o="";return o+="".concat(n," { backgro...
  function h (line 7) | function h(t,e){var n="svg."+t.id,o="";return o+="".concat(n," line { st...
  function f (line 7) | function f(t,e){var n=document.createElement("style");return n.setAttrib...
  function v (line 7) | function v(t,e){var n=t.querySelector("style."+e);return!!n&&(t.removeCh...
  function d (line 7) | function d(t,e){t.appendChild(e)}
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(){return null!==t&&t.apply(this,arguments)||this}
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function n (line 7) | function n(){this.constructor=t}
  function e (line 7) | function e(e){var n=t.call(this,e)||this;return n.container=e,n.setupMes...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function e (line 7) | function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.name...
  function t (line 7) | function t(t){this.path=[],this.points=[],this.context=new AudioContext,...
  function t (line 7) | function t(t,e){var n=this;this.from_=t,this.annotation_=e,this.speech=n...
  function t (line 7) | function t(t,e,n){this.node=t,this.svg=e,this.cml=n,this.id=o.getId(),o....
  function n (line 7) | function n(o){var r=e[o];if(void 0!==r)return r.exports;var i=e[o]={expo...

FILE: js/knowl.js
  function addKnowls (line 8) | function addKnowls(target) {
  class SlideRevealer (line 23) | class SlideRevealer {
    method constructor (line 34) | constructor(triggerElement, contentElement, animatedElement) {
    method isBusy (line 47) | isBusy() {
    method storeAnimatedElementInlineStyle (line 51) | storeAnimatedElementInlineStyle() {
    method restoreAnimatedElementInlineStyle (line 62) | restoreAnimatedElementInlineStyle() {
    method onClick (line 72) | onClick(e) {
    method toggle (line 119) | toggle(expanding, expandingMeasurements = null) {
    method onAnimationFinish (line 166) | onAnimationFinish(isOpen) {
  class LinkKnowl (line 195) | class LinkKnowl {
    method initializeXrefKnowl (line 202) | static initializeXrefKnowl(knowlLinkElement) {
    method constructor (line 209) | constructor(knowlLinkElement) {
    method updateLabels (line 232) | updateLabels(isVisible) {
    method toggle (line 245) | toggle() {
    method findOutputLocation (line 265) | findOutputLocation() {
    method createOutputElement (line 278) | createOutputElement() {
    method getContent (line 296) | async getContent() {
    method handleLinkClick (line 323) | handleLinkClick(event) {

FILE: js/lti_iframe_resizer.js
  function sendResizeRequest (line 52) | function sendResizeRequest(el) {

FILE: js/mathjax_startup.js
  function startMathJax (line 43) | function startMathJax(opts) {

FILE: js/pretext-stack/stackapicalls.js
  function wrap_math (line 21) | function wrap_math(content) {
  function collectData (line 29) | async function collectData(qfile, qname, qprefix) {
  function collectAnswer (line 48) | function collectAnswer(qprefix) {
  function processNodes (line 60) | function processNodes(res, nodes, qprefix) {
  function send (line 77) | function send(qfile, qname, qprefix) {
  function validate (line 198) | function validate(element, qfile, qname, qprefix) {
  function answer (line 241) | function answer(qfile, qname, qprefix, seed) {
  function download (line 341) | function download(filename, fileid, qfile, qname, qprefix, seed) {
  function saveState (line 379) | function saveState(key, value) {
  function loadState (line 386) | function loadState(key) {
  function renameIframeHolders (line 393) | function renameIframeHolders() {
  function createIframes (line 401) | function createIframes (iframes) {
  function replaceFeedbackTags (line 414) | function replaceFeedbackTags(text, qprefix) {
  function getQuestionFile (line 426) | async function getQuestionFile(questionURL, questionName) {
  function loadQuestionFromFile (line 438) | function loadQuestionFromFile(fileContents, questionName) {
  function setQuestion (line 457) | function setQuestion(question) {
  function createQuestionBlocks (line 461) | function createQuestionBlocks() {
  function addCollapsibles (line 506) | function addCollapsibles(){
  function collapseFunc (line 513) | function collapseFunc(e){
  function stackSetup (line 517) | function stackSetup(){
  function getPlotUrl (line 522) | function getPlotUrl(file) {

FILE: js/pretext-stack/stackjsvle.js
  constant IFRAMES (line 42) | let IFRAMES = {};
  constant INPUTS (line 46) | let INPUTS = {};
  constant INPUTS_INPUT_EVENT (line 52) | let INPUTS_INPUT_EVENT = {};
  constant DISABLE_CHANGES (line 55) | let DISABLE_CHANGES = false;
  function vle_get_element (line 66) | function vle_get_element(id) {
  function vle_get_input_element (line 97) | function vle_get_input_element(name, srciframe) {
  function vle_update_input (line 142) | function vle_update_input(inputelement) {
  function vle_update_dom (line 156) | function vle_update_dom(modifiedsubtreerootelement) {
  function vle_html_sanitize (line 168) | function vle_html_sanitize(src) {
  function is_evil_attribute (line 208) | function is_evil_attribute(name, value) {
  function create_iframe (line 610) | function create_iframe(iframeid, content, targetdivid, title, scrolling,...

FILE: js/pretext-webwork/2.16/pretext-webwork.js
  function handleWW (line 19) | function handleWW(ww_id, action) {
  function WWshowCorrect (line 549) | function WWshowCorrect(ww_id, answers) {
  function resetWW (line 651) | function resetWW(ww_id) {
  function adjustSrcHrefs (line 668) | function adjustSrcHrefs(container,ww_domain) {
  function translateHintSol (line 678) | function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_...
  function cloneAttributes (line 730) | function cloneAttributes(target, source) {
  function createFeedbackButton (line 734) | function createFeedbackButton(id, title, content) {

FILE: js/pretext-webwork/2.17/pretext-webwork.js
  function handleWW (line 19) | function handleWW(ww_id, action) {
  function WWshowCorrect (line 826) | function WWshowCorrect(ww_id, answers) {
  function resetWW (line 949) | function resetWW(ww_id) {
  function adjustSrcHrefs (line 966) | function adjustSrcHrefs(container,ww_domain) {
  function translateHintSol (line 976) | function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_...
  function cloneAttributes (line 1028) | function cloneAttributes(target, source) {
  function createFeedbackButton (line 1032) | function createFeedbackButton(id, title, content) {
  function webworkSeedHash (line 1049) | function webworkSeedHash(string) {

FILE: js/pretext-webwork/2.18/pretext-webwork.js
  function handleWW (line 19) | function handleWW(ww_id, action) {
  function WWshowCorrect (line 826) | function WWshowCorrect(ww_id, answers) {
  function resetWW (line 949) | function resetWW(ww_id) {
  function adjustSrcHrefs (line 966) | function adjustSrcHrefs(container,ww_domain) {
  function translateHintSol (line 976) | function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_...
  function cloneAttributes (line 1028) | function cloneAttributes(target, source) {
  function createFeedbackButton (line 1032) | function createFeedbackButton(id, title, content) {
  function webworkSeedHash (line 1049) | function webworkSeedHash(string) {

FILE: js/pretext-webwork/2.19/pretext-webwork.js
  function handleWW (line 13) | async function handleWW(ww_id, action) {
  function WWshowCorrect (line 479) | function WWshowCorrect(ww_id, answers) {
  function resetWW (line 579) | function resetWW(ww_id) {
  function adjustSrcHrefs (line 596) | function adjustSrcHrefs(container,ww_domain) {
  function translateHintSol (line 610) | function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_...
  function cloneAttributes (line 664) | function cloneAttributes(target, source) {
  function webworkSeedHash (line 668) | function webworkSeedHash(string) {

FILE: js/pretext-webwork/2.20/pretext-webwork.js
  function handleWW (line 13) | async function handleWW(ww_id, action) {
  function WWshowCorrect (line 488) | function WWshowCorrect(ww_id, answers) {
  function resetWW (line 588) | function resetWW(ww_id) {
  function adjustSrcHrefs (line 605) | function adjustSrcHrefs(container,ww_domain) {
  function translateHintSol (line 619) | function translateHintSol(ww_id, body_div, ww_domain, b_ptx_has_hint, b_...
  function cloneAttributes (line 673) | function cloneAttributes(target, source) {
  function webworkSeedHash (line 677) | function webworkSeedHash(string) {

FILE: js/pretext.js
  function getOffsetTop (line 15) | function getOffsetTop(e) {
  function scrollTocToActive (line 21) | function scrollTocToActive() {
  function toggletoc (line 62) | function toggletoc() {
  function samePageLink (line 75) | function samePageLink(a) {
  function toggleTOCItem (line 142) | function toggleTOCItem(expander) {
  function getTOCItemType (line 169) | function getTOCItemType(item) {
  function getTOCItemDepth (line 179) | function getTOCItemDepth(item) {

FILE: js/pretext_add_on.js
  function getScrollbarWidth (line 19) | function getScrollbarWidth() {
  function copyPermalink (line 48) | async function copyPermalink(linkNode) {
  function updateURLParameter (line 266) | function updateURLParameter(url, param, paramVal){
  function process_workspace (line 285) | function process_workspace() {
  function pretext_geogebra_calculator_onload (line 291) | function pretext_geogebra_calculator_onload() {
  function flattenParagraphsSections (line 415) | function flattenParagraphsSections(printout) {
  function waitForImages (line 430) | function waitForImages(container, timeoutMs = 5000) {
  function setInitialWorkspaceHeights (line 450) | function setInitialWorkspaceHeights() {
  function adjustPrintoutPages (line 459) | function adjustPrintoutPages() {
  function createPrintoutPages (line 493) | function createPrintoutPages(margins) {
  function addHeadersAndFootersToPrintout (line 593) | function addHeadersAndFootersToPrintout() {
  function adjustWorkspaceToFitPage (line 666) | function adjustWorkspaceToFitPage({paperSize, margins}) {
  function getElementTotalHeight (line 733) | function getElementTotalHeight(elem) {
  function getElemWorkspaceHeight (line 742) | function getElemWorkspaceHeight(elem) {
  function findPageBreaks (line 788) | function findPageBreaks(rows, pageHeight) {
  function setPageGeometryCSS (line 837) | function setPageGeometryCSS({paperSize, margins}) {
  function toggleWorkspaceHighlight (line 867) | function toggleWorkspaceHighlight(isChecked) {
  function getPaperSize (line 911) | function getPaperSize() {
  function loadPrintout (line 947) | async function loadPrintout(printableSectionID) {
  function rewriteSolutions (line 978) | function rewriteSolutions() {
  function toPixels (line 998) | function toPixels(value) {
  function isDarkMode (line 1185) | function isDarkMode() {
  function setDarkMode (line 1198) | function setDarkMode(isDark) {

FILE: js/pretext_search.js
  function doSearch (line 9) | function doSearch(searchlocation="A") {
  function findEntry (line 66) | function findEntry(resultId, db) {
  function augmentResults (line 75) | function augmentResults(result, docs) {
  function rearrangedArray (line 126) | function rearrangedArray(arry) {
  function maxLocation (line 151) | function maxLocation(arry) {
  function comparePosition (line 163) | function comparePosition(a, b) {
  function compareScoreDesc (line 172) | function compareScoreDesc(a, b) {
  function addResultToPage (line 182) | function addResultToPage(searchterms, result, docs, numUnshown, resultAr...

FILE: js/ptx_scorm_events.js
  function Get (line 120) | function Get(key) {
  function Set (line 132) | function Set(key, val) {
  function Commit (line 147) | function Commit() {
  function lastError (line 160) | function lastError() {
  function lsKey (line 232) | function lsKey() {
  function saveToLocalStorage (line 237) | function saveToLocalStorage() {
  function loadFromLocalStorage (line 246) | function loadFromLocalStorage() {
  function initSession (line 265) | function initSession() {
  function countPageQuestions (line 393) | function countPageQuestions() {
  function extractScore (line 439) | function extractScore(ev) {
  function isoTimestamp (line 473) | function isoTimestamp() {
  function hhmmssTime (line 479) | function hhmmssTime() {
  function recordInteraction (line 499) | function recordInteraction(ev) {
  function installHook (line 696) | function installHook() {
  function requestParentResize (line 780) | function requestParentResize() {
  function addWeBWorKBadge (line 983) | function addWeBWorKBadge(container, saved) {
  function patchWeBWorKSrcdoc (line 1032) | function patchWeBWorKSrcdoc(iframe, html) {
  function installWeBWorKSrcdocIntercept (line 1162) | function installWeBWorKSrcdocIntercept() {
  function handleWeBWorKAjaxResponse (line 1187) | function handleWeBWorKAjaxResponse(xhr) {
  function installWeBWorKAjaxIntercept (line 1280) | function installWeBWorKAjaxIntercept() {
  function loadRestoreData (line 1436) | function loadRestoreData() {
  function installRestoreHook (line 1622) | function installRestoreHook(restoreMap) {

FILE: js/ptx_search.js
  function doSearch (line 1) | function doSearch() {
  function findEntry (line 24) | function findEntry(resultId, db) {
  function augmentResults (line 33) | function augmentResults(result, docs) {
  function comparePosition (line 46) | function comparePosition(a, b) {
  function addResultToPage (line 56) | function addResultToPage(result, docs, resultArea) {
  function showHelp (line 103) | function showHelp() {

FILE: pretext/lib/braille_format.py
  class Cursor (line 42) | class Cursor:
    method __init__ (line 44) | def __init__(self, width, height, page_format):
    method remaining_lines (line 80) | def remaining_lines(self):
    method remaining_characters (line 83) | def remaining_characters(self):
    method at_page_start (line 86) | def at_page_start(self):
    method page_number (line 89) | def page_number(self):
    method embossing (line 92) | def embossing(self):
    method new_page (line 99) | def new_page(self):
    method advance_line (line 105) | def advance_line(self):
    method adjust_text_width (line 126) | def adjust_text_width(self, adjustment):
    method advance (line 130) | def advance(self, nchars):
  class LineBuffer (line 145) | class LineBuffer:
    method __init__ (line 147) | def __init__(self, width):
    method is_room (line 154) | def is_room(self, text):
    method is_empty (line 157) | def is_empty(self):
    method remaining_chars (line 160) | def remaining_chars(self):
    method add (line 165) | def add(self, text):
    method adjust_text_width (line 168) | def adjust_text_width(self, adjustment):
    method flush (line 171) | def flush(self, brf):
  class Segment (line 197) | class Segment:
    method __init__ (line 199) | def __init__(self, s):
  class Block (line 259) | class Block:
    method __init__ (line 261) | def __init__(self, b):
  class BRF (line 309) | class BRF:
    method __init__ (line 323) | def __init__(self, page_format, width, height):
    method is_room_on_line (line 334) | def is_room_on_line(self, text):
    method at_line_start (line 337) | def at_line_start(self):
    method needs_page_advance (line 355) | def needs_page_advance(self, seg):
    method adjust_text_width (line 425) | def adjust_text_width(self, adjustment):
    method write (line 438) | def write(self, text):
    method advance_one_line (line 441) | def advance_one_line(self):
    method blank_line (line 491) | def blank_line(self):
    method advance_page (line 501) | def advance_page(self):
    method write_word (line 514) | def write_word(self, word):
    method write_fragment (line 521) | def write_fragment(self, typeface, aline, math_punctuation, seg):
    method center (line 597) | def center(self):
    method process_segment (line 614) | def process_segment(self, s):
    method massage_math (line 713) | def massage_math(self, aline, punctuation):
    method process_block (line 756) | def process_block(self, blk):
    method write_segment (line 827) | def write_segment(self, seg):
    method write_block (line 834) | def write_block(self, blk):
    method flush (line 841) | def flush(self):
    method get_brf (line 850) | def get_brf(self):
    method translate_segment (line 856) | def translate_segment(typeface, aline):
  function parse_segments (line 898) | def parse_segments(xml_simple, out_file, page_format):

FILE: pretext/lib/pretext.py
  function mathjax_latex (line 136) | def mathjax_latex(xml_source, pub_file, out_file, dest_dir, math_format):
  function prefigure_conversion (line 252) | def prefigure_conversion(xml_source, pub_file, stringparams, xmlid_root,...
  function individual_prefigure_conversion (line 332) | def individual_prefigure_conversion(pfdiagram, outformat):
  function asymptote_conversion (line 363) | def asymptote_conversion(
  function individual_asymptote_conversion (line 465) | def individual_asymptote_conversion(asydiagram, outform, method, asy_cli...
  function sage_conversion (line 505) | def sage_conversion(
  function individual_sage_conversion (line 578) | def individual_sage_conversion(sageplot, outformat, dest_dir, sage_execu...
  function latex_image_conversion (line 592) | def latex_image_conversion(
  function individual_latex_image_conversion (line 664) | def individual_latex_image_conversion(latex_image, outformat, dest_dir, ...
  function datafiles_to_xml (line 809) | def datafiles_to_xml(xml_source, pub_file, stringparams, xmlid_root, des...
  function latex_tactile_image_conversion (line 912) | def latex_tactile_image_conversion(xml_source, pub_file, stringparams, d...
  function tracer (line 928) | def tracer(xml_source, pub_file, stringparams, xmlid_root, dest_dir):
  function dynamic_substitutions (line 1078) | def dynamic_substitutions(xml_source, pub_file, stringparams, xmlid_root...
  function webwork_to_xml (line 1137) | def webwork_to_xml(
  function webwork_sets (line 2023) | def webwork_sets(xml_source, pub_file, stringparams, dest_dir, tgz, need...
  function pg_macros (line 2060) | def pg_macros(xml_source, pub_file, stringparams, dest_dir):
  function _pretextify (line 2079) | def _pretextify(biblio):
  function references (line 2102) | def references(xml_source, pub_file, stringparams, xmlid_root, dest_dir):
  function youtube_thumbnail (line 2484) | def youtube_thumbnail(xml_source, pub_file, stringparams, xmlid_root, de...
  function play_button (line 2541) | def play_button(dest_dir):
  function qrcode (line 2557) | def qrcode(xml_source, pub_file, stringparams, xmlid_root, dest_dir):
  function mermaid_images (line 2643) | def mermaid_images(xml_source, pub_file, stringparams, xmlid_root, dest_...
  function _stack_replace_latex (line 2715) | def _stack_replace_latex(text):
  function _stack_replace_tags (line 2756) | def _stack_replace_tags(text, asset_prefix_rel, mathmode=False):
  function _stack_postprocess (line 2795) | def _stack_postprocess(text, asset_prefix_rel):
  function _stack_download_assets (line 2799) | def _stack_download_assets(assets, api_url, asset_prefix_abs, stack_file):
  function _stack_process_response (line 2831) | def _stack_process_response(qdict, asset_prefix_rel, stack_file, base_url):
  function stack_extraction (line 2903) | def stack_extraction(xml_source, pub_file, stringparams, xmlid_root, des...
  function preview_images (line 3004) | def preview_images(xml_source, pub_file, stringparams, xmlid_root, dest_...
  function all_images (line 3166) | def all_images(xml, pub_file, stringparams, xmlid_root):
  function mom_static_problems (line 3275) | def mom_static_problems(xml_source, pub_file, stringparams, xmlid_root, ...
  function braille (line 3509) | def braille(xml_source, pub_file, stringparams, out_file, dest_dir, page...
  function _split_brf (line 3612) | def _split_brf(filename):
  function epub (line 3940) | def epub(xml_source, pub_file, out_file, dest_dir, file_format, math_for...
  function _parse_runestone_services (line 4355) | def _parse_runestone_services(et):
  function _set_runestone_stringparams (line 4379) | def _set_runestone_stringparams(stringparams, rs_js, rs_css, rs_version):
  function _runestone_services (line 4387) | def _runestone_services(stringparams, ext_rs_methods):
  function _runestone_debug_service_info (line 4460) | def _runestone_debug_service_info():
  function _cdn_runestone_services (line 4469) | def _cdn_runestone_services(stringparams, ext_rs_methods):
  function query_runestone_services (line 4524) | def query_runestone_services(services_url):
  function _place_runestone_services (line 4572) | def _place_runestone_services(tmp_dir, stringparams, ext_rs_methods):
  function _move_prebuilt_theme (line 4630) | def _move_prebuilt_theme(theme_name, theme_opts, tmp_dir):
  function _build_custom_theme (line 4719) | def _build_custom_theme(xml, theme_name, theme_opts, tmp_dir):
  function check_color_contrast (line 4747) | def check_color_contrast(color1, color2):
  function build_or_copy_theme (line 4756) | def build_or_copy_theme(xml, pub_var_dict, tmp_dir):
  function update_theme (line 4787) | def update_theme(xml_source, publication_file, stringparams, dest_dir):
  function get_web_asset (line 4794) | def get_web_asset(url):
  function download_file (line 4827) | def download_file(url, dest_filename):
  function html (line 4839) | def html(xml, pub_file, stringparams, xmlid_root, file_format, extra_xsl...
  function revealjs (line 4938) | def revealjs(
  function assembly (line 4999) | def assembly(xml, pub_file, stringparams, out_file, dest_dir, method):
  function assembly_internal (line 5035) | def assembly_internal(xml, pub_file, stringparams, method):
  function get_latex_style (line 5060) | def get_latex_style(xml, pub_file, stringparams):
  function latex_package (line 5089) | def latex_package(xml, pub_file, stringparams, dest_dir):
  function latex (line 5110) | def latex(xml, pub_file, stringparams, extra_xsl, out_file, dest_dir):
  function _latex_compile (line 5146) | def _latex_compile(latex_cmd, log_file, source_name, max_passes=10, capt...
  function pdf (line 5171) | def pdf(xml, pub_file, stringparams, extra_xsl, out_file, dest_dir, meth...
  function xsltproc (line 5276) | def xsltproc(xsl, xml, result, output_dir=None, stringparams={}):
  function validate (line 5428) | def validate(xml_source, out_file, dest_dir):
  function guarded_xml_include_parser (line 5523) | def guarded_xml_include_parser(xml):
  function python_version (line 5578) | def python_version():
  function check_python_version (line 5584) | def check_python_version():
  function set_ptx_path (line 5600) | def set_ptx_path(path=None):
  function get_ptx_path (line 5626) | def get_ptx_path():
  function get_ptx_xsl_path (line 5633) | def get_ptx_xsl_path():
  function get_source_path (line 5639) | def get_source_path(source_file):
  function _git_symbolic_to_hash (line 5648) | def _git_symbolic_to_hash(symbolic):
  function get_git_master_commit (line 5666) | def get_git_master_commit():
  function get_git_head (line 5672) | def get_git_head():
  function build_info_message (line 5703) | def build_info_message():
  function set_executables (line 5712) | def set_executables(adict):
  function get_executable_cmd (line 5718) | def get_executable_cmd(exec_name):
  function get_deprecated_tex_fallback (line 5765) | def get_deprecated_tex_fallback(key):
  function sanitize_url (line 5782) | def sanitize_url(url):
  function sanitize_alpha_num_underscore (line 5799) | def sanitize_alpha_num_underscore(param):
  function get_temporary_directory (line 5814) | def get_temporary_directory():
  function get_output_filename (line 5829) | def get_output_filename(xml, out_file, dest_dir, suffix):
  function release_temporary_directories (line 5841) | def release_temporary_directories():
  function verify_input_directory (line 5858) | def verify_input_directory(inputdir):
  function get_managed_directories (line 5869) | def get_managed_directories(xml_source, pub_file):
  function get_source_directories (line 5940) | def get_source_directories(xml_source):
  function get_platform_host (line 5990) | def get_platform_host(pub_file):
  function copy_managed_directories (line 6020) | def copy_managed_directories(build_dir, external_abs=None, generated_abs...
  function copy_html_js (line 6038) | def copy_html_js(work_dir):
  function copy_build_directory (line 6048) | def copy_build_directory(build_dir, dest_dir):
  function targz (line 6081) | def targz(output, source_dir):
  function working_directory (line 6089) | def working_directory(path):
  function get_publisher_variable_report (line 6108) | def get_publisher_variable_report(xml_source, pub_file, params):
  function get_publisher_variable (line 6168) | def get_publisher_variable(variable_dict, variable_name):
  function get_journal_info (line 6186) | def get_journal_info(journal_name):
  function place_latex_package_files (line 6237) | def place_latex_package_files(dest_dir, journal_name, cache_dir):
  class Stopwatch (line 6282) | class Stopwatch:
    method __init__ (line 6288) | def __init__(self, name:str="", print_log:bool=True):
    method reset (line 6294) | def reset(self):
    method log (line 6298) | def log(self, timepoint_description:str=""):

FILE: script/cssbuilder/cssbuilder.mjs
  function getOptions (line 12) | function getOptions() {
  function getOutDir (line 94) | function getOutDir(options) {
  function getTargets (line 101) | function getTargets(options) {
  function getModules (line 172) | function getModules(options) {
  function getESBuildConfig (line 192) | async function getESBuildConfig(options) {

FILE: script/mjsre/mj-sre-page.js
  function action (line 138) | function action(state, code, setup = null) {
Copy disabled (too large) Download .json
Condensed preview — 1077 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (25,445K chars).
[
  {
    "path": ".git-blame-ignore-revs",
    "chars": 404,
    "preview": "# PreTeXt whitespace/formatting commits\n# Commit message (e.g.): \"Add whitespace commit to git blame ignore revisions\"\n\n"
  },
  {
    "path": ".gitignore",
    "chars": 434,
    "preview": "user/*\ndoc/guide/webwork-representations.ptx\nscript/mjsre/node_modules/\nscript/mjsre/package-lock.json\nscript/dynsub/nod"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4804,
    "preview": "Contributing\n------------\n\nThanks for your interest in contributing to [PreTeXt](https://pretextbook.org).\n\nDetails on p"
  },
  {
    "path": "COPYING",
    "chars": 652,
    "preview": "Copyright 2013 Robert A. Beezer\n\nThis file is part of PreTeXt.\n\nPreTeXt is free software: you can redistribute it and/or"
  },
  {
    "path": "README.md",
    "chars": 1992,
    "preview": "PreTeXt\n=======\n\nAn authoring and publishing system for authors of textbooks, research articles, and monographs, especia"
  },
  {
    "path": "contrib/hitchman/README.md",
    "chars": 353,
    "preview": "Hitchman's Linear Algebra Workbook\n==================================\n\nCompatibility layers to support TJ Hitchman's Lin"
  },
  {
    "path": "contrib/hitchman/tjh-law-html.xsl",
    "chars": 1050,
    "preview": "<?xml version='1.0'?> <!-- As XML file -->\r\n\r\n<!-- For TJ Hitchman's Linear Algebra Workbook     -->\r\n<!-- 2014/09/09  R"
  },
  {
    "path": "contrib/hitchman/tjh-law-print.xsl",
    "chars": 1397,
    "preview": "<?xml version='1.0'?> <!-- As XML file -->\r\n\r\n<!-- For TJ Hitchman's Linear Algebra Workbook     -->\r\n<!-- 2014/09/04  R"
  },
  {
    "path": "contrib/ups-writers/README.md",
    "chars": 433,
    "preview": "University of Puget Sound's \"Writer's Handbook\"\n===============================================\n\nCompatibility layers to"
  },
  {
    "path": "contrib/ups-writers/ups-writers-html.xsl",
    "chars": 8562,
    "preview": "<?xml version='1.0'?> <!-- As XML file -->\r\n\r\n<!-- For University of Puget Sound, Writer's Handbook      -->\r\n<!-- 2016/"
  },
  {
    "path": "contrib/ups-writers/ups-writers-latex.xsl",
    "chars": 7144,
    "preview": "<?xml version='1.0'?> <!-- As XML file -->\r\n\r\n<!-- For University of Puget Sound, Writer's Handbook      -->\r\n<!-- 2016/"
  },
  {
    "path": "css/README.md",
    "chars": 6076,
    "preview": "# Notes on CSS structure and development\n\nPreTeXt books expect to use a `theme.css` file for its styling. SCSS is used t"
  },
  {
    "path": "css/colors/_color-helpers.scss",
    "chars": 2903,
    "preview": "// This file contains functions and mixins for working with colors in SCSS\n\n@use \"sass:map\";\n@use \"sass:color\";\n\n@mixin "
  },
  {
    "path": "css/colors/_color-vars.scss",
    "chars": 5828,
    "preview": "/*\n  Master list of color variables and default values.\n  Variables are defined in SCSS to allow for calculation of valu"
  },
  {
    "path": "css/colors/_palette-dark.scss",
    "chars": 4245,
    "preview": "// Implements a dark theme single color palette using a --primary-color\n\n@use \"sass:meta\";\n@use \"sass:color\";\n@use \"sass"
  },
  {
    "path": "css/colors/_palette-dual.scss",
    "chars": 3460,
    "preview": "// Implements a palette with two main colors, --primary-color and --secondary-color\n\n@use \"sass:meta\";\n@use \"sass:color\""
  },
  {
    "path": "css/colors/_palette-quad-chunks.scss",
    "chars": 5152,
    "preview": "// Defines colors for grouping elements based on four colors to identify \n// block elements as either main, do, fact, or"
  },
  {
    "path": "css/colors/_palette-single-bold.scss",
    "chars": 1876,
    "preview": "// Implements a palette with one main --primary-color\n// More dramatic than _palette-single.scss\n\n@use \"sass:meta\";\n@use"
  },
  {
    "path": "css/colors/_palette-single-muted.scss",
    "chars": 1836,
    "preview": "// Implements a palette with one main --primary-color used in a very sparing fashion\n\n@use \"sass:meta\";\n@use \"sass:color"
  },
  {
    "path": "css/colors/_palette-single.scss",
    "chars": 1605,
    "preview": "// Implements a palette with one main --primary-color\n\n@use \"sass:meta\";\n@use \"sass:color\";\n@use \"sass:map\";\n@use \"color"
  },
  {
    "path": "css/components/README.md",
    "chars": 772,
    "preview": "# Notes on components folder\n\nComponents contains pieces shared by all modern scss themes. They are divided into:\n\n## ch"
  },
  {
    "path": "css/components/_google-search.scss",
    "chars": 952,
    "preview": "// TODO - refactor\n// Make conditional on use of google search???\n\n.pretext .searchwrapper {\n  max-width: 900px;\n  posit"
  },
  {
    "path": "css/components/_mystery.scss",
    "chars": 19995,
    "preview": "// Chunks of code that seem like one off fixes for books that may not exist\n// This file is not included anywhere else -"
  },
  {
    "path": "css/components/_pretext-search.scss",
    "chars": 2354,
    "preview": "\n@use 'components/helpers/buttons-default' as buttons;\n\n.searchbox {\n\n  .searchwidget {\n    height: 100%;\n  }\n  \n  .sear"
  },
  {
    "path": "css/components/_pretext-web.scss",
    "chars": 631,
    "preview": "// Entry point for web-based themes. Incorporates common PreTeXt styles\n// and web-specific styles.\n\n// Todo - analyze i"
  },
  {
    "path": "css/components/_pretext.scss",
    "chars": 579,
    "preview": "// Entry point for common styling\n\n// It is assumed these are used by both web and epub stylesheets\n// page-parts/ and c"
  },
  {
    "path": "css/components/_printing.scss",
    "chars": 845,
    "preview": "// Basic rules for printing a standard PreTeXt page\n\n// Get rid of UI elements.\n// Leave margin fiddling for system prin"
  },
  {
    "path": "css/components/_spacing.scss",
    "chars": 1196,
    "preview": "// Basic spacing for content\n\n// Breakpoint at which the navbar moves to the bottom of the screen\n$navbar-breakpoint: 80"
  },
  {
    "path": "css/components/_worksheet.scss",
    "chars": 451,
    "preview": "// TODO refactor\n\n// Rules in this file apply to both screen and print\n// Print specific rules should go in a file in ta"
  },
  {
    "path": "css/components/chunks/README.md",
    "chars": 291,
    "preview": "Styling for \"chunks\" of content - containers that are designed to hold\nother elements and are likely to vary significant"
  },
  {
    "path": "css/components/chunks/_asides-basic.scss",
    "chars": 409,
    "preview": "$border-width: 2px !default;\n$side-margins: 30px !default;\n\n.aside-like {\n  & > .knowl__link {\n    color: var(--aside-li"
  },
  {
    "path": "css/components/chunks/_asides-floating.scss",
    "chars": 711,
    "preview": "$float-width: 200px !default;\n$float-offset: -248px !default;\n$min-float-width: 1280px !default;\n\n@use 'asides-basic';\n\n"
  },
  {
    "path": "css/components/chunks/_codelike.scss",
    "chars": 1588,
    "preview": "@mixin code-text {\n  font-family: var(--font-monospace);\n  background: var(--code-background);\n  font-size: .93rem;\n  li"
  },
  {
    "path": "css/components/chunks/_discussion-inline.scss",
    "chars": 331,
    "preview": "@use './helpers/inline-heading-mixin';\n\n.discussion-like {\n  @include inline-heading-mixin.heading;\n  & > .heading {\n   "
  },
  {
    "path": "css/components/chunks/_exercises.scss",
    "chars": 2265,
    "preview": "@use '../helpers/cols';\n\n// generate multi column rules for exercises\n@include cols.allow-cols('.exercise-like');\n\n.exer"
  },
  {
    "path": "css/components/chunks/_knowls.scss",
    "chars": 1608,
    "preview": "/*\n  main knowls styles\n*/\n\n$border-radius: 0px !default;\n$border-width: 3px !default;\n$pad: 12px !default;\n\n.source-vie"
  },
  {
    "path": "css/components/chunks/_sidebyside.scss",
    "chars": 2289,
    "preview": "// Space all rows in a sbsgroup, no other styling\n.sbsgroup > *:not(:first-child)\n{\n    margin-top: 1.5em;\n}\n\n\n// sideby"
  },
  {
    "path": "css/components/chunks/_solutions.scss",
    "chars": 508,
    "preview": "// \n\n/* stacked headings in the solutions backmatter */\nsection.solutions > .heading + .heading {\n  margin-top: 0.5em;\n}"
  },
  {
    "path": "css/components/chunks/helpers/README.md",
    "chars": 37,
    "preview": "Helpers used to style block elements\n"
  },
  {
    "path": "css/components/chunks/helpers/_C-box-mixin.scss",
    "chars": 2330,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$padding: 20px !default;\n$padding-top: $pad"
  },
  {
    "path": "css/components/chunks/helpers/_L-mixin.scss",
    "chars": 975,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$pad: 10px !default;\n\n// Generate styles fo"
  },
  {
    "path": "css/components/chunks/helpers/_box-mixin.scss",
    "chars": 851,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$pad: 10px !default;\n$border-radius: 0px !d"
  },
  {
    "path": "css/components/chunks/helpers/_heading-box-mixin.scss",
    "chars": 2616,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$pad: 20px !default;\n$border-radius: 0px !d"
  },
  {
    "path": "css/components/chunks/helpers/_horizontal-bars-mixin.scss",
    "chars": 1757,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$pad: 0px !default;   //all sides\n$border-c"
  },
  {
    "path": "css/components/chunks/helpers/_inline-heading-mixin.scss",
    "chars": 889,
    "preview": "// Generate styles for an inline heading\n@mixin heading {\n  & > .heading:first-child {\n    display: inline;\n    line-hei"
  },
  {
    "path": "css/components/chunks/helpers/_sidebar-mixin.scss",
    "chars": 995,
    "preview": "// These values can be set on @use to avoid repeating values in each @import\n$pad: 10px !default;   //all sides\n$padside"
  },
  {
    "path": "css/components/elements/README.md",
    "chars": 35,
    "preview": "Styling for basic content elements\n"
  },
  {
    "path": "css/components/elements/_description-lists.scss",
    "chars": 2299,
    "preview": "/* dl is used for glossaries and descriptions lists.\n   Glossaries are simple:  bold word by itself on a line.\n        D"
  },
  {
    "path": "css/components/elements/_figures.scss",
    "chars": 725,
    "preview": "figure {\n  clear: both;\n  position: relative;\n\n  // override browser margins\n  margin-left: 0;\n  margin-right: 0;\n}\n\nfig"
  },
  {
    "path": "css/components/elements/_fillin.scss",
    "chars": 456,
    "preview": "\n.fillin {\n  display: inline-block;\n  border: none;\n  border-width: 1px;\n  margin-right: 0.1em;\n  margin-left: 0.1em;\n  "
  },
  {
    "path": "css/components/elements/_footnotes.scss",
    "chars": 981,
    "preview": "$border-radius: 0px !default;\n\n.ptx-footnote {\n  display: inline-block;\n  position: relative;\n}\n\n.ptx-footnote[open] {\n "
  },
  {
    "path": "css/components/elements/_front-matter.scss",
    "chars": 1595,
    "preview": "// Styles for the items that are (at least generally) a part of the front matter\n// There are some pretty generic class "
  },
  {
    "path": "css/components/elements/_headings.scss",
    "chars": 1745,
    "preview": "// headings for standard page elements - sections/articles/etc...\n// more specialized headings (exercises) should be def"
  },
  {
    "path": "css/components/elements/_index.scss",
    "chars": 2240,
    "preview": "\n\n/* the index at the back of the book */\n// TODO - refactor\n\n\n.navbar .indexnav {\n  position: absolute;\n  top: 46px;\n  "
  },
  {
    "path": "css/components/elements/_links.scss",
    "chars": 844,
    "preview": "\n// Reset for all links\na {\n  color: var(--link-text-color);\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    text-d"
  },
  {
    "path": "css/components/elements/_list-styles.scss",
    "chars": 710,
    "preview": "// Types of ol/ul - used by web and ebooks\n// Any spacing should be in _lists.scss, not here\n\nol.no-marker,\nul.no-marker"
  },
  {
    "path": "css/components/elements/_lists.scss",
    "chars": 772,
    "preview": "// Entry point for ol/ul/dl web styling\n\n@use \"list-styles\";\n@use \"description-lists\";\n@use '../helpers/cols';\n\n// gener"
  },
  {
    "path": "css/components/elements/_math.scss",
    "chars": 875,
    "preview": "// TODO - refactor\n\n.displaymath {\n  overflow-x: auto;\n  overflow-y: hidden;\n}\n\n.displaymath mjx-container[jax=\"CHTML\"]["
  },
  {
    "path": "css/components/elements/_media.scss",
    "chars": 1698,
    "preview": "// ---------------------------------------------\n// containers for images, audio, video, and asymptote\n.image-box,\n.audi"
  },
  {
    "path": "css/components/elements/_misc-content.scss",
    "chars": 2378,
    "preview": "\n// Miscellaneous stylized content blocks that are not complex enough\n// to warrant their own file\n\nem.alert {\n  font-we"
  },
  {
    "path": "css/components/elements/_permalinks.scss",
    "chars": 2830,
    "preview": "// TODO - refactor\n$opacity: 0.0 !default;\n\n/*\nSo that we can position things (like .autopermalink) absolutely wrt these"
  },
  {
    "path": "css/components/elements/_poem.scss",
    "chars": 985,
    "preview": "/* style for poems */\n.poem {\n  display: table;\n  margin: 0 auto;\n  width: auto;\n  max-width: 90%;\n}\n\n.poem > .heading {"
  },
  {
    "path": "css/components/elements/_prism.scss",
    "chars": 4957,
    "preview": "@use '../chunks/codelike';\n\n// Prism stylesheets built locally as default ones don't support light/dark switching\n// thi"
  },
  {
    "path": "css/components/elements/_summary-links.scss",
    "chars": 1627,
    "preview": "\n/* Start of division toc links */\n// .ptx-content to override _links rules\n.ptx-content .summary-links {\n  font-family:"
  },
  {
    "path": "css/components/elements/_tables.scss",
    "chars": 2119,
    "preview": "// limit rules targeting basic elements to just content area\n.ptx-content {\n  table {\n    border-spacing: 0;\n    border-"
  },
  {
    "path": "css/components/elements/extras/_heading-underlines.scss",
    "chars": 528,
    "preview": "$color-light: var(--primary-color-white-30) !default;\n$color-dark: var(--primary-color-black-30) !default;\n$thickness: 2"
  },
  {
    "path": "css/components/helpers/README.md",
    "chars": 48,
    "preview": "Mixins used to build style rules in other files\n"
  },
  {
    "path": "css/components/helpers/_buttons-default.scss",
    "chars": 1845,
    "preview": "$border-radius: 0 !default;\n\n@mixin ptx-button(\n  $border-radius: $border-radius\n) {\n  font: inherit;\n  display: flex;\n "
  },
  {
    "path": "css/components/helpers/_cols.scss",
    "chars": 590,
    "preview": "\n// columns are arranged in row-major order to match print output in LaTeX\n:is(.cols2, .cols3, .cols4, .cols5, .cols6) {"
  },
  {
    "path": "css/components/helpers/_expandable.scss",
    "chars": 2480,
    "preview": "// Styling for elements in ptx-main that are allowed to expand past normal width\n// of ptx-content.\n\n// Assumes that $co"
  },
  {
    "path": "css/components/interactives/README.md",
    "chars": 132,
    "preview": "Interactive elements.\n\nThese could be made conditional in the build process if we passed the requisite info from PTX to "
  },
  {
    "path": "css/components/interactives/_calculators.scss",
    "chars": 345,
    "preview": "// GeoGebra calculator\n\n$navbar-breakpoint: 856px !default;\n\n.calculator-container {\n  position: fixed;\n  z-index: 100;\n"
  },
  {
    "path": "css/components/interactives/_other.scss",
    "chars": 2120,
    "preview": "// Misc styles for interactive bits that should only be incldued in a web context\n// (not ebook)\n\n.interactive-iframe-co"
  },
  {
    "path": "css/components/interactives/_runestone.scss",
    "chars": 2664,
    "preview": "// extra specific to override Runestone margin\n.ptx-content .ptx-runestone-container .runestone {\n  margin: unset;\n  bor"
  },
  {
    "path": "css/components/interactives/_sagecell.scss",
    "chars": 1391,
    "preview": "// TODO - refactor\n\n.sagecell_sessionOutput pre {\n  font-family: var(--font-monospace);\n}\n\n.sagecell {\n  white-space: no"
  },
  {
    "path": "css/components/interactives/_webwork.scss",
    "chars": 2115,
    "preview": "// TODO - needs refactoring and dark mode update\n\n@use 'components/helpers/buttons-default' as buttons;\n\n/*  WW problems"
  },
  {
    "path": "css/components/page-parts/README.md",
    "chars": 237,
    "preview": "Styling for large display regions on the page\n\nIt is expected that a file like `_parts-default.scss` will be used to agg"
  },
  {
    "path": "css/components/page-parts/_banner.scss",
    "chars": 2707,
    "preview": "$max-width: 1200px !default;  // 0 == no max width\n$navbar-breakpoint: 800px !default;\n$centered-content: false !default"
  },
  {
    "path": "css/components/page-parts/_body.scss",
    "chars": 3083,
    "preview": "// Body level styling\n$max-width: 1200px !default;  // 0 == no max width\n$standalone-max-width: 1600px !default;  // use"
  },
  {
    "path": "css/components/page-parts/_footer.scss",
    "chars": 999,
    "preview": "$max-width: 0 !default;  // 0 == no max width\n$navbar-breakpoint: 856px !default;\n$nav-height: 36px !default;\n\n@use 'com"
  },
  {
    "path": "css/components/page-parts/_navbar.scss",
    "chars": 4042,
    "preview": "$max-width: 1200px !default;  // 0 == no max width\n// applied to the contents of the navbar\n\n$nav-height: 36px !default;"
  },
  {
    "path": "css/components/page-parts/_toc-basics.scss",
    "chars": 7587,
    "preview": "// shared toc styling used by _toc-default, etc...\n\n$sidebar-width: 240px !default;\n$nav-height: 36px !default;\n\n\n\n.ptx-"
  },
  {
    "path": "css/components/page-parts/_toc-default.scss",
    "chars": 1919,
    "preview": "$scrolling: true !default;\n$sidebar-width: 240px !default;\n$nav-height: 36px !default;\n$sidebar-breakpoint: 856px !defau"
  },
  {
    "path": "css/components/page-parts/_toc-overlay.scss",
    "chars": 1295,
    "preview": "$sidebar-width: 240px !default;\n$nav-height: 36px !default;\n$navbar-breakpoint: 800px !default;\n$border-width: 1px !defa"
  },
  {
    "path": "css/components/page-parts/extras/README.md",
    "chars": 59,
    "preview": "Options that can be added by a theme to tweak a parts file\n"
  },
  {
    "path": "css/components/page-parts/extras/_navbar-btn-borders.scss",
    "chars": 334,
    "preview": "\n$border-width: 1px !default;\n\n@mixin navbar-btn-borders {\n  .ptx-navbar {\n    .button {\n      border-left-width: $borde"
  },
  {
    "path": "css/components/page-parts/extras/_toc-borders.scss",
    "chars": 495,
    "preview": "\n$border-width: 1px !default;\n\n// apply some borders to the TOC\n.toc-item {\n  border-top: $border-width solid var(--toc-"
  },
  {
    "path": "css/components/page-parts/extras/_toc-expand-chevrons.scss",
    "chars": 361,
    "preview": "// Use chevrons instead of +/- in ToC expander control\n\n.ptx-toc.focused {\n  .toc-item > .toc-title-box > .toc-expander "
  },
  {
    "path": "css/components/page-parts/extras/_toc-hidden-scrollbar.scss",
    "chars": 237,
    "preview": "// blend in with page until hover\n.ptx-toc {\n  scrollbar-color: var(--content-background) var(--content-background);\n\n  "
  },
  {
    "path": "css/components/page-parts/extras/_toc-last-level-plain.scss",
    "chars": 418,
    "preview": "// levels 2 & 3 only get new colors if they contain further levels\n// that way bottom level has default styling\n\n.ptx-to"
  },
  {
    "path": "css/dist/epub.css",
    "chars": 36608,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/ebook/epub/epub.scss */\n* {\n  box-sizing: border-box;\n}\n@layer spacing {\n  :is(s"
  },
  {
    "path": "css/dist/kindle.css",
    "chars": 37422,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/ebook/kindle/kindle.scss */\n* {\n  box-sizing: border-box;\n}\n@layer spacing {\n  :"
  },
  {
    "path": "css/dist/pretext-reveal.css",
    "chars": 2618,
    "preview": "/* ../../css/targets/revealjs/reveal.scss */\nol.no-marker,\nul.no-marker,\nli.no-marker {\n  list-style-type: none;\n}\nol.de"
  },
  {
    "path": "css/dist/print-worksheet.css",
    "chars": 57719,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-boulder.css",
    "chars": 109545,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-crc-legacy.css",
    "chars": 148843,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/crc/theme-crc.scss */\n* {\n  box-sizing: border-box;\n}\nbody.pretext {"
  },
  {
    "path": "css/dist/theme-default-legacy.css",
    "chars": 143152,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/default/theme-default.scss */\n* {\n  box-sizing: border-box;\n}\nbody.p"
  },
  {
    "path": "css/dist/theme-default-modern.css",
    "chars": 114612,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-denver.css",
    "chars": 117822,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-greeley.css",
    "chars": 109474,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-min-legacy.css",
    "chars": 138486,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/min/theme-min.scss */\n* {\n  box-sizing: border-box;\n}\nbody.pretext {"
  },
  {
    "path": "css/dist/theme-oscarlevin-legacy.css",
    "chars": 147564,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/oscarlevin/theme-oscarlevin.scss */\n* {\n  box-sizing: border-box;\n}\n"
  },
  {
    "path": "css/dist/theme-salem.css",
    "chars": 114880,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-soundwriting-legacy.css",
    "chars": 138535,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/soundwriting/theme-soundwriting.scss */\n* {\n  box-sizing: border-box"
  },
  {
    "path": "css/dist/theme-tacoma.css",
    "chars": 101167,
    "preview": "@charset \"UTF-8\";\n@import \"https://fonts.googleapis.com/css2?family=Open Sans:ital,wght@0,400..700;1,400..700&display=sw"
  },
  {
    "path": "css/dist/theme-wide-legacy.css",
    "chars": 154211,
    "preview": "@charset \"UTF-8\";\n\n/* ../../css/targets/html/legacy/wide/theme-wide.scss */\n* {\n  box-sizing: border-box;\n}\nbody.pretext"
  },
  {
    "path": "css/fonts/_fonts-google.scss",
    "chars": 3072,
    "preview": "@use \"sass:map\";\n@use \"sass:string\";\n@use \"sass:list\";\n\n// Fonts to use\n$body: 'Open Sans, Helvetica Neue, Helvetica, Ar"
  },
  {
    "path": "css/legacy/colors/all_colors.scss",
    "chars": 705,
    "preview": "// Entrypoint to get all legacy color schemes\n\n@use 'colors_blue_green.css';\n@use 'colors_blue_grey.css';\n@use 'colors_b"
  },
  {
    "path": "css/legacy/colors/colors_blue_green.css",
    "chars": 4348,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_blue_grey.css",
    "chars": 2475,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_blue_red.css",
    "chars": 2433,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_blue_red_dark.css",
    "chars": 3907,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_bluegreen_grey.css",
    "chars": 4390,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_brown_gold.css",
    "chars": 1318,
    "preview": "\n/* Colors for Manitoba */\n\n:root[data-legacy-colorscheme=\"brown_gold\"] {\n  --documenttitle: #472200;\n  --bodytitle: #8e"
  },
  {
    "path": "css/legacy/colors/colors_darkmartiansands.css",
    "chars": 2490,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_default.css",
    "chars": 2719,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_focused_gray_aqua.css",
    "chars": 1301,
    "preview": "/*\n  Sample bolder focused TOC color scheme\n  See colors_default for general color tips\n*/\n\n\n:root[data-legacy-colorsche"
  },
  {
    "path": "css/legacy/colors/colors_focused_light.css",
    "chars": 1249,
    "preview": "/*\n  Sample light, non-distracting focused TOC color scheme\n  See colors_default for general color tips\n*/\n\n:root[data-l"
  },
  {
    "path": "css/legacy/colors/colors_green_blue.css",
    "chars": 2435,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_green_plum.css",
    "chars": 2435,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_maroon_grey.css",
    "chars": 1315,
    "preview": "\n/* Colors for UPS */\n\n:root[data-legacy-colorscheme=\"maroon_grey\"] {\n  --documenttitle: #660000;\n  --bodytitle: #8e0a0c"
  },
  {
    "path": "css/legacy/colors/colors_martiansands.css",
    "chars": 2486,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_orange_navy.css",
    "chars": 2436,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_pastel_blue_orange.css",
    "chars": 737,
    "preview": "\n/* Pastel color scheme by Nathan Wintersgill */\n\n:root[data-legacy-colorscheme=\"pastel_blue_orange\"] {\n  --documenttitl"
  },
  {
    "path": "css/legacy/colors/colors_red_blue.css",
    "chars": 1374,
    "preview": "\n:root[data-legacy-colorscheme=\"red_blue\"] {\n  --documenttitle: #932919;\n  --bodytitle: #A62E1C;  /* often a darker vers"
  },
  {
    "path": "css/legacy/colors/colors_ruby_amethyst.css",
    "chars": 2438,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_ruby_emerald.css",
    "chars": 2437,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/colors_ruby_turquoise.css",
    "chars": 2439,
    "preview": "\n/*\n There are five main choices that define a color scheme in the\n HTML output of PreTeXt:\n 1) A dark color for the tit"
  },
  {
    "path": "css/legacy/colors/setcolors.css",
    "chars": 14174,
    "preview": "\n/* This file assigns the main colors, using variables that\n   have been set previously. */\n\nbody.pretext {\n  color: var"
  },
  {
    "path": "css/legacy/pretext.css",
    "chars": 24636,
    "preview": "/*******************************************************************************\n * pretext.css handles structure which "
  },
  {
    "path": "css/legacy/pretext_add_on.css",
    "chars": 73986,
    "preview": "\n.ptx-content section .para.credit + .para.credit {\n    margin-top: 0.25em;\n}\n.ptx-content section .para.credit > .title"
  },
  {
    "path": "css/legacy/pretext_search.css",
    "chars": 2720,
    "preview": ".searchresultsplaceholder article {\n    width: 60%;\n    margin-left: auto;\n    margin-right: auto;\n    font-family: sans"
  },
  {
    "path": "css/other/catalog.css",
    "chars": 1727,
    "preview": "/* Used by the PreTeXt catalog website */\n\n.projects a {\n    text-decoration: none;\n}\n.projects p {\n    margin: 0;\n}\n.pr"
  },
  {
    "path": "css/targets/ebook/ebook-common.scss",
    "chars": 4341,
    "preview": "// Use this file for anything common to kindle and epub\n@use 'components/pretext';\n\n@use 'components/chunks/codelike';\n@"
  },
  {
    "path": "css/targets/ebook/epub/epub.scss",
    "chars": 63,
    "preview": "/*! Theme: epub */\n@use '../ebook-common';\n\n// no extra styles\n"
  },
  {
    "path": "css/targets/ebook/kindle/kindle.scss",
    "chars": 1177,
    "preview": "/*! Theme: kindle */\n@use '../ebook-common';\n\n.ptx-content {\n    // default behavior is excessive space below display ma"
  },
  {
    "path": "css/targets/html/README.md",
    "chars": 201,
    "preview": "HTML themes using the modern tooling.\n\nOther than default-modern, the intent is to use city names to identify themes.\nId"
  },
  {
    "path": "css/targets/html/boulder/_customization.scss",
    "chars": 479,
    "preview": "//$color: var(--primary-color) !default;\n//$text-color: white !default;\n\n@use 'components/page-parts/extras/toc-expand-c"
  },
  {
    "path": "css/targets/html/boulder/theme-boulder.scss",
    "chars": 2165,
    "preview": "/*! Theme: boulder */\n// Theme designed for short articles (i.e., research papers) or course documents.\n// Minimal navig"
  },
  {
    "path": "css/targets/html/default-modern/_chunks-default.scss",
    "chars": 2283,
    "preview": "// Standard collection of chunks. This file should only be modified\n// to fix bugs or improve the default-modern theme. "
  },
  {
    "path": "css/targets/html/default-modern/_customization.scss",
    "chars": 862,
    "preview": "// turn on some optional design features\n@use 'components/page-parts/extras/navbar-btn-borders';\n@use 'components/page-p"
  },
  {
    "path": "css/targets/html/default-modern/_parts-default.scss",
    "chars": 1497,
    "preview": "// Left aligned \"page\" with limited width, beyond which it is centered\n\n$max-width: 1200px !default;\n$sidebar-width: 240"
  },
  {
    "path": "css/targets/html/default-modern/theme-default-modern.scss",
    "chars": 1587,
    "preview": "/*! Theme: default-modern */\n\n// Variables used by theme. CSSBuilder overrides these by prepending\n// different definiti"
  },
  {
    "path": "css/targets/html/denver/_chunks-denver.scss",
    "chars": 4895,
    "preview": "$border-radius: 0 !default;\n$chunk-heading-font-size: 1.125em !default;\n\n// One stop include for heading-box dominant co"
  },
  {
    "path": "css/targets/html/denver/_customizations.scss",
    "chars": 1169,
    "preview": "$color: var(--primary-color) !default;\n$text-color: white !default;\n\n@use 'components/page-parts/extras/toc-expand-chevr"
  },
  {
    "path": "css/targets/html/denver/_parts-paper.scss",
    "chars": 6509,
    "preview": "//Some basic variables\n$centered-content: true !default;\n$scrolling-toc: true !default;\n$nav-height: 36px !default;\n$nav"
  },
  {
    "path": "css/targets/html/denver/theme-denver.scss",
    "chars": 2958,
    "preview": "/*! Theme: denver */\n// Theme that uses bold content blocks with a visible centered \"page\" of content\n\n// Current mainta"
  },
  {
    "path": "css/targets/html/greeley/_chunks-greeley.scss",
    "chars": 2181,
    "preview": "$border-radius: 8px !default;\n\n// One stop include for default style content blocks\n@use 'components/chunks/asides-float"
  },
  {
    "path": "css/targets/html/greeley/_customization.scss",
    "chars": 740,
    "preview": "//$color: var(--primary-color) !default;\n//$text-color: white !default;\n\n@use 'components/page-parts/extras/toc-expand-c"
  },
  {
    "path": "css/targets/html/greeley/theme-greeley.scss",
    "chars": 2213,
    "preview": "/*! Theme: greeley */\n// Theme designed for short articles (i.e., research papers).\n\n// Current maintainer: Oscar Levin\n"
  },
  {
    "path": "css/targets/html/legacy/crc/banner_crc.css",
    "chars": 5881,
    "preview": "/*** Some PreTeXt overrides ***/\n/*\n@media (min-width: 801px) {\n  .title-container .title {\n    font-size: unset;\n    fo"
  },
  {
    "path": "css/targets/html/legacy/crc/navbar_crc.css",
    "chars": 7039,
    "preview": "\n/* Since CRC loads after default, we need to suppress some of the default styling */\n\n.ptx-navbar .treebuttons .next-bu"
  },
  {
    "path": "css/targets/html/legacy/crc/shell_crc.css",
    "chars": 8508,
    "preview": "/*******************************************************************************\n * shell_X.css controls the overall arr"
  },
  {
    "path": "css/targets/html/legacy/crc/theme-crc.scss",
    "chars": 502,
    "preview": "/*! Theme: crc-legacy */\n// Imports in this file should be relative to css root\n@use 'legacy/pretext.css';\n@use 'legacy/"
  },
  {
    "path": "css/targets/html/legacy/crc/toc_crc.css",
    "chars": 8097,
    "preview": "\n/* over-ride default css */\n.ptx-toc > ul.structural > li:not(:first-child) {\n  margin-top: 0;\n}\n.ptx-toc ul.structural"
  },
  {
    "path": "css/targets/html/legacy/default/banner_default.css",
    "chars": 3240,
    "preview": "/*******************************************************************************\n * PreTeXt Masthead Stylesheet\n *******"
  },
  {
    "path": "css/targets/html/legacy/default/knowls_default.css",
    "chars": 2004,
    "preview": "/*\n  main knowls styles\n*/\n\n.source-view__link,\n.knowl__link {\n    cursor: pointer;\n    margin-left: 0.1em;\n    margin-r"
  },
  {
    "path": "css/targets/html/legacy/default/navbar_default.css",
    "chars": 3843,
    "preview": "/*******************************************************************************\n * Navbar Stylesheet\n *****************"
  },
  {
    "path": "css/targets/html/legacy/default/shell_default.css",
    "chars": 5374,
    "preview": "/*******************************************************************************\n * shell_X.css controls the overall arr"
  },
  {
    "path": "css/targets/html/legacy/default/style_default.css",
    "chars": 8244,
    "preview": "\n/* The Greg's L for theorems, proofs, etc */\n\n.ptx-content .proof {\n  border-right: 1px solid #666;\n  padding-right: 0."
  },
  {
    "path": "css/targets/html/legacy/default/theme-default.scss",
    "chars": 538,
    "preview": "/*! Theme: default-legacy */\n// Imports in this file should be relative to css root\n@use 'legacy/pretext.css';\n@use 'leg"
  },
  {
    "path": "css/targets/html/legacy/default/toc_default.css",
    "chars": 9821,
    "preview": "/* -------------------toc-------------------- */\n.ptx-toc {\n  /* IMPORTANT height must be calculated by javascript. */\n "
  },
  {
    "path": "css/targets/html/legacy/min/shell_min.css",
    "chars": 5836,
    "preview": "/*******************************************************************************\n * shell_X.css controls the overall arr"
  },
  {
    "path": "css/targets/html/legacy/min/theme-min.scss",
    "chars": 518,
    "preview": "/*! Theme: min-legacy */\n// Imports in this file should be relative to css root\n@use 'legacy/pretext.css';\n@use 'legacy/"
  },
  {
    "path": "css/targets/html/legacy/min/toc_min.css",
    "chars": 3830,
    "preview": "\n.ptx-toc {\n  /* IMPORTANT height must be calculated by javascript. */\n    width: 240px;\n    margin: 0;\n    font-size: 1"
  },
  {
    "path": "css/targets/html/legacy/oscarlevin/style_oscarlevin.css",
    "chars": 13638,
    "preview": "/* Since the detault style is loaded before the oscarlevin style, */\n/* some of the default style has to be undone */\n\n."
  },
  {
    "path": "css/targets/html/legacy/oscarlevin/theme-oscarlevin.scss",
    "chars": 575,
    "preview": "/*! Theme: oscarlevin-legacy */\n// Designed to support custom styling for oscarlevin style\n// Imports in this file shoul"
  },
  {
    "path": "css/targets/html/legacy/soundwriting/style_soundwriting.css",
    "chars": 3473,
    "preview": "\n/*\n:root {\n  --documenttitle: #660000;\n  --bodytitle: #8e0a0c; \n  --bodysubtitle: #A62E1C;\n  --bodytitlehighlight: #eee"
  },
  {
    "path": "css/targets/html/legacy/soundwriting/theme-soundwriting.scss",
    "chars": 603,
    "preview": "/*! Theme: soundwriting-legacy */\n// Designed to support custom styling for https://github.com/UPS-CWLT/soundwriting\n// "
  },
  {
    "path": "css/targets/html/legacy/wide/banner_wide.scss",
    "chars": 392,
    "preview": "@use '../default/banner_default.css';\n\n:root {\n  --banner-background-color: #ffffff;\n}\n\n.pretext .ptx-masthead {\n  max-w"
  },
  {
    "path": "css/targets/html/legacy/wide/navbar_wide.scss",
    "chars": 756,
    "preview": "@use '../default/navbar_default.css';\n\n\n:root {\n  --nav-background-color: #ededed;\n}\n\n.pretext .ptx-navbar {\n  max-width"
  },
  {
    "path": "css/targets/html/legacy/wide/shell_wide.scss",
    "chars": 7263,
    "preview": "@use '../default/shell_default.css';\n\n:root {\n  --content-margin: 32px;\n  --content-width: 750px;\n  --content-width-wide"
  },
  {
    "path": "css/targets/html/legacy/wide/style_wide.scss",
    "chars": 4098,
    "preview": "@use '../default/style_default.css';\n\n/* handle margin of articles that items might be nested inside */\n/* first change "
  },
  {
    "path": "css/targets/html/legacy/wide/theme-wide.scss",
    "chars": 511,
    "preview": "/*! Theme: wide-legacy */\n// Imports in this file should be relative to css root\n@use 'legacy/pretext.css';\n@use 'legacy"
  },
  {
    "path": "css/targets/html/legacy/wide/toc_wide.scss",
    "chars": 510,
    "preview": "@use '../default/toc_default';\n\n.pretext .ptx-sidebar {\n  display: none;\n  width: 200px;\n  position: sticky;\n  top: 36px"
  },
  {
    "path": "css/targets/html/salem/_chunks-salem.scss",
    "chars": 2922,
    "preview": "// Standard collection of chunks. This file should only be modified\n// to fix bugs or improve the default-modern theme. "
  },
  {
    "path": "css/targets/html/salem/_heading-tweaks.scss",
    "chars": 144,
    "preview": "// underlines to headings\n@use 'components/elements/extras/heading-underlines';\n\n.hide-type .codenumber:not(:empty)::aft"
  },
  {
    "path": "css/targets/html/salem/_other-widen.scss",
    "chars": 596,
    "preview": "// --------------------------------------------------------------------------\n// Flexible / centered widening of other c"
  },
  {
    "path": "css/targets/html/salem/_parts-salem.scss",
    "chars": 2052,
    "preview": "// Produces a centered \"page\" with borders and centered banner\n// TOC will be an initially hidden overlay\n\n$sidebar-widt"
  },
  {
    "path": "css/targets/html/salem/_rs-widen.scss",
    "chars": 3142,
    "preview": "// --------------------------------------------------------------------------\n// Flexible / centered widening of rs elem"
  },
  {
    "path": "css/targets/html/salem/_sizing-globals.scss",
    "chars": 1102,
    "preview": "// This file can be @use'd with overrides once\n// Then future @uses will get those overrides instead of the values liste"
  },
  {
    "path": "css/targets/html/salem/theme-salem.scss",
    "chars": 2903,
    "preview": "/*! Theme: salem */\n// A theme focused on displaying wide content gracefully\n\n// Current maintainer: Andrew Scholer\n\n// "
  },
  {
    "path": "css/targets/html/tacoma/_chunks-minimal.scss",
    "chars": 1415,
    "preview": "$border-radius: 8px !default;\n\n// One stop include for default style content blocks\n@use 'components/chunks/asides-basic"
  },
  {
    "path": "css/targets/html/tacoma/_customization.scss",
    "chars": 546,
    "preview": "// more generous spacing for sections/articles\n\n@use 'components/page-parts/extras/toc-expand-chevrons';\n\n// used to exp"
  },
  {
    "path": "css/targets/html/tacoma/_parts-tacoma.scss",
    "chars": 1621,
    "preview": "// Left aligned \"page\" with limited width, beyond which it is centered\n\n$max-width: 1000px !default;\n$sidebar-width: 240"
  },
  {
    "path": "css/targets/html/tacoma/theme-tacoma.scss",
    "chars": 1331,
    "preview": "/*! Theme: tacoma */\n// A theme focused on a minimal distraction reading environment\n\n// Current maintainer: Andrew Scho"
  },
  {
    "path": "css/targets/print-worksheet/_chunks-worksheet.scss",
    "chars": 1644,
    "preview": "// Standard collection of chunks. This file should only be modified\n// to fix bugs or improve the default-modern theme. "
  },
  {
    "path": "css/targets/print-worksheet/print-worksheet.scss",
    "chars": 9306,
    "preview": "/*! Theme: print-worksheet */\n\n// Used for print versions of worksheets (including their previews) for all themes\n\n// Fi"
  },
  {
    "path": "css/targets/revealjs/reveal.scss",
    "chars": 2712,
    "preview": "/*! Theme: reveal */\n\n// Tip: to build just this file directly to a folder for testing, do something like:\n// npm run bu"
  },
  {
    "path": "doc/guide/COPYING",
    "chars": 23629,
    "preview": "                   PreTeXt Guide\n                        by\n  Robert A. Beezer, David Farmer, Alex Jordan, Mitchel T. Ke"
  },
  {
    "path": "doc/guide/README.md",
    "chars": 916,
    "preview": "# The PreTeXt Guide\n\nPDF and HTML versions of this guide are available at the [PreTeXt](https://pretextbook.org) site in"
  },
  {
    "path": "doc/guide/appendices/cli-transition.xml",
    "chars": 10125,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--         "
  },
  {
    "path": "doc/guide/appendices/cli-v1vsv2.xml",
    "chars": 8869,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--         "
  },
  {
    "path": "doc/guide/appendices/editors.xml",
    "chars": 64976,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--          "
  },
  {
    "path": "doc/guide/appendices/gfdl-pretext.xml",
    "chars": 26537,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--********************************************************************\nCopyrig"
  },
  {
    "path": "doc/guide/appendices/git.xml",
    "chars": 2462,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--          "
  },
  {
    "path": "doc/guide/appendices/glossary.xml",
    "chars": 18302,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--          "
  },
  {
    "path": "doc/guide/appendices/journals-table.xml",
    "chars": 2311,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<table>\n  <title>Journals supported by PreTeXt</title>\n  <tabular>\n    <row heade"
  },
  {
    "path": "doc/guide/appendices/journals.xml",
    "chars": 1108,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--         "
  },
  {
    "path": "doc/guide/appendices/latex-conversion.xml",
    "chars": 3024,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!--   This file is part of the documentation of PreTeXt      -->\n<!--          "
  }
]

// ... and 877 more files (download for full content)

About this extraction

This page contains the full source code of the PreTeXtBook/pretext GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1077 files (65.9 MB), approximately 6.1M tokens, and a symbol index with 457 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!