@pretextbook/pretext-html 0.16.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/assets/upstream.json +2 -2
  2. package/assets/xsl/entities.ent +14 -1
  3. package/assets/xsl/latex/pretext-latex-texstyle.xsl +5 -2
  4. package/assets/xsl/localizations/README.md +1 -1
  5. package/assets/xsl/localizations/af-ZA.xml +5 -6
  6. package/assets/xsl/localizations/bg-BG.xml +5 -6
  7. package/assets/xsl/localizations/ca-ES.xml +5 -6
  8. package/assets/xsl/localizations/cs-CZ.xml +5 -6
  9. package/assets/xsl/localizations/de-DE.xml +108 -108
  10. package/assets/xsl/localizations/en-US.xml +18 -17
  11. package/assets/xsl/localizations/es-ES.xml +5 -6
  12. package/assets/xsl/localizations/fi-FI.xml +5 -6
  13. package/assets/xsl/localizations/fr-CA.xml +5 -6
  14. package/assets/xsl/localizations/fr-FR.xml +5 -6
  15. package/assets/xsl/localizations/hu-HU.xml +5 -6
  16. package/assets/xsl/localizations/it-IT.xml +7 -7
  17. package/assets/xsl/localizations/ku-CKB.xml +5 -6
  18. package/assets/xsl/localizations/nl-NL.xml +5 -6
  19. package/assets/xsl/localizations/pt-BR.xml +4 -5
  20. package/assets/xsl/localizations/pt-PT.xml +4 -5
  21. package/assets/xsl/localizations/zh-HANS.xml +5 -6
  22. package/assets/xsl/pretext-assembly.xsl +154 -29
  23. package/assets/xsl/pretext-beamer.xsl +112 -10
  24. package/assets/xsl/pretext-braille-preprint.xsl +22 -3
  25. package/assets/xsl/pretext-common.xsl +117 -42
  26. package/assets/xsl/pretext-epub.xsl +74 -87
  27. package/assets/xsl/pretext-fo.xsl +115 -41
  28. package/assets/xsl/pretext-html.xsl +333 -102
  29. package/assets/xsl/pretext-latex-classic.xsl +48 -35
  30. package/assets/xsl/pretext-latex-common.xsl +160 -98
  31. package/assets/xsl/pretext-latex.xsl +12 -10
  32. package/assets/xsl/pretext-markdown.xsl +5 -3
  33. package/assets/xsl/pretext-numbers.xsl +28 -2
  34. package/assets/xsl/pretext-revealjs.xsl +44 -2
  35. package/assets/xsl/pretext-runestone-static.xsl +27 -4
  36. package/assets/xsl/pretext-runestone.xsl +112 -0
  37. package/assets/xsl/pretext-text.xsl +21 -14
  38. package/assets/xsl/publisher-variables.xsl +187 -47
  39. package/assets/xsl/support/extract-math.xsl +22 -2
  40. package/assets/xsl/support/package-math.xsl +9 -8
  41. package/assets/xsl/utilities/report-publisher-variables.xsl +4 -0
  42. package/assets/xsl-bundle.json +1 -1
  43. package/dist/{cli-ox-z2TCZ.js → cli-DzlCZymu.js} +4 -4
  44. package/dist/cli.js +1 -1
  45. package/dist/html-static.d.ts +2 -2
  46. package/dist/index.browser.js +5 -5
  47. package/dist/index.js +1 -1
  48. package/package.json +1 -1
@@ -2094,7 +2094,7 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
2094
2094
  </xsl:template>
2095
2095
 
2096
2096
  <!-- REMARK-LIKE, COMPUTATION-LIKE, DEFINITION-LIKE, SOLUTION-LIKE, objectives (xref-content), outcomes (xref-content), EXAMPLE-LIKE, PROJECT-LIKE, OPENPROBLEM-LIKE, exercise (inline), task (xref-content), fn (xref-content), biblio/note (xref-content)-->
2097
- <!-- E.g. Corollary 4.1 (Leibniz, Newton). The fundamental theorem of calculus. -->
2097
+ <!-- E.g. Corollary 4.1 The fundamental theorem of calculus. (Leibniz, Newton, [3]) -->
2098
2098
  <xsl:template match="*" mode="heading-full">
2099
2099
  <xsl:param name="b-make-link" select="false()"/>
2100
2100
  <xsl:param name="heading-level"/>
@@ -2115,28 +2115,53 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
2115
2115
  <xsl:value-of select="$the-number"/>
2116
2116
  </span>
2117
2117
  </xsl:if>
2118
- <!-- -->
2119
- <xsl:if test="creator and (&THEOREM-FILTER; or &AXIOM-FILTER;)">
2120
- <xsl:call-template name="space-styled"/>
2121
- <span class="creator">
2122
- <xsl:text>(</xsl:text>
2123
- <xsl:apply-templates select="." mode="creator-full"/>
2124
- <xsl:text>)</xsl:text>
2125
- </span>
2118
+ <!-- The attribution of a mathematical block: creator and -->
2119
+ <!-- origins, one parenthesized group after the title -->
2120
+ <xsl:variable name="b-attribution" select="(creator or origins) and (&THEOREM-FILTER; or &AXIOM-FILTER; or &DEFINITION-FILTER; or &OPENPROBLEM-FILTER;)"/>
2121
+ <!-- A period after the number only when nothing follows it: a -->
2122
+ <!-- title carries its own punctuation, and an attribution -->
2123
+ <!-- follows with none, exactly as in the LaTeX conversion -->
2124
+ <xsl:if test="not(title) and not($b-attribution)">
2125
+ <xsl:call-template name="period-styled"/>
2126
2126
  </xsl:if>
2127
- <!-- A period now, no matter which of 4 combinations we have above-->
2128
- <xsl:call-template name="period-styled"/>
2129
- <!-- A title carries its own punctuation -->
2130
2127
  <xsl:if test="title">
2131
2128
  <xsl:call-template name="space-styled"/>
2132
2129
  <span class="title">
2133
2130
  <xsl:apply-templates select="." mode="title-full"/>
2134
2131
  </span>
2135
2132
  </xsl:if>
2133
+ <xsl:if test="$b-attribution">
2134
+ <xsl:call-template name="space-styled"/>
2135
+ <span class="attribution">
2136
+ <xsl:text>(</xsl:text>
2137
+ <xsl:apply-templates select="." mode="attribution-full"/>
2138
+ <xsl:text>)</xsl:text>
2139
+ </span>
2140
+ </xsl:if>
2136
2141
  </xsl:with-param>
2137
2142
  </xsl:apply-templates>
2138
2143
  </xsl:template>
2139
2144
 
2145
+ <!-- Within the attribution, the creator and the origins each get a -->
2146
+ <!-- span, so a stylesheet can address the name and the citations -->
2147
+ <!-- separately; the text and the commas come from the common -->
2148
+ <!-- versions of these modes -->
2149
+ <xsl:template match="&THEOREM-LIKE;|&AXIOM-LIKE;|&DEFINITION-LIKE;|&OPENPROBLEM-LIKE;" mode="creator-full">
2150
+ <xsl:if test="creator">
2151
+ <span class="creator">
2152
+ <xsl:apply-imports/>
2153
+ </span>
2154
+ </xsl:if>
2155
+ </xsl:template>
2156
+
2157
+ <xsl:template match="&THEOREM-LIKE;|&AXIOM-LIKE;|&DEFINITION-LIKE;|&OPENPROBLEM-LIKE;" mode="origins-full">
2158
+ <xsl:if test="origins">
2159
+ <span class="origins">
2160
+ <xsl:apply-imports/>
2161
+ </span>
2162
+ </xsl:if>
2163
+ </xsl:template>
2164
+
2140
2165
  <xsl:template match="&FIGURE-LIKE;" mode="figure-caption">
2141
2166
  <xsl:param name="b-original"/>
2142
2167
 
@@ -3273,11 +3298,29 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
3273
3298
  <!-- The optionally born-hidden items can be panels of -->
3274
3299
  <!-- a sidebyside, where we should not be hiding them. -->
3275
3300
  <!-- A figure wrapping the sidebyside could be knowled -->
3276
- <!-- if they need to be hidden. -->
3277
- <xsl:template match="sidebyside/figure|sidebyside/table|sidebyside/listing|sidebyside/list" mode="is-hidden">
3301
+ <!-- if they need to be hidden. The same goes for a -->
3302
+ <!-- figure stacked within a figure. -->
3303
+ <xsl:template match="sidebyside/figure|sidebyside/table|sidebyside/listing|sidebyside/list|figure/stack/figure" mode="is-hidden">
3278
3304
  <xsl:value-of select="false()" />
3279
3305
  </xsl:template>
3280
3306
 
3307
+ <!-- A "stack" within a "figure" holds subfigures, which the -->
3308
+ <!-- enclosing figure captions as a whole. Each is an ordinary -->
3309
+ <!-- figure, subnumbered "(a)", "(b)", ... by the numbering -->
3310
+ <!-- routines, and never a knowl. The wrapper is a hook for -->
3311
+ <!-- styling the vertical arrangement. -->
3312
+ <xsl:template match="figure/stack">
3313
+ <xsl:param name="b-original" select="true()" />
3314
+ <xsl:param name="heading-level"/>
3315
+
3316
+ <div class="figure-stack">
3317
+ <xsl:apply-templates select="figure">
3318
+ <xsl:with-param name="b-original" select="$b-original" />
3319
+ <xsl:with-param name="heading-level" select="$heading-level"/>
3320
+ </xsl:apply-templates>
3321
+ </div>
3322
+ </xsl:template>
3323
+
3281
3324
  <!-- Overall enclosing element -->
3282
3325
  <!-- Natural HTML element -->
3283
3326
  <xsl:template match="&FIGURE-LIKE;" mode="body-element">
@@ -3872,7 +3915,7 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
3872
3915
  <xsl:value-of select="$knowl-exercise-worksheet = 'yes'"/>
3873
3916
  </xsl:template>
3874
3917
  <xsl:template match="reading-questions//exercise" mode="is-hidden">
3875
- <xsl:value-of select="$knowl-exercise-readingquestion = 'yes'"/>
3918
+ <xsl:value-of select="$knowl-exercise-reading = 'yes'"/>
3876
3919
  </xsl:template>
3877
3920
 
3878
3921
  <!-- Overall enclosing element -->
@@ -6347,7 +6390,10 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
6347
6390
  <!-- fill this box horizontally, with necessary vertical dimension -->
6348
6391
  <!-- to preserve the aspect ratio. This div is also used to -->
6349
6392
  <!-- provide vertical spacing from its surroundings. -->
6350
- <xsl:template match="image[not(ancestor::sidebyside)]">
6393
+ <!-- An image more deeply within a "sidebyside" (in an "exercise" -->
6394
+ <!-- panel or a list item, say) comes here too: the percentages -->
6395
+ <!-- refer to the available width where the image sits. -->
6396
+ <xsl:template match="image[not(&SBS-LAYOUT-FILTER;)]">
6351
6397
  <xsl:variable name="rtf-layout">
6352
6398
  <xsl:apply-templates select="." mode="layout-parameters" />
6353
6399
  </xsl:variable>
@@ -6380,7 +6426,7 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
6380
6426
  <!-- If the panel is a PTX "figure" then there will be -->
6381
6427
  <!-- an intermediate HTML "figure" which will not -->
6382
6428
  <!-- interfere with the panel's constraints -->
6383
- <xsl:template match="image[ancestor::sidebyside]">
6429
+ <xsl:template match="image[&SBS-LAYOUT-FILTER;]">
6384
6430
  <div class="image-box">
6385
6431
  <xsl:apply-templates select="." mode="image-inclusion" />
6386
6432
  </div>
@@ -8326,17 +8372,20 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
8326
8372
  <xsl:apply-templates select="." mode="effective-top"/>
8327
8373
  </xsl:variable>
8328
8374
 
8329
- <!-- a cell of a header row needs to be "th" -->
8330
- <!-- else the HTML mark up is "td" -->
8375
+ <!-- A nonempty cell of a header row needs to be "th". Empty cells -->
8376
+ <!-- are data cells, even when their row supplies headers. All other -->
8377
+ <!-- HTML table cells are "td". Note that "nbsp" looks like an element, -->
8378
+ <!-- but will render as whitespace. -->
8331
8379
  <xsl:variable name="header-row-elt">
8380
+ <xsl:variable name="b-has-contents" select="*[not(self::nbsp)] or normalize-space(.)"/>
8332
8381
  <xsl:choose>
8333
- <xsl:when test="parent::row/@header = 'yes'">
8382
+ <xsl:when test="$b-has-contents and parent::row/@header = 'yes'">
8334
8383
  <xsl:text>th</xsl:text>
8335
8384
  </xsl:when>
8336
- <xsl:when test="parent::row/@header = 'vertical'">
8385
+ <xsl:when test="$b-has-contents and parent::row/@header = 'vertical'">
8337
8386
  <xsl:text>th</xsl:text>
8338
8387
  </xsl:when>
8339
- <xsl:when test="$b-row-header">
8388
+ <xsl:when test="$b-has-contents and $b-row-header">
8340
8389
  <xsl:text>th</xsl:text>
8341
8390
  </xsl:when>
8342
8391
  <!-- "no" is other choice, or no attribute at all -->
@@ -12925,78 +12974,219 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
12925
12974
  </xsl:apply-templates>
12926
12975
  </h2>
12927
12976
  <div class="print-controls">
12928
- <div class="print-controls-toggles">
12929
- <xsl:apply-templates select="." mode="papersize-toggle"/>
12930
- <xsl:apply-templates select="." mode="printing-options"/>
12931
- </div>
12977
+ <xsl:apply-templates select="." mode="printing-options"/>
12932
12978
  <xsl:apply-templates select="." mode="print-button"/>
12933
12979
  </div>
12934
12980
  </div>
12935
12981
  </xsl:template>
12936
12982
 
12983
+ <!-- A row of the "Printing options" dialog, laid out like the text -->
12984
+ <!-- options below it: a label, then the choices -->
12937
12985
  <xsl:template match="*" mode="papersize-toggle">
12938
- <xsl:variable name="papersize">
12939
- <xsl:apply-templates select="." mode="type-name">
12940
- <xsl:with-param name="string-id" select="'papersize'"/>
12941
- </xsl:apply-templates>
12942
- </xsl:variable>
12943
- <form class="papersize-select" id="papersize-select">
12944
- <span class="name"><xsl:value-of select="$papersize"/></span>
12945
- <label>
12946
- <input type="radio" name="papersize" value="a4"/>A4
12947
- </label>
12948
- <label>
12949
- <input type="radio" name="papersize" value="letter"/>Letter
12950
- </label>
12951
- </form>
12986
+ <div class="print-option-row papersize-select" id="papersize-select" role="radiogroup" aria-labelledby="ptx-print-papersize-label">
12987
+ <span class="print-option-label" id="ptx-print-papersize-label">
12988
+ <xsl:call-template name="insert-symbol">
12989
+ <xsl:with-param name="name" select="'description'"/>
12990
+ </xsl:call-template>
12991
+ <span>
12992
+ <xsl:apply-templates select="." mode="type-name">
12993
+ <xsl:with-param name="string-id" select="'papersize'"/>
12994
+ </xsl:apply-templates>
12995
+ </span>
12996
+ </span>
12997
+ <span class="papersize-choices">
12998
+ <label>
12999
+ <input type="radio" name="papersize" value="a4"/>
13000
+ <span>A4</span>
13001
+ </label>
13002
+ <label>
13003
+ <input type="radio" name="papersize" value="letter"/>
13004
+ <span>Letter</span>
13005
+ </label>
13006
+ </span>
13007
+ </div>
12952
13008
  </xsl:template>
12953
13009
 
13010
+ <!-- The options for a print preview outnumber what fits in the -->
13011
+ <!-- header, so they live in a modal dialog, opened by a button -->
13012
+ <!-- carrying the same icon as the readability settings of an -->
13013
+ <!-- ordinary page. That dialog is in the navbar, which a print -->
13014
+ <!-- preview hides, so this one is a separate dialog with ids of -->
13015
+ <!-- its own. pretext-printouts.js wires it up with PTXDialog. -->
12954
13016
  <xsl:template match="*" mode="printing-options">
12955
- <details class="print-options">
12956
- <summary>
12957
- <xsl:apply-templates select="." mode="type-name">
12958
- <xsl:with-param name="string-id" select="'printing-options'"/>
12959
- </xsl:apply-templates>
12960
- </summary>
13017
+ <xsl:variable name="printing-options-localization">
13018
+ <xsl:apply-templates select="." mode="type-name">
13019
+ <xsl:with-param name="string-id" select="'printing-options'"/>
13020
+ </xsl:apply-templates>
13021
+ </xsl:variable>
13022
+ <xsl:variable name="close-localization">
13023
+ <xsl:apply-templates select="." mode="type-name">
13024
+ <xsl:with-param name="string-id" select="'close'"/>
13025
+ </xsl:apply-templates>
13026
+ </xsl:variable>
13027
+ <button type="button" id="ptx-print-options-button" class="ptx-print-options-button button" title="{$printing-options-localization}">
13028
+ <xsl:call-template name="insert-symbol">
13029
+ <xsl:with-param name="name" select="'match_case'"/>
13030
+ </xsl:call-template>
13031
+ <span class="name">
13032
+ <xsl:value-of select="$printing-options-localization"/>
13033
+ </span>
13034
+ </button>
13035
+ <dialog class="ptx-dialog ptx-print-options-popup" id="ptx-print-options-popup">
13036
+ <div class="ptx-print-options-popup-controls">
13037
+ <h2 class="heading">
13038
+ <xsl:value-of select="$printing-options-localization"/>
13039
+ </h2>
13040
+ <button type="button" class="ptx-print-options-close-button button" id="ptx-print-options-close-button" title="{$close-localization}">
13041
+ <xsl:call-template name="insert-symbol">
13042
+ <xsl:with-param name="name" select="'close'"/>
13043
+ </xsl:call-template>
13044
+ </button>
13045
+ </div>
13046
+ <div class="ptx-print-options-group">
13047
+ <xsl:apply-templates select="." mode="papersize-toggle"/>
13048
+ <xsl:apply-templates select="." mode="print-text-options"/>
13049
+ </div>
12961
13050
  <xsl:apply-templates select="." mode="hide-solutions"/>
12962
13051
  <xsl:apply-templates select="." mode="header-footer-toggles"/>
12963
13052
  <xsl:apply-templates select="." mode="highlight-workspace-toggle"/>
12964
- </details>
13053
+ <!-- Back to the standard for everything above but the paper size, -->
13054
+ <!-- which is a fact about the reader's printer, not a preference -->
13055
+ <div class="ptx-print-options-group">
13056
+ <button type="button" class="ptx-print-options-reset-button button" id="ptx-print-options-reset-button">
13057
+ <xsl:call-template name="insert-symbol">
13058
+ <xsl:with-param name="name" select="'restart_alt'"/>
13059
+ </xsl:call-template>
13060
+ <span class="name">
13061
+ <xsl:apply-templates select="." mode="type-name">
13062
+ <xsl:with-param name="string-id" select="'reset-all'"/>
13063
+ </xsl:apply-templates>
13064
+ </span>
13065
+ </button>
13066
+ </div>
13067
+ </dialog>
13068
+ </xsl:template>
13069
+
13070
+ <!-- Size of the type, space between lines and between letters, -->
13071
+ <!-- and typeface of the printout. Each menu's standard is the -->
13072
+ <!-- empty value, meaning "leave as styled", so print-worksheet -->
13073
+ <!-- .css alone says what the standard is. Page breaks are -->
13074
+ <!-- planned at the standard, so they do not depend on a reader's -->
13075
+ <!-- choices; the Javascript applies any other choice afterward, -->
13076
+ <!-- spilling text that no longer fits onto extra pages. Sizes -->
13077
+ <!-- are in points and line spacing is a CSS line-height, while -->
13078
+ <!-- print-worksheet.css maps a letter spacing or font value to -->
13079
+ <!-- its spacing or typeface. -->
13080
+ <!-- -->
13081
+ <!-- The words below are literal English rather than localization -->
13082
+ <!-- string-ids. xsl/localizations is for strings that reach -->
13083
+ <!-- more than one output format, and this is an HTML-only -->
13084
+ <!-- control surface; a Javascript-side translation layer will -->
13085
+ <!-- eventually localize it. -->
13086
+ <xsl:template match="*" mode="print-text-options">
13087
+ <div class="print-option-row">
13088
+ <label for="ptx-print-font-size">
13089
+ <xsl:call-template name="insert-symbol">
13090
+ <xsl:with-param name="name" select="'format_size'"/>
13091
+ </xsl:call-template>
13092
+ <span>Font size</span>
13093
+ </label>
13094
+ <select id="ptx-print-font-size">
13095
+ <option value="10">10 pt</option>
13096
+ <option value="" selected="selected">11 pt (standard)</option>
13097
+ <option value="12">12 pt</option>
13098
+ <option value="14">14 pt</option>
13099
+ <option value="16">16 pt</option>
13100
+ <option value="18">18 pt</option>
13101
+ <option value="20">20 pt</option>
13102
+ </select>
13103
+ </div>
13104
+ <div class="print-option-row">
13105
+ <label for="ptx-print-line-spacing">
13106
+ <xsl:call-template name="insert-symbol">
13107
+ <xsl:with-param name="name" select="'format_line_spacing'"/>
13108
+ </xsl:call-template>
13109
+ <span>Line spacing</span>
13110
+ </label>
13111
+ <select id="ptx-print-line-spacing">
13112
+ <option value="1.15">1.15</option>
13113
+ <option value="" selected="selected">1.35 (standard)</option>
13114
+ <option value="1.5">1.5</option>
13115
+ <option value="1.75">1.75</option>
13116
+ <option value="2">2</option>
13117
+ <option value="2.5">2.5</option>
13118
+ </select>
13119
+ </div>
13120
+ <div class="print-option-row">
13121
+ <label for="ptx-print-letter-spacing">
13122
+ <xsl:call-template name="insert-symbol">
13123
+ <xsl:with-param name="name" select="'format_letter_spacing'"/>
13124
+ </xsl:call-template>
13125
+ <span>Letter spacing</span>
13126
+ </label>
13127
+ <select id="ptx-print-letter-spacing">
13128
+ <option value="" selected="selected">Standard</option>
13129
+ <option value="wide">Wide</option>
13130
+ <option value="wider">Wider</option>
13131
+ <option value="widest">Widest</option>
13132
+ </select>
13133
+ </div>
13134
+ <div class="print-option-row">
13135
+ <label for="ptx-print-font">
13136
+ <xsl:call-template name="insert-symbol">
13137
+ <xsl:with-param name="name" select="'font_download'"/>
13138
+ </xsl:call-template>
13139
+ <span>Font</span>
13140
+ </label>
13141
+ <select id="ptx-print-font">
13142
+ <option value="" selected="selected">Serif (standard)</option>
13143
+ <option value="sans-serif">Sans serif</option>
13144
+ <option value="hyperlegible">Atkinson Hyperlegible</option>
13145
+ <option value="lexend">Lexend</option>
13146
+ <option value="andika">Andika</option>
13147
+ </select>
13148
+ </div>
12965
13149
  </xsl:template>
12966
13150
 
12967
13151
  <!-- We provide a checkboxes to hide hints, answers, and solution -->
12968
13152
  <!-- but only if the worksheet contains these elements. -->
12969
13153
  <xsl:template match="*" mode="hide-solutions">
12970
13154
  <xsl:if test=".//solution or .//answer or .//hint">
12971
- <div class="hide-solutions-options">
13155
+ <div class="ptx-print-options-group hide-solutions-options">
12972
13156
  <xsl:if test=".//hint">
12973
13157
  <div class="hide-option">
12974
13158
  <label for="hide-hint-checkbox">
12975
- <xsl:apply-templates select="." mode="type-name">
12976
- <xsl:with-param name="string-id" select="'hide-hints'"/>
12977
- </xsl:apply-templates>
13159
+ <input type="checkbox" id="hide-hint-checkbox"/>
13160
+ <span>
13161
+ <xsl:apply-templates select="." mode="type-name">
13162
+ <xsl:with-param name="string-id" select="'hide-hints'"/>
13163
+ </xsl:apply-templates>
13164
+ </span>
12978
13165
  </label>
12979
- <input type="checkbox" id="hide-hint-checkbox"/>
12980
13166
  </div>
12981
13167
  </xsl:if>
12982
13168
  <xsl:if test=".//answer">
12983
13169
  <div class="hide-option">
12984
13170
  <label for="hide-answer-checkbox">
12985
- <xsl:apply-templates select="." mode="type-name">
12986
- <xsl:with-param name="string-id" select="'hide-answers'"/>
12987
- </xsl:apply-templates>
13171
+ <input type="checkbox" id="hide-answer-checkbox"/>
13172
+ <span>
13173
+ <xsl:apply-templates select="." mode="type-name">
13174
+ <xsl:with-param name="string-id" select="'hide-answers'"/>
13175
+ </xsl:apply-templates>
13176
+ </span>
12988
13177
  </label>
12989
- <input type="checkbox" id="hide-answer-checkbox"/>
12990
13178
  </div>
12991
13179
  </xsl:if>
12992
13180
  <xsl:if test=".//solution">
12993
13181
  <div class="hide-option">
12994
13182
  <label for="hide-solution-checkbox">
12995
- <xsl:apply-templates select="." mode="type-name">
12996
- <xsl:with-param name="string-id" select="'hide-solutions'"/>
12997
- </xsl:apply-templates>
13183
+ <input type="checkbox" id="hide-solution-checkbox"/>
13184
+ <span>
13185
+ <xsl:apply-templates select="." mode="type-name">
13186
+ <xsl:with-param name="string-id" select="'hide-solutions'"/>
13187
+ </xsl:apply-templates>
13188
+ </span>
12998
13189
  </label>
12999
- <input type="checkbox" id="hide-solution-checkbox"/>
13000
13190
  </div>
13001
13191
  </xsl:if>
13002
13192
  </div>
@@ -13004,7 +13194,7 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
13004
13194
  </xsl:template>
13005
13195
 
13006
13196
  <xsl:template match="*" mode="header-footer-toggles">
13007
- <div class="header-footer-options">
13197
+ <div class="ptx-print-options-group header-footer-options">
13008
13198
  <div class="header-option">
13009
13199
  <span class="title">
13010
13200
  <xsl:apply-templates select="." mode="type-name">
@@ -13012,16 +13202,20 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
13012
13202
  </xsl:apply-templates>
13013
13203
  </span>
13014
13204
  <label>
13015
- <xsl:apply-templates select="." mode="type-name">
13016
- <xsl:with-param name="string-id" select="'first-page'"/>
13017
- </xsl:apply-templates>
13018
13205
  <input type="checkbox" id="print-first-page-header-checkbox" checked="checked"/>
13206
+ <span>
13207
+ <xsl:apply-templates select="." mode="type-name">
13208
+ <xsl:with-param name="string-id" select="'first-page'"/>
13209
+ </xsl:apply-templates>
13210
+ </span>
13019
13211
  </label>
13020
13212
  <label>
13021
- <xsl:apply-templates select="." mode="type-name">
13022
- <xsl:with-param name="string-id" select="'running'"/>
13023
- </xsl:apply-templates>
13024
13213
  <input type="checkbox" id="print-running-header-checkbox" checked="checked"/>
13214
+ <span>
13215
+ <xsl:apply-templates select="." mode="type-name">
13216
+ <xsl:with-param name="string-id" select="'running'"/>
13217
+ </xsl:apply-templates>
13218
+ </span>
13025
13219
  </label>
13026
13220
  </div>
13027
13221
  <div class="footer-option">
@@ -13031,29 +13225,35 @@ along with PreTeXt. If not, see <http://www.gnu.org/licenses/>.
13031
13225
  </xsl:apply-templates>
13032
13226
  </span>
13033
13227
  <label>
13034
- <xsl:apply-templates select="." mode="type-name">
13035
- <xsl:with-param name="string-id" select="'first-page'"/>
13036
- </xsl:apply-templates>
13037
13228
  <input type="checkbox" id="print-first-page-footer-checkbox" checked="checked"/>
13229
+ <span>
13230
+ <xsl:apply-templates select="." mode="type-name">
13231
+ <xsl:with-param name="string-id" select="'first-page'"/>
13232
+ </xsl:apply-templates>
13233
+ </span>
13038
13234
  </label>
13039
13235
  <label>
13040
- <xsl:apply-templates select="." mode="type-name">
13041
- <xsl:with-param name="string-id" select="'running'"/>
13042
- </xsl:apply-templates>
13043
13236
  <input type="checkbox" id="print-running-footer-checkbox" checked="checked"/>
13237
+ <span>
13238
+ <xsl:apply-templates select="." mode="type-name">
13239
+ <xsl:with-param name="string-id" select="'running'"/>
13240
+ </xsl:apply-templates>
13241
+ </span>
13044
13242
  </label>
13045
13243
  </div>
13046
13244
  </div>
13047
13245
  </xsl:template>
13048
13246
 
13049
13247
  <xsl:template match="*" mode="highlight-workspace-toggle">
13050
- <div class="highlight-workspace-option">
13248
+ <div class="ptx-print-options-group highlight-workspace-option">
13051
13249
  <label for="highlight-workspace-checkbox">
13052
- <xsl:apply-templates select="." mode="type-name">
13053
- <xsl:with-param name="string-id" select="'highlight-workspace'"/>
13054
- </xsl:apply-templates>
13250
+ <input type="checkbox" id="highlight-workspace-checkbox"/>
13251
+ <span>
13252
+ <xsl:apply-templates select="." mode="type-name">
13253
+ <xsl:with-param name="string-id" select="'highlight-workspace'"/>
13254
+ </xsl:apply-templates>
13255
+ </span>
13055
13256
  </label>
13056
- <input type="checkbox" id="highlight-workspace-checkbox"/>
13057
13257
  </div>
13058
13258
  </xsl:template>
13059
13259
 
@@ -13949,15 +14149,21 @@ TODO:
13949
14149
  </a>
13950
14150
  </xsl:template>
13951
14151
 
14152
+ <!-- The Runestone Academy and MathJax logos are in the page, so they -->
14153
+ <!-- appear when a reader is offline. Each is a PNG, sized for a -->
14154
+ <!-- high-resolution display of its place in the footer (96 pixels -->
14155
+ <!-- high), and reduced to 128 colors. Sources: -->
14156
+ <!-- https://runestone.academy/runestone/static/images/RAIcon_cropped.png -->
14157
+ <!-- https://www.mathjax.org/badge/badge-square-2.png -->
13952
14158
  <xsl:template name="runestone-link">
13953
14159
  <a class="runestone-link" href="https://runestone.academy" title="Runestone Academy">
13954
- <img class="logo" src="https://runestone.academy/runestone/static/images/RAIcon_cropped.png" alt="Runstone Academy logo"/>
14160
+ <img class="logo" alt="Runestone Academy logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHYAAABgCAMAAAD/9nalAAABgFBMVEXqZAYScdXkjhrZKQDpVQvsjRF6aXFYYJFnkJevKwCcRzQxbbGHT1nKLwDeQQo/P38AJP94jYKZmWbhKgD/sBHMmWYAAAABfvYBhP0AfvzSPQr1og/yhwvrRgoAAP/+fgD0lg3/AAAAffUAqv8A///0eAoAfvb1pA4AVf8AfvYAffYAfvb0Rgr8qQPaQAoAffb1Zwq+PgD3WAr//wDGNgXzRgnyhAoAgPrJOQoAh/v2pAwAhfn+VQDyhgkAgfz1pQ4AhfwAg/z1pQ0Ah/oAf7+6NgrSKwDrRgnMOQfLOguqVQDxJAD5VwnyeAn0mg35PQHoRgr0oQ71Zwnyegn0mg0AlP/IOAjzmAwAaP/oJgDpRAvxHQDmRQoAVap/AAC2OBG/fwDHOQr1WAn3VgnyeAn0lgzdQAryiQrEOAnyaQkAkP8BkP/xRwf1eQnylgzaJwDUQg75Zwj1aAn0dwnxmRDxoA4Af38Alf/1WQnyiArxmw7/ugN/fwDTQA/anQD0Ugr9ymCvAAAAgHRSTlMhDVAaUyMOGB0HGhgZhrAEB0oFYP8FAPz9B/z8/vwBA/0BLgMB/NCNA09vr3MF/I39Bf0Bj4p10a0TcC0EirBRbo8uTwSPb08S0AMvjY0QB9GrkHWvLm7MB02sLC8DAnEEUm2rVJHTri9zSP8O0E9YcK/RrXPWAgXMzS4GAokHWscQg/MAAArDSURBVHjavZqJW9rKGodj957l7nfIFEkMRExYpAiCyiIULaJVsa51qbVu97THLlq7ntP+6+ebSQIzkwSw2js+T60KefP75lsnSKjHpWP4B4fD4XH4HsHockvq8XWEE67KgUAgWq6EETJ2/h9YjHAlL7dWCsBKRP/R2AgKAyzgLPh/uUB+vfNDsRgVGKgNzlfobr//YVgd4zxPtclVsDUyDOXHYCMo7qaykqf0H4CNIFN2A8mi38smkC/qXt2xCsZRWWAKkmMAVq4YO4ViPCafMsMYj9OvcNiMpcguY4SvFIsxZtXJcmxcfMmHWvllvg/jq8RGUIql5sF5sYF1RdFhvcc4giPwKlMuo4hydViDJApGaxh9cF1diZBXVS9i5u5YNnhkE214vuwDcGPgBleE5YNHjvsq2gDHi8FNXglW0dn8JMsFxfANM5SXwwq+EizmgkeOIr2jE8R7ltsNy7lxpZPXkBRqosjVYDmHCnfCGkpBjm5g5fJYBbF5ES7aMQUaF5DbEauj8YDM+jF7TS1tLa2NBbm4N7lSZxtz2FiXhLBD5eLLYxUmauUAu7UamtnbW1u7kahLSGN3F2P9sliuvsMVGfupaCx0L0TWKEoz+ftlrKfd7YTFOmfjFCP2KZq5B2t4OBRq/t6Si3WoVuO9lCKp96hlbZxGaxRL5NZRsS039jKFLofFfPGJspumFRu2WGLlFlYx9DjcnnEJrCLkCtaPZ9H/7rWwobaV6a3me/Aqqdd8HMBK+2JFlHVMHAqNfNMWmZxhQnxvKN+L5U1MxEbY6CFiQ3+rU+w++DV7t+DNH74TK1JlVqztUKFtNEqwI8W2lck7q92ThuRL5QYBTiyEzxihHkmzdUK9/xwtsi0OcMERlAtjFReVy7Wa5VChN0idaQJ25GNGY99toArUSOM71Jr8qMVXlrTtUNvgWqNAHbkvsbtLuGaXjk7yHAOqApWvPSjdoDZGT4tom2Ifs1amnVW4c+GQunXG1J+4hFdEe9TGCZKMix+Bev9U1dzRZ3aws+RRdsKCVuECs9ShhocXwbUW0SOCHTxoZyqrUht94Pz+aUPqPlZCDWAb4KdO0JL9LCKJYudR0iUXsrPRM5Z0gDw1rnNjhhO0dVrwtMWP9wE7qCLezLoC1ct/HpO6jpV5rHAHBdrThm1jAgIrU+yBprrK18tYz1hxhpbFgmJXAag7s1a5lyj2DKnuNAeNgdITVlFwgMeKd+wErVNlteLpIGDByqq72TX9xiKp4wztilgwbJqKPZqxN1NFjwE62J9zYRXTf2ZyqY3KgolFsXtUbKuDAitT7CeUcbWdsq9TSUJjzNvYPTxaVWA4JFlbS/T/cUKw/Te9rdwLdoePHqjtQiFxqsDRrNbuIZf7gTpQcmNjrj3yxk7xfiy7uk8raIdDCe33YnpxcVElSyJi+z9JmubWMO49v0idekXo2sQ33W3YxYddJ0DtH7gmZCo6QfkMRVKHxOjeWacKNNF2vf7t+fPnv8Fanh+k2JKYIMlw4pMxRJdiJzyua2OqACk+zRFS32mmGOy3sAMLgjNbm9sdq6CNqOxXAtqt2zC0qImQjaVcugZeCQmSZLyo9+ZK/vHj7rMdh9qEtyVGWmod7Irgy5hcznsUl4Q8yjqULpZLDTXsxJimhXaEE0us/IfLeGZ3rMHGj9sbnCpAxgCtiPbv8zYeCL5zyY3Lqe5YLmzd5nGqAC0+mirtszYGscF1l0+l5KiidDdyuxDIUfFUXEN37zHFR0XFU97GAwOfebm0imL0viu2nS3c1kk7QVt0glg6ZcWC3CEeS3zFO2FIftnC/XLVrgKt4lOkxYcRGzxf4HsbRY96b67kcwxFjIOF2mMNl5AYHUlJJPHY4AM+UxHzxb2O7oR00coWED6KV9CCjZnJQ0UHDBWwQzyW9oPYgyv5JCmwjWBjLW0FbYKdAEjVY8QGg194Z9ZpNZjqiGWTlCtqraAdJjbWuA0vDbTFBoOT2jPeypAf+9zTnyQ6noOtCZnRGeA3eWcFCnDb2CVerULkepwZ+WILaMezCiTax1B0ZYqZ4zY1GBQSJC0H7hNByeeIUVTrVAFIjE+FuMqo6wx2QkiQBop7HJFJPuVWTOGaHbSbrdaN2d6b6y1q8FxMkOSBDharil+WEqJcdRyqrqVdbplENweCDhZC1111XWEhVKCC7N2XO1WAPYNiuZ+DrTUkdpAk92HhKYJfmZejbFegITtoR1Haq0dR0asW9vyL5p4hxZlT8jm25o/K7VnAOq7wWl8Y7mexlSPH6sJDE1+1XE6zB/hQc8ZvTv6KJtpWFrGK66GJX3fBYa0BftjXxpadhxzugnscikMeMFxYO7uzngz9vC4ELVt8XAvS1ZKNnUTP/J8RZTKsWlVNZpASYSoQs7fabGOYuHFTlMGlK/WLxf3Pkmhl0BOFHimiZVSVUat+XqB/TLY/cMB5sjY7dq9xdNSs+ziUY+aFpeD5+bk7hCCGanL+zi0abLQToNjkxNDQxORnBf0jRR+3e/TmM+mZmbtdjk3BFMkvX79+dW+A+q9bUXkD3ZwE0CS5KYqdPbj2ivxmaOLBnVg8StE1LktpzL8duBkHzyKf0Z/vXKPaXh1I5O+Wka/lSvPLwCZ/mbj2z5qZimP1v0nm/RpZ3Z8BZDT4ciGTk/TCrw6W50u5m6REUexiIlG/cZDLlZaXc7l39K4eLFhpL6n2APP0bNW664UHxIzvcrnlUi53cKOeqNt7OzX19+16YnQ0kUjcACz8Nffu3RBlU9dQnyUzF2SqySSHJOvgW4JAvm3v9GE7gNamd3f34E4SwIahdZm+7vCQopMXlM0hD+mVln97TmXV93Z3s3uk6ZAQNmvh23NzTx5mpwH+JkEXYRPlBE3YUiu2e0NOEmSpBB4DRLre7O5OZ9eezF3vK9TCoDZFPqRSrlZWC7/MPfk3ha9Z8EePHs/Pw3sPD5d6kG0jkwS5QpHzjx+NWsTp6ezDJ3OLePVFtUziJCzRjtz6hEy+XK2t4p9AOIFn/3xDNsNmH66sUDZNexlxt1mVKyuUCEiw659Zizgzvlqr5m0OtKUSeSrg/GTDK7XVvpkWHN5N2I/nS8cEPdRy8mdqRkAurawclwiRIHkix4iPw6btkM/FxAMBEf6i8PN1gP+anR7LZi32/NnxsSXbkgu7Tb/ZyOMzS2Q2O0aIW0Cs2Bqd60ZTMfIhPslJRhjgkKBaydGCV0H57bmt1w/hSmNjm5ub+/tv354dr6+vLw3Zu02Q6+ufjs/e7u9vbsKrskTjT75EetgskSNkAzvPAnDBjJWjvHDib4XCLQofo3Bgn518IuwJijx5+9YijmUfzm39UnhRKXNEGYgFbD8lwobOlHmFfChHaSlPxaOi1am/bVF4o3HUbH48PTnp7z85/dhsHjWA+Hpr65ZIDATKKdMm6lOU6HXCqtufCKINbjjmAa/UCji9NUfZjWYzdNRoAHHu+u1CTSBG46maQ8TC4wrPx086hhtzhNdiqaiXv/Vd34IU8+vrres/g6uWAwLRDGOnPcf6RZ7f6syW+/jbi1UnAbSJ5YoZ7rOJEdzbob3HIzADT71v+5todZaYj8ccjTv+xJ6wHv5WMKvxqBP+TnAA0f6wmtGFeAFs29+Mlr9VUiTSAkw4okgvxAtjnedo2IF/CJsXJ9L1F+diDpU1L1tmAAAAAElFTkSuQmCC"/>
13955
14161
  </a>
13956
14162
  </xsl:template>
13957
14163
 
13958
14164
  <xsl:template name="mathjax-link">
13959
14165
  <a class="mathjax-link" href="https://www.mathjax.org" title="MathJax">
13960
- <img class="logo" src="https://www.mathjax.org/badge/badge-square-2.png" alt="MathJax logo"/>
14166
+ <img class="logo" alt="MathJax logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABgFBMVEUZlkYjHiBJpFaJu4h1s3cmIySYwpZnrGstmUvW5dOqy6ZGRkZaqWIAAAAhHB2307McFxk4oFA4NzfJ3MVRV1GIiYl2eHbl7eKhxp3B2L1HmVTh6t2qq6oVoUtpaGlOZ1G0tbSSl5M7RTowiUtNdlN+t4BwlnEUmkaNqYwAfwEIp09riGwVl0gUmkcUmkctnErr8ec5dEc8V0FOh1fExcMAf383VTo5ZkZdsWVAPj9BPkBdg2FammFVqlUUmkciIB9/f38Afz8A/wA+P0A+SEFIpllJpVpPqWYDhSUOm0YVqj8A/38A//8pnEYomkc6oVA6oE9gXV9ps3V//3////8QCw0AXAAAagAAfBAAixcAghQLiy4NjC4AjUYVlD8RkCwckjgqYDk/fz8qlTwillE8n1A2pFJAQT9fX2BAn1NCo1ZEq2Z/gYBnrW9rtHZ3wIaAf4CAin+BnX+eoKCAtn+/4b3//wDj8d8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACl+HKkAAAAgHRSTlP+//7+/v/+/v7+///+AP/+//7//v////7////+//7///////////9o/wMH/yyzzWn+/////wL/////////A0v/AgQB//+0y60pEgwCATFLssT/zQIB/wsMLwszFkwSDEps/wRtFr1j///cZMn/3Ln0////////Af8AAAAAAAAAADN3ZZgAAAl5SURBVHjatZqJd9q4FodtjMAgbIyQHSDYxkCAhJC1aSZtX+fNTJeZebMvb9/3fV/+/XclL5JsmfacSe85aU5S5/fdTVeSD4aT27cc57s//OPLL5qWZEdHR02ttSXrFdZovHj+249/wMUyM7LvN45z/Ku/tv7Tubg4YHbYyWzIbTwe97l1cxuNWqkVvuTsxvPzn3BBGQDE8y/6/wP1Q7COZKp+jmiV1C05uOZbL86LIIxM//3nfaZ+kJkKyePISYX7UjKV5DV7n546JwLwX+dnzc6BsHIUhT4A+nJ6BOGoVJ1m4xPn3RzwS2dtHQjvq/oFYdzX578K6LUb5847KeBL58cWFFUJQKs/zmusAZT7i7XUJyANgG877zdBcJ//KUC0UDVDVrl/edOegjgDvOgcdg6Ful5+LOm/JqD32TEAbpzzLkge5tapWuq+BiD0/62NAMpwY3z1o790Cv1OR68/VtdY63VKAPqNP/z6K8P5eb8keHjB/5UAr1jDuiZKARCC8b2XJf2LYRJR6s8K/bGqrwXURND4zU+N7/+tM1QACfE8jyCPTmX9/QHUAhofG+d9FRB4LkL+NAmQGQ3z9CgBiAq0rE17tdHoC8C58bJf0kfI+/1sOp1Nyde40NcF0LK2GIHhbW0JGo1PjT8NZcDGNJHp4SnYDHse7tcGYLU2GBGMCTiEV0c1ATQ+M3rDsdB/QDxkmibkfzYLkIu8oLbCrRWTxzhI/hWYaFsHGBhNEcGQJcg0OcGnkCtAbPpdvb5FmD6hLJuBZ271+gwwFhEMcQZA0EiIhe9FAOjqEkQR0/cCDjBdtNoDyId9Z5bpAwGcBwHkEUvxP99oWgnXh2aeQTvceVCHekC/ACQFABAu4YStdom1Yo/9L3geBQF24WlIUrvSQxzQ1wNMkxGI9zutPq8AqJouJNPjScXKIH0dACcgb8MyPxopS6y18ggmbppMhDiAtDUZKgE2KsCERnxk0n4rU5YAAQCgTNKjAiDrq4BhF5dCAAJCSXFIEYAYQYUVXwpArwrI22jc+UcpBMgSJFdMt2LKYQAoz0I/6QIAQBsAwmiJ4EKDeEFXGp/pkIMJRFylI8zHdYCuDIAkmWnVhG+muR2p07n1T0RUAA+ALwRVnwMkQn/cjWEVuwoDujFQpz8rAVa88DD4vl0uV3qAZN3+hpKUIQjIiy15A7aICoBFuQxgLn2OyfVbir4GAD9aq5gqDDaRk4LQbAVuvgpELyDqJwE2l68A8PUKvxhtthS5ouLIQ7GV52mLhD6bFqybYej5lJikreqXAWycpQMB/t0ESCIALVgx+fZS6DN5aKgomU0D/B6Ese1VAL2RAJRX1EbqWsQQmFJKvEd8CqUrERE4gMwSSnhbPS4lqAToVhYsDE2llmyyMZ9dPs/ZsAqmD8B58h6bixp9Bmh1a/Q5gW9sIgo+2lyXfyESJQ9mPsV868z0dYBROvH7o7I863gLe65bmh8QCshjf8adx9ygXI+bVX0OaKX63ao8I2yIOnUQ00d30ZQ5TzJ5VpRls7cX0NWoc8IqYluWcD6t64NpxDPP7Q55ZqzVlwHZKFNmAreAEZCY4OD81MeF82xrduv0GcBKAVXh3DZxEGRZgpkQzIazCAt10Hdz/X2Aen3LWtEg4J0P+aEHF8NU/lEWA/zSpb0afQGw9lkcBZ97KD1p+NA53G9FH6S0+gVgXwBNa4XTJCG21Wdpz7/n+kCoA1j7AuCn2qM48mmaokwWZemHonuZ/qChBzQYoCaA/FWLRSEENvn44AT5YnVBUPMnqRJYHWA0qneeW2yiIFsMsAw8VKwu+GHeK/TtQR2gtU+92aQYu1EQpY3Ej2N590NRhP82mB7Qspr73kFhGiGTZgDI0l3W/fwwNCn0OaASBACaVqu5x9owGEBaApBsuKn6XN42jIEGYO3Vj3zWinmK+IGSsPSwil+X/DfA7Cpgv34CznokkOcRWNq0k6p+icAA9epNWGFMn98CiHQ7ye9Bc0U/AyiEfQDQJ/6G6UMFAmpWDRaxRl8h7AFw/YQXk+mjyr6WE+yBKq8QagFtpp9wfU/VR6VDdcO2KwBB0AP4Wz3Q97k+Tm9h0gFJPlW6lGfIKJktAG2tsfxwfZf4Un3ZEY8oxwDkzieDin5BqANAfwZc33RhHcsHPHI9WWJTIaDYDsMaQg0gX1/5lVm6VPHWXypMhOa3i0GoJdRFMKd+riHSzxIUp5FP5nkQbJH4sMnNf7Eox2FzwEAXAMU+8pCmK7PhMxk0aEaAVe77fvLnCDa5+e3SNiTIoAbQXD4KdPog9jAbPvZgEBcxUJ8h/Igd+Nz5pSETGKBXtieZPhJXwXSQvm0uxfAUBA/7qUE7wLNzqacGAKjot9kRHbHiisMWctPx/2QgZsNgWWQpDcJP/o7ZCzOFUAU0nhCXH9G9Yj6L/SuVz2aPILgedB03ynoiDpU0la1HPZddA6Iof3uUHc+hxg1b6EM9CwIg7lJEZIJni72AxiSmNEbRrHixkL6bA9eu8smWDYcwNt8u7okI1iYvBHKvBnsBzK7xLCoaCcLmJywzLuTzNM9daUi5mEUBNwqykAGTyaQKuPKnyrWAFVkCiMUk70MmIIIELkXeZSgtt8mkipjMpwkp7wAFQMpweJsnKUsUYZPdjY0yoMRY0qkaQQpYViezrfrBEmXWAARj0niIpzNaAaDr6mBWQ0g3bNgkbD0gYwwYYOqXJ4WLNHPfWCC3OlJiGWBXjQOmpfdfyH1m6OxZ9RZqXkqAgQYweEgA4KsbPfgVavTDZTmVUGmpTbUAe4mS6VRaCenEWWgjWJQPHMi8lf9fC7Dn7KV0gpSt8SrUAux5KZXKtDPO9IAF3FZnMgDitg29XcqbR2manhk7PQAIhGLlvdpljb5hXxWHADbj53Imd8a6BgAErxh2iF3l6wJgBMRfwiD27VZZ6GvjNDSq4uLP+G4GX+iyXh8evZzDHGKPPSw1wqnx4S6s/bMFJdwvQuPFPn2OiOmzymPh7kPDWYd7/sxeXF8vFob9Cvn02eoJMlw7xkcnZ6Hxhiw8O/nIuNkbwjcErJ0bwzk+flMhhGfHxw4AnFPjjRBC49RhAOc7ztM3E8FTkOYfGnjHWd9/DKGxzj804DjvQgzhfes/FR97cJwT53QX3iMiDHfKBzcY4Xh9dl+IMDxbH2f6xYdnjh3ng/XuPhIVGrv1B1xQAbAgnJPT9e7sm8mf7danJ07uPtj/AWFeRaMe9pxOAAAAAElFTkSuQmCC"/>
13961
14167
  </a>
13962
14168
  </xsl:template>
13963
14169
 
@@ -14027,7 +14233,13 @@ TODO:
14027
14233
  <xsl:text>});&#xa;</xsl:text>
14028
14234
  </script>
14029
14235
  <!-- MathJax 4 CDN -->
14030
- <script defer="true">
14236
+ <script defer="true" data-pretext-mathjax="true">
14237
+ <!-- These scripts execute in document order, but their resources -->
14238
+ <!-- fetch independently. The CDN request can therefore fail before -->
14239
+ <!-- mathjax_startup.js has evaluated. -->
14240
+ <xsl:attribute name="onerror">
14241
+ <xsl:text>this.dataset.loadFailed = 'true';</xsl:text>
14242
+ </xsl:attribute>
14031
14243
  <xsl:attribute name="src">
14032
14244
  <xsl:text>https://cdn.jsdelivr.net/npm/mathjax@4/</xsl:text>
14033
14245
  <xsl:choose>
@@ -14543,7 +14755,7 @@ TODO:
14543
14755
  </xsl:template>
14544
14756
 
14545
14757
  <!-- Header information for favicon -->
14546
- <!-- Presently: needs two image files placeed in HTML output -->
14758
+ <!-- Presently: needs image files placed in HTML output -->
14547
14759
  <!-- Publisher file could be extended to allow for other schemes. -->
14548
14760
  <!-- See: https://realfavicongenerator.net/faq -->
14549
14761
  <!-- for one such option and ideas for others. -->
@@ -14553,24 +14765,34 @@ TODO:
14553
14765
  <!-- (pre-processor) phase, so we leave this in. Removal -->
14554
14766
  <!-- will require a sterner deprecation message that the -->
14555
14767
  <!-- current, gentle, reminder. -->
14556
- <xsl:if test="($favicon-scheme = 'simple') or $docinfo/html/favicon">
14557
- <!-- Expects publisher to provide both -->
14558
- <!-- favicon/favicon-32x32.png -->
14559
- <!-- favicon/favicon-16x16.png -->
14560
- <!-- in the external images directory -->
14561
- <xsl:variable name="res32">
14562
- <!-- empty when not using managed directories -->
14563
- <xsl:value-of select="$external-directory"/>
14564
- <xsl:text>favicon/favicon-32x32.png</xsl:text>
14565
- </xsl:variable>
14566
- <xsl:variable name="res16">
14567
- <!-- empty when not using managed directories -->
14568
- <xsl:value-of select="$external-directory"/>
14569
- <xsl:text>favicon/favicon-16x16.png</xsl:text>
14570
- </xsl:variable>
14571
- <link rel="icon" type="image/png" sizes="32x32" href="{$res32}"/>
14572
- <link rel="icon" type="image/png" sizes="16x16" href="{$res16}"/>
14573
- </xsl:if>
14768
+ <xsl:choose>
14769
+ <!-- All image references below are expected in the external -->
14770
+ <!-- images directory. -->
14771
+ <!-- $external-directory is empty when not using managed directories -->
14772
+ <xsl:when test="$favicon-scheme = 'svg'">
14773
+ <!-- Expects publisher to provide favicon/favicon.svg -->
14774
+ <xsl:variable name="favicon-svg">
14775
+ <xsl:value-of select="$external-directory"/>
14776
+ <xsl:text>favicon/favicon.svg</xsl:text>
14777
+ </xsl:variable>
14778
+ <link rel="icon" type="image/svg+xml" href="{$favicon-svg}"/>
14779
+ </xsl:when>
14780
+ <xsl:when test="($favicon-scheme = 'simple') or $docinfo/html/favicon">
14781
+ <!-- Expects publisher to provide both -->
14782
+ <!-- favicon/favicon-32x32.png -->
14783
+ <!-- favicon/favicon-16x16.png -->
14784
+ <xsl:variable name="res32">
14785
+ <xsl:value-of select="$external-directory"/>
14786
+ <xsl:text>favicon/favicon-32x32.png</xsl:text>
14787
+ </xsl:variable>
14788
+ <xsl:variable name="res16">
14789
+ <xsl:value-of select="$external-directory"/>
14790
+ <xsl:text>favicon/favicon-16x16.png</xsl:text>
14791
+ </xsl:variable>
14792
+ <link rel="icon" type="image/png" sizes="32x32" href="{$res32}"/>
14793
+ <link rel="icon" type="image/png" sizes="16x16" href="{$res16}"/>
14794
+ </xsl:when>
14795
+ </xsl:choose>
14574
14796
  </xsl:template>
14575
14797
 
14576
14798
  <!-- SCORM tracking script -->
@@ -14625,8 +14847,17 @@ TODO:
14625
14847
  <xsl:template name="fonts">
14626
14848
  <link rel="preconnect" href="https://fonts.googleapis.com"/>
14627
14849
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""/>
14628
- <!-- Material Symbols font used for symbols -->
14629
- <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
14850
+ <!-- Material Symbols font used for symbols, a copy placed with the -->
14851
+ <!-- other static files, so icons work offline (see fonts/README.md) -->
14852
+ <!-- CDN resources are online, so then use Google Fonts -->
14853
+ <xsl:choose>
14854
+ <xsl:when test="$b-cdn-resources">
14855
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" />
14856
+ </xsl:when>
14857
+ <xsl:otherwise>
14858
+ <link rel="stylesheet" href="_static/pretext/fonts/material-symbols-outlined.css" />
14859
+ </xsl:otherwise>
14860
+ </xsl:choose>
14630
14861
  <!-- Legacy themes need these fonts, modern ones load them on their own -->
14631
14862
  <xsl:if test="$b-html-theme-legacy">
14632
14863
  <!-- DejaVu Serif from an alternate CDN -->