diff options
author | Norbert Preining <norbert@preining.info> | 2024-08-31 03:03:30 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-08-31 03:03:30 +0000 |
commit | 25b0c606f5baf7e7316c653d3aff1043a415e5e9 (patch) | |
tree | 1ab9335897e194b0dcec64d88a135db312b1c300 /macros | |
parent | 921cd4745581e821cc2e518227d97f6f2642c57e (diff) |
CTAN sync 202408310303
Diffstat (limited to 'macros')
132 files changed, 5225 insertions, 2216 deletions
diff --git a/macros/generic/markdown/CHANGES.md b/macros/generic/markdown/CHANGES.md index 922aadff91..3e081c8c2c 100644 --- a/macros/generic/markdown/CHANGES.md +++ b/macros/generic/markdown/CHANGES.md @@ -1,5 +1,58 @@ # Changes +## 3.7.0 (2024-08-30) + +Development: + +- Add renderer `jekyllDataProgrammaticString` for processing YAML + string scalars that do not contain markdown markup and are not + intended for typesetting. + (istqborg/istqb_product_base#46, #440, #451, sponsored by @istqborg) +- Add option `ensureJekyllData` for processing standalone YAML files. +- Add renderers `warning` and `error` that represent warnings and errors + produced by the markdown parser. (#452, #473) +- Support user-defined LaTeX environments with LaTeX markup. + (#20, #477, suggested by @cdupont) + +Fixes: + +- Produce more meaningful error message when KPathSea fails to + locate a file. (#458, #472, 33e6eef2, reported by @Yggdrasil128) +- Fix soft line breaks in citation prenotes and postnotes. + (#483, #484, contributed by @lostenderman) + +Speed improvements: + +- Precompile snippets to improve the speed of setting them. + (#467, #479, inspired by the TUG 2024 talk by @josephwright) +- Use an optimized parser to determine Unicode punctuation. + (#458, #474, #482, 4c1a7de2, co-authored by @Yggdrasil128, + sponsored by @istqborg) + This improves the speed of parsing markdown input by up to 500%. +- Enable option `eagerCache` by default. (#468, #490, sponsored by @istqborg) + This improves the speed by up to 25% for large documents with many + markdown fragments that require multiple compilation runs. +- Prevent loading the full Markdown package when converting cached markdown + fragments. (#487, #491, 40f0803f, 6609d43d, sponsored by @istqborg) + This significantly improves the speed for large documents with many + markdown fragments that require multiple compilation runs in pdfTeX. + +Deprecation: + +- Deprecate `jekyllDataString` renderer and renderer prototype. + Users should use `jekyllDataTypographicString` instead. + (istqborg/istqb_product_base#46, #440, #451, sponsored by @istqborg) + +Continuous Integration: + +- Ensure that all code lines are shorter than 72 characters. + (#478, e7160d60, 3ac95efe) + +Experiments: + +- Measure the speed of the Markdown package across recent versions. + (249552e5, 55ede824, efeaecbe, #474, 7b2b2431, fcf0064c) + ## 3.6.2 (2024-07-14) Fixes: diff --git a/macros/generic/markdown/README.md b/macros/generic/markdown/README.md index 2a02ee9736..5622e4e4c1 100644 --- a/macros/generic/markdown/README.md +++ b/macros/generic/markdown/README.md @@ -194,7 +194,7 @@ For further information, consult one of the following: - [Attributes in Markdown][tb136], - [Markdown 3 at TUG 2023: Reflections from the Q&A session][tb138], - Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching ([preprint][tb139]), and - - Markdown Themes in Practice ([preprint][tb140]). + - Markdown Themes in Practice ([preprint][tb140-preprint], [work in progress][tb140]). 5. Journal articles published by [CSTUG Bulletin][csbul] (in Czech and Slovak): - [Rendering Markdown inside TeX Documents][10.5300/2016-1-4/78], - [Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX][10.5300/2020-1-2/48], @@ -204,11 +204,12 @@ For further information, consult one of the following: - [Markdown 3: What's New, What's Next?][10.5300/2023-3-4/111]. 6. Talks: - [Five Years of Markdown in LaTeX: What, Why, How, and Whereto][pv212-fall2020] (in Czech), - - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([slides][tb131-slides]), + - [Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX][tb131-video] ([mirror][tb131-video-mirror], [slides][tb131-slides]), - [A Self-Publisher's Take on Markdown and TeX][tb134-01-video] ([slides][tb134-01-slides]), - [A Gentle Introduction to Markdown for Writers][tb134-02-video] ([slides][tb134-02-slides], [example][tb134-02-example]), - - [Markdown 3: What's New, What's Next?][tb137-video] ([slides][tb137-slides]), and - - An Implementation of the CommonMark Standard and new Syntax Extensions to the Markdown Package for TeX ([slides][gencur-defense-slides]). + - [Markdown 3: What's New, What's Next?][tb137-video] ([mirror][tb137-video-mirror], [slides][tb137-slides]), + - An Implementation of the CommonMark Standard and new Syntax Extensions to the Markdown Package for TeX ([slides][gencur-defense-slides]), and + - [Markdown Themes in Practice][tb140-video] ([preprint][tb140-preprint], [slides][tb140-slides]) 7. Theses: - [Generic TeX Writer for the Pandoc Document Converter][thesis-umhg5] - [An implementation of the CommonMark standard into the Markdown package for TeX][thesis-r7z7l] @@ -220,26 +221,31 @@ For further information, consult one of the following: [overleaf-5]: https://www.overleaf.com/latex/examples/writing-posters-with-markdown/jtbgmmgqrqmh "Writing Posters with Markdown" [overleaf-6]: https://www.overleaf.com/latex/examples/using-markdown-in-latex-documents/whdrnpcpnwrm "Using Markdown in LaTeX documents" - [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents" - [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX" - [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal" - [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?" - [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?" - [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown" - [tb138]: https://www.tug.org/TUGboat/tb44-3/tb138starynovotny-markdown-qa.pdf "Markdown 3 at TUG 2023: Reflections from the Q&A session" - [tb139]: https://github.com/Witiko/fast-regression-testing/releases/download/latest/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching" - [tb140]: https://www.tug.org/tug2024/preprints/starynovotny-markdown-themes.pdf "Markdown Themes in Practice" - - [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb131-video]: https://youtu.be/i2GJMnLCZls "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" - [tb134-01-slides]: https://tug.org/tug2022/assets/served/Lloyd_Prentice-TUG2022-prentice-selfpub-slides.pdf "A Self-Publisher's Take on Markdown and TeX" - [tb134-01-video]: https://youtu.be/OhwzT3TcLj8 "A Self-Publisher's Take on Markdown and TeX" - [tb134-02-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers" - [tb134-02-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers" - [tb134-02-video]: https://youtu.be/FhN_x9rsR4M "A Gentle Introduction to Markdown for Writers" - [tb137-slides]: https://tug.org/tug2023/files/sa-03-novotny-markdown3/novotny-markdown3-slides.pdf "Markdown 3: What's New, What's Next?" - [tb137-video]: https://youtu.be/U8XjTOhJkg0 "Markdown 3: What's New, What's Next?" + [tb119]: https://www.tug.org/TUGboat/tb38-2/tb119novotny.pdf "Using Markdown inside TeX documents" + [tb124]: https://www.tug.org/TUGboat/tb40-1/tb124novotny-markdown.pdf "Markdown 2.7.0: Towards lightweight markup in TeX" + [tb129]: https://www.tug.org/TUGboat/tb41-3/tb129novotny-frozen.pdf "Making Markdown into a Microwave Meal" + [tb131]: https://www.tug.org/TUGboat/tb42-2/tb131novotny-markdown.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb133]: https://www.tug.org/TUGboat/tb43-1/tb133novotny-markdown.pdf "Markdown 2.15.0: What's New?" + [tb135]: https://www.tug.org/TUGboat/tb43-3/tb135novotny-markdown.pdf "Markdown 2.17.1: What's New, What's Next?" + [tb136]: https://www.tug.org/TUGboat/tb44-1/tb136novotny-markdown-attr.pdf "Attributes in Markdown" + [tb138]: https://www.tug.org/TUGboat/tb44-3/tb138starynovotny-markdown-qa.pdf "Markdown 3 at TUG 2023: Reflections from the Q&A session" + [tb139]: https://github.com/Witiko/fast-regression-testing/releases/download/latest/tb139starynovotny-testing.pdf "Fast Regression Testing of TeX Packages: The Unreasonable Effectiveness of Batching" + [tb140]: https://github.com/Witiko/markdown-themes-in-practice/releases/download/latest/tb140starynovotny-markdown-themes.pdf "Markdown Themes in Practice" + + [tb131-slides]: https://tug.org/tug2021/assets/pdf/tug2021-novotny-slides.pdf "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb131-video]: https://youtu.be/i2GJMnLCZls "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX" + [tb131-video-mirror]: https://youtu.be/THmPkAncMnc "Markdown 2.10.0: LaTeX Themes & Snippets, Two Flavors of Comments, and LuaMetaTeX (mirror)" + [tb134-01-slides]: https://tug.org/tug2022/assets/served/Lloyd_Prentice-TUG2022-prentice-selfpub-slides.pdf "A Self-Publisher's Take on Markdown and TeX" + [tb134-01-video]: https://youtu.be/OhwzT3TcLj8 "A Self-Publisher's Take on Markdown and TeX" + [tb134-02-slides]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-slides.pdf "A Gentle Introduction to Markdown for Writers" + [tb134-02-example]: https://tug.org/tug2022/assets/pdf/Tereza_Vrabcová-TUG2022-example.pdf "A Gentle Introduction to Markdown for Writers" + [tb134-02-video]: https://youtu.be/FhN_x9rsR4M "A Gentle Introduction to Markdown for Writers" + [tb137-slides]: https://tug.org/tug2023/files/sa-03-novotny-markdown3/novotny-markdown3-slides.pdf "Markdown 3: What's New, What's Next?" + [tb137-video]: https://youtu.be/U8XjTOhJkg0 "Markdown 3: What's New, What's Next?" + [tb137-video-mirror]: https://youtu.be/W15bBpVTA-c "Markdown 3: What's New, What's Next? (mirror)" + [tb140-preprint]: https://www.tug.org/tug2024/preprints/starynovotny-markdown-themes.pdf "Markdown Themes in Practice" + [tb140-video]: https://youtu.be/d7vTW7PR0B4?t=5h3m10s "Markdown Themes in Practice" + [tb140-slides]: https://www.tug.org/tug2024/slides/starynovotny-markdown-themes.pdf "Markdown Themes in Practice" [10.5300/2016-1-4/78]: https://www.doi.org/10.5300/2016-1-4/78 "Rendering Markdown inside TeX Documents" [10.5300/2020-1-2/48]: https://www.doi.org/10.5300/2020-1-2/48 "Markdown 2.8.1: Boldly Unto the Throne of Lightweight Markup in TeX" @@ -276,7 +282,7 @@ Acknowledgements | [<img width="150" src="https://www.fi.muni.cz/images/fi-logo.png">][fimu] | I gratefully acknowledge the funding from the [Faculty of Informatics][fimu] at the [Masaryk University][mu] in Brno, Czech Republic, for the development of the Markdown package in projects [MUNI/33/12/2015][], [MUNI/33/1784/2020][], [MUNI/33/0776/2021][], [MUNI/33/1654/2022][], and [MUNI/33/1658/2022][]. | | [<img width="150" src="https://cdn.overleaf.com/img/ol-brand/overleaf_og_logo.png">][overleaf] | Extensive user documentation for the Markdown package was kindly written by [Lian Tze Lim][liantze] and published by [Overleaf][]. | | [<img width="150" src="https://pbs.twimg.com/profile_images/1004769879319334912/6Bh1UthD.jpg">][omedym] | Support for content slicing (Lua options [`shiftHeadings`][option-shift-headings] and [`slice`][option-slice]) and pipe tables (Lua options [`pipeTables`][option-pipe-tables] and [`tableCaptions`][option-table-captions]) was graciously sponsored by [David Vins][dvins] and [Omedym][]. | -| [<img width="150" src="https://www.istqb.org/static/istqb-logo-1b043e800a580724ad223567f9ea57c0.png">][istqb] | Fixes for issues [#359][issue-359], [#368][issue-368], [#401][issue-401], and [#424][issue-424] were graciously sponsored by the [International Software Testing Qualifications Board (ISTQB)][istqb]. | +| [<img width="150" src="https://www.istqb.org/static/istqb-logo-1b043e800a580724ad223567f9ea57c0.png">][istqb] | Fixes for issues [#359][issue-359], [#368][issue-368], [#401][issue-401], [#424][issue-424], [#440][issue-440], [#468][issue-468], [#474][issue-474], and [#487][issue-487] were graciously sponsored by the [International Software Testing Qualifications Board (ISTQB)][istqb]. | [dvins]: https://github.com/dvins "David Vins" [fimu]: https://www.fi.muni.cz/index.html.en "Faculty of Informatics, Masaryk University" @@ -288,6 +294,10 @@ Acknowledgements [issue-368]: https://github.com/witiko/markdown/issues/368 "Tables nested in list items have empty lines" [issue-401]: https://github.com/witiko/markdown/issues/401 "Create an unnumbered section" [issue-424]: https://github.com/witiko/markdown/issues/424 "E-mail addresses are incorrectly interpreted as bracketed citations" + [issue-440]: https://github.com/witiko/markdown/issues/440 "Support programmatic text in YAML metadata values" + [issue-468]: https://github.com/witiko/markdown/issues/468 "Enable option eagerCache by default" + [issue-474]: https://github.com/witiko/markdown/issues/474 "Improve the speed of the Markdown package" + [issue-487]: https://github.com/witiko/markdown/issues/487 "Prevent loading the full Markdown package when converting cached markdown fragments" [option-pipe-tables]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#pipe-tables "Markdown Package User Manual" [option-shift-headings]: https://mirrors.ctan.org/macros/generic/markdown/markdown.html#option-shiftheadings "Markdown Package User Manual" diff --git a/macros/generic/markdown/VERSION b/macros/generic/markdown/VERSION index c2b2c7e0ab..a886c5e0cb 100644 --- a/macros/generic/markdown/VERSION +++ b/macros/generic/markdown/VERSION @@ -1 +1 @@ -3.6.2-0-g6c30af7e (2024-07-14) +3.7.0-0-g98dece19 (2024-08-30) diff --git a/macros/generic/markdown/docstrip.cfg b/macros/generic/markdown/docstrip.cfg index 959a3a21c3..44429e7b97 100644 --- a/macros/generic/markdown/docstrip.cfg +++ b/macros/generic/markdown/docstrip.cfg @@ -11,12 +11,12 @@ -- permit persons to whom the Software is furnished to do so, subject to^^J% -- the following conditions:^^J% --^^J% --- The above copyright notice and this permission notice shall be included^^J% --- in all copies or substantial portions of the Software.^^J% +-- The above copyright notice and this permission notice shall be^^J% +-- included in all copies or substantial portions of the Software.^^J% --^^J% -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,^^J% -- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF^^J% --- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.^^J% +-- MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND NONINFRINGEMENT.^^J% -- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY^^J% -- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,^^J% -- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE^^J% diff --git a/macros/generic/markdown/examples/optex.tex b/macros/generic/markdown/examples/optex.tex index d39369f6b3..a9c7f80a22 100644 --- a/macros/generic/markdown/examples/optex.tex +++ b/macros/generic/markdown/examples/optex.tex @@ -226,7 +226,8 @@ \_let \markdownRendererJekyllDataSequenceEnd \_relax \_def \markdownRendererJekyllDataBoolean #1#2{} \_def \markdownRendererJekyllDataNumber #1#2{} -\_def \markdownRendererJekyllDataString #1#2{} +\_def \markdownRendererJekyllDataProgrammaticString #1#2{} +\_def \markdownRendererJekyllDataTypographicString #1#2{} \_def \markdownRendererJekyllDataEmpty #1{} % Load the Markdown module and set TeX macros for the Markdown module diff --git a/macros/generic/markdown/markdown.dtx b/macros/generic/markdown/markdown.dtx index 97fa8d6b56..2ad94e6e9c 100644 --- a/macros/generic/markdown/markdown.dtx +++ b/macros/generic/markdown/markdown.dtx @@ -814,7 +814,9 @@ abbr { }, jekyllDataRenderers = { /authors/* = {% - \expandafter\gdef\expandafter\ltd@title@author\expandafter{\ltd@title@author, #1}% + \expandafter\gdef + \expandafter\ltd@title@author + \expandafter{\ltd@title@author, #1}% }, title = {% \gdef\ltd@title@title{#1}% @@ -923,13 +925,15 @@ documentation][techdoc]. (A Markdown Interpreter for TeX) %</manual> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} local metadata = { version = "(((VERSION)))", - comment = "A module for the conversion from markdown to plain TeX", - author = "John MacFarlane, Hans Hagen, Vít Starý Novotný, Andrej Genčur", + comment = "A module for the conversion from markdown " + .. "to plain TeX", + author = "John MacFarlane, Hans Hagen, Vít Starý Novotný, " + .. "Andrej Genčur", copyright = {"2009-2016 John MacFarlane, Hans Hagen", "2016-2024 Vít Starý Novotný, Andrej Genčur"}, license = "LPPL 1.3c" @@ -937,7 +941,7 @@ local metadata = { % \end{macrocode} % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*lua> % \fi % \begin{macrocode} @@ -989,7 +993,7 @@ make base Either of the two abovelisted approaches should produce the following files: -* `markdown.lua`: The Lua module +* `markdown.lua` and `markdown-parser.lua`: The Lua module * `libraries/markdown-tinyyaml.lua`: An external library for reading \acro{yaml} * `markdown-cli.lua`: The Lua command-line interface * `markdown.tex`: The plain \TeX{} macro package @@ -1010,6 +1014,7 @@ directory structure. This is generally where the individual files should be placed: * `⟨TEXMF⟩/tex/luatex/markdown/markdown.lua` +* `⟨TEXMF⟩/tex/luatex/markdown/markdown-parser.lua` * `⟨TEXMF⟩/tex/luatex/markdown/markdown-tinyyaml.lua` * `⟨TEXMF⟩/scripts/markdown/markdown-cli.lua` * `⟨TEXMF⟩/tex/generic/markdown/markdown.tex` @@ -1036,6 +1041,7 @@ portably typeset on legacy \TeX{} distributions. This is where the individual files should be placed: * `./markdown.lua` +* `./markdown-parser.lua` * `./markdown-tinyyaml.lua` * `./markdown-cli.lua` * `./markdown/markdown.tex` @@ -1104,9 +1110,17 @@ local unicode = require("unicode") % Live${}\geq{}2008$). % % \end{markdown} +% \iffalse +%</lua> +%<*lua,lua-loader> +% \fi % \begin{macrocode} local md5 = require("md5"); % \end{macrocode} +% \iffalse +%</lua,lua-loader> +%<*lua> +% \fi % \begin{markdown} % % \pkg{Kpathsea} @@ -1181,7 +1195,7 @@ local uni_algos = require("lua-uni-algos") %<*depends> % \fi % \begin{macrocode} -# hard lua-tinyyaml # TODO: Uncomment after TeX Live 2022 has been deprecated. +# hard lua-tinyyaml # TODO: Uncomment after TeX Live 2022 deprecation. % \end{macrocode} % \iffalse %</depends> @@ -1871,7 +1885,7 @@ module and a command-line interface (CLI). (Lua library for conversion between markup formats) %</manual-interfaces> -%<*lua> +%<*lua,lua-loader> % \fi % \begin{markdown} % @@ -1886,6 +1900,10 @@ module and a command-line interface (CLI). % \begin{macrocode} local M = {metadata = metadata} % \end{macrocode} +% \iffalse +% \fi +%</lua,lua-loader> +%<*lua> % \par % \begin{markdown} % @@ -2162,7 +2180,7 @@ In this section, I will describe all the options recognized by the Markdown package. %</manual-options> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} local defaultOptions = {} @@ -2171,7 +2189,7 @@ local defaultOptions = {} % \markdownSetup{snippet=lua-options} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> ### Lua @@ -2205,7 +2223,9 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces. \prop_new:N \g_@@_default_lua_options_prop \seq_new:N \g_@@_option_layers_seq \tl_const:Nn \c_@@_option_layer_lua_tl { lua } -\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_lua_tl +\seq_gput_right:NV + \g_@@_option_layers_seq + \c_@@_option_layer_lua_tl \cs_new:Nn \@@_add_lua_option:nnn { @@ -2282,21 +2302,50 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces. \cs_generate_variant:Nn \msg_error:nnnn { nnnV } -\seq_new:N \g_@@_option_types_seq -\tl_const:Nn \c_@@_option_type_clist_tl { clist } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_clist_tl -\tl_const:Nn \c_@@_option_type_counter_tl { counter } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_counter_tl -\tl_const:Nn \c_@@_option_type_boolean_tl { boolean } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_boolean_tl -\tl_const:Nn \c_@@_option_type_number_tl { number } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_number_tl -\tl_const:Nn \c_@@_option_type_path_tl { path } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_path_tl -\tl_const:Nn \c_@@_option_type_slice_tl { slice } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_slice_tl -\tl_const:Nn \c_@@_option_type_string_tl { string } -\seq_gput_right:NV \g_@@_option_types_seq \c_@@_option_type_string_tl +\seq_new:N + \g_@@_option_types_seq +\tl_const:Nn + \c_@@_option_type_clist_tl + { clist } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_clist_tl +\tl_const:Nn + \c_@@_option_type_counter_tl + { counter } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_counter_tl +\tl_const:Nn + \c_@@_option_type_boolean_tl + { boolean } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_boolean_tl +\tl_const:Nn + \c_@@_option_type_number_tl + { number } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_number_tl +\tl_const:Nn + \c_@@_option_type_path_tl + { path } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_path_tl +\tl_const:Nn + \c_@@_option_type_slice_tl + { slice } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_slice_tl +\tl_const:Nn + \c_@@_option_type_string_tl + { string } +\seq_gput_right:NV + \g_@@_option_types_seq + \c_@@_option_type_string_tl \cs_new:Nn \@@_get_option_type:nN { @@ -2518,20 +2567,23 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces. #### Option `eagerCache` -`eagerCache` (default value: `false`) +`eagerCache` (default value: `true`) % \fi % \begin{markdown} % -% \Optitem[false]{eagerCache}{\opt{true}, \opt{false}} +% \Optitem[true]{eagerCache}{\opt{true}, \opt{false}} % : true : Converted markdown documents will be cached in \Opt{cacheDir}. This can be useful for post-processing the converted documents and for recovering - historical versions of the documents from the cache. However, it also - produces a large number of auxiliary files on the disk and obscures the - output of the Lua command-line interface when it is used for plumbing. + historical versions of the documents from the cache. Furthermore, it can + also significantly improve the processing speed for documents that require + multiple compilation runs, since each markdown document is only converted once. + However, it also produces a large number of auxiliary files on the disk + and obscures the output of the Lua command-line interface when it is + used for plumbing. This behavior will always be used if the \Opt{finalizeCache} option is enabled. @@ -2540,7 +2592,11 @@ interfaces and all the way up to the \LaTeX{} and \Hologo{ConTeXt} interfaces. : Converted markdown documents will not be cached. This decreases the number of auxiliary files that we produce and makes it easier to use the Lua - command-line interface for plumbing. + command-line interface for plumbing. However, it makes it impossible to + post-process the converted documents and recover historical versions of + the documents from the cache. Furthermore, it can significantly reduce + the processing speed for documents that require multiple compilation + runs, since each markdown document is converted multiple times needlessly. This behavior will only be used when the \Opt{finalizeCache} option is disabled. @@ -2602,18 +2658,18 @@ Hello \markdownRendererEmphasis{world}!\relax \@@_add_lua_option:nnn { eagerCache } { boolean } - { false } + { true } % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} -defaultOptions.eagerCache = false +defaultOptions.eagerCache = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `singletonCache` @@ -2641,12 +2697,11 @@ defaultOptions.eagerCache = false : Every call to the function \luamref{new}`(options)` will produce a new conversion function that will not be cached. This is slower than caching conversion functions and may expose bugs related to memory - leaks in the creation of conversion functions, see also issue - [#226][issue-226]. + leaks in the creation of conversion functions, see also [#226 (comment)][226-comment]. This was the default behavior until version 3.0.0 of the Markdown package. - [issue-226]: https://github.com/witiko/markdown/pull/226#issuecomment-1599641634 + [226-comment]: https://github.com/witiko/markdown/pull/226#issuecomment-1599641634 % \end{markdown} % \iffalse @@ -2695,13 +2750,13 @@ conversion function. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.singletonCache = true % \end{macrocode} % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*lua> % \fi % \begin{macrocode} @@ -2750,14 +2805,14 @@ local singletonCache = { % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.unicodeNormalization = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `unicodeNormalizationForm` @@ -2806,14 +2861,14 @@ defaultOptions.unicodeNormalization = true % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.unicodeNormalizationForm = "nfc" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> % \fi % \begin{markdown} @@ -2982,14 +3037,14 @@ option. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.cacheDir = "." % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `contentBlocksLanguageMap` @@ -3146,14 +3201,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.contentBlocksLanguageMap = "markdown-languages.json" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `debugExtensionsFileName` @@ -3195,14 +3250,14 @@ defaultOptions.contentBlocksLanguageMap = "markdown-languages.json" % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.debugExtensionsFileName = "debug-extensions.json" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `frozenCacheFileName` @@ -3437,14 +3492,14 @@ the markdown document from “Hello *world*!” to “Hi *world*!” was not ref % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.frozenCacheFileName = "frozenCache.tex" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> % \fi % \begin{markdown} @@ -3494,14 +3549,14 @@ See also the option \Opt{gfmAutoIdentifiers}. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.autoIdentifiers = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `blankBeforeBlockquote` @@ -3718,14 +3773,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.blankBeforeBlockquote = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `blankBeforeCodeFence` @@ -3975,14 +4030,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.blankBeforeCodeFence = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `blankBeforeDivFence` @@ -4058,14 +4113,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.blankBeforeDivFence = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `blankBeforeHeading` @@ -4298,14 +4353,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.blankBeforeHeading = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `blankBeforeList` @@ -4524,14 +4579,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.blankBeforeList = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `bracketedSpans` @@ -4620,14 +4675,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.bracketedSpans = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `breakableBlockquotes` @@ -4854,14 +4909,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.breakableBlockquotes = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `citationNbsps` @@ -4948,14 +5003,14 @@ following text, where the middot (`·`) denotes a non-breaking space: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.citationNbsps = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `citations` @@ -5051,14 +5106,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.citations = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `codeSpans` @@ -5277,14 +5332,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.codeSpans = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `contentBlocks` @@ -5451,14 +5506,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.contentBlocks = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `contentLevel` @@ -5588,14 +5643,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.contentLevel = "block" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `debugExtensions` @@ -5743,14 +5798,14 @@ inserted to the grammar of markdown. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.debugExtensions = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `definitionLists` @@ -5882,14 +5937,60 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.definitionLists = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> +%<*manual-options> + +#### Option `ensureJekyllData` + +`ensureJekyllData` (default value: `false`) + +% \fi +% \begin{markdown} +% +% \Optitem[false]{ensureJekyllData}{\opt{true}, \opt{false}} +% +: false + + : When the \Opt{jekyllData} and \Opt{expectJekyllData} options are + enabled, then a markdown document may begin directly with \acro{yaml} + metadata and may contain nothing but \acro{yaml} metadata. Otherwise, + the markdown document is processed as markdown text. + +: true + + : When the \Opt{jekyllData} and \Opt{expectJekyllData} options are + enabled, then a markdown document must begin directly with \acro{yaml} + metadata and must contain nothing but \acro{yaml} metadata. Otherwise, + an error is produced. + +% \end{markdown} +% \iffalse +%</manual-options> +%<*tex> +% \fi +% \begin{macrocode} +\@@_add_lua_option:nnn + { ensureJekyllData } + { boolean } + { false } +% \end{macrocode} +% \iffalse +%</tex> +%<*lua,lua-cli,lua-loader> +% \fi +% \begin{macrocode} +defaultOptions.ensureJekyllData = false +% \end{macrocode} +% \par +% \iffalse +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `expectJekyllData` @@ -6006,14 +6107,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.expectJekyllData = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `extensions` @@ -6157,14 +6258,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.extensions = {} % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `fancyLists` @@ -6259,14 +6360,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.fancyLists = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `fencedCode` @@ -6426,14 +6527,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.fencedCode = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `fencedCodeAttributes` @@ -6526,14 +6627,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.fencedCodeAttributes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `fencedDivs` {#fenced-divs} @@ -6605,14 +6706,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.fencedDivs = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `finalizeCache` @@ -6769,14 +6870,14 @@ the markdown document from “Hello *world*!” to “Hi *world*!” was not ref % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.finalizeCache = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `frozenCacheCounter` @@ -6838,14 +6939,14 @@ requested using the `frozenCacheCounter` option. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.frozenCacheCounter = 0 % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `gfmAutoIdentifiers` @@ -6887,14 +6988,14 @@ See also the option \Opt{autoIdentifiers}. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.gfmAutoIdentifiers = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `hashEnumerators` @@ -7018,14 +7119,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.hashEnumerators = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `headerAttributes` {#header-attributes} @@ -7067,14 +7168,14 @@ defaultOptions.hashEnumerators = false % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.headerAttributes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `html` @@ -7339,14 +7440,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.html = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `hybrid` @@ -7565,14 +7666,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.hybrid = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `inlineCodeAttributes` @@ -7661,14 +7762,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.inlineCodeAttributes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `inlineNotes` @@ -7762,14 +7863,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.inlineNotes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `jekyllData` @@ -7929,14 +8030,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.jekyllData = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `linkAttributes` @@ -8026,14 +8127,14 @@ image (from [Martin Scharrer's mwe package][mwe]) displayed at size 5cm × 4cm. % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.linkAttributes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `lineBlocks` @@ -8161,14 +8262,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.lineBlocks = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `mark` @@ -8232,14 +8333,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.mark = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `notes` @@ -8395,14 +8496,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.notes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `pipeTables` {#pipe-tables} @@ -8504,14 +8605,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.pipeTables = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `preserveTabs` @@ -8544,14 +8645,14 @@ defaultOptions.pipeTables = false % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.preserveTabs = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `rawAttribute` @@ -8639,14 +8740,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.rawAttribute = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `relativeReferences` @@ -8728,14 +8829,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.relativeReferences = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `shiftHeadings` @@ -8868,14 +8969,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.shiftHeadings = 0 % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `slice` @@ -9086,14 +9187,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.slice = "^ $" % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `smartEllipses` @@ -9301,14 +9402,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.smartEllipses = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `startNumber` @@ -9437,14 +9538,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.startNumber = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `strikeThrough` @@ -9559,14 +9660,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.strikeThrough = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `stripIndent` @@ -9672,14 +9773,14 @@ text “Hello *world*!” % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.stripIndent = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `subscripts` @@ -9764,14 +9865,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.subscripts = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `superscripts` @@ -9856,14 +9957,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.superscripts = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `tableAttributes` @@ -9981,14 +10082,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.tableAttributes = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `tableCaptions` {#table-captions} @@ -10111,14 +10212,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.tableCaptions = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `taskLists` @@ -10224,14 +10325,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.taskLists = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `texComments` @@ -10340,14 +10441,14 @@ text “Hello *world*!” % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.texComments = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `texMathDollars` @@ -10551,14 +10652,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.texMathDollars = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `texMathDoubleBackslash` @@ -10762,14 +10863,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.texMathDoubleBackslash = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `texMathSingleBackslash` @@ -10973,14 +11074,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.texMathSingleBackslash = false % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `tightLists` @@ -11094,14 +11195,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.tightLists = true % \end{macrocode} % \par % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*manual-options> #### Option `underscores` @@ -11237,14 +11338,14 @@ following text: % \end{macrocode} % \iffalse %</tex> -%<*lua,lua-cli> +%<*lua,lua-cli,lua-loader> % \fi % \begin{macrocode} defaultOptions.underscores = true % \end{macrocode} % \endgroup % \iffalse -%</lua,lua-cli> +%</lua,lua-cli,lua-loader> %<*lua-cli> % \fi % \par @@ -11330,7 +11431,8 @@ Copyright (C) ]] .. table.concat(metadata.copyright, License: ]] .. metadata.license local function warn(s) - io.stderr:write("Warning: " .. s .. "\n") end + io.stderr:write("Warning: " .. s .. "\n") +end local function error(s) io.stderr:write("Error: " .. s .. "\n") @@ -11421,8 +11523,8 @@ for i = 1, #arg do if default_type == "nil" then warn('Option "' .. key .. '" not recognized.') else - warn('Option "' .. key .. '" type not recognized, please file ' .. - 'a report to the package maintainer.') + warn('Option "' .. key .. '" type not recognized, ' .. + 'please file a report to the package maintainer.') end warn('Parsing the ' .. 'value "' .. value ..'" of option "' .. key .. '" as a string.') @@ -11757,7 +11859,9 @@ pdftex --shell-escape document.tex % \begin{macrocode} \prop_new:N \g_@@_plain_tex_option_types_prop \prop_new:N \g_@@_default_plain_tex_options_prop -\seq_gput_right:NV \g_@@_option_layers_seq \c_@@_option_layer_plain_tex_tl +\seq_gput_right:NV + \g_@@_option_layers_seq + \c_@@_option_layer_plain_tex_tl \cs_new:Nn \@@_add_plain_tex_option:nnn { @@ -12828,10 +12932,14 @@ options locally. { redefined-snippet } \l_tmpa_tl } - \prop_gput:NVn + \keys_precompile:nnN + { markdown/options } + { #2 } + \l_tmpb_tl + \prop_gput:NVV \g_@@_snippets_prop \l_tmpa_tl - { #2 } + \l_tmpb_tl } \cs_gset_eq:NN \markdownSetupSnippet @@ -12897,7 +13005,7 @@ options locally. \g_@@_snippets_prop \l_tmpa_tl \l_tmpb_tl - \@@_setup:V + \tl_use:N \l_tmpb_tl } { @@ -12912,9 +13020,6 @@ options locally. { markdown } { undefined-snippet } { Can't~invoke~undefined~snippet~#1 } -\cs_generate_variant:Nn - \@@_setup:n - { V } \ExplSyntaxOff % \end{macrocode} % \iffalse @@ -15699,8 +15804,8 @@ following text: % \begin{markdown} #### Fenced Code Attribute Context Renderers -The following macros are only produced, when the \Opt{fencedCode} option is -enabled. +The following macros are only produced, when the \Opt{fencedCode} and +\Opt{fencedCodeAttributes} options are enabled. The \mdef{markdownRendererFencedCodeAttributeContextBegin} and \mdef{markdownRendererFencedCodeAttributeContextEnd} macros represent the @@ -19956,6 +20061,50 @@ following text: % % \begin{markdown} +#### Warning and Error Renderers + +The \mdef{markdownRendererWarning} and \mdef{markdownRendererError} macros +represent warnings and errors produced by the markdown parser. Both macros +receive a single parameter with the text of the warning or error. + +% \end{markdown} +% +% \iffalse +%</manual-tokens> +%<*tex> +% \fi +% +% \begin{macrocode} +\def\markdownRendererWarning{% + \markdownRendererWarningPrototype}% +\def\markdownRendererError{% + \markdownRendererErrorPrototype}% +\ExplSyntaxOn +\seq_gput_right:Nn + \g_@@_renderers_seq + { warning } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { warning } + { 1 } +\seq_gput_right:Nn + \g_@@_renderers_seq + { error } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { error } + { 1 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +%</tex> +%<*manual-tokens> +% \fi +% +% \begin{markdown} + #### YAML Metadata Renderers {#yamlmetadatarenderers} The \mdef{markdownRendererJekyllDataBegin} macro represents the beginning of a @@ -20230,12 +20379,24 @@ following \acro{yaml} serialization rules. % % \begin{markdown} -The \mdef{markdownRendererJekyllDataString} macro represents a string scalar -value in a \acro{yaml} document. This macro will only be produced when the -\Opt{jekyllData} option is enabled. The macro receives two arguments: the +The \mdef{markdownRendererJekyllDataTypographicString} and +\mdef{markdownRendererJekyllDataProgrammaticString} macros represent string +scalar values in a \acro{yaml} document. This macro will only be produced when +the \Opt{jekyllData} option is enabled. The macro receives two arguments: the scalar key in the parent structure, cast to a string following \acro{yaml} serialization rules, and the scalar value. +For each string scalar value, both macros are produced. Whereas +\mref{markdownRendererJekyllDataTypographicString} receives the scalar value +after all markdown markup and special \TeX{} characters in the string have been +replaced by \TeX{} macros, \mref{markdownRendererJekyllDataProgrammaticString} +receives the raw scalar value. Therefore, whereas the +\mref{markdownRendererJekyllDataTypographicString} macro is more appropriate +for texts that are supposed to be typeset with \TeX{}, such as document titles, +author names, or exam questions, the +\mref{markdownRendererJekyllDataProgrammaticString} macro is more appropriate +for identifiers and other programmatic text that won't be typeset by \TeX{}. + % \end{markdown} % % \iffalse @@ -20244,11 +20405,83 @@ serialization rules, and the scalar value. % \fi % % \begin{macrocode} -\def\markdownRendererJekyllDataString{% - \markdownRendererJekyllDataStringPrototype}% +\def\markdownRendererJekyllDataTypographicString{% + \markdownRendererJekyllDataTypographicStringPrototype}% +\def\markdownRendererJekyllDataProgrammaticString{% + \markdownRendererJekyllDataProgrammaticStringPrototype}% \ExplSyntaxOn \seq_gput_right:Nn \g_@@_renderers_seq + { jekyllDataTypographicString } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataTypographicString } + { 2 } +\seq_gput_right:Nn + \g_@@_renderers_seq + { jekyllDataProgrammaticString } +\prop_gput:Nnn + \g_@@_renderer_arities_prop + { jekyllDataProgrammaticString } + { 2 } +\ExplSyntaxOff +% \end{macrocode} +% \par +% +% \iffalse +%</tex> +%<*manual-tokens> +% \fi +% +% \begin{markdown} + +Before Markdown 3.7.0, the \mref{markdownRendererJekyllDataTypographicString} +macro was named \mref{markdownRendererJekyllDataString} and the +\mref{markdownRendererJekyllDataProgrammaticString} macro was not produced. +The \mref{markdownRendererJekyllDataString} has been deprecated and will be +removed in Markdown 4.0.0. + +% \end{markdown} +% +% \iffalse +%</manual-tokens> +%<*tex> +% \fi +% +% \begin{macrocode} +\ExplSyntaxOn +\cs_gset:Npn + \markdownRendererJekyllDataTypographicString + { + \cs_if_exist:NTF + \markdownRendererJekyllDataString + { + \markdownWarning + { + The~jekyllDataString~renderer~has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + \markdownRendererJekyllDataString + } + { + \cs_if_exist:NTF + \markdownRendererJekyllDataStringPrototype + { + \markdownWarning + { + The~jekyllDataString~renderer~prototype~ + has~been~deprecated,~ + to~be~removed~in~Markdown~4.0.0 + } + \markdownRendererJekyllDataStringPrototype + } + { + \markdownRendererJekyllDataTypographicStringPrototype + } + } + } +\seq_gput_right:Nn + \g_@@_renderers_seq { jekyllDataString } \prop_gput:Nnn \g_@@_renderer_arities_prop @@ -20308,7 +20541,7 @@ following content: ``` tex \input markdown \def\markdownOptionJekyllData{true} -\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} +\def\markdownRendererJekyllDataTypographicString#1#2{\gdef\name{#2}} \def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} \def\markdownRendererJekyllDataEnd{% \name{} is \age{} years old.} @@ -20338,7 +20571,7 @@ following content: \usepackage[jekyllData]{markdown} \markdownSetup{ renderers = { - jekyllDataString = {\gdef\name{#2}}, + jekyllDataTypographicString = {\gdef\name{#2}}, jekyllDataNumber = {\gdef\age{#2}}, jekyllDataEnd = {\name{} is \age{} years old.}, } @@ -20370,7 +20603,7 @@ following content: ``` tex \usemodule[t][markdown] \setupmarkdown[jekyllData = yes] -\def\markdownRendererJekyllDataString#1#2{\gdef\name{#2}} +\def\markdownRendererJekyllDataTypographicString#1#2{\gdef\name{#2}} \def\markdownRendererJekyllDataNumber#1#2{\gdef\age{#2}} \def\markdownRendererJekyllDataEnd{% \name{} is \age{} years old.} @@ -20412,9 +20645,26 @@ following text: \ExplSyntaxOn \cs_new:Nn \@@_define_renderers: { - \seq_map_function:NN + \seq_map_inline:Nn \g_@@_renderers_seq - \@@_define_renderer:n + { +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \mref{markdownRendererJekyllDataString} has been deprecated and will be +% removed in Markdown 4.0.0. +% +% \end{markdown} +% \begin{macrocode} + \str_if_eq:nnF + { ##1 } + { jekyllDataString } + { + \@@_define_renderer:n + { ##1 } + } + } } \cs_new:Nn \@@_define_renderer:n { @@ -21130,9 +21380,26 @@ following text: \ExplSyntaxOn \cs_new:Nn \@@_define_renderer_prototypes: { - \seq_map_function:NN + \seq_map_inline:Nn \g_@@_renderers_seq - \@@_define_renderer_prototype:n + { +% \end{macrocode} +% \par +% \begin{markdown} +% +% The \mref{markdownRendererJekyllDataString} has been deprecated and will be +% removed in Markdown 4.0.0. +% +% \end{markdown} +% \begin{macrocode} + \str_if_eq:nnF + { ##1 } + { jekyllDataString } + { + \@@_define_renderer_prototype:n + { ##1 } + } + } } \cs_new:Nn \@@_define_renderer_prototype:n { @@ -21612,9 +21879,10 @@ pdflatex --shell-escape document.tex % \LaTeX{} environments, and redefines the \mref{markinline} and % \mref{markdownInput} commands. % +%#### The `markdown` and `markdown*` \LaTeX{} environments % The \envmref{markdown} and \envmref{markdown*} \LaTeX{} environments are used % to typeset markdown document fragments. Both \LaTeX{} environments accept -% \LaTeX{} interface options (see ection <#sec:latex-options>) as the only +% \LaTeX{} interface options (see Section <#sec:latex-options>) as the only % argument. This argument is optional for the \envmref{markdown} environment % and mandatory for the \envmref{markdown*} environment. % @@ -21651,6 +21919,52 @@ pdflatex --shell-escape document.tex % \end{document} \end{document} % ``````` % +% You can't directly extend the \envmref{markdown} \LaTeX{} environment by +% using it in other environments as follows: +% +% ``` tex +% \newenvironment{foo}\% +% {code before \begin{markdown}[some, options]}\% +% {\end{markdown} code after} +% ``` +% +% This is because the implementation looks for the literal string +% `\end{markdown}` to stop scanning the markdown text. However, you can work +% around this limitation by using the \mref{markdown} and \mref{markdownEnd} +% macros directly in the definition as follows: +% +% \markdownEnd +% \begin{markdown} +% +% ``` tex +% \newenvironment{foo}\% +% {code before \markdown[some, options]}\% +% {\markdownEnd code after} +% ``` +% +% Specifically, the \mref{markdown} macro must appear at the end of the +% replacement text and must be followed by text that has not yet been ingested +% by \TeX's input processor. Furthermore, using the \mref{markdownEnd} macro is +% optional and only makes a difference if you redefined it to produce special +% effects before and after the \envmref{markdown} \LaTeX{} environment. Lastly, +% you can't nest the other environments. For example, the following definition +% is incorrect: +% +% ``` tex +% \newenvironment{bar}{\begin{foo}}{\end{foo}} +% ``` +% +% In this example, you should use the \mref{markdown} macro directly in the +% definition of the environment `bar`: +% +% ``` tex +% \newenvironment{bar}{\markdown[some, options]}{\markdownEnd} +% ``` +% +% \end{markdown} +% \markdownBegin +% +%#### The `\markinline` and `\markdownInput` macros % The \mref{markinline} macro accepts a single mandatory parameter containing % inline markdown content and expands to the result of the conversion of the % input markdown document to plain \TeX{}. Unlike the \mref{markinline} macro @@ -22395,14 +22709,14 @@ Built-in \Hologo{ConTeXt} themes provided with the Markdown package include: % \end{markdown} % \iffalse %</manual-options> -%<*themes-witiko-markdown-defaults-context> +%<*themes-witiko-markdown-defaults-ctx> % \fi % \begin{macrocode} \startmodule[markdownthemewitiko_markdown_defaults] \unprotect % \end{macrocode} % \iffalse -%</themes-witiko-markdown-defaults-context> +%</themes-witiko-markdown-defaults-ctx> %<*manual-options> % \fi % \begin{markdown} @@ -22463,9 +22777,17 @@ local P, R, S, V, C, Cg, Cb, Cmt, Cc, Ct, B, Cs, Cp, any = % `lunamark/util.lua` file in the Lunamark Lua module. % % \end{markdown} +% \iffalse +%</lua> +%<*lua,lua-loader> +% \fi % \begin{macrocode} local util = {} % \end{macrocode} +% \iffalse +%</lua,lua-loader> +%<*lua> +% \fi % \par % \begin{markdown} % @@ -22480,13 +22802,17 @@ function util.err(msg, exit_code) os.exit(exit_code or 1) end % \end{macrocode} +% \iffalse +%</lua> +%<*lua,lua-loader> +% \fi % \par % \begin{markdown} % -% The \luamdef{util.cache} method computes the digest of `string` and -% `salt`, adds the `suffix` and looks into the directory `dir`, whether a -% file with such a name exists. If it does not, it gets created with -% `transform(string)` as its content. The filename is then returned. +% The \luamdef{util.cache} method used `dir`, `string`, `salt`, and `suffix` +% to determine a pathname. If a file with such a pathname does not exists, +% it gets created with `transform(string)` as its content. Regardless, the +% pathname is then returned. % % \end{markdown} % \begin{macrocode} @@ -22494,7 +22820,7 @@ function util.cache(dir, string, salt, transform, suffix) local digest = md5.sumhexa(string .. (salt or "")) local name = util.pathname(dir, digest .. suffix) local file = io.open(name, "r") - if file == nil then -- If no cache entry exists, then create a new one. + if file == nil then -- If no cache entry exists, create a new one. file = assert(io.open(name, "w"), [[Could not open file "]] .. name .. [[" for writing]]) local result = string @@ -22507,6 +22833,10 @@ function util.cache(dir, string, salt, transform, suffix) return name end % \end{macrocode} +% \iffalse +%</lua,lua-loader> +%<*lua> +% \fi % \par % \begin{markdown} % @@ -22765,6 +23095,10 @@ function util.escaper(char_escapes, string_escapes) end end % \end{macrocode} +% \iffalse +%</lua> +%<*lua,lua-loader> +% \fi % \par % \begin{markdown} % @@ -22784,6 +23118,43 @@ end % \par % \begin{markdown} % +% The \luamdef{util.salt} method produces cryptographic salt out of a table of +% options `options`. +% +% \end{markdown} +% \begin{macrocode} +function util.salt(options) + local opt_string = {} + for k, _ in pairs(defaultOptions) do + local v = options[k] + if type(v) == "table" then + for _, i in ipairs(v) do + opt_string[#opt_string+1] = k .. "=" .. tostring(i) + end +% \end{macrocode} +% \begin{markdown} +% +% The \Opt{cacheDir} option is disregarded. +% +% \end{markdown} +% \begin{macrocode} + elseif k ~= "cacheDir" then + opt_string[#opt_string+1] = k .. "=" .. tostring(v) + end + end + table.sort(opt_string) + local salt = table.concat(opt_string, ",") + .. "," .. metadata.version + return salt +end +% \end{macrocode} +% \iffalse +%</lua,lua-loader> +%<*lua> +% \fi +% \par +% \begin{markdown} +% %### HTML Entities % This section documents the \acro{HTML} entities recognized by the % markdown reader. These functions are encapsulated in the `entities` @@ -25100,15 +25471,6 @@ function M.writer.new(options) % \par % \begin{markdown} % -% Define \luamdef{writer->suffix} as the suffix of the produced cache files. -% -% \end{markdown} -% \begin{macrocode} - self.suffix = ".tex" -% \end{macrocode} -% \par -% \begin{markdown} -% % Define \luamdef{writer->space} as the output format of a space character. % % \end{markdown} @@ -25153,19 +25515,6 @@ function M.writer.new(options) % \par % \begin{markdown} % -% Define \luamdef{writer->pack} as a function that will take the filename -% `name` of the output file prepared by the reader and transform it to the -% output format. -% -% \end{markdown} -% \begin{macrocode} - function self.pack(name) - return [[\input{]] .. name .. [[}\relax]] - end -% \end{macrocode} -% \par -% \begin{markdown} -% % Define \luamdef{writer->interblocksep} as the output format of a block % element separator. % @@ -25269,13 +25618,17 @@ function M.writer.new(options) ["{"] = "\\markdownRendererLeftBrace{}", ["}"] = "\\markdownRendererRightBrace{}", ["\\"] = "\\markdownRendererBackslash{}", + ["\r"] = " ", + ["\n"] = " ", } self.escaped_minimal_strings = { - ["^^"] = "\\markdownRendererCircumflex\\markdownRendererCircumflex ", + ["^^"] = "\\markdownRendererCircumflex" + .. "\\markdownRendererCircumflex ", ["☒"] = "\\markdownRendererTickedBox{}", ["⌛"] = "\\markdownRendererHalfTickedBox{}", ["☐"] = "\\markdownRendererUntickedBox{}", - [entities.hex_entity('FFFD')] = "\\markdownRendererReplacementCharacter{}", + [entities.hex_entity('FFFD')] + = "\\markdownRendererReplacementCharacter{}", } % \end{macrocode} % \par @@ -25310,7 +25663,8 @@ function M.writer.new(options) ["^"] = "\\markdownRendererCircumflex{}", ["~"] = "\\markdownRendererTilde{}", ["|"] = "\\markdownRendererPipe{}", - [entities.hex_entity('0000')] = "\\markdownRendererReplacementCharacter{}", + [entities.hex_entity('0000')] + = "\\markdownRendererReplacementCharacter{}", } % \end{macrocode} % \par @@ -25318,9 +25672,9 @@ function M.writer.new(options) % % Use the \luamref{writer->escaped_chars}, \luamref{writer->escaped_uri_chars}, % and \luamref{writer->escaped_minimal_strings} tables to create the -% \luamdef{writer->escape_typographic_text}, -% \luamdef{writer->escape_programmatic_text}, and -% \luamdef{writer->escape_minimal} escaper functions. +% \luamdef{escape_typographic_text}, +% \luamdef{escape_programmatic_text}, and +% \luamdef{escape_minimal} local escaper functions. % % \end{markdown} % \begin{macrocode} @@ -25372,6 +25726,30 @@ function M.writer.new(options) % \par % \begin{markdown} % +% Define \luamdef{writer->warning} as a function that will transform an input +% warning `t` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.warning(t) + return {"\\markdownRendererWarning{", self.identifier(t), "}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% +% Define \luamdef{writer->error} as a function that will transform an input +% error `t` to the output format. +% +% \end{markdown} +% \begin{macrocode} + function self.error(t) + return {"\\markdownRendererError{", self.identifier(t), "}"} + end +% \end{macrocode} +% \par +% \begin{markdown} +% % Define \luamdef{writer->code} as a function that will transform an input % inline code span `s` with optional attributes `attributes` to the output % format. @@ -25571,7 +25949,8 @@ function M.writer.new(options) % \begin{macrocode} function self.inline_html_tag(contents) if self.flatten_inlines then return contents end - return {"\\markdownRendererInlineHtmlTag{",self.string(contents),"}"} + return {"\\markdownRendererInlineHtmlTag{", + self.string(contents),"}"} end % \end{macrocode} % \par @@ -25862,8 +26241,10 @@ function M.writer.new(options) % \begin{macrocode} function self.push_attributes(attribute_type, attributes, start_output, end_output) - local attribute_type_level = self.attribute_type_levels[attribute_type] - self.attribute_type_levels[attribute_type] = attribute_type_level + 1 + local attribute_type_level + = self.attribute_type_levels[attribute_type] + self.attribute_type_levels[attribute_type] + = attribute_type_level + 1 -- index attributes in a hash table for easy lookup attributes = attributes or {} @@ -25918,8 +26299,10 @@ function M.writer.new(options) local attributes, _, end_output current_attribute_type, attributes, _, end_output = table.unpack( self.active_attributes[#self.active_attributes]) - local attribute_type_level = self.attribute_type_levels[current_attribute_type] - self.attribute_type_levels[current_attribute_type] = attribute_type_level - 1 + local attribute_type_level + = self.attribute_type_levels[current_attribute_type] + self.attribute_type_levels[current_attribute_type] + = attribute_type_level - 1 if self.is_writing and end_output ~= nil then table.insert(buf, end_output) end @@ -25953,7 +26336,8 @@ function M.writer.new(options) local prev_space = false local letter_found = false local normalized_s = s - if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then + if not options.unicodeNormalization + or options.unicodeNormalizationForm ~= "nfc" then normalized_s = uni_algos.normalize.NFC(normalized_s) end @@ -25970,7 +26354,8 @@ function M.writer.new(options) end end - -- Remove all non-alphanumeric characters, except underscores, hyphens, and periods. + -- Remove all non-alphanumeric characters, except underscores, + -- hyphens, and periods. if not unicode.utf8.match(char, "[%w_%-%.%s]") then goto continue end @@ -25998,7 +26383,8 @@ function M.writer.new(options) table.remove(buffer) end - local identifier = #buffer == 0 and "section" or table.concat(buffer, "") + local identifier = #buffer == 0 and "section" + or table.concat(buffer, "") return identifier end % \end{macrocode} @@ -26013,7 +26399,8 @@ function M.writer.new(options) local prev_space = false local letter_found = false local normalized_s = s - if not options.unicodeNormalization or options.unicodeNormalizationForm ~= "nfc" then + if not options.unicodeNormalization + or options.unicodeNormalizationForm ~= "nfc" then normalized_s = uni_algos.normalize.NFC(normalized_s) end @@ -26030,7 +26417,8 @@ function M.writer.new(options) end end - -- Remove all non-alphanumeric characters, except underscores and hyphens. + -- Remove all non-alphanumeric characters, except underscores + -- and hyphens. if not unicode.utf8.match(char, "[%w_%-%s]") then prev_space = false goto continue @@ -26059,7 +26447,8 @@ function M.writer.new(options) table.remove(buffer) end - local identifier = #buffer == 0 and "section" or table.concat(buffer, "") + local identifier = #buffer == 0 and "section" + or table.concat(buffer, "") return identifier end % \end{macrocode} @@ -26098,9 +26487,11 @@ function M.writer.new(options) table.insert(auto_identifiers, create_auto_identifier(flat_text)) end if self.options.gfmAutoIdentifiers then - table.insert(auto_identifiers, create_gfm_auto_identifier(flat_text)) + table.insert(auto_identifiers, + create_gfm_auto_identifier(flat_text)) end - local normalized_attributes = normalize_attributes(attributes, auto_identifiers) + local normalized_attributes = normalize_attributes(attributes, + auto_identifiers) -- push attributes for the new section local start_output = {} @@ -26116,7 +26507,8 @@ function M.writer.new(options) -- render the heading and its attributes if self.is_writing and #normalized_attributes > 0 then - table.insert(buf, "\\markdownRendererHeaderAttributeContextBegin\n") + table.insert(buf, + "\\markdownRendererHeaderAttributeContextBegin\n") table.insert(buf, self.attributes(normalized_attributes, false)) end @@ -26289,34 +26681,91 @@ parsers.ascii_punctuation = S("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~") % % \end{markdown} % \begin{macrocode} -parsers.punctuation = {} -(function() - local pathname = kpse.lookup("UnicodeData.txt") +;(function() + local pathname = assert(kpse.find_file("UnicodeData.txt"), + [[Could not locate file "UnicodeData.txt"]]) local file = assert(io.open(pathname, "r"), [[Could not open file "UnicodeData.txt"]]) +% \end{macrocode} +% \par +% \begin{markdown} +% +% In order to minimize the size and speed of the parser, we will first +% construct a prefix tree of UTF-8 encodings for all codepoints of a +% given code length. +% +% \end{markdown} +% \begin{macrocode} + local prefix_trees = {} for line in file:lines() do local codepoint, major_category = line:match("^(%x+);[^;]*;(%a)") if major_category == "P" or major_category == "S" then local code = unicode.utf8.char(tonumber(codepoint, 16)) - if parsers.punctuation[#code] == nil then - parsers.punctuation[#code] = parsers.fail + if prefix_trees[#code] == nil then + prefix_trees[#code] = {} end - local code_parser = parsers.succeed + local node = prefix_trees[#code] for i = 1, #code do local byte = code:sub(i, i) - local byte_parser = S(byte) - code_parser = code_parser - * byte_parser + if i < #code then + if node[byte] == nil then + node[byte] = {} + end + node = node[byte] + else + table.insert(node, byte) + end end - parsers.punctuation[#code] = parsers.punctuation[#code] - + code_parser end end assert(file:close()) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Next, we will construct a parser out of the prefix tree. +% +% \end{markdown} +% \begin{macrocode} + local function depth_first_search(node, path, visit, leave) + visit(node, path) + for label, child in pairs(node) do + if type(child) == "table" then + depth_first_search(child, path .. label, visit, leave) + else + visit(child, path) + end + end + leave(node, path) + end + + parsers.punctuation = {} + for length, prefix_tree in pairs(prefix_trees) do + local subparsers = {} + depth_first_search(prefix_tree, "", function(node, path) + if type(node) == "table" then + subparsers[path] = parsers.fail + else + assert(type(node) == "string") + subparsers[path] = subparsers[path] + S(node) + end + end, function(_, path) + if #path > 0 then + local byte = path:sub(#path, #path) + local parent_path = path:sub(1, #path-1) + subparsers[parent_path] = subparsers[parent_path] + + S(byte) * subparsers[path] + else + parsers.punctuation[length] = subparsers[path] + end + end) + assert(parsers.punctuation[length] ~= nil) + end end)() parsers.escapable = parsers.ascii_punctuation -parsers.anyescaped = parsers.backslash / "" * parsers.escapable +parsers.anyescaped = parsers.backslash / "" + * parsers.escapable + parsers.any parsers.spacechar = S("\t ") @@ -26335,14 +26784,18 @@ parsers.linechar = P(1 - parsers.newline) parsers.blankline = parsers.optionalspace * parsers.newline / "\n" parsers.blanklines = parsers.blankline^0 -parsers.skipblanklines = (parsers.optionalspace * parsers.newline)^0 +parsers.skipblanklines = ( parsers.optionalspace + * parsers.newline)^0 parsers.indentedline = parsers.indent /"" - * C(parsers.linechar^1 * parsers.newline^-1) + * C( parsers.linechar^1 + * parsers.newline^-1) parsers.optionallyindentedline = parsers.indent^-1 /"" - * C(parsers.linechar^1 * parsers.newline^-1) + * C( parsers.linechar^1 + * parsers.newline^-1) parsers.sp = parsers.spacing^0 parsers.spnl = parsers.optionalspace - * (parsers.newline * parsers.optionalspace)^-1 + * ( parsers.newline + * parsers.optionalspace)^-1 parsers.line = parsers.linechar^0 * parsers.newline parsers.nonemptyline = parsers.line - parsers.blankline % \end{macrocode} @@ -26425,7 +26878,8 @@ local function update_indent_table(indent_table, new_indent, add) if add then indent_table.indents[#indent_table.indents + 1] = new_indent else - if indent_table.indents[#indent_table.indents].name == new_indent.name then + if indent_table.indents[#indent_table.indents].name + == new_indent.name then indent_table.indents[#indent_table.indents] = nil end end @@ -26441,10 +26895,12 @@ end % \end{markdown} % \begin{macrocode} local function remove_indent(name) - local function remove_indent_level(s, i, indent_table) -- luacheck: ignore s i - indent_table = update_indent_table(indent_table, {name=name}, false) - return true, indent_table - end + local remove_indent_level = + function(s, i, indent_table) -- luacheck: ignore s i + indent_table = update_indent_table(indent_table, {name=name}, + false) + return true, indent_table + end return Cg(Cmt(Cb("indent_info"), remove_indent_level), "indent_info") end @@ -26460,7 +26916,8 @@ end % % \end{markdown} % \begin{macrocode} -local function process_starter_spacing(indent, spacing, minimum, left_strip_length) +local function process_starter_spacing(indent, spacing, + minimum, left_strip_length) left_strip_length = left_strip_length or 0 local count = 0 @@ -26497,14 +26954,16 @@ local function process_starter_spacing(indent, spacing, minimum, left_strip_leng minimum_remainder = minimum_remainder .. character elseif (count >= minimum) then minimum_found = true - minimum_remainder = minimum_remainder .. string.rep(" ", count - minimum) + minimum_remainder = minimum_remainder + .. string.rep(" ", count - minimum) end if (code_started) then code_start = code_start .. character elseif (count >= minimum + 4) then code_started = true - code_start = code_start .. string.rep(" ", count - (minimum + 4)) + code_start = code_start + .. string.rep(" ", count - (minimum + 4)) end end end @@ -26571,7 +27030,8 @@ end % % \end{markdown} % \begin{macrocode} -local function process_starter_indent(_, _, indent_table, starter, is_blank, indent_type, breakable) +local function process_starter_indent(_, _, indent_table, starter, + is_blank, indent_type, breakable) local last_trail = starter[1] local delimiter = starter[2] local raw_new_trail = starter[3] @@ -26599,11 +27059,13 @@ local function process_starter_indent(_, _, indent_table, starter, is_blank, ind local last_trail_length = #last_trail local delimiter_length = total_delimiter_length(delimiter) - local total_indent_level = preceding_indentation + last_trail_length + delimiter_length + local total_indent_level = preceding_indentation + last_trail_length + + delimiter_length local sp = {} if not is_blank then - sp = process_starter_spacing(total_indent_level, raw_new_trail, 0, 1) + sp = process_starter_spacing(total_indent_level, raw_new_trail, + 0, 1) end local del_trail_length = sp.left_total_stripped @@ -26613,12 +27075,17 @@ local function process_starter_indent(_, _, indent_table, starter, is_blank, ind del_trail_length = del_trail_length + #sp.remainder end - local indent_length = last_trail_length + delimiter_length + del_trail_length + local indent_length = last_trail_length + delimiter_length + + del_trail_length local new_indent_info = {name=indent_type, length=indent_length} - indent_table = update_indent_table(indent_table, new_indent_info, true) - indent_table = add_trail(indent_table, {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length, - full_remainder=sp.full_remainder}) + indent_table = update_indent_table(indent_table, new_indent_info, + true) + indent_table = add_trail(indent_table, + {is_code=sp.is_code, + remainder=sp.remainder, + total_length=sp.total_length, + full_remainder=sp.full_remainder}) return true, indent_table end @@ -26636,7 +27103,8 @@ local function decode_pattern(name) delimeter = parsers.more end - return C(parsers.optionalspace) * C(delimeter) * C(parsers.optionalspace) * Cp() + return C(parsers.optionalspace) * C(delimeter) + * C(parsers.optionalspace) * Cp() end % \end{macrocode} @@ -26677,7 +27145,8 @@ end % % \end{markdown} % \begin{macrocode} -local function traverse_indent(s, i, indent_table, is_optional, is_blank, current_line_indents) +local function traverse_indent(s, i, indent_table, is_optional, + is_blank, current_line_indents) local new_index = i local preceding_indentation = 0 @@ -26696,12 +27165,17 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren -- match decoded pattern local new_indent_info = lpeg.match(Ct(pattern), s, new_index) if new_indent_info == nil then - local blankline_end = lpeg.match(Ct(parsers.blankline * Cg(Cp(), "pos")), s, new_index) - if is_optional or not indent_table.ignore_blockquote_blank or not blankline_end then - return is_optional, new_index, current_trail, current_line_indents + local blankline_end = lpeg.match( + Ct(parsers.blankline * Cg(Cp(), "pos")), s, new_index) + if is_optional or not indent_table.ignore_blockquote_blank + or not blankline_end then + return is_optional, new_index, current_trail, + current_line_indents end - return traverse_indent(s, tonumber(blankline_end.pos), indent_table, is_optional, is_blank, current_line_indents) + return traverse_indent(s, tonumber(blankline_end.pos), + indent_table, is_optional, is_blank, + current_line_indents) end local raw_last_trail = new_indent_info[1] @@ -26714,13 +27188,15 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren -- check previous trail if not space_only and next(current_trail) == nil then local sp = process_starter_spacing(0, raw_last_trail, 0, 0) - current_trail = {is_code=sp.is_code, remainder=sp.remainder, total_length=sp.total_length, + current_trail = {is_code=sp.is_code, remainder=sp.remainder, + total_length=sp.total_length, full_remainder=sp.full_remainder} end if next(current_trail) ~= nil then if not space_only and current_trail.is_code then - return is_optional, new_index, current_trail, current_line_indents + return is_optional, new_index, current_trail, + current_line_indents end if current_trail.internal_remainder ~= nil then raw_last_trail = current_trail.internal_remainder @@ -26735,7 +27211,8 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren raw_last_trail_length = #raw_last_trail end - local total_indent_level = preceding_indentation + raw_last_trail_length + delimiter_length + local total_indent_level = preceding_indentation + + raw_last_trail_length + delimiter_length local spacing_to_process local minimum = 0 @@ -26749,13 +27226,17 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren minimum = value.length end - local sp = process_starter_spacing(total_indent_level, spacing_to_process, minimum, left_strip_length) + local sp = process_starter_spacing(total_indent_level, + spacing_to_process, minimum, + left_strip_length) if space_only and not sp.is_minimum then - return is_optional or (is_blank and blank_starter <= index), new_index, current_trail, current_line_indents + return is_optional or (is_blank and blank_starter <= index), + new_index, current_trail, current_line_indents end - local indent_length = raw_last_trail_length + delimiter_length + sp.left_total_stripped + local indent_length = raw_last_trail_length + delimiter_length + + sp.left_total_stripped -- update info for the next pattern if not space_only then @@ -26764,8 +27245,10 @@ local function traverse_indent(s, i, indent_table, is_optional, is_blank, curren preceding_indentation = preceding_indentation + value.length end - current_trail = {is_code=sp.is_code, remainder=sp.remainder, internal_remainder=sp.minimum_remainder, - total_length=sp.total_length, full_remainder=sp.full_remainder} + current_trail = {is_code=sp.is_code, remainder=sp.remainder, + internal_remainder=sp.minimum_remainder, + total_length=sp.total_length, + full_remainder=sp.full_remainder} current_line_indents[#current_line_indents + 1] = new_indent_info new_index = next_index @@ -26793,34 +27276,36 @@ end % % \end{markdown} % \begin{macrocode} -local function check_trail_joined(s, i, indent_table, spacing, expect_code, omit_remainder) -- luacheck: ignore s i - local is_code - local remainder +local check_trail_joined = + function(s, i, indent_table, -- luacheck: ignore s i + spacing, expect_code, omit_remainder) + local is_code + local remainder - if has_trail(indent_table) then - local trail = indent_table.trail - is_code = trail.is_code - if is_code then - remainder = trail.remainder - else - remainder = trail.full_remainder - end - else - local sp = process_starter_spacing(0, spacing, 0, 0) - is_code = sp.is_code - if is_code then - remainder = sp.remainder + if has_trail(indent_table) then + local trail = indent_table.trail + is_code = trail.is_code + if is_code then + remainder = trail.remainder + else + remainder = trail.full_remainder + end else - remainder = sp.full_remainder + local sp = process_starter_spacing(0, spacing, 0, 0) + is_code = sp.is_code + if is_code then + remainder = sp.remainder + else + remainder = sp.full_remainder + end end - end - local result = check_trail(expect_code, is_code) - if omit_remainder then - return result + local result = check_trail(expect_code, is_code) + if omit_remainder then + return result + end + return result, remainder end - return result, remainder -end % \end{macrocode} % \begin{markdown} @@ -26829,22 +27314,24 @@ end % % \end{markdown} % \begin{macrocode} -local function check_trail_length(s, i, indent_table, spacing, min, max) -- luacheck: ignore s i - local trail +local check_trail_length = + function(s, i, indent_table, -- luacheck: ignore s i + spacing, min, max) + local trail - if has_trail(indent_table) then - trail = indent_table.trail - else - trail = process_starter_spacing(0, spacing, 0, 0) - end + if has_trail(indent_table) then + trail = indent_table.trail + else + trail = process_starter_spacing(0, spacing, 0, 0) + end - local total_length = trail.total_length - if total_length == nil then - return false - end + local total_length = trail.total_length + if total_length == nil then + return false + end - return min <= total_length and total_length <= max -end + return min <= total_length and total_length <= max + end % \end{macrocode} % \begin{markdown} @@ -26854,7 +27341,8 @@ end % % \end{markdown} % \begin{macrocode} -local function check_continuation_indentation(s, i, indent_table, is_optional, is_blank) +local function check_continuation_indentation(s, i, indent_table, + is_optional, is_blank) if not has_indents(indent_table) then return true end @@ -26907,27 +27395,29 @@ end % % \end{markdown} % \begin{macrocode} -local function check_trail_type(s, i, trail, spacing, trail_type) -- luacheck: ignore s i - if trail == nil then - trail = process_starter_spacing(0, spacing, 0, 0) - end +local check_trail_type = + function(s, i, -- luacheck: ignore s i + trail, spacing, trail_type) + if trail == nil then + trail = process_starter_spacing(0, spacing, 0, 0) + end - if trail_type == "non-code" then - return check_trail(false, trail.is_code) - end - if trail_type == "code" then - return check_trail(true, trail.is_code) - end - if trail_type == "full-code" then - if (trail.is_code) then - return i, trail.remainder + if trail_type == "non-code" then + return check_trail(false, trail.is_code) + end + if trail_type == "code" then + return check_trail(true, trail.is_code) + end + if trail_type == "full-code" then + if (trail.is_code) then + return i, trail.remainder + end + return i, "" + end + if trail_type == "full-any" then + return i, trail.internal_remainder end - return i, "" - end - if trail_type == "full-any" then - return i, trail.internal_remainder end -end % \end{macrocode} % \begin{markdown} @@ -26936,20 +27426,22 @@ end % % \end{markdown} % \begin{macrocode} -local function trail_freezing(s, i, indent_table, is_freezing) -- luacheck: ignore s i - if is_freezing then - if indent_table.is_trail_frozen then - indent_table.trail = indent_table.frozen_trail +local trail_freezing = + function(s, i, -- luacheck: ignore s i + indent_table, is_freezing) + if is_freezing then + if indent_table.is_trail_frozen then + indent_table.trail = indent_table.frozen_trail + else + indent_table.frozen_trail = indent_table.trail + indent_table.is_trail_frozen = true + end else - indent_table.frozen_trail = indent_table.trail - indent_table.is_trail_frozen = true + indent_table.frozen_trail = nil + indent_table.is_trail_frozen = false end - else - indent_table.frozen_trail = nil - indent_table.is_trail_frozen = false + return true, indent_table end - return true, indent_table -end % \end{macrocode} % \begin{markdown} @@ -26960,53 +27452,59 @@ end % % \end{markdown} % \begin{macrocode} -local function check_continuation_indentation_and_trail(s, i, indent_table, is_optional, is_blank, trail_type, - reset_rem, omit_remainder) - if not has_indents(indent_table) then - local spacing, new_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i) - local result, remainder = check_trail_type(s, i, indent_table.trail, spacing, trail_type) - if remainder == nil then +local check_continuation_indentation_and_trail = + function (s, i, indent_table, is_optional, is_blank, trail_type, + reset_rem, omit_remainder) + if not has_indents(indent_table) then + local spacing, new_index = lpeg.match( C(parsers.spacechar^0) + * Cp(), s, i) + local result, remainder = check_trail_type(s, i, + indent_table.trail, spacing, trail_type) + if remainder == nil then + if result then + return new_index + end + return false + end if result then - return new_index + return new_index, remainder end return false end - if result then - return new_index, remainder - end - return false - end - local passes, new_index, current_trail = traverse_indent(s, i, indent_table, is_optional, is_blank) + local passes, new_index, current_trail = traverse_indent(s, i, + indent_table, is_optional, is_blank) + + if passes then + local spacing + if current_trail == nil then + local newer_spacing, newer_index = lpeg.match( + C(parsers.spacechar^0) * Cp(), s, i) + current_trail = process_starter_spacing(0, newer_spacing, 0, 0) + new_index = newer_index + spacing = newer_spacing + else + spacing = current_trail.remainder + end + local result, remainder = check_trail_type(s, new_index, + current_trail, spacing, trail_type) + if remainder == nil or omit_remainder then + if result then + return new_index + end + return false + end - if passes then - local spacing - if current_trail == nil then - local newer_spacing, newer_index = lpeg.match(C(parsers.spacechar^0) * Cp(), s, i) - current_trail = process_starter_spacing(0, newer_spacing, 0, 0) - new_index = newer_index - spacing = newer_spacing - else - spacing = current_trail.remainder - end - local result, remainder = check_trail_type(s, new_index, current_trail, spacing, trail_type) - if remainder == nil or omit_remainder then + if is_blank and reset_rem then + remainder = remove_remainder_if_blank(indent_table, remainder) + end if result then - return new_index + return new_index, remainder end return false end - - if is_blank and reset_rem then - remainder = remove_remainder_if_blank(indent_table, remainder) - end - if result then - return new_index, remainder - end return false end - return false -end % \end{macrocode} % \begin{markdown} @@ -27015,14 +27513,20 @@ end % % \end{markdown} % \begin{macrocode} -parsers.check_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false), check_trail_joined) +parsers.check_trail = Cmt( Cb("indent_info") * C(parsers.spacechar^0) + * Cc(false), check_trail_joined) -parsers.check_trail_no_rem = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(false) * Cc(true), check_trail_joined) +parsers.check_trail_no_rem = Cmt( Cb("indent_info") + * C(parsers.spacechar^0) * Cc(false) + * Cc(true), check_trail_joined) -parsers.check_code_trail = Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(true), check_trail_joined) +parsers.check_code_trail = Cmt( Cb("indent_info") + * C(parsers.spacechar^0) + * Cc(true), check_trail_joined) parsers.check_trail_length_range = function(min, max) - return Cmt(Cb("indent_info") * C(parsers.spacechar^0) * Cc(min) * Cc(max), check_trail_length) + return Cmt( Cb("indent_info") * C(parsers.spacechar^0) * Cc(min) + * Cc(max), check_trail_length) end parsers.check_trail_length = function(n) @@ -27037,9 +27541,11 @@ end % % \end{markdown} % \begin{macrocode} -parsers.freeze_trail = Cg(Cmt(Cb("indent_info") * Cc(true), trail_freezing), "indent_info") +parsers.freeze_trail = Cg( Cmt(Cb("indent_info") + * Cc(true), trail_freezing), "indent_info") -parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), trail_freezing), "indent_info") +parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), + trail_freezing), "indent_info") % \end{macrocode} % \begin{markdown} @@ -27048,11 +27554,16 @@ parsers.unfreeze_trail = Cg(Cmt(Cb("indent_info") * Cc(false), trail_freezing), % % \end{markdown} % \begin{macrocode} -parsers.check_minimal_indent = Cmt(Cb("indent_info") * Cc(false), check_continuation_indentation) +parsers.check_minimal_indent = Cmt(Cb("indent_info") * Cc(false), + check_continuation_indentation) -parsers.check_optional_indent = Cmt(Cb("indent_info") * Cc(true), check_continuation_indentation) +parsers.check_optional_indent = Cmt(Cb("indent_info") * Cc(true), + check_continuation_indentation) -parsers.check_minimal_blank_indent = Cmt(Cb("indent_info") * Cc(false) * Cc(true), check_continuation_indentation) +parsers.check_minimal_blank_indent + = Cmt( Cb("indent_info") * Cc(false) + * Cc(true) + , check_continuation_indentation) % \end{macrocode} % \begin{markdown} @@ -27063,37 +27574,45 @@ parsers.check_minimal_blank_indent = Cmt(Cb("indent_info") * Cc(false) * Cc(true % \end{markdown} % \begin{macrocode} -parsers.check_minimal_indent_and_trail = Cmt( Cb("indent_info") - * Cc(false) * Cc(false) * Cc("non-code") * Cc(true), - check_continuation_indentation_and_trail) +parsers.check_minimal_indent_and_trail = + Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("non-code") * Cc(true) + , check_continuation_indentation_and_trail) -parsers.check_minimal_indent_and_code_trail = Cmt( Cb("indent_info") - * Cc(false) * Cc(false) * Cc("code") * Cc(false), - check_continuation_indentation_and_trail) +parsers.check_minimal_indent_and_code_trail = + Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("code") * Cc(false) + , check_continuation_indentation_and_trail) -parsers.check_minimal_blank_indent_and_full_code_trail = Cmt( Cb("indent_info") - * Cc(false) * Cc(true) * Cc("full-code") * Cc(true), - check_continuation_indentation_and_trail) +parsers.check_minimal_blank_indent_and_full_code_trail = + Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-code") * Cc(true) + , check_continuation_indentation_and_trail) -parsers.check_minimal_indent_and_any_trail = Cmt( Cb("indent_info") - * Cc(false) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false), - check_continuation_indentation_and_trail) +parsers.check_minimal_indent_and_any_trail = + Cmt( Cb("indent_info") + * Cc(false) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false) + , check_continuation_indentation_and_trail) -parsers.check_minimal_blank_indent_and_any_trail = Cmt( Cb("indent_info") - * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false), - check_continuation_indentation_and_trail) +parsers.check_minimal_blank_indent_and_any_trail = + Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false) + , check_continuation_indentation_and_trail) -parsers.check_minimal_blank_indent_and_any_trail_no_rem = Cmt( Cb("indent_info") - * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(true), - check_continuation_indentation_and_trail) +parsers.check_minimal_blank_indent_and_any_trail_no_rem = + Cmt( Cb("indent_info") + * Cc(false) * Cc(true) * Cc("full-any") * Cc(true) * Cc(true) + , check_continuation_indentation_and_trail) -parsers.check_optional_indent_and_any_trail = Cmt( Cb("indent_info") - * Cc(true) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false), - check_continuation_indentation_and_trail) +parsers.check_optional_indent_and_any_trail = + Cmt( Cb("indent_info") + * Cc(true) * Cc(false) * Cc("full-any") * Cc(true) * Cc(false) + , check_continuation_indentation_and_trail) -parsers.check_optional_blank_indent_and_any_trail = Cmt( Cb("indent_info") - * Cc(true) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false), - check_continuation_indentation_and_trail) +parsers.check_optional_blank_indent_and_any_trail = + Cmt( Cb("indent_info") + * Cc(true) * Cc(true) * Cc("full-any") * Cc(true) * Cc(false) + , check_continuation_indentation_and_trail) % \end{macrocode} % \begin{markdown} @@ -27104,7 +27623,8 @@ parsers.check_optional_blank_indent_and_any_trail = Cmt( Cb("indent_info") % \begin{macrocode} parsers.spnlc_noexc = parsers.optionalspace - * (parsers.newline * parsers.check_minimal_indent_and_any_trail)^-1 + * ( parsers.newline + * parsers.check_minimal_indent_and_any_trail)^-1 parsers.spnlc = parsers.optionalspace * (V("EndlineNoSub"))^-1 @@ -27112,7 +27632,8 @@ parsers.spnlc = parsers.optionalspace parsers.spnlc_sep = parsers.optionalspace * V("EndlineNoSub") + parsers.spacechar^1 -parsers.only_blank = parsers.spacechar^0 * (parsers.newline + parsers.eof) +parsers.only_blank = parsers.spacechar^0 + * (parsers.newline + parsers.eof) % \end{macrocode} % \begin{figure} @@ -27159,64 +27680,66 @@ parsers.commented_line_letter = parsers.linechar + parsers.newline - parsers.backslash - parsers.percent -parsers.commented_line = Cg(Cc(""), "backslashes") - * ((#(parsers.commented_line_letter - - parsers.newline) - * Cb("backslashes") - * Cs(parsers.commented_line_letter - - parsers.newline)^1 -- initial - * Cg(Cc(""), "backslashes")) - + #(parsers.backslash * parsers.backslash) - * Cg((parsers.backslash -- even backslash - * parsers.backslash)^1, "backslashes") - + (parsers.backslash - * (#parsers.percent - * Cb("backslashes") - / function(backslashes) - return string.rep("\\", #backslashes / 2) - end - * C(parsers.percent) - + #parsers.commented_line_letter - * Cb("backslashes") - * Cc("\\") - * C(parsers.commented_line_letter)) - * Cg(Cc(""), "backslashes")))^0 - * (#parsers.percent - * Cb("backslashes") - / function(backslashes) - return string.rep("\\", #backslashes / 2) - end - * ((parsers.percent -- comment - * parsers.line - * #parsers.blankline) -- blank line - / "\n" - + parsers.percent -- comment - * parsers.line - * parsers.optionalspace) -- leading tabs and spaces - + #(parsers.newline) - * Cb("backslashes") - * C(parsers.newline)) - -parsers.chunk = parsers.line * (parsers.optionallyindentedline - - parsers.blankline)^0 - -parsers.attribute_key_char = parsers.alphanumeric + S("-_:.") -parsers.attribute_raw_char = parsers.alphanumeric + S("-_") -parsers.attribute_key = (parsers.attribute_key_char - - parsers.dash - parsers.digit) - * parsers.attribute_key_char^0 -parsers.attribute_value = ( (parsers.dquote / "") - * (parsers.anyescaped - parsers.dquote)^0 - * (parsers.dquote / "")) - + ( (parsers.squote / "") - * (parsers.anyescaped - parsers.squote)^0 - * (parsers.squote / "")) - + ( parsers.anyescaped - parsers.dquote - parsers.rbrace - - parsers.space)^0 -parsers.attribute_identifier = parsers.attribute_key_char^1 -parsers.attribute_classname = parsers.letter - * parsers.attribute_key_char^0 -parsers.attribute_raw = parsers.attribute_raw_char^1 +parsers.commented_line = Cg(Cc(""), "backslashes") + * ((#(parsers.commented_line_letter + - parsers.newline) + * Cb("backslashes") + * Cs(parsers.commented_line_letter + - parsers.newline)^1 -- initial + * Cg(Cc(""), "backslashes")) + + #(parsers.backslash * parsers.backslash) + * Cg((parsers.backslash -- even backslash + * parsers.backslash)^1, "backslashes") + + (parsers.backslash + * (#parsers.percent + * Cb("backslashes") + / function(backslashes) + return string.rep("\\", #backslashes / 2) + end + * C(parsers.percent) + + #parsers.commented_line_letter + * Cb("backslashes") + * Cc("\\") + * C(parsers.commented_line_letter)) + * Cg(Cc(""), "backslashes")))^0 + * (#parsers.percent + * Cb("backslashes") + / function(backslashes) + return string.rep("\\", #backslashes / 2) + end + * ((parsers.percent -- comment + * parsers.line + * #parsers.blankline) -- blank line + / "\n" + + parsers.percent -- comment + * parsers.line + * parsers.optionalspace) -- leading spaces + + #(parsers.newline) + * Cb("backslashes") + * C(parsers.newline)) + +parsers.chunk = parsers.line * (parsers.optionallyindentedline + - parsers.blankline)^0 + +parsers.attribute_key_char = parsers.alphanumeric + S("-_:.") +parsers.attribute_raw_char = parsers.alphanumeric + S("-_") +parsers.attribute_key = (parsers.attribute_key_char + - parsers.dash - parsers.digit) + * parsers.attribute_key_char^0 +parsers.attribute_value = ( (parsers.dquote / "") + * (parsers.anyescaped - parsers.dquote)^0 + * (parsers.dquote / "")) + + ( (parsers.squote / "") + * (parsers.anyescaped - parsers.squote)^0 + * (parsers.squote / "")) + + ( parsers.anyescaped + - parsers.dquote + - parsers.rbrace + - parsers.space)^0 +parsers.attribute_identifier = parsers.attribute_key_char^1 +parsers.attribute_classname = parsers.letter + * parsers.attribute_key_char^0 +parsers.attribute_raw = parsers.attribute_raw_char^1 parsers.attribute = (parsers.dash * Cc(".unnumbered")) + C( parsers.hash @@ -27224,7 +27747,9 @@ parsers.attribute = (parsers.dash * Cc(".unnumbered")) + C( parsers.period * parsers.attribute_classname) + Cs( parsers.attribute_key - * parsers.optionalspace * parsers.equal * parsers.optionalspace + * parsers.optionalspace + * parsers.equal + * parsers.optionalspace * parsers.attribute_value) parsers.attributes = parsers.lbrace * parsers.optionalspace @@ -27234,7 +27759,6 @@ parsers.attributes = parsers.lbrace * parsers.optionalspace * parsers.rbrace - parsers.raw_attribute = parsers.lbrace * parsers.optionalspace * parsers.equal @@ -27246,7 +27770,10 @@ parsers.raw_attribute = parsers.lbrace -- indented blocks with first line indented. parsers.indented_blocks = function(bl) return Cs( bl - * (parsers.blankline^1 * parsers.indent * -parsers.blankline * bl)^0 + * ( parsers.blankline^1 + * parsers.indent + * -parsers.blankline + * bl)^0 * (parsers.blankline^1 + parsers.eof) ) end % \end{macrocode} @@ -27262,15 +27789,18 @@ local function repeat_between(pattern, min, max) end parsers.hexentity = parsers.ampersand * parsers.hash * C(S("Xx")) - * C(repeat_between(parsers.hexdigit, 1, 6)) * parsers.semicolon + * C(repeat_between(parsers.hexdigit, 1, 6)) + * parsers.semicolon parsers.decentity = parsers.ampersand * parsers.hash - * C(repeat_between(parsers.digit, 1, 7)) * parsers.semicolon + * C(repeat_between(parsers.digit, 1, 7)) + * parsers.semicolon parsers.tagentity = parsers.ampersand * C(parsers.alphanumeric^1) * parsers.semicolon -parsers.html_entities = parsers.hexentity / entities.hex_entity_with_x_char - + parsers.decentity / entities.dec_entity - + parsers.tagentity / entities.char_entity +parsers.html_entities + = parsers.hexentity / entities.hex_entity_with_x_char + + parsers.decentity / entities.dec_entity + + parsers.tagentity / entities.char_entity % \end{macrocode} % \par % \begin{markdown} @@ -27284,7 +27814,8 @@ parsers.bullet = function(bullet_char, interrupting) if interrupting then allowed_end = C(parsers.spacechar^1) * #parsers.linechar else - allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) + allowed_end = C(parsers.spacechar^1) + + #(parsers.newline + parsers.eof) end return parsers.check_trail * Ct(C(bullet_char) * Cc("")) @@ -27342,7 +27873,8 @@ parsers.inticks = parsers.openticks % % \end{markdown} % \begin{macrocode} --- case-insensitive match (we assume s is lowercase). must be single byte encoding +-- case-insensitive match (we assume s is lowercase) +-- must be single byte encoding parsers.keyword_exact = function(s) local parser = P(0) for i=1,#s do @@ -27424,13 +27956,14 @@ parsers.block_keyword = parsers.keyword_exact("ul") -- end conditions -parsers.html_blankline_end_condition = parsers.linechar^0 - * ( parsers.newline - * (parsers.check_minimal_blank_indent_and_any_trail - * #parsers.blankline - + parsers.check_minimal_indent_and_any_trail) - * parsers.linechar^1)^0 - * (parsers.newline^-1 / "") +parsers.html_blankline_end_condition + = parsers.linechar^0 + * ( parsers.newline + * (parsers.check_minimal_blank_indent_and_any_trail + * #parsers.blankline + + parsers.check_minimal_indent_and_any_trail) + * parsers.linechar^1)^0 + * (parsers.newline^-1 / "") local function remove_trailing_blank_lines(s) return s:gsub("[\n\r]+%s*$", "") @@ -27452,9 +27985,14 @@ parsers.html_attribute_spacing = parsers.optionalspace * parsers.optionalspace + parsers.spacechar^1 -parsers.html_attribute_name = (parsers.letter + parsers.colon + parsers.underscore) - * (parsers.alphanumeric + parsers.colon + parsers.underscore - + parsers.period + parsers.dash)^0 +parsers.html_attribute_name = ( parsers.letter + + parsers.colon + + parsers.underscore) + * ( parsers.alphanumeric + + parsers.colon + + parsers.underscore + + parsers.period + + parsers.dash)^0 parsers.html_attribute_value = parsers.squote * (parsers.linechar - parsers.squote)^0 @@ -27462,9 +28000,15 @@ parsers.html_attribute_value = parsers.squote + parsers.dquote * (parsers.linechar - parsers.dquote)^0 * parsers.dquote - + ( parsers.any - parsers.spacechar - parsers.newline - - parsers.dquote - parsers.squote - parsers.backtick - - parsers.equal - parsers.less - parsers.more)^1 + + ( parsers.any + - parsers.spacechar + - parsers.newline + - parsers.dquote + - parsers.squote + - parsers.backtick + - parsers.equal + - parsers.less + - parsers.more)^1 parsers.html_inline_attribute_value = parsers.squote * (V("NoSoftLineBreakEndline") @@ -27478,30 +28022,41 @@ parsers.html_inline_attribute_value = parsers.squote - parsers.blankline^2 - parsers.dquote)^0 * parsers.dquote - + (parsers.any - parsers.spacechar - parsers.newline - - parsers.dquote - parsers.squote - parsers.backtick - - parsers.equal - parsers.less - parsers.more)^1 - -parsers.html_attribute_value_specification = parsers.optionalspace - * parsers.equal - * parsers.optionalspace - * parsers.html_attribute_value + + (parsers.any + - parsers.spacechar + - parsers.newline + - parsers.dquote + - parsers.squote + - parsers.backtick + - parsers.equal + - parsers.less + - parsers.more)^1 + +parsers.html_attribute_value_specification + = parsers.optionalspace + * parsers.equal + * parsers.optionalspace + * parsers.html_attribute_value parsers.html_spnl = parsers.optionalspace - * (V("NoSoftLineBreakEndline") * parsers.optionalspace)^-1 + * (V("NoSoftLineBreakEndline") + * parsers.optionalspace)^-1 -parsers.html_inline_attribute_value_specification = parsers.html_spnl - * parsers.equal - * parsers.html_spnl - * parsers.html_inline_attribute_value +parsers.html_inline_attribute_value_specification + = parsers.html_spnl + * parsers.equal + * parsers.html_spnl + * parsers.html_inline_attribute_value -parsers.html_attribute = parsers.html_attribute_spacing - * parsers.html_attribute_name - * parsers.html_inline_attribute_value_specification^-1 +parsers.html_attribute + = parsers.html_attribute_spacing + * parsers.html_attribute_name + * parsers.html_inline_attribute_value_specification^-1 -parsers.html_non_newline_attribute = parsers.spacechar^1 - * parsers.html_attribute_name - * parsers.html_attribute_value_specification^-1 +parsers.html_non_newline_attribute + = parsers.spacechar^1 + * parsers.html_attribute_name + * parsers.html_attribute_value_specification^-1 parsers.nested_breaking_blank = parsers.newline * parsers.check_minimal_blank_indent @@ -27511,49 +28066,59 @@ parsers.html_comment_start = P("<!--") parsers.html_comment_end = P("-->") -parsers.html_comment = Cs( parsers.html_comment_start - * parsers.html_until_end(parsers.html_comment_end)) +parsers.html_comment + = Cs( parsers.html_comment_start + * parsers.html_until_end(parsers.html_comment_end)) parsers.html_inline_comment = (parsers.html_comment_start / "") * -P(">") * -P("->") - * Cs((V("NoSoftLineBreakEndline") + parsers.any - - parsers.nested_breaking_blank - parsers.html_comment_end)^0) + * Cs(( V("NoSoftLineBreakEndline") + + parsers.any + - parsers.nested_breaking_blank + - parsers.html_comment_end)^0) * (parsers.html_comment_end / "") parsers.html_cdatasection_start = P("<![CDATA[") parsers.html_cdatasection_end = P("]]>") -parsers.html_cdatasection = Cs( parsers.html_cdatasection_start - * parsers.html_until_end(parsers.html_cdatasection_end)) +parsers.html_cdatasection + = Cs( parsers.html_cdatasection_start + * parsers.html_until_end(parsers.html_cdatasection_end)) -parsers.html_inline_cdatasection = parsers.html_cdatasection_start - * Cs(V("NoSoftLineBreakEndline") + parsers.any - - parsers.nested_breaking_blank - parsers.html_cdatasection_end)^0 - * parsers.html_cdatasection_end +parsers.html_inline_cdatasection + = parsers.html_cdatasection_start + * Cs(V("NoSoftLineBreakEndline") + parsers.any + - parsers.nested_breaking_blank - parsers.html_cdatasection_end)^0 + * parsers.html_cdatasection_end parsers.html_declaration_start = P("<!") * parsers.letter parsers.html_declaration_end = P(">") -parsers.html_declaration = Cs( parsers.html_declaration_start - * parsers.html_until_end(parsers.html_declaration_end)) +parsers.html_declaration + = Cs( parsers.html_declaration_start + * parsers.html_until_end(parsers.html_declaration_end)) -parsers.html_inline_declaration = parsers.html_declaration_start - * Cs(V("NoSoftLineBreakEndline") + parsers.any - - parsers.nested_breaking_blank - parsers.html_declaration_end)^0 - * parsers.html_declaration_end +parsers.html_inline_declaration + = parsers.html_declaration_start + * Cs(V("NoSoftLineBreakEndline") + parsers.any + - parsers.nested_breaking_blank - parsers.html_declaration_end)^0 + * parsers.html_declaration_end parsers.html_instruction_start = P("<?") parsers.html_instruction_end = P("?>") -parsers.html_instruction = Cs( parsers.html_instruction_start - * parsers.html_until_end(parsers.html_instruction_end)) +parsers.html_instruction + = Cs( parsers.html_instruction_start + * parsers.html_until_end(parsers.html_instruction_end)) parsers.html_inline_instruction = parsers.html_instruction_start - * Cs(V("NoSoftLineBreakEndline") + parsers.any - - parsers.nested_breaking_blank - parsers.html_instruction_end)^0 + * Cs( V("NoSoftLineBreakEndline") + + parsers.any + - parsers.nested_breaking_blank + - parsers.html_instruction_end)^0 * parsers.html_instruction_end parsers.html_blankline = parsers.newline @@ -27599,25 +28164,28 @@ parsers.incomplete_tag_following = parsers.spacechar + parsers.slash * parsers.more + #(parsers.newline + parsers.eof) -parsers.incomplete_special_tag_following = parsers.spacechar - + parsers.more - + #(parsers.newline + parsers.eof) +parsers.incomplete_special_tag_following = parsers.spacechar + + parsers.more + + #( parsers.newline + + parsers.eof) parsers.html_incomplete_open_tag = parsers.html_tag_start * parsers.block_keyword * parsers.incomplete_tag_following -parsers.html_incomplete_open_special_tag = parsers.html_tag_start - * parsers.special_block_keyword - * parsers.incomplete_special_tag_following +parsers.html_incomplete_open_special_tag + = parsers.html_tag_start + * parsers.special_block_keyword + * parsers.incomplete_special_tag_following parsers.html_incomplete_close_tag = parsers.html_tag_closing_start * parsers.block_keyword * parsers.incomplete_tag_following -parsers.html_incomplete_close_special_tag = parsers.html_tag_closing_start - * parsers.special_block_keyword - * parsers.incomplete_tag_following +parsers.html_incomplete_close_special_tag + = parsers.html_tag_closing_start + * parsers.special_block_keyword + * parsers.incomplete_tag_following -- closing tags parsers.html_close_tag = parsers.html_tag_closing_start @@ -27655,27 +28223,33 @@ parsers.html_empty_special_tag = parsers.html_tag_start * parsers.html_attribute^0 * parsers.html_empty_tag_end -parsers.html_incomplete_blocks = parsers.html_incomplete_open_tag - + parsers.html_incomplete_open_special_tag - + parsers.html_incomplete_close_tag +parsers.html_incomplete_blocks + = parsers.html_incomplete_open_tag + + parsers.html_incomplete_open_special_tag + + parsers.html_incomplete_close_tag -- parse special html blocks -parsers.html_blankline_ending_special_block_opening = (parsers.html_close_special_tag - + parsers.html_empty_special_tag) - * #(parsers.optionalspace - * (parsers.newline + parsers.eof)) +parsers.html_blankline_ending_special_block_opening + = ( parsers.html_close_special_tag + + parsers.html_empty_special_tag) + * #( parsers.optionalspace + * (parsers.newline + parsers.eof)) -parsers.html_blankline_ending_special_block = parsers.html_blankline_ending_special_block_opening - * parsers.html_blankline_end_condition +parsers.html_blankline_ending_special_block + = parsers.html_blankline_ending_special_block_opening + * parsers.html_blankline_end_condition -parsers.html_special_block_opening = parsers.html_incomplete_open_special_tag - - parsers.html_empty_special_tag +parsers.html_special_block_opening + = parsers.html_incomplete_open_special_tag + - parsers.html_empty_special_tag -parsers.html_closing_special_block = parsers.html_special_block_opening - * parsers.html_until_end(parsers.html_close_special_tag) +parsers.html_closing_special_block + = parsers.html_special_block_opening + * parsers.html_until_end(parsers.html_close_special_tag) -parsers.html_special_block = parsers.html_blankline_ending_special_block - + parsers.html_closing_special_block +parsers.html_special_block + = parsers.html_blankline_ending_special_block + + parsers.html_closing_special_block -- parse html blocks parsers.html_block_opening = parsers.html_incomplete_open_tag @@ -27685,18 +28259,21 @@ parsers.html_block = parsers.html_block_opening * parsers.html_blankline_end_condition -- parse any html blocks -parsers.html_any_block_opening = (parsers.html_any_open_tag - + parsers.html_any_close_tag - + parsers.html_any_empty_tag) - * #(parsers.optionalspace * (parsers.newline + parsers.eof)) +parsers.html_any_block_opening + = ( parsers.html_any_open_tag + + parsers.html_any_close_tag + + parsers.html_any_empty_tag) + * #(parsers.optionalspace * (parsers.newline + parsers.eof)) parsers.html_any_block = parsers.html_any_block_opening * parsers.html_blankline_end_condition parsers.html_inline_comment_full = parsers.html_comment_start * -P(">") * -P("->") - * Cs((V("NoSoftLineBreakEndline") + parsers.any - P("--") - - parsers.nested_breaking_blank - parsers.html_comment_end)^0) + * Cs(( V("NoSoftLineBreakEndline") + + parsers.any - P("--") + - parsers.nested_breaking_blank + - parsers.html_comment_end)^0) * parsers.html_comment_end parsers.html_inline_tags = parsers.html_inline_comment_full @@ -27729,21 +28306,25 @@ parsers.auto_link_scheme = parsers.letter * parsers.auto_link_scheme_part^-30 parsers.absolute_uri = parsers.auto_link_scheme * parsers.colon - * (parsers.any - parsers.spacing - parsers.less - parsers.more)^0 + * ( parsers.any - parsers.spacing + - parsers.less - parsers.more)^0 parsers.printable_characters = S(".!#$%&'*+/=?^_`{|}~-") parsers.email_address_local_part_char = parsers.alphanumeric + parsers.printable_characters -parsers.email_address_local_part = parsers.email_address_local_part_char^1 +parsers.email_address_local_part + = parsers.email_address_local_part_char^1 parsers.email_address_dns_label = parsers.alphanumeric - * (parsers.alphanumeric + parsers.dash)^-62 + * ( parsers.alphanumeric + + parsers.dash)^-62 * B(parsers.alphanumeric) parsers.email_address_domain = parsers.email_address_dns_label - * (parsers.period * parsers.email_address_dns_label)^0 + * ( parsers.period + * parsers.email_address_dns_label)^0 parsers.email_address = parsers.email_address_local_part * parsers.at @@ -27799,25 +28380,37 @@ parsers.link_text = parsers.lbracket + parsers.autolink + V("InlineHtml") + ( parsers.backslash * parsers.backslash) - + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + ( parsers.backslash + * ( parsers.lbracket + + parsers.rbracket) + V("NoSoftLineBreakSpace") + V("NoSoftLineBreakEndline") + (parsers.any - - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^0) + - ( parsers.newline + + parsers.lbracket + + parsers.rbracket + + parsers.blankline^2))))^0) * parsers.rbracket parsers.link_label_body = -#(parsers.sp * parsers.rbracket) - * #((parsers.any - parsers.rbracket)^-999 * parsers.rbracket) + * #( ( parsers.any + - parsers.rbracket)^-999 + * parsers.rbracket) * Cs((parsers.alphanumeric^1 + parsers.inticks + parsers.autolink + V("InlineHtml") + ( parsers.backslash * parsers.backslash) - + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + ( parsers.backslash + * ( parsers.lbracket + + parsers.rbracket) + V("NoSoftLineBreakSpace") + V("NoSoftLineBreakEndline") + (parsers.any - - (parsers.newline + parsers.lbracket + parsers.rbracket + parsers.blankline^2))))^1) + - ( parsers.newline + + parsers.lbracket + + parsers.rbracket + + parsers.blankline^2))))^1) parsers.link_label = parsers.lbracket * parsers.link_label_body @@ -27847,29 +28440,38 @@ parsers.title_s = parsers.squote * Cs((parsers.html_entities + V("NoSoftLineBreakSpace") + V("NoSoftLineBreakEndline") - + (parsers.anyescaped - parsers.newline - parsers.squote - parsers.blankline^2))^0) + + ( parsers.anyescaped + - parsers.newline + - parsers.squote + - parsers.blankline^2))^0) * parsers.squote parsers.title_d = parsers.dquote * Cs((parsers.html_entities + V("NoSoftLineBreakSpace") + V("NoSoftLineBreakEndline") - + (parsers.anyescaped - parsers.newline - parsers.dquote - parsers.blankline^2))^0) + + ( parsers.anyescaped + - parsers.newline + - parsers.dquote + - parsers.blankline^2))^0) * parsers.dquote parsers.title_p = parsers.lparent * Cs((parsers.html_entities + V("NoSoftLineBreakSpace") + V("NoSoftLineBreakEndline") - + (parsers.anyescaped - parsers.newline - parsers.lparent - parsers.rparent + + ( parsers.anyescaped + - parsers.newline + - parsers.lparent + - parsers.rparent - parsers.blankline^2))^0) * parsers.rparent -parsers.title = parsers.title_d + parsers.title_s + parsers.title_p +parsers.title + = parsers.title_d + parsers.title_s + parsers.title_p parsers.optionaltitle - = parsers.spnlc * parsers.title * parsers.spacechar^0 - + Cc("") + = parsers.spnlc * parsers.title * parsers.spacechar^0 + Cc("") % \end{macrocode} % \par @@ -27880,9 +28482,11 @@ parsers.optionaltitle % \end{markdown} % \begin{macrocode} -- parse a reference definition: [foo]: /bar "title" -parsers.define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon +parsers.define_reference_parser = (parsers.check_trail / "") + * parsers.link_label * parsers.colon * parsers.spnlc * parsers.url - * ( parsers.spnlc_sep * parsers.title * parsers.only_blank + * ( parsers.spnlc_sep * parsers.title + * parsers.only_blank + Cc("") * parsers.only_blank) % \end{macrocode} % \par @@ -27897,7 +28501,10 @@ parsers.Inline = V("Inline") -- parse many p between starter and ender parsers.between = function(p, starter, ender) local ender2 = B(parsers.nonspacechar) * ender - return (starter * #parsers.nonspacechar * Ct(p * (p - ender2)^0) * ender2) + return ( starter + * #parsers.nonspacechar + * Ct(p * (p - ender2)^0) + * ender2) end % \end{macrocode} @@ -27909,7 +28516,8 @@ end % \end{markdown} % \begin{macrocode} parsers.lineof = function(c) - return (parsers.check_trail_no_rem * (P(c) * parsers.optionalspace)^3 + return ( parsers.check_trail_no_rem + * (P(c) * parsers.optionalspace)^3 * (parsers.newline + parsers.eof)) end @@ -27929,8 +28537,11 @@ parsers.heading_start = #parsers.hash * C(parsers.hash^-6) * -parsers.hash / length -- parse setext header ending and return level -parsers.heading_level = parsers.nonindentspace * parsers.equal^1 * parsers.optionalspace * #parsers.newline * Cc(1) - + parsers.nonindentspace * parsers.dash^1 * parsers.optionalspace * #parsers.newline * Cc(2) +parsers.heading_level + = parsers.nonindentspace * parsers.equal^1 + * parsers.optionalspace * #parsers.newline * Cc(1) + + parsers.nonindentspace * parsers.dash^1 + * parsers.optionalspace * #parsers.newline * Cc(2) local function strip_atx_end(s) return s:gsub("%s+#*%s*\n$","") @@ -28102,9 +28713,11 @@ function M.reader.new(writer, options) local prefix = lpeg.match(C(parsers.optionalspace), line) local prefix_length = #prefix local is_shorter = min_prefix_length == nil - is_shorter = is_shorter or prefix_length < min_prefix_length + if not is_shorter then + is_shorter = prefix_length < min_prefix_length + end if is_shorter then - min_prefix_length, min_prefix = prefix_length, prefix + min_prefix_length, min_prefix = prefix_length, prefix end return line end) @@ -28126,7 +28739,8 @@ function M.reader.new(writer, options) end local res = lpeg.match(grammar(), str) if res == nil then - error(format("%s failed on:\n%s", name, str:sub(1,20))) + return writer.error(format("%s failed on:\n%s", + name, str:sub(1,20))) else return res end @@ -28176,35 +28790,47 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - parsers.minimally_indented_blankline = parsers.check_minimal_indent * (parsers.blankline / "") + parsers.minimally_indented_blankline + = parsers.check_minimal_indent * (parsers.blankline / "") - parsers.minimally_indented_block = parsers.check_minimal_indent * V("Block") + parsers.minimally_indented_block + = parsers.check_minimal_indent * V("Block") - parsers.minimally_indented_block_or_paragraph = parsers.check_minimal_indent * V("BlockOrParagraph") + parsers.minimally_indented_block_or_paragraph + = parsers.check_minimal_indent * V("BlockOrParagraph") - parsers.minimally_indented_paragraph = parsers.check_minimal_indent * V("Paragraph") + parsers.minimally_indented_paragraph + = parsers.check_minimal_indent * V("Paragraph") - parsers.minimally_indented_plain = parsers.check_minimal_indent * V("Plain") + parsers.minimally_indented_plain + = parsers.check_minimal_indent * V("Plain") - parsers.minimally_indented_par_or_plain = parsers.minimally_indented_paragraph - + parsers.minimally_indented_plain + parsers.minimally_indented_par_or_plain + = parsers.minimally_indented_paragraph + + parsers.minimally_indented_plain - parsers.minimally_indented_par_or_plain_no_blank = parsers.minimally_indented_par_or_plain - - parsers.minimally_indented_blankline + parsers.minimally_indented_par_or_plain_no_blank + = parsers.minimally_indented_par_or_plain + - parsers.minimally_indented_blankline - parsers.minimally_indented_ref = parsers.check_minimal_indent * V("Reference") + parsers.minimally_indented_ref + = parsers.check_minimal_indent * V("Reference") - parsers.minimally_indented_blank = parsers.check_minimal_indent * V("Blank") + parsers.minimally_indented_blank + = parsers.check_minimal_indent * V("Blank") - parsers.conditionally_indented_blankline = parsers.check_minimal_blank_indent * (parsers.blankline / "") + parsers.conditionally_indented_blankline + = parsers.check_minimal_blank_indent * (parsers.blankline / "") - parsers.minimally_indented_ref_or_block = parsers.minimally_indented_ref - + parsers.minimally_indented_block - - parsers.minimally_indented_blankline + parsers.minimally_indented_ref_or_block + = parsers.minimally_indented_ref + + parsers.minimally_indented_block + - parsers.minimally_indented_blankline - parsers.minimally_indented_ref_or_block_or_par = parsers.minimally_indented_ref - + parsers.minimally_indented_block_or_paragraph - - parsers.minimally_indented_blankline + parsers.minimally_indented_ref_or_block_or_par + = parsers.minimally_indented_ref + + parsers.minimally_indented_block_or_paragraph + - parsers.minimally_indented_blankline % \end{macrocode} % \begin{markdown} @@ -28214,7 +28840,8 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} - parsers.separator_loop = function(separated_block, paragraph, block_separator, paragraph_separator) + function parsers.separator_loop(separated_block, paragraph, + block_separator, paragraph_separator) return separated_block + block_separator * paragraph @@ -28223,10 +28850,14 @@ function M.reader.new(writer, options) * paragraph end - parsers.create_loop_body_pair = function(separated_block, paragraph, block_separator, paragraph_separator) + function parsers.create_loop_body_pair(separated_block, paragraph, + block_separator, + paragraph_separator) return { - block = parsers.separator_loop(separated_block, paragraph, block_separator, block_separator), - par = parsers.separator_loop(separated_block, paragraph, block_separator, paragraph_separator) + block = parsers.separator_loop(separated_block, paragraph, + block_separator, block_separator), + par = parsers.separator_loop(separated_block, paragraph, + block_separator, paragraph_separator) } end @@ -28249,18 +28880,20 @@ function M.reader.new(writer, options) parsers.content_blank = parsers.minimally_indented_blankline - parsers.ref_or_block_separated = parsers.sep_group_no_output(parsers.content_blank) - * ( parsers.minimally_indented_ref - - parsers.content_blank) - + parsers.block_sep_group(parsers.content_blank) - * ( parsers.minimally_indented_block - - parsers.content_blank) + parsers.ref_or_block_separated + = parsers.sep_group_no_output(parsers.content_blank) + * ( parsers.minimally_indented_ref + - parsers.content_blank) + + parsers.block_sep_group(parsers.content_blank) + * ( parsers.minimally_indented_block + - parsers.content_blank) parsers.loop_body_pair = - parsers.create_loop_body_pair(parsers.ref_or_block_separated, - parsers.minimally_indented_par_or_plain_no_blank, - parsers.block_sep_group(parsers.content_blank), - parsers.par_sep_group(parsers.content_blank)) + parsers.create_loop_body_pair( + parsers.ref_or_block_separated, + parsers.minimally_indented_par_or_plain_no_blank, + parsers.block_sep_group(parsers.content_blank), + parsers.par_sep_group(parsers.content_blank)) parsers.content_loop = ( V("Block") * parsers.loop_body_pair.block^0 @@ -28284,7 +28917,8 @@ function M.reader.new(writer, options) parsers.add_indent = function(pattern, name, breakable) return Cg(Cmt( Cb("indent_info") * Ct(pattern) - * (#parsers.linechar * Cc(false) + Cc(true)) -- check if starter is blank + * ( #parsers.linechar -- check if starter is blank + * Cc(false) + Cc(true)) * Cc(name) * Cc(breakable), process_starter_indent), "indent_info") @@ -28312,7 +28946,8 @@ function M.reader.new(writer, options) allowed_end = C(parsers.spacechar^1) * #parsers.linechar else delimiter_range = parsers.dig * parsers.dig^-8 - allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) + allowed_end = C(parsers.spacechar^1) + + #(parsers.newline + parsers.eof) end return parsers.check_trail @@ -28334,16 +28969,21 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - parsers.blockquote_start = parsers.check_trail * C(parsers.more) * C(parsers.spacechar^0) + parsers.blockquote_start + = parsers.check_trail + * C(parsers.more) + * C(parsers.spacechar^0) - parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", true) - * parsers.indented_content() - * remove_indent("bq") + parsers.blockquote_body + = parsers.add_indent(parsers.blockquote_start, "bq", true) + * parsers.indented_content() + * remove_indent("bq") if not options.breakableBlockquotes then - parsers.blockquote_body = parsers.add_indent(parsers.blockquote_start, "bq", false) - * parsers.indented_content() - * remove_indent("bq") + parsers.blockquote_body + = parsers.add_indent(parsers.blockquote_start, "bq", false) + * parsers.indented_content() + * remove_indent("bq") end % \end{macrocode} % \par @@ -28357,7 +28997,8 @@ function M.reader.new(writer, options) % \begin{macrocode} local function parse_content_part(content_part) local rope = util.rope_to_string(content_part) - local parsed = self.parser_functions.parse_inlines_no_link_or_emphasis(rope) + local parsed + = self.parser_functions.parse_inlines_no_link_or_emphasis(rope) parsed.indent_info = nil return parsed end @@ -28369,37 +29010,40 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function collect_emphasis_content(t, opening_index, closing_index) - local content = {} + local collect_emphasis_content = + function(t, opening_index, closing_index) + local content = {} - local content_part = {} - for i = opening_index, closing_index do - local value = t[i] + local content_part = {} + for i = opening_index, closing_index do + local value = t[i] - if value.rendered ~= nil then - content[#content + 1] = parse_content_part(content_part) - content_part = {} - content[#content + 1] = value.rendered - value.rendered = nil - else - if value.type == "delimiter" and value.element == "emphasis" then - if value.is_active then - content_part[#content_part + 1] = string.rep(value.character, value.current_count) - end + if value.rendered ~= nil then + content[#content + 1] = parse_content_part(content_part) + content_part = {} + content[#content + 1] = value.rendered + value.rendered = nil else - content_part[#content_part + 1] = value.content + if value.type == "delimiter" + and value.element == "emphasis" then + if value.is_active then + content_part[#content_part + 1] + = string.rep(value.character, value.current_count) + end + else + content_part[#content_part + 1] = value.content + end + value.content = '' + value.is_active = false end - value.content = '' - value.is_active = false end - end - if next(content_part) ~= nil then - content[#content + 1] = parse_content_part(content_part) - end + if next(content_part) ~= nil then + content[#content + 1] = parse_content_part(content_part) + end - return content - end + return content + end % \end{macrocode} % \begin{markdown} @@ -28410,7 +29054,9 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function fill_emph(t, opening_index, closing_index) - local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1) + local content + = collect_emphasis_content(t, opening_index + 1, + closing_index - 1) t[opening_index + 1].is_active = true t[opening_index + 1].rendered = writer.emphasis(content) end @@ -28424,7 +29070,9 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function fill_strong(t, opening_index, closing_index) - local content = collect_emphasis_content(t, opening_index + 1, closing_index - 1) + local content + = collect_emphasis_content(t, opening_index + 1, + closing_index - 1) t[opening_index + 1].is_active = true t[opening_index + 1].rendered = writer.strong(content) end @@ -28438,9 +29086,12 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function breaks_three_rule(opening_delimiter, closing_delimiter) - return (opening_delimiter.is_closing or closing_delimiter.is_opening) and - ((opening_delimiter.original_count + closing_delimiter.original_count) % 3 == 0) and - (opening_delimiter.original_count % 3 ~= 0 or closing_delimiter.original_count % 3 ~= 0) + return ( opening_delimiter.is_closing + or closing_delimiter.is_opening) + and (( opening_delimiter.original_count + + closing_delimiter.original_count) % 3 == 0) + and ( opening_delimiter.original_count % 3 ~= 0 + or closing_delimiter.original_count % 3 ~= 0) end % \end{macrocode} @@ -28452,7 +29103,8 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function find_emphasis_opener(t, bottom_index, latest_index, character, closing_delimiter) + local find_emphasis_opener = function(t, bottom_index, latest_index, + character, closing_delimiter) for i = latest_index, bottom_index, -1 do local value = t[i] if value.is_active and @@ -28516,12 +29168,18 @@ function M.reader.new(writer, options) local is_opening = value.is_opening local closing_length_modulo_three = value.original_count % 3 - local current_openers_bottom = openers_bottom[character][is_opening][closing_length_modulo_three + 1] + local current_openers_bottom + = openers_bottom[character][is_opening] + [closing_length_modulo_three + 1] - local opener_position = find_emphasis_opener(t, current_openers_bottom, current_position - 1, character, value) + local opener_position + = find_emphasis_opener(t, current_openers_bottom, + current_position - 1, character, value) if (opener_position == nil) then - openers_bottom[character][is_opening][closing_length_modulo_three + 1] = current_position + openers_bottom[character][is_opening] + [closing_length_modulo_three + 1] + = current_position current_position = current_position + 1 goto continue end @@ -28531,7 +29189,8 @@ function M.reader.new(writer, options) local current_opening_count = opening_delimiter.current_count local current_closing_count = t[current_position].current_count - if (current_opening_count >= 2) and (current_closing_count >= 2) then + if (current_opening_count >= 2) + and (current_closing_count >= 2) then opening_delimiter.current_count = current_opening_count - 2 t[current_position].current_count = current_closing_count - 2 fill_strong(t, opener_position, current_position) @@ -28615,15 +29274,19 @@ function M.reader.new(writer, options) return check_unicode_type(s, i, 0, 3, "%s") end - parsers.unicode_preceding_punctuation = B(parsers.escapable) - + Cmt(parsers.succeed, check_preceding_unicode_punctuation) + parsers.unicode_preceding_punctuation + = B(parsers.escapable) + + Cmt(parsers.succeed, check_preceding_unicode_punctuation) - parsers.unicode_preceding_whitespace = Cmt(parsers.succeed, check_preceding_unicode_whitespace) + parsers.unicode_preceding_whitespace + = Cmt(parsers.succeed, check_preceding_unicode_whitespace) - parsers.unicode_following_punctuation = #parsers.escapable - + Cmt(parsers.succeed, check_following_unicode_punctuation) + parsers.unicode_following_punctuation + = #parsers.escapable + + Cmt(parsers.succeed, check_following_unicode_punctuation) - parsers.unicode_following_whitespace = Cmt(parsers.succeed, check_following_unicode_whitespace) + parsers.unicode_following_whitespace + = Cmt(parsers.succeed, check_following_unicode_whitespace) parsers.delimiter_run = function(character) return (B(parsers.backslash * character) + -B(character)) @@ -28633,49 +29296,58 @@ function M.reader.new(writer, options) parsers.left_flanking_delimiter_run = function(character) return (B( parsers.any) - * (parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace) + * ( parsers.unicode_preceding_punctuation + + parsers.unicode_preceding_whitespace) + -B(parsers.any)) * parsers.delimiter_run(character) * parsers.unicode_following_punctuation + parsers.delimiter_run(character) - * -#(parsers.unicode_following_punctuation + parsers.unicode_following_whitespace + * -#( parsers.unicode_following_punctuation + + parsers.unicode_following_whitespace + parsers.eof) end parsers.right_flanking_delimiter_run = function(character) return parsers.unicode_preceding_punctuation * parsers.delimiter_run(character) - * (parsers.unicode_following_punctuation + parsers.unicode_following_whitespace + * ( parsers.unicode_following_punctuation + + parsers.unicode_following_whitespace + parsers.eof) + (B(parsers.any) - * -(parsers.unicode_preceding_punctuation + parsers.unicode_preceding_whitespace)) + * -( parsers.unicode_preceding_punctuation + + parsers.unicode_preceding_whitespace)) * parsers.delimiter_run(character) end if options.underscores then - parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk) - + (-#parsers.right_flanking_delimiter_run(parsers.underscore) - + (parsers.unicode_preceding_punctuation - * #parsers.right_flanking_delimiter_run(parsers.underscore))) - * parsers.left_flanking_delimiter_run(parsers.underscore) - - parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk) - + (-#parsers.left_flanking_delimiter_run(parsers.underscore) - + #(parsers.left_flanking_delimiter_run(parsers.underscore) - * parsers.unicode_following_punctuation)) - * parsers.right_flanking_delimiter_run(parsers.underscore) + parsers.emph_start + = parsers.left_flanking_delimiter_run(parsers.asterisk) + + ( -#parsers.right_flanking_delimiter_run(parsers.underscore) + + ( parsers.unicode_preceding_punctuation + * #parsers.right_flanking_delimiter_run(parsers.underscore))) + * parsers.left_flanking_delimiter_run(parsers.underscore) + + parsers.emph_end + = parsers.right_flanking_delimiter_run(parsers.asterisk) + + ( -#parsers.left_flanking_delimiter_run(parsers.underscore) + + #( parsers.left_flanking_delimiter_run(parsers.underscore) + * parsers.unicode_following_punctuation)) + * parsers.right_flanking_delimiter_run(parsers.underscore) else - parsers.emph_start = parsers.left_flanking_delimiter_run(parsers.asterisk) + parsers.emph_start + = parsers.left_flanking_delimiter_run(parsers.asterisk) - parsers.emph_end = parsers.right_flanking_delimiter_run(parsers.asterisk) + parsers.emph_end + = parsers.right_flanking_delimiter_run(parsers.asterisk) end - parsers.emph_capturing_open_and_close = #parsers.emph_start * #parsers.emph_end - * Ct( Cg(Cc("delimiter"), "type") - * Cg(Cc("emphasis"), "element") - * Cg(C(parsers.emph_start), "content") - * Cg(Cc(true), "is_opening") - * Cg(Cc(true), "is_closing")) + parsers.emph_capturing_open_and_close + = #parsers.emph_start * #parsers.emph_end + * Ct( Cg(Cc("delimiter"), "type") + * Cg(Cc("emphasis"), "element") + * Cg(C(parsers.emph_start), "content") + * Cg(Cc(true), "is_opening") + * Cg(Cc(true), "is_closing")) parsers.emph_capturing_open = Ct( Cg(Cc("delimiter"), "type") * Cg(Cc("emphasis"), "element") @@ -28765,17 +29437,24 @@ function M.reader.new(writer, options) parsers.title_s_direct_ref = parsers.squote * Cs((parsers.html_entities - + (parsers.anyescaped - parsers.squote - parsers.blankline^2))^0) + + ( parsers.anyescaped + - parsers.squote + - parsers.blankline^2))^0) * parsers.squote parsers.title_d_direct_ref = parsers.dquote * Cs((parsers.html_entities - + (parsers.anyescaped - parsers.dquote - parsers.blankline^2))^0) + + ( parsers.anyescaped + - parsers.dquote + - parsers.blankline^2))^0) * parsers.dquote parsers.title_p_direct_ref = parsers.lparent * Cs((parsers.html_entities - + (parsers.anyescaped - parsers.lparent - parsers.rparent - parsers.blankline^2))^0) + + ( parsers.anyescaped + - parsers.lparent + - parsers.rparent + - parsers.blankline^2))^0) * parsers.rparent parsers.title_direct_ref = parsers.title_s_direct_ref @@ -28785,7 +29464,8 @@ function M.reader.new(writer, options) parsers.inline_direct_ref_inside = parsers.lparent * parsers.spnl * Cg(parsers.url + Cc(""), "url") * parsers.spnl - * Cg(parsers.title_direct_ref + Cc(""), "title") + * Cg( parsers.title_direct_ref + + Cc(""), "title") * parsers.spnl * parsers.rparent parsers.inline_direct_ref = parsers.lparent * parsers.spnlc @@ -28813,7 +29493,8 @@ function M.reader.new(writer, options) * Cg(Cc("inline"), "link_type") + #(parsers.exclamation * parsers.full_link) * Cg(Cc("full"), "link_type") - + #(parsers.exclamation * parsers.collapsed_link) + + #( parsers.exclamation + * parsers.collapsed_link) * Cg(Cc("collapsed"), "link_type") + #(parsers.exclamation * parsers.shortcut_link) * Cg(Cc("shortcut"), "link_type") @@ -28844,15 +29525,18 @@ function M.reader.new(writer, options) local inline_note_element = Cg(Cc("note"), "element") * parsers.note_opening - * Cg(parsers.circumflex * parsers.lbracket, "content") + * Cg( parsers.circumflex + * parsers.lbracket, "content") local image_element = Cg(Cc("image"), "element") * parsers.image_opening - * Cg(parsers.exclamation * parsers.lbracket, "content") + * Cg( parsers.exclamation + * parsers.lbracket, "content") local note_element = Cg(Cc("note"), "element") * parsers.raw_note_opening - * Cg(parsers.lbracket * parsers.circumflex, "content") + * Cg( parsers.lbracket + * parsers.circumflex, "content") local link_element = Cg(Cc("link"), "element") * parsers.link_opening @@ -28882,7 +29566,9 @@ function M.reader.new(writer, options) * Cg(Cc(false), "is_opening") * Cg(Cc(true), "is_closing") * ( Cg(Cc(true), "is_direct") - * Cg(parsers.rbracket * #parsers.inline_direct_ref, "content") + * Cg( parsers.rbracket + * #parsers.inline_direct_ref, + "content") + Cg(Cc(false), "is_direct") * Cg(parsers.rbracket, "content"))) @@ -28906,19 +29592,21 @@ function M.reader.new(writer, options) * -parsers.starter) / "") * parsers.spacechar^0 / "\n" - parsers.link_and_emph_content = Ct( Cg(Cc("content"), "type") - * Cg(Cs(( parsers.link_emph_precedence - + parsers.backslash * parsers.any - + parsers.link_and_emph_endline - + (parsers.linechar - - parsers.blankline^2 - - parsers.link_image_open_or_close - - parsers.emph_open_or_close))^0), "content")) + parsers.link_and_emph_content + = Ct( Cg(Cc("content"), "type") + * Cg(Cs(( parsers.link_emph_precedence + + parsers.backslash * parsers.any + + parsers.link_and_emph_endline + + (parsers.linechar + - parsers.blankline^2 + - parsers.link_image_open_or_close + - parsers.emph_open_or_close))^0), "content")) - parsers.link_and_emph_table = (parsers.link_image_opening + parsers.emph_open) - * parsers.link_and_emph_content - * ((parsers.link_image_open_or_close + parsers.emph_open_or_close) - * parsers.link_and_emph_content)^1 + parsers.link_and_emph_table + = (parsers.link_image_opening + parsers.emph_open) + * parsers.link_and_emph_content + * ((parsers.link_image_open_or_close + parsers.emph_open_or_close) + * parsers.link_and_emph_content)^1 % \end{macrocode} % \begin{markdown} @@ -28948,7 +29636,9 @@ function M.reader.new(writer, options) local value = t[i] if value.type == "delimiter" and value.is_opening and - (value.element == "link" or value.element == "image" or value.element == "note") + ( value.element == "link" + or value.element == "image" + or value.element == "note") and not value.removed then if value.is_active then return i @@ -29029,11 +29719,12 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function delete_parsed_content_in_range(t, opening_index, closing_index) - for i = opening_index, closing_index do - t[i].rendered = nil + local delete_parsed_content_in_range = + function(t, opening_index, closing_index) + for i = opening_index, closing_index do + t[i].rendered = nil + end end - end % \end{macrocode} % \begin{markdown} @@ -29078,34 +29769,40 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function render_link_or_image(t, opening_index, closing_index, content_end_index, reference) - process_emphasis(t, opening_index, content_end_index) - local mapped = collect_emphasis_content(t, opening_index + 1, content_end_index - 1) - - local rendered = {} - if (t[opening_index].element == "link") then - rendered = writer.link(mapped, reference.url, reference.title, reference.attributes) - end + local render_link_or_image = + function(t, opening_index, closing_index, content_end_index, + reference) + process_emphasis(t, opening_index, content_end_index) + local mapped = collect_emphasis_content(t, opening_index + 1, + content_end_index - 1) - if (t[opening_index].element == "image") then - rendered = writer.image(mapped, reference.url, reference.title, reference.attributes) - end + local rendered = {} + if (t[opening_index].element == "link") then + rendered = writer.link(mapped, reference.url, + reference.title, reference.attributes) + end - if (t[opening_index].element == "note") then - if (t[opening_index].link_type == "note_inline") then - rendered = writer.note(mapped) + if (t[opening_index].element == "image") then + rendered = writer.image(mapped, reference.url, reference.title, + reference.attributes) end - if (t[opening_index].link_type == "raw_note") then - rendered = writer.note(reference) + + if (t[opening_index].element == "note") then + if (t[opening_index].link_type == "note_inline") then + rendered = writer.note(mapped) + end + if (t[opening_index].link_type == "raw_note") then + rendered = writer.note(reference) + end end - end - t[opening_index].rendered = rendered - delete_parsed_content_in_range(t, opening_index + 1, closing_index) - empty_content_in_range(t, opening_index, closing_index) - disable_previous_link_openers(t, opening_index) - disable_range(t, opening_index, closing_index) - end + t[opening_index].rendered = rendered + delete_parsed_content_in_range(t, opening_index + 1, + closing_index) + empty_content_in_range(t, opening_index, closing_index) + disable_previous_link_openers(t, opening_index) + disable_range(t, opening_index, closing_index) + end % \end{macrocode} % \begin{markdown} @@ -29116,52 +29813,56 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function resolve_inline_following_content(t, closing_index, match_reference, match_link_attributes) - local content = "" - for i = closing_index + 1, #t do - content = content .. t[i].content - end + local resolve_inline_following_content = + function(t, closing_index, match_reference, match_link_attributes) + local content = "" + for i = closing_index + 1, #t do + content = content .. t[i].content + end - local matching_content = parsers.succeed + local matching_content = parsers.succeed - if match_reference then - matching_content = matching_content * parsers.inline_direct_ref_inside - end + if match_reference then + matching_content = matching_content + * parsers.inline_direct_ref_inside + end - if match_link_attributes then - matching_content = matching_content * Cg(Ct(parsers.attributes^-1), "attributes") - end + if match_link_attributes then + matching_content = matching_content + * Cg(Ct(parsers.attributes^-1), "attributes") + end - local matched = lpeg.match(Ct(matching_content * Cg(Cp(), "end_position")), content) + local matched = lpeg.match(Ct( matching_content + * Cg(Cp(), "end_position")), content) - local matched_count = matched.end_position - 1 - for i = closing_index + 1, #t do - local value = t[i] + local matched_count = matched.end_position - 1 + for i = closing_index + 1, #t do + local value = t[i] - local chars_left = matched_count - matched_count = matched_count - #value.content + local chars_left = matched_count + matched_count = matched_count - #value.content + + if matched_count <= 0 then + value.content = value.content:sub(chars_left + 1) + break + end - if matched_count <= 0 then - value.content = value.content:sub(chars_left + 1) - break + value.content = '' + value.is_active = false end - value.content = '' - value.is_active = false - end + local attributes = matched.attributes + if attributes == nil or next(attributes) == nil then + attributes = nil + end - local attributes = matched.attributes - if attributes == nil or next(attributes) == nil then - attributes = nil + return { + url = matched.url or "", + title = matched.title or "", + attributes = attributes + } end - return { - url = matched.url or "", - title = matched.title or "", - attributes = attributes - } - end - % \end{macrocode} % \begin{markdown} % @@ -29171,8 +29872,11 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function resolve_inline_link(t, opening_index, closing_index) - local inline_content = resolve_inline_following_content(t, closing_index, true, t.match_link_attributes) - render_link_or_image(t, opening_index, closing_index, closing_index, inline_content) + local inline_content + = resolve_inline_following_content(t, closing_index, true, + t.match_link_attributes) + render_link_or_image(t, opening_index, closing_index, + closing_index, inline_content) end % \end{macrocode} @@ -29183,10 +29887,14 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - local function resolve_note_inline_link(t, opening_index, closing_index) - local inline_content = resolve_inline_following_content(t, closing_index, false, false) - render_link_or_image(t, opening_index, closing_index, closing_index, inline_content) - end + local resolve_note_inline_link = + function(t, opening_index, closing_index) + local inline_content + = resolve_inline_following_content(t, closing_index, + false, false) + render_link_or_image(t, opening_index, closing_index, + closing_index, inline_content) + end % \end{macrocode} % \begin{markdown} @@ -29197,13 +29905,18 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function resolve_shortcut_link(t, opening_index, closing_index) - local content = collect_link_content(t, opening_index + 1, closing_index - 1) + local content + = collect_link_content(t, opening_index + 1, closing_index - 1) local r = self.lookup_reference(content) if r then - local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes) - r.attributes = join_attributes(r.attributes, inline_content.attributes) - render_link_or_image(t, opening_index, closing_index, closing_index, r) + local inline_content + = resolve_inline_following_content(t, closing_index, false, + t.match_link_attributes) + r.attributes + = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, closing_index, + closing_index, r) end end @@ -29216,12 +29929,14 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function resolve_raw_note_link(t, opening_index, closing_index) - local content = collect_link_content(t, opening_index + 1, closing_index - 1) + local content + = collect_link_content(t, opening_index + 1, closing_index - 1) local r = self.lookup_note_reference(content) if r then local parsed_ref = self.parser_functions.parse_blocks_nested(r) - render_link_or_image(t, opening_index, closing_index, closing_index, parsed_ref) + render_link_or_image(t, opening_index, closing_index, + closing_index, parsed_ref) end end @@ -29234,15 +29949,22 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function resolve_full_link(t, opening_index, closing_index) - local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4) - local next_link_content = collect_link_content(t, closing_index + 3, next_link_closing_index - 1) + local next_link_closing_index + = find_next_link_closing_index(t, closing_index + 4) + local next_link_content + = collect_link_content(t, closing_index + 3, + next_link_closing_index - 1) local r = self.lookup_reference(next_link_content) if r then - local inline_content = resolve_inline_following_content(t, next_link_closing_index, false, - t.match_link_attributes) - r.attributes = join_attributes(r.attributes, inline_content.attributes) - render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r) + local inline_content + = resolve_inline_following_content(t, next_link_closing_index, + false, + t.match_link_attributes) + r.attributes + = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, next_link_closing_index, + closing_index, r) end end @@ -29256,14 +29978,20 @@ function M.reader.new(writer, options) % \end{markdown} % \begin{macrocode} local function resolve_collapsed_link(t, opening_index, closing_index) - local next_link_closing_index = find_next_link_closing_index(t, closing_index + 4) - local content = collect_link_content(t, opening_index + 1, closing_index - 1) + local next_link_closing_index + = find_next_link_closing_index(t, closing_index + 4) + local content + = collect_link_content(t, opening_index + 1, closing_index - 1) local r = self.lookup_reference(content) if r then - local inline_content = resolve_inline_following_content(t, closing_index, false, t.match_link_attributes) - r.attributes = join_attributes(r.attributes, inline_content.attributes) - render_link_or_image(t, opening_index, next_link_closing_index, closing_index, r) + local inline_content + = resolve_inline_following_content(t, closing_index, false, + t.match_link_attributes) + r.attributes + = join_attributes(r.attributes, inline_content.attributes) + render_link_or_image(t, opening_index, next_link_closing_index, + closing_index, r) end end @@ -29285,7 +30013,9 @@ function M.reader.new(writer, options) for i,value in ipairs(t) do if not value.is_closing or value.type ~= "delimiter" - or not (value.element == "link" or value.element == "image" or value.element == "note") + or not ( value.element == "link" + or value.element == "image" + or value.element == "note") or value.removed then goto continue end @@ -29343,7 +30073,8 @@ function M.reader.new(writer, options) % % \end{markdown} % \begin{macrocode} - parsers.Str = (parsers.normalchar * (parsers.normalchar + parsers.at)^0) + parsers.Str = ( parsers.normalchar + * (parsers.normalchar + parsers.at)^0) / writer.string parsers.Symbol = (parsers.backtick^1 + V("SpecialChar")) @@ -29371,25 +30102,28 @@ function M.reader.new(writer, options) parsers.interrupting_bullets = parsers.fail parsers.interrupting_enumerators = parsers.fail else - parsers.interrupting_bullets = parsers.bullet(parsers.dash, true) - + parsers.bullet(parsers.asterisk, true) - + parsers.bullet(parsers.plus, true) - - parsers.interrupting_enumerators = parsers.enumerator(parsers.period, true) - + parsers.enumerator(parsers.rparent, true) + parsers.interrupting_bullets + = parsers.bullet(parsers.dash, true) + + parsers.bullet(parsers.asterisk, true) + + parsers.bullet(parsers.plus, true) + + parsers.interrupting_enumerators + = parsers.enumerator(parsers.period, true) + + parsers.enumerator(parsers.rparent, true) end if options.html then - parsers.html_interrupting = parsers.check_trail - * ( parsers.html_incomplete_open_tag - + parsers.html_incomplete_close_tag - + parsers.html_incomplete_open_special_tag - + parsers.html_comment_start - + parsers.html_cdatasection_start - + parsers.html_declaration_start - + parsers.html_instruction_start - - parsers.html_close_special_tag - - parsers.html_empty_special_tag) + parsers.html_interrupting + = parsers.check_trail + * ( parsers.html_incomplete_open_tag + + parsers.html_incomplete_close_tag + + parsers.html_incomplete_open_special_tag + + parsers.html_comment_start + + parsers.html_cdatasection_start + + parsers.html_declaration_start + + parsers.html_instruction_start + - parsers.html_close_special_tag + - parsers.html_empty_special_tag) else parsers.html_interrupting = parsers.fail end @@ -29411,7 +30145,7 @@ function M.reader.new(writer, options) * -V("EndlineExceptions") + parsers.check_optional_indent * -V("EndlineExceptions") - * -parsers.starter) + * -parsers.starter) / function(_) return end * parsers.spacechar^0 parsers.Endline = parsers.endline @@ -29437,30 +30171,37 @@ function M.reader.new(writer, options) parsers.Space = parsers.spacechar^2 * parsers.Endline / writer.hard_line_break - + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs + + parsers.spacechar^1 + * parsers.Endline^-1 + * parsers.eof / self.expandtabs + parsers.spacechar^1 * parsers.Endline / writer.soft_line_break - + parsers.spacechar^1 * -parsers.newline / self.expandtabs + + parsers.spacechar^1 + * -parsers.newline / self.expandtabs parsers.NoSoftLineBreakSpace = parsers.spacechar^2 * parsers.Endline / writer.hard_line_break - + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / self.expandtabs + + parsers.spacechar^1 + * parsers.Endline^-1 + * parsers.eof / self.expandtabs + parsers.spacechar^1 * parsers.Endline / writer.soft_line_break - + parsers.spacechar^1 * -parsers.newline / self.expandtabs + + parsers.spacechar^1 + * -parsers.newline / self.expandtabs parsers.NonbreakingEndline = parsers.endline - / writer.soft_line_break + / writer.nbsp parsers.NonbreakingSpace - = parsers.spacechar^2 * parsers.Endline - / writer.hard_line_break - + parsers.spacechar^1 * parsers.Endline^-1 * parsers.eof / "" - + parsers.spacechar^1 * parsers.Endline + = parsers.spacechar^2 * parsers.endline + / writer.nbsp + + parsers.spacechar^1 + * parsers.endline^-1 * parsers.eof / "" + + parsers.spacechar^1 * parsers.endline * parsers.optionalspace - / writer.soft_line_break + / writer.nbsp + parsers.spacechar^1 * parsers.optionalspace / writer.nbsp @@ -29509,18 +30250,20 @@ end parsers.LinkAndEmph = Ct(parsers.link_and_emph_table) / self.defer_link_and_emphasis_processing - parsers.EscapedChar = parsers.backslash * C(parsers.escapable) / writer.string + parsers.EscapedChar = parsers.backslash + * C(parsers.escapable) / writer.string - parsers.InlineHtml = Cs(parsers.html_inline_comment) / writer.inline_html_comment - + Cs(parsers.html_any_empty_inline_tag - + parsers.html_inline_instruction - + parsers.html_inline_cdatasection - + parsers.html_inline_declaration - + parsers.html_any_open_inline_tag - + parsers.html_any_close_tag) - / writer.inline_html_tag + parsers.InlineHtml = Cs(parsers.html_inline_comment) + / writer.inline_html_comment + + Cs(parsers.html_any_empty_inline_tag + + parsers.html_inline_instruction + + parsers.html_inline_cdatasection + + parsers.html_inline_declaration + + parsers.html_any_open_inline_tag + + parsers.html_any_close_tag) + / writer.inline_html_tag - parsers.HtmlEntity = parsers.html_entities / writer.string + parsers.HtmlEntity = parsers.html_entities / writer.string % \end{macrocode} % \par % \begin{markdown} @@ -29539,15 +30282,18 @@ end + parsers.html_declaration)) / writer.block_html_element - parsers.indented_non_blank_line = parsers.indentedline - parsers.blankline + parsers.indented_non_blank_line = parsers.indentedline + - parsers.blankline - parsers.Verbatim = Cs( - parsers.check_code_trail - * (parsers.line - parsers.blankline) - * ((parsers.check_minimal_blank_indent_and_full_code_trail * parsers.blankline)^0 - * ((parsers.check_minimal_indent / "") * parsers.check_code_trail - * (parsers.line - parsers.blankline))^1)^0 - ) / self.expandtabs / writer.verbatim + parsers.Verbatim + = Cs( parsers.check_code_trail + * (parsers.line - parsers.blankline) + * (( parsers.check_minimal_blank_indent_and_full_code_trail + * parsers.blankline)^0 + * ( (parsers.check_minimal_indent / "") + * parsers.check_code_trail + * (parsers.line - parsers.blankline))^1)^0) + / self.expandtabs / writer.verbatim parsers.Blockquote = parsers.blockquote_body / writer.blockquote @@ -29586,73 +30332,79 @@ end parsers.list_blank = parsers.conditionally_indented_blankline - parsers.ref_or_block_list_separated = parsers.sep_group_no_output(parsers.list_blank) - * parsers.minimally_indented_ref - + parsers.block_sep_group(parsers.list_blank) - * parsers.minimally_indented_block - - parsers.ref_or_block_non_separated = parsers.minimally_indented_ref - + (parsers.succeed / writer.interblocksep) - * parsers.minimally_indented_block - - parsers.minimally_indented_blankline - - parsers.tight_list_loop_body_pair = - parsers.create_loop_body_pair(parsers.ref_or_block_non_separated, - parsers.minimally_indented_par_or_plain_no_blank, - (parsers.succeed / writer.interblocksep), - (parsers.succeed / writer.paragraphsep)) - - parsers.loose_list_loop_body_pair = - parsers.create_loop_body_pair(parsers.ref_or_block_list_separated, - parsers.minimally_indented_par_or_plain, - parsers.block_sep_group(parsers.list_blank), - parsers.par_sep_group(parsers.list_blank)) - - parsers.tight_list_content_loop = V("Block") - * parsers.tight_list_loop_body_pair.block^0 - + (V("Paragraph") + V("Plain")) - * parsers.ref_or_block_non_separated - * parsers.tight_list_loop_body_pair.block^0 - + (V("Paragraph") + V("Plain")) - * parsers.tight_list_loop_body_pair.par^0 - - parsers.loose_list_content_loop = V("Block") - * parsers.loose_list_loop_body_pair.block^0 - + (V("Paragraph") + V("Plain")) - * parsers.ref_or_block_list_separated - * parsers.loose_list_loop_body_pair.block^0 - + (V("Paragraph") + V("Plain")) - * parsers.loose_list_loop_body_pair.par^0 - - parsers.list_item_tightness_condition = -#( parsers.list_blank^0 - * parsers.minimally_indented_ref_or_block_or_par) - * remove_indent("li") - + remove_indent("li") - * parsers.fail - - parsers.indented_content_tight = Ct( (parsers.blankline / "") - * #parsers.list_blank - * remove_indent("li") - + ( (V("Reference") + (parsers.blankline / "")) - * parsers.check_minimal_indent - * parsers.tight_list_content_loop - + (V("Reference") + (parsers.blankline / "")) - + (parsers.tickbox^-1 / writer.escape) - * parsers.tight_list_content_loop - ) - * parsers.list_item_tightness_condition - ) - - parsers.indented_content_loose = Ct( (parsers.blankline / "") - * #parsers.list_blank - + ( (V("Reference") + (parsers.blankline / "")) - * parsers.check_minimal_indent - * parsers.loose_list_content_loop - + (V("Reference") + (parsers.blankline / "")) - + (parsers.tickbox^-1 / writer.escape) - * parsers.loose_list_content_loop - ) - ) + parsers.ref_or_block_list_separated + = parsers.sep_group_no_output(parsers.list_blank) + * parsers.minimally_indented_ref + + parsers.block_sep_group(parsers.list_blank) + * parsers.minimally_indented_block + + parsers.ref_or_block_non_separated + = parsers.minimally_indented_ref + + (parsers.succeed / writer.interblocksep) + * parsers.minimally_indented_block + - parsers.minimally_indented_blankline + + parsers.tight_list_loop_body_pair = + parsers.create_loop_body_pair( + parsers.ref_or_block_non_separated, + parsers.minimally_indented_par_or_plain_no_blank, + (parsers.succeed / writer.interblocksep), + (parsers.succeed / writer.paragraphsep)) + + parsers.loose_list_loop_body_pair = + parsers.create_loop_body_pair( + parsers.ref_or_block_list_separated, + parsers.minimally_indented_par_or_plain, + parsers.block_sep_group(parsers.list_blank), + parsers.par_sep_group(parsers.list_blank)) + + parsers.tight_list_content_loop + = V("Block") + * parsers.tight_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.ref_or_block_non_separated + * parsers.tight_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.tight_list_loop_body_pair.par^0 + + parsers.loose_list_content_loop + = V("Block") + * parsers.loose_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.ref_or_block_list_separated + * parsers.loose_list_loop_body_pair.block^0 + + (V("Paragraph") + V("Plain")) + * parsers.loose_list_loop_body_pair.par^0 + + parsers.list_item_tightness_condition + = -#( parsers.list_blank^0 + * parsers.minimally_indented_ref_or_block_or_par) + * remove_indent("li") + + remove_indent("li") + * parsers.fail + + parsers.indented_content_tight + = Ct( (parsers.blankline / "") + * #parsers.list_blank + * remove_indent("li") + + ( (V("Reference") + (parsers.blankline / "")) + * parsers.check_minimal_indent + * parsers.tight_list_content_loop + + (V("Reference") + (parsers.blankline / "")) + + (parsers.tickbox^-1 / writer.escape) + * parsers.tight_list_content_loop + ) + * parsers.list_item_tightness_condition) + + parsers.indented_content_loose + = Ct( (parsers.blankline / "") + * #parsers.list_blank + + ( (V("Reference") + (parsers.blankline / "")) + * parsers.check_minimal_indent + * parsers.loose_list_content_loop + + (V("Reference") + (parsers.blankline / "")) + + (parsers.tickbox^-1 / writer.escape) + * parsers.loose_list_content_loop)) parsers.TightListItem = function(starter) return -parsers.ThematicBreak @@ -29710,13 +30462,15 @@ end local enumerator = parsers.enumerator(delimiter_type) return Cg(enumerator, "listtype") * (Ct( parsers.TightListItem(Cb("listtype")) - * ((parsers.check_minimal_indent / "") * parsers.TightListItem(enumerator))^0) + * ( (parsers.check_minimal_indent / "") + * parsers.TightListItem(enumerator))^0) * Cc(true) * -#((parsers.list_blank^0 / "") * parsers.check_minimal_indent * enumerator) + Ct( parsers.LooseListItem(Cb("listtype")) * ((parsers.list_blank^0 / "") - * (parsers.check_minimal_indent / "") * parsers.LooseListItem(enumerator))^0) + * (parsers.check_minimal_indent / "") + * parsers.LooseListItem(enumerator))^0) * Cc(false) ) * Ct(Cb("listtype")) / ordered_list end @@ -29769,15 +30523,21 @@ end - parsers.thematic_break_lines parsers.heading_text = parsers.heading_line - * ((V("Endline") / "\n") * (parsers.heading_line - parsers.heading_level))^0 + * ( (V("Endline") / "\n") + * ( parsers.heading_line + - parsers.heading_level))^0 * parsers.newline^-1 - parsers.SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem - * #(parsers.heading_text - * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level) + parsers.SetextHeading = parsers.freeze_trail + * parsers.check_trail_no_rem + * #( parsers.heading_text + * parsers.check_minimal_indent + * parsers.check_trail + * parsers.heading_level) * Cs(parsers.heading_text) / parsers.parse_heading_text - * parsers.check_minimal_indent_and_trail * parsers.heading_level + * parsers.check_minimal_indent_and_trail + * parsers.heading_level * parsers.newline * parsers.unfreeze_trail / writer.heading @@ -29829,14 +30589,18 @@ end local current_extension_name = nil self.insert_pattern = function(selector, pattern, pattern_name) assert(pattern_name == nil or type(pattern_name) == "string") - local _, _, lhs, pos, rhs = selector:find("^(%a+)%s+([%a%s]+%a+)%s+(%a+)$") + local _, _, lhs, pos, rhs + = selector:find("^(%a+)%s+([%a%s]+%a+)%s+(%a+)$") assert(lhs ~= nil, - [[Expected selector in form "LHS (before|after|instead of) RHS", not "]] + [[Expected selector in form ]] + .. [["LHS (before|after|instead of) RHS", not "]] .. selector .. [["]]) assert(walkable_syntax[lhs] ~= nil, - [[Rule ]] .. lhs .. [[ -> ... does not exist in markdown grammar]]) + [[Rule ]] .. lhs + .. [[ -> ... does not exist in markdown grammar]]) assert(pos == "before" or pos == "after" or pos == "instead of", - [[Expected positional specifier "before", "after", or "instead of", not "]] + [[Expected positional specifier "before", "after", ]] + .. [[or "instead of", not "]] .. pos .. [["]]) local rule = walkable_syntax[lhs] local index = nil @@ -29854,10 +30618,12 @@ end .. [[ does not exist in markdown grammar]]) local accountable_pattern if current_extension_name then - accountable_pattern = { pattern, current_extension_name, pattern_name } + accountable_pattern + = {pattern, current_extension_name, pattern_name} else assert(type(pattern) == "string", - [[reader->insert_pattern() was called outside an extension with ]] + [[reader->insert_pattern() was called outside ]] + .. [[an extension with ]] .. [[a PEG pattern instead of a rule name]]) accountable_pattern = pattern end @@ -29880,11 +30646,9 @@ end local syntax = { "Blocks", - Blocks = V("InitializeState") - * ( V("ExpectedJekyllData") - * (V("Blank")^0 / writer.interblocksep) - )^-1 - * V("Blank")^0 + Blocks = V("InitializeState") + * V("ExpectedJekyllData") + * V("Blank")^0 % \end{macrocode} % \par % \begin{markdown} @@ -29895,71 +30659,72 @@ end % % \end{markdown} % \begin{macrocode} - * ( V("Block") - * ( V("Blank")^0 * parsers.eof - + ( V("Blank")^2 / writer.paragraphsep - + V("Blank")^0 / writer.interblocksep - ) - ) - + ( V("Paragraph") + V("Plain") ) - * ( V("Blank")^0 * parsers.eof - + ( V("Blank")^2 / writer.paragraphsep - + V("Blank")^0 / writer.interblocksep - ) - ) - * V("Block") - * ( V("Blank")^0 * parsers.eof - + ( V("Blank")^2 / writer.paragraphsep - + V("Blank")^0 / writer.interblocksep - ) - ) - + ( V("Paragraph") + V("Plain") ) - * ( V("Blank")^0 * parsers.eof - + V("Blank")^0 / writer.paragraphsep - ) - )^0, - - ExpectedJekyllData = parsers.fail, - - Blank = parsers.Blank, - Reference = parsers.Reference, - - Blockquote = parsers.Blockquote, - Verbatim = parsers.Verbatim, - ThematicBreak = parsers.ThematicBreak, - BulletList = parsers.BulletList, - OrderedList = parsers.OrderedList, - DisplayHtml = parsers.DisplayHtml, - Heading = parsers.Heading, - Paragraph = parsers.Paragraph, - Plain = parsers.Plain, - - EndlineExceptions = parsers.EndlineExceptions, + * ( V("Block") + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + + ( V("Paragraph") + V("Plain") ) + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + * V("Block") + * ( V("Blank")^0 * parsers.eof + + ( V("Blank")^2 / writer.paragraphsep + + V("Blank")^0 / writer.interblocksep + ) + ) + + ( V("Paragraph") + V("Plain") ) + * ( V("Blank")^0 * parsers.eof + + V("Blank")^0 / writer.paragraphsep + ) + )^0, + + ExpectedJekyllData = parsers.succeed, + + Blank = parsers.Blank, + Reference = parsers.Reference, + + Blockquote = parsers.Blockquote, + Verbatim = parsers.Verbatim, + ThematicBreak = parsers.ThematicBreak, + BulletList = parsers.BulletList, + OrderedList = parsers.OrderedList, + DisplayHtml = parsers.DisplayHtml, + Heading = parsers.Heading, + Paragraph = parsers.Paragraph, + Plain = parsers.Plain, + + EndlineExceptions = parsers.EndlineExceptions, NoSoftLineBreakEndlineExceptions - = parsers.NoSoftLineBreakEndlineExceptions, - - Str = parsers.Str, - Space = parsers.Space, - NoSoftLineBreakSpace = parsers.NoSoftLineBreakSpace, - OptionalIndent = parsers.OptionalIndent, - Endline = parsers.Endline, - EndlineNoSub = parsers.EndlineNoSub, + = parsers.NoSoftLineBreakEndlineExceptions, + + Str = parsers.Str, + Space = parsers.Space, + NoSoftLineBreakSpace + = parsers.NoSoftLineBreakSpace, + OptionalIndent = parsers.OptionalIndent, + Endline = parsers.Endline, + EndlineNoSub = parsers.EndlineNoSub, NoSoftLineBreakEndline - = parsers.NoSoftLineBreakEndline, - EndlineBreak = parsers.EndlineBreak, - LinkAndEmph = parsers.LinkAndEmph, - Code = parsers.Code, - AutoLinkUrl = parsers.AutoLinkUrl, - AutoLinkEmail = parsers.AutoLinkEmail, + = parsers.NoSoftLineBreakEndline, + EndlineBreak = parsers.EndlineBreak, + LinkAndEmph = parsers.LinkAndEmph, + Code = parsers.Code, + AutoLinkUrl = parsers.AutoLinkUrl, + AutoLinkEmail = parsers.AutoLinkEmail, AutoLinkRelativeReference - = parsers.AutoLinkRelativeReference, - InlineHtml = parsers.InlineHtml, - HtmlEntity = parsers.HtmlEntity, - EscapedChar = parsers.EscapedChar, - Smart = parsers.Smart, - Symbol = parsers.Symbol, - SpecialChar = parsers.fail, - InitializeState = parsers.succeed, + = parsers.AutoLinkRelativeReference, + InlineHtml = parsers.InlineHtml, + HtmlEntity = parsers.HtmlEntity, + EscapedChar = parsers.EscapedChar, + Smart = parsers.Smart, + Symbol = parsers.Symbol, + SpecialChar = parsers.fail, + InitializeState = parsers.succeed, } % \end{macrocode} % \par @@ -29977,13 +30742,17 @@ end self.update_rule = function(rule_name, get_pattern) assert(current_extension_name ~= nil) assert(syntax[rule_name] ~= nil, - [[Rule ]] .. rule_name .. [[ -> ... does not exist in markdown grammar]]) + [[Rule ]] .. rule_name + .. [[ -> ... does not exist in markdown grammar]]) local previous_pattern local extension_name if walkable_syntax[rule_name] then - local previous_accountable_pattern = walkable_syntax[rule_name][1] + local previous_accountable_pattern + = walkable_syntax[rule_name][1] previous_pattern = previous_accountable_pattern[1] - extension_name = previous_accountable_pattern[2] .. ", " .. current_extension_name + extension_name + = previous_accountable_pattern[2] + .. ", " .. current_extension_name else previous_pattern = nil extension_name = current_extension_name @@ -30113,9 +30882,11 @@ end pattern_name = "Anonymous Pattern" end local extension_name = rhs[2] - human_readable_rhs = pattern_name .. [[ (]] .. extension_name .. [[)]] + human_readable_rhs = pattern_name .. [[ (]] + .. extension_name .. [[)]] end - local encoded_rhs = util.encode_json_string(human_readable_rhs) + local encoded_rhs + = util.encode_json_string(human_readable_rhs) local output_line = [[ ]] .. encoded_rhs if rhs_index < #rule then output_line = output_line .. "," @@ -30133,7 +30904,8 @@ end local output = table.concat(output_lines, "\n") local output_filename = options.debugExtensionsFileName local output_file = assert(io.open(output_filename, "w"), - [[Could not open file "]] .. output_filename .. [[" for writing]]) + [[Could not open file "]] .. output_filename + .. [[" for writing]]) assert(output_file:write(output)) assert(output_file:close()) end @@ -30226,7 +30998,7 @@ end end local blocks_nested_t = util.table_copy(syntax) - blocks_nested_t.ExpectedJekyllData = parsers.fail + blocks_nested_t.ExpectedJekyllData = parsers.succeed parsers.blocks_nested = Ct(blocks_nested_t) parsers.blocks = Ct(syntax) @@ -30256,8 +31028,10 @@ end local inlines_no_link_or_emphasis_t = util.table_copy(inlines_t) inlines_no_link_or_emphasis_t.LinkAndEmph = parsers.fail - inlines_no_link_or_emphasis_t.EndlineExceptions = parsers.EndlineExceptions - parsers.eof - parsers.inlines_no_link_or_emphasis = Ct(inlines_no_link_or_emphasis_t) + inlines_no_link_or_emphasis_t.EndlineExceptions + = parsers.EndlineExceptions - parsers.eof + parsers.inlines_no_link_or_emphasis + = Ct(inlines_no_link_or_emphasis_t) % \end{macrocode} % \par % \begin{markdown} @@ -30284,7 +31058,8 @@ end elseif form == "nfkd" then input = uni_algos.normalize.NFKD(input) else - error(format("Unknown normalization form %s", form)) + return writer.error( + format("Unknown normalization form %s", form)) end end % \end{macrocode} @@ -30300,30 +31075,12 @@ end end % \end{macrocode} % \begin{markdown} -% When determining the name of the cache file, create salt for the hashing -% function out of the package version and the passed options recognized by the -% Lua interface (see Section <#sec:lua-options>). The \Opt{cacheDir} option -% is disregarded. +% Clear the table of references. % \end{markdown} % \begin{macrocode} references = {} - local opt_string = {} - for k, _ in pairs(defaultOptions) do - local v = options[k] - if type(v) == "table" then - for _, i in ipairs(v) do - opt_string[#opt_string+1] = k .. "=" .. tostring(i) - end - elseif k ~= "cacheDir" then - opt_string[#opt_string+1] = k .. "=" .. tostring(v) - end - end - table.sort(opt_string) - local salt = table.concat(opt_string, ",") .. "," .. metadata.version - local output - local function convert(input) - local document = self.parser_functions.parse_blocks(input) - local output = util.rope_to_string(writer.document(document)) + local document = self.parser_functions.parse_blocks(input) + local output = util.rope_to_string(writer.document(document)) % \end{macrocode} % \begin{markdown} % Remove block element / paragraph separators immediately followed by the @@ -30331,82 +31088,49 @@ end % Then, remove any leftover output of \luamref{writer->undosep}. % \end{markdown} % \begin{macrocode} - local undosep_start, undosep_end - local potential_secend_start, secend_start - local potential_sep_start, sep_start + local undosep_start, undosep_end + local potential_secend_start, secend_start + local potential_sep_start, sep_start + while true do + -- find a `writer->undosep` + undosep_start, undosep_end + = output:find(writer.undosep_text, 1, true) + if undosep_start == nil then break end + -- skip any preceding section ends + secend_start = undosep_start while true do - -- find a `writer->undosep` - undosep_start, undosep_end = output:find(writer.undosep_text, 1, true) - if undosep_start == nil then break end - -- skip any preceding section ends - secend_start = undosep_start - while true do - potential_secend_start = secend_start - #writer.secend_text - if potential_secend_start < 1 - or output:sub(potential_secend_start, secend_start - 1) ~= writer.secend_text then - break - end - secend_start = potential_secend_start + potential_secend_start = secend_start - #writer.secend_text + if potential_secend_start < 1 + or output:sub(potential_secend_start, + secend_start - 1) ~= writer.secend_text + then + break end - -- find an immediately preceding block element / paragraph separator - sep_start = secend_start - potential_sep_start = sep_start - #writer.interblocksep_text + secend_start = potential_secend_start + end + -- find an immediately preceding + -- block element / paragraph separator + sep_start = secend_start + potential_sep_start = sep_start - #writer.interblocksep_text + if potential_sep_start >= 1 + and output:sub(potential_sep_start, + sep_start - 1) == writer.interblocksep_text + then + sep_start = potential_sep_start + else + potential_sep_start = sep_start - #writer.paragraphsep_text if potential_sep_start >= 1 - and output:sub(potential_sep_start, sep_start - 1) == writer.interblocksep_text then + and output:sub(potential_sep_start, + sep_start - 1) == writer.paragraphsep_text + then sep_start = potential_sep_start - else - potential_sep_start = sep_start - #writer.paragraphsep_text - if potential_sep_start >= 1 - and output:sub(potential_sep_start, sep_start - 1) == writer.paragraphsep_text then - sep_start = potential_sep_start - end end - -- remove `writer->undosep` and immediately preceding block element / paragraph separator - output = output:sub(1, sep_start - 1) - .. output:sub(secend_start, undosep_start - 1) - .. output:sub(undosep_end + 1) end - return output - end -% \end{macrocode} -% \begin{markdown} -% If we cache markdown documents, produce the cache file and transform its -% filename to plain \TeX{} output via the \luamref{writer->pack} method. -% \end{markdown} -% \begin{macrocode} - if options.eagerCache or options.finalizeCache then - local name = util.cache(options.cacheDir, input, salt, convert, - ".md" .. writer.suffix) - output = writer.pack(name) -% \end{macrocode} -% \begin{markdown} -% Otherwise, return the result of the conversion directly. -% \end{markdown} -% \begin{macrocode} - else - output = convert(input) - end -% \end{macrocode} -% \begin{markdown} -% If the \Opt{finalizeCache} option is enabled, populate the frozen cache in -% the file \Opt{frozenCacheFileName} with an entry for markdown document -% number \Opt{frozenCacheCounter}. -% \end{markdown} -% \begin{macrocode} - if options.finalizeCache then - local file, mode - if options.frozenCacheCounter > 0 then - mode = "a" - else - mode = "w" - end - file = assert(io.open(options.frozenCacheFileName, mode), - [[Could not open file "]] .. options.frozenCacheFileName - .. [[" for writing]]) - assert(file:write([[\expandafter\global\expandafter\def\csname ]] - .. [[markdownFrozenCache]] .. options.frozenCacheCounter - .. [[\endcsname{]] .. output .. [[}]] .. "\n")) - assert(file:close()) + -- remove `writer->undosep` and immediately preceding + -- block element / paragraph separator + output = output:sub(1, sep_start - 1) + .. output:sub(secend_start, undosep_start - 1) + .. output:sub(undosep_end + 1) end return output end @@ -30468,10 +31192,13 @@ M.extensions.bracketed_spans = function() + parsers.autolink + V("InlineHtml") + ( parsers.backslash * parsers.backslash) - + ( parsers.backslash * (parsers.lbracket + parsers.rbracket) + + ( parsers.backslash + * (parsers.lbracket + parsers.rbracket) + V("Space") + V("Endline") + (parsers.any - - (parsers.newline + parsers.lbracket + parsers.rbracket + - ( parsers.newline + + parsers.lbracket + + parsers.rbracket + parsers.blankline^2))))^1) / self.parser_functions.parse_inlines) * parsers.rbracket @@ -30534,11 +31261,15 @@ M.extensions.citations = function(citation_nbsps) end end else - table.insert(buffer, {"\\markdownRenderer", text_cites and "TextCite" or "Cite", - "{", #cites, "}"}) + table.insert(buffer, + {"\\markdownRenderer", + text_cites and "TextCite" or "Cite", + "{", #cites, "}"}) for _,cite in ipairs(cites) do - table.insert(buffer, {cite.suppress_author and "-" or "+", "{", - cite.prenote or "", "}{", cite.postnote or "", "}{", cite.name, "}"}) + table.insert(buffer, + {cite.suppress_author and "-" or "+", "{", + cite.prenote or "", "}{", + cite.postnote or "", "}{", cite.name, "}"}) end end return buffer @@ -30554,12 +31285,16 @@ M.extensions.citations = function(citation_nbsps) local citation_name = Cs(parsers.dash^-1) * parsers.at * Cs(citation_chars - * (((citation_chars + parsers.internal_punctuation + * ((( citation_chars + + parsers.internal_punctuation - parsers.comma - parsers.semicolon) - * -#((parsers.internal_punctuation - parsers.comma + * -#(( parsers.internal_punctuation + - parsers.comma - parsers.semicolon)^0 - * -(citation_chars + parsers.internal_punctuation - - parsers.comma - parsers.semicolon)))^0 + * -( citation_chars + + parsers.internal_punctuation + - parsers.comma + - parsers.semicolon)))^0 * citation_chars)^-1) local citation_body_prenote @@ -30568,10 +31303,14 @@ M.extensions.citations = function(citation_nbsps) + parsers.inticks + parsers.autolink + V("InlineHtml") - + V("Space") + V("Endline") + + V("Space") + V("EndlineNoSub") + (parsers.anyescaped - - (parsers.newline + parsers.rbracket + parsers.blankline^2)) - - (parsers.spnl * parsers.dash^-1 * parsers.at))^1) + - ( parsers.newline + + parsers.rbracket + + parsers.blankline^2)) + - ( parsers.spnl + * parsers.dash^-1 + * parsers.at))^1) local citation_body_postnote = Cs((parsers.alphanumeric^1 @@ -30579,9 +31318,11 @@ M.extensions.citations = function(citation_nbsps) + parsers.inticks + parsers.autolink + V("InlineHtml") - + V("Space") + V("Endline") + + V("Space") + V("EndlineNoSub") + (parsers.anyescaped - - (parsers.newline + parsers.rbracket + parsers.semicolon + - ( parsers.newline + + parsers.rbracket + + parsers.semicolon + parsers.blankline^2)) - (parsers.spnl * parsers.rbracket))^1) @@ -30592,7 +31333,8 @@ M.extensions.citations = function(citation_nbsps) * parsers.spnlc ) * citation_name - * (parsers.internal_punctuation - parsers.semicolon)^-1 + * ( parsers.internal_punctuation + - parsers.semicolon)^-1 * ( parsers.spnlc / function(_) return end * citation_body_postnote + Cc("") @@ -30614,7 +31356,9 @@ M.extensions.citations = function(citation_nbsps) + V("InlineHtml") + V("Space") + V("Endline") + (parsers.anyescaped - - (parsers.newline + parsers.rbracket + parsers.at + - ( parsers.newline + + parsers.rbracket + + parsers.at + parsers.semicolon + parsers.blankline^2)) - (parsers.spnl * parsers.rbracket))^0) @@ -30708,7 +31452,8 @@ M.extensions.content_blocks = function(language_map) % \begin{macrocode} local languages_json = (function() local base, prev, curr - for _, pathname in ipairs{kpse.lookup(language_map, { all=true })} do + for _, pathname in ipairs{kpse.lookup(language_map, + {all=true})} do local file = io.open(pathname, "r") if not file then goto continue end local input = assert(file:read("*a")) @@ -30749,20 +31494,20 @@ M.extensions.content_blocks = function(language_map) suf = suf:lower() if type == "onlineimage" then return {"\\markdownRendererContentBlockOnlineImage{",suf,"}", - "{",self.string(src),"}", - "{",self.uri(src),"}", - "{",self.string(tit or ""),"}"} + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"} elseif languages_json[suf] then return {"\\markdownRendererContentBlockCode{",suf,"}", - "{",self.string(languages_json[suf]),"}", - "{",self.string(src),"}", - "{",self.uri(src),"}", - "{",self.string(tit or ""),"}"} + "{",self.string(languages_json[suf]),"}", + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"} else return {"\\markdownRendererContentBlock{",suf,"}", - "{",self.string(src),"}", - "{",self.uri(src),"}", - "{",self.string(tit or ""),"}"} + "{",self.string(src),"}", + "{",self.uri(src),"}", + "{",self.string(tit or ""),"}"} end end end, extend_reader = function(self) @@ -30797,8 +31542,8 @@ M.extensions.content_blocks = function(language_map) return parser end)("png", "jpg", "jpeg", "gif", "tif", "tiff") - -- online image url for iA Writer content blocks with mandatory suffix, - -- allowing nested brackets: + -- online image url for iA Writer content blocks with + -- mandatory suffix, allowing nested brackets: local onlineimageurl = (parsers.less * Cs((parsers.anyescaped @@ -30876,8 +31621,9 @@ M.extensions.definition_lists = function(tight_lists) local function dlitem(term, defs) local retVal = {"\\markdownRendererDlItem{",term,"}"} for _, def in ipairs(defs) do - retVal[#retVal+1] = {"\\markdownRendererDlDefinitionBegin ",def, - "\\markdownRendererDlDefinitionEnd "} + retVal[#retVal+1] + = {"\\markdownRendererDlDefinitionBegin ",def, + "\\markdownRendererDlDefinitionEnd "} end retVal[#retVal+1] = "\\markdownRendererDlItemEnd " return retVal @@ -30903,17 +31649,26 @@ M.extensions.definition_lists = function(tight_lists) local defstartchar = S("~:") - local defstart = parsers.check_trail_length(0) * defstartchar * #parsers.spacing - * (parsers.tab + parsers.space^-3) - + parsers.check_trail_length(1) * defstartchar * #parsers.spacing - * (parsers.tab + parsers.space^-2) - + parsers.check_trail_length(2) * defstartchar * #parsers.spacing - * (parsers.tab + parsers.space^-1) - + parsers.check_trail_length(3) * defstartchar * #parsers.spacing - - local indented_line = (parsers.check_minimal_indent / "") * parsers.check_code_trail * parsers.line - - local blank = parsers.check_minimal_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline + local defstart + = parsers.check_trail_length(0) * defstartchar + * #parsers.spacing + * (parsers.tab + parsers.space^-3) + + parsers.check_trail_length(1) + * defstartchar * #parsers.spacing + * (parsers.tab + parsers.space^-2) + + parsers.check_trail_length(2) + * defstartchar * #parsers.spacing + * (parsers.tab + parsers.space^-1) + + parsers.check_trail_length(3) + * defstartchar * #parsers.spacing + + local indented_line + = (parsers.check_minimal_indent / "") + * parsers.check_code_trail * parsers.line + + local blank + = parsers.check_minimal_blank_indent_and_any_trail + * parsers.optionalspace * parsers.newline local dlchunk = Cs(parsers.line * (indented_line - blank)^0) @@ -30930,24 +31685,24 @@ M.extensions.definition_lists = function(tight_lists) end local DefinitionListItemLoose - = C(parsers.line) * blank^0 - * Ct((parsers.check_minimal_indent * (defstart - * indented_blocks(dlchunk) - / self.parser_functions.parse_blocks_nested))^1) - * Cc(false) / definition_list_item + = C(parsers.line) * blank^0 + * Ct((parsers.check_minimal_indent * (defstart + * indented_blocks(dlchunk) + / self.parser_functions.parse_blocks_nested))^1) + * Cc(false) / definition_list_item local DefinitionListItemTight - = C(parsers.line) - * Ct((parsers.check_minimal_indent * (defstart * dlchunk - / self.parser_functions.parse_blocks_nested))^1) - * Cc(true) / definition_list_item + = C(parsers.line) + * Ct((parsers.check_minimal_indent * (defstart * dlchunk + / self.parser_functions.parse_blocks_nested))^1) + * Cc(true) / definition_list_item local DefinitionList - = ( Ct(DefinitionListItemLoose^1) * Cc(false) - + Ct(DefinitionListItemTight^1) - * (blank^0 - * -DefinitionListItemLoose * Cc(true)) - ) / writer.definitionlist + = ( Ct(DefinitionListItemLoose^1) * Cc(false) + + Ct(DefinitionListItemTight^1) + * (blank^0 + * -DefinitionListItemLoose * Cc(true)) + ) / writer.definitionlist self.insert_pattern("Block after Heading", DefinitionList, "DefinitionList") @@ -31032,7 +31787,8 @@ M.extensions.fancy_lists = function() return {"\\markdownRendererFancyOlItemWithNumber{",num,"}",s, "\\markdownRendererFancyOlItemEnd "} else - return {"\\markdownRendererFancyOlItem ",s,"\\markdownRendererFancyOlItemEnd "} + return {"\\markdownRendererFancyOlItem ",s, + "\\markdownRendererFancyOlItemEnd "} end end end, extend_reader = function(self) @@ -31053,7 +31809,8 @@ M.extensions.fancy_lists = function() continuation_marker = marker end for _,delim in ipairs(delims) do - table.insert(markers_table, {start_marker, continuation_marker, delim}) + table.insert(markers_table, + {start_marker, continuation_marker, delim}) end end return markers_table @@ -31072,15 +31829,18 @@ M.extensions.fancy_lists = function() local roman_marker = function(chars) local m, d, c = P(chars[1]), P(chars[2]), P(chars[3]) - local l, x, v, i = P(chars[4]), P(chars[5]), P(chars[6]), P(chars[7]) + local l, x, v, i + = P(chars[4]), P(chars[5]), P(chars[6]), P(chars[7]) return m^-3 * (c*m + c*d + d^-1 * c^-3) * (x*c + x*l + l^-1 * x^-3) * (i*x + i*v + v^-1 * i^-3) end - local lowercase_roman_marker = roman_marker({"m", "d", "c", "l", "x", "v", "i"}) - local uppercase_roman_marker = roman_marker({"M", "D", "C", "L", "X", "V", "I"}) + local lowercase_roman_marker + = roman_marker({"m", "d", "c", "l", "x", "v", "i"}) + local uppercase_roman_marker + = roman_marker({"M", "D", "C", "L", "X", "V", "I"}) local lowercase_opening_roman_marker = P("i") local uppercase_opening_roman_marker = P("I") @@ -31104,7 +31864,8 @@ M.extensions.fancy_lists = function() local markers_table = combine_markers_and_delims(markers, delims) - local function enumerator(start_marker, _, delimiter_type, interrupting) + local function enumerator(start_marker, _, + delimiter_type, interrupting) local delimiter_range local allowed_end if interrupting then @@ -31112,7 +31873,8 @@ M.extensions.fancy_lists = function() allowed_end = C(parsers.spacechar^1) * #parsers.linechar else delimiter_range = start_marker - allowed_end = C(parsers.spacechar^1) + #(parsers.newline + parsers.eof) + allowed_end = C(parsers.spacechar^1) + + #(parsers.newline + parsers.eof) end return parsers.check_trail @@ -31134,13 +31896,15 @@ M.extensions.fancy_lists = function() end local function roman2number(roman) - local romans = { ["M"] = 1000, ["D"] = 500, ["C"] = 100, ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 } + local romans = { ["M"] = 1000, ["D"] = 500, ["C"] = 100, + ["L"] = 50, ["X"] = 10, ["V"] = 5, ["I"] = 1 } local numeral = 0 local i = 1 local len = string.len(roman) while i < len do - local z1, z2 = romans[ string.sub(roman, i, i) ], romans[ string.sub(roman, i+1, i+1) ] + local z1, z2 = romans[ string.sub(roman, i, i) ], + romans[ string.sub(roman, i+1, i+1) ] if z1 < z2 then numeral = numeral + (z2 - z1) i = i + 2 @@ -31149,7 +31913,9 @@ M.extensions.fancy_lists = function() i = i + 1 end end - if i <= len then numeral = numeral + romans[ string.sub(roman,i,i) ] end + if i <= len then + numeral = numeral + romans[ string.sub(roman,i,i) ] + end return numeral end @@ -31174,11 +31940,13 @@ M.extensions.fancy_lists = function() end num = numstr:match("^([A-Z])$") if num then - return string.byte(num) - string.byte("A") + 1, "UpperAlpha", numdelim + return string.byte(num) - string.byte("A") + 1, + "UpperAlpha", numdelim end num = numstr:match("^([a-z])$") if num then - return string.byte(num) - string.byte("a") + 1, "LowerAlpha", numdelim + return string.byte(num) - string.byte("a") + 1, + "LowerAlpha", numdelim end num = numstr:match("^([IVXLCDM]+)") if num then @@ -31192,30 +31960,39 @@ M.extensions.fancy_lists = function() end local function fancylist(items,tight,start) - local startnum, numstyle, numdelim = sniffstyle(start[2][1], start[2][2]) + local startnum, numstyle, numdelim + = sniffstyle(start[2][1], start[2][2]) return writer.fancylist(items,tight, options.startNumber and startnum or 1, numstyle or "Decimal", numdelim or "Default") end - local FancyListOfType = function(start_marker, continuation_marker, delimiter_type) - local enumerator_start = enumerator(start_marker, continuation_marker, delimiter_type) - local enumerator_cont = enumerator(continuation_marker, continuation_marker, delimiter_type) - return Cg(enumerator_start, "listtype") - * (Ct( TightListItem(Cb("listtype")) - * ((parsers.check_minimal_indent / "") * TightListItem(enumerator_cont))^0) - * Cc(true) - * -#((parsers.conditionally_indented_blankline^0 / "") - * parsers.check_minimal_indent * enumerator_cont) - + Ct( LooseListItem(Cb("listtype")) - * ((parsers.conditionally_indented_blankline^0 / "") - * (parsers.check_minimal_indent / "") * LooseListItem(enumerator_cont))^0) - * Cc(false) - ) * Ct(Cb("listtype")) / fancylist - end + local FancyListOfType + = function(start_marker, continuation_marker, delimiter_type) + local enumerator_start + = enumerator(start_marker, continuation_marker, + delimiter_type) + local enumerator_cont + = enumerator(continuation_marker, continuation_marker, + delimiter_type) + return Cg(enumerator_start, "listtype") + * (Ct( TightListItem(Cb("listtype")) + * ((parsers.check_minimal_indent / "") + * TightListItem(enumerator_cont))^0) + * Cc(true) + * -#((parsers.conditionally_indented_blankline^0 / "") + * parsers.check_minimal_indent * enumerator_cont) + + Ct( LooseListItem(Cb("listtype")) + * ((parsers.conditionally_indented_blankline^0 / "") + * (parsers.check_minimal_indent / "") + * LooseListItem(enumerator_cont))^0) + * Cc(false) + ) * Ct(Cb("listtype")) / fancylist + end - local FancyList = join_table_with_func(FancyListOfType, markers_table) + local FancyList + = join_table_with_func(FancyListOfType, markers_table) local Endline = parsers.newline * (parsers.check_minimal_indent @@ -31271,14 +32048,17 @@ M.extensions.fenced_code = function(blank_before_code_fence, s = s:gsub("\n$", "") local buf = {} if attr ~= nil then - table.insert(buf, {"\\markdownRendererFencedCodeAttributeContextBegin", - self.attributes(attr)}) + table.insert(buf, + {"\\markdownRendererFencedCodeAttributeContextBegin", + self.attributes(attr)}) end local name = util.cache_verbatim(options.cacheDir, s) - table.insert(buf, {"\\markdownRendererInputFencedCode{", - name,"}{",self.string(i),"}{",self.infostring(i),"}"}) + table.insert(buf, + {"\\markdownRendererInputFencedCode{", + name,"}{",self.string(i),"}{",self.infostring(i),"}"}) if attr ~= nil then - table.insert(buf, "\\markdownRendererFencedCodeAttributeContextEnd{}") + table.insert(buf, + "\\markdownRendererFencedCodeAttributeContextEnd{}") end return buf end @@ -31318,11 +32098,13 @@ M.extensions.fenced_code = function(blank_before_code_fence, - parsers.newline)^0) / strip_enclosing_whitespaces) - local backtick_infostring = Cs(Cs((V("HtmlEntity") - + (-#(parsers.backslash * parsers.backtick) * parsers.anyescaped) - - parsers.newline - - parsers.backtick)^0) - / strip_enclosing_whitespaces) + local backtick_infostring + = Cs( Cs((V("HtmlEntity") + + ( -#(parsers.backslash * parsers.backtick) + * parsers.anyescaped) + - parsers.newline + - parsers.backtick)^0) + / strip_enclosing_whitespaces) local fenceindent @@ -31344,77 +32126,93 @@ M.extensions.fenced_code = function(blank_before_code_fence, end end - local function count_fenced_start_indent(_, _, indent_table, trail) - local last_indent_name = get_last_indent_name(indent_table) - fenceindent = 0 - if last_indent_name ~= "li" then - fenceindent = #trail + local count_fenced_start_indent = + function(_, _, indent_table, trail) + local last_indent_name = get_last_indent_name(indent_table) + fenceindent = 0 + if last_indent_name ~= "li" then + fenceindent = #trail + end + return true end - return true - end - local fencehead = function(char, infostring) - return Cmt(Cb("indent_info") * parsers.check_trail, count_fenced_start_indent) - * Cg(char^3, "fencelength") - * parsers.optionalspace - * infostring - * (parsers.newline + parsers.eof) + local fencehead = function(char, infostring) + return Cmt( Cb("indent_info") + * parsers.check_trail, count_fenced_start_indent) + * Cg(char^3, "fencelength") + * parsers.optionalspace + * infostring + * (parsers.newline + parsers.eof) end - local fencetail = function(char) - return parsers.check_trail_no_rem - * Cmt(C(char^3) * Cb("fencelength"), captures_geq_length) - * parsers.optionalspace * (parsers.newline + parsers.eof) - + parsers.eof + local fencetail = function(char) + return parsers.check_trail_no_rem + * Cmt(C(char^3) * Cb("fencelength"), captures_geq_length) + * parsers.optionalspace * (parsers.newline + parsers.eof) + + parsers.eof end - local function process_fenced_line(s, i, indent_table, line_content, is_blank) -- luacheck: ignore s i - local remainder = "" - if has_trail(indent_table) then - remainder = indent_table.trail.internal_remainder - end + local process_fenced_line = + function(s, i, -- luacheck: ignore s i + indent_table, line_content, is_blank) + local remainder = "" + if has_trail(indent_table) then + remainder = indent_table.trail.internal_remainder + end - if is_blank and get_last_indent_name(indent_table) == "li" then - remainder = "" - end + if is_blank + and get_last_indent_name(indent_table) == "li" then + remainder = "" + end - local str = remainder .. line_content - local index = 1 - local remaining = fenceindent + local str = remainder .. line_content + local index = 1 + local remaining = fenceindent - while true do - local c = str:sub(index, index) - if c == " " and remaining > 0 then - remaining = remaining - 1 - index = index + 1 - elseif c == "\t" and remaining > 3 then - remaining = remaining - 4 - index = index + 1 - else - break + while true do + local c = str:sub(index, index) + if c == " " and remaining > 0 then + remaining = remaining - 1 + index = index + 1 + elseif c == "\t" and remaining > 3 then + remaining = remaining - 4 + index = index + 1 + else + break + end end - end - return true, str:sub(index) - end + return true, str:sub(index) + end local fencedline = function(char) - return Cmt(Cb("indent_info") * C(parsers.line - fencetail(char)) * Cc(false), process_fenced_line) + return Cmt( Cb("indent_info") + * C(parsers.line - fencetail(char)) + * Cc(false), process_fenced_line) end - local blankfencedline = Cmt(Cb("indent_info") * C(parsers.blankline) * Cc(true), process_fenced_line) + local blankfencedline + = Cmt( Cb("indent_info") + * C(parsers.blankline) + * Cc(true), process_fenced_line) local TildeFencedCode - = fencehead(parsers.tilde, tilde_infostring) - * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline - + (parsers.check_minimal_indent / "") * fencedline(parsers.tilde))^0) - * ((parsers.check_minimal_indent / "") * fencetail(parsers.tilde) + parsers.succeed) + = fencehead(parsers.tilde, tilde_infostring) + * Cs(( (parsers.check_minimal_blank_indent / "") + * blankfencedline + + ( parsers.check_minimal_indent / "") + * fencedline(parsers.tilde))^0) + * ( (parsers.check_minimal_indent / "") + * fencetail(parsers.tilde) + parsers.succeed) local BacktickFencedCode = fencehead(parsers.backtick, backtick_infostring) - * Cs(((parsers.check_minimal_blank_indent / "") * blankfencedline - + (parsers.check_minimal_indent / "") * fencedline(parsers.backtick))^0) - * ((parsers.check_minimal_indent / "") * fencetail(parsers.backtick) + parsers.succeed) + * Cs(( (parsers.check_minimal_blank_indent / "") + * blankfencedline + + (parsers.check_minimal_indent / "") + * fencedline(parsers.backtick))^0) + * ( (parsers.check_minimal_indent / "") + * fencetail(parsers.backtick) + parsers.succeed) local infostring_with_attributes = Ct(C((parsers.linechar @@ -31424,28 +32222,28 @@ M.extensions.fenced_code = function(blank_before_code_fence, * Ct(parsers.attributes)) local FencedCode - = ((TildeFencedCode + BacktickFencedCode) - / function(infostring, code) - local expanded_code = self.expandtabs(code) - - if allow_raw_blocks then - local raw_attr = lpeg.match(parsers.raw_attribute, - infostring) - if raw_attr then - return writer.rawBlock(expanded_code, raw_attr) - end - end - - local attr = nil - if allow_attributes then - local match = lpeg.match(infostring_with_attributes, - infostring) - if match then - infostring, attr = table.unpack(match) - end - end - return writer.fencedCode(expanded_code, infostring, attr) - end) + = ((TildeFencedCode + BacktickFencedCode) + / function(infostring, code) + local expanded_code = self.expandtabs(code) + + if allow_raw_blocks then + local raw_attr = lpeg.match(parsers.raw_attribute, + infostring) + if raw_attr then + return writer.rawBlock(expanded_code, raw_attr) + end + end + + local attr = nil + if allow_attributes then + local match = lpeg.match(infostring_with_attributes, + infostring) + if match then + infostring, attr = table.unpack(match) + end + end + return writer.fencedCode(expanded_code, infostring, attr) + end) self.insert_pattern("Block after Verbatim", FencedCode, "FencedCode") @@ -31497,10 +32295,13 @@ M.extensions.fenced_divs = function(blank_before_div_fence) % \end{markdown} % \begin{macrocode} function self.div_begin(attributes) - local start_output = {"\\markdownRendererFencedDivAttributeContextBegin\n", - self.attributes(attributes)} - local end_output = {"\\markdownRendererFencedDivAttributeContextEnd{}"} - return self.push_attributes("div", attributes, start_output, end_output) + local start_output + = {"\\markdownRendererFencedDivAttributeContextBegin\n", + self.attributes(attributes)} + local end_output + = {"\\markdownRendererFencedDivAttributeContextEnd{}"} + return self.push_attributes( + "div", attributes, start_output, end_output) end % \end{macrocode} % \par @@ -31561,21 +32362,24 @@ M.extensions.fenced_divs = function(blank_before_div_fence) self.initialize_named_group("fenced_div_num_opening_indents") local function increment_div_level() - local function push_indent_table(s, i, indent_table, -- luacheck: ignore s i - fenced_div_num_opening_indents, fenced_div_level) - fenced_div_level = tonumber(fenced_div_level) + 1 - local num_opening_indents = 0 - if indent_table.indents ~= nil then - num_opening_indents = #indent_table.indents + local push_indent_table = + function(s, i, indent_table, -- luacheck: ignore s i + fenced_div_num_opening_indents, fenced_div_level) + fenced_div_level = tonumber(fenced_div_level) + 1 + local num_opening_indents = 0 + if indent_table.indents ~= nil then + num_opening_indents = #indent_table.indents + end + fenced_div_num_opening_indents[fenced_div_level] + = num_opening_indents + return true, fenced_div_num_opening_indents end - fenced_div_num_opening_indents[fenced_div_level] = num_opening_indents - return true, fenced_div_num_opening_indents - end - local function increment_level(s, i, fenced_div_level) -- luacheck: ignore s i - fenced_div_level = tonumber(fenced_div_level) + 1 - return true, tostring(fenced_div_level) - end + local increment_level = + function(s, i, fenced_div_level) -- luacheck: ignore s i + fenced_div_level = tonumber(fenced_div_level) + 1 + return true, tostring(fenced_div_level) + end return Cg( Cmt( Cb("indent_info") * Cb("fenced_div_num_opening_indents") @@ -31586,11 +32390,13 @@ M.extensions.fenced_divs = function(blank_before_div_fence) end local function decrement_div_level() - local function pop_indent_table(s, i, fenced_div_indent_table, fenced_div_level) -- luacheck: ignore s i - fenced_div_level = tonumber(fenced_div_level) - fenced_div_indent_table[fenced_div_level] = nil - return true, tostring(fenced_div_level - 1) - end + local pop_indent_table = + function(s, i, -- luacheck: ignore s i + fenced_div_indent_table, fenced_div_level) + fenced_div_level = tonumber(fenced_div_level) + fenced_div_indent_table[fenced_div_level] = nil + return true, tostring(fenced_div_level - 1) + end return Cg( Cmt( Cb("fenced_div_num_opening_indents") * Cb("fenced_div_level"), pop_indent_table) @@ -31598,21 +32404,24 @@ M.extensions.fenced_divs = function(blank_before_div_fence) end - local non_fenced_div_block = parsers.check_minimal_indent * V("Block") - - parsers.check_minimal_indent_and_trail * fenced_div_end + local non_fenced_div_block + = parsers.check_minimal_indent * V("Block") + - parsers.check_minimal_indent_and_trail * fenced_div_end - local non_fenced_div_paragraph = parsers.check_minimal_indent * V("Paragraph") - - parsers.check_minimal_indent_and_trail * fenced_div_end + local non_fenced_div_paragraph + = parsers.check_minimal_indent * V("Paragraph") + - parsers.check_minimal_indent_and_trail * fenced_div_end local blank = parsers.minimally_indented_blank - local block_separated = parsers.block_sep_group(blank) - * non_fenced_div_block + local block_separated = parsers.block_sep_group(blank) + * non_fenced_div_block - local loop_body_pair = parsers.create_loop_body_pair(block_separated, - non_fenced_div_paragraph, - parsers.block_sep_group(blank), - parsers.par_sep_group(blank)) + local loop_body_pair + = parsers.create_loop_body_pair(block_separated, + non_fenced_div_paragraph, + parsers.block_sep_group(blank), + parsers.par_sep_group(blank)) local content_loop = ( non_fenced_div_block * loop_body_pair.block^0 @@ -31625,7 +32434,9 @@ M.extensions.fenced_divs = function(blank_before_div_fence) local FencedDiv = fenced_div_begin / function (infostring) - local attr = lpeg.match(Ct(parsers.attributes), infostring) + local attr + = lpeg.match(Ct(parsers.attributes), + infostring) if attr == nil then attr = {"." .. infostring} end @@ -31636,7 +32447,8 @@ M.extensions.fenced_divs = function(blank_before_div_fence) * parsers.skipblanklines * Ct(content_loop) * parsers.minimally_indented_blank^0 - * parsers.check_minimal_indent_and_trail * fenced_div_end + * parsers.check_minimal_indent_and_trail + * fenced_div_end * decrement_div_level() * (Cc("") / writer.div_end) @@ -31657,23 +32469,27 @@ M.extensions.fenced_divs = function(blank_before_div_fence) % \end{markdown} % \begin{macrocode} local function is_inside_div() - local function check_div_level(s, i, fenced_div_level) -- luacheck: ignore s i - fenced_div_level = tonumber(fenced_div_level) - return fenced_div_level > 0 - end + local check_div_level = + function(s, i, fenced_div_level) -- luacheck: ignore s i + fenced_div_level = tonumber(fenced_div_level) + return fenced_div_level > 0 + end return Cmt(Cb("fenced_div_level"), check_div_level) end local function check_indent() - local function compare_indent(s, i, indent_table, -- luacheck: ignore s i - fenced_div_num_opening_indents, fenced_div_level) - fenced_div_level = tonumber(fenced_div_level) - local num_current_indents = (indent_table.current_line_indents ~= nil and - #indent_table.current_line_indents) or 0 - local num_opening_indents = fenced_div_num_opening_indents[fenced_div_level] - return num_current_indents == num_opening_indents - end + local compare_indent = + function(s, i, indent_table, -- luacheck: ignore s i + fenced_div_num_opening_indents, fenced_div_level) + fenced_div_level = tonumber(fenced_div_level) + local num_current_indents + = ( indent_table.current_line_indents ~= nil and + #indent_table.current_line_indents) or 0 + local num_opening_indents + = fenced_div_num_opening_indents[fenced_div_level] + return num_current_indents == num_opening_indents + end return Cmt( Cb("indent_info") * Cb("fenced_div_num_opening_indents") @@ -31745,26 +32561,31 @@ M.extensions.header_attributes = function() * parsers.newline))^1 - parsers.thematic_break_lines - local heading_text = heading_line - * ((V("Endline") / "\n") * (heading_line - parsers.heading_level))^0 - * parsers.newline^-1 - - local SetextHeading = parsers.freeze_trail * parsers.check_trail_no_rem - * #(heading_text - * (parsers.attributes - * parsers.optionalspace - * parsers.newline)^-1 - * parsers.check_minimal_indent * parsers.check_trail * parsers.heading_level) - * Cs(heading_text) / strip_trailing_spaces - / parsers.parse_heading_text - * Cg(Ct((parsers.attributes - * parsers.optionalspace - * parsers.newline)^-1), "attributes") - * parsers.check_minimal_indent_and_trail * parsers.heading_level - * Cb("attributes") - * parsers.newline - * parsers.unfreeze_trail - / writer.heading + local heading_text + = heading_line + * ( (V("Endline") / "\n") + * (heading_line - parsers.heading_level))^0 + * parsers.newline^-1 + + local SetextHeading + = parsers.freeze_trail * parsers.check_trail_no_rem + * #(heading_text + * (parsers.attributes + * parsers.optionalspace + * parsers.newline)^-1 + * parsers.check_minimal_indent + * parsers.check_trail + * parsers.heading_level) + * Cs(heading_text) / strip_trailing_spaces + / parsers.parse_heading_text + * Cg(Ct((parsers.attributes + * parsers.optionalspace + * parsers.newline)^-1), "attributes") + * parsers.check_minimal_indent_and_trail * parsers.heading_level + * Cb("attributes") + * parsers.newline + * parsers.unfreeze_trail + / writer.heading local Heading = AtxHeading + SetextHeading self.update_rule("Heading", Heading) @@ -31838,18 +32659,18 @@ M.extensions.line_blocks = function() local parsers = self.parsers local writer = self.writer - local LineBlock = Ct( - (Cs( - ( (parsers.pipe * parsers.space)/"" - * ((parsers.space)/entities.char_entity("nbsp"))^0 - * parsers.linechar^0 * (parsers.newline/"")) - * (-parsers.pipe - * (parsers.space^1/" ") - * parsers.linechar^1 - * (parsers.newline/"") - )^0 - * (parsers.blankline/"")^0 - ) / self.parser_functions.parse_inlines)^1) / writer.lineblock + local LineBlock + = Ct((Cs(( (parsers.pipe * parsers.space) / "" + * ((parsers.space)/entities.char_entity("nbsp"))^0 + * parsers.linechar^0 * (parsers.newline/"")) + * (-parsers.pipe + * (parsers.space^1/" ") + * parsers.linechar^1 + * (parsers.newline/"") + )^0 + * (parsers.blankline/"")^0) + / self.parser_functions.parse_inlines)^1) + / writer.lineblock self.insert_pattern("Block after Blockquote", LineBlock, "LineBlock") @@ -31889,8 +32710,9 @@ M.extensions.mark = function() local doubleequals = P("==") - local Mark = parsers.between(V("Inline"), doubleequals, doubleequals) - / function (inlines) return writer.mark(inlines) end + local Mark + = parsers.between(V("Inline"), doubleequals, doubleequals) + / function (inlines) return writer.mark(inlines) end self.add_special_character("=") self.insert_pattern("Inline before LinkAndEmph", @@ -31923,13 +32745,18 @@ M.extensions.link_attributes = function() % % \end{markdown} % \begin{macrocode} - local define_reference_parser = (parsers.check_trail / "") * parsers.link_label * parsers.colon - * parsers.spnlc * parsers.url - * ( parsers.spnlc_sep * parsers.title * (parsers.spnlc * Ct(parsers.attributes)) - * parsers.only_blank - + parsers.spnlc_sep * parsers.title * parsers.only_blank - + Cc("") * (parsers.spnlc * Ct(parsers.attributes)) * parsers.only_blank - + Cc("") * parsers.only_blank) + local define_reference_parser + = (parsers.check_trail / "") + * parsers.link_label + * parsers.colon + * parsers.spnlc * parsers.url + * ( parsers.spnlc_sep * parsers.title + * (parsers.spnlc * Ct(parsers.attributes)) + * parsers.only_blank + + parsers.spnlc_sep * parsers.title * parsers.only_blank + + Cc("") * (parsers.spnlc * Ct(parsers.attributes)) + * parsers.only_blank + + Cc("") * parsers.only_blank) local ReferenceWithAttributes = define_reference_parser / self.register_link @@ -31944,8 +32771,10 @@ M.extensions.link_attributes = function() % \end{markdown} % \begin{macrocode} - local LinkWithAttributesAndEmph = Ct(parsers.link_and_emph_table * Cg(Cc(true), "match_link_attributes")) - / self.defer_link_and_emphasis_processing + local LinkWithAttributesAndEmph + = Ct(parsers.link_and_emph_table * Cg(Cc(true), + "match_link_attributes")) + / self.defer_link_and_emphasis_processing self.update_rule("LinkAndEmph", LinkWithAttributesAndEmph) @@ -32030,9 +32859,10 @@ M.extensions.notes = function(notes, inline_notes) if inline_notes then local InlineNote - = parsers.circumflex - * (parsers.link_label / self.parser_functions.parse_inlines_no_inline_note) - / writer.note + = parsers.circumflex + * ( parsers.link_label + / self.parser_functions.parse_inlines_no_inline_note) + / writer.note self.insert_pattern("Inline after LinkAndEmph", InlineNote, "InlineNote") @@ -32070,20 +32900,27 @@ M.extensions.notes = function(notes, inline_notes) local NoteRef = RawNoteRef / lookup_note - local optionally_indented_line = parsers.check_optional_indent_and_any_trail * parsers.line + local optionally_indented_line + = parsers.check_optional_indent_and_any_trail * parsers.line - local blank = parsers.check_optional_blank_indent_and_any_trail * parsers.optionalspace * parsers.newline + local blank + = parsers.check_optional_blank_indent_and_any_trail + * parsers.optionalspace * parsers.newline - local chunk = Cs(parsers.line * (optionally_indented_line - blank)^0) + local chunk + = Cs(parsers.line + * (optionally_indented_line - blank)^0) local indented_blocks = function(bl) return Cs( bl - * (blank^1 * (parsers.check_optional_indent / "") - * parsers.check_code_trail * -parsers.blankline * bl)^0) + * ( blank^1 * (parsers.check_optional_indent / "") + * parsers.check_code_trail + * -parsers.blankline * bl)^0) end local NoteBlock - = parsers.check_trail_no_rem * RawNoteRef * parsers.colon + = parsers.check_trail_no_rem + * RawNoteRef * parsers.colon * parsers.spnlc * indented_blocks(chunk) / register_note @@ -32241,24 +33078,26 @@ M.extensions.pipe_tables = function(table_captions, table_attributes) , table_hline_separator , table_hline_column) - local table_caption_beginning = (parsers.check_minimal_blank_indent_and_any_trail_no_rem - * parsers.optionalspace * parsers.newline)^0 - * parsers.check_minimal_indent_and_trail - * (P("Table")^-1 * parsers.colon) - * parsers.optionalspace + local table_caption_beginning + = ( parsers.check_minimal_blank_indent_and_any_trail_no_rem + * parsers.optionalspace * parsers.newline)^0 + * parsers.check_minimal_indent_and_trail + * (P("Table")^-1 * parsers.colon) + * parsers.optionalspace local function strip_trailing_spaces(s) return s:gsub("%s*$","") end - local table_row = pipe_table_row(true - , (C((parsers.linechar - parsers.pipe)^1) - / strip_trailing_spaces - / self.parser_functions.parse_inlines) - , parsers.pipe - , (C((parsers.linechar - parsers.pipe)^0) - / strip_trailing_spaces - / self.parser_functions.parse_inlines)) + local table_row + = pipe_table_row(true + , (C((parsers.linechar - parsers.pipe)^1) + / strip_trailing_spaces + / self.parser_functions.parse_inlines) + , parsers.pipe + , (C((parsers.linechar - parsers.pipe)^0) + / strip_trailing_spaces + / self.parser_functions.parse_inlines)) local table_caption if table_captions then @@ -32275,7 +33114,8 @@ M.extensions.pipe_tables = function(table_captions, table_attributes) + ( parsers.newline * #( parsers.optionalspace * parsers.linechar) - * C(parsers.optionalspace) / writer.space)) + * C(parsers.optionalspace) + / writer.space)) * (parsers.linechar - parsers.lbrace)^0)^1) / self.parser_functions.parse_inlines) @@ -32289,7 +33129,8 @@ M.extensions.pipe_tables = function(table_captions, table_attributes) + ( parsers.newline * #( parsers.optionalspace * parsers.linechar) - * C(parsers.optionalspace) / writer.space))^1) + * C(parsers.optionalspace) + / writer.space))^1) / self.parser_functions.parse_inlines * parsers.newline end @@ -32297,12 +33138,15 @@ M.extensions.pipe_tables = function(table_captions, table_attributes) table_caption = parsers.fail end - local PipeTable = Ct(table_row * parsers.newline * (parsers.check_minimal_indent_and_trail / {}) - * table_hline * parsers.newline - * ((parsers.check_minimal_indent / {}) * table_row * parsers.newline)^0) - / make_pipe_table_rectangular - * table_caption^-1 - / writer.table + local PipeTable + = Ct( table_row * parsers.newline + * (parsers.check_minimal_indent_and_trail / {}) + * table_hline * parsers.newline + * ( (parsers.check_minimal_indent / {}) + * table_row * parsers.newline)^0) + / make_pipe_table_rectangular + * table_caption^-1 + / writer.table self.insert_pattern("Block after Blockquote", PipeTable, "PipeTable") @@ -32470,7 +33314,8 @@ M.extensions.superscripts = function() local writer = self.writer local Superscript = ( - parsers.between(parsers.Str, parsers.circumflex, parsers.circumflex) + parsers.between(parsers.Str, parsers.circumflex, + parsers.circumflex) ) / writer.superscript self.insert_pattern("Inline after LinkAndEmph", @@ -32533,11 +33378,13 @@ M.extensions.tex_math = function(tex_math_dollars, return str:gsub("^%s*(.-)$", "%1") end - local allowed_before_closing = B( parsers.backslash * parsers.any - + parsers.any * (parsers.any - parsers.backslash)) + local allowed_before_closing + = B( parsers.backslash * parsers.any + + parsers.any * (parsers.any - parsers.backslash)) - local allowed_before_closing_no_space = B( parsers.backslash * parsers.any - + parsers.any * (parsers.nonspacechar - parsers.backslash)) + local allowed_before_closing_no_space + = B( parsers.backslash * parsers.any + + parsers.any * (parsers.nonspacechar - parsers.backslash)) % \end{macrocode} % \begin{markdown} @@ -32546,18 +33393,20 @@ M.extensions.tex_math = function(tex_math_dollars, % % \end{markdown} % \begin{macrocode} - local dollar_math_content = (parsers.newline * (parsers.check_optional_indent / "") - + parsers.backslash^-1 - * parsers.linechar) - - parsers.blankline^2 - - parsers.dollar + local dollar_math_content + = (parsers.newline * (parsers.check_optional_indent / "") + + parsers.backslash^-1 + * parsers.linechar) + - parsers.blankline^2 + - parsers.dollar local inline_math_opening_dollars = parsers.dollar * #(parsers.nonspacechar) - local inline_math_closing_dollars = allowed_before_closing_no_space - * parsers.dollar - * -#(parsers.digit) + local inline_math_closing_dollars + = allowed_before_closing_no_space + * parsers.dollar + * -#(parsers.digit) local inline_math_dollars = between(Cs( dollar_math_content), inline_math_opening_dollars, @@ -32580,9 +33429,10 @@ M.extensions.tex_math = function(tex_math_dollars, % % \end{markdown} % \begin{macrocode} - local backslash_math_content = (parsers.newline * (parsers.check_optional_indent / "") - + parsers.linechar) - - parsers.blankline^2 + local backslash_math_content + = (parsers.newline * (parsers.check_optional_indent / "") + + parsers.linechar) + - parsers.blankline^2 % \end{macrocode} % \begin{markdown} % @@ -32702,11 +33552,15 @@ end % \acro{yaml} metadata block syntax extension. When the % `expect_jekyll_data` parameter is `true`, then a markdown document % may begin directly with \acro{yaml} metadata and may contain nothing -% but \acro{yaml} metadata. +% but \acro{yaml} metadata. When both `expect_jekyll_data` and +% `ensure_jekyll_data` parameters are `true`, then a a markdown document must +% begin directly with \acro{yaml} metadata and must contain nothing but +% \acro{yaml} metadata. % % \end{markdown} % \begin{macrocode} -M.extensions.jekyll_data = function(expect_jekyll_data) +M.extensions.jekyll_data = function(expect_jekyll_data, + ensure_jekyll_data) return { name = "built-in jekyll_data syntax extension", extend_writer = function(self) @@ -32719,7 +33573,8 @@ M.extensions.jekyll_data = function(expect_jekyll_data) % the key `p` in the parent table; if `p` is nil, then the table has no parent. % All scalar keys and values encountered in the table will be cast to a string % following \acro{yaml} serialization rules. String values will also be -% transformed using the function `t`. +% transformed using the function `t` for the typographic output format used by +% the \mref{markdownRendererJekyllDataTypographicString} macro. % % \end{markdown} % \begin{macrocode} @@ -32764,17 +33619,18 @@ M.extensions.jekyll_data = function(expect_jekyll_data) ::not_a_sequence:: if is_sequence then - table.insert(buf, "\\markdownRendererJekyllDataSequenceBegin{") - table.insert(buf, self.identifier(p or "null")) - table.insert(buf, "}{") - table.insert(buf, #keys) - table.insert(buf, "}") + table.insert(buf, + "\\markdownRendererJekyllDataSequenceBegin{") + table.insert(buf, self.identifier(p or "null")) + table.insert(buf, "}{") + table.insert(buf, #keys) + table.insert(buf, "}") else - table.insert(buf, "\\markdownRendererJekyllDataMappingBegin{") - table.insert(buf, self.identifier(p or "null")) - table.insert(buf, "}{") - table.insert(buf, #keys) - table.insert(buf, "}") + table.insert(buf, "\\markdownRendererJekyllDataMappingBegin{") + table.insert(buf, self.identifier(p or "null")) + table.insert(buf, "}{") + table.insert(buf, #keys) + table.insert(buf, "}") end for _, k in ipairs(keys) do @@ -32802,7 +33658,14 @@ M.extensions.jekyll_data = function(expect_jekyll_data) table.insert(buf, v) table.insert(buf, "}") elseif typ == "string" then - table.insert(buf, "\\markdownRendererJekyllDataString{") + table.insert(buf, + "\\markdownRendererJekyllDataProgrammaticString{") + table.insert(buf, k) + table.insert(buf, "}{") + table.insert(buf, self.identifier(v)) + table.insert(buf, "}") + table.insert(buf, + "\\markdownRendererJekyllDataTypographicString{") table.insert(buf, k) table.insert(buf, "}{") table.insert(buf, t(v)) @@ -32812,8 +33675,10 @@ M.extensions.jekyll_data = function(expect_jekyll_data) table.insert(buf, k) table.insert(buf, "}") else - error(format("Unexpected type %s for value of " .. - "YAML key %s", typ, k)) + local error = self.error(format( + "Unexpected type %s for value of " + .. "YAML key %s", typ, k)) + table.insert(buf, error) end end end @@ -32835,38 +33700,49 @@ M.extensions.jekyll_data = function(expect_jekyll_data) local writer = self.writer local JekyllData - = Cmt( C((parsers.line - P("---") - P("..."))^0) - , function(s, i, text) -- luacheck: ignore s i - local data - local ran_ok, _ = pcall(function() - -- TODO: Replace with `require("tinyyaml")` in TeX Live 2023 - local tinyyaml = require("markdown-tinyyaml") - data = tinyyaml.parse(text, {timestamps=false}) - end) - if ran_ok and data ~= nil then - return true, writer.jekyllData(data, function(s) - return self.parser_functions.parse_blocks_nested(s) - end, nil) - else - return false - end - end - ) + = Cmt( C((parsers.line - P("---") - P("..."))^0) + , function(s, i, text) -- luacheck: ignore s i + local data + local ran_ok, _ = pcall(function() + -- TODO: Use `require("tinyyaml")` in TeX Live 2023 + local tinyyaml = require("markdown-tinyyaml") + data = tinyyaml.parse(text, {timestamps=false}) + end) + if ran_ok and data ~= nil then + return true, writer.jekyllData(data, function(s) + return self.parser_functions.parse_blocks_nested(s) + end, nil) + else + return false + end + end + ) local UnexpectedJekyllData - = P("---") - * parsers.blankline / 0 - * #(-parsers.blankline) -- if followed by blank, it's thematic break - * JekyllData - * (P("---") + P("...")) + = P("---") + * parsers.blankline / 0 + -- if followed by blank, it's thematic break + * #(-parsers.blankline) + * JekyllData + * (P("---") + P("...")) local ExpectedJekyllData - = ( P("---") - * parsers.blankline / 0 - * #(-parsers.blankline) -- if followed by blank, it's thematic break - )^-1 - * JekyllData - * (P("---") + P("..."))^-1 + = ( P("---") + * parsers.blankline / 0 + -- if followed by blank, it's thematic break + * #(-parsers.blankline) + )^-1 + * JekyllData + * (P("---") + P("..."))^-1 + + if ensure_jekyll_data then + ExpectedJekyllData = ExpectedJekyllData + * parsers.eof + else + ExpectedJekyllData = ( ExpectedJekyllData + * (V("Blank")^0 / writer.interblocksep) + )^-1 + end self.insert_pattern("Block before Blockquote", UnexpectedJekyllData, "UnexpectedJekyllData") @@ -32881,9 +33757,127 @@ end % %### Conversion from Markdown to Plain \TeX{} % -% The \luamref{new} function returns a conversion function that takes a -% markdown string and turns it into a plain \TeX{} output. See Section -% <#sec:lua-conversion>. +% The \luamref{new} function of file `markdown.lua` loads file +% `markdown-parser.lua` and calls its own function \luamref{new} unless option +% \Opt{eagerCache} or \Opt{finalizeCache} has been enabled and a cached +% conversion output exists, in which case it is returned without loading file +% `markdown-parser.lua`. +% +% \end{markdown} +% \iffalse +%</lua> +%<*lua-loader> +% \fi +% \begin{macrocode} +local function warn(s) + io.stderr:write("Warning: " .. s .. "\n") +end + +function M.new(options) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Make the `options` table inherit from the \luamref{defaultOptions} table. +% +% \end{markdown} +% \begin{macrocode} + options = options or {} + setmetatable(options, { __index = function (_, key) + return defaultOptions[key] end }) +% \end{macrocode} +% \par +% \begin{markdown} +% +% Return a conversion function that tries to produce a cached conversion output +% exists. If no cached conversion output exists, we load the file +% `markdown-parser.lua` and use it to convert the input. +% +% \end{markdown} +% \begin{macrocode} + local parser_convert = nil + return function(input) + local function convert(input) + if parser_convert == nil then +% \end{macrocode} +% \par +% \begin{markdown} +% +% Lazy-load `markdown-parser.lua` and check that it originates from the same +% version of the Markdown package. +% +% \end{markdown} +% \begin{macrocode} + local parser = require("markdown-parser") + if metadata.version ~= parser.metadata.version then + warn("markdown.lua " .. metadata.version .. " used with " .. + "markdown-parser.lua " .. parser.metadata.version .. ".") + end + parser_convert = parser.new(options) + end + return parser_convert(input) + end +% \end{macrocode} +% \begin{markdown} +% If we cache markdown documents, produce the cache file and transform its +% filename to plain \TeX{} output. +% +% When determining the name of the cache file, create salt for the hashing +% function out of the package version and the passed options recognized by the +% Lua interface (see Section <#sec:lua-options>). +% \end{markdown} +% \begin{macrocode} + local output + if options.eagerCache or options.finalizeCache then + local salt = util.salt(options) + local name = util.cache(options.cacheDir, input, salt, convert, + ".md.tex") + output = [[\input{]] .. name .. [[}\relax]] +% \end{macrocode} +% \begin{markdown} +% Otherwise, return the result of the conversion directly. +% \end{markdown} +% \begin{macrocode} + else + output = convert(input) + end +% \end{macrocode} +% \begin{markdown} +% If the \Opt{finalizeCache} option is enabled, populate the frozen cache in +% the file \Opt{frozenCacheFileName} with an entry for markdown document +% number \Opt{frozenCacheCounter}. +% \end{markdown} +% \begin{macrocode} + if options.finalizeCache then + local file, mode + if options.frozenCacheCounter > 0 then + mode = "a" + else + mode = "w" + end + file = assert(io.open(options.frozenCacheFileName, mode), + [[Could not open file "]] .. options.frozenCacheFileName + .. [[" for writing]]) + assert(file:write( + [[\expandafter\global\expandafter\def\csname ]] + .. [[markdownFrozenCache]] .. options.frozenCacheCounter + .. [[\endcsname{]] .. output .. [[}]] .. "\n")) + assert(file:close()) + end + return output + end +end +% \end{macrocode} +% \iffalse +%</lua-loader> +%<*lua> +% \fi +% \par +% \begin{markdown} +% +% The \luamref{new} function from file `markdown-parser.lua` returns a +% conversion function that takes a markdown string and turns it into a plain +% \TeX{} output. See Section <#sec:lua-conversion>. % % \end{markdown} % \begin{macrocode} @@ -32916,7 +33910,15 @@ function M.new(options) goto miss end end - elseif singletonCache.options[k] ~= options[k] then +% \end{macrocode} +% \begin{markdown} +% +% The \Opt{cacheDir} option is disregarded. +% +% \end{markdown} +% \begin{macrocode} + elseif k ~= "cacheDir" + and singletonCache.options[k] ~= options[k] then goto miss end end @@ -32977,7 +33979,7 @@ function M.new(options) if options.jekyllData then local jekyll_data_extension = M.extensions.jekyll_data( - options.expectJekyllData) + options.expectJekyllData, options.ensureJekyllData) table.insert(extensions, jekyll_data_extension) end @@ -33040,7 +34042,8 @@ function M.new(options) end if options.citations then - local citations_extension = M.extensions.citations(options.citationNbsps) + local citations_extension + = M.extensions.citations(options.citationNbsps) table.insert(extensions, citations_extension) end @@ -33065,7 +34068,9 @@ function M.new(options) % % \end{markdown} % \begin{macrocode} - local pathname = kpse.lookup(filename) + local pathname = assert(kpse.find_file(filename), + [[Could not locate user-defined syntax extension "]] + .. filename) local input_file = assert(io.open(pathname, "r"), [[Could not open user-defined syntax extension "]] .. pathname .. [[" for reading]]) @@ -33095,7 +34100,8 @@ function M.new(options) .. type(user_extension.api_version) .. [[" but "number" was expected]]) assert(user_extension.api_version > 0 - and user_extension.api_version <= metadata.user_extension_api_version, + and user_extension.api_version + <= metadata.user_extension_api_version, [[User-defined syntax extension "]] .. pathname .. [[" uses syntax extension API version "]] .. user_extension.api_version .. [[ but markdown.lua ]] @@ -33113,7 +34119,8 @@ function M.new(options) .. [[" but "number" was expected]]) assert(user_extension.grammar_version == metadata.grammar_version, [[User-defined syntax extension "]] .. pathname - .. [[" uses grammar version "]] .. user_extension.grammar_version + .. [[" uses grammar version "]] + .. user_extension.grammar_version .. [[ but markdown.lua ]] .. metadata.version .. [[ uses grammar version ]] .. metadata.grammar_version .. [[, which is incompatible]]) @@ -33195,11 +34202,16 @@ function M.new(options) % \begin{macrocode} return convert end - -return M % \end{macrocode} % \iffalse %</lua> +%<*lua,lua-loader> +% \fi +% \begin{macrocode} +return M +% \end{macrocode} +% \iffalse +%</lua,lua-loader> %<*lua-cli> % \fi % \par @@ -33553,18 +34565,22 @@ end \def\markdownRendererUlEndTightPrototype{}% \def\markdownRendererOlBeginPrototype{}% \def\markdownRendererOlBeginTightPrototype{}% -\def\markdownRendererFancyOlBeginPrototype#1#2{\markdownRendererOlBegin}% -\def\markdownRendererFancyOlBeginTightPrototype#1#2{\markdownRendererOlBeginTight}% +\def\markdownRendererFancyOlBeginPrototype#1#2{% + \markdownRendererOlBegin}% +\def\markdownRendererFancyOlBeginTightPrototype#1#2{% + \markdownRendererOlBeginTight}% \def\markdownRendererOlItemPrototype{}% \def\markdownRendererOlItemWithNumberPrototype#1{}% \def\markdownRendererOlItemEndPrototype{}% \def\markdownRendererFancyOlItemPrototype{\markdownRendererOlItem}% -\def\markdownRendererFancyOlItemWithNumberPrototype{\markdownRendererOlItemWithNumber}% +\def\markdownRendererFancyOlItemWithNumberPrototype{% + \markdownRendererOlItemWithNumber}% \def\markdownRendererFancyOlItemEndPrototype{}% \def\markdownRendererOlEndPrototype{}% \def\markdownRendererOlEndTightPrototype{}% \def\markdownRendererFancyOlEndPrototype{\markdownRendererOlEnd}% -\def\markdownRendererFancyOlEndTightPrototype{\markdownRendererOlEndTight}% +\def\markdownRendererFancyOlEndTightPrototype{% + \markdownRendererOlEndTight}% \def\markdownRendererDlBeginPrototype{}% \def\markdownRendererDlBeginTightPrototype{}% \def\markdownRendererDlItemPrototype#1{#1}% @@ -33638,6 +34654,8 @@ end \ExplSyntaxOff \def\markdownRendererSectionBeginPrototype{}% \def\markdownRendererSectionEndPrototype{}% +\let\markdownRendererWarningPrototype\markdownWarning +\let\markdownRendererErrorPrototype\markdownError % \end{macrocode} % \par % \begin{markdown} @@ -33652,7 +34670,7 @@ end % \begin{macrocode} \ExplSyntaxOn \cs_new:Nn - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { \str_case:nn { #2 } @@ -33662,7 +34680,7 @@ end } } \cs_new:Nn - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { \str_case:nn { #2 } @@ -33674,14 +34692,14 @@ end \cs_gset:Npn \markdownRendererInputRawInlinePrototype#1#2 { - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { #1 } { #2 } } \cs_gset:Npn \markdownRendererInputRawBlockPrototype#1#2 { - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { #1 } { #2 } } @@ -33918,7 +34936,17 @@ end { #1 } { #2 } } -\def\markdownRendererJekyllDataStringPrototype#1#2{ +% \end{macrocode} +% \par +% \begin{markdown} +% +% We will process all string scalar values assuming that they may contain +% markdown markup and are intended for typesetting. +% +% \end{markdown} +% \begin{macrocode} +\def\markdownRendererJekyllDataProgrammaticStringPrototype#1#2{} +\def\markdownRendererJekyllDataTypographicStringPrototype#1#2{ \markdown_jekyll_data_set_keyvals:nn { #1 } { #2 } @@ -34447,12 +35475,14 @@ end \msg_new:nnn { markdown } { buffering-markinline } - { Buffering~inline~markdown~input~into~the~temporary~input~file~"#1". } + { Buffering~inline~markdown~input~into~ + the~temporary~input~file~"#1". } \msg_new:nnnn { markdown } { markinline-peek-failure } { Use~of~\iow_char:N \\ markinline~doesn't~match~its~definition } - { The~macro~should~be~followed~by~inline~markdown~text~in~curly~braces } + { The~macro~should~be~followed~by~inline~ + markdown~text~in~curly~braces } \ExplSyntaxOff % \end{macrocode} % \begin{markdown} @@ -34471,6 +35501,13 @@ end \markdownInput #1 { + \@@_if_option:nTF + { frozenCache } + { + \markdownInputRaw + { #1 } + } + { % \end{macrocode} % \begin{markdown} % @@ -34480,19 +35517,23 @@ end % % \end{markdown} % \begin{macrocode} - \file_get_full_name:nNTF - { #1 } - \l_tmpa_tl - { - \exp_args:NV - \markdownInputRaw + \tl_set:Nx \l_tmpa_tl - } - { - \msg_error:nnnV - { markdown } - { markdown-file-does-not-exist } { #1 } + \file_get_full_name:VNTF + \l_tmpa_tl + \l_tmpb_tl + { + \exp_args:NV + \markdownInputRaw + \l_tmpb_tl + } + { + \msg_error:nnV + { markdown } + { markdown-file-does-not-exist } + \l_tmpa_tl + } } } \msg_new:nnn @@ -34546,7 +35587,8 @@ end |fi |markdownInfo{Including markdown document number "|the|markdownOptionFrozenCacheCounter" from frozen cache}% - |csname markdownFrozenCache|the|markdownOptionFrozenCacheCounter|endcsname + |csname markdownFrozenCache% + |the|markdownOptionFrozenCacheCounter|endcsname |global|advance|markdownOptionFrozenCacheCounter by 1|relax }{% |markdownInfo{Including markdown document "&1"}% @@ -34770,13 +35812,26 @@ end % we let the \mref{markdownReadAndConvert} macro process the rest of the % \LaTeX{} environment. % +% We also make provision for using the \mref{markdown} command as a part of a +% different \LaTeX{} environment as follows: +% +% ``` tex +% \newenvironment{foo}\% +% {code before \markdown[some, options]}\% +% {\markdownEnd code after} +% ``` +% % \end{markdown} % \begin{macrocode} - \c { markdownReadAndConvert@markdown } { } + \c { exp_args:NV } + \c { markdownReadAndConvert@ } + \c { @currenvir } } { \group_end: - \markdownReadAndConvert@markdown { } + \exp_args:NV + \markdownReadAndConvert@ + \@currenvir } } { \markdownEnd } @@ -34790,7 +35845,8 @@ end { #1 } \@@_setup:n { #1 } - \markdownReadAndConvert@markdown * + \markdownReadAndConvert@ + { markdown* } } { \markdownEnd } \msg_new:nnn @@ -34800,6 +35856,9 @@ end The~markdown*~LaTeX~environment~has~been~deprecated~and~will~ be~removed~in~the~next~major~version~of~the~Markdown~package. } +\cs_generate_variant:Nn + \@@_setup:n + { V } \ExplSyntaxOff \begingroup % \end{macrocode} @@ -34813,9 +35872,9 @@ end % \begin{macrocode} \catcode`\|=0\catcode`\<=1\catcode`\>=2% \catcode`\\=12|catcode`|{=12|catcode`|}=12% - |gdef|markdownReadAndConvert@markdown#1<% - |markdownReadAndConvert<\end{markdown#1}>% - <|end<markdown#1>>>% + |gdef|markdownReadAndConvert@#1<% + |markdownReadAndConvert<\end{#1}>% + <|end<#1>>>% |endgroup % \end{macrocode} % \par @@ -35030,7 +36089,8 @@ end % \end{markdown} % \begin{macrocode} }{% - \markdown@witiko@dot@oldRendererInputFencedCodePrototype{#1}{#2}{#3}% + \markdown@witiko@dot@oldRendererInputFencedCodePrototype + {#1}{#2}{#3}% }% }% \next#2 \relax}% @@ -35846,8 +36906,9 @@ end \advance\markdownLaTeXCitationsCounter by 1\relax \ifx\relax#4\relax \ifx\relax#5\relax - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax - \cite{#1#2#6}% Without prenotes and postnotes, just accumulate cites + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax + \cite{#1#2#6}% No prenotes/postnotes, just accumulate cites \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter \@gobblethree @@ -35857,7 +36918,8 @@ end \cite{#1}% \fi \cite[#5]{#6}% - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \else \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter @@ -35884,7 +36946,8 @@ end \space % Insert a space before the prenote in later citations \fi #4~\expandafter\cite\ifx\relax#5\relax{#6}\else[#5]{#6}\fi - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \else \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter @@ -35904,8 +36967,9 @@ end \advance\markdownLaTeXCitationsCounter by 1\relax \ifx\relax#3\relax \ifx\relax#4\relax - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax - \citep{#1,#5}% Without prenotes and postnotes, just accumulate cites + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax + \citep{#1,#5}% No prenotes/postnotes, just accumulate cites \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter \@gobbletwo @@ -35915,7 +36979,8 @@ end \citep{#1}% \fi \citep[][#4]{#5}% - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \else \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter @@ -35935,7 +37000,8 @@ end \citep{#1}% \fi \citep[#3][#4]{#5}% - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \else \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter @@ -35950,8 +37016,9 @@ end \advance\markdownLaTeXCitationsCounter by 1\relax \ifx\relax#3\relax \ifx\relax#4\relax - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax - \citet{#1,#5}% Without prenotes and postnotes, just accumulate cites + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax + \citet{#1,#5}% No prenotes/postnotes, just accumulate cites \expandafter\expandafter\expandafter \expandafter\expandafter\expandafter\expandafter \@gobbletwo @@ -35961,10 +37028,13 @@ end \citet{#1}% \fi , \citet[#3][#4]{#5}% - \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal + \relax , \else - \ifnum\markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal\relax + \ifnum + \markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal + \relax , \fi \fi @@ -35983,10 +37053,13 @@ end \citet{#1}% \fi , \citet[#3][#4]{#5}% - \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter<\markdownLaTeXCitationsTotal + \relax , \else - \ifnum\markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal\relax + \ifnum + \markdownLaTeXCitationsCounter=\markdownLaTeXCitationsTotal + \relax , \fi \fi @@ -36001,13 +37074,15 @@ end % BibLaTeX implementation \def\markdownLaTeXBibLaTeXCitations#1#2#3#4#5{% \advance\markdownLaTeXCitationsCounter by 1\relax - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \autocites#1[#3][#4]{#5}% \expandafter\@gobbletwo \fi\markdownLaTeXBibLaTeXCitations{#1[#3][#4]{#5}}} \def\markdownLaTeXBibLaTeXTextCitations#1#2#3#4#5{% \advance\markdownLaTeXCitationsCounter by 1\relax - \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal\relax + \ifnum\markdownLaTeXCitationsCounter>\markdownLaTeXCitationsTotal + \relax \textcites#1[#3][#4]{#5}% \expandafter\@gobbletwo \fi\markdownLaTeXBibLaTeXTextCitations{#1[#3][#4]{#5}}} @@ -36100,7 +37175,8 @@ end { \markdownLaTeXRendererAutolink { #2 } { #3 } }{ - \markdownLaTeXRendererDirectOrIndirectLink { #1 } { #2 } { #3 } { #4 } + \markdownLaTeXRendererDirectOrIndirectLink + { #1 } { #2 } { #3 } { #4 } } } \def\markdownLaTeXRendererAutolink#1#2{% @@ -36399,13 +37475,13 @@ end { { latex } { - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { #1 } { tex } } } { - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { #1 } { #2 } } @@ -36418,13 +37494,13 @@ end { { latex } { - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { #1 } { tex } } } { - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { #1 } { #2 } } @@ -36607,7 +37683,7 @@ end % \end{macrocode} % \iffalse %</context> -%<*themes-witiko-markdown-defaults-context> +%<*themes-witiko-markdown-defaults-ctx> % \fi % \par % \begin{markdown} @@ -36789,7 +37865,8 @@ end \def\markdownRendererStrikeThroughPrototype#1{\overstrikes{#1}} \def\markdownRendererSuperscriptPrototype#1{\high{#1}} \def\markdownRendererSubscriptPrototype#1{\low{#1}} -\def\markdownRendererDisplayMathPrototype#1{\startformula#1\stopformula}% +\def\markdownRendererDisplayMathPrototype#1{% + \startformula#1\stopformula}% % \end{macrocode} % \par % \begin{markdown} @@ -36815,8 +37892,10 @@ end \placetable{#1}{\the\markdownConTeXtTable}}% \fi \begingroup - \setupTABLE[r][each][topframe=off, bottomframe=off, leftframe=off, rightframe=off] - \setupTABLE[c][each][topframe=off, bottomframe=off, leftframe=off, rightframe=off] + \setupTABLE[r][each][topframe=off, bottomframe=off, + leftframe=off, rightframe=off] + \setupTABLE[c][each][topframe=off, bottomframe=off, + leftframe=off, rightframe=off] \setupTABLE[r][1][topframe=on, bottomframe=on] \setupTABLE[r][#1][bottomframe=on] \markdownConTeXtRowCounter=0% @@ -36854,14 +37933,16 @@ end \fi\if#1r% \setupTABLE[c][\the\markdownConTeXtColumnCounter][align=left] \fi - \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax\else + \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax + \else \expandafter\gobbleoneargument \fi\markdownConTeXtReadAlignments} \def\markdownConTeXtRenderTableCell#1{% \advance\markdownConTeXtColumnCounter by 1\relax \markdownConTeXtTable=\expandafter{% \the\markdownConTeXtTable\bTD#1\eTD}% - \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax\else + \ifnum\markdownConTeXtColumnCounter<\markdownConTeXtColumnTotal\relax + \else \expandafter\gobbleoneargument \fi\markdownConTeXtRenderTableCell} % \end{macrocode} @@ -36884,13 +37965,13 @@ end { { latex } { - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { #1 } { context } } } { - \@@_plain_tex_default_input_raw_inline_renderer_prototype:nn + \@@_plain_tex_default_input_raw_inline:nn { #1 } { #2 } } @@ -36903,13 +37984,13 @@ end { { context } { - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { #1 } { tex } } } { - \@@_plain_tex_default_input_raw_block_renderer_prototype:nn + \@@_plain_tex_default_input_raw_block:nn { #1 } { #2 } } @@ -36923,7 +38004,7 @@ end \protect % \end{macrocode} % \iffalse -%</themes-witiko-markdown-defaults-context> +%</themes-witiko-markdown-defaults-ctx> %<*context> % \fi % \par diff --git a/macros/generic/markdown/markdown.html b/macros/generic/markdown/markdown.html index 81e62b2044..3f733cc73d 100644 --- a/macros/generic/markdown/markdown.html +++ b/macros/generic/markdown/markdown.html @@ -93,7 +93,7 @@ <header id="title-block-header"> <h1 class="title">Markdown Package User Manual</h1> <p class="author">Vít Starý Novotný, Andrej Genčur</p> -<p class="date">3.6.2-0-g6c30af7e 2024-07-14</p> +<p class="date">3.7.0-0-g98dece19 2024-08-30</p> </header> <nav id="TOC" role="doc-toc"> <ul> @@ -227,10 +227,10 @@ class="tex">T<sub>e</sub>X</span> distribution, you will need to install it.</p> <p>From <a href="https://github.com/witiko/markdown/releases" title="Releases - witiko/markdown">Releases</a>, download <a -href="https://github.com/witiko/markdown/releases/download/3.6.2/markdown.zip" -title="Release 3.6.2 - witiko/markdown">an archive +href="https://github.com/witiko/markdown/releases/download/3.7.0/markdown.zip" +title="Release 3.7.0 - witiko/markdown">an archive <code>markdown.zip</code> for this version of the Markdown package -(3.6.2)</a> or a different version that you wish to install. Then, unzip +(3.7.0)</a> or a different version that you wish to install. Then, unzip the archive. If you downloaded an archive for a different version of the Markdown package, you should now locate a file named <code>markdown.html</code> with the user manual for that version, open @@ -245,7 +245,8 @@ enter the directory named <code>markdown</code> and run the <p>Either of the two abovelisted approaches should produce the following files:</p> <ul> -<li><code>markdown.lua</code>: The Lua module</li> +<li><code>markdown.lua</code> and <code>markdown-parser.lua</code>: The +Lua module</li> <li><code>libraries/markdown-tinyyaml.lua</code>: An external library for reading <abbr>yaml</abbr></li> <li><code>markdown-cli.lua</code>: The Lua command-line interface</li> @@ -275,6 +276,7 @@ class="header-section-number">1.2.1</span> Local Installation</h3> generally where the individual files should be placed:</p> <ul> <li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown.lua</code></li> +<li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown-parser.lua</code></li> <li><code>⟨TEXMF⟩/tex/luatex/markdown/markdown-tinyyaml.lua</code></li> <li><code>⟨TEXMF⟩/scripts/markdown/markdown-cli.lua</code></li> <li><code>⟨TEXMF⟩/tex/generic/markdown/markdown.tex</code></li> @@ -302,6 +304,7 @@ them together. This way your document can be portably typeset on legacy <p>This is where the individual files should be placed:</p> <ul> <li><code>./markdown.lua</code></li> +<li><code>./markdown-parser.lua</code></li> <li><code>./markdown-tinyyaml.lua</code></li> <li><code>./markdown-cli.lua</code></li> <li><code>./markdown/markdown.tex</code></li> @@ -770,8 +773,8 @@ accepts the same options as the plain <span class="tex">T<sub>e</sub>X</span> interface, but now the options are specified as ⟨<em>key</em>⟩<span class="math inline"> = </span>⟨<em>value</em>⟩ pairs and they are passed -either as package options, in the <code>\markdownSetup</code> command, -or as parameters for the <code>markdown*</code> <span +either as package options, in the <code>markdownSetup</code> command, or +as parameters for the <code>markdown*</code> <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> environment.</p> <p>Using a text editor, create a text document named <code>document.tex</code> with the following content:</p> @@ -858,19 +861,22 @@ class="tex">T<sub>e</sub>X</span>t interfaces.</p> class="header-section-number">2.2.1.1</span> Option <code>eagerCache</code></h4> <dl> -<dt><code>eagerCache</code> (default value: <code>false</code>)</dt> +<dt><code>eagerCache</code> (default value: <code>true</code>)</dt> <dd> <dl> <dt>true</dt> <dd> <p>Converted markdown documents will be cached in -<strong><code>cacheDir</code></strong>. This can be useful for +<code><strong>cacheDir</strong></code>. This can be useful for post-processing the converted documents and for recovering historical -versions of the documents from the cache. However, it also produces a -large number of auxiliary files on the disk and obscures the output of -the Lua command-line interface when it is used for plumbing.</p> +versions of the documents from the cache. Furthermore, it can also +significantly improve the processing speed for documents that require +multiple compilation runs, since each markdown document is only +converted once. However, it also produces a large number of auxiliary +files on the disk and obscures the output of the Lua command-line +interface when it is used for plumbing.</p> <p>This behavior will always be used if the -<strong><code>finalizeCache</code></strong> option is enabled.</p> +<code><strong>finalizeCache</strong></code> option is enabled.</p> </dd> </dl> </dd> @@ -880,9 +886,14 @@ the Lua command-line interface when it is used for plumbing.</p> <dd> <p>Converted markdown documents will not be cached. This decreases the number of auxiliary files that we produce and makes it easier to use the -Lua command-line interface for plumbing.</p> +Lua command-line interface for plumbing. However, it makes it impossible +to post-process the converted documents and recover historical versions +of the documents from the cache. Furthermore, it can significantly +reduce the processing speed for documents that require multiple +compilation runs, since each markdown document is converted multiple +times needlessly.</p> <p>This behavior will only be used when the -<strong><code>finalizeCache</code></strong> option is disabled.</p> +<code><strong>finalizeCache</strong></code> option is disabled.</p> </dd> </dl> </dd> @@ -893,7 +904,7 @@ Lua command-line interface for plumbing.</p> <div class="sourceCode" id="cb46"><pre class="sourceCode md"><code class="sourceCode markdown"><span id="cb46-1"><a href="#cb46-1" aria-hidden="true" tabindex="-1"></a>Hello *world*!</span></code></pre></div> <p>Next, invoke LuaTeX from the terminal with the -<strong><code>eagerCache</code></strong> option disabled:</p> +<code><strong>eagerCache</strong></code> option disabled:</p> <div class="sourceCode" id="cb47"><pre class="sourceCode sh"><code class="sourceCode bash"><span id="cb47-1"><a href="#cb47-1" aria-hidden="true" tabindex="-1"></a><span class="ex">texlua</span> ⟨CLI pathname⟩ eagerCache=false <span class="at">--</span> hello.md hello.tex</span></code></pre></div> <p>where ⟨<em>CLI pathname</em>⟩ corresponds to the location of the Lua @@ -912,7 +923,7 @@ code:</p> class="sourceCode tex"><code class="sourceCode latex"><span id="cb48-1"><a href="#cb48-1" aria-hidden="true" tabindex="-1"></a>Hello <span class="fu">\markdownRendererEmphasis</span>{world}!<span class="fu">\relax</span></span></code></pre></div> <hr /> <p>Invoke LuaTeX from the terminal again, this time with the -<strong><code>eagerCache</code></strong> option enabled:</p> +<code><strong>eagerCache</strong></code> option enabled:</p> <div class="sourceCode" id="cb49"><pre class="sourceCode tex"><code class="sourceCode latex"><span id="cb49-1"><a href="#cb49-1" aria-hidden="true" tabindex="-1"></a>texlua ⟨CLI pathname⟩ eagerCache=true -- hello.md hello.tex</span></code></pre></div> <p>A <span class="tex">T<sub>e</sub>X</span> document named @@ -935,7 +946,7 @@ class="header-section-number">2.2.1.2</span> Option <dt>true</dt> <dd> <p>Conversion functions produced by the function -\luamref{new}<code>(options)</code> will be cached in an LRU cache of +<code>new</code><code>(options)</code> will be cached in an LRU cache of size 1 keyed by <code>options</code>. This is more time- and space-efficient than always producing a new conversion function but may expose bugs related to the idempotence of conversion functions.</p> @@ -948,11 +959,12 @@ Markdown package.</p> <dl> <dt>false</dt> <dd> -<p>Every call to the function \luamref{new}<code>(options)</code> will -produce a new conversion function that will not be cached. This is +<p>Every call to the function <code>new</code><code>(options)</code> +will produce a new conversion function that will not be cached. This is slower than caching conversion functions and may expose bugs related to -memory leaks in the creation of conversion functions, see also issue <a -href="https://github.com/witiko/markdown/pull/226#issuecomment-1599641634">#226</a>.</p> +memory leaks in the creation of conversion functions, see also <a +href="https://github.com/witiko/markdown/pull/226#issuecomment-1599641634">#226 +(comment)</a>.</p> <p>This was the default behavior until version 3.0.0 of the Markdown package.</p> </dd> @@ -1003,7 +1015,7 @@ class="header-section-number">2.2.1.3</span> Option href="https://unicode.org/faq/normalization.html">Unicode normalization forms</a> before conversion. The Unicode normalization norm used is determined by option -<strong><code>unicodeNormalizationForm</code></strong>.</p> +<code><strong>unicodeNormalizationForm</strong></code>.</p> </dd> </dl> </dd> @@ -1027,7 +1039,7 @@ class="header-section-number">2.2.1.4</span> Option <dl> <dt>nfc</dt> <dd> -<p>When option <strong><code>unicodeNormalization</code></strong> has +<p>When option <code><strong>unicodeNormalization</strong></code> has been enabled, markdown documents will be normalized using Unicode Normalization Form C (NFC) before conversion.</p> </dd> @@ -1037,7 +1049,7 @@ Normalization Form C (NFC) before conversion.</p> <dl> <dt>nfd</dt> <dd> -<p>When option <strong><code>unicodeNormalization</code></strong> has +<p>When option <code><strong>unicodeNormalization</strong></code> has been enabled, markdown documents will be normalized using Unicode Normalization Form D (NFD) before conversion.</p> </dd> @@ -1047,7 +1059,7 @@ Normalization Form D (NFD) before conversion.</p> <dl> <dt>nfkc</dt> <dd> -<p>When option <strong><code>unicodeNormalization</code></strong> has +<p>When option <code><strong>unicodeNormalization</strong></code> has been enabled, markdown documents will be normalized using Unicode Normalization Form KC (NFKC) before conversion.</p> </dd> @@ -1057,7 +1069,7 @@ Normalization Form KC (NFKC) before conversion.</p> <dl> <dt>nfkd</dt> <dd> -<p>When option <strong><code>unicodeNormalization</code></strong> has +<p>When option <code><strong>unicodeNormalization</strong></code> has been enabled, markdown documents will be normalized using Unicode Normalization Form KD (NFKD) before conversion.</p> </dd> @@ -1206,7 +1218,7 @@ class="header-section-number">2.2.1.6</span> Option <dd> <p>The filename of the <abbr>JSON</abbr> file that maps filename extensions to programming language names in the iA Writer content blocks -when the <strong><code>contentBlocks</code></strong> option is +when the <code><strong>contentBlocks</strong></code> option is enabled.</p> </dd> </dl> @@ -1370,13 +1382,13 @@ class="header-section-number">2.2.1.7</span> Option <code>"debug-extensions.json"</code>)</dt> <dd> <p>The filename of the <abbr>JSON</abbr> file that will be produced when -the <strong><code>debugExtensions</code></strong> option is enabled. +the <code><strong>debugExtensions</strong></code> option is enabled. This file will contain the extensible subset of the <abbr>peg</abbr> grammar of markdown after built-in syntax extensions (see options -<strong><code>citations</code></strong>, -<strong><code>contentBlocks</code></strong>, -<strong><code>definitionLists</code></strong>, etc.) and user-defined -syntax extensions (see option <strong><code>extensions</code></strong>) +<code><strong>citations</strong></code>, +<code><strong>contentBlocks</strong></code>, +<code><strong>definitionLists</strong></code>, etc.) and user-defined +syntax extensions (see option <code><strong>extensions</strong></code>) have been applied.</p> </dd> </dl> @@ -1388,13 +1400,13 @@ class="header-section-number">2.2.1.8</span> Option <code>"frozenCache.tex"</code>)</dt> <dd> <p>A path to an output file (frozen cache) that will be created when the -<strong><code>finalizeCache</code></strong> option is enabled and will +<code><strong>finalizeCache</strong></code> option is enabled and will contain a mapping between an enumeration of markdown documents and their auxiliary cache files.</p> <p>The frozen cache makes it possible to later typeset a plain <span class="tex">T<sub>e</sub>X</span> document that contains markdown documents without invoking Lua using the -<strong><code>frozenCache</code></strong> plain <span +<code><strong>frozenCache</strong></code> plain <span class="tex">T<sub>e</sub>X</span> option. As a result, the plain <span class="tex">T<sub>e</sub>X</span> document becomes more portable, but further changes in the order and the content of markdown documents will @@ -1611,7 +1623,7 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb96-1"><a hre </dd> </dl> <p>See also the option -<strong><code>gfmAutoIdentifiers</code></strong>.</p> +<code><strong>gfmAutoIdentifiers</strong></code>.</p> <h4 data-number="2.2.1.10" id="option-blankbeforeblockquote"><span class="header-section-number">2.2.1.10</span> Option <code>blankBeforeBlockquote</code></h4> @@ -3385,13 +3397,13 @@ class="header-section-number">2.2.1.22</span> Option <dd> <p>Produce a <abbr>JSON</abbr> file that will contain the extensible subset of the <abbr>peg</abbr> grammar of markdown after built-in syntax -extensions (see options <strong><code>citations</code></strong>, -<strong><code>contentBlocks</code></strong>, -<strong><code>definitionLists</code></strong>, etc.) and user-defined -syntax extensions (see option <strong><code>extensions</code></strong>) +extensions (see options <code><strong>citations</strong></code>, +<code><strong>contentBlocks</strong></code>, +<code><strong>definitionLists</strong></code>, etc.) and user-defined +syntax extensions (see option <code><strong>extensions</strong></code>) have been applied. This helps you to see how the different extensions interact. The name of the produced <abbr>JSON</abbr> file is controlled -by the <strong><code>debugExtensionsFileName</code></strong> option.</p> +by the <code><strong>debugExtensionsFileName</strong></code> option.</p> </dd> </dl> </dd> @@ -3613,8 +3625,39 @@ contain the following text:</p> </dd> </dl> </blockquote> -<h4 data-number="2.2.1.24" id="option-expectjekylldata"><span +<h4 data-number="2.2.1.24" id="option-ensurejekylldata"><span class="header-section-number">2.2.1.24</span> Option +<code>ensureJekyllData</code></h4> +<dl> +<dt><code>ensureJekyllData</code> (default value: +<code>false</code>)</dt> +<dd> +<dl> +<dt>false</dt> +<dd> +<p>When the <code><strong>jekyllData</strong></code> and +<code><strong>expectJekyllData</strong></code> options are enabled, then +a markdown document may begin directly with <abbr>yaml</abbr> metadata +and may contain nothing but <abbr>yaml</abbr> metadata. Otherwise, the +markdown document is processed as markdown text.</p> +</dd> +</dl> +</dd> +<dd> +<dl> +<dt>true</dt> +<dd> +<p>When the <code><strong>jekyllData</strong></code> and +<code><strong>expectJekyllData</strong></code> options are enabled, then +a markdown document must begin directly with <abbr>yaml</abbr> metadata +and must contain nothing but <abbr>yaml</abbr> metadata. Otherwise, an +error is produced.</p> +</dd> +</dl> +</dd> +</dl> +<h4 data-number="2.2.1.25" id="option-expectjekylldata"><span +class="header-section-number">2.2.1.25</span> Option <code>expectJekyllData</code></h4> <dl> <dt><code>expectJekyllData</code> (default value: @@ -3623,7 +3666,7 @@ class="header-section-number">2.2.1.24</span> Option <dl> <dt>false</dt> <dd> -<p>When the <strong><code>jekyllData</code></strong> option is enabled, +<p>When the <code><strong>jekyllData</strong></code> option is enabled, then a markdown document may begin with <abbr>yaml</abbr> metadata if and only if the metadata begin with the end-of-directives marker (<code>---</code>) and they end with either the end-of-directives or the @@ -3655,7 +3698,7 @@ class="sourceCode latex"><code class="sourceCode latex"><span id="cb216-1"><a hr <dl> <dt>true</dt> <dd> -<p>When the <strong><code>jekyllData</code></strong> option is enabled, +<p>When the <code><strong>jekyllData</strong></code> option is enabled, then a markdown document may begin directly with <abbr>yaml</abbr> metadata and may contain nothing but <abbr>yaml</abbr> metadata.</p> <div class="sourceCode" id="cb217"><pre @@ -3713,14 +3756,14 @@ contain the following text:</p> <blockquote> <p>Jane Doe is 99 years old.</p> </blockquote> -<h4 data-number="2.2.1.25" id="option-extensions"><span -class="header-section-number">2.2.1.25</span> Option +<h4 data-number="2.2.1.26" id="option-extensions"><span +class="header-section-number">2.2.1.26</span> Option <code>extensions</code></h4> <dl> <dt><code>extensions</code> (default value: <code>{}</code>)</dt> <dd> <p>The filenames of user-defined syntax extensions that will be applied -to the markdown reader. If the <strong><code>kpathsea</code></strong> +to the markdown reader. If the <code><strong>kpathsea</strong></code> library is available, files will be searched for not only in the current working directory but also in the <span class="tex">T<sub>e</sub>X</span> directory structure.</p> @@ -3773,8 +3816,8 @@ contain the following text:</p> <blockquote> <p>This is <del>a lunar roving vehicle</del> strike-through text.</p> </blockquote> -<h4 data-number="2.2.1.26" id="option-fancylists"><span -class="header-section-number">2.2.1.26</span> Option +<h4 data-number="2.2.1.27" id="option-fancylists"><span +class="header-section-number">2.2.1.27</span> Option <code>fancyLists</code></h4> <dl> <dt><code>fancyLists</code> (default value: <code>false</code>)</dt> @@ -3854,8 +3897,8 @@ contain the following text:</p> <li>third item</li> </ol> </blockquote> -<h4 data-number="2.2.1.27" id="option-fencedcode"><span -class="header-section-number">2.2.1.27</span> Option +<h4 data-number="2.2.1.28" id="option-fencedcode"><span +class="header-section-number">2.2.1.28</span> Option <code>fencedCode</code></h4> <dl> <dt><code>fencedCode</code> (default value: <code>true</code>)</dt> @@ -3990,8 +4033,8 @@ class="sourceCode html"><code class="sourceCode html"><span id="cb237-1"><a href <span id="cb237-7"><a href="#cb237-7" aria-hidden="true" tabindex="-1"></a> <span class="dt"></</span><span class="kw">code</span><span class="dt">></span></span> <span id="cb237-8"><a href="#cb237-8" aria-hidden="true" tabindex="-1"></a><span class="dt"></</span><span class="kw">pre</span><span class="dt">></span></span></code></pre></div> </blockquote> -<h4 data-number="2.2.1.28" id="option-fencedcodeattributes"><span -class="header-section-number">2.2.1.28</span> Option +<h4 data-number="2.2.1.29" id="option-fencedcodeattributes"><span +class="header-section-number">2.2.1.29</span> Option <code>fencedCodeAttributes</code></h4> <dl> <dt><code>fencedCodeAttributes</code> (default value: @@ -4067,8 +4110,8 @@ class="sourceCode js linenos"><code class="sourceCode javascript"><span id="cb24 <span id="cb241-2"><a href="#cb241-2" aria-hidden="true" tabindex="-1"></a><span class="fl">2.</span> <span class="fu">moveShip</span>(<span class="dv">5</span> <span class="op">*</span> gravity<span class="op">,</span> DOWN)<span class="op">;</span></span> <span id="cb241-3"><a href="#cb241-3" aria-hidden="true" tabindex="-1"></a><span class="fl">3.</span> }</span></code></pre></div> </blockquote> -<h4 data-number="2.2.1.29" id="fenced-divs"><span -class="header-section-number">2.2.1.29</span> Option +<h4 data-number="2.2.1.30" id="fenced-divs"><span +class="header-section-number">2.2.1.30</span> Option <code>fencedDivs</code></h4> <dl> <dt><code>fencedDivs</code> (default value: <code>false</code>)</dt> @@ -4123,20 +4166,20 @@ contain the following text:</p> <blockquote> <p>Here is a special paragraph.</p> </blockquote> -<h4 data-number="2.2.1.30" id="option-finalizecache"><span -class="header-section-number">2.2.1.30</span> Option +<h4 data-number="2.2.1.31" id="option-finalizecache"><span +class="header-section-number">2.2.1.31</span> Option <code>finalizeCache</code></h4> <dl> <dt><code>finalizeCache</code> (default value: <code>false</code>)</dt> <dd> <p>Whether an output file specified with the -<strong><code>frozenCacheFileName</code></strong> option (frozen cache) +<code><strong>frozenCacheFileName</strong></code> option (frozen cache) that contains a mapping between an enumeration of markdown documents and their auxiliary cache files will be created.</p> <p>The frozen cache makes it possible to later typeset a plain <span class="tex">T<sub>e</sub>X</span> document that contains markdown documents without invoking Lua using the -<strong><code>frozenCache</code></strong> plain <span +<code><strong>frozenCache</strong></code> plain <span class="tex">T<sub>e</sub>X</span> option. As a result, the plain <span class="tex">T<sub>e</sub>X</span> document becomes more portable, but further changes in the order and the content of markdown documents will @@ -4255,15 +4298,15 @@ contents of the frozen cache using the the document without accessing the shell or invoking Lua, but the change in the content of the markdown document from “Hello <em>world</em>!” to “Hi <em>world</em>!” was not reflected.</p> -<h4 data-number="2.2.1.31" id="option-frozencachecounter"><span -class="header-section-number">2.2.1.31</span> Option +<h4 data-number="2.2.1.32" id="option-frozencachecounter"><span +class="header-section-number">2.2.1.32</span> Option <code>frozenCacheCounter</code></h4> <dl> <dt><code>frozenCacheCounter</code> (default value: <code>0</code>)</dt> <dd> <p>The number of the current markdown document that will be stored in an output file (frozen cache) when the -<strong><code>finalizeCache</code></strong> is enabled. When the +<code><strong>finalizeCache</strong></code> is enabled. When the document number is 0, then a new frozen cache will be created. Otherwise, the frozen cache will be appended.</p> <p>Each frozen cache entry will define a <span @@ -4296,8 +4339,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb258-1"><a href=" contain the text “Hello <em>world</em>!” A frozen cache with two entries will also be produced as we requested using the <code>frozenCacheCounter</code> option.</p> -<h4 data-number="2.2.1.32" id="option-gfmautoidentifiers"><span -class="header-section-number">2.2.1.32</span> Option +<h4 data-number="2.2.1.33" id="option-gfmautoidentifiers"><span +class="header-section-number">2.2.1.33</span> Option <code>gfmAutoIdentifiers</code></h4> <dl> <dt><code>gfmAutoIdentifiers</code> (default value: @@ -4323,9 +4366,9 @@ extension.</p> </dd> </dl> <p>See also the option -<strong><code>autoIdentifiers</code></strong>.</p> -<h4 data-number="2.2.1.33" id="option-hashenumerators"><span -class="header-section-number">2.2.1.33</span> Option +<code><strong>autoIdentifiers</strong></code>.</p> +<h4 data-number="2.2.1.34" id="option-hashenumerators"><span +class="header-section-number">2.2.1.34</span> Option <code>hashEnumerators</code></h4> <dl> <dt><code>hashEnumerators</code> (default value: @@ -4427,8 +4470,8 @@ contain the following text:</p> <li>Parish</li> </ol> </blockquote> -<h4 data-number="2.2.1.34" id="header-attributes"><span -class="header-section-number">2.2.1.34</span> Option +<h4 data-number="2.2.1.35" id="header-attributes"><span +class="header-section-number">2.2.1.35</span> Option <code>headerAttributes</code></h4> <dl> <dt><code>headerAttributes</code> (default value: @@ -4457,8 +4500,8 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb265-1"><a hr </dl> </dd> </dl> -<h4 data-number="2.2.1.35" id="option-html"><span -class="header-section-number">2.2.1.35</span> Option +<h4 data-number="2.2.1.36" id="option-html"><span +class="header-section-number">2.2.1.36</span> Option <code>html</code></h4> <dl> <dt><code>html</code> (default value: <code>true</code>)</dt> @@ -4695,8 +4738,8 @@ comment –> support. There is no <? HTML instruction ?> support.</p> <p>There is support. There is support. There is support.</p> </blockquote> -<h4 data-number="2.2.1.36" id="option-hybrid"><span -class="header-section-number">2.2.1.36</span> Option +<h4 data-number="2.2.1.37" id="option-hybrid"><span +class="header-section-number">2.2.1.37</span> Option <code>hybrid</code></h4> <dl> <dt><code>hybrid</code> (default value: <code>false</code>)</dt> @@ -4887,8 +4930,8 @@ contain the following text:</p> <p><math><msqrt><mo>−</mo><mn>1</mn></msqrt></math> <em>equals</em> <math><mi>i</mi></math>.</p> </blockquote> -<h4 data-number="2.2.1.37" id="option-inlinecodeattributes"><span -class="header-section-number">2.2.1.37</span> Option +<h4 data-number="2.2.1.38" id="option-inlinecodeattributes"><span +class="header-section-number">2.2.1.38</span> Option <code>inlineCodeAttributes</code></h4> <dl> <dt><code>inlineCodeAttributes</code> (default value: @@ -4962,8 +5005,8 @@ contain the following text:</p> <p>Here is some <span style="color: red"><code>colored text</code></span>.</p> </blockquote> -<h4 data-number="2.2.1.38" id="option-inlinenotes"><span -class="header-section-number">2.2.1.38</span> Option +<h4 data-number="2.2.1.39" id="option-inlinenotes"><span +class="header-section-number">2.2.1.39</span> Option <code>inlineNotes</code></h4> <dl> <dt><code>inlineNotes</code> (default value: <code>false</code>)</dt> @@ -5036,8 +5079,8 @@ contain the following text:</p> <p>Here is an inline note.<a href="#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a></p> </blockquote> -<h4 data-number="2.2.1.39" id="option-jekylldata"><span -class="header-section-number">2.2.1.39</span> Option +<h4 data-number="2.2.1.40" id="option-jekylldata"><span +class="header-section-number">2.2.1.40</span> Option <code>jekyllData</code></h4> <dl> <dt><code>jekyllData</code> (default value: <code>false</code>)</dt> @@ -5175,8 +5218,8 @@ contain the following text:</p> <blockquote> <p>Jane Doe is 99 years old.</p> </blockquote> -<h4 data-number="2.2.1.40" id="option-linkattributes"><span -class="header-section-number">2.2.1.40</span> Option +<h4 data-number="2.2.1.41" id="option-linkattributes"><span +class="header-section-number">2.2.1.41</span> Option <code>linkAttributes</code></h4> <dl> <dt><code>linkAttributes</code> (default value: <code>false</code>)</dt> @@ -5247,8 +5290,8 @@ class="sourceCode sh"><code class="sourceCode bash"><span id="cb305-1"><a href=" contain an example image (from <a href="https://ctan.org/pkg/mwe" title="mwe – Packages and image files for MWEs">Martin Scharrer’s mwe package</a>) displayed at size 5cm × 4cm.</p> -<h4 data-number="2.2.1.41" id="option-lineblocks"><span -class="header-section-number">2.2.1.41</span> Option +<h4 data-number="2.2.1.42" id="option-lineblocks"><span +class="header-section-number">2.2.1.42</span> Option <code>lineBlocks</code></h4> <dl> <dt><code>lineBlocks</code> (default value: <code>false</code>)</dt> @@ -5354,8 +5397,8 @@ But I, being poor, have only my dreams;<br /> I have spread my dreams under your feet;<br /> Tread softly because you tread on my dreams.</div> </blockquote> -<h4 data-number="2.2.1.42" id="option-mark"><span -class="header-section-number">2.2.1.42</span> Option +<h4 data-number="2.2.1.43" id="option-mark"><span +class="header-section-number">2.2.1.43</span> Option <code>mark</code></h4> <dl> <dt><code>mark</code> (default value: <code>false</code>)</dt> @@ -5402,8 +5445,8 @@ contain the following text:</p> <blockquote> <p>This <mark>is highlighted text.</mark></p> </blockquote> -<h4 data-number="2.2.1.43" id="option-notes"><span -class="header-section-number">2.2.1.43</span> Option +<h4 data-number="2.2.1.44" id="option-notes"><span +class="header-section-number">2.2.1.44</span> Option <code>notes</code></h4> <dl> <dt><code>notes</code> (default value: <code>false</code>)</dt> @@ -5534,8 +5577,8 @@ work like multi-paragraph list items.</code></pre> <p>This paragraph won’t be part of the note, because it isn’t indented.</p> </blockquote> -<h4 data-number="2.2.1.44" id="pipe-tables"><span -class="header-section-number">2.2.1.44</span> Option +<h4 data-number="2.2.1.45" id="pipe-tables"><span +class="header-section-number">2.2.1.45</span> Option <code>pipeTables</code></h4> <dl> <dt><code>pipeTables</code> (default value: <code>false</code>)</dt> @@ -5669,8 +5712,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.45" id="option-preservetabs"><span -class="header-section-number">2.2.1.45</span> Option +<h4 data-number="2.2.1.46" id="option-preservetabs"><span +class="header-section-number">2.2.1.46</span> Option <code>preserveTabs</code></h4> <dl> <dt><code>preserveTabs</code> (default value: <code>true</code>)</dt> @@ -5691,8 +5734,8 @@ class="header-section-number">2.2.1.45</span> Option </dl> </dd> </dl> -<h4 data-number="2.2.1.46" id="option-rawattribute"><span -class="header-section-number">2.2.1.46</span> Option +<h4 data-number="2.2.1.47" id="option-rawattribute"><span +class="header-section-number">2.2.1.47</span> Option <code>rawAttribute</code></h4> <dl> <dt><code>rawAttribute</code> (default value: <code>false</code>)</dt> @@ -5705,7 +5748,7 @@ href="https://pandoc.org/MANUAL.html#extension-raw_attribute">raw attribute syntax extension</a>:</p> <div class="sourceCode" id="cb330"><pre class="sourceCode md"><code class="sourceCode markdown"><span id="cb330-1"><a href="#cb330-1" aria-hidden="true" tabindex="-1"></a><span class="in">`$H_2 O$`</span>{=tex} is a liquid.</span></code></pre></div> -<p>To enable raw blocks, the <strong><code>fencedCode</code></strong> +<p>To enable raw blocks, the <code><strong>fencedCode</strong></code> option must also be enabled:</p> <div class="sourceCode" id="cb331"><pre class="sourceCode md"><code class="sourceCode markdown"><span id="cb331-1"><a href="#cb331-1" aria-hidden="true" tabindex="-1"></a><span class="an">Here is a mathematical formula:</span></span> @@ -5717,10 +5760,10 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb331-1"><a hr <span id="cb331-7"><a href="#cb331-7" aria-hidden="true" tabindex="-1"></a><span class="in"> \end{dcases}</span></span> <span id="cb331-8"><a href="#cb331-8" aria-hidden="true" tabindex="-1"></a><span class="in">\]</span></span> <span id="cb331-9"><a href="#cb331-9" aria-hidden="true" tabindex="-1"></a><span class="in">```</span></span></code></pre></div> -<p>The <strong><code>rawAttribute</code></strong> option is a good -alternative to the <strong><code>hybrid</code></strong> option. Unlike -the <strong><code>hybrid</code></strong> option, which affects the -entire document, the <strong><code>rawAttribute</code></strong> option +<p>The <code><strong>rawAttribute</strong></code> option is a good +alternative to the <code><strong>hybrid</strong></code> option. Unlike +the <code><strong>hybrid</strong></code> option, which affects the +entire document, the <code><strong>rawAttribute</strong></code> option allows you to isolate the parts of your documents that use TeX:</p> </dd> </dl> @@ -5759,8 +5802,8 @@ contain the following text:</p> <blockquote> <p>H<sub>2</sub>O is a liquid.</p> </blockquote> -<h4 data-number="2.2.1.47" id="option-relativereferences"><span -class="header-section-number">2.2.1.47</span> Option +<h4 data-number="2.2.1.48" id="option-relativereferences"><span +class="header-section-number">2.2.1.48</span> Option <code>relativeReferences</code></h4> <dl> <dt><code>relativeReferences</code> (default value: @@ -5824,8 +5867,8 @@ contain the following text:</p> <p>In this paper, we have discovered that most grandmas would rather eat dinner with their grandchildren than get eaten. Begone, wolf!</p> </blockquote> -<h4 data-number="2.2.1.48" id="option-shiftheadings"><span -class="header-section-number">2.2.1.48</span> Option +<h4 data-number="2.2.1.49" id="option-shiftheadings"><span +class="header-section-number">2.2.1.49</span> Option <code>shiftHeadings</code></h4> <dl> <dt><code>shiftHeadings</code> (default value: <code>0</code>)</dt> @@ -5926,8 +5969,8 @@ contain the following text:</p> <h2 id="a-section-7">A section</h2> <h3 id="a-section-8">A section</h3> </blockquote> -<h4 data-number="2.2.1.49" id="option-slice"><span -class="header-section-number">2.2.1.49</span> Option +<h4 data-number="2.2.1.50" id="option-slice"><span +class="header-section-number">2.2.1.50</span> Option <code>slice</code></h4> <dl> <dt><code>slice</code> (default value: <code>^ $</code>)</dt> @@ -6094,8 +6137,8 @@ contain the following text:</p> <h2 id="act-v-2">Act V</h2> <p>Hamlet dies.</p> </blockquote> -<h4 data-number="2.2.1.50" id="option-smartellipses"><span -class="header-section-number">2.2.1.50</span> Option +<h4 data-number="2.2.1.51" id="option-smartellipses"><span +class="header-section-number">2.2.1.51</span> Option <code>smartEllipses</code></h4> <dl> <dt><code>smartEllipses</code> (default value: <code>false</code>)</dt> @@ -6104,7 +6147,7 @@ class="header-section-number">2.2.1.50</span> Option <dt>true</dt> <dd> <p>Convert any ellipses in the input to the -<code>\markdownRendererEllipsis</code> <span +<code>markdownRendererEllipsis</code> <span class="tex">T<sub>e</sub>X</span> macro.</p> </dd> </dl> @@ -6278,8 +6321,8 @@ contain the following text:</p> <p>These are just three regular dots …</p> <p>. . . and this is a victorian ellipsis.</p> </blockquote> -<h4 data-number="2.2.1.51" id="option-startnumber"><span -class="header-section-number">2.2.1.51</span> Option +<h4 data-number="2.2.1.52" id="option-startnumber"><span +class="header-section-number">2.2.1.52</span> Option <code>startNumber</code></h4> <dl> <dt><code>startNumber</code> (default value: <code>true</code>)</dt> @@ -6289,7 +6332,7 @@ class="header-section-number">2.2.1.51</span> Option <dd> <p>Make the number in the first item of an ordered lists significant. The item numbers will be passed to the -<code>\markdownRendererOlItemWithNumber</code> <span +<code>markdownRendererOlItemWithNumber</code> <span class="tex">T<sub>e</sub>X</span> macro.</p> </dd> </dl> @@ -6299,7 +6342,7 @@ class="tex">T<sub>e</sub>X</span> macro.</p> <dt>false</dt> <dd> <p>Ignore the numbers in the ordered list items. Each item will only -produce a <code>\markdownRendererOlItem</code> <span +produce a <code>markdownRendererOlItem</code> <span class="tex">T<sub>e</sub>X</span> macro.</p> </dd> </dl> @@ -6397,8 +6440,8 @@ markup:</p> <li>fifth item</li> </ol> </blockquote> -<h4 data-number="2.2.1.52" id="option-strikethrough"><span -class="header-section-number">2.2.1.52</span> Option +<h4 data-number="2.2.1.53" id="option-strikethrough"><span +class="header-section-number">2.2.1.53</span> Option <code>strikeThrough</code></h4> <dl> <dt><code>strikeThrough</code> (default value: <code>false</code>)</dt> @@ -6491,8 +6534,8 @@ contain the following text:</p> <blockquote> <p>This is <del>a lunar roving vehicle</del> strike-through text.</p> </blockquote> -<h4 data-number="2.2.1.53" id="option-stripindent"><span -class="header-section-number">2.2.1.53</span> Option +<h4 data-number="2.2.1.54" id="option-stripindent"><span +class="header-section-number">2.2.1.54</span> Option <code>stripIndent</code></h4> <dl> <dt><code>stripIndent</code> (default value: <code>false</code>)</dt> @@ -6502,7 +6545,7 @@ class="header-section-number">2.2.1.53</span> Option <dd> <p>Strip the minimal indentation of non-blank lines from all lines in a markdown document. Requires that the -<strong><code>preserveTabs</code></strong> Lua option is disabled:</p> +<code><strong>preserveTabs</strong></code> Lua option is disabled:</p> <div class="sourceCode" id="cb375"><pre class="sourceCode tex"><code class="sourceCode latex"><span id="cb375-1"><a href="#cb375-1" aria-hidden="true" tabindex="-1"></a><span class="bu">\documentclass</span>{<span class="ex">article</span>}</span> <span id="cb375-2"><a href="#cb375-2" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>[stripIndent]{<span class="ex">markdown</span>}</span> @@ -6574,8 +6617,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb380-1"><a href class="sourceCode sh"><code class="sourceCode bash"><span id="cb381-1"><a href="#cb381-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div> <p>A PDF document named <code>document.pdf</code> should be produced and contain the text “Hello <em>world</em>!”</p> -<h4 data-number="2.2.1.54" id="option-subscripts"><span -class="header-section-number">2.2.1.54</span> Option +<h4 data-number="2.2.1.55" id="option-subscripts"><span +class="header-section-number">2.2.1.55</span> Option <code>subscripts</code></h4> <dl> <dt><code>subscripts</code> (default value: <code>false</code>)</dt> @@ -6640,8 +6683,8 @@ contain the following text:</p> <blockquote> <p>H<sub>2</sub>O is a liquid.</p> </blockquote> -<h4 data-number="2.2.1.55" id="option-superscripts"><span -class="header-section-number">2.2.1.55</span> Option +<h4 data-number="2.2.1.56" id="option-superscripts"><span +class="header-section-number">2.2.1.56</span> Option <code>superscripts</code></h4> <dl> <dt><code>superscripts</code> (default value: <code>false</code>)</dt> @@ -6706,8 +6749,8 @@ contain the following text:</p> <blockquote> <p>2<sup>10</sup> is 1024.</p> </blockquote> -<h4 data-number="2.2.1.56" id="option-tableattributes"><span -class="header-section-number">2.2.1.56</span> Option +<h4 data-number="2.2.1.57" id="option-tableattributes"><span +class="header-section-number">2.2.1.57</span> Option <code>tableAttributes</code></h4> <dl> <dt><code>tableAttributes</code> (default value: @@ -6829,8 +6872,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.57" id="table-captions"><span -class="header-section-number">2.2.1.57</span> Option +<h4 data-number="2.2.1.58" id="table-captions"><span +class="header-section-number">2.2.1.58</span> Option <code>tableCaptions</code></h4> <dl> <dt><code>tableCaptions</code> (default value: <code>false</code>)</dt> @@ -6978,8 +7021,8 @@ contain the following text:</p> </tbody> </table> </blockquote> -<h4 data-number="2.2.1.58" id="option-tasklists"><span -class="header-section-number">2.2.1.58</span> Option +<h4 data-number="2.2.1.59" id="option-tasklists"><span +class="header-section-number">2.2.1.59</span> Option <code>taskLists</code></h4> <dl> <dt><code>taskLists</code> (default value: <code>false</code>)</dt> @@ -7068,8 +7111,8 @@ contain the following text:</p> <li>Yes I can!</li> </ul> </blockquote> -<h4 data-number="2.2.1.59" id="option-texcomments"><span -class="header-section-number">2.2.1.59</span> Option +<h4 data-number="2.2.1.60" id="option-texcomments"><span +class="header-section-number">2.2.1.60</span> Option <code>texComments</code></h4> <dl> <dt><code>texComments</code> (default value: <code>false</code>)</dt> @@ -7087,7 +7130,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb405-1"><a href <span id="cb405-6"><a href="#cb405-6" aria-hidden="true" tabindex="-1"></a> lo *world*!</span> <span id="cb405-7"><a href="#cb405-7" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">markdown</span>}</span> <span id="cb405-8"><a href="#cb405-8" aria-hidden="true" tabindex="-1"></a><span class="kw">\end</span>{<span class="ex">document</span>}</span></code></pre></div> -<p>Always enabled when <strong><code>hybrid</code></strong> is +<p>Always enabled when <code><strong>hybrid</strong></code> is enabled.</p> </dd> </dl> @@ -7155,8 +7198,8 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb410-1"><a href class="sourceCode sh"><code class="sourceCode bash"><span id="cb411-1"><a href="#cb411-1" aria-hidden="true" tabindex="-1"></a><span class="ex">context</span> <span class="at">--luatex</span> document.tex</span></code></pre></div> <p>A PDF document named <code>document.pdf</code> should be produced and contain the text “Hello <em>world</em>!”</p> -<h4 data-number="2.2.1.60" id="option-texmathdollars"><span -class="header-section-number">2.2.1.60</span> Option +<h4 data-number="2.2.1.61" id="option-texmathdollars"><span +class="header-section-number">2.2.1.61</span> Option <code>texMathDollars</code></h4> <dl> <dt><code>texMathDollars</code> (default value: <code>false</code>)</dt> @@ -7339,8 +7382,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.61" id="option-texmathdoublebackslash"><span -class="header-section-number">2.2.1.61</span> Option +<h4 data-number="2.2.1.62" id="option-texmathdoublebackslash"><span +class="header-section-number">2.2.1.62</span> Option <code>texMathDoubleBackslash</code></h4> <dl> <dt><code>texMathDoubleBackslash</code> (default value: @@ -7524,8 +7567,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.62" id="option-texmathsinglebackslash"><span -class="header-section-number">2.2.1.62</span> Option +<h4 data-number="2.2.1.63" id="option-texmathsinglebackslash"><span +class="header-section-number">2.2.1.63</span> Option <code>texMathSingleBackslash</code></h4> <dl> <dt><code>texMathSingleBackslash</code> (default value: @@ -7709,8 +7752,8 @@ class="math inline"><em>E</em> = <em>m</em><em>c</em><sup>2</sup></span></p> <p><span class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f</em>(<em>x</em>)<em>e</em><sup>−<em>i</em>2<em>π</em><em>ξ</em><em>x</em></sup><em>d</em><em>x</em></span></p> </blockquote> -<h4 data-number="2.2.1.63" id="option-tightlists"><span -class="header-section-number">2.2.1.63</span> Option +<h4 data-number="2.2.1.64" id="option-tightlists"><span +class="header-section-number">2.2.1.64</span> Option <code>tightLists</code></h4> <dl> <dt><code>tightLists</code> (default value: <code>true</code>)</dt> @@ -7806,8 +7849,8 @@ contain the following text:</p> <li><p>third item</p></li> </ul> </blockquote> -<h4 data-number="2.2.1.64" id="option-underscores"><span -class="header-section-number">2.2.1.64</span> Option +<h4 data-number="2.2.1.65" id="option-underscores"><span +class="header-section-number">2.2.1.65</span> Option <code>underscores</code></h4> <dl> <dt><code>underscores</code> (default value: <code>true</code>)</dt> @@ -7831,7 +7874,7 @@ class="sourceCode md"><code class="sourceCode markdown"><span id="cb451-1"><a hr <dd> <p>Only asterisks can be used to denote emphasis and strong emphasis. This makes it easy to write math with the -<strong><code>hybrid</code></strong> option without the need to +<code><strong>hybrid</strong></code> option without the need to constantly escape subscripts.</p> </dd> </dl> @@ -7940,7 +7983,7 @@ class="header-section-number">2.2.2.1</span> Setting Lua options from plain <span class="tex">T<sub>e</sub>X</span></h4> <p>As a rule of thumb, you can set all Lua options directly from plain <span class="tex">T<sub>e</sub>X</span>. For example, to set the -<strong><code>taskLists</code></strong> Lua option to <code>true</code>, +<code><strong>taskLists</strong></code> Lua option to <code>true</code>, you would include the following code in your plain <span class="tex">T<sub>e</sub>X</span> document:</p> <div class="sourceCode" id="cb458"><pre @@ -7948,7 +7991,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb458-1"><a href <p>Alternatively, you can also set plain <span class="tex">T<sub>e</sub>X</span> options using the <code>\markdownSetup</code> <span class="tex">T<sub>e</sub>X</span> -macro. For example, to set the <strong><code>taskLists</code></strong> +macro. For example, to set the <code><strong>taskLists</strong></code> Lua option to <code>true</code>, you would include the following code in your plain <span class="tex">T<sub>e</sub>X</span> document:</p> <div class="sourceCode" id="cb459"><pre @@ -7956,29 +7999,29 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb459-1"><a href <h4 data-number="2.2.2.2" id="finalizing-and-freezing-the-cache"><span class="header-section-number">2.2.2.2</span> Finalizing and Freezing the Cache</h4> -<p>The <code>\markdownOptionFrozenCache</code> option uses the mapping +<p>The <code>markdownOptionFrozenCache</code> option uses the mapping previously created by the Lua interface -<strong><code>finalizeCache</code></strong> option, and uses it to +<code><strong>finalizeCache</strong></code> option, and uses it to typeset the plain <span class="tex">T<sub>e</sub>X</span> document without invoking Lua. As a result, the plain <span class="tex">T<sub>e</sub>X</span> document becomes more portable, but further changes in the order and the content of markdown documents will not be reflected. It defaults to <code>false</code>.</p> -<p>The standard usage of the <strong><code>finalizeCache</code></strong> -and <strong><code>frozenCache</code></strong> options is as follows:</p> +<p>The standard usage of the <code><strong>finalizeCache</strong></code> +and <code><strong>frozenCache</strong></code> options is as follows:</p> <ol type="1"> -<li>Remove the <strong><code>cacheDir</code></strong> cache directory +<li>Remove the <code><strong>cacheDir</strong></code> cache directory with stale auxiliary cache files.</li> -<li>Enable the <strong><code>finalizeCache</code></strong> option.</li> +<li>Enable the <code><strong>finalizeCache</strong></code> option.</li> <li>Typeset the plain <span class="tex">T<sub>e</sub>X</span> document to populate and finalize the cache.</li> -<li>Enable the <strong><code>frozenCache</code></strong> option.</li> +<li>Enable the <code><strong>frozenCache</strong></code> option.</li> <li>Publish the source code of the plain <span class="tex">T<sub>e</sub>X</span> document and the -<strong><code>cacheDir</code></strong> directory.</li> +<code><strong>cacheDir</strong></code> directory.</li> </ol> <p>For more information, see the examples for the -<strong><code>finalizeCache</code></strong> option.</p> +<code><strong>finalizeCache</strong></code> option.</p> <h4 data-number="2.2.2.3" id="file-and-directory-names"><span class="header-section-number">2.2.2.3</span> File and Directory Names</h4> @@ -8045,7 +8088,7 @@ class="latex">L<sup>a</sup>T<sub>e</sub>X</span> and Con<span class="tex">T<sub>e</sub>X</span>t. Furthermore, the default definitions may change at any time, which may pose a problem for maintainers of Markdown themes and templates who may require a stable output.</p> -<p>The <code>\markdownOptionPlain</code> macro specifies whether +<p>The <code>markdownOptionPlain</code> macro specifies whether higher-level <span class="tex">T<sub>e</sub>X</span> formats should only use the plain <span class="tex">T<sub>e</sub>X</span> default definitions or whether they should also use the format-specific default @@ -8069,7 +8112,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb464-1"><a href <span id="cb464-2"><a href="#cb464-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\usemodule</span>[t][markdown]</span></code></pre></div> <p>The macro must be set before or during the loading of the package. Setting the macro after loading the package has no effect.</p> -<p>The <code>\markdownOptionNoDefaults</code> macro specifies whether we +<p>The <code>markdownOptionNoDefaults</code> macro specifies whether we should prevent the loading of default definitions or not. This is useful in contexts, where we want to have total control over how all elements are rendered.</p> @@ -8086,7 +8129,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb466-1"><a href Setting the macro after loading the package has no effect.</p> <h4 data-number="2.2.2.5" id="package-documentation"><span class="header-section-number">2.2.2.5</span> Package Documentation</h4> -<p>The <code>\markdownOptionStripPercentSigns</code> macro controls +<p>The <code>markdownOptionStripPercentSigns</code> macro controls whether a percent sign (<code>\%</code>) at the beginning of a line will be discarded when reading Markdown input from a <span class="tex">T<sub>e</sub>X</span> document. This enables the use of @@ -8125,10 +8168,10 @@ low-level programming.</p> <p>Built-in plain <span class="tex">T<sub>e</sub>X</span> themes provided with the Markdown package include:</p> <dl> -<dt><strong><code>witiko/tilde</code></strong></dt> +<dt><code><strong>witiko/tilde</strong></code></dt> <dd> <p>A theme that makes tilde (<code>~</code>) always typeset the -non-breaking space even when the <strong><code>hybrid</code></strong> +non-breaking space even when the <code><strong>hybrid</strong></code> Lua option is disabled.</p> </dd> </dl> @@ -8153,7 +8196,7 @@ non-breaking space:</p> <p>Bartel·Leendert van·der·Waerden</p> </blockquote> <dl> -<dt><strong><code>witiko/markdown/defaults</code></strong></dt> +<dt><code><strong>witiko/markdown/defaults</strong></code></dt> <dd> <p>A plain <span class="tex">T<sub>e</sub>X</span> theme with the default definitions of token renderer prototypes for plain <span @@ -8276,7 +8319,7 @@ class="tex">T<sub>e</sub>X</span> options from <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span></h4> <p>As a rule of thumb, we can set all Lua options directly from <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span>. For example, to set -the <strong><code>taskLists</code></strong> Lua option to +the <code><strong>taskLists</strong></code> Lua option to <code>true</code>, we would include the following code in our <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> document:</p> <div class="sourceCode" id="cb476"><pre @@ -8318,7 +8361,7 @@ where different code is needed for different <span class="tex">T<sub>e</sub>X</span> formats. To enable code reuse, developers can load the <code>.tex</code> theme file from the <code>.sty</code> theme file using the -<code>\markdownLoadPlainTeXTheme</code> macro.</p> +<code>markdownLoadPlainTeXTheme</code> macro.</p> <p>For example, to load themes named <code>witiko/beamer/MU</code> and <code>witiko/dot</code>, you would use the following code in the preamble of your document:</p> @@ -8334,14 +8377,14 @@ class="latex">L<sup>a</sup>T<sub>e</sub>X</span> document.</p> <p>Built-in <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> themes provided with the Markdown package include:</p> <dl> -<dt><strong><code>witiko/dot</code></strong></dt> +<dt><code><strong>witiko/dot</strong></code></dt> <dd> <p>A theme that typesets fenced code blocks with the <code>dot …</code> infostring as images of directed graphs rendered by the Graphviz tools. The right tail of the infostring is used as the image title. The theme requires a Unix-like operating system with GNU Diffutils and Graphviz installed. The theme also requires shell access unless the -<strong><code>frozenCache</code></strong> plain <span +<code><strong>frozenCache</strong></code> plain <span class="tex">T<sub>e</sub>X</span> option is enabled.</p> </dd> </dl> @@ -8400,15 +8443,15 @@ href="http://ceur-ws.org/Vol-2696/paper_235.pdf" class="uri">http://ceur-ws.org/Vol-2696/paper_235.pdf</a></p> </blockquote> <dl> -<dt><strong><code>witiko/graphicx/http</code></strong></dt> +<dt><code><strong>witiko/graphicx/http</strong></code></dt> <dd> <p>A theme that adds support for downloading images whose URL has the http or https protocol. The theme requires the -<strong><code>catchfile</code></strong> <span +<code><strong>catchfile</strong></code> <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> package and a Unix-like operating system with GNU Coreutils <code>md5sum</code> and either GNU Wget or cURL installed. The theme also requires shell access unless the -<strong><code>frozenCache</code></strong> plain <span +<code><strong>frozenCache</strong></code> plain <span class="tex">T<sub>e</sub>X</span> option is enabled.</p> </dd> </dl> @@ -8438,7 +8481,7 @@ title="The banner of the Markdown package" alt="img" /> </figure> </blockquote> <dl> -<dt><strong><code>witiko/markdown/defaults</code></strong></dt> +<dt><code><strong>witiko/markdown/defaults</strong></code></dt> <dd> <p>A <span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> theme with the default definitions of token renderer prototypes for plain <span @@ -8471,7 +8514,7 @@ where different code is needed for different <span class="tex">T<sub>e</sub>X</span> formats. To enable code reuse, developers can load the <code>.tex</code> theme file from the <code>t-*.tex</code> theme file using the -<code>\markdownLoadPlainTeXTheme</code> macro.</p> +<code>markdownLoadPlainTeXTheme</code> macro.</p> <p>For example, to load a theme named <code>witiko/tilde</code> in your document:</p> <div class="sourceCode" id="cb483"><pre @@ -8480,7 +8523,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb483-1"><a href <p>Built-in Con<span class="tex">T<sub>e</sub>X</span>t themes provided with the Markdown package include:</p> <dl> -<dt><strong><code>witiko/markdown/defaults</code></strong></dt> +<dt><code><strong>witiko/markdown/defaults</strong></code></dt> <dd> <p>A Con<span class="tex">T<sub>e</sub>X</span>t theme with the default definitions of token renderer prototypes for plain <span @@ -8507,26 +8550,26 @@ class="header-section-number">2.3.1.1</span> Attribute Renderers</h4> following options for markdown attributes on different elements is enabled:</p> <ul> -<li><strong><code>autoIdentifiers</code></strong></li> -<li><strong><code>fencedCodeAttributes</code></strong></li> -<li><strong><code>gfmAutoIdentifiers</code></strong></li> -<li><strong><code>headerAttributes</code></strong></li> -<li><strong><code>inlineCodeAttributes</code></strong></li> -<li><strong><code>linkAttributes</code></strong></li> +<li><code><strong>autoIdentifiers</strong></code></li> +<li><code><strong>fencedCodeAttributes</strong></code></li> +<li><code><strong>gfmAutoIdentifiers</strong></code></li> +<li><code><strong>headerAttributes</strong></code></li> +<li><code><strong>inlineCodeAttributes</strong></code></li> +<li><code><strong>linkAttributes</strong></code></li> </ul> -<p><code>\markdownRendererAttributeIdentifier</code> represents the +<p><code>markdownRendererAttributeIdentifier</code> represents the ⟨<em>identifier</em>⟩ of a markdown element (<code>id="</code>⟨<em>identifier</em>⟩<code>"</code> in HTML and <code>#</code>⟨<em>identifier</em>⟩ in markdown attributes). The macro receives a single attribute that corresponds to the ⟨<em>identifier</em>⟩.</p> -<p><code>\markdownRendererAttributeClassName</code> represents the +<p><code>markdownRendererAttributeClassName</code> represents the ⟨<em>class name</em>⟩ of a markdown element (<code>class="</code>⟨<em>class name</em>⟩ …<code>"</code> in HTML and <code>.</code>⟨<em>class name</em>⟩ in markdown attributes). The macro receives a single attribute that corresponds to the ⟨<em>class name</em>⟩.</p> -<p><code>\markdownRendererAttributeKeyValue</code> represents a HTML +<p><code>markdownRendererAttributeKeyValue</code> represents a HTML attribute in the form ⟨<em>key</em>⟩<code>=</code>⟨<em>value</em>⟩ that is neither an identifier nor a class name. The macro receives two attributes that correspond to the ⟨<em>key</em>⟩ and the @@ -8583,9 +8626,9 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.2" id="block-quote-renderers"><span class="header-section-number">2.3.1.2</span> Block Quote Renderers</h4> -<p>The <code>\markdownRendererBlockQuoteBegin</code> macro represents -the beginning of a block quote. The macro receives no arguments.</p> -<p>The <code>\markdownRendererBlockQuoteEnd</code> macro represents the +<p>The <code>markdownRendererBlockQuoteBegin</code> macro represents the +beginning of a block quote. The macro receives no arguments.</p> +<p>The <code>markdownRendererBlockQuoteEnd</code> macro represents the end of a block quote. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-25">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -8698,12 +8741,11 @@ id="bracketed-spans-attribute-context-renderers"><span class="header-section-number">2.3.1.3</span> Bracketed Spans Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>bracketedSpans</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererBracketedSpanAttributeContextBegin</code> -and <code>\markdownRendererBracketedSpanAttributeContextEnd</code> -macros represent the beginning and the end of a context in which the -attributes of an inline bracketed span apply. The macros receive no -arguments.</p> +<code><strong>bracketedSpans</strong></code> option is enabled.</p> +<p>The <code>markdownRendererBracketedSpanAttributeContextBegin</code> +and <code>markdownRendererBracketedSpanAttributeContextEnd</code> macros +represent the beginning and the end of a context in which the attributes +of an inline bracketed span apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-58"><span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -8734,26 +8776,26 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.4" id="bullet-list-renderers"><span class="header-section-number">2.3.1.4</span> Bullet List Renderers</h4> -<p>The <code>\markdownRendererUlBegin</code> macro represents the +<p>The <code>markdownRendererUlBegin</code> macro represents the beginning of a bulleted list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.</p> -<p>The <code>\markdownRendererUlBeginTight</code> macro represents the +<p>The <code>markdownRendererUlBeginTight</code> macro represents the beginning of a bulleted list that contains no item with several paragraphs of text (the list is tight). This macro will only be -produced, when the <strong><code>tightLists</code></strong> option is +produced, when the <code><strong>tightLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererUlItem</code> macro represents an item in -a bulleted list. The macro receives no arguments.</p> -<p>The <code>\markdownRendererUlItemEnd</code> macro represents the end +<p>The <code>markdownRendererUlItem</code> macro represents an item in a +bulleted list. The macro receives no arguments.</p> +<p>The <code>markdownRendererUlItemEnd</code> macro represents the end of an item in a bulleted list. The macro receives no arguments.</p> -<p>The <code>\markdownRendererUlEnd</code> macro represents the end of a +<p>The <code>markdownRendererUlEnd</code> macro represents the end of a bulleted list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.</p> -<p>The <code>\markdownRendererUlEndTight</code> macro represents the end +<p>The <code>markdownRendererUlEndTight</code> macro represents the end of a bulleted list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the -<strong><code>tightLists</code></strong> option is disabled. The macro +<code><strong>tightLists</strong></code> option is disabled. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-26">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -8949,9 +8991,9 @@ item).</p> </blockquote> <h4 data-number="2.3.1.5" id="citation-renderers"><span class="header-section-number">2.3.1.5</span> Citation Renderers</h4> -<p>The <code>\markdownRendererCite</code> macro represents a string of +<p>The <code>markdownRendererCite</code> macro represents a string of one or more parenthetical citations. This macro will only be produced, -when the <strong><code>citations</code></strong> option is enabled. The +when the <code><strong>citations</strong></code> option is enabled. The macro receives the parameter <code>{</code>⟨<em>number of citations</em>⟩<code>}</code> followed by ⟨<em>suppress author</em>⟩ <code>{</code>⟨<em>prenote</em>⟩<code>}{</code>⟨<em>postnote</em>⟩<code>}{</code>⟨<em>name</em>⟩<code>}</code> @@ -9013,11 +9055,11 @@ contain the following text:</p> see and a postfix <em>pp. 12</em>, and a citation <em>eijkhout91</em> with a postfix <em>pp. 34</em>.</p> </blockquote> -<p>The <code>\markdownRendererTextCite</code> macro represents a string +<p>The <code>markdownRendererTextCite</code> macro represents a string of one or more text citations. This macro will only be produced, when -the <strong><code>citations</code></strong> option is enabled. The macro +the <code><strong>citations</strong></code> option is enabled. The macro receives parameters in the same format as the -<code>\markdownRendererCite</code> macro.</p> +<code>markdownRendererCite</code> macro.</p> <h5 class="unnumbered" id="latex-example-61"><span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -9075,12 +9117,12 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.6" id="code-block-renderers"><span class="header-section-number">2.3.1.6</span> Code Block Renderers</h4> -<p>The <code>\markdownRendererInputVerbatim</code> macro represents a +<p>The <code>markdownRendererInputVerbatim</code> macro represents a code block. The macro receives a single argument that corresponds to the filename of a file containing the code block contents.</p> -<p>The <code>\markdownRendererInputFencedCode</code> macro represents a +<p>The <code>markdownRendererInputFencedCode</code> macro represents a fenced code block. This macro will only be produced, when the -<strong><code>fencedCode</code></strong> option is enabled. The macro +<code><strong>fencedCode</strong></code> option is enabled. The macro receives three arguments that correspond to the filename of a file containing the code block contents, the fully escaped code fence infostring that can be directly typeset, and the raw code fence @@ -9165,7 +9207,7 @@ class="sourceCode py"><code class="sourceCode python"><span id="cb507-1"><a href </blockquote> <h4 data-number="2.3.1.7" id="code-span-renderer"><span class="header-section-number">2.3.1.7</span> Code Span Renderer</h4> -<p>The <code>\markdownRendererCodeSpan</code> macro represents inline +<p>The <code>markdownRendererCodeSpan</code> macro represents inline code span in the input text. It receives a single argument that corresponds to the inline code span.</p> <h5 class="unnumbered" id="plain-tex-example-27">Plain <span @@ -9274,10 +9316,10 @@ id="code-span-attribute-context-renderers"><span class="header-section-number">2.3.1.8</span> Code Span Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>inlineCodeAttributes</code></strong> option is +<code><strong>inlineCodeAttributes</strong></code> option is enabled.</p> -<p>The <code>\markdownRendererCodeSpanAttributeContextBegin</code> and -<code>\markdownRendererCodeSpanAttributeContextEnd</code> macros +<p>The <code>markdownRendererCodeSpanAttributeContextBegin</code> and +<code>markdownRendererCodeSpanAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of an inline code span apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-64"><span @@ -9312,21 +9354,21 @@ contain the following text:</p> <h4 data-number="2.3.1.9" id="texcontentblockrenderers"><span class="header-section-number">2.3.1.9</span> Content Block Renderers</h4> -<p>The <code>\markdownRendererContentBlock</code> macro represents an +<p>The <code>markdownRendererContentBlock</code> macro represents an iA Writer content block. It receives four arguments: the local file or online image filename extension cast to the lower case, the fully escaped <abbr>uri</abbr> that can be directly typeset, the raw <abbr>uri</abbr> that can be used outside typesetting, and the title of the content block.</p> -<p>The <code>\markdownRendererContentBlockOnlineImage</code> macro +<p>The <code>markdownRendererContentBlockOnlineImage</code> macro represents an iA Writer online image content block. The macro receives -the same arguments as <code>\markdownRendererContentBlock</code>.</p> -<p>The <code>\markdownRendererContentBlockCode</code> macro represents -an iA Writer content block that was recognized as a file in a known +the same arguments as <code>markdownRendererContentBlock</code>.</p> +<p>The <code>markdownRendererContentBlockCode</code> macro represents an +iA Writer content block that was recognized as a file in a known programming language by its filename extension <span class="math inline"><em>s</em></span>. If any <code>markdown-languages.json</code> file found by -<strong><code>kpathsea</code></strong><a href="#fn3" +<code><strong>kpathsea</strong></code><a href="#fn3" class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a> contains a record <span class="math inline">(<em>k</em>,<em>v</em>)</span>, then a @@ -9484,34 +9526,34 @@ the logotype of TUGboat.</p> class="header-section-number">2.3.1.10</span> Definition List Renderers</h4> <p>The following macros are only produced, when the -<strong><code>definitionLists</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererDlBegin</code> macro represents the +<code><strong>definitionLists</strong></code> option is enabled.</p> +<p>The <code>markdownRendererDlBegin</code> macro represents the beginning of a definition list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.</p> -<p>The <code>\markdownRendererDlBeginTight</code> macro represents the +<p>The <code>markdownRendererDlBeginTight</code> macro represents the beginning of a definition list that contains no item with several paragraphs of text (the list is tight). This macro will only be -produced, when the <strong><code>tightLists</code></strong> option is +produced, when the <code><strong>tightLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererDlItem</code> macro represents a term in a +<p>The <code>markdownRendererDlItem</code> macro represents a term in a definition list. The macro receives a single argument that corresponds to the term being defined.</p> -<p>The <code>\markdownRendererDlItemEnd</code> macro represents the end +<p>The <code>markdownRendererDlItemEnd</code> macro represents the end of a list of definitions for a single term.</p> -<p>The <code>\markdownRendererDlDefinitionBegin</code> macro represents +<p>The <code>markdownRendererDlDefinitionBegin</code> macro represents the beginning of a definition in a definition list. There can be several definitions for a single term.</p> -<p>The <code>\markdownRendererDlDefinitionEnd</code> macro represents -the end of a definition in a definition list. There can be several +<p>The <code>markdownRendererDlDefinitionEnd</code> macro represents the +end of a definition in a definition list. There can be several definitions for a single term.</p> -<p>The <code>\markdownRendererDlEnd</code> macro represents the end of a +<p>The <code>markdownRendererDlEnd</code> macro represents the end of a definition list that contains an item with several paragraphs of text (the list is not tight). The macro receives no arguments.</p> -<p>The <code>\markdownRendererDlEndTight</code> macro represents the end +<p>The <code>markdownRendererDlEndTight</code> macro represents the end of a definition list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the -<strong><code>tightLists</code></strong> option is disabled. The macro +<code><strong>tightLists</strong></code> option is disabled. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-29">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -9840,9 +9882,9 @@ nutrient-rich, and produced on an industrial scale.</p> </blockquote> <h4 data-number="2.3.1.11" id="ellipsis-renderer"><span class="header-section-number">2.3.1.11</span> Ellipsis Renderer</h4> -<p>The <code>\markdownRendererEllipsis</code> macro replaces any +<p>The <code>markdownRendererEllipsis</code> macro replaces any occurrence of ASCII ellipses in the input text. This macro will only be -produced, when the <strong><code>smartEllipses</code></strong> option is +produced, when the <code><strong>smartEllipses</strong></code> option is enabled. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-30">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -9914,10 +9956,10 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.12" id="emphasis-renderers"><span class="header-section-number">2.3.1.12</span> Emphasis Renderers</h4> -<p>The <code>\markdownRendererEmphasis</code> macro represents an +<p>The <code>markdownRendererEmphasis</code> macro represents an emphasized span of text. The macro receives a single argument that corresponds to the emphasized span of text.</p> -<p>The <code>\markdownRendererStrongEmphasis</code> macro represents a +<p>The <code>markdownRendererStrongEmphasis</code> macro represents a strongly emphasized span of text. The macro receives a single argument that corresponds to the emphasized span of text.</p> <h5 class="unnumbered" id="plain-tex-example-31">Plain <span @@ -10001,9 +10043,11 @@ id="fenced-code-attribute-context-renderers"><span class="header-section-number">2.3.1.13</span> Fenced Code Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>fencedCode</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererFencedCodeAttributeContextBegin</code> and -<code>\markdownRendererFencedCodeAttributeContextEnd</code> macros +<code><strong>fencedCode</strong></code> and +<code><strong>fencedCodeAttributes</strong></code> options are +enabled.</p> +<p>The <code>markdownRendererFencedCodeAttributeContextBegin</code> and +<code>markdownRendererFencedCodeAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of a fenced code apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-69"><span @@ -10057,9 +10101,9 @@ id="fenced-div-attribute-context-renderers"><span class="header-section-number">2.3.1.14</span> Fenced Div Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>fencedDiv</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererFencedDivAttributeContextBegin</code> and -<code>\markdownRendererFencedDivAttributeContextEnd</code> macros +<code><strong>fencedDiv</strong></code> option is enabled.</p> +<p>The <code>markdownRendererFencedDivAttributeContextBegin</code> and +<code>markdownRendererFencedDivAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of a div apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-70"><span @@ -10126,11 +10170,11 @@ contain the following text:</p> class="header-section-number">2.3.1.15</span> Header Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>autoIdentifiers</code></strong>, -<strong><code>gfmAutoIdentifiers</code></strong>, or -<strong><code>headerAttributes</code></strong> options are enabled.</p> -<p>The <code>\markdownRendererHeaderAttributeContextBegin</code> and -<code>\markdownRendererHeaderAttributeContextEnd</code> macros represent +<code><strong>autoIdentifiers</strong></code>, +<code><strong>gfmAutoIdentifiers</strong></code>, or +<code><strong>headerAttributes</strong></code> options are enabled.</p> +<p>The <code>markdownRendererHeaderAttributeContextBegin</code> and +<code>markdownRendererHeaderAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of a heading apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-71"><span @@ -10181,22 +10225,22 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.16" id="heading-renderers"><span class="header-section-number">2.3.1.16</span> Heading Renderers</h4> -<p>The <code>\markdownRendererHeadingOne</code> macro represents a first +<p>The <code>markdownRendererHeadingOne</code> macro represents a first level heading. The macro receives a single argument that corresponds to the heading text.</p> -<p>The <code>\markdownRendererHeadingTwo</code> macro represents a -second level heading. The macro receives a single argument that -corresponds to the heading text.</p> -<p>The <code>\markdownRendererHeadingThree</code> macro represents a +<p>The <code>markdownRendererHeadingTwo</code> macro represents a second +level heading. The macro receives a single argument that corresponds to +the heading text.</p> +<p>The <code>markdownRendererHeadingThree</code> macro represents a third level heading. The macro receives a single argument that corresponds to the heading text.</p> -<p>The <code>\markdownRendererHeadingFour</code> macro represents a +<p>The <code>markdownRendererHeadingFour</code> macro represents a fourth level heading. The macro receives a single argument that corresponds to the heading text.</p> -<p>The <code>\markdownRendererHeadingFive</code> macro represents a -fifth level heading. The macro receives a single argument that -corresponds to the heading text.</p> -<p>The <code>\markdownRendererHeadingSix</code> macro represents a sixth +<p>The <code>markdownRendererHeadingFive</code> macro represents a fifth +level heading. The macro receives a single argument that corresponds to +the heading text.</p> +<p>The <code>markdownRendererHeadingSix</code> macro represents a sixth level heading. The macro receives a single argument that corresponds to the heading text.</p> <h5 class="unnumbered" id="plain-tex-example-32">Plain <span @@ -10296,9 +10340,9 @@ contain the following text:</p> <h4 data-number="2.3.1.17" id="inline-html-comment-renderer"><span class="header-section-number">2.3.1.17</span> Inline HTML Comment Renderer</h4> -<p>The <code>\markdownRendererInlineHtmlComment</code> macro represents +<p>The <code>markdownRendererInlineHtmlComment</code> macro represents the contents of an inline <abbr>HTML</abbr> comment. This macro will -only be produced, when the <strong><code>html</code></strong> option is +only be produced, when the <code><strong>html</strong></code> option is enabled. The macro receives a single argument that corresponds to the contents of the <abbr>HTML</abbr> comment.</p> <h5 class="unnumbered" id="latex-example-73"><span @@ -10339,14 +10383,14 @@ find</em> than notes.</p> <h4 data-number="2.3.1.18" id="html-tag-and-element-renderers"><span class="header-section-number">2.3.1.18</span> HTML Tag and Element Renderers</h4> -<p>The <code>\markdownRendererInlineHtmlTag</code> macro represents an +<p>The <code>markdownRendererInlineHtmlTag</code> macro represents an opening, closing, or empty inline <abbr>HTML</abbr> tag. This macro will -only be produced, when the <strong><code>html</code></strong> option is +only be produced, when the <code><strong>html</strong></code> option is enabled. The macro receives a single argument that corresponds to the contents of the <abbr>HTML</abbr> tag.</p> -<p>The <code>\markdownRendererInputBlockHtmlElement</code> macro +<p>The <code>markdownRendererInputBlockHtmlElement</code> macro represents a block <abbr>HTML</abbr> element. This macro will only be -produced, when the <strong><code>html</code></strong> option is enabled. +produced, when the <code><strong>html</strong></code> option is enabled. The macro receives a single argument that filename of a file containing the contents of the <abbr>HTML</abbr> element.</p> <h5 class="unnumbered" id="latex-example-74"><span @@ -10383,7 +10427,7 @@ contain the following body text:</p> </blockquote> <h4 data-number="2.3.1.19" id="image-renderer"><span class="header-section-number">2.3.1.19</span> Image Renderer</h4> -<p>The <code>\markdownRendererImage</code> macro represents an image. It +<p>The <code>markdownRendererImage</code> macro represents an image. It receives four arguments: the label, the fully escaped <abbr>uri</abbr> that can be directly typeset, the raw <abbr>uri</abbr> that can be used outside typesetting, and the title of the link.</p> @@ -10447,9 +10491,9 @@ title="The Communications of the TeX Users Group" alt="TUGboat" /> class="header-section-number">2.3.1.20</span> Image Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>linkAttributes</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererImageAttributeContextBegin</code> and -<code>\markdownRendererImageAttributeContextEnd</code> macros represent +<code><strong>linkAttributes</strong></code> option is enabled.</p> +<p>The <code>markdownRendererImageAttributeContextBegin</code> and +<code>markdownRendererImageAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of an image apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-76"><span @@ -10484,9 +10528,9 @@ contain the following text:</p> <h4 data-number="2.3.1.21" id="interblock-separator-renderers"><span class="header-section-number">2.3.1.21</span> Interblock Separator Renderers</h4> -<p>The <code>\markdownRendererInterblockSeparator</code> macro -represents an interblock separator between two markdown block elements. -The macro receives no arguments.</p> +<p>The <code>markdownRendererInterblockSeparator</code> macro represents +an interblock separator between two markdown block elements. The macro +receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-33">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -10586,7 +10630,7 @@ indicate the end of a series of blocks that make up a logical paragraph. This produces a paragraph separator instead of an interblock separator. Between some blocks, such as markdown paragraphs, a paragraph separator is always produced.</p> -<p>The <code>\markdownRendererParagraphSeparator</code> macro represents +<p>The <code>markdownRendererParagraphSeparator</code> macro represents a paragraph separator. The macro receives no arguments.</p> <h5 class="unnumbered" id="latex-example-78"><span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> @@ -10624,11 +10668,10 @@ contain the following text:</p> <h4 data-number="2.3.1.22" id="line-block-renderers"><span class="header-section-number">2.3.1.22</span> Line Block Renderers</h4> <p>The following macros are only produced, when the -<strong><code>lineBlocks</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererLineBlockBegin</code> and -<code>\markdownRendererLineBlockEnd</code> macros represent the -beginning and the end of a line block. The macros receive no -arguments.</p> +<code><strong>lineBlocks</strong></code> option is enabled.</p> +<p>The <code>markdownRendererLineBlockBegin</code> and +<code>markdownRendererLineBlockEnd</code> macros represent the beginning +and the end of a line block. The macros receive no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-34">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -10708,7 +10751,7 @@ Tread softly because you tread on my dreams.</div> </blockquote> <h4 data-number="2.3.1.23" id="line-break-renderers"><span class="header-section-number">2.3.1.23</span> Line Break Renderers</h4> -<p>The <code>\markdownRendererSoftLineBreak</code> macro represents a +<p>The <code>markdownRendererSoftLineBreak</code> macro represents a soft line break. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-35">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -10772,7 +10815,7 @@ contain the following text:</p> <p><em>(A soft line break)</em></p> <p><em>Foo</em> bar!</p> </blockquote> -<p>The <code>\markdownRendererHardLineBreak</code> macro represents a +<p>The <code>markdownRendererHardLineBreak</code> macro represents a hard line break. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-36">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -10842,7 +10885,7 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.24" id="link-renderer"><span class="header-section-number">2.3.1.24</span> Link Renderer</h4> -<p>The <code>\markdownRendererLink</code> macro represents a hyperlink. +<p>The <code>markdownRendererLink</code> macro represents a hyperlink. It receives four arguments: the label, the fully escaped <abbr>uri</abbr> that can be directly typeset, the raw <abbr>uri</abbr> that can be used outside typesetting, and the title of the link.</p> @@ -10935,9 +10978,9 @@ Archive Network</em>.</p> class="header-section-number">2.3.1.25</span> Link Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>linkAttributes</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererLinkAttributeContextBegin</code> and -<code>\markdownRendererLinkAttributeContextEnd</code> macros represent +<code><strong>linkAttributes</strong></code> option is enabled.</p> +<p>The <code>markdownRendererLinkAttributeContextBegin</code> and +<code>markdownRendererLinkAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of a hyperlink apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-83"><span @@ -10972,8 +11015,8 @@ contain the following text:</p> <h4 data-number="2.3.1.26" id="marked-text-renderer"><span class="header-section-number">2.3.1.26</span> Marked Text Renderer</h4> <p>The following macro is only produced, when the -<strong><code>mark</code></strong> option is enabled.</p> -<p>The <code>\markdownRendererMark</code> macro represents a span of +<code><strong>mark</strong></code> option is enabled.</p> +<p>The <code>markdownRendererMark</code> macro represents a span of marked or highlighted text. The macro receives a single argument that corresponds to the marked text.</p> <h5 class="unnumbered" id="latex-example-84"><span @@ -11007,8 +11050,8 @@ contain the following text:</p> <h4 data-number="2.3.1.27" id="markdown-document-renderers"><span class="header-section-number">2.3.1.27</span> Markdown Document Renderers</h4> -<p>The <code>\markdownRendererDocumentBegin</code> and -<code>\markdownRendererDocumentEnd</code> macros represent the beginning +<p>The <code>markdownRendererDocumentBegin</code> and +<code>markdownRendererDocumentEnd</code> macros represent the beginning and the end of a <em>markdown</em> document. The macros receive no arguments.</p> <p>A <span class="tex">T<sub>e</sub>X</span> document may contain any @@ -11108,8 +11151,8 @@ contain the following text:</p> <h4 data-number="2.3.1.28" id="non-breaking-space-renderer"><span class="header-section-number">2.3.1.28</span> Non-Breaking Space Renderer</h4> -<p>The <code>\markdownRendererNbsp</code> macro represents a -non-breaking space.</p> +<p>The <code>markdownRendererNbsp</code> macro represents a non-breaking +space.</p> <h5 class="unnumbered" id="latex-example-86"><span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -11160,9 +11203,9 @@ typesetting.</em> Addison-Wesley, 1984.</p> </blockquote> <h4 data-number="2.3.1.29" id="note-renderer"><span class="header-section-number">2.3.1.29</span> Note Renderer</h4> -<p>The <code>\markdownRendererNote</code> macro represents a note. This +<p>The <code>markdownRendererNote</code> macro represents a note. This macro will only be produced, when the -<strong><code>notes</code></strong> option is enabled. The macro +<code><strong>notes</strong></code> option is enabled. The macro receives a single argument that corresponds to the note text.</p> <h5 class="unnumbered" id="plain-tex-example-38">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -11248,87 +11291,87 @@ contain the following text:</p> <h4 data-number="2.3.1.30" id="ordered-list-renderers"><span class="header-section-number">2.3.1.30</span> Ordered List Renderers</h4> -<p>The <code>\markdownRendererOlBegin</code> macro represents the +<p>The <code>markdownRendererOlBegin</code> macro represents the beginning of an ordered list that contains an item with several paragraphs of text (the list is not tight). This macro will only be -produced, when the <strong><code>fancyLists</code></strong> option is +produced, when the <code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererOlBeginTight</code> macro represents the +<p>The <code>markdownRendererOlBeginTight</code> macro represents the beginning of an ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be -produced, when the <strong><code>tightLists</code></strong> option is -enabled and the <strong><code>fancyLists</code></strong> option is +produced, when the <code><strong>tightLists</strong></code> option is +enabled and the <code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererFancyOlBegin</code> macro represents the +<p>The <code>markdownRendererFancyOlBegin</code> macro represents the beginning of a fancy ordered list that contains an item with several paragraphs of text (the list is not tight). This macro will only be -produced, when the <strong><code>fancyLists</code></strong> option is +produced, when the <code><strong>fancyLists</strong></code> option is enabled. The macro receives two arguments: the style of the list item labels (<code>Decimal</code>, <code>LowerRoman</code>, <code>UpperRoman</code>, <code>LowerAlpha</code>, and <code>UpperAlpha</code>), and the style of delimiters between list item labels and texts (<code>Default</code>, <code>OneParen</code>, and <code>Period</code>).</p> -<p>The <code>\markdownRendererFancyOlBeginTight</code> macro represents +<p>The <code>markdownRendererFancyOlBeginTight</code> macro represents the beginning of a fancy ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be -produced, when the <strong><code>fancyLists</code></strong> and -<strong><code>tightLists</code></strong> options are enabled. The macro +produced, when the <code><strong>fancyLists</strong></code> and +<code><strong>tightLists</strong></code> options are enabled. The macro receives two arguments: the style of the list item labels, and the style of delimiters between list item labels and texts. See the -<code>\markdownRendererFancyOlBegin</code> macro for the valid style +<code>markdownRendererFancyOlBegin</code> macro for the valid style values.</p> -<p>The <code>\markdownRendererOlItem</code> macro represents an item in +<p>The <code>markdownRendererOlItem</code> macro represents an item in an ordered list. This macro will only be produced, when the -<strong><code>startNumber</code></strong> option is disabled and the -<strong><code>fancyLists</code></strong> option is disabled. The macro +<code><strong>startNumber</strong></code> option is disabled and the +<code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererOlItemEnd</code> macro represents the end +<p>The <code>markdownRendererOlItemEnd</code> macro represents the end of an item in an ordered list. This macro will only be produced, when -the <strong><code>fancyLists</code></strong> option is disabled. The +the <code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererOlItemWithNumber</code> macro represents -an item in an ordered list. This macro will only be produced, when the -<strong><code>startNumber</code></strong> option is enabled and the -<strong><code>fancyLists</code></strong> option is disabled. The macro +<p>The <code>markdownRendererOlItemWithNumber</code> macro represents an +item in an ordered list. This macro will only be produced, when the +<code><strong>startNumber</strong></code> option is enabled and the +<code><strong>fancyLists</strong></code> option is disabled. The macro receives a single numeric argument that corresponds to the item number.</p> -<p>The <code>\markdownRendererFancyOlItem</code> macro represents an -item in a fancy ordered list. This macro will only be produced, when the -<strong><code>startNumber</code></strong> option is disabled and the -<strong><code>fancyLists</code></strong> option is enabled. The macro +<p>The <code>markdownRendererFancyOlItem</code> macro represents an item +in a fancy ordered list. This macro will only be produced, when the +<code><strong>startNumber</strong></code> option is disabled and the +<code><strong>fancyLists</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererFancyOlItemEnd</code> macro represents the +<p>The <code>markdownRendererFancyOlItemEnd</code> macro represents the end of an item in a fancy ordered list. This macro will only be -produced, when the <strong><code>fancyLists</code></strong> option is +produced, when the <code><strong>fancyLists</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererFancyOlItemWithNumber</code> macro +<p>The <code>markdownRendererFancyOlItemWithNumber</code> macro represents an item in a fancy ordered list. This macro will only be -produced, when the <strong><code>startNumber</code></strong> and -<strong><code>fancyLists</code></strong> options are enabled. The macro +produced, when the <code><strong>startNumber</strong></code> and +<code><strong>fancyLists</strong></code> options are enabled. The macro receives a single numeric argument that corresponds to the item number.</p> -<p>The <code>\markdownRendererOlEnd</code> macro represents the end of -an ordered list that contains an item with several paragraphs of text -(the list is not tight). This macro will only be produced, when the -<strong><code>fancyLists</code></strong> option is disabled. The macro +<p>The <code>markdownRendererOlEnd</code> macro represents the end of an +ordered list that contains an item with several paragraphs of text (the +list is not tight). This macro will only be produced, when the +<code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererOlEndTight</code> macro represents the end +<p>The <code>markdownRendererOlEndTight</code> macro represents the end of an ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be produced, when the -<strong><code>tightLists</code></strong> option is enabled and the -<strong><code>fancyLists</code></strong> option is disabled. The macro +<code><strong>tightLists</strong></code> option is enabled and the +<code><strong>fancyLists</strong></code> option is disabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererFancyOlEnd</code> macro represents the end +<p>The <code>markdownRendererFancyOlEnd</code> macro represents the end of a fancy ordered list that contains an item with several paragraphs of text (the list is not tight). This macro will only be produced, when the -<strong><code>fancyLists</code></strong> option is enabled. The macro +<code><strong>fancyLists</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererFancyOlEndTight</code> macro represents -the end of a fancy ordered list that contains no item with several +<p>The <code>markdownRendererFancyOlEndTight</code> macro represents the +end of a fancy ordered list that contains no item with several paragraphs of text (the list is tight). This macro will only be -produced, when the <strong><code>fancyLists</code></strong> and -<strong><code>tightLists</code></strong> options are enabled. The macro +produced, when the <code><strong>fancyLists</strong></code> and +<code><strong>tightLists</strong></code> options are enabled. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-39">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -11579,18 +11622,18 @@ item).</p> </blockquote> <h4 data-number="2.3.1.31" id="raw-content-renderers"><span class="header-section-number">2.3.1.31</span> Raw Content Renderers</h4> -<p>The <code>\markdownRendererInputRawInline</code> macro represents an +<p>The <code>markdownRendererInputRawInline</code> macro represents an inline raw span. The macro receives two arguments: the filename of a file containing the inline raw span contents and the raw attribute that designates the format of the inline raw span. This macro will only be -produced, when the <strong><code>rawAttribute</code></strong> option is +produced, when the <code><strong>rawAttribute</strong></code> option is enabled.</p> -<p>The <code>\markdownRendererInputRawBlock</code> macro represents a -raw block. The macro receives two arguments: the filename of a file +<p>The <code>markdownRendererInputRawBlock</code> macro represents a raw +block. The macro receives two arguments: the filename of a file containing the raw block and the raw attribute that designates the format of the raw block. This macro will only be produced, when the -<strong><code>rawAttribute</code></strong> and -<strong><code>fencedCode</code></strong> options are enabled.</p> +<code><strong>rawAttribute</strong></code> and +<code><strong>fencedCode</strong></code> options are enabled.</p> <h5 class="unnumbered" id="latex-example-89"><span class="latex">L<sup>a</sup>T<sub>e</sub>X</span> Example</h5> <p>Using a text editor, create a text document named @@ -11637,13 +11680,13 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.32" id="section-renderers"><span class="header-section-number">2.3.1.32</span> Section Renderers</h4> -<p>The <code>\markdownRendererSectionBegin</code> and -<code>\markdownRendererSectionEnd</code> macros represent the beginning +<p>The <code>markdownRendererSectionBegin</code> and +<code>markdownRendererSectionEnd</code> macros represent the beginning and the end of a section based on headings.</p> <h4 data-number="2.3.1.33" id="replacement-character-renderers"><span class="header-section-number">2.3.1.33</span> Replacement Character Renderers</h4> -<p>The <code>\markdownRendererReplacementCharacter</code> macro +<p>The <code>markdownRendererReplacementCharacter</code> macro represents the U+0000 and U+FFFD Unicode characters. The macro receives no arguments.</p> <h4 data-number="2.3.1.34" id="special-character-renderers"><span @@ -11654,27 +11697,27 @@ class="tex">T<sub>e</sub>X</span> characters, including the active pipe character (<code>|</code>) of Con<span class="tex">T<sub>e</sub>X</span>t, in the input text:</p> <ul> -<li><code>\markdownRendererAmpersand</code> replaces the ampersand +<li><code>markdownRendererAmpersand</code> replaces the ampersand (<code>&</code>).</li> -<li><code>\markdownRendererBackslash</code> replaces the backslash +<li><code>markdownRendererBackslash</code> replaces the backslash (<code>\</code>).</li> -<li><code>\markdownRendererCircumflex</code> replaces the circumflex +<li><code>markdownRendererCircumflex</code> replaces the circumflex (<code>^</code>).</li> -<li><code>\markdownRendererDollarSign</code> replaces the dollar sign +<li><code>markdownRendererDollarSign</code> replaces the dollar sign (<code>$</code>).</li> -<li><code>\markdownRendererHash</code> replaces the hash sign +<li><code>markdownRendererHash</code> replaces the hash sign (<code>#</code>).</li> -<li><code>\markdownRendererLeftBrace</code> replaces the left brace +<li><code>markdownRendererLeftBrace</code> replaces the left brace (<code>{</code>).</li> -<li><code>\markdownRendererPercentSign</code> replaces the percent sign +<li><code>markdownRendererPercentSign</code> replaces the percent sign (<code>%</code>).</li> -<li><code>\markdownRendererPipe</code> replaces the pipe character +<li><code>markdownRendererPipe</code> replaces the pipe character (<code>|</code>).</li> -<li><code>\markdownRendererRightBrace</code> replaces the right brace +<li><code>markdownRendererRightBrace</code> replaces the right brace (<code>}</code>).</li> -<li><code>\markdownRendererTilde</code> replaces the tilde +<li><code>markdownRendererTilde</code> replaces the tilde (<code>~</code>).</li> -<li><code>\markdownRendererUnderscore</code> replaces the underscore +<li><code>markdownRendererUnderscore</code> replaces the underscore (<code>_</code>).</li> </ul> <h5 class="unnumbered" id="plain-tex-example-40">Plain <span @@ -11756,10 +11799,10 @@ non-breaking space:</p> <h4 data-number="2.3.1.35" id="strike-through-renderer"><span class="header-section-number">2.3.1.35</span> Strike-Through Renderer</h4> -<p>The <code>\markdownRendererStrikeThrough</code> macro represents a +<p>The <code>markdownRendererStrikeThrough</code> macro represents a strike-through span of text. The macro receives a single argument that corresponds to the striked-out span of text. This macro will only be -produced, when the <strong><code>strikeThrough</code></strong> option is +produced, when the <code><strong>strikeThrough</strong></code> option is enabled.</p> <h5 class="unnumbered" id="plain-tex-example-41">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -11831,10 +11874,10 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.36" id="subscript-renderer"><span class="header-section-number">2.3.1.36</span> Subscript Renderer</h4> -<p>The <code>\markdownRendererSubscript</code> macro represents a +<p>The <code>markdownRendererSubscript</code> macro represents a subscript span of text. The macro receives a single argument that corresponds to the subscript span of text. This macro will only be -produced, when the <strong><code>subscripts</code></strong> option is +produced, when the <code><strong>subscripts</strong></code> option is enabled.</p> <h5 class="unnumbered" id="plain-tex-example-42">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -11904,10 +11947,10 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.37" id="superscript-renderer"><span class="header-section-number">2.3.1.37</span> Superscript Renderer</h4> -<p>The <code>\markdownRendererSuperscript</code> macro represents a +<p>The <code>markdownRendererSuperscript</code> macro represents a superscript span of text. The macro receives a single argument that corresponds to the superscript span of text. This macro will only be -produced, when the <strong><code>superscripts</code></strong> option is +produced, when the <code><strong>superscripts</strong></code> option is enabled.</p> <h5 class="unnumbered" id="plain-tex-example-43">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -11979,10 +12022,10 @@ contain the following text:</p> class="header-section-number">2.3.1.38</span> Table Attribute Context Renderers</h4> <p>The following macros are only produced, when the -<strong><code>tableCaptions</code></strong> and -<strong><code>tableAttributes</code></strong> options are enabled.</p> -<p>The <code>\markdownRendererTableAttributeContextBegin</code> and -<code>\markdownRendererTableAttributeContextEnd</code> macros represent +<code><strong>tableCaptions</strong></code> and +<code><strong>tableAttributes</strong></code> options are enabled.</p> +<p>The <code>markdownRendererTableAttributeContextBegin</code> and +<code>markdownRendererTableAttributeContextEnd</code> macros represent the beginning and the end of a context in which the attributes of a table apply. The macros receive no arguments.</p> <h5 class="unnumbered" id="latex-example-94"><span @@ -12078,9 +12121,9 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.39" id="table-renderer"><span class="header-section-number">2.3.1.39</span> Table Renderer</h4> -<p>The <code>\markdownRendererTable</code> macro represents a table. -This macro will only be produced, when the -<strong><code>pipeTables</code></strong> option is enabled. The macro +<p>The <code>markdownRendererTable</code> macro represents a table. This +macro will only be produced, when the +<code><strong>pipeTables</strong></code> option is enabled. The macro receives the parameters <code>{</code>⟨<em>caption</em>⟩<code>}{</code>⟨<em>number of rows</em>⟩<code>}{</code>⟨<em>number of columns</em>⟩<code>}</code> @@ -12184,14 +12227,14 @@ column number 3 says <em>1</em>, and column number 4 says <h4 data-number="2.3.1.40" id="tex-math-renderers"><span class="header-section-number">2.3.1.40</span> <span class="tex">T<sub>e</sub>X</span> Math Renderers</h4> -<p>The <code>\markdownRendererInlineMath</code> and -<code>\markdownRendererDisplayMath</code> macros represent inline and +<p>The <code>markdownRendererInlineMath</code> and +<code>markdownRendererDisplayMath</code> macros represent inline and display <span class="tex">T<sub>e</sub>X</span> math. Both macros receive a single argument that corresponds to the <span class="tex">T<sub>e</sub>X</span> math content. These macros will only -be produced, when the <strong><code>texMathDollars</code></strong>, -<strong><code>texMathSingleBackslash</code></strong>, or -<strong><code>texMathDoubleBackslash</code></strong> option are +be produced, when the <code><strong>texMathDollars</strong></code>, +<code><strong>texMathSingleBackslash</strong></code>, or +<code><strong>texMathDoubleBackslash</strong></code> option are enabled.</p> <h5 class="unnumbered" id="plain-tex-example-44">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -12277,7 +12320,7 @@ class="math display"><em>f̂</em>(<em>ξ</em>) = ∫<sub>−∞</sub><sup> <h4 data-number="2.3.1.41" id="thematic-break-renderer"><span class="header-section-number">2.3.1.41</span> Thematic Break Renderer</h4> -<p>The <code>\markdownRendererThematicBreak</code> macro represents a +<p>The <code>markdownRendererThematicBreak</code> macro represents a thematic break. The macro receives no arguments.</p> <h5 class="unnumbered" id="plain-tex-example-45">Plain <span class="tex">T<sub>e</sub>X</span> Example</h5> @@ -12363,11 +12406,11 @@ contain the following text:</p> </blockquote> <h4 data-number="2.3.1.42" id="tickbox-renderers"><span class="header-section-number">2.3.1.42</span> Tickbox Renderers</h4> -<p>The macros named <code>\markdownRendererTickedBox</code>, -<code>\markdownRendererHalfTickedBox</code>, and -<code>\markdownRendererUntickedBox</code> represent ticked and unticked +<p>The macros named <code>markdownRendererTickedBox</code>, +<code>markdownRendererHalfTickedBox</code>, and +<code>markdownRendererUntickedBox</code> represent ticked and unticked boxes, respectively. These macros will either be produced, when the -<strong><code>taskLists</code></strong> option is enabled, or when the +<code><strong>taskLists</strong></code> option is enabled, or when the Ballot Box with X (☒, U+2612), Hourglass (⌛, U+231B) or Ballot Box (☐, U+2610) Unicode characters are encountered in the markdown input, respectively.</p> @@ -12427,62 +12470,91 @@ contain the following text:</p> <li>Yes I can!</li> </ul> </blockquote> -<h4 data-number="2.3.1.43" id="yamlmetadatarenderers"><span -class="header-section-number">2.3.1.43</span> YAML Metadata +<h4 data-number="2.3.1.43" id="warning-and-error-renderers"><span +class="header-section-number">2.3.1.43</span> Warning and Error +Renderers</h4> +<p>The <code>markdownRendererWarning</code> and +<code>markdownRendererError</code> macros represent warnings and errors +produced by the markdown parser. Both macros receive a single parameter +with the text of the warning or error.</p> +<h4 data-number="2.3.1.44" id="yamlmetadatarenderers"><span +class="header-section-number">2.3.1.44</span> YAML Metadata Renderers</h4> -<p>The <code>\markdownRendererJekyllDataBegin</code> macro represents -the beginning of a <abbr>yaml</abbr> document. This macro will only be -produced when the <strong><code>jekyllData</code></strong> option is +<p>The <code>markdownRendererJekyllDataBegin</code> macro represents the +beginning of a <abbr>yaml</abbr> document. This macro will only be +produced when the <code><strong>jekyllData</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererJekyllDataEnd</code> macro represents the +<p>The <code>markdownRendererJekyllDataEnd</code> macro represents the end of a <abbr>yaml</abbr> document. This macro will only be produced -when the <strong><code>jekyllData</code></strong> option is enabled. The +when the <code><strong>jekyllData</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererJekyllDataMappingBegin</code> macro +<p>The <code>markdownRendererJekyllDataMappingBegin</code> macro represents the beginning of a mapping in a <abbr>yaml</abbr> document. This macro will only be produced when the -<strong><code>jekyllData</code></strong> option is enabled. The macro +<code><strong>jekyllData</strong></code> option is enabled. The macro receives two arguments: the scalar key in the parent structure, cast to a string following <abbr>yaml</abbr> serialization rules, and the number of items in the mapping.</p> -<p>The <code>\markdownRendererJekyllDataMappingEnd</code> macro +<p>The <code>markdownRendererJekyllDataMappingEnd</code> macro represents the end of a mapping in a <abbr>yaml</abbr> document. This macro will only be produced when the -<strong><code>jekyllData</code></strong> option is enabled. The macro +<code><strong>jekyllData</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererJekyllDataSequenceBegin</code> macro +<p>The <code>markdownRendererJekyllDataSequenceBegin</code> macro represents the beginning of a sequence in a <abbr>yaml</abbr> document. This macro will only be produced when the -<strong><code>jekyllData</code></strong> option is enabled. The macro +<code><strong>jekyllData</strong></code> option is enabled. The macro receives two arguments: the scalar key in the parent structure, cast to a string following <abbr>yaml</abbr> serialization rules, and the number of items in the sequence.</p> -<p>The <code>\markdownRendererJekyllDataSequenceEnd</code> macro +<p>The <code>markdownRendererJekyllDataSequenceEnd</code> macro represents the end of a sequence in a <abbr>yaml</abbr> document. This macro will only be produced when the -<strong><code>jekyllData</code></strong> option is enabled. The macro +<code><strong>jekyllData</strong></code> option is enabled. The macro receives no arguments.</p> -<p>The <code>\markdownRendererJekyllDataBoolean</code> macro represents -a boolean scalar value in a <abbr>yaml</abbr> document. This macro will -only be produced when the <strong><code>jekyllData</code></strong> +<p>The <code>markdownRendererJekyllDataBoolean</code> macro represents a +boolean scalar value in a <abbr>yaml</abbr> document. This macro will +only be produced when the <code><strong>jekyllData</strong></code> option is enabled. The macro receives two arguments: the scalar key in the parent structure, and the scalar value, both cast to a string following <abbr>yaml</abbr> serialization rules.</p> -<p>The <code>\markdownRendererJekyllDataNumber</code> macro represents a +<p>The <code>markdownRendererJekyllDataNumber</code> macro represents a numeric scalar value in a <abbr>yaml</abbr> document. This macro will -only be produced when the <strong><code>jekyllData</code></strong> +only be produced when the <code><strong>jekyllData</strong></code> option is enabled. The macro receives two arguments: the scalar key in the parent structure, and the scalar value, both cast to a string following <abbr>yaml</abbr> serialization rules.</p> -<p>The <code>\markdownRendererJekyllDataString</code> macro represents a -string scalar value in a <abbr>yaml</abbr> document. This macro will -only be produced when the <strong><code>jekyllData</code></strong> -option is enabled. The macro receives two arguments: the scalar key in -the parent structure, cast to a string following <abbr>yaml</abbr> -serialization rules, and the scalar value.</p> -<p>The <code>\markdownRendererJekyllDataEmpty</code> macro represents an +<p>The <code>markdownRendererJekyllDataTypographicString</code> and +<code>markdownRendererJekyllDataProgrammaticString</code> macros +represent string scalar values in a <abbr>yaml</abbr> document. This +macro will only be produced when the +<code><strong>jekyllData</strong></code> option is enabled. The macro +receives two arguments: the scalar key in the parent structure, cast to +a string following <abbr>yaml</abbr> serialization rules, and the scalar +value.</p> +<p>For each string scalar value, both macros are produced. Whereas +<code>markdownRendererJekyllDataTypographicString</code> receives the +scalar value after all markdown markup and special <span +class="tex">T<sub>e</sub>X</span> characters in the string have been +replaced by <span class="tex">T<sub>e</sub>X</span> macros, +<code>markdownRendererJekyllDataProgrammaticString</code> receives the +raw scalar value. Therefore, whereas the +<code>markdownRendererJekyllDataTypographicString</code> macro is more +appropriate for texts that are supposed to be typeset with <span +class="tex">T<sub>e</sub>X</span>, such as document titles, author +names, or exam questions, the +<code>markdownRendererJekyllDataProgrammaticString</code> macro is more +appropriate for identifiers and other programmatic text that won’t be +typeset by <span class="tex">T<sub>e</sub>X</span>.</p> +<p>Before Markdown 3.7.0, the +<code>markdownRendererJekyllDataTypographicString</code> macro was named +<code>markdownRendererJekyllDataString</code> and the +<code>markdownRendererJekyllDataProgrammaticString</code> macro was not +produced. The <code>markdownRendererJekyllDataString</code> has been +deprecated and will be removed in Markdown 4.0.0.</p> +<p>The <code>markdownRendererJekyllDataEmpty</code> macro represents an empty scalar value in a <abbr>yaml</abbr> document. This macro will only -be produced when the <strong><code>jekyllData</code></strong> option is +be produced when the <code><strong>jekyllData</strong></code> option is enabled. The macro receives one argument: the scalar key in the parent structure, cast to a string following <abbr>yaml</abbr> serialization rules.</p> @@ -12493,7 +12565,7 @@ class="tex">T<sub>e</sub>X</span> Example</h5> <div class="sourceCode" id="cb664"><pre class="sourceCode tex"><code class="sourceCode latex"><span id="cb664-1"><a href="#cb664-1" aria-hidden="true" tabindex="-1"></a><span class="fu">\input</span> markdown</span> <span id="cb664-2"><a href="#cb664-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownOptionJekyllData</span>{true}</span> -<span id="cb664-3"><a href="#cb664-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span> +<span id="cb664-3"><a href="#cb664-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataTypographicString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span> <span id="cb664-4"><a href="#cb664-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataNumber</span>#1#2{<span class="fu">\gdef\age</span>{#2}}</span> <span id="cb664-5"><a href="#cb664-5" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataEnd</span>{<span class="co">%</span></span> <span id="cb664-6"><a href="#cb664-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.}</span> @@ -12521,7 +12593,7 @@ class="sourceCode tex"><code class="sourceCode latex"><span id="cb666-1"><a href <span id="cb666-2"><a href="#cb666-2" aria-hidden="true" tabindex="-1"></a><span class="bu">\usepackage</span>[jekyllData]{<span class="ex">markdown</span>}</span> <span id="cb666-3"><a href="#cb666-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\markdownSetup</span>{</span> <span id="cb666-4"><a href="#cb666-4" aria-hidden="true" tabindex="-1"></a> renderers = {</span> -<span id="cb666-5"><a href="#cb666-5" aria-hidden="true" tabindex="-1"></a> jekyllDataString = {<span class="fu">\gdef\name</span>{#2}},</span> +<span id="cb666-5"><a href="#cb666-5" aria-hidden="true" tabindex="-1"></a> jekyllDataTypographicString = {<span class="fu">\gdef\name</span>{#2}},</span> <span id="cb666-6"><a href="#cb666-6" aria-hidden="true" tabindex="-1"></a> jekyllDataNumber = {<span class="fu">\gdef\age</span>{#2}},</span> <span id="cb666-7"><a href="#cb666-7" aria-hidden="true" tabindex="-1"></a> jekyllDataEnd = {<span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.},</span> <span id="cb666-8"><a href="#cb666-8" aria-hidden="true" tabindex="-1"></a> }</span> @@ -12551,7 +12623,7 @@ class="tex">T<sub>e</sub>X</span>t Example</h5> <div class="sourceCode" id="cb668"><pre class="sourceCode tex"><code class="sourceCode latex"><span id="cb668-1"><a href="#cb668-1" aria-hidden="true" tabindex="-1"></a><span class="fu">\usemodule</span>[t][markdown]</span> <span id="cb668-2"><a href="#cb668-2" aria-hidden="true" tabindex="-1"></a><span class="fu">\setupmarkdown</span>[jekyllData = yes]</span> -<span id="cb668-3"><a href="#cb668-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span> +<span id="cb668-3"><a href="#cb668-3" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataTypographicString</span>#1#2{<span class="fu">\gdef\name</span>{#2}}</span> <span id="cb668-4"><a href="#cb668-4" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataNumber</span>#1#2{<span class="fu">\gdef\age</span>{#2}}</span> <span id="cb668-5"><a href="#cb668-5" aria-hidden="true" tabindex="-1"></a><span class="fu">\def\markdownRendererJekyllDataEnd</span>{<span class="co">%</span></span> <span id="cb668-6"><a href="#cb668-6" aria-hidden="true" tabindex="-1"></a> <span class="fu">\name</span>{} is <span class="fu">\age</span>{} years old.}</span> diff --git a/macros/generic/markdown/markdown.ins b/macros/generic/markdown/markdown.ins index 4261ddfdd4..152fe4832b 100644 --- a/macros/generic/markdown/markdown.ins +++ b/macros/generic/markdown/markdown.ins @@ -2,7 +2,8 @@ \generate{ \usepreamble\luapreamble \usepostamble\luapostamble - \file{markdown.lua}{\from{markdown.dtx}{lua}} + \file{markdown.lua}{\from{markdown.dtx}{lua-loader}} + \file{markdown-parser.lua}{\from{markdown.dtx}{lua}} \file{markdown-cli.lua}{\from{markdown.dtx}{lua-cli}} \usepreamble\texpreamble \usepostamble\texpostamble @@ -14,7 +15,7 @@ \file{markdownthemewitiko_tilde.tex}{\from{markdown.dtx}{themes-witiko-tilde}} \file{markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-tex}} \file{markdownthemewitiko_markdown_defaults.sty}{\from{markdown.dtx}{themes-witiko-markdown-defaults-latex}} - \file{t-markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-context}} + \file{t-markdownthemewitiko_markdown_defaults.tex}{\from{markdown.dtx}{themes-witiko-markdown-defaults-ctx}} \file{markdownthemewitiko_markdown_techdoc.sty}{\from{markdown.dtx}{themes-witiko-markdown-techdoc}} \usepreamble\empty \usepostamble\empty @@ -25,6 +26,6 @@ \file{markdown.css}{\from{markdown.dtx}{manual-css}} \file{markdown-figure-block-diagram.tex}{\from{markdown.dtx}{techdoc-block-diagram}} \file{markdown.bib}{\from{markdown.dtx}{techdoc-bibliography}} - \file{DEPENDS.txt}{\from{markdown.dtx}{depends}} + \file{DEPENDS-raw.txt}{\from{markdown.dtx}{depends}} } \endbatchfile diff --git a/macros/generic/markdown/markdown.pdf b/macros/generic/markdown/markdown.pdf Binary files differindex 3787cdbe80..f8522dab51 100644 --- a/macros/generic/markdown/markdown.pdf +++ b/macros/generic/markdown/markdown.pdf diff --git a/macros/latex-dev/required/l3kernel/CHANGELOG.md b/macros/latex-dev/required/l3kernel/CHANGELOG.md index fff85488a7..73e2659fa0 100644 --- a/macros/latex-dev/required/l3kernel/CHANGELOG.md +++ b/macros/latex-dev/required/l3kernel/CHANGELOG.md @@ -7,6 +7,15 @@ this project uses date-based 'snapshot' version identifiers. ## [Unreleased] +## [2024-08-30] + +### Changed +- Reduce memory usage when building Unicode data storage +- Avoid recursive doc for `\file_if_exist:n(TF)` (issue \#1573) + +### Fixed +- Handling of `ltcmd` newlines (`\obeyedline`) in `l3doc` (issue \#1577) + ## [2024-08-16] ### Added @@ -1759,7 +1768,8 @@ this project uses date-based 'snapshot' version identifiers. - Step functions have been added for dim variables, e.g. `\dim_step_inline:nnnn` -[Unreleased]: https://github.com/latex3/latex3/compare/2024-08-16...HEAD +[Unreleased]: https://github.com/latex3/latex3/compare/2024-08-30...HEAD +[2024-08-30]: https://github.com/latex3/latex3/compare/2024-08-16...2024-08-30 [2024-08-16]: https://github.com/latex3/latex3/compare/2024-07-20...2024-08-16 [2024-07-20]: https://github.com/latex3/latex3/compare/2024-06-19...2024-07-20 [2024-06-19]: https://github.com/latex3/latex3/compare/2024-05-27...2024-06-19 diff --git a/macros/latex-dev/required/l3kernel/README.md b/macros/latex-dev/required/l3kernel/README.md index 5807a75274..50f09278ae 100644 --- a/macros/latex-dev/required/l3kernel/README.md +++ b/macros/latex-dev/required/l3kernel/README.md @@ -1,7 +1,7 @@ LaTeX3 Programming Conventions ============================== -Release 2024-08-16 +Release 2024-08-30 Overview -------- diff --git a/macros/latex-dev/required/l3kernel/expl3.dtx b/macros/latex-dev/required/l3kernel/expl3.dtx index ad5cb365dd..6e4e16de96 100644 --- a/macros/latex-dev/required/l3kernel/expl3.dtx +++ b/macros/latex-dev/required/l3kernel/expl3.dtx @@ -24,7 +24,7 @@ % %<*driver|generic|package|2ekernel> %</driver|generic|package|2ekernel> -\def\ExplFileDate{2024-08-16}% +\def\ExplFileDate{2024-08-30}% %<*driver> \documentclass[full]{l3doc} \usepackage{graphicx} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/expl3.pdf b/macros/latex-dev/required/l3kernel/expl3.pdf Binary files differindex 870c791dc3..3840327d4a 100644 --- a/macros/latex-dev/required/l3kernel/expl3.pdf +++ b/macros/latex-dev/required/l3kernel/expl3.pdf diff --git a/macros/latex-dev/required/l3kernel/interface3.pdf b/macros/latex-dev/required/l3kernel/interface3.pdf Binary files differindex 49a901cdb2..52242c3d4a 100644 --- a/macros/latex-dev/required/l3kernel/interface3.pdf +++ b/macros/latex-dev/required/l3kernel/interface3.pdf diff --git a/macros/latex-dev/required/l3kernel/interface3.tex b/macros/latex-dev/required/l3kernel/interface3.tex index 1a5cc9564f..35278bdf1c 100644 --- a/macros/latex-dev/required/l3kernel/interface3.tex +++ b/macros/latex-dev/required/l3kernel/interface3.tex @@ -58,7 +58,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-08-16} +\date{Released 2024-08-30} \pagenumbering{roman} \maketitle diff --git a/macros/latex-dev/required/l3kernel/l3basics.dtx b/macros/latex-dev/required/l3kernel/l3basics.dtx index 8ef1f6a5be..fed54fa0b4 100644 --- a/macros/latex-dev/required/l3kernel/l3basics.dtx +++ b/macros/latex-dev/required/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -1151,10 +1151,9 @@ % argument (a single token denoted by |N|) is still free for definition. % It would be used in constructions like % \begin{quote} -% |\bool_if:nTF {| \\ -% \verb" \cs_if_free_p:N \l_tmpz_tl || \cs_if_free_p:N \g_tmpz_tl " \\ -% |}| -% \Arg{true code} \Arg{false code} +% "\bool_if:nTF" \\ +% " { \cs_if_free_p:N \l_tmpz_tl || \cs_if_free_p:N \g_tmpz_tl }" \\ +% " "\Arg{true code} \Arg{false code} % \end{quote} % % For each predicate defined, a \enquote{branching conditional} diff --git a/macros/latex-dev/required/l3kernel/l3bitset.dtx b/macros/latex-dev/required/l3kernel/l3bitset.dtx index 5fc681a677..db42b85824 100644 --- a/macros/latex-dev/required/l3kernel/l3bitset.dtx +++ b/macros/latex-dev/required/l3kernel/l3bitset.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3bootstrap.dtx b/macros/latex-dev/required/l3kernel/l3bootstrap.dtx index b3c8536420..79feb5c4c7 100644 --- a/macros/latex-dev/required/l3kernel/l3bootstrap.dtx +++ b/macros/latex-dev/required/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3box.dtx b/macros/latex-dev/required/l3kernel/l3box.dtx index abe1ce302a..2cd93c67f7 100644 --- a/macros/latex-dev/required/l3kernel/l3box.dtx +++ b/macros/latex-dev/required/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3cctab.dtx b/macros/latex-dev/required/l3kernel/l3cctab.dtx index 56f831becf..ec8433c99e 100644 --- a/macros/latex-dev/required/l3kernel/l3cctab.dtx +++ b/macros/latex-dev/required/l3kernel/l3cctab.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3clist.dtx b/macros/latex-dev/required/l3kernel/l3clist.dtx index cfad9ac5a3..7909f36be0 100644 --- a/macros/latex-dev/required/l3kernel/l3clist.dtx +++ b/macros/latex-dev/required/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -326,7 +326,7 @@ % \clist_remove_all:NV, \clist_remove_all:cV, % \clist_remove_all:Ne, \clist_remove_all:ce, % \clist_gremove_all:Nn, \clist_gremove_all:cn, -% \clist_gremove_all:NV, \clist_gremove_all:cV +% \clist_gremove_all:NV, \clist_gremove_all:cV, % \clist_gremove_all:Ne, \clist_gremove_all:ce % } % \begin{syntax} diff --git a/macros/latex-dev/required/l3kernel/l3coffins.dtx b/macros/latex-dev/required/l3kernel/l3coffins.dtx index 82f234799e..1b431b97eb 100644 --- a/macros/latex-dev/required/l3kernel/l3coffins.dtx +++ b/macros/latex-dev/required/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3color.dtx b/macros/latex-dev/required/l3kernel/l3color.dtx index e973fb5e7c..1238f363fd 100644 --- a/macros/latex-dev/required/l3kernel/l3color.dtx +++ b/macros/latex-dev/required/l3kernel/l3color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -325,7 +325,7 @@ % \end{function} % % \begin{variable}[module = color]{color.sc} -% When using \texttt{dvips}, this PostScript variables hold the stroke color. +% When using \texttt{dvips}, this PostScript variable holds the stroke color. % \end{variable} % % \subsection{Coloring math mode material} diff --git a/macros/latex-dev/required/l3kernel/l3debug.dtx b/macros/latex-dev/required/l3kernel/l3debug.dtx index 41456cf8da..600bdff79e 100644 --- a/macros/latex-dev/required/l3kernel/l3debug.dtx +++ b/macros/latex-dev/required/l3kernel/l3debug.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -69,7 +69,7 @@ % % Standard file identification. % \begin{macrocode} -\ProvidesExplFile{l3debug.def}{2024-08-16}{}{L3 Debugging support} +\ProvidesExplFile{l3debug.def}{2024-08-30}{}{L3 Debugging support} % \end{macrocode} % % \begin{variable}{\s_@@_stop} diff --git a/macros/latex-dev/required/l3kernel/l3deprecation.dtx b/macros/latex-dev/required/l3kernel/l3deprecation.dtx index 21d96b8f9c..a7dcefc362 100644 --- a/macros/latex-dev/required/l3kernel/l3deprecation.dtx +++ b/macros/latex-dev/required/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3doc.dtx b/macros/latex-dev/required/l3kernel/l3doc.dtx index ecd473b837..fb1781e4ba 100644 --- a/macros/latex-dev/required/l3kernel/l3doc.dtx +++ b/macros/latex-dev/required/l3kernel/l3doc.dtx @@ -71,7 +71,7 @@ and all files in that bundle must be distributed together. % This isn't included in the typeset documentation because it's a bit % ugly: %<*class> -\ProvidesExplClass{l3doc}{2024-08-16}{} +\ProvidesExplClass{l3doc}{2024-08-30}{} {L3 Experimental documentation class} %</class> % \fi @@ -84,7 +84,7 @@ and all files in that bundle must be distributed together. % require you to do updates, if the class changes.}} % % \author{\Team} -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % \maketitle % \tableofcontents % @@ -1618,7 +1618,7 @@ and all files in that bundle must be distributed together. % % \subsection{Design} % -% Increase the text width slightly so that width the standard fonts +% Increase the text width slightly so that with the standard fonts % 72~columns of code may appear in a \env{macrocode} environment. % Increase the marginpar width slightly, for long command names. And % increase the left margin by a similar amount. @@ -2160,10 +2160,18 @@ and all files in that bundle must be distributed together. % % \begin{macro}{\@@_names_get_seq:nN} % The argument~|#1| (argument of a |function| or |macro| environment) -% has catcodes $10$ (space), $12$ (other) and $13$ (active). Sanitize -% catcodes. If the |verb| option was used, output a one-item -% sequence. Otherwise, remove any \enquote{\%} character at the -% beginning of a line. Remove tabs and newlines. Finally, convert +% has catcodes $10$ (space), $12$ (other) and $13$ (active), and +% since \LaTeX{} 2024-06-01 also macro \cs{obeyedline} in replacement +% of active |^^M| tokens (due to the revised behavior of |+v| +% argument type in |ltcmd|). +% If the |verb| option was used, sanitize catcodes and output +% a one-item sequence. +% Otherwise, remove any \enquote{\%} character at the beginning of +% a line using new end-of-line marker \cs{obeyedline}. Remove any +% remaining \cs{obeyedline}. Then sanitize catcodes so we keep those +% verbatim \cs{obeyedline} typed in by user. Remove remaining +% \enquote{\%} character at the beginning of a line using traditional +% |^^M| marker. Remove tabs and newlines. Finally, convert % |_@@| and |@@| to |__|\meta{module name} (if it is non-empty). At % this point, \cs{l_@@_tmpa_tl} contains a comma-delimited list of % names, where |@| and~|_| have category code letter. Turn it to a @@ -2172,17 +2180,20 @@ and all files in that bundle must be distributed together. % \begin{macrocode} \cs_new_protected:Npn \@@_names_get_seq:nN #1#2 { - \__kernel_tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} } \bool_if:NTF \l_@@_names_verb_bool { \seq_clear:N #2 - \seq_put_right:NV #2 \l_@@_tmpa_tl + \seq_put_right:No #2 { \tl_to_str:n {#1} } } { + \tl_set:Nn \l_@@_tmpa_tl {#1} \tl_remove_all:Ne \l_@@_tmpa_tl - { \iow_char:N \^^M \c_percent_str } + { \exp_not:N \obeyedline \c_percent_str } + \tl_remove_all:Ne \l_@@_tmpa_tl + { \exp_not:N \obeyedline } + \__kernel_tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:N \l_@@_tmpa_tl } \tl_remove_all:Ne \l_@@_tmpa_tl - { \token_to_str:N \obeyedline \c_space_tl \c_percent_str } + { \iow_char:N \^^M \c_percent_str } \tl_remove_all:Ne \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } } \tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^I } \tl_remove_all:Ne \l_@@_tmpa_tl { \iow_char:N \^^M } @@ -2695,8 +2706,7 @@ and all files in that bundle must be distributed together. % \end{macro} % % ^^A TODO: collect all index targets from a given function environment in a box and stick it at the top. -% \begin{macro} -% {\@@_typeset_function_block:nN, \@@_typeset_function_block:eN} +% \begin{macro}{\@@_typeset_function_block:nN} % \begin{macro}{\@@_function_index:n, \@@_function_index:e} % |#1| is a csname, |#2| a boolean indicating whether to add |TF| or not. % \begin{macrocode} @@ -2712,7 +2722,6 @@ and all files in that bundle must be distributed together. { \@@_typeset_variant_list:nN {#1} #2 } \\ } -\cs_generate_variant:Nn \@@_typeset_function_block:nN { e } \cs_new_protected:Npn \@@_function_index:n #1 { \seq_gput_right:Nn \g_doc_functions_seq {#1} @@ -3213,7 +3222,7 @@ and all files in that bundle must be distributed together. % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_print_macroname_aux:nn} +% \begin{macro}{\@@_print_macroname_aux:nn, \@@_print_macroname_aux:on} % |#1| is prefix, |#2| is optional |TF| suffix. % \begin{macrocode} \cs_new_protected:Npn \@@_print_macroname_aux:nn #1#2 @@ -4254,7 +4263,6 @@ and all files in that bundle must be distributed together. {#2} \l_@@_index_internal_bool } -\cs_generate_variant:Nn \@@_special_index:nn { o } % \end{macrocode} % \end{macro} % diff --git a/macros/latex-dev/required/l3kernel/l3doc.pdf b/macros/latex-dev/required/l3kernel/l3doc.pdf Binary files differindex b21ea4c767..a0cf8dd8e4 100644 --- a/macros/latex-dev/required/l3kernel/l3doc.pdf +++ b/macros/latex-dev/required/l3kernel/l3doc.pdf diff --git a/macros/latex-dev/required/l3kernel/l3docstrip.dtx b/macros/latex-dev/required/l3kernel/l3docstrip.dtx index 29503b2d55..7d62454279 100644 --- a/macros/latex-dev/required/l3kernel/l3docstrip.dtx +++ b/macros/latex-dev/required/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3docstrip.pdf b/macros/latex-dev/required/l3kernel/l3docstrip.pdf Binary files differindex be416819fd..5662fbad2d 100644 --- a/macros/latex-dev/required/l3kernel/l3docstrip.pdf +++ b/macros/latex-dev/required/l3kernel/l3docstrip.pdf diff --git a/macros/latex-dev/required/l3kernel/l3expan.dtx b/macros/latex-dev/required/l3kernel/l3expan.dtx index 714af5dc27..d88267b8c9 100644 --- a/macros/latex-dev/required/l3kernel/l3expan.dtx +++ b/macros/latex-dev/required/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -75,8 +75,8 @@ % If \cs{seq_gpush:No} was not defined it could be coded in the following way: % \begin{verbatim} % \exp_args:NNo \seq_gpush:Nn -% \g_file_name_stack -% { \l_tmpa_tl } +% \g_file_name_stack +% { \l_tmpa_tl } % \end{verbatim} % In other words, the first argument to \cs{exp_args:NNo} is the base % function and the other arguments are preprocessed and then passed to diff --git a/macros/latex-dev/required/l3kernel/l3file.dtx b/macros/latex-dev/required/l3kernel/l3file.dtx index 9074a65921..550556f675 100644 --- a/macros/latex-dev/required/l3kernel/l3file.dtx +++ b/macros/latex-dev/required/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -718,8 +718,10 @@ % \cs{file_if_exist_p:n} \Arg{file name} % \cs{file_if_exist:nTF} \Arg{file name} \Arg{true code} \Arg{false code} % \end{syntax} -% Tests if \meta{file name} is found in the path as detailed for -% \cs{file_if_exist:nTF}. +% Expands the argument of the \meta{file name} to give a string, then +% searches for this string using the current \TeX{} search +% path and the additional paths controlled by +% \cs{l_file_search_path_seq}. % \end{function} % % \subsection{Information about files and file contents} diff --git a/macros/latex-dev/required/l3kernel/l3flag.dtx b/macros/latex-dev/required/l3kernel/l3flag.dtx index a25a02a2ca..7f330a4aa9 100644 --- a/macros/latex-dev/required/l3kernel/l3flag.dtx +++ b/macros/latex-dev/required/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-assign.dtx b/macros/latex-dev/required/l3kernel/l3fp-assign.dtx index 2c988e21b4..3efd203444 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-assign.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-assign.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % \maketitle % % \begin{documentation} diff --git a/macros/latex-dev/required/l3kernel/l3fp-aux.dtx b/macros/latex-dev/required/l3kernel/l3fp-aux.dtx index 06c5304064..f0f9df06cf 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-aux.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-basics.dtx b/macros/latex-dev/required/l3kernel/l3fp-basics.dtx index 5c8ee332b9..faaf52210c 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-basics.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-basics.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-convert.dtx b/macros/latex-dev/required/l3kernel/l3fp-convert.dtx index 49d25cc51b..d2a28eb63e 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-convert.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-expo.dtx b/macros/latex-dev/required/l3kernel/l3fp-expo.dtx index ea6a3015cf..676eff2dbe 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-expo.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-expo.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-extended.dtx b/macros/latex-dev/required/l3kernel/l3fp-extended.dtx index be1137c0d4..dcff79ec44 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-extended.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-extended.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-functions.dtx b/macros/latex-dev/required/l3kernel/l3fp-functions.dtx index 7b28783cfa..0d71275946 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-functions.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-functions.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-logic.dtx b/macros/latex-dev/required/l3kernel/l3fp-logic.dtx index c1b9f68b9d..44b35b40b9 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-logic.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-logic.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-parse.dtx b/macros/latex-dev/required/l3kernel/l3fp-parse.dtx index 8f8cc99ac4..be648dffab 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-parse.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-parse.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-random.dtx b/macros/latex-dev/required/l3kernel/l3fp-random.dtx index 14a780a392..354681c654 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-random.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-random.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-round.dtx b/macros/latex-dev/required/l3kernel/l3fp-round.dtx index d6097c3258..4ed4ae87a7 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-round.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-symbolic.dtx b/macros/latex-dev/required/l3kernel/l3fp-symbolic.dtx index 387d582d99..52943d80e3 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-symbolic.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-symbolic.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-traps.dtx b/macros/latex-dev/required/l3kernel/l3fp-traps.dtx index f2967021e3..5d35f89bea 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-traps.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-traps.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % \maketitle % % \begin{documentation} diff --git a/macros/latex-dev/required/l3kernel/l3fp-trig.dtx b/macros/latex-dev/required/l3kernel/l3fp-trig.dtx index 297deb2449..3826543b53 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-trig.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-trig.dtx @@ -42,7 +42,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp-types.dtx b/macros/latex-dev/required/l3kernel/l3fp-types.dtx index b48c37d453..5067210f35 100644 --- a/macros/latex-dev/required/l3kernel/l3fp-types.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp-types.dtx @@ -42,7 +42,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fp.dtx b/macros/latex-dev/required/l3kernel/l3fp.dtx index d970d631eb..ac8f8323e2 100644 --- a/macros/latex-dev/required/l3kernel/l3fp.dtx +++ b/macros/latex-dev/required/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3fparray.dtx b/macros/latex-dev/required/l3kernel/l3fparray.dtx index b20483a583..edc59b2df5 100644 --- a/macros/latex-dev/required/l3kernel/l3fparray.dtx +++ b/macros/latex-dev/required/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3int.dtx b/macros/latex-dev/required/l3kernel/l3int.dtx index d9698e8516..0d34fc6ef2 100644 --- a/macros/latex-dev/required/l3kernel/l3int.dtx +++ b/macros/latex-dev/required/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3intarray.dtx b/macros/latex-dev/required/l3kernel/l3intarray.dtx index 48b5b83ad1..0fd1290eff 100644 --- a/macros/latex-dev/required/l3kernel/l3intarray.dtx +++ b/macros/latex-dev/required/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3kernel-functions.dtx b/macros/latex-dev/required/l3kernel/l3kernel-functions.dtx index cc6d8f6909..06d18e6a0a 100644 --- a/macros/latex-dev/required/l3kernel/l3kernel-functions.dtx +++ b/macros/latex-dev/required/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3keys.dtx b/macros/latex-dev/required/l3kernel/l3keys.dtx index 9225e1042d..6e653f3044 100644 --- a/macros/latex-dev/required/l3kernel/l3keys.dtx +++ b/macros/latex-dev/required/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3legacy.dtx b/macros/latex-dev/required/l3kernel/l3legacy.dtx index 667b15003a..aaedf2192b 100644 --- a/macros/latex-dev/required/l3kernel/l3legacy.dtx +++ b/macros/latex-dev/required/l3kernel/l3legacy.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3luatex.dtx b/macros/latex-dev/required/l3kernel/l3luatex.dtx index 963fdcb032..bb63d33ec8 100644 --- a/macros/latex-dev/required/l3kernel/l3luatex.dtx +++ b/macros/latex-dev/required/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3msg.dtx b/macros/latex-dev/required/l3kernel/l3msg.dtx index c8569dd7ac..f31ae83ce5 100644 --- a/macros/latex-dev/required/l3kernel/l3msg.dtx +++ b/macros/latex-dev/required/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3names.dtx b/macros/latex-dev/required/l3kernel/l3names.dtx index 9231f409c1..c664a2c0c9 100644 --- a/macros/latex-dev/required/l3kernel/l3names.dtx +++ b/macros/latex-dev/required/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3news.pdf b/macros/latex-dev/required/l3kernel/l3news.pdf Binary files differindex 13395a51a0..18145dc08d 100644 --- a/macros/latex-dev/required/l3kernel/l3news.pdf +++ b/macros/latex-dev/required/l3kernel/l3news.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news01.pdf b/macros/latex-dev/required/l3kernel/l3news01.pdf Binary files differindex 12f78fce05..5c044acfdf 100644 --- a/macros/latex-dev/required/l3kernel/l3news01.pdf +++ b/macros/latex-dev/required/l3kernel/l3news01.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news02.pdf b/macros/latex-dev/required/l3kernel/l3news02.pdf Binary files differindex d14e137d29..086397a36b 100644 --- a/macros/latex-dev/required/l3kernel/l3news02.pdf +++ b/macros/latex-dev/required/l3kernel/l3news02.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news03.pdf b/macros/latex-dev/required/l3kernel/l3news03.pdf Binary files differindex 79ac19eeba..78c4435a20 100644 --- a/macros/latex-dev/required/l3kernel/l3news03.pdf +++ b/macros/latex-dev/required/l3kernel/l3news03.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news04.pdf b/macros/latex-dev/required/l3kernel/l3news04.pdf Binary files differindex e14577af81..c43722ecf9 100644 --- a/macros/latex-dev/required/l3kernel/l3news04.pdf +++ b/macros/latex-dev/required/l3kernel/l3news04.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news05.pdf b/macros/latex-dev/required/l3kernel/l3news05.pdf Binary files differindex 9317c56453..87d57cf9d7 100644 --- a/macros/latex-dev/required/l3kernel/l3news05.pdf +++ b/macros/latex-dev/required/l3kernel/l3news05.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news06.pdf b/macros/latex-dev/required/l3kernel/l3news06.pdf Binary files differindex b63b3d6f7a..5b06c14399 100644 --- a/macros/latex-dev/required/l3kernel/l3news06.pdf +++ b/macros/latex-dev/required/l3kernel/l3news06.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news07.pdf b/macros/latex-dev/required/l3kernel/l3news07.pdf Binary files differindex 53f05ea997..fc36e29788 100644 --- a/macros/latex-dev/required/l3kernel/l3news07.pdf +++ b/macros/latex-dev/required/l3kernel/l3news07.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news08.pdf b/macros/latex-dev/required/l3kernel/l3news08.pdf Binary files differindex c1afcce2d0..8b87bfbdc7 100644 --- a/macros/latex-dev/required/l3kernel/l3news08.pdf +++ b/macros/latex-dev/required/l3kernel/l3news08.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news09.pdf b/macros/latex-dev/required/l3kernel/l3news09.pdf Binary files differindex 9f5bad41a0..f918ee808d 100644 --- a/macros/latex-dev/required/l3kernel/l3news09.pdf +++ b/macros/latex-dev/required/l3kernel/l3news09.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news10.pdf b/macros/latex-dev/required/l3kernel/l3news10.pdf Binary files differindex 92a888e33c..d402a2d358 100644 --- a/macros/latex-dev/required/l3kernel/l3news10.pdf +++ b/macros/latex-dev/required/l3kernel/l3news10.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news11.pdf b/macros/latex-dev/required/l3kernel/l3news11.pdf Binary files differindex 18b77565d4..edd543c471 100644 --- a/macros/latex-dev/required/l3kernel/l3news11.pdf +++ b/macros/latex-dev/required/l3kernel/l3news11.pdf diff --git a/macros/latex-dev/required/l3kernel/l3news12.pdf b/macros/latex-dev/required/l3kernel/l3news12.pdf Binary files differindex dce8290061..058319afbd 100644 --- a/macros/latex-dev/required/l3kernel/l3news12.pdf +++ b/macros/latex-dev/required/l3kernel/l3news12.pdf diff --git a/macros/latex-dev/required/l3kernel/l3pdf.dtx b/macros/latex-dev/required/l3kernel/l3pdf.dtx index e827001e9f..b97eb20035 100644 --- a/macros/latex-dev/required/l3kernel/l3pdf.dtx +++ b/macros/latex-dev/required/l3kernel/l3pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3prefixes.pdf b/macros/latex-dev/required/l3kernel/l3prefixes.pdf Binary files differindex 9b3c4cde2a..1dde433cd0 100644 --- a/macros/latex-dev/required/l3kernel/l3prefixes.pdf +++ b/macros/latex-dev/required/l3kernel/l3prefixes.pdf diff --git a/macros/latex-dev/required/l3kernel/l3prg.dtx b/macros/latex-dev/required/l3kernel/l3prg.dtx index 69c66057d4..e474d89605 100644 --- a/macros/latex-dev/required/l3kernel/l3prg.dtx +++ b/macros/latex-dev/required/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3prop.dtx b/macros/latex-dev/required/l3kernel/l3prop.dtx index 5f60f31b81..4268afb573 100644 --- a/macros/latex-dev/required/l3kernel/l3prop.dtx +++ b/macros/latex-dev/required/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3quark.dtx b/macros/latex-dev/required/l3kernel/l3quark.dtx index d4558e216b..e7e08b0d0c 100644 --- a/macros/latex-dev/required/l3kernel/l3quark.dtx +++ b/macros/latex-dev/required/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3regex.dtx b/macros/latex-dev/required/l3kernel/l3regex.dtx index b6ca0d5d2c..df0b3a8ced 100644 --- a/macros/latex-dev/required/l3kernel/l3regex.dtx +++ b/macros/latex-dev/required/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3seq.dtx b/macros/latex-dev/required/l3kernel/l3seq.dtx index 2f0b223753..6ae2c58ad7 100644 --- a/macros/latex-dev/required/l3kernel/l3seq.dtx +++ b/macros/latex-dev/required/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3skip.dtx b/macros/latex-dev/required/l3kernel/l3skip.dtx index 788abaf20c..2a4130845c 100644 --- a/macros/latex-dev/required/l3kernel/l3skip.dtx +++ b/macros/latex-dev/required/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3sort.dtx b/macros/latex-dev/required/l3kernel/l3sort.dtx index 6c997672de..f3f3310621 100644 --- a/macros/latex-dev/required/l3kernel/l3sort.dtx +++ b/macros/latex-dev/required/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3str-convert.dtx b/macros/latex-dev/required/l3kernel/l3str-convert.dtx index 4da5cf1302..60129129f8 100644 --- a/macros/latex-dev/required/l3kernel/l3str-convert.dtx +++ b/macros/latex-dev/required/l3kernel/l3str-convert.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3str.dtx b/macros/latex-dev/required/l3kernel/l3str.dtx index 787bbf6d87..0f95bcc896 100644 --- a/macros/latex-dev/required/l3kernel/l3str.dtx +++ b/macros/latex-dev/required/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3styleguide.pdf b/macros/latex-dev/required/l3kernel/l3styleguide.pdf Binary files differindex 5ecb6ce5a4..daf35d7428 100644 --- a/macros/latex-dev/required/l3kernel/l3styleguide.pdf +++ b/macros/latex-dev/required/l3kernel/l3styleguide.pdf diff --git a/macros/latex-dev/required/l3kernel/l3styleguide.tex b/macros/latex-dev/required/l3kernel/l3styleguide.tex index 0500ec57cd..426a054c5b 100644 --- a/macros/latex-dev/required/l3kernel/l3styleguide.tex +++ b/macros/latex-dev/required/l3kernel/l3styleguide.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-08-16} +\date{Released 2024-08-30} \begin{document} diff --git a/macros/latex-dev/required/l3kernel/l3syntax-changes.pdf b/macros/latex-dev/required/l3kernel/l3syntax-changes.pdf Binary files differindex 2b92188b17..eb36d4cc20 100644 --- a/macros/latex-dev/required/l3kernel/l3syntax-changes.pdf +++ b/macros/latex-dev/required/l3kernel/l3syntax-changes.pdf diff --git a/macros/latex-dev/required/l3kernel/l3syntax-changes.tex b/macros/latex-dev/required/l3kernel/l3syntax-changes.tex index 8631fe09b8..d77ee029a6 100644 --- a/macros/latex-dev/required/l3kernel/l3syntax-changes.tex +++ b/macros/latex-dev/required/l3kernel/l3syntax-changes.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-08-16} +\date{Released 2024-08-30} \newcommand{\TF}{\textit{(TF)}} diff --git a/macros/latex-dev/required/l3kernel/l3sys.dtx b/macros/latex-dev/required/l3kernel/l3sys.dtx index 861865c677..39983b052d 100644 --- a/macros/latex-dev/required/l3kernel/l3sys.dtx +++ b/macros/latex-dev/required/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3term-glossary.pdf b/macros/latex-dev/required/l3kernel/l3term-glossary.pdf Binary files differindex e70523067d..2a9fbcaeed 100644 --- a/macros/latex-dev/required/l3kernel/l3term-glossary.pdf +++ b/macros/latex-dev/required/l3kernel/l3term-glossary.pdf diff --git a/macros/latex-dev/required/l3kernel/l3term-glossary.tex b/macros/latex-dev/required/l3kernel/l3term-glossary.tex index b150aee1e9..3058ebfac6 100644 --- a/macros/latex-dev/required/l3kernel/l3term-glossary.tex +++ b/macros/latex-dev/required/l3kernel/l3term-glossary.tex @@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN. {latex-team@latex-project.org}% }% } -\date{Released 2024-08-16} +\date{Released 2024-08-30} \newcommand{\TF}{\textit{(TF)}} diff --git a/macros/latex-dev/required/l3kernel/l3text-case.dtx b/macros/latex-dev/required/l3kernel/l3text-case.dtx index 2a3702df85..f8ca399d25 100644 --- a/macros/latex-dev/required/l3kernel/l3text-case.dtx +++ b/macros/latex-dev/required/l3kernel/l3text-case.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3text-map.dtx b/macros/latex-dev/required/l3kernel/l3text-map.dtx index 431e033707..d3cc2fdcd2 100644 --- a/macros/latex-dev/required/l3kernel/l3text-map.dtx +++ b/macros/latex-dev/required/l3kernel/l3text-map.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3text-purify.dtx b/macros/latex-dev/required/l3kernel/l3text-purify.dtx index 051933eb9b..ab4dca057d 100644 --- a/macros/latex-dev/required/l3kernel/l3text-purify.dtx +++ b/macros/latex-dev/required/l3kernel/l3text-purify.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3text.dtx b/macros/latex-dev/required/l3kernel/l3text.dtx index 0680c19fed..3b23acccae 100644 --- a/macros/latex-dev/required/l3kernel/l3text.dtx +++ b/macros/latex-dev/required/l3kernel/l3text.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3tl-analysis.dtx b/macros/latex-dev/required/l3kernel/l3tl-analysis.dtx index aa4ccae287..ec2f06670e 100644 --- a/macros/latex-dev/required/l3kernel/l3tl-analysis.dtx +++ b/macros/latex-dev/required/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3tl-build.dtx b/macros/latex-dev/required/l3kernel/l3tl-build.dtx index a1e5b27ec8..2456ec3b87 100644 --- a/macros/latex-dev/required/l3kernel/l3tl-build.dtx +++ b/macros/latex-dev/required/l3kernel/l3tl-build.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3tl.dtx b/macros/latex-dev/required/l3kernel/l3tl.dtx index 2c8de13fd3..777cf2318d 100644 --- a/macros/latex-dev/required/l3kernel/l3tl.dtx +++ b/macros/latex-dev/required/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3token.dtx b/macros/latex-dev/required/l3kernel/l3token.dtx index cf0f998103..f46bc9d940 100644 --- a/macros/latex-dev/required/l3kernel/l3token.dtx +++ b/macros/latex-dev/required/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % diff --git a/macros/latex-dev/required/l3kernel/l3unicode.dtx b/macros/latex-dev/required/l3kernel/l3unicode.dtx index 89450e18fe..5308a8d956 100644 --- a/macros/latex-dev/required/l3kernel/l3unicode.dtx +++ b/macros/latex-dev/required/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2024-08-16} +% \date{Released 2024-08-30} % % \maketitle % @@ -719,15 +719,22 @@ \tl_set:ce { l_@@_ #1 _block_tl } { \int_eval:n { \tl_use:c { l_@@_ #1 _block_tl } + 1 } } } - \prg_replicate:nn {#2} +% \end{macrocode} +% Here, we avoid \cs{prg_replicate:nn} as the number of tokens generated would be +% high: that shows in the format dump (although \TeX{} recovers memory during +% the subsequent runs). +% \begin{macrocode} + \int_step_inline:nnn + { \tl_use:c { l_@@_ #1 _pos_tl } + 1 } + { \tl_use:c { l_@@_ #1 _pos_tl } + #2 } { - \tl_set:ce { l_@@_ #1 _pos_tl } - { \int_eval:n { \tl_use:c { l_@@_ #1 _pos_tl } + 1 } } \exp_args:Nc \__kernel_intarray_gset:Nnn { g_@@_ #1 _index_intarray } - { \tl_use:c { l_@@_ #1 _pos_tl } } + {##1} \l_@@_matched_block_tl } + \tl_set:ce { l_@@_ #1 _pos_tl } + { \int_eval:n { \tl_use:c { l_@@_ #1 _pos_tl } + #2 } } \clist_clear:c { l_@@_ #1 _block_clist } } % \end{macrocode} diff --git a/macros/latex-dev/required/l3kernel/source3.pdf b/macros/latex-dev/required/l3kernel/source3.pdf Binary files differindex 108054a452..9020f5e0ff 100644 --- a/macros/latex-dev/required/l3kernel/source3.pdf +++ b/macros/latex-dev/required/l3kernel/source3.pdf diff --git a/macros/latex-dev/required/l3kernel/source3.tex b/macros/latex-dev/required/l3kernel/source3.tex index 9abacf7762..95510e9180 100644 --- a/macros/latex-dev/required/l3kernel/source3.tex +++ b/macros/latex-dev/required/l3kernel/source3.tex @@ -57,7 +57,7 @@ for those people who are interested. {latex-team@latex-project.org}% }% } -\date{Released 2024-08-16} +\date{Released 2024-08-30} \pagenumbering{roman} \maketitle diff --git a/macros/latex-dev/required/l3kernel/source3body.tex b/macros/latex-dev/required/l3kernel/source3body.tex index db5b907e7b..44b67816d6 100644 --- a/macros/latex-dev/required/l3kernel/source3body.tex +++ b/macros/latex-dev/required/l3kernel/source3body.tex @@ -285,7 +285,7 @@ pass it to |\foo:N|. Variables are named in a similar manner to functions, but begin with a single letter to define the type of variable: -\begin{description} +\begin{description}[leftmargin=2\parindent, labelindent*=-\parindent] \item[\texttt{c}] Constant: global parameters whose value should not be changed. \item[\texttt{g}] Parameters whose value should only be set globally. @@ -302,7 +302,7 @@ function, typically starting with the module\footnote{The module names are \texttt{\string\l_int_tmpa_int} would be very unreadable.} name and then a descriptive part. Variables end with a short identifier to show the variable type: -\begin{description}% +\begin{description}[leftmargin=2\parindent, labelindent*=-\parindent] \item[\texttt{bitset}] a set of bits (a string made up of a series of \texttt{0} and \texttt{1} tokens that are accessed by position). \item[\texttt{clist}] Comma separated list. @@ -318,7 +318,7 @@ Variables end with a short identifier to show the variable type: Applying \texttt{V}-type or \texttt{v}-type expansion to variables of one of the above types is supported, while it is not supported for the following variable types: -\begin{description} +\begin{description}[leftmargin=2\parindent, labelindent*=-\parindent] \item[\texttt{bool}] Either true or false. \item[\texttt{box}] Box register. \item[\texttt{coffin}] A \enquote{box with handles} --- a higher-level @@ -345,7 +345,7 @@ with any other scratch variable, these should only be set and used with no intervening third-party code. There are two more special types of constants: -\begin{description} +\begin{description}[leftmargin=2\parindent, labelindent*=-\parindent] \item[\texttt{q}] Quark constants. \item[\texttt{s}] Scan mark constants. \end{description} diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/LICENSE.txt b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/LICENSE.txt new file mode 100644 index 0000000000..2244313901 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/LICENSE.txt @@ -0,0 +1,416 @@ +The LaTeX Project Public License +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +LPPL Version 1.3c 2008-05-04 + +Copyright 1999 2002-2008 LaTeX3 Project + Everyone is allowed to distribute verbatim copies of this + license document, but modification of it is not allowed. + + +PREAMBLE +======== + +The LaTeX Project Public License (LPPL) is the primary license under +which the LaTeX kernel and the base LaTeX packages are distributed. + +You may use this license for any work of which you hold the copyright +and which you wish to distribute. This license may be particularly +suitable if your work is TeX-related (such as a LaTeX package), but +it is written in such a way that you can use it even if your work is +unrelated to TeX. + +The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE', +below, gives instructions, examples, and recommendations for authors +who are considering distributing their works under this license. + +This license gives conditions under which a work may be distributed +and modified, as well as conditions under which modified versions of +that work may be distributed. + +We, the LaTeX3 Project, believe that the conditions below give you +the freedom to make and distribute modified versions of your work +that conform with whatever technical specifications you wish while +maintaining the availability, integrity, and reliability of +that work. If you do not see how to achieve your goal while +meeting these conditions, then read the document `cfgguide.tex' +and `modguide.tex' in the base LaTeX distribution for suggestions. + + +DEFINITIONS +=========== + +In this license document the following terms are used: + + `Work' + Any work being distributed under this License. + + `Derived Work' + Any work that under any applicable law is derived from the Work. + + `Modification' + Any procedure that produces a Derived Work under any applicable + law -- for example, the production of a file containing an + original file associated with the Work or a significant portion of + such a file, either verbatim or with modifications and/or + translated into another language. + + `Modify' + To apply any procedure that produces a Derived Work under any + applicable law. + + `Distribution' + Making copies of the Work available from one person to another, in + whole or in part. Distribution includes (but is not limited to) + making any electronic components of the Work accessible by + file transfer protocols such as FTP or HTTP or by shared file + systems such as Sun's Network File System (NFS). + + `Compiled Work' + A version of the Work that has been processed into a form where it + is directly usable on a computer system. This processing may + include using installation facilities provided by the Work, + transformations of the Work, copying of components of the Work, or + other activities. Note that modification of any installation + facilities provided by the Work constitutes modification of the Work. + + `Current Maintainer' + A person or persons nominated as such within the Work. If there is + no such explicit nomination then it is the `Copyright Holder' under + any applicable law. + + `Base Interpreter' + A program or process that is normally needed for running or + interpreting a part or the whole of the Work. + + A Base Interpreter may depend on external components but these + are not considered part of the Base Interpreter provided that each + external component clearly identifies itself whenever it is used + interactively. Unless explicitly specified when applying the + license to the Work, the only applicable Base Interpreter is a + `LaTeX-Format' or in the case of files belonging to the + `LaTeX-format' a program implementing the `TeX language'. + + + +CONDITIONS ON DISTRIBUTION AND MODIFICATION +=========================================== + +1. Activities other than distribution and/or modification of the Work +are not covered by this license; they are outside its scope. In +particular, the act of running the Work is not restricted and no +requirements are made concerning any offers of support for the Work. + +2. You may distribute a complete, unmodified copy of the Work as you +received it. Distribution of only part of the Work is considered +modification of the Work, and no right to distribute such a Derived +Work may be assumed under the terms of this clause. + +3. You may distribute a Compiled Work that has been generated from a +complete, unmodified copy of the Work as distributed under Clause 2 +above, as long as that Compiled Work is distributed in such a way that +the recipients may install the Compiled Work on their system exactly +as it would have been installed if they generated a Compiled Work +directly from the Work. + +4. If you are the Current Maintainer of the Work, you may, without +restriction, modify the Work, thus creating a Derived Work. You may +also distribute the Derived Work without restriction, including +Compiled Works generated from the Derived Work. Derived Works +distributed in this manner by the Current Maintainer are considered to +be updated versions of the Work. + +5. If you are not the Current Maintainer of the Work, you may modify +your copy of the Work, thus creating a Derived Work based on the Work, +and compile this Derived Work, thus creating a Compiled Work based on +the Derived Work. + +6. If you are not the Current Maintainer of the Work, you may +distribute a Derived Work provided the following conditions are met +for every component of the Work unless that component clearly states +in the copyright notice that it is exempt from that condition. Only +the Current Maintainer is allowed to add such statements of exemption +to a component of the Work. + + a. If a component of this Derived Work can be a direct replacement + for a component of the Work when that component is used with the + Base Interpreter, then, wherever this component of the Work + identifies itself to the user when used interactively with that + Base Interpreter, the replacement component of this Derived Work + clearly and unambiguously identifies itself as a modified version + of this component to the user when used interactively with that + Base Interpreter. + + b. Every component of the Derived Work contains prominent notices + detailing the nature of the changes to that component, or a + prominent reference to another file that is distributed as part + of the Derived Work and that contains a complete and accurate log + of the changes. + + c. No information in the Derived Work implies that any persons, + including (but not limited to) the authors of the original version + of the Work, provide any support, including (but not limited to) + the reporting and handling of errors, to recipients of the + Derived Work unless those persons have stated explicitly that + they do provide such support for the Derived Work. + + d. You distribute at least one of the following with the Derived Work: + + 1. A complete, unmodified copy of the Work; + if your distribution of a modified component is made by + offering access to copy the modified component from a + designated place, then offering equivalent access to copy + the Work from the same or some similar place meets this + condition, even though third parties are not compelled to + copy the Work along with the modified component; + + 2. Information that is sufficient to obtain a complete, + unmodified copy of the Work. + +7. If you are not the Current Maintainer of the Work, you may +distribute a Compiled Work generated from a Derived Work, as long as +the Derived Work is distributed to all recipients of the Compiled +Work, and as long as the conditions of Clause 6, above, are met with +regard to the Derived Work. + +8. The conditions above are not intended to prohibit, and hence do not +apply to, the modification, by any method, of any component so that it +becomes identical to an updated version of that component of the Work as +it is distributed by the Current Maintainer under Clause 4, above. + +9. Distribution of the Work or any Derived Work in an alternative +format, where the Work or that Derived Work (in whole or in part) is +then produced by applying some process to that format, does not relax or +nullify any sections of this license as they pertain to the results of +applying that process. + +10. a. A Derived Work may be distributed under a different license + provided that license itself honors the conditions listed in + Clause 6 above, in regard to the Work, though it does not have + to honor the rest of the conditions in this license. + + b. If a Derived Work is distributed under a different license, that + Derived Work must provide sufficient documentation as part of + itself to allow each recipient of that Derived Work to honor the + restrictions in Clause 6 above, concerning changes from the Work. + +11. This license places no restrictions on works that are unrelated to +the Work, nor does this license place any restrictions on aggregating +such works with the Work by any means. + +12. Nothing in this license is intended to, or may be used to, prevent +complete compliance by all parties with all applicable laws. + + +NO WARRANTY +=========== + +There is no warranty for the Work. Except when otherwise stated in +writing, the Copyright Holder provides the Work `as is', without +warranty of any kind, either expressed or implied, including, but not +limited to, the implied warranties of merchantability and fitness for a +particular purpose. The entire risk as to the quality and performance +of the Work is with you. Should the Work prove defective, you assume +the cost of all necessary servicing, repair, or correction. + +In no event unless required by applicable law or agreed to in writing +will The Copyright Holder, or any author named in the components of the +Work, or any other party who may distribute and/or modify the Work as +permitted above, be liable to you for damages, including any general, +special, incidental or consequential damages arising out of any use of +the Work or out of inability to use the Work (including, but not limited +to, loss of data, data being rendered inaccurate, or losses sustained by +anyone as a result of any failure of the Work to operate with any other +programs), even if the Copyright Holder or said author or said other +party has been advised of the possibility of such damages. + + +MAINTENANCE OF THE WORK +======================= + +The Work has the status `author-maintained' if the Copyright Holder +explicitly and prominently states near the primary copyright notice in +the Work that the Work can only be maintained by the Copyright Holder +or simply that it is `author-maintained'. + +The Work has the status `maintained' if there is a Current Maintainer +who has indicated in the Work that they are willing to receive error +reports for the Work (for example, by supplying a valid e-mail +address). It is not required for the Current Maintainer to acknowledge +or act upon these error reports. + +The Work changes from status `maintained' to `unmaintained' if there +is no Current Maintainer, or the person stated to be Current +Maintainer of the work cannot be reached through the indicated means +of communication for a period of six months, and there are no other +significant signs of active maintenance. + +You can become the Current Maintainer of the Work by agreement with +any existing Current Maintainer to take over this role. + +If the Work is unmaintained, you can become the Current Maintainer of +the Work through the following steps: + + 1. Make a reasonable attempt to trace the Current Maintainer (and + the Copyright Holder, if the two differ) through the means of + an Internet or similar search. + + 2. If this search is successful, then enquire whether the Work + is still maintained. + + a. If it is being maintained, then ask the Current Maintainer + to update their communication data within one month. + + b. If the search is unsuccessful or no action to resume active + maintenance is taken by the Current Maintainer, then announce + within the pertinent community your intention to take over + maintenance. (If the Work is a LaTeX work, this could be + done, for example, by posting to comp.text.tex.) + + 3a. If the Current Maintainer is reachable and agrees to pass + maintenance of the Work to you, then this takes effect + immediately upon announcement. + + b. If the Current Maintainer is not reachable and the Copyright + Holder agrees that maintenance of the Work be passed to you, + then this takes effect immediately upon announcement. + + 4. If you make an `intention announcement' as described in 2b. above + and after three months your intention is challenged neither by + the Current Maintainer nor by the Copyright Holder nor by other + people, then you may arrange for the Work to be changed so as + to name you as the (new) Current Maintainer. + + 5. If the previously unreachable Current Maintainer becomes + reachable once more within three months of a change completed + under the terms of 3b) or 4), then that Current Maintainer must + become or remain the Current Maintainer upon request provided + they then update their communication data within one month. + +A change in the Current Maintainer does not, of itself, alter the fact +that the Work is distributed under the LPPL license. + +If you become the Current Maintainer of the Work, you should +immediately provide, within the Work, a prominent and unambiguous +statement of your status as Current Maintainer. You should also +announce your new status to the same pertinent community as +in 2b) above. + + +WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS LICENSE +====================================================== + +This section contains important instructions, examples, and +recommendations for authors who are considering distributing their +works under this license. These authors are addressed as `you' in +this section. + +Choosing This License or Another License +---------------------------------------- + +If for any part of your work you want or need to use *distribution* +conditions that differ significantly from those in this license, then +do not refer to this license anywhere in your work but, instead, +distribute your work under a different license. You may use the text +of this license as a model for your own license, but your license +should not refer to the LPPL or otherwise give the impression that +your work is distributed under the LPPL. + +The document `modguide.tex' in the base LaTeX distribution explains +the motivation behind the conditions of this license. It explains, +for example, why distributing LaTeX under the GNU General Public +License (GPL) was considered inappropriate. Even if your work is +unrelated to LaTeX, the discussion in `modguide.tex' may still be +relevant, and authors intending to distribute their works under any +license are encouraged to read it. + +A Recommendation on Modification Without Distribution +----------------------------------------------------- + +It is wise never to modify a component of the Work, even for your own +personal use, without also meeting the above conditions for +distributing the modified component. While you might intend that such +modifications will never be distributed, often this will happen by +accident -- you may forget that you have modified that component; or +it may not occur to you when allowing others to access the modified +version that you are thus distributing it and violating the conditions +of this license in ways that could have legal implications and, worse, +cause problems for the community. It is therefore usually in your +best interest to keep your copy of the Work identical with the public +one. Many works provide ways to control the behavior of that work +without altering any of its licensed components. + +How to Use This License +----------------------- + +To use this license, place in each of the components of your work both +an explicit copyright notice including your name and the year the work +was authored and/or last substantially modified. Include also a +statement that the distribution and/or modification of that +component is constrained by the conditions in this license. + +Here is an example of such a notice and statement: + + %% pig.dtx + %% Copyright 2005 M. Y. Name + % + % This work may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.3 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.3 or later is part of all distributions of LaTeX + % version 2005/12/01 or later. + % + % This work has the LPPL maintenance status `maintained'. + % + % The Current Maintainer of this work is M. Y. Name. + % + % This work consists of the files pig.dtx and pig.ins + % and the derived file pig.sty. + +Given such a notice and statement in a file, the conditions +given in this license document would apply, with the `Work' referring +to the three files `pig.dtx', `pig.ins', and `pig.sty' (the last being +generated from `pig.dtx' using `pig.ins'), the `Base Interpreter' +referring to any `LaTeX-Format', and both `Copyright Holder' and +`Current Maintainer' referring to the person `M. Y. Name'. + +If you do not want the Maintenance section of LPPL to apply to your +Work, change `maintained' above into `author-maintained'. +However, we recommend that you use `maintained', as the Maintenance +section was added in order to ensure that your Work remains useful to +the community even when you can no longer maintain and support it +yourself. + +Derived Works That Are Not Replacements +--------------------------------------- + +Several clauses of the LPPL specify means to provide reliability and +stability for the user community. They therefore concern themselves +with the case that a Derived Work is intended to be used as a +(compatible or incompatible) replacement of the original Work. If +this is not the case (e.g., if a few lines of code are reused for a +completely different task), then clauses 6b and 6d shall not apply. + + +Important Recommendations +------------------------- + + Defining What Constitutes the Work + + The LPPL requires that distributions of the Work contain all the + files of the Work. It is therefore important that you provide a + way for the licensee to determine which files constitute the Work. + This could, for example, be achieved by explicitly listing all the + files of the Work near the copyright notice of each file or by + using a line such as: + + % This work consists of all files listed in manifest.txt. + + in that place. In the absence of an unequivocal list it might be + impossible for the licensee to determine what is considered by you + to comprise the Work and, in such a case, the licensee would be + entitled to make reasonable conjectures as to which files comprise + the Work. + diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/README.md b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/README.md new file mode 100644 index 0000000000..c4b213ef28 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/README.md @@ -0,0 +1,5 @@ +# `beamertheme-edmaths` Beamer Theme + +A beamer presentation theme which follows the [university's brand guidelines](https://communications-marketing.ed.ac.uk/marketing/brand). See also the [_documentation_](https://foggalong.github.io/edinburgh-math-latex/beamertheme-edmaths-docs.pdf) and a [_compiled example_](https://foggalong.github.io/edinburgh-math-latex/example-presentation.pdf). To use, place the files and store them either with your .tex file(s) or in any directory that's findable by LaTeX (e.g. `$TEXINPUTS`). + +For more information on the wider project, including the report and thesis stylesheet, [see GitHub](https://github.com/Foggalong/edinburgh-math-latex). The beamer theme [beamerthemeedmaths.sty](beamerthemeedmaths.sty) is provided under the [LaTeX Project Public License v1.3c](https://choosealicense.com/licenses/lppl-1.3c/) (LPPL) while the example [example-presentation.tex](example-presentation.tex) is provided under the [BSD Zero Clause License](https://choosealicense.com/licenses/0bsd/) (0BSD). diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/beamerthemeedmaths.sty b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/beamerthemeedmaths.sty new file mode 100644 index 0000000000..ded67b3d59 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/beamerthemeedmaths.sty @@ -0,0 +1,167 @@ +%% Package `edmaths' v0.99 +%% File beamerthemeedmaths.sty +%% Copyright 2024 Josh Fogg +%% +%% beamerthemeedmaths.sty is a LaTeX style file for typesetting presentations +%% for the School of Mathematics at the University of Edinburgh, part of the +%% more general `edmaths' package. See README.md for usage instructions. +%% +%% This work may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License, either version 1.3 of this license or (at +%% your option) any later version. +%% +%% The latest version of this license is in http://latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX version +%% 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained' and the current +%% maintainer of this work is Josh Fogg. Originally written by Saturnino Luz +%% for the Usher Institute and made generic to UoE by Ben Brown. +%% +%% This work consists of the files beamerthemeedmaths.sty, but in addition +%% requires images `white-tied-in' and `edinburgh-logo' to compile. The images +%% distributed with this work in the `edmaths' package are registered trademarks; +%% they are not to be used as part of derived or independent works without the +%% permission of The University of Edinburgh. This does not affect use as part +%% of compiled LaTeX documents using this style for the university. + +\ProvidesPackage{beamerthemeedmaths}[2024-08-30 Edinburgh maths beamer theme v0.99] +\RequirePackage{amsfonts,graphicx,lmodern,mathptmx} + +% Colour definitions to choose between +\definecolor{UoEblue}{RGB}{0,50,95} % #00325F +\definecolor{UoEcyan}{RGB}{69, 126, 129} % #457E81 +\definecolor{UoEgreen}{RGB}{156, 154, 0} % #9C9A00 +\definecolor{UoEgray}{RGB}{.392, .329, .329} % VARIES +\definecolor{UoEorange}{RGB}{204, 89, 17} % #CC5911 + +% Define colour command for use through rest of theme +\newcommand{\beamer@UoE@color}{UoEblue} +\DeclareOptionBeamer{colour}{\def\beamer@UoE@color{#1}} + +% Change title height to fit styling +\newdimen\beamer@UoE@titleheight +\beamer@UoE@titleheight=10ex +\DeclareOptionBeamer{theight}{\beamer@UoE@titleheight=#1} + +% Resolution is 9:5 (approx), as in ppt template +\geometry{paperwidth=25.40cm, paperheight=19.05cm} + +\ProcessOptionsBeamer + +\newcommand\crule[3][\beamer@UoE@color]{\textcolor{#1}{\rule{#2}{#3}}} + +\setbeamerfont{title}{series=\bfseries,size=\fontsize{32}{36}}% +\setbeamerfont{subtitle}{size=\fontsize{24}{28}} +\setbeamerfont{author}{size={\fontsize{20}{24}}} +\setbeamerfont{institute}{size=\fontsize{22}{26}} +\setbeamerfont{pagexofy}{size=\tiny} +\setbeamerfont{caption}{size=\Large} +\setbeamerfont{frametitle}{family=\sffamily,series=\bfseries,size={\fontsize{23}{26}}} +\setbeamerfont{itemize item}{family=\sffamily,size={\fontsize{16}{18}}} +\setbeamerfont{itemize subitem}{family=\sffamily,size={\fontsize{16}{18}}} +\setbeamertemplate{itemize/enumerate body begin}{\fontsize{16}{19}\selectfont} +\setbeamertemplate{itemize/enumerate subbody begin}{\fontsize{16}{19}\selectfont} +\AtBeginDocument{\fontsize{18}{19}\selectfont} + +%\setbeamertemplate{items}[ball] +\setbeamertemplate{navigation symbols}{} +\pgfdeclareimage[width=14.69cm]{white-tied-in}{images/white-tied-in} +\pgfdeclareimage[width=4.65cm]{edinburgh-logo}{images/edinburgh-logo} +\pgfdeclareimage[width=1.25cm]{little=u}{images/edinburgh-logo} +\setbeamerfont{alerted text}{series=\bfseries} +\setbeamercolor{alerted text}{fg=\beamer@UoE@color!80!black} +\setbeamercolor{title}{fg=black} +\setbeamercolor{normal text}{fg=black} +\setbeamertemplate{itemize item}{\color{\beamer@UoE@color}$\bullet$} +\setbeamertemplate{itemize subitem}{\color{\beamer@UoE@color}$\circ$} + + +\newcommand{\SetUoETitleMargin}[1]{\beamer@UoE@titleheight=#1} +\newcommand{\SetUoETitleHeight}[1]{\beamer@UoE@titleheight=#1} + + +\newlength\barheight\setlength\barheight{\paperheight} +\divide\barheight by 12 + + +\setbeamertemplate{title page}{ + \raggedright + % TITLE + {\usebeamerfont{title}\textcolor{white}\inserttitle\par~} + % SUBTITLE + \ifx\insertsubtitle\@empty + \else% + \\[1ex] + {\usebeamerfont{subtitle}\textcolor{white}\insertsubtitle} + \fi + \\[6ex] + % AUTHOR + {\usebeamerfont{author}\textcolor{white}\insertauthor} + \ifx\insertinstitute\@empty + \else% + \\[3ex] + {\\\usebeamerfont{institute}\textcolor{white}\insertinstitute} + \fi + % DATE + \ifx\insertdate\empty + \else% + \\[1ex] + \usebeamerfont{date}\textcolor{white}{\insertdate} + \fi +} + + +\setbeamertemplate{background}{ + \setlength{\unitlength}{1cm} + \begin{picture}(25.4,19.05)(0,0) + % on first slide add UoE text logo across bottom left + \ifnum\c@framenumber=1% + \put(-.1, 0){\crule[\beamer@UoE@color]{25.4cm}{19.05cm}} + \put(0.44, 0.1){\pgfuseimage{white-tied-in}} + % on ever other slide add UoE logo at top of blue sidebar + \else% + \put(23.5, 0){\crule[\beamer@UoE@color]{1.80cm}{19.05cm}} + \put(23.65, 17.3){\includegraphics[width=1.45cm,height=1.45cm]{images/edinburgh-logo}} + \fi% + % add slide numbering to bottom right + \ifnum\c@framenumber<10% + \put(23.7,0.3){\centering\Large\color{white}{\phantom{0}\insertframenumber/\inserttotalframenumber}} + \else + \put(23.7,0.3){\centering\Large\color{white}{\insertframenumber/\inserttotalframenumber}} + \fi% + \end{picture} +} + + +% Default slide formatting +\setbeamertemplate{frametitle}{ + % if not the starting fram, add a top margin + \ifnum\c@framenumber=1% + \empty% + \else + \vspace*{\beamer@UoE@titleheight} + \fi + % use the title colour from this class + \usebeamercolor[fg]{title} + % handle situation where there's no subtitle + \ifx\insertframesubtitle\@empty + \usebeamerfont{frametitle}{\insertframetitle} + \else + \usebeamerfont{frametitle}{\insertframetitle:~{\normalfont\insertframesubtitle}} + \fi + % ensures spacing after the title + \vspace*{1em} +} + +%\newcommand{\UoEsettitleheight}[1]{\makeatletter\beamer@UoE@titleheight=#1\makeatother} +\setbeamersize{text margin left=2cm,text margin right=2.5cm} + +% Ensures images are compressed when brought in by PDF +\pdfcompresslevel=9 +\pdfobjcompresslevel=3 + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "sample" +%%% End: diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.pdf b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.pdf Binary files differnew file mode 100644 index 0000000000..feed9074f7 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.pdf diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.tex b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.tex new file mode 100644 index 0000000000..e14f44e0a0 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/beamertheme-edmaths-docs.tex @@ -0,0 +1,231 @@ +\documentclass[12pt]{article} + +% This is documentation for the `edmaths` LaTeX package, maintained by +% Josh Fogg for the University of Edinburgh. This file closely builds on +% that provided Alan Munn for the MSU Thesis Class, `msu-thesis`. The +% original documentation is licensed under LaTeX Project Public License +% (LPPL) version 1.3 or later, and this documentation is licensed under +% the LLP version 1.3c. For more information, see the GitHub repository: +% https://github.com/Foggalong/edinburgh-math-latex + +\def\msuversion{0.99} +\def\msudate{2024-08-30} +\title{\textbf{Using the \pkg{beamertheme-edmaths} Beamer Theme}} +\author{\textbf{Josh Fogg}\\School of Mathematics\\The University of Edinburgh\\\texttt{\href{mailto:j.fogg@ed.ac.uk}{j.fogg@ed.ac.uk}}} +\date{Version \msuversion\\\msudate} + +% basic formatting tweaks +\usepackage[lmargin=2cm,rmargin=2cm,tmargin=3cm,bmargin=2cm]{geometry} +\usepackage[colorlinks=true]{hyperref} +\usepackage{enumitem} +\usepackage{graphicx} + +% use same fourier font available through edmaths +\usepackage{cmap} +\usepackage{fourier} +\usepackage[T1]{fontenc} +\usepackage{microtype} + +% setup syntax highlighting +\usepackage{highlightlatex} +\definecolor{whiteF0}{HTML}{F0F0F0} +\lstset{ + % external padding + aboveskip=.4em, + belowskip=-.2em, + xleftmargin=.03\textwidth, + xrightmargin=.03\textwidth, + % basic formatting + backgroundcolor=\color{whiteF0}, + showstringspaces=false, + columns=fixed, + basewidth=.5em, + basicstyle={\fontfamily{zlmtt}\selectfont}, + breaklines=true +} + + +% change new paragraph behaviour to no-indent and a linebreak +\usepackage[parfill]{parskip} + + +\newcommand\pkg[1]{\href{https://www.ctan.org/pkg/#1}{\color{teal}\lstinline{#1}}} +\newcommand\key[1]{{\color{orange}\lstinline|#1|}} + + +\begin{document} +\maketitle +\thispagestyle{empty} + +\section{Introduction} + +This is theme for \pkg{beamer}, used to creating presentations for the \href{https://www.maths.ed.ac.uk/}{School of Mathematics} at the \href{https://www.ed.ac.uk/}{University of Edinburgh}. It's designed as an accompaniment to \pkg{edmaths} and provides an easy way to generate a presentation in \LaTeX{} which aligns the university brand guidelines. This means you can focus on your actual writing, rather than worrying about font spacing, margins sizes, {\it etc}. + +\section{Initial Setup} + +This theme is designed to work with \pkg{beamer}, which should be available with any \TeX{} distribution. It can be used with any \LaTeX{} engine, including pdfLaTeX, XeLaTeX, or LuaLaTeX. While it should work with any reasonably up-to-date \TeX{} distribution, it is tested with 2020 and later. + +The essential steps to setup are then: +\begin{enumerate} + \item Choose a document class using \lstinline|\documentclass[<options>]{beamer}|, with \key{<options>} being defined in the full \pkg{beamer} documentation. + \item Apply the theme using \lstinline|\usetheme{edmaths}|. + \item Use \lstinline|\title[Short Title]{Full Title}|| to define the title (the \key{Short Title} is optional). + \item Set the optional \lstinline|\subtitle{...}| if desired. + \item Set the \lstinline|\author{...}| and \lstinline|\date{...}|. +\end{enumerate} +These steps {\bf must} be done in exactly this order or the compiler will throw errors. + +Unlike \pkg{edmaths}, this theme does not automatically load the standard suite of \LaTeX{} math packages ({\it e.g.\/} \pkg{amsmath}) so you may wish to load those. Instead it loads \pkg{amsfonts}, \pkg{graphicx}, \pkg{lmodern}, and \pkg{mathptmx} which are necessary for the theme. + +The basic package has no other special requirements, but if you have certain additional packages installed then you can use some fancifying options (see below). + +\section{Package Options} + +When loading \pkg{beamertheme-edmaths} with +\begin{lstlisting} +\usetheme[<options>]{edmaths} +\end{lstlisting} +we can supply additional \key{<options>} as a comma-separated list of the following keywords. + +\subsection{Colour} + +The default theme is styled around University of Edinburgh {\bf\color[HTML]{00325F} blue (\lstinline|#00325F|)}. It's also available in three other official brand colour-scheme variations by specifying at most one of: +\begin{itemize} + \item \key{colour=UoEorange} for {\bf\color[HTML]{CC5911} orange (\lstinline|#CC5911|)}, + \item \key{colour=UoEgreen} for {\bf\color[HTML]{9C9A00} green (\lstinline|#9C9A00|)}, + \item \key{colour=UoEcyan} for {\bf\color[HTML]{457E81} cyan (\lstinline|#457E81|)}. +\end{itemize} +In theory other off-brand colours could be applied using \pkg{xcolor} and the same syntax, but this isn't officially supported so results may vary. + +\subsection{Title Height} + +By default the title height is \key{10ex}. This can be modified by specifying \key{theight=<x>}, where \key{<x>} is the desired height in a \LaTeX{} compatible unit. + +\section{Usage} + +Once \pkg{beamertheme-edmaths} is set up, a simple example of how it might be put together in \pkg{beamer} is in the listing below. A more complicated example is packaged with \pkg{beamertheme-edmaths} and \href{https://github.com/Foggalong/edinburgh-math-latex/blob/main/example-presentation.tex}{available here}. What this looks like compiled can be \href{https://foggalong.github.io/edinburgh-math-latex/example-presentation.pdf}{viewed here}. + +\subsection{Overleaf} + +As a student or staff member at the University of Edinburgh you have access to \href{https://www.ed.ac.uk/information-services/computing/desktop-personal/software/main-software-deals/other-software/overleaf}{Overleaf Professional}! Do make use of this, it alleviates many of the headaches which come with using \LaTeX{} across multiple computers, which you surely will.. + +\subsection{Archiving your presentation for the future} + +The current version of \pkg{beamertheme-edmaths} satisfies the brand guidelines at any one time. Given these change, you may find that if you need to recompile your presentation later that the formatting changes. To avoid this, save an archived version of the \href{https://github.com/Foggalong/edinburgh-math-latex/blob/main/beamerthemeedmaths.sty}{\lstinline|beamerthemeedmaths.sty|} file in the same folder as your slides. You only need to do this once you have completely finished your presentation however; there's no need to do it during the writing process. + +\begin{lstlisting}[caption={Example usage of \pkg{beamertheme-edmaths}.}] +\documentclass{beamer} +\usetheme{edmaths} + +\title[Short Title]{A Long and verbose title} +\subtitle{and a sub-title} % optional +\author{Dr Benway} +\institute{The Mental Institute} % optional +\date{Feb 1935} + +\begin{document} + +\maketitle + +\begin{frame}{Words of Advice for Young People}\label{sec:Advice} + People often ask me if I have any words of \alert{advice} for + young people\ldots \\[2ex] \pause + \begin{itemize} + \item<1-> \alert{Never} interfere in a \alert{boy-and-girl} + fight + \item<2-> Any \alert{old soul} is worth saving \\ + \uncover<3->{at \alert{least to} a priest}, + \begin{itemize} + \item<4-> But \alert{not} every soul is \alert{worth + buying}. + \end{itemize} + \item<5-> \ldots + \end{itemize} +\end{frame} + +\begin{frame}{Conclusions}\label{sec:what?} + \begin{itemize} + \item<2-> What \alert{are} we doing here? + \item<4-> What? + \item<2-> Answers: + \begin{itemize} + \item<3-> We are here \alert{to go}. + \end{itemize} + \end{itemize} +\end{frame} + +\end{document} +\end{lstlisting} + +\section{Speaker Notes} + +There are various solutions for writing notes to accompany LaTeX presentations made with \pkg{beamer}. In each of these use the relevant command {\it after} the slide you wish to annotate. + +\subsection{Beamer's \texttt{note}} + +Core \pkg{beamer} itself actually comes with a command, \lstinline|\note|, which can be used for writing notes that are then included as separate `notes' pages in the complied PDF. Exactly how these are handled is controlled through the document class arguments + +\begin{lstlisting} +\documentclass[notes]{beamer} % print frame + notes +\documentclass[notes=only]{beamer} % only notes +\documentclass{beamer} % only frames +\end{lstlisting} + +and then notes are added with + +\begin{lstlisting} +\begin{frame} + ... +\end{frame} +\note{Some wonderful note.} +\end{lstlisting} + +These have the upside that you have full access to \LaTeX{} formatting when writing your speaker notes, but the downside that they can be cumbersome to work with when presenting. Multiple complications are needed to get notes and presentations in separate PDF files. + +\subsection{PDFPC's \texttt{note}} + +\href{https://pdfpc.github.io/}{PDFPC} is a presenter console with multi-monitor support for PDF files. There's an official package, \pkg{pdfpc}, for adding meta-data to presentation files which are compatible with their presenter console. The screenshot in Figure~\ref{fig:pdfpc} shows how the console looks when viewing the example presentation. + +\begin{figure} + \includegraphics[width=\textwidth]{pdfpc-screenshot.png} + \caption{Speaker notes in PDFPC.}\label{fig:pdfpc} +\end{figure} + +To use this add + +\begin{lstlisting} +\usepackage[overridenote=true]{pdfpc} +\end{lstlisting} +and then it's just \lstinline|\note{Some wonderful note.}| as before. + +These will then be included as ``comments'' within the complied PDF which PDFPC displays as notes in the presenter console. These have the upside that they're smoother to work with when presenting, but the downside that the only formatting supported is \lstinline|\\| for newlines. + +\subsection{Brandt's \texttt{pnote}} + +There are two packages called \pkg{pdfpc-latex-notes}, one by \href{https://github.com/cebe/pdfpc-latex-notes}{Carsten Brandt} and a fork by \href{https://github.com/p4pyru5/pdfpc-latex-notes}{p4pyru5}. These both generate PDFPC compatible notes using \lstinline|\pnote{Some wonderful note.}|. They served as the inspiration for PDFPC's official solution, but each come with their own (varying support for formatting, wider integration, {\it etc\/}). + +\subsection{Usher's \texttt{bnote}} + +The original version of the University of Edinburgh \pkg{beamer} template by \href{https://www.ed.ac.uk/profile/saturnino-luz}{Saturnino Luz} at the \href{https://www.ed.ac.uk/usher}{Usher Institute} included its own package, \pkg{beamernotes}, for generating a PDFPC compatible notes file. + +To use it save \href{https://github.com/Foggalong/edinburgh-math-latex/blob/4ac2ffb765a7d9dc420396dd10bdafcc0c561398/beamernotes.sty}{\texttt{beamernotes.sty}} either to your \LaTeX{} path or local to your project. Then add + +\begin{lstlisting} +\usepackage{beamernotes} +\end{lstlisting} + +to your document header and use + +\begin{lstlisting} +\bnote{Some wonderful note.} +\end{lstlisting} + +to write your notes. This solution had the upside that your notes were included in a separate file still automatically read by PDFPC, but the downside that all formatting was lost {\it including} the ability to write newlines. + +\section{Acknowledgements} + +The original \pkg{beamertheme-edmaths} was written by \href{https://www.ed.ac.uk/profile/saturnino-luz}{Saturnino Luz} for \href{https://www.ed.ac.uk/usher}{Usher}, then modified by \href{https://github.com/bencwbrown}{Ben Brown} with general university branding. Both are freely provided under the terms of the \href{https://choosealicense.com/licenses/lppl-1.3c/}{\LaTeX{} Project Public License v1.3c} and from 2020 onwards have been maintained by \href{https://www.maths.ed.ac.uk/~jfogg/}{Josh Fogg} (me). + +If you have any issues using \pkg{beamertheme-edmaths} don't hesitate to get in touch either by \href{mailto:j.fogg@ed.ac.uk}{email} or on \href{https://github.com/Foggalong/edinburgh-math-latex/issues/new?assignees=&labels=pres&projects=&template=beamer-issue.md&title=}{GitHub}. Feel free pop me a message just to say hi too, it always makes my day! + +\end{document}
\ No newline at end of file diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/pdfpc-screenshot.png b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/pdfpc-screenshot.png Binary files differnew file mode 100644 index 0000000000..59cc944e2f --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/docs/pdfpc-screenshot.png diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-presentation.tex b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-presentation.tex new file mode 100644 index 0000000000..1f67be3c55 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-presentation.tex @@ -0,0 +1,82 @@ +%% This file is an example of using beamerthemeedmaths.sty to style a Beamer +%% presentation. While the style is LPPL 1.3 licensed, this example is given +%% under a 0BSD license (https://choosealicense.com/licenses/0bsd), meaning +%% it can be freely used, copied, modified, and/or redistributed with or +%% without attribution. For instructions on using the style, see the README.md +%% file or https://github.com/Foggalong/edinburgh-math-latex. + +\documentclass[notes]{beamer} +\usetheme{edmaths} +\usepackage{lipsum} +\usepackage[overridenote=true]{pdfpc} + +\pdfcompresslevel=9 +\pdfobjcompresslevel=3 + +\title[Insert Title (short version of title)]{Title of Presentation} +\subtitle{Insert Subtitle (Optional)} % Optional +\author{Author Name} +\date{n\textsuperscript{th} Month YYYY} + +\begin{document} + + +\begin{frame} + \titlepage{} +\end{frame} +\note{ + This generates notes for pdfpc. \\ + \\ + These notes also appear + on the handout/article versions. +} + + +\begin{frame}[t]{Header title bold}\label{sec:Slide1} + Main body text Sans. Here is a way to \alert{highlight text}. + \begin{itemize} + \item Bullet points + \item Sub-lists\ldots + \begin{itemize} + \item subitem + \end{itemize} + \item \lipsum[2] + \end{itemize} +\end{frame} +\note{ + This is a note for the first slide. Mention how something happens. +} + + +\begin{frame}{Inserting a figure, some maths\ldots} + Example of a reference to another part of the presentation (slide~\ref{sec:Slide1}). Also an example of a slide not vertically aligned to top.\newline + + \begin{itemize} + \item Here's a figure: + \begin{figure}[h] + \centering + \colorbox{blue}{\includegraphics[width=.13\linewidth]{images/edinburgh-logo}} + \caption{The University of Edinburgh's logo}\label{fig:edinburgh-logo} + \end{figure} + \item And here's a famous equation: + \begin{eqnarray} + \label{eq:schroedinger} + i\hbar {\frac{\partial}{\partial t}}|\psi (t)\rangle ={\hat{H}}|\psi (t)\rangle + \end{eqnarray} + \end{itemize} +\end{frame} + + +\begin{frame}[t]{References} + The stylesheet {\bf\texttt{edmaths.sty}} provides a styling for LaTeX{} documents which satisfies University of Edinburgh requirements~\cite{koeppe2007}. \newline + + \lipsum[4]\newline + + References can be added to the bottom of slides, or on a new slide. + \vfill + \bibliography{example-references} + \bibliographystyle{ieeetr} +\end{frame} + + +\end{document} diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-references.bib b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-references.bib new file mode 100644 index 0000000000..cd65755781 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/example-references.bib @@ -0,0 +1,10 @@ + This is an example biblography used in example-presentation.tex and + example-report.tex, examples of the edmaths Beamer and report styles + respectively. When creating a biblography you might find these bibtex + templates useful: https://verbosus.com/bibtex-style-examples.html + +@misc{koeppe2007, + title = {Package `edmaths'}, + author = {Thomas Koeppe}, + year = {2007} +} diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/LICENSE.md b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/LICENSE.md new file mode 100644 index 0000000000..ef516053f4 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/LICENSE.md @@ -0,0 +1,5 @@ +# Copyright Notice + +The images `edinburgh-logo` and `white-tied-in` are copyright © The University of Edinburgh 2024. They must not be used as part of derived or independent works without the explicit permission of The University of Edinburgh. Please note that this **does not** affect use as part of compiled LaTeX documents using this stylesheet for the university. + +The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336, VAT Registration Number GB 592 9507 00, and is acknowledged by the UK authorities as a “Recognised body” which has been granted degree awarding powers. diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.pdf b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.pdf Binary files differnew file mode 100644 index 0000000000..f35a67f63f --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.pdf diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.svg b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.svg new file mode 100644 index 0000000000..a4470b6219 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/edinburgh-logo.svg @@ -0,0 +1,8 @@ +<svg width="86.7" height="87.2" version="1.1" viewBox="0 0 86.7 87.2" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> +<style type="text/css"> + .st0{clip-path:url(#SVGID_2_);} + .st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:1;} + .st2{fill:#FFFFFF;} + .st3{fill:none;stroke:#FFFFFF;stroke-miterlimit:1;} +</style> +<path class="st2" d="m73.6 41c0-0.6-0.2-1.2-0.2-1.8-0.1-0.6-0.1-1.3-0.2-1.9-0.4-1.7-0.8-3.3-1.4-4.9-0.1-0.2-0.2-0.4-0.3-0.7-0.2-0.5-0.4-0.9-0.6-1.3-0.1-0.1-0.1-0.3-0.2-0.4-0.2-0.4-0.3-0.8-0.5-1.2-0.1-0.2-0.3-0.4-0.4-0.7-0.1-0.2-0.2-0.5-0.3-0.7-0.4-0.7-0.9-1.3-1.3-1.9-0.2-0.2-0.3-0.4-0.5-0.6s-0.4-0.5-0.6-0.7-0.4-0.3-0.5-0.5c-0.1-0.1-0.1-0.2-0.2-0.4s-0.3-0.3-0.4-0.4l-0.2-0.2c-0.2-0.2-0.4-0.5-0.6-0.7s-0.4-0.4-0.6-0.5l-0.6-0.6c-0.3-0.2-0.5-0.4-0.8-0.6s-0.5-0.5-0.8-0.7c-0.2-0.1-0.4-0.2-0.5-0.3-0.2-0.2-0.4-0.3-0.7-0.5-0.2-0.1-0.3-0.3-0.5-0.4-0.1-0.1-0.2-0.1-0.4-0.2s-0.3-0.2-0.5-0.3c-0.5-0.3-1.1-0.6-1.7-0.9-0.2-0.1-0.4-0.3-0.6-0.4-0.4-0.2-0.7-0.4-1.1-0.5-0.3-0.1-0.6-0.2-0.9-0.4-0.1-0.1-0.3-0.2-0.4-0.2s-0.2-0.1-0.3-0.1c-0.2-0.1-0.4-0.2-0.5-0.2-0.6-0.2-1.1-0.3-1.7-0.5-0.3-0.1-0.6-0.2-0.8-0.3-0.6-0.2-1.2-0.3-1.8-0.4l-1.2-0.3c-0.3 0-0.5-0.1-0.8-0.1-0.4-0.1-0.9-0.2-1.4-0.2h-0.5c-0.1 0-0.2 0-0.4-0.1h-0.7c-0.5 0-1.1-0.1-1.7-0.1-0.2 0.1-0.5 0-0.8 0h-0.9-0.2-0.6c-0.1 0-0.2 0.1-0.3 0.1h-0.3-0.3-0.2c-0.1 0-0.3 0-0.4 0.1-0.3 0-0.7 0-0.9 0.2h-0.2c-0.2 0-0.4 0-0.6 0.1-0.5 0-0.9 0.2-1.3 0.3-0.4 0-0.7 0-0.9 0.2-0.2 0-0.4 0-0.5 0.1-0.3 0-0.6 0.2-0.8 0.3s-0.3 0.1-0.5 0.1c-0.3 0-0.6 0.2-0.8 0.3s-0.3 0.1-0.5 0.2c-0.9 0.4-1.8 0.8-2.7 1.3-0.2 0.1-0.3 0.2-0.4 0.3-1.1 0.5-2.1 1.1-3 1.9-0.3 0.2-0.5 0.4-0.8 0.6l-0.4 0.4c-0.3 0.2-0.5 0.4-0.8 0.6-0.5 0.4-1 0.9-1.5 1.4-0.3 0.3-0.6 0.5-0.9 0.8-0.1 0.1-0.2 0.2-0.3 0.4l-0.4 0.4c-0.2 0.2-0.4 0.5-0.6 0.7s-0.4 0.4-0.5 0.6c-0.1 0.1-0.2 0.2-0.2 0.3-0.3 0.4-0.6 0.7-0.9 1.1l-0.6 0.9c-0.3 0.3-0.6 0.8-0.8 1.2-0.1 0.1-0.1 0.2-0.2 0.4-0.2 0.3-0.4 0.6-0.5 0.9-0.2 0.3-0.3 0.7-0.4 1-0.1 0.1-0.1 0.2-0.2 0.4-0.2 0.3-0.3 0.6-0.4 0.9-0.1 0.2-0.1 0.4-0.2 0.6l-0.3 0.6c-0.1 0.2-0.1 0.4-0.2 0.7-0.1 0.2-0.2 0.5-0.3 0.7-0.4 1.4-0.8 2.9-1.1 4.4 0 0.3-0.1 0.6-0.1 0.9s-0.2 0.7-0.2 1 0 0.6-0.1 0.8c0 0.2 0 0.4-0.1 0.6v3.6c0 0.6 0.1 1.2 0.2 1.7v0.7c0.1 0.8 0.2 1.6 0.3 2.3 0.1 0.2 0.1 0.4 0.2 0.6 0.1 0.6 0.3 1.2 0.4 1.8 0.1 0.1 0.1 0.3 0.2 0.4 0 0.1 0.1 0.3 0.1 0.4 0.2 0.6 0.5 1.3 0.7 1.9 0.1 0.2 0.2 0.5 0.3 0.7s0.1 0.3 0.2 0.5l0.6 1.2c0.2 0.3 0.4 0.6 0.5 1 0.1 0.1 0.1 0.2 0.1 0.4l0.2 0.2c0.1 0.1 0.1 0.3 0.2 0.4 0.2 0.3 0.3 0.5 0.5 0.8 0.1 0.2 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.4 0.5 0.6 0.1 0.2 0.2 0.3 0.3 0.5 0.2 0.3 0.4 0.5 0.6 0.8 0.2 0.2 0.4 0.4 0.5 0.7 0.2 0.2 0.4 0.5 0.7 0.7 0.2 0.2 0.3 0.5 0.6 0.7 0.3 0.3 0.6 0.6 0.9 0.8l0.4 0.4c0.2 0.2 0.5 0.4 0.8 0.6 0.2 0.2 0.5 0.4 0.7 0.7 0.2 0.1 0.3 0.3 0.5 0.4 0.2 0.2 0.4 0.4 0.6 0.5 0.3 0.2 0.5 0.4 0.8 0.6l0.6 0.3c0.2 0.1 0.4 0.3 0.6 0.4s0.4 0.2 0.6 0.4c0.8 0.5 1.6 0.9 2.4 1.3 0.4 0.2 0.7 0.4 1.1 0.5s0.7 0.3 1.1 0.4c0.1 0 0.3 0.1 0.4 0.1 0.3 0.1 0.7 0.3 1 0.4 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.6 0.3 0.9 0.3 0.4 0.1 0.8 0.1 1.1 0.2 0.6 0.1 1.1 0.3 1.7 0.4h0.6c0.3 0 0.6 0.1 0.8 0.1h0.7c0.1 0 0.3 0 0.4 0.1h0.4c0.3 0.1 0.7 0.1 1 0.2h0.5 0.3c0.3 0 0.7 0 1 0.1h0.6c0.4 0 0.8-0.1 1.1-0.1h0.5c0.2 0 0.5-0.1 0.7-0.1l2.4-0.3c0.3-0.1 0.5-0.1 0.8-0.2s0.7-0.1 1-0.2c0.2 0 0.3-0.1 0.5-0.2 0.3-0.1 0.5-0.2 0.8-0.2 0.1 0 0.2-0.1 0.4-0.1 0.2-0.1 0.4-0.1 0.6-0.1 0.4-0.1 0.8-0.3 1.2-0.4 0.2-0.1 0.5-0.2 0.7-0.3s0.5-0.2 0.7-0.3c0.1 0 0.1-0.1 0.2-0.1 0.2-0.1 0.5-0.2 0.7-0.3 0.3-0.2 0.5-0.3 0.8-0.5 0.1-0.1 0.3-0.1 0.4-0.2 0.4-0.2 0.8-0.5 1.2-0.7 0.3-0.2 0.7-0.4 1-0.6s0.6-0.5 0.9-0.7 0.6-0.5 1-0.7l0.2-0.2c0.1 0 0.2-0.1 0.2-0.1 0.3-0.2 0.5-0.5 0.8-0.7l0.6-0.6c0.2-0.2 0.4-0.4 0.7-0.6 0.1-0.1 0.1-0.2 0.2-0.3 0.2-0.2 0.4-0.3 0.5-0.5 0.1-0.1 0.2-0.3 0.3-0.4 0.4-0.4 0.8-0.8 1.1-1.2 0.3-0.3 0.5-0.6 0.8-1 0.2-0.2 0.4-0.5 0.5-0.8l0.3-0.3c0.3-0.4 0.6-0.8 0.9-1.2 0.1-0.1 0.1-0.3 0.2-0.4s0.1-0.2 0.2-0.3 0.1-0.2 0.2-0.4c0.2-0.3 0.4-0.7 0.6-1s0.3-0.5 0.5-0.8c0.1-0.3 0.2-0.5 0.3-0.8s0.3-0.6 0.4-0.8c0.4-1.2 0.9-2.4 1.2-3.6 0-0.1 0.1-0.3 0.1-0.4 0.1-0.5 0.2-0.9 0.3-1.4 0-0.2 0.1-0.5 0.1-0.7 0.1-0.4 0.1-0.8 0.2-1.2 0-0.3 0-0.6 0.1-1 0-0.1 0-0.2 0.1-0.4v-0.8c0-0.1 0.1-0.3 0.1-0.4v-0.6c0.1-1.7 0.2-3 0.1-4.2m-36.3-25.8c0.3 0 0.5-0.1 0.7-0.2 0.4-0.1 0.8-0.2 1.2-0.2h0.9c0.4 0 0.8-0.1 1.2-0.2h0.5c0.2 0 0.4 0 0.6-0.1h1.2c0.2 0 0.5 0 0.7 0.1 0.2 0 0.4 0.1 0.5 0.1h0.8 0.4 0.5c0.2 0 0.4 0.1 0.7 0.1h0.3c0.1 0 0.2 0.1 0.3 0.1s0.2 0.1 0.4 0.1c0.5 0.1 1 0.1 1.5 0.2h0.1c0 0.1-0.8 0-1 0h-0.3-0.7-0.3-0.4-0.3c-0.3 0-0.8-0.1-1.1 0-0.3 0-0.6 0-0.9-0.1-0.1 0-0.4-0.1-0.5 0h-0.4c-0.2 0-0.3-0.1-0.5 0-0.1 0-0.2 0-0.3 0.1h-2.1c-0.1 0-0.3 0-0.4-0.1h-1c-0.2 0-0.7-0.1-0.8 0-0.5 0.1-1 0.1-1.5 0.1zm-3.8 1.1c0.1 0 0.3-0.2 0.4-0.2s0.2-0.1 0.3-0.1c0.1-0.1 0.2-0.1 0.3-0.1 0.3-0.1 0.7-0.2 1-0.3h0.7 0.9 0.5 0.8 1.1c1.3 0 2.6 0.1 3.9 0.1h0.6 0.9c1.5 0 3-0.1 4.5 0h1.5 0.6c0.4 0.1 0.8 0.4 1.2 0.5 0.2 0 0.8 0.1 1 0.3h-0.1-0.2-0.6c-0.2 0-0.4-0.1-0.6-0.1h-0.6-0.3-0.6-0.4-0.6c-0.3 0-1-0.1-1.2 0-0.1 0-0.3-0.1-0.4 0-0.2 0-0.3 0-0.5-0.1h-0.6-0.4-0.5-0.5-1.4-0.5-0.3-0.3c-0.4 0-0.8-0.1-1.2-0.1h-1.4c-0.2 0-0.6-0.1-0.7 0h-1.1-0.4-0.2-1.5-0.2-0.6-0.3c-0.6 0.2-1.3 0.2-2 0.1zm-2.1 0.9c0.1-0.1 0.2-0.1 0.2-0.2 0.7-0.4 1.6-0.2 2.4-0.2h1.4 0.4 0.8 2.9 0.6 0.8 0.3 0.3 0.4c0.5 0 0.9 0.1 1.4 0.1 0.2 0 0.5-0.1 0.7-0.1 0.6 0 1.2 0.1 1.8 0.1 0.3 0 0.6-0.1 0.9-0.1h1.5 0.8 3.3c0.2 0 0.3 0.1 0.5 0.1s0.5 0 0.7-0.1c0.3 0 0.8 0.1 1.1 0 0.4 0 0.7 0.2 1 0.4 0.3 0.1 0.7 0.2 0.9 0.4v0.1h-0.1-0.5-0.6-0.2c-0.2 0-0.9-0.1-1 0h-0.4-0.7c-0.2 0-0.4-0.1-0.6 0h-0.6-0.9c-0.3 0-0.8-0.1-1.1 0h-0.2-0.7-0.3c-0.2 0-0.5-0.1-0.7 0h-0.6-0.4-1-0.4-1.1-0.4-0.9-1.1-0.3-0.9-0.4-0.2-0.3c-1.2 0-2.3-0.1-3.5-0.1h-0.5c-0.1 0-0.3-0.1-0.4 0h-0.7-1.5c-0.2 0-0.8-0.1-0.9 0h-0.7-0.2c-0.3 0-0.5-0.1-0.8-0.1 0-0.1 0.6-0.3 0.7-0.3m-2.7 1.5c0-0.1 0.2-0.1 0.2-0.2 0.1-0.1 0.3-0.2 0.4-0.2 0.1-0.1 0.3-0.2 0.4-0.2 0.4-0.1 1.1-0.1 1.5-0.1h1.3 1.1 0.4c0.7-0.1 1.5 0 2.2 0h1.1c0.5 0 0.9 0.1 1.4 0.1h0.8c0.4 0 0.7-0.1 1.1-0.1 0.8 0 1.6 0.1 2.3 0.1h0.3 0.4 0.6 0.7 0.8c0.5 0 1 0.1 1.6 0.1 0.2 0 0.4-0.1 0.7-0.1h0.5 0.2c0.1 0 0.3 0.1 0.4 0.1h0.6 0.8c0.2 0 0.4-0.1 0.6 0h0.9 0.5 1.8 0.8 1.7 0.8c0.1 0 0.2 0.1 0.3 0.2 0.2 0.2 0.5 0.3 0.7 0.5 0 0.1-0.4 0.1-0.5 0.2h-0.4-0.4-0.5-0.3-1.1-0.4-0.4-0.2-2.7c-0.2 0-0.6-0.1-0.8 0h-0.5c-0.2 0-0.6-0.1-0.8 0h-0.4c-0.2 0-0.5-0.1-0.7 0h-0.5c-0.2 0-0.4-0.1-0.5 0h-0.2-1.2-0.5c-0.2 0-0.7-0.1-0.9 0h-0.3c-0.2 0-0.4-0.1-0.6 0h-0.4-1.8c-0.3 0-0.8-0.1-1.1 0h-0.2c-0.2 0-0.5 0-0.7-0.1h-1.7c-0.2 0-0.3-0.1-0.5-0.1h-1.1-0.3-1.7-0.9c-0.2 0-0.6-0.1-0.8 0h-0.3-0.3-0.8-0.4-0.3c-0.3 0-0.6 0-1-0.1-0.3 0-0.6 0-0.8-0.1v0m-1.7 1.2s0.2-0.1 0.2-0.2c0.3-0.2 0.5-0.3 0.8-0.5 0.2-0.1 0.4-0.1 0.6-0.1s0.5 0 0.7 0.1h1.4 0.7 0.7 0.6c0.3 0 0.6 0.1 1 0.1 0.5 0 1-0.1 1.4 0h0.4 1.1 2.1 1.6 1.1 0.4c0.3 0 0.6 0.1 0.9 0.1 0.4 0 0.8-0.1 1.2-0.1 0.3 0 0.6 0 1 0.1h1 0.4 0.4 0.9 1.5c0.3 0 0.6 0 0.9-0.1h2.1 0.4 2.2c0.3 0 0.7-0.1 1 0 0.4 0 0.7 0.1 1.1 0.1 0.3 0 0.7-0.1 1-0.1 0.2 0 0.4 0 0.6-0.1 0.3 0 0.6 0 0.8 0.1 0.1 0 0.2 0.2 0.3 0.2s0.1 0.1 0.2 0.1c0.2 0.1 0.3 0.3 0.5 0.4l-0.1 0.1h-0.6c-0.2 0-0.4-0.1-0.6 0h-0.2-1.3-1.2-0.4-0.3-0.6-0.7-0.6c-0.2 0-0.3-0.1-0.5 0h-1.5-0.5-0.3-1.1-0.4c-0.4 0-1-0.1-1.3 0h-0.7-1.8c-0.2 0-0.6-0.1-0.8 0h-0.3-0.9-2.5-1.3-0.4-0.4-0.8-0.2-0.8-0.4-1.2c-0.1 0-0.3-0.1-0.4 0h-1.7c-0.1 0-0.3-0.1-0.4 0h-0.3-2.1c-0.3 0-1-0.1-1.2 0h-0.2-1.1c-0.3-0.1-0.7-0.1-1.1-0.2zm-1.7 1.2c0.1 0 0.1-0.1 0.2-0.1 0.2-0.1 0.7-0.6 0.9-0.6h1.2 0.7 0.7 1.2c0.8 0 1.5 0.1 2.2 0.1h0.5 1.2c0.2 0 0.4 0 0.6 0.1h0.7 0.7c0.6 0 1.1-0.1 1.7-0.1h0.8 0.4 0.8c0.4 0 0.9 0.1 1.3 0.1h0.7 0.8 0.4 0.3 0.4 1 0.3c0.2 0 0.4 0 0.6 0.1h0.8 0.5 1.1 0.6 1.1 0.5 0.4 0.7c0.5 0 1 0.1 1.5 0.1 0.9 0 1.7-0.1 2.6-0.1h0.8 0.5 1.3c0.3 0 0.6 0 0.9 0.1 0.2 0 0.4 0 0.5-0.1h0.5c0.3 0 0.6 0 1 0.1 0.1 0 0.8 0.5 0.8 0.7h-0.1-0.6c-0.4 0-0.9-0.1-1.2 0.1h-0.2-0.4c-0.3 0-0.8-0.1-1 0-0.2 0-0.4 0-0.6-0.1h-1.2c-0.2 0-0.6-0.1-0.8 0h-2.4-1.1-0.4-0.9c-0.2 0-0.4-0.1-0.5 0h-0.8-0.3-0.2-1-0.4c-0.2 0-0.9-0.1-1 0-0.2 0-0.7-0.1-0.8 0h-0.2c-0.3 0-0.6-0.1-1-0.1h-0.3c-0.3 0-0.7-0.1-1 0h-0.2c-0.2 0-0.6-0.2-0.8-0.1h-1-0.3c-0.2 0-0.6-0.1-0.8 0h-0.2-1.2-0.4-0.7-0.4-0.3c-0.1 0-0.3 0-0.4 0.1h-0.4c-0.2 0-0.6-0.2-0.8-0.1h-1-0.3-0.3-0.2c-0.5 0-0.9 0-1.3-0.1h-0.3-1.3c-0.2 0-0.6-0.1-0.8 0h-0.4c-0.1 0-0.4-0.1-0.5 0h-0.2-1.2-0.4c-0.8-0.1-1.3-0.1-1.9-0.1zm47 22c0 0.1-0.1 0.1-0.2 0.1h-0.4c-0.2 0-0.5-0.1-0.6 0h-2.4c-0.2 0-0.6-0.1-0.7 0-0.2 0-0.7-0.1-0.8 0-0.2 0-0.4-0.1-0.6 0h-0.9-1.3v0.4h0.2 0.7 0.5 0.8 2.8 1.3 0.7 0.5 0.3c0.1 0 0 0.7 0 0.8h-0.4c-0.2 0-0.7-0.1-0.8 0h-0.5-0.7-1.3-0.3-1.5c-0.2 0-0.5-0.1-0.7 0h-0.7c-0.1 0-0.3-0.1-0.5 0h-0.3v-0.1 0.5h0.1 0.6 0.6 1.1 0.5 0.8 0.3 0.5 0.3 0.3 0.6 0.8c0.2 0 1.1-0.1 1.3 0.1 0.1 0.1 0 0.7 0 0.8 0 0-0.2 0-0.3 0.1h-0.2-1.2-0.4-1.2-0.3-0.3-0.4-0.8c-0.1 0-0.3-0.1-0.5 0h-2-0.2v0.4h0.2 1.4 0.5c0.8 0 1.5 0.1 2.3 0.1h0.9 1.9 0.4c0 0.2 0 0.6-0.1 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.6-0.1-0.7 0h-0.3-0.2c-0.7 0-1.5-0.1-2.2-0.1-0.2 0-0.5-0.1-0.7 0-0.2 0-0.6-0.1-0.7 0h-1.8-0.6v0.4c0.1-0.1 0.5 0 0.7 0h1.6c0.3 0 0.8 0 1.1-0.1 0.4 0 0.7 0 1.1 0.1h1 1c0.3 0 0.7-0.1 1 0 0.2 0 0.1 0.6 0 0.7s-0.2 0.1-0.2 0.1h-0.2-1.5c-0.2 0-0.5-0.1-0.7 0h-0.7-1.7-0.5-0.4c-0.5 0-1 0-1.5-0.1v0.4h0.1 1.1 0.5 0.4 0.6c0.3 0 1 0.1 1.2 0h0.4 0.7 1.4c0.2 0 0.7 0 0.8 0.1 0.1 0 0 0.6 0 0.7 0 0-0.1 0-0.1 0.1-0.2 0-1-0.1-1.1 0h-0.6-0.8-0.4c-0.1 0-0.3 0-0.4 0.1-0.2 0-0.3 0-0.5-0.1h-0.8-0.4c-0.1 0-0.3 0-0.4-0.1h-1.3-0.3v0.4h0.8 0.5 1.6c0.4 0 1 0.1 1.4 0h0.8 0.4 0.4 1.4c0 0.2 0 0.4-0.1 0.5 0 0.1-0.1 0.2-0.1 0.3h-0.7-0.6-0.8-0.6c-0.2 0-0.5-0.1-0.7 0h-0.3c-0.3 0-0.6 0-0.8-0.1-0.8 0-1.6-0.1-2.4-0.1v0.4h0.2 0.3 1 0.9 0.8c0.5 0 1 0.1 1.4 0.1 0.3 0 0.6-0.1 0.9-0.1 0.2 0 1.2-0.1 1.3 0.1 0.1 0.1 0 0.2 0 0.3 0 0.2-0.1 0.4-0.2 0.5-0.5 0-1.1-0.1-1.6 0h-0.3c-0.2 0-1-0.1-1.1 0h-0.7c-0.2 0-0.4-0.1-0.6 0-0.2 0-0.5-0.1-0.7 0-0.6 0-1.1-0.1-1.7-0.1v0.4h1.1c0.3 0 0.7 0.1 1.1 0.1h1.8 0.5 0.3 0.3c0.3 0 1.3 0 1.4 0.1s0 0.2 0 0.3-0.1 0.2-0.2 0.3h-0.4-0.3-0.2c-0.2 0-0.7-0.1-0.8 0h-0.3-1.1-0.4c-0.2 0-0.4-0.1-0.6 0-0.2 0-1.8 0-2.2-0.1v0.5c0.2 0 0.3-0.1 0.5-0.1h2 0.5 1 0.5 0.8 0.3c0.2 0 0.4 0 0.6 0.1 0 0.1-0.2 0.6-0.3 0.7-0.1 0-0.2 0.1-0.3 0.1h-0.8-0.4-0.3-0.2-0.8c-0.1 0-0.3-0.1-0.4 0h-0.2-0.8c-0.2 0-0.5-0.1-0.7 0h-0.3c-0.1 0-0.6 0-0.7-0.1v0.5c0.1-0.1 0.9-0.1 1.1-0.1h0.4 1 0.6 0.5 0.9c0.2 0 0.8-0.1 1.1 0 0.1 0.1-0.1 0.4-0.1 0.4-0.1 0.1-0.1 0.3-0.3 0.3h-0.2c-0.2 0-0.3 0-0.5-0.1h-1-0.3c-0.2 0-0.6-0.1-0.8 0h-0.2-0.5-0.4-1.3v0.5c0.2 0 0.3-0.1 0.4-0.1h0.9 0.4 1.8 0.8 0.5c0.1 0 0.2 0 0.3 0.1s-0.1 0.6-0.2 0.6l-0.2 0.2h-0.6c-0.2 0-0.6-0.1-0.8 0h-0.7-0.6c-0.2 0-0.4-0.1-0.6 0h-1.4v0.4h0.4 0.6c0.2 0 0.4 0 0.6-0.1 0.3 0 0.6 0 0.9 0.1h0.7c0.3 0 0.6 0.1 0.9 0 0.2 0 0.4 0.1 0.6 0.1 0 0.2-0.3 0.7-0.5 0.8h-0.6c-0.3 0-1-0.1-1.2 0h-1.5c-0.2 0-0.5 0-0.7-0.1v0.4h0.7 0.4c0.4 0 0.7 0.1 1.1 0.1h1.1c0.2 0 0.4 0 0.5 0.1 0 0-0.4 0.8-0.7 0.8s-0.9 0-1.2-0.1c-0.5 0-0.9 0-1.4-0.1h-0.7v0.4c0.8 0 1.7 0 2.4 0.1 0.2 0 0.4 0 0.7 0.1v0.1c-0.1 0-0.1 0.1-0.1 0.1-0.5 0.3-0.7 0.7-0.9 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.6-0.1-0.7-0.1-0.2 0-0.6-0.1-0.8 0h-0.8v0.4h1.2 0.5 0.7c0 0.2-0.4 0.7-0.6 0.7h-0.4-1.4v0.4h0.3c0.2 0 1.1 0 1.1 0.1 0.1 0.2-0.4 0.6-0.5 0.7h-0.9c0 0.2-0.1 0.3-0.1 0.4h0.7c0 0.2-0.8 0.9-1 1h-0.1c-0.4 0.6-0.9 1.1-1.7 1.7-0.6 0.5-1.3 0.9-2 1.2h0.1c0.4 0-0.5 0.6-0.6 0.6h-0.9-0.1c-0.6 0.2-1.3 0.4-2 0.5h0.5 0.6 0.3 0.4 0.4v0.1c-0.2 0.2-0.4 0.3-0.6 0.4-0.1 0.1-0.2 0.2-0.4 0.3-0.1 0-0.2 0.1-0.4 0.1h-0.3-2c-0.2 0-0.7-0.1-0.9 0-0.3 0-0.6-0.1-0.8 0h-0.6c-0.4 0-0.7-0.1-1.1-0.1h-0.2-1.7c-0.2 0-0.5 0.1-0.7 0.1-0.7 0.1-1.2 0.2-1.7 0.4h1.7 1.2 2.9 1c0.2 0 0.3 0 0.5-0.1h2.2c-0.1 0-0.3 0.2-0.4 0.2-0.3 0.1-0.6 0.3-0.9 0.4-0.2 0.1-0.4 0.2-0.6 0.2-0.4 0.1-0.8 0-1.2 0h-0.4-0.5-0.6c-0.2 0-0.5-0.1-0.7 0h-1.2-0.6-0.4-0.7c-0.2 0-0.8-0.1-1 0-0.5 0-1.3-0.1-1.9-0.1-0.2 0.2-0.4 0.3-0.5 0.5h0.8c0.7-0.1 1.5 0 2.3 0h1.2 0.7 0.4c0.2 0.1 0.7 0 0.9 0 0.4 0 0.8 0.1 1.1 0.1 0.2 0 0.4 0 0.5-0.1h0.7-0.1c-0.3 0.1-0.5 0.2-0.8 0.3-0.1 0.1-0.3 0.1-0.4 0.2-0.2 0.1-0.4 0.1-0.6 0.2h-0.8-0.5-0.4-0.4-0.2-0.7c-0.1 0-0.4-0.1-0.5 0h-0.4-0.6-0.3-0.4-0.2c-0.2 0-0.8-0.1-1 0h-0.4-0.8c-0.1 0.1-0.1 0.3-0.2 0.4 0.6-0.1 1.4 0 1.9 0s1 0 1.5-0.1c0.2 0 0.4 0 0.6-0.1h1.1 1.1c-0.3 0-0.6 0.2-0.9 0.2-0.2 0-0.4 0-0.6 0.1-0.3 0-0.6 0.1-0.9 0.2h-0.2c-0.2 0-0.3 0-0.5 0.1-0.1 0-0.5 0.1-0.6 0.1h-0.5-0.7-0.2-1.2c-0.6 0-1.2 0.1-2 0h-0.2c-0.3-0.1-0.7-0.1-1-0.2h-0.5c-0.2 0-0.4-0.1-0.7-0.1h-0.6c-1.1-0.2-2.3-0.3-3.3-0.6-0.2 0-0.6-0.1-0.7-0.2 0.5 0.1 1.1 0.1 1.6 0.1s0.9 0.1 1.4 0.1h0.4 0.4 0.6 0.4c0.2 0 0.3 0.1 0.5 0.1h1.4c-0.1-0.2-0.2-0.3-0.3-0.5h-0.7c-0.2 0-0.4-0.1-0.6 0h-1.3c-0.2 0-0.3-0.1-0.5 0-0.4 0-0.8-0.1-1.3-0.1h-1.8c-0.2 0-0.4-0.1-0.6-0.1h-0.4c-0.2 0-0.4-0.1-0.5-0.1-0.1-0.1-0.2-0.1-0.4-0.1s-0.4-0.1-0.6-0.1-0.4-0.1-0.6-0.2c-0.1 0-0.2-0.1-0.3-0.1h0.3 1.2c0.3 0 0.6 0 0.9-0.1h1.2c0.2 0 0.3 0 0.5 0.1 0.3 0 0.6-0.1 0.9-0.1 0.4 0 0.9 0.1 1.3 0.1h1.5 0.9c-0.1-0.1-0.3-0.2-0.5-0.4h-0.4-0.3c-0.3 0-0.6 0-0.9-0.1h-0.3c-0.1 0-0.3-0.1-0.5 0h-1-0.4-1c-0.2 0-0.5-0.1-0.7-0.1s-0.4 0-0.5 0.1h-0.7c-0.7 0-1.5 0-2.1-0.1-0.3 0-0.6 0-0.8-0.1-0.4-0.1-0.8-0.5-1.2-0.7v-0.1h1.3c0.2 0 0.5 0.1 0.7 0.1h0.9 0.7 0.4 0.7 2.1 1.6 0.2 0.4c-0.4-0.2-0.9-0.3-1.4-0.4h-0.2-1.1-0.4-0.3-1.1-0.7-0.6-1.4-0.5-0.7c-0.2 0-0.3-0.1-0.5-0.1-0.3 0-0.7 0-1-0.1s-0.5-0.3-0.7-0.4c-0.1-0.1-0.3-0.1-0.3-0.3 0.6 0 1.3 0 1.9 0.1h1.3 0.6c-1.1-0.1-2-0.3-2.8-0.4h-0.4-0.5-0.2c-0.4 0-0.7-0.1-0.9-0.3l-0.2-0.2h0.3c-1.2-0.4-2.1-1-2.9-1.7-0.5-0.5-0.9-1.1-1.2-1.8h-0.2c-0.2 0-0.7-0.6-0.8-0.8 0 0 0.2 0 0.2-0.1h0.5c0-0.1 0-0.2-0.1-0.3h-1c-0.1 0-0.7-0.6-0.7-0.7v-0.1h0.5 1v-0.4h-0.2-0.3c-0.1 0-0.5-0.1-0.6 0h-0.2-0.7c-0.2-0.1-0.6-0.6-0.6-0.8h0.2 0.5c0.2 0 0.5 0 0.7-0.1h1v-0.4h-0.3-0.4-0.4-0.5-0.3c-0.1 0-0.2 0-0.3 0.1-0.2 0-0.4 0-0.5-0.1-0.1 0-0.5-0.6-0.4-0.7s0.7-0.1 0.8-0.1h2.3v-0.4h-0.9-0.3c-0.2 0-0.5-0.1-0.6 0-0.2 0-0.7-0.1-0.9 0h-0.4c-0.1 0-0.2 0-0.3-0.1s-0.1-0.2-0.2-0.3c-0.1-0.2-0.3-0.4-0.3-0.7 0.2 0 0.4 0.1 0.7 0.1h0.6 1 0.5c0.3 0 0.7 0.1 1 0h0.3v-0.4h-0.8-0.3-1.2-0.4-0.6-0.3-0.4c-0.1 0-0.2 0-0.3-0.1-0.2-0.1-0.4-0.6-0.5-0.8 0 0 0.1 0 0.1-0.1 0.4 0 0.7 0.1 1.1 0.1h0.3 0.3 0.6c0.2 0 0.4-0.1 0.7 0 0.2 0 0.3 0.1 0.5 0.1s0.7-0.1 1 0v-0.4h-0.2-3-0.4-0.6-0.3c-0.1 0-0.3 0-0.4-0.1-0.2-0.1-0.3-0.5-0.3-0.7h0.6 0.5 0.9 0.4 0.4c0.3 0 0.7 0 1 0.1h0.5c0.3 0 0.6 0.1 1 0.1v-0.5h-0.1-1-1c-0.2 0-0.3 0-0.5-0.1h-0.9c-0.2 0-0.5-0.1-0.6 0h-1.2c0-0.1-0.1-0.1-0.1-0.2-0.1-0.1-0.2-0.4-0.1-0.5l0.1-0.1h0.9 0.6 0.4 0.3 0.8 1.3c0.3 0 0.8 0.1 1.1 0.1v-0.4c-0.5 0-1.7-0.1-1.9 0h-0.9-1.1c-0.2 0-0.4 0-0.6-0.1h-0.4c-0.1 0-0.3-0.1-0.4 0h-0.2c-0.1 0-0.2 0-0.3-0.1s-0.3-0.6-0.2-0.7c0.3-0.2 0.9 0 1.3-0.1 0.4 0 0.7 0 1.1 0.1h0.8c0.1 0 0.3 0 0.4 0.1h1.9 0.7v-0.5h-0.3-1-0.5-1.2c-0.1 0-0.4-0.1-0.5 0h-0.8c-0.2 0-0.8-0.1-1 0-0.2 0-0.4 0-0.5-0.1-0.2 0-0.6 0-0.8-0.1-0.1-0.1-0.1-0.2-0.1-0.4 0-0.1-0.1-0.2-0.1-0.2 0.1-0.1 0.7-0.1 0.9-0.1h0.7 1.3 0.3 0.8 0.6 0.5 1.1 0.5v-0.4h-0.5-0.3-0.5-1.1-0.6-0.6c-0.2 0-0.6-0.1-0.8 0-0.3 0-0.5 0-0.8-0.1-0.3 0-1.3 0.1-1.5-0.1-0.1-0.1-0.2-0.6-0.2-0.7h0.5c0.4 0 0.8 0 1.2 0.1 0.1 0 0.2 0 0.3 0.1h1c0.3 0 0.5-0.1 0.8-0.1h0.6 0.5 1c0.2 0 0.9-0.1 1.2 0v-0.4h-0.3-0.8-0.6-0.2c-0.3 0-0.8-0.1-1 0h-0.5c-0.3 0-0.8-0.1-1 0-0.3 0-0.7-0.1-0.9 0-0.2 0-0.8-0.1-1 0-0.2 0-0.8 0-0.9-0.1s-0.1-0.2-0.1-0.3-0.1-0.2 0-0.3h0.1 0.6 1.5 0.6c1.1 0.1 2.2 0 3.4 0h1.1v-0.4h-0.5-1c-0.2 0-0.4 0-0.5 0.1h-0.3c-0.3 0-1.1-0.1-1.3 0-0.2 0-0.4-0.1-0.7-0.1-0.8 0-1.7 0-2.5-0.1-0.1 0-0.4 0-0.5-0.1s-0.1-0.5-0.1-0.7h1.6c0.3 0 0.7 0.1 0.9 0 0.4 0 0.9 0.1 1.3 0.1h0.6c0.3 0 0.5 0 0.8 0.1 0.1 0 0.2-0.1 0.4-0.1h0.7 0.2 0.8v-0.4h-0.4-0.5-0.9-0.5c-0.1 0-0.7-0.1-0.8 0h-0.5c-0.1 0-0.3-0.1-0.4 0-0.5 0-0.9-0.1-1.4-0.1h-0.4-0.7c-0.2 0-0.8 0-0.9-0.2-0.1-0.1-0.1-0.2-0.1-0.3s0-0.3 0.1-0.3c0.2-0.1 0.5 0 0.8 0h2.1 0.6 0.7 0.3 1 0.4 1.2 0.5v-0.4h-1c-0.2 0-0.7-0.1-0.9 0-0.2 0-0.7-0.1-0.8 0h-0.5-1.1-0.6c-0.2 0-0.7-0.1-0.9 0-0.3 0-0.6-0.1-0.9-0.1h-0.2-0.3c-0.6 0-0.6-0.1-0.6-0.7h0.1 0.4c0.3 0 0.9 0.1 1.2 0h0.7 0.7 0.5 0.3 1.6 0.4 0.5 0.4 1v-0.4h-0.5-0.7-0.4-0.6c-0.2 0-0.4-0.1-0.5 0h-0.7-3.2-0.6c-0.1 0-0.2 0-0.3-0.1-0.1 0-0.2 0-0.3-0.1s-0.1-0.6-0.1-0.8c0.2 0 0.4 0 0.5-0.1 0.3 0 0.8 0.1 1.1 0h0.4 0.3 0.7 0.5 0.5 0.4 3.5v-0.4h-0.6-1.2-0.5c-0.2 0-0.4-0.1-0.5 0h-1.7-0.3-1.6c-0.2 0-0.4-0.1-0.5 0h-0.2c-0.2 0-0.5 0-0.7-0.1-0.1-0.1-0.1-0.6 0-0.7s0.1-0.1 0.2-0.1c0.8 0 1.6 0 2.4 0.1h0.6 2 0.4 0.3 1.4 0.5v-0.4c-0.2 0-0.4-0.1-0.6 0h-2.6c-0.2 0-0.7-0.1-0.8 0h-3.1c-0.2 0-0.5 0-0.8-0.1 0-0.1 0-0.2-0.1-0.3 0-0.2 0-0.4 0.1-0.5 1.1 0 2.2 0.1 3.3 0.1h0.4c0.3 0 0.6 0.1 1 0.1h0.4 0.9c0.2 0 1.5 0 2 0.1v-0.5h-0.3-0.5-0.4-1.2-0.4-1.1-1.6c-0.2 0-0.6-0.1-0.7 0h-0.6c-0.4 0-0.7-0.1-1.1-0.1 0-0.2 0-0.7 0.1-0.7h0.4 0.3 0.4 1 0.8 1 1.8 2v-0.4h-0.2-0.4c-0.1 0-0.3-0.1-0.4 0-0.2 0-0.5-0.1-0.7 0-0.4 0-0.7 0-1-0.1h-0.4-0.5c-0.2 0-0.5-0.1-0.6 0h-0.8-0.4-0.9c-0.1 0-0.3-0.1-0.4 0h-0.9v-0.1c0-0.2 0-0.7 0.2-0.7h1.2 0.6 1.5 0.8 0.3c0.2 0 0.4 0 0.6 0.1h2.4v-0.4h-0.6-2.3c-0.3 0-0.9-0.1-1.1 0-0.1 0-0.3-0.1-0.4 0h-0.2-1c-0.4 0-0.7-0.1-1.1-0.1h-0.3c-0.2 0-0.5 0-0.7-0.1-0.1 0 0-0.1 0-0.1 0.1-0.5 0.1-0.6 0.7-0.6h0.4 0.5c0.3 0 0.7 0 1.1 0.1h0.5c1.5 0 3.1 0 4.6 0.1v-0.4h-0.3-1.2-0.6-0.5c-0.2 0-0.5-0.1-0.7 0-0.4 0-0.9 0-1.3-0.1h-0.4c-0.2 0-0.7-0.1-0.8 0h-1.6v-0.1c0-0.2 0-0.6 0.2-0.6 0.2-0.1 0.5-0.1 0.7-0.1h1 0.3c0.8 0.1 1.6 0.1 2.4 0.1h0.7 1 0.5 0.8v-0.4h-0.3-0.5-1.4c-0.1 0-0.4-0.1-0.5 0h-2.9-1.2c-0.2 0-0.3 0-0.4-0.1 0-0.1 0.1-0.5 0.2-0.6 0.1 0 0.1-0.1 0.2-0.1 0.6 0 1.2 0 1.8 0.1h0.7c0.1 0 0.3-0.1 0.4 0 0.8 0 1.6 0.1 2.4 0.1h0.7 0.9v-0.4h-0.6-0.4-1.5c-0.2 0-0.5-0.1-0.6 0-0.6 0-1.2 0-1.8-0.1-0.2 0-0.6-0.1-0.7 0h-0.2c-0.4 0-0.7-0.1-1.1-0.1 0-0.2 0.1-0.6 0.3-0.7 0.1-0.1 0.2 0 0.2-0.1 0.1 0 0.2 0 0.4 0.1h0.4 0.6 0.7c0.5 0 1 0.1 1.5 0.1h1.8 1.1v-0.4c-0.3 0-0.7 0-0.9 0.1h-0.5-0.5-0.3-0.6-0.3-1.9c-0.2 0-0.6-0.1-0.8 0-0.2 0-0.8 0-0.9-0.1s0.1-0.6 0.1-0.6c0.1-0.1 0.2-0.1 0.3-0.1 0.3 0 0.6 0.1 1 0.1h1 0.3 0.6 0.7 0.9 1.6v-0.4h-0.5c-0.2 0-0.7-0.1-0.9 0-0.1 0-0.3-0.1-0.4 0h-0.3c-0.4 0-0.7-0.1-1.1-0.1h-0.4-0.6-0.3-0.3c-0.3 0-1 0.1-1.2-0.1 0-0.2 0.2-0.6 0.3-0.7 0.5 0 1 0.1 1.5 0.1h1.4c0.1 0 0.3 0 0.4 0.1h0.6 0.4 1.1 0.5v-0.4h-0.3-1.3-1.1c-0.2 0-0.6-0.1-0.8 0-0.1 0-0.2 0-0.3 0.1-0.2 0-0.5-0.1-0.7-0.1h-1.1c0-0.2 0.1-0.3 0.2-0.5 0-0.1 0-0.2 0.1-0.3 0-0.1 0.1-0.1 0.2-0.1h1 0.6c0.5 0 1 0.1 1.4 0.1h0.9c0.5 0 1 0 1.4 0.1v-0.4c-0.2 0.1-1.1 0.1-1.3 0-0.2 0-0.5-0.1-0.6 0h-0.6-0.4-1.6c-0.2 0-0.4-0.1-0.6-0.1 0-0.3 0.2-0.6 0.3-0.8 0.2 0 0.4 0.1 0.6 0h1.5 0.4 1.7c0.3 0 0.5 0.1 0.8 0.1v-0.4h-0.2c-0.2 0-0.5-0.1-0.7 0h-1.2c-0.2 0-0.6-0.1-0.7 0h-0.2c-0.3 0-0.7 0-1-0.1-0.2 0-0.4 0-0.6-0.1v-0.1c0-0.1 0.2-0.5 0.3-0.6 0 0 0.1-0.1 0.2-0.1h1.3 1.7 1.2v-0.4h-0.3-0.5c-0.2 0-0.6-0.1-0.8 0-0.2 0-0.5-0.1-0.7 0-0.3 0-0.7-0.1-0.9 0h-0.4-0.4c0-0.1 0.3-0.7 0.4-0.8 0.2-0.1 0.6 0 0.8 0h1.2 0.7 0.3 0.5 0.1v-0.4h-0.1c-0.2 0-0.4 0-0.5 0.1h-0.4c-0.2 0-0.4-0.1-0.6 0h-0.2-0.2-0.4-0.9c-0.1 0 0-0.2 0-0.2 0.1-0.1 0.3-0.5 0.4-0.6s0.3-0.1 0.4-0.1h0.6 1 0.4 0.4v-0.4h-0.2-0.8-0.3c-0.2 0-0.6-0.1-0.8 0h-0.3c0-0.2 0.1-0.3 0.2-0.4s0.1-0.3 0.3-0.3h0.3 1 0.5 0.3v-0.4c-0.2 0-0.5-0.1-0.7 0h-0.2c-0.2 0-0.5 0-0.6-0.1 0-0.2 0.3-0.3 0.4-0.4s0.2-0.3 0.3-0.4h0.9v-0.3h-0.5v-0.1s0.5-0.6 0.6-0.7c0.2-0.4 1.5-1.4 1.7-1.6 0.2-0.1 0.4-0.3 0.6-0.4 0.3-0.1 0.7 0 1.1 0h1.4 1.3 0.8 2.9 0.3 0.6c0.6 0 1.2-0.1 1.8 0 0.7 0 1.4 0.1 2.1 0.1 0.4 0 0.8-0.1 1.2 0 0.3 0 0.5 0.1 0.8 0.1h2.1 1.4 0.4 0.7 0.4 0.3 0.5c0.2 0 0.4 0.1 0.6 0.1h0.6 2.3 0.8c0.5 0 0.9-0.1 1.4-0.1s0.9 0.1 1.4 0h0.7 0.5 2.1 1.9 0.4c0.5 0 1 0.1 1.6 0 0.2 0 0.4-0.1 0.7-0.1 0.2 0 0.4 0 0.6-0.1h1.3c0.2 0 0.5-0.1 0.7 0 0.1 0 0.2 0.1 0.2 0.2 0.4 0.3 1.3 1.1 2 1.8v0.1h0.1c0.2 0.1 0.5 0.4 0.4 0.5 0 0.1-0.2 0.1-0.3 0.1h-0.3v0.4c0.3 0 0.6 0 0.9 0.1 0.2 0.1 0.6 0.6 0.6 0.8h-0.2c-0.1 0-1 0-1.3-0.1v0.4h1.7 0.3c0.1 0.1 0.2 0.3 0.3 0.4 0 0.1 0.2 0.2 0.1 0.3 0 0.1-0.1 0.1-0.1 0.1h-1.3-0.4-0.6v1.7h1.8c0.3 0 0.7 0 0.9 0.1 0.1 0.1 0.4 0.6 0.5 0.8 0 0-0.1 0-0.1 0.1-0.2 0-0.7-0.1-0.8 0h-0.5c-0.2 0-0.5-0.1-0.7 0h-0.2c-0.3 0-0.6 0-0.9-0.1v0.4c0.8 0 1.8 0.1 2.6 0.1 0.2 0 0.9-0.1 1 0s0.1 0.2 0.2 0.3c0 0.1 0.1 0.1 0.1 0.2s0.1 0.2 0.1 0.3c-0.1 0-0.1 0-0.2 0.1-0.3 0-0.8-0.1-1-0.1h-0.2-0.5-1.3-0.5-0.4v0.4h0.4 0.8 0.5 1.9 0.7c0.2 0.1 0.2 0.3 0.3 0.4s0.1 0.2 0 0.3h-0.3c-0.2 0-0.5-0.1-0.6 0h-0.3c-0.2 0-0.6-0.1-0.7 0h-0.8-0.3-0.7-0.3-0.4v0.4c0.3-0.1 0.7-0.1 0.9-0.1h0.1c0.4 0.1 0.8 0 1.1 0h2.1c0.2 0 0.4-0.1 0.5 0s0.3 0.5 0.3 0.7c0.1 0-0.2 0.1-0.2 0.1h-0.7c-0.2 0-0.5-0.1-0.7 0h-0.9-0.2c-0.2 0-0.8-0.1-0.9 0h-1.4v0.4h0.5 1c0.3 0 0.5 0.1 0.8 0.1h0.7 1.4 0.5 0.4c0.1 0 0.3 0.7 0.3 0.8-0.2 0.1-0.7 0-0.9 0h-0.4-0.2-0.5c-0.2 0-0.6-0.1-0.8-0.1-0.1 0-0.2 0-0.3 0.1h-1-0.4c-0.2 0-0.4-0.1-0.6 0h-0.6v0.3h0.7 0.4 0.5 1.9c0.4 0 1 0.1 1.4 0 0.2 0.1 0.9-0.1 1 0.1 0.1 0.1 0.1 0.3 0.2 0.5s0.1 0.2-0.1 0.3h-1.2c-0.2 0-0.5-0.1-0.6 0h-0.7-0.3-0.5-0.6-0.3c-0.3 0-0.7-0.1-0.9 0h-0.7v0.4c0.3-0.1 1 0 1.2 0h1.2 0.8 0.6 0.5c0.4 0 0.8 0 1.2-0.1h0.3c0.2 0 0.4 0 0.5 0.1s0.3 0.6 0.1 0.7-0.5 0-0.7 0h-1.6-0.6-0.4c-0.2 0-0.8-0.1-1 0h-0.5c-0.2 0-0.4-0.1-0.6 0-0.4 0-0.7-0.1-1.1-0.1v0.4h0.5 0.9 1.7 0.3 0.3 0.9 0.4 0.5 0.6c0.1 0 0.3 0 0.4 0.1 0.2 0.1 0.2 0.5 0.3 0.7h-0.3-0.1-0.3-1.2-0.4-0.3-1.1c-0.2 0-0.4-0.1-0.6 0h-0.7-1-1v0.4h0.2 0.6 1.1 0.8 0.6 0.8 0.8 0.6c0.2 0 0.6 0.1 0.8 0 0.2 0 0.4 0 0.6 0.1 0.1 0.1 0.2 0.5 0.2 0.7 0 0-0.1 0-0.1 0.1h-0.5-0.6-2-0.8c-0.2 0-0.8-0.1-1 0h-1.5-0.5-0.3v0.4h0.4c0.5-0.1 0.9 0 1.4 0h2c0.4 0 0.9 0.1 1.2 0 0.3 0 2.1 0 2.3 0.1 0.1 0.2 0.1 0.5 0.1 0.7 0 0-0.1 0-0.2 0.1h-1.3c-0.1 0-0.3-0.1-0.4 0h-0.5c-0.2 0-0.7-0.1-0.9 0h-0.6-2.2c-0.2 0-0.4-0.1-0.5 0-0.1 0-0.7 0-0.9-0.1v0.4h0.6 0.5 0.6 0.5 1.8 0.4c0.5 0 1 0.1 1.5 0h0.5c0.2 0 1 0 1.1 0.1s0.2 0.5 0.2 0.7h-0.1-0.6c-0.2 0-0.5-0.1-0.7 0h-0.6-0.3c-0.4 0-0.7-0.1-1-0.1h-1.2-0.3-0.4-0.8c-0.1 0-0.3-0.1-0.4 0h-1.2v0.5c-0.8-0.2-0.6-0.2-0.4-0.2 0.3 0 0.5 0.1 0.8 0.1h0.8c0.3 0 0.6 0 0.9-0.1h3.3c0.2 0 1.3 0 1.4 0.1s0 0.2 0 0.3 0.1 0.3 0 0.4c-0.1 0.2-0.8 0-1 0.1h-0.3-0.9c-0.2 0-0.5-0.1-0.6 0-0.2 0-0.8-0.1-0.9 0-0.2 0-0.5-0.1-0.7 0h-1.4-0.4-0.5-0.4-0.4v0.4c0.3-0.1 0.8 0 1.1 0h0.6 1.2 0.7 1.3 2.2c0.3 0 0.5 0 0.8 0.1 0 0.2 0.2 0.6 0 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.4 0-0.6 0.1h-0.9-0.3-0.4c-0.3 0-0.7-0.1-1 0-0.3 0-0.6-0.1-0.9 0h-0.7c-0.2 0-0.6-0.1-0.7 0h-0.7-0.4-1v0.4h0.1c0.5 0 1-0.1 1.6-0.1h1.1c0.2 0 0.3 0.1 0.5 0h0.4 1.8 1.3 0.4c0.1 0 0.6 0 0.7 0.1v0.3c-0.3-0.1-0.3 0-0.4 0.1"/><path class="st2" d="m62.9 28.8v-0.8-0.8-0.4-1.2-1.8c0-0.2 0-0.4-0.1-0.6h-0.4-0.4-0.6c-0.4 0-0.9-0.1-1.3 0h-0.8-0.4-0.4-0.4c-0.2 0-0.3-0.1-0.5-0.1h-0.7-0.5-0.7c-0.3 0-0.7 0-1-0.1h-0.6c-0.2 0-0.3-0.1-0.5-0.1h-1.4-0.3-1.5-0.7-3.3-0.6-1.2-0.6c-0.3 0-0.5 0-0.8-0.1h-0.7-0.8c-0.4 0-0.7 0.1-1.1 0.1h-1.2-1.9-0.6-1.4-0.8c-0.2 0-0.4-0.1-0.7-0.1h-0.8-0.6-1.9-1.5-0.9-1.4c-0.5 0-1 0.1-1.5 0-0.4-0.1-0.9 0-1.3 0h-0.1c-0.1 0.2 0 0.5 0 0.7v0.8 1.2 1 2.8 0.5 0.8 1.1 3.3c0 0.2 0 0.5-0.1 0.7v0.8 0.4 1.9 0.8c0 0.3-0.1 0.6-0.1 0.9v0.7 0.6 1.1 0.5 0.6 0.7 0.9c0 0.4-0.1 0.8-0.1 1.2v0.4 0.8 0.7c0 1.8-0.1 3.5-0.1 5.2v1.2 1.9 0.4c0 0.6-0.1 1.3-0.1 1.9v0.5c0 0.9 0 1.7 0.2 2.5 0.1 0.2 0.1 0.3 0.2 0.5 0.1 0.3 0.2 0.7 0.4 1 0.3 0.4 0.6 0.8 1 1.1 0.1 0 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.3 0.2 0.2 0.1 0.3 0.1 0.5 0.2s0.5 0.2 0.7 0.3 0.5 0.1 0.7 0.2c0.4 0.1 0.9 0.3 1.4 0.4s0.9 0.1 1.4 0.2c1.4 0.2 2.8 0.4 4.2 0.5h0.9c0.4 0 0.8 0.1 1.2 0.1l1.2 0.3c0.2 0 0.4 0.1 0.6 0.1s0.4 0.1 0.6 0.1c0.2 0.1 0.4 0.2 0.5 0.2 0.2 0.1 0.3 0.1 0.5 0.2 0.8 0.3 1.5 0.9 2.2 1.5 0.2 0.3 0.4 0.5 0.6 0.8 0.1 0.2 0.2 0.3 0.3 0.5 0 0 0 0.1 0.1 0.1 0.3-0.8 0.7-1.5 1.3-2.1 0.2-0.2 0.5-0.3 0.8-0.5s0.6-0.5 1-0.5c0.2-0.1 0.4-0.1 0.5-0.2 0.2-0.1 0.5-0.2 0.8-0.2 0.1 0 0.2-0.1 0.2-0.1 0.1-0.1 0.3-0.1 0.4-0.1h0.2c0.1 0 0.1-0.1 0.2 0 0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.2-0.1 0.3-0.1 0.1-0.1 0.2-0.1 0.3-0.1h0.2c0.1-0.1 0.2-0.1 0.3-0.1h0.2 0.2 0.2 0.2c0.1-0.1 0.4 0 0.5 0h0.2 0.3c0.2-0.1 0.4 0 0.6 0h0.2c0.2-0.1 0.4-0.1 0.6-0.1 0.1 0 0.2-0.1 0.3-0.1s0.2-0.1 0.3-0.1h0.2c0.1-0.1 0.3 0 0.4 0s0.2-0.1 0.3-0.1c0.1-0.1 0.3 0 0.5 0 0.1-0.1 0.5-0.2 0.7-0.2 0.1 0 0.2-0.1 0.3-0.1h0.2c0.2-0.1 0.3-0.1 0.6-0.1 0.1-0.1 0.3-0.1 0.4-0.1 0.1-0.1 0.4-0.2 0.5-0.2s0.2-0.1 0.2-0.1c0.3-0.1 0.6-0.2 0.9-0.3s0.7-0.3 1-0.4c0.2-0.1 0.3-0.1 0.5-0.2 0.3-0.1 0.5-0.3 0.7-0.5 0.1-0.1 0.3-0.2 0.4-0.3 0.2-0.2 0.4-0.3 0.6-0.6s0.4-0.8 0.5-1.1c0-0.2 0.1-0.4 0.1-0.6s0.1-0.4 0.1-0.5v-0.9-1-0.3-0.5-1.7-1.4-0.6-0.3-0.8-1.6-2.2c0-0.2 0-0.4 0.1-0.6v-1.1c0-0.2 0-0.3 0.1-0.5 0-0.3-0.1-0.6-0.1-0.9 0-0.8 0.1-1.5 0.1-2.3 0-0.3-0.1-0.6-0.1-0.8v-0.6-0.3-0.5-0.3-0.8c0-0.5 0-1.1 0.1-1.6v-0.4-0.3-0.6-0.8-0.7-0.3c0-0.5-0.1-1-0.1-1.5v-0.8-0.4c0-0.3 0-0.7-0.1-1v-0.6-0.8-0.7-0.7-0.4c-0.2 0-0.2-0.3-0.2-0.7m-0.7 9.7v0.2 0.4 0.4 2.2 0.3 0.4 0.3 0.3 0.3 0.6c0 0.3 0.1 0.6 0.1 0.9v0.4 0.3 0.4 0.2 0.5c0 1.7 0 3.4-0.1 5.1v1.8 0.5 2.1c0 0.2-0.1 0.4-0.1 0.6s0.1 0.3 0.1 0.5 0 0.3-0.1 0.5v0.2 0.2 0.3 0.7 0.3 0.6c0 0.6 0 1.2-0.1 1.8v0.4c0 0.3-0.2 0.6-0.3 0.9-0.3 0.5-0.9 0.9-1.4 1.2-0.3 0.2-0.5 0.4-0.8 0.5-0.3 0.2-0.7 0.3-1.1 0.4s-0.9 0.3-1.3 0.4c-0.2 0-0.3 0.1-0.5 0.1-0.5 0.1-0.9 0.2-1.4 0.3h-0.3c-0.3 0.1-0.6 0.1-1 0.2-0.4 0-0.7 0.1-1.1 0.1s-0.8 0.1-1.2 0.1h-1c-0.3 0-0.5 0.1-0.8 0.1h-0.5c-0.6 0.1-1.2 0.3-1.9 0.4-0.3 0.1-0.7 0.1-1 0.2-0.2 0.1-0.3 0.1-0.5 0.2-0.1 0-0.3 0.1-0.4 0.1-0.9 0.5-1.7 1.1-2.3 1.9-0.1 0.1-0.1 0.2-0.2 0.3 0 0-0.2 0.1-0.2 0.2h-0.1c-0.1-0.1-0.2-0.2-0.2-0.3-0.3-0.3-0.5-0.6-0.8-0.8-0.2-0.2-0.5-0.3-0.8-0.5-0.1-0.1-0.3-0.2-0.4-0.3-0.2-0.1-0.5-0.2-0.7-0.4-0.3-0.1-0.7-0.2-1-0.4-0.2-0.1-0.4-0.1-0.7-0.2-0.1 0-0.2-0.1-0.3-0.1-0.4-0.1-0.7-0.1-1-0.2-0.1 0-0.2-0.1-0.4-0.1h-0.4c-0.3 0-0.5-0.1-0.8-0.1h-0.8c-0.1 0-0.3-0.1-0.4-0.1h-1c-0.7-0.1-1.4-0.2-2-0.3-0.3 0-0.6 0-1-0.1-0.3 0-0.7-0.1-1-0.2-0.4-0.1-0.8-0.1-1.2-0.2-0.5-0.1-1-0.4-1.5-0.6-0.7-0.3-1.5-0.8-1.9-1.5-0.6-1-0.6-2.4-0.6-3.7 0-0.2-0.1-0.3 0-0.5 0-0.1 0-0.3 0.1-0.4v-0.4-1-0.8-0.3-0.3-0.7c0-0.5 0.1-1 0.1-1.5 0-1.2 0-2.3 0.1-3.4v-0.5-1c0-0.3 0.1-0.6 0.1-0.9v-3.8c0-0.3 0-0.6 0.1-0.9v-0.7-2.1-1c0-0.2 0-0.5 0.1-0.7v-1.4-3.2c0-0.1 0-0.3 0.1-0.4v-0.2-0.7-1.9-1.1c0-0.2 0-0.3 0.1-0.5v-0.5c0-0.2 0.1-0.3 0.1-0.5v-2-0.7-0.5-0.5c0-0.2-0.1-0.9 0.1-1.1 0.1-0.1 0.3 0 0.5 0 0.2-0.1 0.7 0 1 0 0.2-0.1 0.4 0 0.6 0h2c0.1-0.1 0.4 0 0.6 0 0.2-0.1 0.4 0 0.6 0h0.3c0.2-0.1 0.4 0 0.6 0 0.5 0 1 0.1 1.5 0.1 0.2-0.1 0.6 0 0.9 0 0.2-0.1 0.7 0 0.9 0h1.1c0.1-0.1 0.3 0 0.4 0h0.9c0.2-0.1 0.4 0 0.6 0h0.3c0.3 0 0.6 0.1 0.9 0.1 0.1-0.1 0.3 0 0.5 0h0.4 0.5c0.2-0.1 0.8 0 1.1 0h0.6 0.3 0.6 2.3 0.3 0.2c0.3-0.1 0.8 0.1 1.1 0.1h0.2 0.2c0.2-0.1 0.5 0 0.7 0h1.6c0.2 0 0.4 0.1 0.6 0.1h0.3c0.1-0.1 0.3 0 0.4 0h0.8 0.2c0.3-0.1 0.6 0 0.9-0.1 0.4 0 0.7 0.1 1 0.1h0.7 0.2c0.2-0.1 0.6 0 0.8 0h1c0.1-0.1 0.6 0 0.7 0h1.9c0.2 0 0.4 0 0.5 0.1h0.4 0.3 1 1.5s0.3-0.1 0.3 0v1.5 1.5 2.8c-0.1 1.7 0 3.3 0 5v0.7c0 0.3-0.1 0.6 0 0.9v0.4 1.1c-0.4 0-0.4 0.2-0.4 0.5"/><path class="st2" d="m46.5 61.8c-0.1-0.3-0.2-0.5-0.2-0.7 0-0.1 0-0.2-0.1-0.3 0-0.1-0.1-0.1-0.2-0.1-0.1 0.1-0.2 0.1-0.2 0.2 0 0.2 0.1 0.4 0.2 0.6s0.2 0.5 0.3 0.8c0.1 0.2 0.1 0.3 0.2 0.5 0.1 0.1 0.3 0.3 0.5 0.2 0.1 0 0-0.2-0.1-0.3-0.2-0.3-0.3-0.6-0.4-0.9"/><path class="st2" d="m35.7 48.8c0.1-0.2 0.2-0.4 0.3-0.5s0.2-0.2 0.3-0.2c0.1-0.1 0.2-0.2 0.3-0.4 0.1-0.1 0.2-0.1 0.2-0.2 0.1-0.3 0.1-1 0.1-1.3v-0.9-0.6-1.2-0.6c0-0.5 0.1-1.1 0-1.6v-1.5-0.5-0.4-1-0.5-0.8c0-0.2 0.1-0.5 0-0.7-0.2 0.1-1 0.9-1 1.2-0.1 0.2 0 0.6 0 0.9 0 0.4-0.1 0.8-0.1 1.2v0.3 0.6c0 0.3-0.1 0.6-0.1 1v0.6 0.6 0.8c0 0.4-0.1 0.9-0.1 1.3 0 0.3 0 0.6 0.1 0.8 0 0.2-0.1 0.5-0.1 0.7s0.1 0.4 0 0.6c0 0.3-0.1 0.6-0.1 0.9 0.2 0.4 0.2 0.9 0.2 1.4"/><path class="st2" d="m49.8 49.1c0-0.3-0.2-0.5-0.4-0.7-0.1-0.1-0.2-0.3-0.4-0.4-0.3-0.2-0.6-0.4-1-0.4h-0.6c-0.1 0.1-0.3 0-0.4 0.1-0.2 0.1-0.5 0.1-0.7 0.2-0.7 0.2-1.3 0.5-1.9 0.8-0.2 0.1-0.4 0.3-0.6 0.4s-0.3 0.4-0.6 0.5c-0.2 0-0.3-0.2-0.4-0.3-0.1 0-0.1-0.1-0.2-0.1-0.3-0.2-0.5-0.5-0.8-0.6-0.5-0.3-0.9-0.3-1.5-0.4-0.2 0-0.3-0.1-0.5-0.1-0.8-0.2-1.9-0.2-2.6 0.3-0.2 0.1-0.3 0.2-0.4 0.4-0.3 0.2-0.4 0.3-0.5 0.6 0 0.1-0.1 0.2-0.1 0.3 0.1 0.1 0.3 0.1 0.4 0.1 0.1-0.1 0.4 0 0.5 0h1.4c0.1-0.1 0.3-0.1 0.5-0.1h1 0.4c0.4 0 0.8 0.1 1.3 0.1h0.1 0.6c0.1 0 0.1 0 0.2 0.1s0 0.3 0.1 0.4c0.1 0.4 0.4 0.6 0.8 0.6 0.5 0 0.8-0.4 0.8-0.9v-0.2c0.1-0.1 0.2-0.1 0.4-0.1h0.2 0.2c0.1-0.1 0.5 0 0.7 0 0.1 0 0.2-0.1 0.3-0.1 0.2-0.1 0.4-0.1 0.6-0.1h0.2c0.2-0.1 0.4 0 0.6 0 0.2-0.1 0.4-0.1 0.6-0.1h1.7c-0.2-0.3 0-0.2 0-0.3"/><path class="st2" d="m37.3 46.6v0.7h0.3c0.1 0 0.2-0.1 0.3-0.1s0.2-0.1 0.3 0h0.2c0.3-0.1 0.9 0 1.2 0.1s0.6 0 0.9 0.1c0.4 0.1 0.9 0.3 1.3 0.5 0.1 0.1 0.8 0.6 0.8 0.6 0.2-0.3 0.2-0.6 0.2-0.9 0.1-0.4 0.1-0.8 0.1-1.2 0-0.6 0.1-1.2 0.1-1.9v-0.8-2.3c0-1.2 0.1-2.4 0-3.6 0-0.4 0-0.8-0.2-1.1-0.4-0.6-1-0.8-1.6-1-0.2-0.1-0.3-0.1-0.5-0.2-0.2 0-0.4-0.1-0.6-0.1-0.3-0.1-0.6-0.1-0.9-0.1h-1.3c-0.1 0.1-0.3 0-0.4 0.2s0 0.6 0 0.8v2.2 1.3c0 0.4-0.1 0.7-0.1 1.1 0 0.3 0.1 0.5 0.1 0.8v1.7c0 0.2 0 0.5-0.1 0.7v1.4c0 0.2 0 0.5-0.1 0.7-0.1 0 0 0.2 0 0.4m4.6-0.7c-0.4-0.2-0.9-0.4-1.4-0.5-0.2-0.1-0.3-0.1-0.5-0.1-0.3-0.1-0.5-0.1-0.8-0.2-0.3 0-0.6-0.1-0.9-0.1h-0.1c-0.2-0.1-0.2-0.6 0.1-0.6 0.2 0 0.4 0.1 0.6 0.1s0.4 0.1 0.6 0.1c0.2 0.1 0.3 0.1 0.5 0.2 0.5 0.2 0.9 0.3 1.3 0.5 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.6 0.4 0.8 0.6 0.1 0.1 0.2 0.1 0.2 0.2-0.3 0-0.5-0.2-0.7-0.3m0.6-2.9c-0.1 0-0.1 0 0 0-0.3 0.1-1-0.6-1.2-0.7-0.3-0.1-0.5-0.2-0.8-0.3-0.4-0.1-0.7-0.3-1.1-0.4-0.2 0-0.3 0-0.5-0.1-0.2 0-0.6 0-0.7-0.1-0.2-0.2-0.1-0.6 0.2-0.6 1.2 0.1 2.2 0.6 3.1 1.2 0.3 0.1 0.9 0.5 1.1 0.8-0.1 0.1 0 0.2-0.1 0.2m-4.4-5.4c0.4 0 0.7 0.1 1 0.2 0.1 0 0.2 0 0.3 0.1 0.2 0.1 0.4 0.2 0.6 0.2 0.2 0.1 0.4 0.1 0.6 0.2 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.5 0.2 0.8 0.4 0.2 0.1 1.1 0.6 0.9 0.8 0 0.1-0.1 0.1-0.2 0-0.2 0-0.3-0.2-0.4-0.2-0.2-0.1-0.3-0.2-0.5-0.3-0.8-0.4-1.8-0.7-2.7-0.9-0.3-0.1-0.6-0.1-0.8-0.2-0.1 0-0.1-0.3 0.1-0.4"/><path class="st2" d="m44.3 31c0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.3-0.2 0.3-0.3 0.1-0.2-0.1-0.6-0.3-0.7h-0.2c0 0.2 0.1 0.2 0.1 0.4 0 0.1-0.1 0.2-0.2 0.3s-0.1 0.4 0 0.4"/><path class="st2" d="m44.9 28.4c-0.2-0.1-0.4-0.1-0.6-0.2s-0.3-0.2-0.5-0.2c-0.1 0-0.2 0.1-0.2 0.2 0 0.2 0.2 0.3 0.3 0.4s0.2 0.3 0.3 0.3 0.2-0.1 0.3-0.2 0.2-0.1 0.3-0.2c0.2 0 0.2-0.1 0.1-0.1"/><path class="st2" d="m43.7 32.2c0.2 0.1 0.6 0 0.6-0.2s-0.2-0.3-0.3-0.3c-0.1 0.1-0.5 0.4-0.3 0.5"/><path class="st2" d="m48.8 35.6c-0.1-0.1-0.3 0-0.4 0h-0.5c-0.2 0.1-0.4 0-0.7 0.1-1 0.2-1.9 0.3-2.7 0.8-0.2 0.1-0.4 0.2-0.6 0.4-0.1 0.1-0.1 0.3-0.1 0.5-0.1 0.5-0.1 0.9-0.1 1.4 0 0.2 0 0.5-0.1 0.7v1.1c0 0.1 0 0.3-0.1 0.4v1 1.5 1.5 0.4 0.2 0.7c0 0.7 0 1.5 0.2 2l0.1 0.1c0.3-0.1 0.6-0.3 0.8-0.5 0.2-0.1 0.5-0.2 0.8-0.3 0.3-0.2 0.4-0.3 0.8-0.3 0.1-0.1 0.4-0.1 0.6-0.1h0.2 0.2c0.3-0.1 0.9 0 1.2 0.1 0.1 0 0.3 0.1 0.4 0.1 0.1-0.4 0-0.9 0-1.3v-0.7-0.8-0.4-1-0.6-1.1-0.5-2-0.6-1.5c0-0.2-0.1-0.3-0.1-0.5v-0.6c0.1-0.1 0.1-0.2 0.1-0.2m-4.8 6.8c0.6-0.6 1.5-0.9 2.2-1.2 0.2-0.1 0.5-0.3 0.8-0.3 0.1-0.1 0.3-0.2 0.4-0.2 0.2 0 0.3 0.1 0.3 0.3s-0.1 0.3-0.2 0.4c-0.2 0.2-0.5 0.2-0.8 0.3s-0.6 0.2-0.9 0.3c-0.2 0.1-0.4 0.1-0.6 0.2-0.4 0.1-0.7 0.3-1 0.5-0.1 0.1-0.2 0.2-0.4 0.2h-0.1c0-0.3 0.2-0.5 0.3-0.5m3.7 2.1c-0.2 0.1-0.5 0.1-0.8 0.2-0.2 0-0.5 0.1-0.7 0.2-0.8 0.2-1.4 0.5-2.1 0.9-0.1 0-0.3 0.3-0.4 0.1-0.1-0.1 0.1-0.2 0.2-0.3 0.3-0.2 0.5-0.4 0.8-0.6s0.6-0.4 1-0.5c0.1-0.1 0.2-0.1 0.3-0.2 0.4-0.2 0.9-0.3 1.3-0.4 0.1 0 0.3 0 0.4 0.1 0.3 0.1 0.2 0.4 0 0.5m0.1-6.5c-0.1 0.1-0.3 0.1-0.4 0.1-0.3 0.1-0.6 0.2-0.9 0.3-0.4 0.1-0.8 0.3-1.2 0.5-0.3 0.2-0.5 0.3-0.8 0.5 0 0-0.4 0.2-0.4 0.1 0-0.3 0.4-0.5 0.6-0.6 0.1-0.1 0.2-0.1 0.3-0.2 0.3-0.2 0.6-0.3 0.8-0.5 0.3-0.1 0.6-0.2 0.9-0.3 0.1-0.1 0.2-0.1 0.3-0.1 0.1-0.1 0.3-0.1 0.4-0.1h0.3c0.3 0 0.2 0.2 0.1 0.3"/><path class="st2" d="m43.2 30.7c-0.1 0-0.1 0-0.2-0.1-0.1 0-0.2 0.1-0.2 0.2v0.3c0 0.2 0 0.4 0.1 0.5s0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1c0.2 0 0.6-0.3 0.6-0.5-0.1 0-0.6-0.5-0.7-0.6"/><path class="st2" d="m50.6 38.5c0-0.2-0.1-0.5-0.1-0.7v-0.4-0.3h-0.1c-0.1 0.5 0 1.1 0 1.6 0 0.2-0.1 0.4-0.1 0.6v0.3 0.3c-0.1 0-0.2 0-0.2-0.1v-0.5-0.3c0-0.6 0.1-1.3 0.1-1.9v-0.3-0.2h-0.1c0 0.5-0.1 0.9-0.1 1.3 0 0.1 0 0.2-0.1 0.2h-0.1c-0.1-0.4-0.1-0.8-0.1-1.2 0-0.2 0-0.4-0.1-0.6-0.1 0.1-0.1 0.3-0.1 0.5v0.7c0 0.2 0.1 0.5 0 0.7-0.1 1.5-0.1 3-0.1 4.6v0.9c0 0.3-0.1 0.5-0.1 0.8v1.2c0 0.4-0.1 0.8 0 1.2 0 0.1 0 0.2 0.1 0.2 0.1-0.2 0.1-0.5 0.1-0.7 0-0.4 0.1-0.8 0.1-1.3 0-0.3-0.1-0.6 0-0.9 0 0 0-0.1 0.1 0 0.1 0 0.1 0.2 0.1 0.3 0.1 0.3 0 0.6 0 1v0.8 0.9 0.4c0 0.1 0 0.3 0.2 0.3v-1.4-0.6c0-0.2 0-0.4 0.1-0.6 0-0.1 0-0.3 0.1-0.4 0-0.2-0.1-0.4-0.1-0.6v-0.9-0.5c0-0.1 0.1-0.1 0.1-0.1 0.1 0.1 0.2 0.2 0.2 0.3v1.1 0.3c0 0.3 0.1 0.6 0.1 0.9v0.4 1.6c0 0.4 0 0.8 0.1 1.2v0.2h0.1c0.1-0.2 0.1-0.5 0.1-0.8s0.1-0.6 0-1c0-0.2-0.1-0.4-0.1-0.6s0.1-0.4 0.1-0.6c0-0.3-0.1-0.6-0.1-1 0-0.3 0-0.7 0.1-1v-0.8-0.3c0-0.2 0-0.3 0.1-0.5v-0.8-1.3c-0.3-0.7-0.3-1.1-0.3-1.6m-0.9 4.1s-0.2 0.2-0.2 0.1v-0.3-0.8-1c0-0.3 0-0.6 0.1-0.8 0.1 0 0.1 0.1 0.2 0.2 0.1 0.3 0 0.6 0 0.9-0.1 0.6 0 1.3-0.1 1.7m0-3.8c-0.2 0-0.2-0.2-0.1-0.3 0.1 0 0.2 0.3 0.1 0.3m0.4 3.2c-0.1-0.2-0.1-0.4-0.1-0.7s-0.1-0.6 0.1-0.9c0.1 0 0.1 0 0.2 0.1 0.1 0.2 0.1 1.5-0.2 1.5"/><path class="st2" d="m46.7 56.2h0.3 0.7 0.2c-0.2-0.3-0.6-0.6-0.9-0.9l-2.1-2.1c-0.1-0.1-0.3-0.3-0.5-0.4l-0.7-0.7c-0.1-0.1-0.3-0.3-0.5-0.4v0.1c-0.1 0-0.2 0.1-0.3 0.2-0.3 0.3-0.5 0.6-0.8 0.8l-2.4 2.4c-0.1 0.1-1 1-1 1.1 0.6 0.1 1.3 0 1.9 0h0.7c0.1 0 0.3 0 0.4 0.1v0.1c-0.1 0.1-1.2 1.4-1.2 1.4v0.1h2.2 0.1c-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.2-0.4-0.5-0.5-0.8 0-0.1-0.1-0.2 0-0.2 0.1-0.3 1.4-0.1 1.7-0.1 0.2-0.1 0.6 0 0.8 0 0.3 0 0.7-0.1 1.1 0 0.1 0 0.1 0.1 0.1 0.2 0 0.2-0.5 0.9-0.6 1.2 0 0.1-0.1 0.1-0.1 0.2h1.2 0.7 0.1c0-0.2-0.7-1-0.8-1.2-0.1-0.1-0.2-0.2-0.2-0.3 0-0.4 0.4-0.3 0.7-0.3"/><path class="st2" d="m44.1 57.8c0.2-0.1 0.8-1 0.8-1.2h-0.4c-0.1 0-0.1 0.1-0.2 0.1-0.1 0.1-0.7 0.9-0.7 1 0.2 0.1 0.4 0.1 0.5 0.1"/><path class="st2" d="m40.3 56.6c-0.2 0.2-1.2 0.9-1.2 1.1h0.5c0.2-0.1 1-0.9 1-1.1h-0.3"/><path class="st2" d="m48.7 57.7c0-0.5 0-1-0.4-1.2-0.1 0.3-0.1 0.7-0.1 1.1v1.6 0.3h-2.5-1.1c-0.7 0-1.4-0.1-2.1-0.1-0.5 0-1 0.1-1.5 0.1-0.3 0-2.4-0.2-2.5 0v0.1c0.2 0.3 0.5 0.2 0.9 0.2h0.2 0.2 0.6 1 0.3c0.1-0.1 0.6 0 0.8 0h0.2 1.1c0.2-0.1 0.5 0 0.7 0h1.4c0.1-0.1 0.3 0 0.5 0 0.2-0.1 0.4 0 0.6 0h1.2 0.2v-0.1c0.1-0.2 0-0.5 0-0.8 0-0.2 0-0.3 0.1-0.5 0.3-0.1 0.3-0.4 0.2-0.7"/><path class="st2" d="m48.7 64.4v-0.4-0.3c-0.1-0.1-0.2-0.1-0.4-0.1l-0.1 0.1v0.6 2c0.1 0 0.4 0 0.4-0.2 0.1-0.2 0.1-0.8 0-1.1 0-0.1 0-0.3 0.1-0.6"/><path class="st2" d="m56.4 64.8c-0.5-0.5-1-1-1.5-1.4-0.6-0.6-1.2-1.3-1.9-1.9-0.2-0.2-0.5-0.4-0.7-0.7l-0.3-0.3c-0.9-1-2-1.9-2.9-2.8-0.1 0.4 0 0.8 0 1.2v0.8 0.7c-0.1 0.2-1.5 0.2-1.8 0.2-0.1 0-0.5 0-0.6 0.1v0.1c0.1 0.4 0.3 0.8 0.4 1.1 0.1 0.2 0.2 0.9 0.4 1.1 0.1 0.1 0.6 0.1 0.7 0.1 0.1-0.1 0.5 0 0.6 0 0.3-0.1 0.2 0.5 0.2 0.6v0.5c0 0.3-0.1 2 0.1 2.1 0.1 0.1 0.5 0 0.7 0 0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.4 0 0.5 0h0.2c0.1-0.1 0.4 0 0.6 0 0.1 0 0.4-0.1 0.4-0.1 0.1 0 0.2 0.1 0.3 0.1h0.3c0.2-0.1 0.5-0.1 0.8-0.1h0.2c0.1-0.1 0.3 0 0.5 0h0.2 0.2c0.1-0.1 0.2 0 0.3-0.1 0.1 0 0.3-0.1 0.4-0.1 0.2 0 0.4-0.1 0.7-0.1 0.1-0.1 0.4-0.1 0.5-0.1s0.2-0.1 0.3-0.1c0 0 0.2-0.1 0.2-0.2 0-0.4-0.2-0.5-0.3-0.6"/><path class="st2" d="m61.8 38.9v-0.3-0.3-0.6-1-0.9-1.8c0-0.2 0.1-0.7-0.1-0.9-0.1 0.2-0.4 0.4-0.6 0.6-0.7 0.8-1.5 1.5-2.3 2.3-0.5 0.5-1 1.1-1.5 1.6-0.3 0.2-0.5 0.5-0.8 0.8l-0.7 0.7c-0.2 0.2-0.4 0.3-0.5 0.5s-0.3 0.3-0.4 0.5l-1.8 1.8c-0.2 0.2-0.4 0.5-0.6 0.7s-0.6 0.5-0.7 0.7v0.1c0 0.1 1.3 1.4 1.5 1.6 1 1 2.1 2 3.1 3 0.1 0.1 0.2 0.2 0.2 0.3 0.2 0.1 0.3 0.3 0.4 0.4 0.2 0.2 0.3 0.4 0.5 0.5 1 1.1 2.1 2.1 3.2 3.2 0.1 0.1 1 1.1 1.1 1.1 0.2 0 0.1-0.9 0.1-1.1v-0.5-0.4c0-0.1 0-0.2 0.1-0.4 0-0.2-0.1-0.4 0-0.6v-0.3-1.2-0.7-0.4-0.5-0.7-0.2c0-0.2 0-0.4 0.1-0.7 0-0.4 0-0.7-0.1-1.1 0-0.3 0.1-0.6 0.1-0.9 0-0.2 0-0.4-0.1-0.6v-0.3-1-0.4c0-0.3 0-0.5-0.1-0.8v-1.5c-0.1-0.1-0.1-0.2-0.1-0.3"/><path class="st2" d="m48.2 25.8c-0.1 0.1-0.1 0.2-0.2 0.3s-0.1 0.2-0.2 0.3c-0.1 0.2-0.3 0.2-0.4 0.4-0.1 0.1-0.1 0.3-0.3 0.4-0.3 0.2-0.5 0.5-0.6 0.8 0 0.1-0.1 0.1-0.1 0.2 0 0-0.1 0.1 0 0.1 0 0.1 0.1 0.2 0.2 0.3 0.2 0.2 0.3 0.4 0.3 0.7 0 0.2 0.1 0.4 0.1 0.6s-0.1 0.4-0.2 0.6c0 0.1 0 0.3-0.1 0.4s-0.1 0.2-0.2 0.3-0.1 0.2-0.2 0.3c-0.2 0.3-0.5 0.4-0.8 0.6-0.1 0.1-0.2 0.2-0.4 0.3s-0.4 0.1-0.6 0.3c-0.2 0.1-0.3 0.3-0.4 0.5-0.1 0.1-0.2 0.1-0.3 0.2-0.1 0.2 0 0.3 0 0.5 0 0.1 0 0.2-0.1 0.3v0.6 0.2c0.2-0.1 0.4-0.4 0.6-0.6l2.8-2.8c0.2-0.2 0.3-0.4 0.5-0.6 0.3-0.3 0.7-0.6 1-1 0.1-0.1 0.2-0.3 0.3-0.4l0.3-0.3c0.2-0.2 0.4-0.4 0.6-0.5 0.5-0.5 1-1.1 1.5-1.6 0.1-0.1 0.3-0.2 0.4-0.4l1.7-1.7c0.3-0.3 0.7-0.6 0.9-0.9-0.2 0.1-0.5 0.1-0.8 0h-0.2c-0.2 0-0.4 0.1-0.6 0.1s-0.5-0.1-0.7-0.1h-0.6c-0.1 0.1-0.2 0-0.4 0.1h-0.9-0.5l-0.2 0.2c-0.2 0.2-0.3 0.4-0.5 0.6-0.1 0.1-0.1 0.2-0.2 0.2-0.1 0.1-0.2 0.1-0.3 0.2l-0.2 0.2c0.2 0 0.1 0 0 0.1"/><path class="st2" d="m46.4 26.4c-0.1 0.2-0.4 0.3-0.4 0.6v0.3h0.1c0.2-0.3 0.6-0.7 0.3-0.9"/><path class="st2" d="m45.9 30.6s0.1 0.1 0.1 0c0.2-0.1 0.3-0.3 0.3-0.5-0.1 0.2-0.4 0.3-0.4 0.5"/><path class="st2" d="m45.7 28.6-0.2 0.2v1c0 0.1 0.1 0.1 0.2 0.1s0.1-0.1 0.2-0.1c0.3-0.3 0.2-0.6 0.1-0.9-0.1-0.2-0.1-0.3-0.3-0.3"/><path class="st2" d="m45 31.6c0.1 0.1 0.5-0.1 0.5-0.2-0.1-0.1-0.2-0.1-0.3-0.1s-0.3 0.2-0.2 0.3"/><path class="st2" d="m46.9 25.6c-0.1 0.1-0.2 0.3 0 0.4 0.1 0 0.2 0.1 0.2 0 0.1-0.1 0.2-0.3 0.3-0.4 0.2-0.2 0.9-1.2 1.2-1.2v-0.1c-0.2 0-0.4 0-0.6-0.1l-0.2 0.2c-0.1 0.1-0.2 0.3-0.3 0.4s-0.2 0.2-0.3 0.2-0.1 0.1-0.2 0.1c-0.1 0.3-0.1 0.4-0.1 0.5"/><path class="st2" d="m45.2 26.3c-0.1 0.1-0.4 0.6-0.4 0.7h0.1c0.2 0.1 0.4 0 0.5-0.1s0.1-0.3 0.3-0.4l0.6-0.6c0.1-0.1 0.1-0.2 0.2-0.3s0.2-0.3 0.3-0.4 0.2-0.3 0.3-0.4 0.2-0.2 0.2-0.4h-0.3c-0.1 0.1-0.3 0.1-0.3 0.2-0.1 0.1-0.1 0.3-0.2 0.4s-0.3 0.2-0.4 0.3-0.1 0.3-0.1 0.4-0.1 0.1-0.2 0.2c0 0.1 0 0.2-0.1 0.2-0.3 0.1-0.4 0.1-0.5 0.2"/><path class="st2" d="m43.7 26.6v0.3c0.3-0.1 0.6-0.5 0.8-0.8 0.1-0.1 0.1-0.3 0.2-0.4s0.1-0.2 0.2-0.3c0.1-0.3 0.3-0.7 0.5-1h0.1v-0.1h-0.4c-0.2 0.1-0.9 0-1 0.1s-0.1 0.3-0.1 0.4-0.2 0.2-0.2 0.3c-0.1 0.2 0.1 0.4 0.1 0.6s-0.1 0.3-0.1 0.4c-0.1 0.3-0.1 0.4-0.1 0.5"/><path class="st2" d="m43.1 28.6c-0.1 0-0.4 0.4-0.4 0.4 0 0.2 0.2 1 0.4 1s0.4-0.2 0.5-0.3 0.3-0.2 0.4-0.4-0.5-0.6-0.6-0.7h-0.3"/><path class="st2" d="m42.7 30.4c0.1-0.3-0.6-0.8-0.8-0.9-0.2 0.2-0.1 0.2-0.2 0.4 0 0.1-0.1 0.2-0.1 0.2-0.1 0.2 0.1 0.6 0.2 0.7s0.1 0.1 0.2 0.1 0.3-0.2 0.4-0.3c0.2 0 0.3-0.1 0.3-0.2"/><path class="st2" d="m42.3 31.8c-0.1-0.1-0.1-0.2-0.2-0.3 0 0-0.1 0-0.2-0.1-0.3 0.5 0.1 0.6 0.5 0.7h0.1c0-0.1-0.1-0.2-0.2-0.3"/><path class="st2" d="m41 29.6c0.1 0 0.2-0.1 0.3-0.2 0.3-0.4 0.1-0.7-0.3-1-0.1 0-0.3 0.3-0.3 0.3 0 0.1 0.1 0.2 0.1 0.3 0 0.3-0.1 0.7 0.2 0.6"/><path class="st2" d="m41.9 28.7c0.2 0 0.9-0.5 0.8-0.7-0.1-0.1-0.2-0.1-0.3-0.1-0.3 0.1-0.5 0.2-0.8 0.2h-0.2v0.1c0.1 0.2 0.2 0.5 0.5 0.5"/><path class="st2" d="m41.2 31.6c0.1 0 0.5-0.3 0.5-0.4s-0.5-0.6-0.6-0.7h-0.2c-0.1 0.3 0 0.7 0.1 1 0.1 0.1 0.1 0.2 0.2 0.1"/><path class="st2" d="m42.1 26c0.1 0.2 0.5 1.3 0.9 1.3v-0.8c0-0.4 0.1-0.8 0.1-1.2 0-0.1 0-0.2 0.1-0.3 0-0.1 0-0.2-0.1-0.3v-0.3c-0.2 0-0.6 0-0.8-0.1-0.2 0-0.5 0-0.6 0.1-0.3 0.3 0.1 1 0.2 1.3 0 0.1 0.1 0.1 0.2 0.3"/><path class="st2" d="m41.5 27.2h0.3c0.1 0 0.1-0.2 0.1-0.3s0-0.3-0.1-0.4-0.1-0.2-0.2-0.4-0.2-0.4-0.3-0.7-0.3-0.9-0.6-1.1c-0.1-0.1-0.3 0-0.5 0-0.1 0.1-0.6 0.1-0.6 0.2-0.1 0.2 1.8 2.6 1.9 2.7"/><path class="st2" d="m38.1 24.6c0.1 0.2 0.3 0.3 0.5 0.5 0.1 0.2 0.2 0.4 0.3 0.5s0.3 0.1 0.4 0.3c0.2 0.2 0.4 0.5 0.5 0.8l0.3 0.3c0.2 0.2 0.3 0.4 0.5 0.5 0.1 0.1 0.3 0.1 0.4 0.1 0 0 0-0.1 0.1-0.1-0.1-0.2-0.3-0.4-0.4-0.6-0.1-0.1-0.2-0.1-0.3-0.2 0-0.1-0.1-0.1-0.1-0.2-0.1-0.1-0.2-0.3-0.3-0.4l-0.4-0.4c-0.1-0.1-0.1-0.3-0.2-0.4-0.2-0.2-0.3-0.5-0.6-0.7-0.1-0.1-0.3-0.2-0.5-0.2 0 0-0.2 0-0.2 0.2"/><path class="st2" d="m33.1 25.2 2.2 2.2c0.9 0.8 1.7 1.7 2.6 2.5 0.1 0.1 0.2 0.2 0.3 0.4l0.8 0.8c0.5 0.5 1 0.9 1.5 1.4 0.2 0.3 0.5 0.5 0.7 0.8 0.3 0.3 0.7 0.6 1 0.9 0.2 0.2 0.6 0.7 0.8 0.7 0-0.2-0.1-0.6-0.1-0.8v-0.3c0-0.1 0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.3-0.3-0.4-0.2-0.2-0.4-0.2-0.6-0.3-0.1-0.1-0.3-0.2-0.4-0.3-0.1 0-0.2-0.1-0.3-0.1-0.1-0.1-0.1-0.2-0.2-0.3s-0.2-0.1-0.3-0.2-0.1-0.3-0.2-0.5c-0.1-0.1-0.1-0.3-0.2-0.4 0-0.1-0.1-0.3-0.1-0.4 0-0.2 0-0.4 0.1-0.6 0-0.1 0-0.2 0.1-0.4 0.1-0.3 0.2-0.5 0.5-0.8 0.1-0.1 0.2-0.2 0.3-0.2-0.1-0.2-0.2-0.3-0.4-0.5-0.1-0.1-0.2-0.1-0.2-0.2-0.1-0.1-0.2-0.3-0.4-0.5s-0.5-0.4-0.7-0.7l-1.4-1.4c-0.2-0.2-0.4-0.4-0.6-0.5s-0.4 0.1-0.6 0.1c-0.1 0-0.2 0-0.3-0.1h-0.7-0.5-0.6c-0.2 0.1-0.6 0-0.8 0h-1.1c-0.3 0.1 0.3 0.4 0.5 0.7"/><path class="st2" d="m40.2 29.6c0 0.2-0.1 0.7 0.2 0.6 0.4-0.1 0-0.5-0.2-0.6"/><path class="st2" d="m30 48.2c0.3-0.3 0.5-0.6 0.8-0.8 0.4-0.4 0.8-0.8 1.3-1.2l0.9-0.9c0.1-0.1 0.2-0.3 0.3-0.4 0.4-0.3 0.9-0.8 1.2-1.2 0-0.1 0.1-0.1 0.1-0.2 0.1-0.3-1.9-2.2-2.2-2.5-0.5-0.5-1-1-1.5-1.6-0.5-0.5-1.1-1-1.6-1.5-0.1-0.1-0.2-0.2-0.2-0.3-0.2-0.2-0.5-0.4-0.7-0.6-0.1-0.1-0.2-0.2-0.3-0.4-0.3-0.4-0.7-0.7-1-1l-0.5-0.5c-0.5-0.4-0.9-0.9-1.4-1.3-0.2-0.2-0.4-0.5-0.7-0.6v1 0.3 0.6 0.5 0.4 2 0.5c0 0.3 0 0.6-0.1 1v2 0.9 1.2 0.6 0.4 1.5 0.5 0.9 0.6 1.4 0.5 1.4 1.7 0.6s0.1 0.2 0.1 0.1c0.1-0.2 0.4-0.4 0.6-0.6 0.6-0.5 1.1-1.1 1.7-1.6 0.4-0.4 0.7-0.8 1.1-1.1 0.7-0.6 1.4-1.3 2.1-1.9-0.1-0.3 0-0.4 0-0.4"/><path class="st2" d="m39.7 62.4c0.1-0.4 0.3-0.8 0.5-1.2 0.1-0.2 0.2-0.5 0.2-0.8h-1.2c-0.2 0-0.7 0-0.9-0.1-0.1-0.1-0.1-0.2-0.2-0.3-0.1-0.2-0.2-0.3-0.3-0.5s0-0.4 0-0.7v-1c0-0.2 0.1-0.8 0-1-0.2 0.2-0.3 0.4-0.5 0.5l-1.8 1.8c-0.4 0.4-0.9 0.9-1.3 1.4-0.7 0.7-1.5 1.4-2.2 2.1-0.1 0.1-0.2 0.3-0.3 0.4l-0.4 0.4c-0.3 0.3-0.6 0.5-0.9 0.8l-0.6 0.6c-0.2 0.2-0.5 0.4-0.6 0.6v0.1c0.2 0.1 0.5 0.1 0.8 0.1 0.3 0.1 0.6 0.1 1 0.2h0.4c0.1 0 0.2 0 0.3 0.1 0.2 0 0.4 0.1 0.7 0.1s0.5 0 0.8 0.1c0.6 0.1 1.2 0.2 1.8 0.2h0.4c0.3 0 0.6 0.1 0.8 0.1 0.1 0 0.3 0 0.4 0.1h0.6c0.2 0 0.4 0.1 0.6 0.1 0.1 0 0.1-0.1 0.1-0.2 0.1-0.3 0-0.8 0-1.1v-2.1c0-0.1 0-0.1 0.1-0.2s0.9 0 1.1 0h0.2c0.1 0 0.2 0 0.3-0.1 0-0.1 0-0.3 0.1-0.5"/><path class="st2" d="m42.2 67.7h0.3v-1.2c0-0.4 0-1 0.2-1.3 0.2-0.4 0.3-0.7 0.8-0.7 0.1 0 0.1 0 0.1-0.1 0-0.3-0.5-0.4-0.7-0.4-0.1 0-0.2 0.1-0.4 0.1-0.8 0.4-0.7 1.6-0.7 2.4 0 0.1 0 0.5-0.1 0.6-0.2 0.2-2 0.1-2.4 0.1 0.2 0.1 0.4 0.1 0.6 0.2s0.5 0.3 0.8 0.3h1 0.5"/><path class="st2" d="m44.1 67.3c0-0.1-0.1-0.2-0.1-0.3v-1.4-0.6c0-0.1-0.1-0.1-0.1-0.1-0.2 0.1-0.3 0.1-0.5 0.2-0.1 0.1-0.2 0.4-0.2 0.5s-0.1 0.3-0.1 0.5v0.8 0.4 0.4 0.4 0.2h-0.9c-0.1 0-0.2 0-0.3 0.1h-0.1c0.2 0.1 0.5 0.3 0.7 0.4 0.2 0.2 0.3 0.4 0.5 0.5 0.1-0.3 0.4-0.5 0.6-0.7l0.3-0.3c0.2-0.2 0.4-0.3 0.5-0.5-0.2-0.2-0.2-0.4-0.3-0.5"/><path class="st2" d="m44.6 67c0 0.2 0.1 0.4 0.2 0.5 0.2-0.1 0.5-0.2 0.7-0.3 0.1 0 0.2-0.1 0.3-0.1v-0.1h-0.9-0.3"/><path class="st2" d="m6.3 37.7c-0.6-0.2-0.7-0.6-0.5-1.3l0.2-0.9 4.3 1c0.7 0.2 0.8 0.4 0.7 0.8h0.2l0.4-2h-0.2c-0.1 0.5-0.3 0.6-1 0.4l-4.3-1 0.2-0.9c0.2-0.9 0.6-1 1.1-1v-0.1l-1.3-0.3v0.2c0.1 0.2 0.1 0.4 0 0.9l-0.7 2.9c-0.1 0.2-0.1 0.4-0.2 0.5s-0.1 0.2-0.2 0.3v0.2l1.3 0.3"/><path class="st2" d="m8.7 29.2 3.2 1.6c0.7 0.3 0.7 0.6 0.5 1l0.2 0.1 0.9-1.9-0.2-0.1c-0.2 0.4-0.5 0.5-1.1 0.2l-1.5-0.7 1.4-2.8 1.5 0.7c0.7 0.3 0.7 0.6 0.5 1l0.2 0.1 0.9-1.8-0.2-0.2c-0.2 0.4-0.5 0.5-1.1 0.2l-3.2-1.6c-0.6-0.3-0.8-0.5-0.5-1h-0.2l-0.9 1.8 0.2 0.1c0.2-0.4 0.5-0.5 1.1-0.2l1.5 0.7-1.4 2.8-1.5-0.6c-0.7-0.3-0.7-0.6-0.5-1l-0.2-0.1-0.9 1.9 0.2 0.1c0.2-0.5 0.5-0.6 1.1-0.3"/><path class="st2" d="m18.7 20.2-0.1 0.1c0.4 0.7 0.3 0.9-0.3 1.6l-0.6 0.8c-0.2 0.2-0.4 0.3-0.6 0.1l-1.6-1.3 0.9-1.1c0.4-0.5 0.5-0.5 0.9-0.3l0.1-0.1-1.1-0.9-0.1 0.1c0.3 0.4 0.3 0.5 0 0.8l-1 1.2-1.9-1.6 1.1-1.3c0.4-0.5 0.6-0.6 1.1-0.3l0.1-0.1-0.6-0.5-2.6 3.2 0.1 0.1c0.3-0.4 0.6-0.4 1.1 0.1l2.8 2.3c0.6 0.5 0.6 0.7 0.3 1.1l0.1 0.1 2.6-3.2-0.7-0.9"/><path class="st2" d="m27 15.3c0.7-0.4 1-0.9 1.2-1.8l0.4 0.7 1.2-0.7-0.1-0.1c-0.4 0.2-0.6 0.2-1-0.5l-1.7-3.1c-0.3-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.1 0.1c0.4-0.2 0.7-0.1 1 0.5l1.7 3c0 0.7-0.4 1.3-1 1.6-0.8 0.5-1.6 0.2-2-0.6l-1.4-2.5c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.2 0.1c0.4-0.2 0.6-0.2 1 0.5l1.4 2.5c0.5 0.8 1.4 1.3 2.6 0.7"/><path class="st2" d="m36.7 5.7v-0.2l-1.7 0.4v0.2c0.5-0.1 0.7 0 0.9 0.7l0.8 3.2-4.6-3.4-1.4 0.4v0.2c0.7-0.1 0.9 0.2 1.1 0.8l0.8 3.2c0.2 0.8 0 1-0.4 1.1v0.2l1.8-0.4v-0.2c-0.5 0.1-0.8 0-0.9-0.6l-1-3.9 5.2 3.8h0.2l-1.2-4.5c-0.3-0.6-0.2-0.9 0.4-1"/><path class="st2" d="m41.1 6.2 0.2 3.6c0 0.7-0.1 0.9-0.6 0.9v0.2l2.1-0.1v-0.2c-0.5 0-0.7-0.2-0.7-0.9l-0.2-3.6c0-0.7 0.1-0.9 0.6-0.9v-0.2l-2.1 0.1v0.2c0.5 0 0.6 0.2 0.7 0.9"/><path class="st2" d="m51.3 5.9v-0.2l-1.7-0.2v0.2c0.5 0.1 0.6 0.4 0.3 0.9l-1.8 3.4-0.9-3.9c-0.1-0.5 0.1-0.7 0.5-0.6v-0.2l-2-0.3v0.2c0.5 0.1 0.6 0.4 0.8 1.1l1.1 4.8h0.2l2.3-4.3c0.4-0.6 0.7-0.9 1.2-0.9"/><path class="st2" d="m55.3 12.7-0.9-0.3c-0.4-0.2-0.4-0.3-0.3-0.6l0.7-1.9 1.3 0.5c0.6 0.2 0.6 0.3 0.6 0.8l0.2 0.1 0.4-1.3-0.2-0.1c-0.2 0.4-0.4 0.4-0.8 0.3l-1.5-0.6 0.8-2.3 1.6 0.6c0.6 0.2 0.8 0.3 0.7 1h0.1l0.4-0.9-3.9-1.4-0.1 0.2c0.5 0.2 0.5 0.4 0.3 1.1l-1.2 3.4c-0.3 0.6-0.5 0.7-0.9 0.5l-0.1 0.2 3.9 1.4 0.6-0.9-0.2-0.1c-0.5 0.6-0.7 0.6-1.5 0.3"/><path class="st2" d="m61 15.7c-0.4-0.3-0.4-0.5 0-1.1l0.9-1.3 0.4 0.3c0.9 0.6 0.4 1.9 0.6 3.5l1 0.6 0.1-0.1c-0.8-0.6 0-2.4-0.5-3.5 0.8 0.2 1.4 0 1.8-0.5 0.4-0.6 0.3-1.6-0.8-2.3l-2-1.3-0.1 0.1c0.4 0.3 0.5 0.5 0.1 1.1l-2 3c-0.4 0.6-0.7 0.6-1 0.4l-0.1 0.1 1.7 1.1zm2.4-4.8 0.5 0.3c0.7 0.5 0.9 1.2 0.5 1.9-0.4 0.6-1 0.9-1.9 0.4l-0.6-0.4 1.5-2.2"/><path class="st2" d="m66 19.6c0.1 0.1 0.3 0.7 0.7 1.1 0.6 0.6 1.7 0.6 2.3 0 0.3-0.3 0.5-0.6 0.5-1.2 0-1.2-0.8-2.4-0.1-3.1 0.4-0.4 0.9-0.3 1.3 0.1s0.6 1.1 0.1 1.7l0.1 0.1 1-0.9-0.1-0.1c-0.1 0.1-0.2 0.1-0.2 0-0.2-0.2-0.2-0.5-0.6-1-0.7-0.7-1.5-0.7-2.1-0.1-0.3 0.3-0.5 0.7-0.5 1.2 0 0.9 0.7 2.3 0 3-0.4 0.4-1.1 0.4-1.5-0.1-0.4-0.4-0.7-1.2 0-2l-0.1-0.1-1.1 1.1 0.1 0.1c0 0.1 0.1 0.1 0.2 0.2"/><path class="st2" d="m69.9 24-0.1 0.1 1.2 1.7 0.1-0.1c-0.3-0.4-0.2-0.7 0.4-1.1l2.9-2c0.6-0.4 0.8-0.4 1.1 0l0.1-0.1-1.2-1.7-0.1 0.1c0.3 0.4 0.2 0.6-0.4 1.1l-2.9 2c-0.6 0.4-0.9 0.3-1.1 0"/><path class="st2" d="m77.6 26.5 0.3 0.8-4 1.8c-0.7 0.3-0.9 0.2-1.1-0.2l-0.1 0.1 0.8 1.8 0.2-0.1c-0.2-0.4-0.1-0.6 0.5-0.9l4-1.8 0.4 0.8c0.4 0.8 0.2 1.1-0.2 1.4v0.1l1.2-0.5-0.1-0.2c-0.2-0.1-0.4-0.3-0.6-0.7l-1.3-2.7c-0.1-0.2-0.2-0.4-0.2-0.5v-0.4l-0.1-0.2-1.2 0.5 0.1 0.2c0.7-0.2 1.1 0 1.4 0.7"/><path class="st2" d="m81.2 36.4h-0.2c0.1 0.5-0.3 0.5-0.8 0.4l-1.6-0.6 1.5-1.5c0.3-0.3 0.5-0.3 0.7 0.3h0.2l-0.5-2.2h-0.2c0.1 0.4 0 0.6-0.5 1.2l-1.6 1.6-1.8 0.4c-0.8 0.2-0.9-0.1-1-0.5h-0.2l0.4 2h0.2c-0.1-0.5 0.1-0.7 0.8-0.8l1.8-0.4 2.3 0.8c0.6 0.2 0.7 0.3 0.8 0.8h0.2l-0.5-1.5"/><path class="st2" d="m10 56.3c1.6-0.5 2.5-2.1 2-3.8s-2.1-2.6-3.7-2.1-2.5 2.1-2.1 3.8c0.5 1.7 2.1 2.6 3.8 2.1m-3.6-2.1c-0.4-1.2 0.5-2.4 2.1-2.9s2.9 0.1 3.3 1.4c0.3 1.1-0.4 2.3-2.1 2.8-1.4 0.4-2.9 0.1-3.3-1.3"/><path class="st2" d="m13.8 58.1c0.2 0.4 0.2 0.7-0.5 1l-3.1 1.8c-0.6 0.4-0.9 0.3-1.1-0.1l-0.2 0.1 1 1.8 0.1-0.1c-0.2-0.4-0.1-0.7 0.5-1l1.5-0.8 0.8 1.3c0.2 0.3 0.1 0.6-0.3 0.9l0.1 0.1 1.4-0.8-0.1-0.1c-0.4 0.2-0.7 0.2-0.9-0.2l-0.7-1.3 2.1-1.2 0.7 1.3c0.3 0.5 0.4 0.7-0.2 1.2h0.1l0.9-0.5-1.9-3.4h-0.2"/><path class="st2" d="m20.8 67.6c0.4 0.3 0.4 0.6-0.1 1.1l-2.3 2.8c-0.5 0.6-0.7 0.6-1.1 0.3l-0.1 0.1 3.2 2.6 0.9-0.7-0.1-0.1c-0.7 0.4-0.9 0.3-1.6-0.3l-0.8-0.6c-0.2-0.2-0.3-0.4-0.1-0.6l1.3-1.6 1.1 0.9c0.5 0.4 0.5 0.5 0.3 0.9l0.1 0.1 0.9-1.1-0.1-0.1c-0.4 0.3-0.5 0.3-0.8 0l-1.2-1 1.6-1.9 1.3 1c0.5 0.4 0.6 0.6 0.3 1.1l0.1 0.1 0.6-0.7-3.2-2.6-0.2 0.3"/><path class="st2" d="m29.3 73.2-2.4-1.1-0.1 0.2c0.4 0.2 0.5 0.5 0.2 1.1l-1.5 3.2c-0.3 0.6-0.6 0.7-1 0.6l-0.1 0.2 2.5 1.1c2 0.9 3.4 0.1 4-1.2 0.7-1.4 0.4-3.2-1.6-4.1m0.9 3.6c-0.7 1.4-1.8 2-3.1 1.4l-0.6-0.2c-0.5-0.2-0.6-0.5-0.2-1.3l1.8-3.8 1 0.5c1.6 0.7 1.7 2.2 1.1 3.4"/><path class="st2" d="m35.2 75.5c0.5 0.1 0.6 0.3 0.4 1l-0.7 3.5c-0.2 0.7-0.4 0.9-0.8 0.7v0.2l2 0.4v-0.2c-0.5-0.1-0.6-0.4-0.4-1l0.8-3.5c0.1-0.7 0.4-0.8 0.8-0.7v-0.2l-2-0.4-0.1 0.2"/><path class="st2" d="m44.9 76.3v0.2c0.5 0 0.7 0.2 0.7 0.9v3.4l-3.6-4.5h-1.5v0.2c0.7 0.1 0.9 0.4 0.9 1.1v3.4c0 0.8-0.2 1-0.7 1v0.2h1.7v-0.2c-0.5 0-0.8-0.2-0.8-0.8l-0.1-4 4.1 4.9h0.4v-4.7c0-0.7 0.2-0.9 0.7-0.9v-0.2h-1.8"/><path class="st2" d="m53.6 77.6c0.7-0.5 0.9-1 0.8-1.6-0.2-0.7-1-1.2-2.3-0.8l-2.1 0.6v0.2c0.5-0.1 0.7 0 0.9 0.7l0.9 3.4c0.2 0.7 0.1 0.9-0.4 1v0.2l2.5-0.7c1-0.3 1.6-1 1.4-1.8-0.1-0.8-0.8-1.3-1.7-1.2m-2.2-2 0.6-0.2c0.9-0.2 1.5 0.1 1.7 0.8s-0.2 1.3-1 1.5l-0.7 0.2zm2.4 4.8-0.5 0.1c-0.4 0.1-0.6 0-0.8-0.8l-0.4-1.6 0.5-0.1c1-0.3 1.7 0.1 2 0.9 0.2 0.8-0.3 1.3-0.8 1.5"/><path class="st2" d="m64.2 74.7-1.8-3.1c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.7 1 0.1 0.1c0.4-0.2 0.7-0.1 1 0.5l1.7 3c0 0.7-0.4 1.3-0.9 1.6-0.8 0.5-1.6 0.2-2-0.6l-1.6-2.4c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.1 0.1c0.4-0.2 0.6-0.2 1 0.5l1.4 2.4c0.5 0.9 1.5 1.4 2.7 0.7 0.7-0.4 1-0.9 1.2-1.8l0.4 0.7 1.2-0.7-0.1-0.1c-0.3 0.2-0.5 0.2-0.9-0.5"/><path class="st2" d="m69.1 68.3c0.4-0.8 0.3-1.4-0.2-1.8-0.5-0.5-1.5-0.6-2.4 0.3l-1.6 1.7 0.1 0.1c0.3-0.3 0.6-0.4 1.1 0.2l2.6 2.5c0.6 0.5 0.5 0.8 0.2 1.1l0.1 0.1 1.4-1.5-0.1-0.1c-0.3 0.3-0.6 0.3-1.1-0.2l-1.2-1.1 0.3-0.3c0.7-0.7 1.9 0 3.6 0.1l0.8-0.8-0.1-0.1c-0.7 0.6-2.3-0.5-3.5-0.2m-0.8 0.6-0.5 0.5-1.8-1.8 0.4-0.4c0.6-0.6 1.4-0.7 1.9-0.1 0.5 0.4 0.7 1.1 0 1.8"/><path class="st2" d="m75.8 59.8-0.1-0.1-1.2 2 0.1 0.1 0.1-0.2c0.2-0.4 0.5-0.4 1.1 0l0.5 0.3c0.4 0.3 0.2 0.8 0 1.1-0.7 1.2-2.3 1.4-3.7 0.5-1.3-0.8-1.8-2.1-1.1-3.1 0.4-0.7 1.3-1.3 2.3-0.8l0.1-0.1-1.4-0.9-0.1 0.2c0.1 0.1 0.1 0.2 0 0.4-0.2 0.4-0.6 0.5-1 1.2-0.7 1.2-0.6 3.1 1.2 4.2 1.1 0.7 2.9 0.8 4.2-1.4 0.1-0.2 0.6-1.1 0.7-1.4l-1.3-0.8c-0.5-0.5-0.7-0.7-0.4-1.2"/><path class="st2" d="m79.9 51.7-3.4-1c-0.7-0.2-0.8-0.4-0.7-0.9h-0.2l-0.6 2 0.2 0.1c0.1-0.5 0.4-0.6 1.1-0.4l1.6 0.5-0.9 3-1.6-0.5c-0.7-0.2-0.8-0.5-0.7-0.9h-0.2l-0.6 2h0.2c0.1-0.5 0.4-0.6 1.1-0.4l3.4 1c0.7 0.2 0.8 0.4 0.7 0.9h0.2l0.6-2h-0.2c-0.1 0.5-0.4 0.6-1.1 0.4l-1.5-0.5 0.9-3 1.6 0.5c0.7 0.2 0.8 0.4 0.7 0.9h0.2l0.6-2h-0.2c-0.2 0.4-0.5 0.5-1.2 0.3"/><path class="st2" d="m7 44.1c0 0.3 0.2 0.5 0.5 0.5s0.5-0.2 0.5-0.5-0.2-0.5-0.5-0.5-0.5 0.2-0.5 0.5"/><path class="st2" d="m79.7 44.1c0-0.3-0.2-0.5-0.5-0.5s-0.5 0.2-0.5 0.5 0.2 0.5 0.5 0.5 0.5-0.3 0.5-0.5"/></svg> diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.pdf b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.pdf Binary files differnew file mode 100644 index 0000000000..39bb707e73 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.pdf diff --git a/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.svg b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.svg new file mode 100644 index 0000000000..6089f29ef7 --- /dev/null +++ b/macros/latex/contrib/beamer-contrib/themes/beamertheme-edmaths/images/white-tied-in.svg @@ -0,0 +1,8 @@ +<svg width="342.4" height="97.2" version="1.1" viewBox="0 0 342.4 97.2" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"> +<style type="text/css"> + .st0{clip-path:url(#SVGID_2_);} + .st1{fill:none;stroke:#FFFFFF;stroke-width:3;stroke-miterlimit:1;} + .st2{fill:#FFFFFF;} + .st3{fill:none;stroke:#FFFFFF;stroke-miterlimit:1;} +</style> +<g transform="translate(10,10)"><path class="st2" d="m107.6 17.3h-2.8v14c0 1.1 0.1 1.8 0.4 2.2s0.8 0.6 1.6 0.6v0.5h-6.4v-0.5c0.8 0 1.3-0.2 1.6-0.7 0.3-0.4 0.4-1.2 0.4-2.2v-13.9h-2.6c-1.3 0-2.2 0.2-2.8 0.6s-0.9 1.1-1 2h-0.5v-4.2h0.5c0.5 0.5 1.4 0.7 2.7 0.7h9.5c1.4 0 2.3-0.2 2.9-0.7h0.6v4.2h-0.4c-0.2-1-0.6-1.7-1.2-2.1-0.5-0.3-1.3-0.5-2.5-0.5"/><path class="st2" d="m128.4 31.2v-5.3h-9.9v5.3c0 1.1 0.2 1.8 0.5 2.2s0.9 0.6 1.7 0.6v0.5h-6.7v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.2v-11.4c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.6v0.5c-0.8 0-1.3 0.2-1.7 0.7-0.3 0.4-0.5 1.2-0.5 2.2v5.2h9.9v-5.2c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.5v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.3 0.3 0.4 0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.5-1.1 0.5-2.2"/><path class="st2" d="m147 23.3h0.5v4.4h-0.5c-0.2-0.8-0.4-1.3-0.7-1.5s-0.9-0.3-1.8-0.3h-4.5v6.5c0 0.5 0.1 0.8 0.3 1s0.5 0.3 1 0.3h3.2c1.1 0 1.9-0.1 2.4-0.2 0.4-0.1 0.8-0.4 1.1-0.7s0.6-0.9 1-1.6h0.5l-0.8 3.4h-13.1v-0.5c0.8 0 1.4-0.2 1.6-0.6 0.3-0.4 0.4-1.2 0.4-2.2v-11.5c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h13.1v3h-0.3c-0.2-0.9-0.4-1.4-0.8-1.7s-1.1-0.4-2.3-0.4h-5.3v7.8h5.1c0.7 0 1.2-0.1 1.4-0.4 0.2-0.2 0.4-0.7 0.5-1.4"/><path class="st2" d="m172.9 30.8v-11c0-1.1-0.1-1.8-0.4-2.2s-0.8-0.6-1.5-0.7v-0.5h6.4v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.2s0.8 0.6 1.6 0.6v0.5h-4.5v-2.4c-1.7 2-3.7 3-6.1 3-1.9 0-3.4-0.6-4.5-1.7s-1.7-2.7-1.7-4.5v-8.9c0-1.1-0.1-1.8-0.4-2.3-0.3-0.4-0.8-0.6-1.6-0.6v-0.5h6.6v0.5c-0.8 0-1.4 0.2-1.7 0.6s-0.4 1.2-0.4 2.2v9.2c0 1.5 0.4 2.7 1.2 3.5 0.8 0.9 2 1.3 3.4 1.3 2.2 0 3.9-1 5.2-3"/><path class="st2" d="m193.7 16.9v-0.5h5.5v0.5c-0.9 0-1.5 0.2-1.8 0.6s-0.5 1.2-0.5 2.2v14.8h-0.6l-12.9-15.8v12.8c0 0.9 0.2 1.5 0.5 1.9 0.4 0.4 1 0.6 1.8 0.6v0.5h-5.5v-0.5c0.9 0 1.5-0.2 1.8-0.7s0.5-1.3 0.5-2.4v-10.6c0-1.1-0.2-2-0.6-2.5s-1.1-0.8-2.1-0.9v-0.5h4.7l11.4 14.1v-10.6c0-1.1-0.2-1.9-0.5-2.3s-0.8-0.7-1.7-0.7"/><path class="st2" d="m208.3 16.4v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.3 0.3 0.4 0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.3v-11.3c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.5"/><path class="st2" d="m228.4 16.4v0.6c-1.3 0-2.4 1.2-3.3 3.5l-5.4 14.3h-0.5l-5.6-14.7c-0.5-1.4-1-2.2-1.4-2.6s-0.9-0.5-1.6-0.6v-0.5h6.6v0.5c-1.1 0-1.6 0.4-1.6 1.2 0 0.3 0.1 0.6 0.2 0.9l4.4 11.7 4.2-11.3c0.2-0.5 0.3-0.9 0.3-1.3 0-0.9-0.5-1.3-1.6-1.3v-0.5h5.3"/><path class="st2" d="m241.7 23.3h0.5v4.4h-0.5c-0.2-0.8-0.4-1.3-0.7-1.5s-0.9-0.3-1.8-0.3h-4.5v6.5c0 0.5 0.1 0.8 0.3 1s0.5 0.3 1 0.3h3.2c1.1 0 1.9-0.1 2.4-0.2 0.4-0.1 0.8-0.4 1.1-0.7s0.6-0.9 1-1.6h0.5l-0.8 3.4h-13.1v-0.5c0.8 0 1.4-0.2 1.6-0.6 0.3-0.4 0.4-1.2 0.4-2.2v-11.5c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h13.1v3h-0.3c-0.2-0.9-0.5-1.4-0.8-1.7s-1.1-0.4-2.3-0.4h-5.2v7.8h5.1c0.7 0 1.2-0.1 1.4-0.4 0.1-0.2 0.3-0.7 0.4-1.4"/><path class="st2" d="m252.8 17.1h-1.9v8.3h2.2c1.3 0 2.4-0.4 3.1-1.1 0.8-0.8 1.1-1.8 1.1-3s-0.4-2.2-1.3-3c-0.7-0.8-1.8-1.2-3.2-1.2zm-0.4 9.1h-1.5v5c0 1.1 0.2 1.8 0.5 2.2s0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.4-0.2 1.6-0.6 0.3-0.4 0.4-1.2 0.4-2.2v-11.4c0-1.1-0.1-1.8-0.4-2.2s-0.8-0.6-1.6-0.6v-0.5h7.4c1.8 0 3.3 0.4 4.4 1.3s1.7 2 1.7 3.4c0 2.2-1.2 3.7-3.8 4.5 0.5 0.4 1.1 0.8 1.6 1.4s1.2 1.6 2.1 3.1c0.9 1.6 1.7 2.6 2.2 3.1s1.1 0.8 1.7 0.8v0.5h-3.7c-0.8-0.9-1.7-2.3-2.8-4.1-1.2-1.9-2.1-3.1-2.7-3.6-0.7-0.5-1.4-0.7-2.2-0.7"/><path class="st2" d="m274.5 16.1h0.5v4.3h-0.5c-0.1-1.2-0.6-2.1-1.3-2.8s-1.6-1-2.8-1c-1 0-1.8 0.2-2.4 0.7s-0.9 1.2-0.9 2 0.2 1.5 0.7 2.1 1.6 1.4 3.2 2.4c1.9 1.1 3.2 2.1 3.9 3s1 1.8 1 2.9c0 1.4-0.5 2.6-1.5 3.7-1 1-2.2 1.5-3.7 1.5-0.8 0-1.9-0.2-3.2-0.7-0.5-0.2-0.9-0.3-1-0.3-0.3 0-0.5 0.2-0.7 0.7h-0.5v-4.9h0.5c0 1.4 0.5 2.4 1.3 3.3s1.9 1.2 3.1 1.2c1.1 0 2-0.3 2.7-0.9s1-1.4 1-2.4c0-0.7-0.3-1.4-0.8-2.1s-1.7-1.5-3.4-2.6c-1.4-0.9-2.4-1.6-2.8-2.1-0.5-0.5-0.8-1.1-1.1-1.7s-0.3-1.3-0.3-2c0-1.4 0.5-2.5 1.4-3.4s2.1-1.3 3.6-1.3c0.8 0 1.7 0.2 2.6 0.5 0.4 0.1 0.8 0.2 0.9 0.2s0.2 0 0.3-0.1c0.1 0.2 0.2 0.1 0.2-0.2"/><path class="st2" d="m285.6 16.4v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.2 1.8 0.4 2.3 0.3 0.4 0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.3v-11.3c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.5"/><path class="st2" d="m300.1 17.3h-2.8v14c0 1.1 0.1 1.8 0.4 2.2s0.8 0.6 1.6 0.6v0.5h-6.4v-0.5c0.8 0 1.3-0.2 1.6-0.7 0.3-0.4 0.4-1.2 0.4-2.2v-13.9h-2.6c-1.3 0-2.2 0.2-2.8 0.6s-0.9 1.1-1 2h-0.5v-4.2h0.5c0.5 0.5 1.4 0.7 2.7 0.7h9.5c1.4 0 2.3-0.2 2.9-0.7h0.6v4.2h-0.4c-0.2-1-0.6-1.7-1.2-2.1s-1.4-0.5-2.5-0.5"/><path class="st2" d="m319.6 19-4.1 6.4v5.7c0 1.1 0.1 1.9 0.4 2.3s0.8 0.6 1.6 0.6v0.5h-6.6v-0.5c0.9 0 1.5-0.2 1.8-0.7 0.3-0.4 0.4-1.2 0.4-2.2v-5.7l-3.9-6c-0.6-1-1.2-1.7-1.6-2s-1-0.5-1.7-0.5v-0.5h7.1v0.5c-1.2 0-1.9 0.3-1.9 0.9 0 0.3 0.1 0.6 0.4 1l3.6 5.5 2.9-4.6c0.4-0.7 0.6-1.3 0.6-1.8 0-0.7-0.4-1-1.2-1v-0.5h5v0.5c-0.7 0-1.2 0.2-1.6 0.4s-0.7 0.9-1.2 1.7"/><path class="st2" d="m99.5 58.8c1 0 1.9-0.6 2.7-1.9s1.2-2.8 1.2-4.6c0-0.8-0.2-1.5-0.6-2s-0.9-0.8-1.6-0.8c-1 0-1.9 0.6-2.7 1.9s-1.2 2.8-1.2 4.5c0 0.9 0.2 1.6 0.6 2.1 0.5 0.5 1 0.8 1.6 0.8zm2.6-10.2c0.8 0 1.6 0.4 2.2 1.1s1 1.6 1 2.5c0 1.7-0.6 3.4-1.9 5s-2.8 2.5-4.5 2.5c-1 0-1.8-0.3-2.4-1s-0.9-1.6-0.9-2.7c0-1.9 0.7-3.6 2-5.1 1.3-1.6 2.8-2.3 4.5-2.3"/><path class="st2" d="m113.1 48.9-0.1 0.9h-2.2l-1.8 9.2c-0.5 2.5-1 4.3-1.5 5.5s-1.4 2-2.4 2.6-2.1 0.9-3.3 0.9c-1.6 0-2.8-0.3-3.7-0.9l0.5-2.2h0.5c0.3 1.6 1.3 2.4 2.8 2.4 1.1 0 2.1-0.4 3-1.2s1.6-2.7 2.1-5.7l2-10.7h-2.2l0.1-0.9h2.2l0.8-3.8c0.4-2 1.1-3.5 2-4.2 0.9-0.8 2.1-1.2 3.3-1.2 0.6 0 1.3 0.1 2.2 0.4l0.1-0.4h0.6l-0.6 2.9h-0.5c-0.1-1.5-0.8-2.3-2-2.3-1.5 0-2.6 1.3-3.1 3.9l-1 4.7h2.2"/><path class="st2" d="m135 48.1h0.5v4.4h-0.5c-0.2-0.8-0.4-1.3-0.7-1.5s-0.9-0.3-1.8-0.3h-4.5v6.5c0 0.5 0.1 0.8 0.3 1s0.5 0.3 1 0.3h3.2c1.1 0 1.9-0.1 2.4-0.2 0.4-0.1 0.8-0.4 1.1-0.7s0.6-0.9 1-1.6h0.5l-0.8 3.4h-13.1v-0.5c0.8 0 1.4-0.2 1.6-0.6 0.3-0.4 0.4-1.2 0.4-2.2v-11.5c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h13.1v3h-0.3c-0.2-0.9-0.5-1.4-0.8-1.7s-1.1-0.4-2.3-0.4h-5.2v7.8h5.1c0.7 0 1.2-0.1 1.4-0.4 0.1-0.3 0.3-0.7 0.4-1.4"/><path class="st2" d="m147.8 41.9h-3.5v13.4c0 1.3 0.2 2.2 0.5 2.6s0.9 0.7 1.9 0.7h1.9c2.2 0 4-0.7 5.3-2.2s1.9-3.4 1.9-5.9c0-2.6-0.7-4.8-2.1-6.3s-3.4-2.3-5.9-2.3zm-7.9 17.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.2v-11.5c0-1.1-0.1-1.8-0.4-2.3-0.3-0.4-0.8-0.6-1.6-0.6v-0.5h8.4c3.1 0 5.6 0.9 7.5 2.6 1.9 1.8 2.8 4 2.8 6.7s-0.9 4.8-2.6 6.4-4.2 2.4-7.4 2.4h-8.7"/><path class="st2" d="m167.5 41.2v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.3 0.3 0.4 0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.3v-11.3c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.5"/><path class="st2" d="m183.7 41.7v-0.5h5.5v0.5c-0.9 0-1.5 0.2-1.8 0.6s-0.5 1.2-0.5 2.2v14.8h-0.6l-12.9-15.8v12.8c0 0.9 0.2 1.5 0.6 1.9s1 0.6 1.8 0.6v0.5h-5.5v-0.5c0.9 0 1.5-0.2 1.8-0.7s0.5-1.3 0.5-2.4v-10.6c0-1.1-0.2-2-0.6-2.5s-1.1-0.8-2.1-0.9v-0.5h4.7l11.4 14.1v-10.6c0-1.1-0.2-1.9-0.5-2.3-0.4-0.5-1-0.7-1.8-0.7"/><path class="st2" d="m197.3 50.3h-1.7v5.3c0 1.2 0.1 2 0.4 2.4s0.8 0.6 1.5 0.6h1.5c1.1 0 1.9-0.4 2.6-1.1s1-1.7 1-2.8c0-1.4-0.5-2.4-1.4-3.3-1-0.7-2.3-1.1-3.9-1.1zm-1.7-8.4v7.7h1.9c1.3 0 2.4-0.3 3.1-1s1.2-1.6 1.2-2.8-0.4-2.2-1.1-2.9c-0.8-0.7-1.8-1-3.2-1zm3.9 17.5h-8.4v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.3v-11.4c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.9c2 0 3.5 0.4 4.6 1.2s1.7 1.9 1.7 3.2c0 2-1.2 3.3-3.7 4.1v0.1c1.4 0.3 2.5 0.9 3.4 1.8s1.3 2 1.3 3.3-0.5 2.4-1.6 3.2c-1 0.8-2.4 1.3-4.2 1.3"/><path class="st2" d="m221.6 55.5v-10.9c0-1.1-0.1-1.8-0.4-2.2s-0.8-0.6-1.5-0.7v-0.5h6.4v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.2s0.8 0.6 1.6 0.6v0.5h-4.5v-2.5c-1.7 2-3.7 3-6.1 3-1.9 0-3.4-0.6-4.5-1.7s-1.7-2.7-1.7-4.5v-8.9c0-1.1-0.1-1.8-0.4-2.3-0.3-0.4-0.8-0.6-1.6-0.6v-0.5h6.6v0.5c-0.8 0-1.4 0.2-1.7 0.6s-0.4 1.2-0.4 2.2v9.2c0 1.5 0.4 2.7 1.2 3.5 0.8 0.9 2 1.3 3.4 1.3 2.1 0.1 3.9-0.9 5.2-3"/><path class="st2" d="m235.1 41.9h-1.9v8.3h2.2c1.3 0 2.4-0.4 3.1-1.1 0.8-0.8 1.1-1.8 1.1-3s-0.4-2.2-1.3-3c-0.7-0.8-1.8-1.2-3.2-1.2zm-0.4 9h-1.5v5c0 1.1 0.2 1.8 0.5 2.2s0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.2v-11.4c0-1.1-0.1-1.8-0.4-2.2s-0.8-0.6-1.6-0.6v-0.5h7.4c1.8 0 3.3 0.4 4.4 1.3s1.6 2 1.6 3.4c0 2.2-1.2 3.7-3.8 4.5 0.6 0.4 1.1 0.8 1.6 1.4s1.2 1.6 2.1 3.1c1 1.6 1.7 2.6 2.2 3.1s1.1 0.8 1.7 0.8v0.5h-3.7c-0.8-0.9-1.7-2.3-2.8-4.1-1.2-1.9-2.1-3.1-2.7-3.6-0.6-0.4-1.3-0.7-2.1-0.7"/><path class="st2" d="m264.1 51.5v0.5c-0.8 0-1.4 0.2-1.7 0.6s-0.5 1-0.5 1.9v4.9c-0.4 0.1-1.2 0.2-2.4 0.3s-2.1 0.1-2.7 0.1c-3.4 0-6-0.8-7.8-2.5-1.9-1.7-2.8-3.8-2.8-6.5 0-1.9 0.4-3.6 1.2-5.1s2-2.7 3.4-3.6 3-1.3 4.7-1.3c1 0 2.1 0.2 3.2 0.5 0.7 0.2 1.3 0.3 1.7 0.3 0.5 0 0.9-0.2 1-0.6h0.6v5.4h-0.5c-0.2-1.5-0.9-2.7-2-3.6s-2.5-1.3-4-1.3c-1.9 0-3.5 0.8-4.7 2.3s-1.8 3.5-1.8 5.9c0 2.7 0.7 4.9 2.1 6.6 1.4 1.8 3.2 2.6 5.4 2.6 2 0 3.1-0.6 3.1-1.9v-2c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.7-1.6-0.7h-0.7v-0.5h7.2"/><path class="st2" d="m280 55.9v-5.3h-9.9v5.3c0 1.1 0.2 1.8 0.5 2.2s0.9 0.6 1.6 0.6v0.5h-6.6v-0.5c0.8 0 1.3-0.2 1.6-0.6s0.4-1.2 0.4-2.2v-11.3c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.6v0.5c-0.8 0-1.3 0.2-1.6 0.7-0.3 0.4-0.5 1.2-0.5 2.2v5.2h9.9v-5.2c0-1.1-0.1-1.9-0.4-2.3s-0.8-0.6-1.6-0.6v-0.5h6.5v0.5c-0.8 0-1.3 0.2-1.6 0.6s-0.4 1.2-0.4 2.3v11.3c0 1.1 0.1 1.8 0.4 2.3 0.3 0.4 0.8 0.6 1.6 0.6v0.5h-6.5v-0.5c0.8 0 1.3-0.2 1.6-0.6 0.2-0.4 0.4-1.2 0.4-2.3"/><path class="st2" d="m68.6 36c0-0.6-0.2-1.2-0.2-1.8-0.1-0.6-0.1-1.3-0.2-1.9-0.4-1.7-0.8-3.3-1.4-4.9-0.1-0.2-0.2-0.4-0.3-0.7-0.2-0.5-0.4-0.9-0.6-1.3-0.1-0.1-0.1-0.3-0.2-0.4-0.2-0.4-0.3-0.8-0.5-1.2-0.1-0.2-0.3-0.4-0.4-0.7-0.1-0.2-0.2-0.5-0.3-0.7-0.4-0.7-0.9-1.3-1.3-1.9-0.2-0.2-0.3-0.4-0.5-0.6s-0.4-0.5-0.6-0.7-0.4-0.3-0.5-0.5c-0.1-0.1-0.1-0.2-0.2-0.4s-0.3-0.3-0.4-0.4l-0.2-0.2c-0.2-0.2-0.4-0.5-0.6-0.7s-0.4-0.4-0.6-0.5l-0.6-0.6c-0.3-0.2-0.5-0.4-0.8-0.6s-0.5-0.5-0.8-0.7c-0.2-0.1-0.4-0.2-0.5-0.3-0.2-0.2-0.4-0.3-0.7-0.5-0.2-0.1-0.3-0.3-0.5-0.4-0.1-0.1-0.2-0.1-0.4-0.2s-0.3-0.2-0.5-0.3c-0.5-0.3-1.1-0.6-1.7-0.9-0.2-0.1-0.4-0.3-0.6-0.4-0.4-0.2-0.7-0.4-1.1-0.5-0.3-0.1-0.6-0.2-0.9-0.4-0.1-0.1-0.3-0.2-0.4-0.2s-0.2-0.1-0.3-0.1c-0.2-0.1-0.4-0.2-0.5-0.2-0.6-0.2-1.1-0.3-1.7-0.5-0.3-0.1-0.6-0.2-0.8-0.3-0.6-0.2-1.2-0.3-1.8-0.4l-1.2-0.3c-0.3 0-0.5-0.1-0.8-0.1-0.4-0.1-0.9-0.2-1.4-0.2h-0.5c-0.1 0-0.2 0-0.4-0.1h-0.7c-0.5 0-1.1-0.1-1.7-0.1-0.2 0.1-0.5 0-0.8 0h-0.9-0.2-0.6c-0.1 0-0.2 0.1-0.3 0.1h-0.3-0.3-0.2c-0.1 0-0.3 0-0.4 0.1-0.3 0-0.7 0-0.9 0.2h-0.2c-0.2 0-0.4 0-0.6 0.1-0.5 0-0.9 0.2-1.3 0.3-0.4 0-0.7 0-0.9 0.2-0.2 0-0.4 0-0.5 0.1-0.3 0-0.6 0.2-0.8 0.3s-0.3 0.1-0.5 0.1c-0.3 0-0.6 0.2-0.8 0.3s-0.3 0.1-0.5 0.2c-0.9 0.4-1.8 0.8-2.7 1.3-0.2 0.1-0.3 0.2-0.4 0.3-1.1 0.5-2.1 1.1-3 1.9-0.3 0.2-0.5 0.4-0.8 0.6l-0.4 0.4c-0.3 0.2-0.5 0.4-0.8 0.6-0.5 0.4-1 0.9-1.5 1.4-0.3 0.3-0.6 0.5-0.9 0.8-0.1 0.1-0.2 0.2-0.3 0.4l-0.4 0.4c-0.2 0.2-0.4 0.5-0.6 0.7s-0.4 0.4-0.5 0.6c-0.1 0.1-0.2 0.2-0.2 0.3-0.3 0.4-0.6 0.7-0.9 1.1l-0.6 0.9c-0.3 0.3-0.6 0.8-0.8 1.2-0.1 0.1-0.1 0.2-0.2 0.4-0.2 0.3-0.4 0.6-0.5 0.9-0.2 0.3-0.3 0.7-0.4 1-0.1 0.1-0.1 0.2-0.2 0.4-0.2 0.3-0.3 0.6-0.4 0.9-0.1 0.2-0.1 0.4-0.2 0.6l-0.3 0.6c-0.1 0.2-0.1 0.4-0.2 0.7-0.1 0.2-0.2 0.5-0.3 0.7-0.4 1.4-0.8 2.9-1.1 4.4 0 0.3-0.1 0.6-0.1 0.9s-0.2 0.7-0.2 1 0 0.6-0.1 0.8c0 0.2 0 0.4-0.1 0.6v3.6c0 0.6 0.1 1.2 0.2 1.7v0.7c0.1 0.8 0.2 1.6 0.3 2.3 0.1 0.2 0.1 0.4 0.2 0.6 0.1 0.6 0.3 1.2 0.4 1.8 0.1 0.1 0.1 0.3 0.2 0.4 0 0.1 0.1 0.3 0.1 0.4 0.2 0.6 0.5 1.3 0.7 1.9 0.1 0.2 0.2 0.5 0.3 0.7s0.1 0.3 0.2 0.5l0.6 1.2c0.2 0.3 0.4 0.6 0.5 1 0.1 0.1 0.1 0.2 0.1 0.4l0.2 0.2c0.1 0.1 0.1 0.3 0.2 0.4 0.2 0.3 0.3 0.5 0.5 0.8 0.1 0.2 0.2 0.3 0.3 0.5 0.2 0.2 0.3 0.4 0.5 0.6 0.1 0.2 0.2 0.3 0.3 0.5 0.2 0.3 0.4 0.5 0.6 0.8 0.2 0.2 0.4 0.4 0.5 0.7 0.2 0.2 0.4 0.5 0.7 0.7 0.2 0.2 0.3 0.5 0.6 0.7 0.3 0.3 0.6 0.6 0.9 0.8l0.4 0.4c0.2 0.2 0.5 0.4 0.8 0.6 0.2 0.2 0.5 0.4 0.7 0.7 0.2 0.1 0.3 0.3 0.5 0.4 0.2 0.2 0.4 0.4 0.6 0.5 0.3 0.2 0.5 0.4 0.8 0.6l0.6 0.3c0.2 0.1 0.4 0.3 0.6 0.4s0.4 0.2 0.6 0.4c0.8 0.5 1.6 0.9 2.4 1.3 0.4 0.2 0.7 0.4 1.1 0.5s0.7 0.3 1.1 0.4c0.1 0 0.3 0.1 0.4 0.1 0.3 0.1 0.7 0.3 1 0.4 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.6 0.3 0.9 0.3 0.4 0.1 0.8 0.1 1.1 0.2 0.6 0.1 1.1 0.3 1.7 0.4h0.6c0.3 0 0.6 0.1 0.8 0.1h0.7c0.1 0 0.3 0 0.4 0.1h0.4c0.3 0.1 0.7 0.1 1 0.2h0.5 0.3c0.3 0 0.7 0 1 0.1h0.6c0.4 0 0.8-0.1 1.1-0.1h0.5c0.2 0 0.5-0.1 0.7-0.1l2.4-0.3c0.3-0.1 0.5-0.1 0.8-0.2s0.7-0.1 1-0.2c0.2 0 0.3-0.1 0.5-0.2 0.3-0.1 0.5-0.2 0.8-0.2 0.1 0 0.2-0.1 0.4-0.1 0.2-0.1 0.4-0.1 0.6-0.1 0.4-0.1 0.8-0.3 1.2-0.4 0.2-0.1 0.5-0.2 0.7-0.3s0.5-0.2 0.7-0.3c0.1 0 0.1-0.1 0.2-0.1 0.2-0.1 0.5-0.2 0.7-0.3 0.3-0.2 0.5-0.3 0.8-0.5 0.1-0.1 0.3-0.1 0.4-0.2 0.4-0.2 0.8-0.5 1.2-0.7 0.3-0.2 0.7-0.4 1-0.6s0.6-0.5 0.9-0.7 0.6-0.5 1-0.7l0.2-0.2c0.1 0 0.2-0.1 0.2-0.1 0.3-0.2 0.5-0.5 0.8-0.7l0.6-0.6c0.2-0.2 0.4-0.4 0.7-0.6 0.1-0.1 0.1-0.2 0.2-0.3 0.2-0.2 0.4-0.3 0.5-0.5 0.1-0.1 0.2-0.3 0.3-0.4 0.4-0.4 0.8-0.8 1.1-1.2 0.3-0.3 0.5-0.6 0.8-1 0.2-0.2 0.4-0.5 0.5-0.8l0.3-0.3c0.3-0.4 0.6-0.8 0.9-1.2 0.1-0.1 0.1-0.3 0.2-0.4s0.1-0.2 0.2-0.3 0.1-0.2 0.2-0.4c0.2-0.3 0.4-0.7 0.6-1s0.3-0.5 0.5-0.8c0.1-0.3 0.2-0.5 0.3-0.8s0.3-0.6 0.4-0.8c0.4-1.2 0.9-2.4 1.2-3.6 0-0.1 0.1-0.3 0.1-0.4 0.1-0.5 0.2-0.9 0.3-1.4 0-0.2 0.1-0.5 0.1-0.7 0.1-0.4 0.1-0.8 0.2-1.2 0-0.3 0-0.6 0.1-1 0-0.1 0-0.2 0.1-0.4v-0.8c0-0.1 0.1-0.3 0.1-0.4v-0.6c0.1-1.7 0.2-3 0.1-4.2m-36.3-25.8c0.3 0 0.5-0.1 0.7-0.2 0.4-0.1 0.8-0.2 1.2-0.2h0.9c0.4 0 0.8-0.1 1.2-0.2h0.5c0.2 0 0.4 0 0.6-0.1h1.2c0.2 0 0.5 0 0.7 0.1 0.2 0 0.4 0.1 0.5 0.1h0.8 0.4 0.5c0.2 0 0.4 0.1 0.7 0.1h0.3c0.1 0 0.2 0.1 0.3 0.1s0.2 0.1 0.4 0.1c0.5 0.1 1 0.1 1.5 0.2h0.1c0 0.1-0.8 0-1 0h-0.3-0.7-0.3-0.4-0.3c-0.3 0-0.8-0.1-1.1 0-0.3 0-0.6 0-0.9-0.1-0.1 0-0.4-0.1-0.5 0h-0.4c-0.2 0-0.3-0.1-0.5 0-0.1 0-0.2 0-0.3 0.1h-2.1c-0.1 0-0.3 0-0.4-0.1h-1c-0.2 0-0.7-0.1-0.8 0-0.5 0.1-1 0.1-1.5 0.1zm-3.8 1.1c0.1 0 0.3-0.2 0.4-0.2s0.2-0.1 0.3-0.1c0.1-0.1 0.2-0.1 0.3-0.1 0.3-0.1 0.7-0.2 1-0.3h0.7 0.9 0.5 0.8 1.1c1.3 0 2.6 0.1 3.9 0.1h0.6 0.9c1.5 0 3-0.1 4.5 0h1.5 0.6c0.4 0.1 0.8 0.4 1.2 0.5 0.2 0 0.8 0.1 1 0.3h-0.1-0.2-0.6c-0.2 0-0.4-0.1-0.6-0.1h-0.6-0.3-0.6-0.4-0.6c-0.3 0-1-0.1-1.2 0-0.1 0-0.3-0.1-0.4 0-0.2 0-0.3 0-0.5-0.1h-0.6-0.4-0.5-0.5-1.4-0.5-0.3-0.3c-0.4 0-0.8-0.1-1.2-0.1h-1.4c-0.2 0-0.6-0.1-0.7 0h-1.1-0.4-0.2-1.5-0.2-0.6-0.3c-0.6 0.2-1.3 0.2-2 0.1zm-2.1 0.9c0.1-0.1 0.2-0.1 0.2-0.2 0.7-0.4 1.6-0.2 2.4-0.2h1.4 0.4 0.8 2.9 0.6 0.8 0.3 0.3 0.4c0.5 0 0.9 0.1 1.4 0.1 0.2 0 0.5-0.1 0.7-0.1 0.6 0 1.2 0.1 1.8 0.1 0.3 0 0.6-0.1 0.9-0.1h1.5 0.8 3.3c0.2 0 0.3 0.1 0.5 0.1s0.5 0 0.7-0.1c0.3 0 0.8 0.1 1.1 0 0.4 0 0.7 0.2 1 0.4 0.3 0.1 0.7 0.2 0.9 0.4v0.1h-0.1-0.5-0.6-0.2c-0.2 0-0.9-0.1-1 0h-0.4-0.7c-0.2 0-0.4-0.1-0.6 0h-0.6-0.9c-0.3 0-0.8-0.1-1.1 0h-0.2-0.7-0.3c-0.2 0-0.5-0.1-0.7 0h-0.6-0.4-1-0.4-1.1-0.4-0.9-1.1-0.3-0.9-0.4-0.2-0.3c-1.2 0-2.3-0.1-3.5-0.1h-0.5c-0.1 0-0.3-0.1-0.4 0h-0.7-1.5c-0.2 0-0.8-0.1-0.9 0h-0.7-0.2c-0.3 0-0.5-0.1-0.8-0.1 0-0.1 0.6-0.3 0.7-0.3m-2.7 1.5c0-0.1 0.2-0.1 0.2-0.2 0.1-0.1 0.3-0.2 0.4-0.2 0.1-0.1 0.3-0.2 0.4-0.2 0.4-0.1 1.1-0.1 1.5-0.1h1.3 1.1 0.4c0.7-0.1 1.5 0 2.2 0h1.1c0.5 0 0.9 0.1 1.4 0.1h0.8c0.4 0 0.7-0.1 1.1-0.1 0.8 0 1.6 0.1 2.3 0.1h0.3 0.4 0.6 0.7 0.8c0.5 0 1 0.1 1.6 0.1 0.2 0 0.4-0.1 0.7-0.1h0.5 0.2c0.1 0 0.3 0.1 0.4 0.1h0.6 0.8c0.2 0 0.4-0.1 0.6 0h0.9 0.5 1.8 0.8 1.7 0.8c0.1 0 0.2 0.1 0.3 0.2 0.2 0.2 0.5 0.3 0.7 0.5 0 0.1-0.4 0.1-0.5 0.2h-0.4-0.4-0.5-0.3-1.1-0.4-0.4-0.2-2.7c-0.2 0-0.6-0.1-0.8 0h-0.5c-0.2 0-0.6-0.1-0.8 0h-0.4c-0.2 0-0.5-0.1-0.7 0h-0.5c-0.2 0-0.4-0.1-0.5 0h-0.2-1.2-0.5c-0.2 0-0.7-0.1-0.9 0h-0.3c-0.2 0-0.4-0.1-0.6 0h-0.4-1.8c-0.3 0-0.8-0.1-1.1 0h-0.2c-0.2 0-0.5 0-0.7-0.1h-1.7c-0.2 0-0.3-0.1-0.5-0.1h-1.1-0.3-1.7-0.9c-0.2 0-0.6-0.1-0.8 0h-0.3-0.3-0.8-0.4-0.3c-0.3 0-0.6 0-1-0.1-0.3 0-0.6 0-0.8-0.1v0m-1.7 1.2s0.2-0.1 0.2-0.2c0.3-0.2 0.5-0.3 0.8-0.5 0.2-0.1 0.4-0.1 0.6-0.1s0.5 0 0.7 0.1h1.4 0.7 0.7 0.6c0.3 0 0.6 0.1 1 0.1 0.5 0 1-0.1 1.4 0h0.4 1.1 2.1 1.6 1.1 0.4c0.3 0 0.6 0.1 0.9 0.1 0.4 0 0.8-0.1 1.2-0.1 0.3 0 0.6 0 1 0.1h1 0.4 0.4 0.9 1.5c0.3 0 0.6 0 0.9-0.1h2.1 0.4 2.2c0.3 0 0.7-0.1 1 0 0.4 0 0.7 0.1 1.1 0.1 0.3 0 0.7-0.1 1-0.1 0.2 0 0.4 0 0.6-0.1 0.3 0 0.6 0 0.8 0.1 0.1 0 0.2 0.2 0.3 0.2s0.1 0.1 0.2 0.1c0.2 0.1 0.3 0.3 0.5 0.4l-0.1 0.1h-0.6c-0.2 0-0.4-0.1-0.6 0h-0.2-1.3-1.2-0.4-0.3-0.6-0.7-0.6c-0.2 0-0.3-0.1-0.5 0h-1.5-0.5-0.3-1.1-0.4c-0.4 0-1-0.1-1.3 0h-0.7-1.8c-0.2 0-0.6-0.1-0.8 0h-0.3-0.9-2.5-1.3-0.4-0.4-0.8-0.2-0.8-0.4-1.2c-0.1 0-0.3-0.1-0.4 0h-1.7c-0.1 0-0.3-0.1-0.4 0h-0.3-2.1c-0.3 0-1-0.1-1.2 0h-0.2-1.1c-0.3-0.1-0.7-0.1-1.1-0.2zm-1.7 1.2c0.1 0 0.1-0.1 0.2-0.1 0.2-0.1 0.7-0.6 0.9-0.6h1.2 0.7 0.7 1.2c0.8 0 1.5 0.1 2.2 0.1h0.5 1.2c0.2 0 0.4 0 0.6 0.1h0.7 0.7c0.6 0 1.1-0.1 1.7-0.1h0.8 0.4 0.8c0.4 0 0.9 0.1 1.3 0.1h0.7 0.8 0.4 0.3 0.4 1 0.3c0.2 0 0.4 0 0.6 0.1h0.8 0.5 1.1 0.6 1.1 0.5 0.4 0.7c0.5 0 1 0.1 1.5 0.1 0.9 0 1.7-0.1 2.6-0.1h0.8 0.5 1.3c0.3 0 0.6 0 0.9 0.1 0.2 0 0.4 0 0.5-0.1h0.5c0.3 0 0.6 0 1 0.1 0.1 0 0.8 0.5 0.8 0.7h-0.1-0.6c-0.4 0-0.9-0.1-1.2 0.1h-0.2-0.4c-0.3 0-0.8-0.1-1 0-0.2 0-0.4 0-0.6-0.1h-1.2c-0.2 0-0.6-0.1-0.8 0h-2.4-1.1-0.4-0.9c-0.2 0-0.4-0.1-0.5 0h-0.8-0.3-0.2-1-0.4c-0.2 0-0.9-0.1-1 0-0.2 0-0.7-0.1-0.8 0h-0.2c-0.3 0-0.6-0.1-1-0.1h-0.3c-0.3 0-0.7-0.1-1 0h-0.2c-0.2 0-0.6-0.2-0.8-0.1h-1-0.3c-0.2 0-0.6-0.1-0.8 0h-0.2-1.2-0.4-0.7-0.4-0.3c-0.1 0-0.3 0-0.4 0.1h-0.4c-0.2 0-0.6-0.2-0.8-0.1h-1-0.3-0.3-0.2c-0.5 0-0.9 0-1.3-0.1h-0.3-1.3c-0.2 0-0.6-0.1-0.8 0h-0.4c-0.1 0-0.4-0.1-0.5 0h-0.2-1.2-0.4c-0.8-0.1-1.3-0.1-1.9-0.1zm47 22c0 0.1-0.1 0.1-0.2 0.1h-0.4c-0.2 0-0.5-0.1-0.6 0h-2.4c-0.2 0-0.6-0.1-0.7 0-0.2 0-0.7-0.1-0.8 0-0.2 0-0.4-0.1-0.6 0h-0.9-1.3v0.4h0.2 0.7 0.5 0.8 2.8 1.3 0.7 0.5 0.3c0.1 0 0 0.7 0 0.8h-0.4c-0.2 0-0.7-0.1-0.8 0h-0.5-0.7-1.3-0.3-1.5c-0.2 0-0.5-0.1-0.7 0h-0.7c-0.1 0-0.3-0.1-0.5 0h-0.3v-0.1 0.5h0.1 0.6 0.6 1.1 0.5 0.8 0.3 0.5 0.3 0.3 0.6 0.8c0.2 0 1.1-0.1 1.3 0.1 0.1 0.1 0 0.7 0 0.8 0 0-0.2 0-0.3 0.1h-0.2-1.2-0.4-1.2-0.3-0.3-0.4-0.8c-0.1 0-0.3-0.1-0.5 0h-2-0.2v0.4h0.2 1.4 0.5c0.8 0 1.5 0.1 2.3 0.1h0.9 1.9 0.4c0 0.2 0 0.6-0.1 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.6-0.1-0.7 0h-0.3-0.2c-0.7 0-1.5-0.1-2.2-0.1-0.2 0-0.5-0.1-0.7 0-0.2 0-0.6-0.1-0.7 0h-1.8-0.6v0.4c0.1-0.1 0.5 0 0.7 0h1.6c0.3 0 0.8 0 1.1-0.1 0.4 0 0.7 0 1.1 0.1h1 1c0.3 0 0.7-0.1 1 0 0.2 0 0.1 0.6 0 0.7s-0.2 0.1-0.2 0.1h-0.2-1.5c-0.2 0-0.5-0.1-0.7 0h-0.7-1.7-0.5-0.4c-0.5 0-1 0-1.5-0.1v0.4h0.1 1.1 0.5 0.4 0.6c0.3 0 1 0.1 1.2 0h0.4 0.7 1.4c0.2 0 0.7 0 0.8 0.1 0.1 0 0 0.6 0 0.7 0 0-0.1 0-0.1 0.1-0.2 0-1-0.1-1.1 0h-0.6-0.8-0.4c-0.1 0-0.3 0-0.4 0.1-0.2 0-0.3 0-0.5-0.1h-0.8-0.4c-0.1 0-0.3 0-0.4-0.1h-1.3-0.3v0.4h0.8 0.5 1.6c0.4 0 1 0.1 1.4 0h0.8 0.4 0.4 1.4c0 0.2 0 0.4-0.1 0.5 0 0.1-0.1 0.2-0.1 0.3h-0.7-0.6-0.8-0.6c-0.2 0-0.5-0.1-0.7 0h-0.3c-0.3 0-0.6 0-0.8-0.1-0.8 0-1.6-0.1-2.4-0.1v0.4h0.2 0.3 1 0.9 0.8c0.5 0 1 0.1 1.4 0.1 0.3 0 0.6-0.1 0.9-0.1 0.2 0 1.2-0.1 1.3 0.1 0.1 0.1 0 0.2 0 0.3 0 0.2-0.1 0.4-0.2 0.5-0.5 0-1.1-0.1-1.6 0h-0.3c-0.2 0-1-0.1-1.1 0h-0.7c-0.2 0-0.4-0.1-0.6 0-0.2 0-0.5-0.1-0.7 0-0.6 0-1.1-0.1-1.7-0.1v0.4h1.1c0.3 0 0.7 0.1 1.1 0.1h1.8 0.5 0.3 0.3c0.3 0 1.3 0 1.4 0.1s0 0.2 0 0.3-0.1 0.2-0.2 0.3h-0.4-0.3-0.2c-0.2 0-0.7-0.1-0.8 0h-0.3-1.1-0.4c-0.2 0-0.4-0.1-0.6 0-0.2 0-1.8 0-2.2-0.1v0.5c0.2 0 0.3-0.1 0.5-0.1h2 0.5 1 0.5 0.8 0.3c0.2 0 0.4 0 0.6 0.1 0 0.1-0.2 0.6-0.3 0.7-0.1 0-0.2 0.1-0.3 0.1h-0.8-0.4-0.3-0.2-0.8c-0.1 0-0.3-0.1-0.4 0h-0.2-0.8c-0.2 0-0.5-0.1-0.7 0h-0.3c-0.1 0-0.6 0-0.7-0.1v0.5c0.1-0.1 0.9-0.1 1.1-0.1h0.4 1 0.6 0.5 0.9c0.2 0 0.8-0.1 1.1 0 0.1 0.1-0.1 0.4-0.1 0.4-0.1 0.1-0.1 0.3-0.3 0.3h-0.2c-0.2 0-0.3 0-0.5-0.1h-1-0.3c-0.2 0-0.6-0.1-0.8 0h-0.2-0.5-0.4-1.3v0.5c0.2 0 0.3-0.1 0.4-0.1h0.9 0.4 1.8 0.8 0.5c0.1 0 0.2 0 0.3 0.1s-0.1 0.6-0.2 0.6l-0.2 0.2h-0.6c-0.2 0-0.6-0.1-0.8 0h-0.7-0.6c-0.2 0-0.4-0.1-0.6 0h-1.4v0.4h0.4 0.6c0.2 0 0.4 0 0.6-0.1 0.3 0 0.6 0 0.9 0.1h0.7c0.3 0 0.6 0.1 0.9 0 0.2 0 0.4 0.1 0.6 0.1 0 0.2-0.3 0.7-0.5 0.8h-0.6c-0.3 0-1-0.1-1.2 0h-1.5c-0.2 0-0.5 0-0.7-0.1v0.4h0.7 0.4c0.4 0 0.7 0.1 1.1 0.1h1.1c0.2 0 0.4 0 0.5 0.1 0 0-0.4 0.8-0.7 0.8s-0.9 0-1.2-0.1c-0.5 0-0.9 0-1.4-0.1h-0.7v0.4c0.8 0 1.7 0 2.4 0.1 0.2 0 0.4 0 0.7 0.1v0.1c-0.1 0-0.1 0.1-0.1 0.1-0.5 0.3-0.7 0.7-0.9 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.6-0.1-0.7-0.1-0.2 0-0.6-0.1-0.8 0h-0.8v0.4h1.2 0.5 0.7c0 0.2-0.4 0.7-0.6 0.7h-0.4-1.4v0.4h0.3c0.2 0 1.1 0 1.1 0.1 0.1 0.2-0.4 0.6-0.5 0.7h-0.9c0 0.2-0.1 0.3-0.1 0.4h0.7c0 0.2-0.8 0.9-1 1h-0.1c-0.4 0.6-0.9 1.1-1.7 1.7-0.6 0.5-1.3 0.9-2 1.2h0.1c0.4 0-0.5 0.6-0.6 0.6h-0.9-0.1c-0.6 0.2-1.3 0.4-2 0.5h0.5 0.6 0.3 0.4 0.4v0.1c-0.2 0.2-0.4 0.3-0.6 0.4-0.1 0.1-0.2 0.2-0.4 0.3-0.1 0-0.2 0.1-0.4 0.1h-0.3-2c-0.2 0-0.7-0.1-0.9 0-0.3 0-0.6-0.1-0.8 0h-0.6c-0.4 0-0.7-0.1-1.1-0.1h-0.2-1.7c-0.2 0-0.5 0.1-0.7 0.1-0.7 0.1-1.2 0.2-1.7 0.4h1.7 1.2 2.9 1c0.2 0 0.3 0 0.5-0.1h2.2c-0.1 0-0.3 0.2-0.4 0.2-0.3 0.1-0.6 0.3-0.9 0.4-0.2 0.1-0.4 0.2-0.6 0.2-0.4 0.1-0.8 0-1.2 0h-0.4-0.5-0.6c-0.2 0-0.5-0.1-0.7 0h-1.2-0.6-0.4-0.7c-0.2 0-0.8-0.1-1 0-0.5 0-1.3-0.1-1.9-0.1-0.2 0.2-0.4 0.3-0.5 0.5h0.8c0.7-0.1 1.5 0 2.3 0h1.2 0.7 0.4c0.2 0.1 0.7 0 0.9 0 0.4 0 0.8 0.1 1.1 0.1 0.2 0 0.4 0 0.5-0.1h0.7-0.1c-0.3 0.1-0.5 0.2-0.8 0.3-0.1 0.1-0.3 0.1-0.4 0.2-0.2 0.1-0.4 0.1-0.6 0.2h-0.8-0.5-0.4-0.4-0.2-0.7c-0.1 0-0.4-0.1-0.5 0h-0.4-0.6-0.3-0.4-0.2c-0.2 0-0.8-0.1-1 0h-0.4-0.8c-0.1 0.1-0.1 0.3-0.2 0.4 0.6-0.1 1.4 0 1.9 0s1 0 1.5-0.1c0.2 0 0.4 0 0.6-0.1h1.1 1.1c-0.3 0-0.6 0.2-0.9 0.2-0.2 0-0.4 0-0.6 0.1-0.3 0-0.6 0.1-0.9 0.2h-0.2c-0.2 0-0.3 0-0.5 0.1-0.1 0-0.5 0.1-0.6 0.1h-0.5-0.7-0.2-1.2c-0.6 0-1.2 0.1-2 0h-0.2c-0.3-0.1-0.7-0.1-1-0.2h-0.5c-0.2 0-0.4-0.1-0.7-0.1h-0.6c-1.1-0.2-2.3-0.3-3.3-0.6-0.2 0-0.6-0.1-0.7-0.2 0.5 0.1 1.1 0.1 1.6 0.1s0.9 0.1 1.4 0.1h0.4 0.4 0.6 0.4c0.2 0 0.3 0.1 0.5 0.1h1.4c-0.1-0.2-0.2-0.3-0.3-0.5h-0.7c-0.2 0-0.4-0.1-0.6 0h-1.3c-0.2 0-0.3-0.1-0.5 0-0.4 0-0.8-0.1-1.3-0.1h-1.8c-0.2 0-0.4-0.1-0.6-0.1h-0.4c-0.2 0-0.4-0.1-0.5-0.1-0.1-0.1-0.2-0.1-0.4-0.1s-0.4-0.1-0.6-0.1-0.4-0.1-0.6-0.2c-0.1 0-0.2-0.1-0.3-0.1h0.3 1.2c0.3 0 0.6 0 0.9-0.1h1.2c0.2 0 0.3 0 0.5 0.1 0.3 0 0.6-0.1 0.9-0.1 0.4 0 0.9 0.1 1.3 0.1h1.5 0.9c-0.1-0.1-0.3-0.2-0.5-0.4h-0.4-0.3c-0.3 0-0.6 0-0.9-0.1h-0.3c-0.1 0-0.3-0.1-0.5 0h-1-0.4-1c-0.2 0-0.5-0.1-0.7-0.1s-0.4 0-0.5 0.1h-0.7c-0.7 0-1.5 0-2.1-0.1-0.3 0-0.6 0-0.8-0.1-0.4-0.1-0.8-0.5-1.2-0.7v-0.1h1.3c0.2 0 0.5 0.1 0.7 0.1h0.9 0.7 0.4 0.7 2.1 1.6 0.2 0.4c-0.4-0.2-0.9-0.3-1.4-0.4h-0.2-1.1-0.4-0.3-1.1-0.7-0.6-1.4-0.5-0.7c-0.2 0-0.3-0.1-0.5-0.1-0.3 0-0.7 0-1-0.1s-0.5-0.3-0.7-0.4c-0.1-0.1-0.3-0.1-0.3-0.3 0.6 0 1.3 0 1.9 0.1h1.3 0.6c-1.1-0.1-2-0.3-2.8-0.4h-0.4-0.5-0.2c-0.4 0-0.7-0.1-0.9-0.3l-0.2-0.2h0.3c-1.2-0.4-2.1-1-2.9-1.7-0.5-0.5-0.9-1.1-1.2-1.8h-0.2c-0.2 0-0.7-0.6-0.8-0.8 0 0 0.2 0 0.2-0.1h0.5c0-0.1 0-0.2-0.1-0.3h-1c-0.1 0-0.7-0.6-0.7-0.7v-0.1h0.5 1v-0.4h-0.2-0.3c-0.1 0-0.5-0.1-0.6 0h-0.2-0.7c-0.2-0.1-0.6-0.6-0.6-0.8h0.2 0.5c0.2 0 0.5 0 0.7-0.1h1v-0.4h-0.3-0.4-0.4-0.5-0.3c-0.1 0-0.2 0-0.3 0.1-0.2 0-0.4 0-0.5-0.1-0.1 0-0.5-0.6-0.4-0.7s0.7-0.1 0.8-0.1h2.3v-0.4h-0.9-0.3c-0.2 0-0.5-0.1-0.6 0-0.2 0-0.7-0.1-0.9 0h-0.4c-0.1 0-0.2 0-0.3-0.1s-0.1-0.2-0.2-0.3c-0.1-0.2-0.3-0.4-0.3-0.7 0.2 0 0.4 0.1 0.7 0.1h0.6 1 0.5c0.3 0 0.7 0.1 1 0h0.3v-0.4h-0.8-0.3-1.2-0.4-0.6-0.3-0.4c-0.1 0-0.2 0-0.3-0.1-0.2-0.1-0.4-0.6-0.5-0.8 0 0 0.1 0 0.1-0.1 0.4 0 0.7 0.1 1.1 0.1h0.3 0.3 0.6c0.2 0 0.4-0.1 0.7 0 0.2 0 0.3 0.1 0.5 0.1s0.7-0.1 1 0v-0.4h-0.2-3-0.4-0.6-0.3c-0.1 0-0.3 0-0.4-0.1-0.2-0.1-0.3-0.5-0.3-0.7h0.6 0.5 0.9 0.4 0.4c0.3 0 0.7 0 1 0.1h0.5c0.3 0 0.6 0.1 1 0.1v-0.5h-0.1-1-1c-0.2 0-0.3 0-0.5-0.1h-0.9c-0.2 0-0.5-0.1-0.6 0h-1.2c0-0.1-0.1-0.1-0.1-0.2-0.1-0.1-0.2-0.4-0.1-0.5l0.1-0.1h0.9 0.6 0.4 0.3 0.8 1.3c0.3 0 0.8 0.1 1.1 0.1v-0.4c-0.5 0-1.7-0.1-1.9 0h-0.9-1.1c-0.2 0-0.4 0-0.6-0.1h-0.4c-0.1 0-0.3-0.1-0.4 0h-0.2c-0.1 0-0.2 0-0.3-0.1s-0.3-0.6-0.2-0.7c0.3-0.2 0.9 0 1.3-0.1 0.4 0 0.7 0 1.1 0.1h0.8c0.1 0 0.3 0 0.4 0.1h1.9 0.7v-0.5h-0.3-1-0.5-1.2c-0.1 0-0.4-0.1-0.5 0h-0.8c-0.2 0-0.8-0.1-1 0-0.2 0-0.4 0-0.5-0.1-0.2 0-0.6 0-0.8-0.1-0.1-0.1-0.1-0.2-0.1-0.4 0-0.1-0.1-0.2-0.1-0.2 0.1-0.1 0.7-0.1 0.9-0.1h0.7 1.3 0.3 0.8 0.6 0.5 1.1 0.5v-0.4h-0.5-0.3-0.5-1.1-0.6-0.6c-0.2 0-0.6-0.1-0.8 0-0.3 0-0.5 0-0.8-0.1-0.3 0-1.3 0.1-1.5-0.1-0.1-0.1-0.2-0.6-0.2-0.7h0.5c0.4 0 0.8 0 1.2 0.1 0.1 0 0.2 0 0.3 0.1h1c0.3 0 0.5-0.1 0.8-0.1h0.6 0.5 1c0.2 0 0.9-0.1 1.2 0v-0.4h-0.3-0.8-0.6-0.2c-0.3 0-0.8-0.1-1 0h-0.5c-0.3 0-0.8-0.1-1 0-0.3 0-0.7-0.1-0.9 0-0.2 0-0.8-0.1-1 0-0.2 0-0.8 0-0.9-0.1s-0.1-0.2-0.1-0.3-0.1-0.2 0-0.3h0.1 0.6 1.5 0.6c1.1 0.1 2.2 0 3.4 0h1.1v-0.4h-0.5-1c-0.2 0-0.4 0-0.5 0.1h-0.3c-0.3 0-1.1-0.1-1.3 0-0.2 0-0.4-0.1-0.7-0.1-0.8 0-1.7 0-2.5-0.1-0.1 0-0.4 0-0.5-0.1s-0.1-0.5-0.1-0.7h1.6c0.3 0 0.7 0.1 0.9 0 0.4 0 0.9 0.1 1.3 0.1h0.6c0.3 0 0.5 0 0.8 0.1 0.1 0 0.2-0.1 0.4-0.1h0.7 0.2 0.8v-0.4h-0.4-0.5-0.9-0.5c-0.1 0-0.7-0.1-0.8 0h-0.5c-0.1 0-0.3-0.1-0.4 0-0.5 0-0.9-0.1-1.4-0.1h-0.4-0.7c-0.2 0-0.8 0-0.9-0.2-0.1-0.1-0.1-0.2-0.1-0.3s0-0.3 0.1-0.3c0.2-0.1 0.5 0 0.8 0h2.1 0.6 0.7 0.3 1 0.4 1.2 0.5v-0.4h-1c-0.2 0-0.7-0.1-0.9 0-0.2 0-0.7-0.1-0.8 0h-0.5-1.1-0.6c-0.2 0-0.7-0.1-0.9 0-0.3 0-0.6-0.1-0.9-0.1h-0.2-0.3c-0.6 0-0.6-0.1-0.6-0.7h0.1 0.4c0.3 0 0.9 0.1 1.2 0h0.7 0.7 0.5 0.3 1.6 0.4 0.5 0.4 1v-0.4h-0.5-0.7-0.4-0.6c-0.2 0-0.4-0.1-0.5 0h-0.7-3.2-0.6c-0.1 0-0.2 0-0.3-0.1-0.1 0-0.2 0-0.3-0.1s-0.1-0.6-0.1-0.8c0.2 0 0.4 0 0.5-0.1 0.3 0 0.8 0.1 1.1 0h0.4 0.3 0.7 0.5 0.5 0.4 3.5v-0.4h-0.6-1.2-0.5c-0.2 0-0.4-0.1-0.5 0h-1.7-0.3-1.6c-0.2 0-0.4-0.1-0.5 0h-0.2c-0.2 0-0.5 0-0.7-0.1-0.1-0.1-0.1-0.6 0-0.7s0.1-0.1 0.2-0.1c0.8 0 1.6 0 2.4 0.1h0.6 2 0.4 0.3 1.4 0.5v-0.4c-0.2 0-0.4-0.1-0.6 0h-2.6c-0.2 0-0.7-0.1-0.8 0h-3.1c-0.2 0-0.5 0-0.8-0.1 0-0.1 0-0.2-0.1-0.3 0-0.2 0-0.4 0.1-0.5 1.1 0 2.2 0.1 3.3 0.1h0.4c0.3 0 0.6 0.1 1 0.1h0.4 0.9c0.2 0 1.5 0 2 0.1v-0.5h-0.3-0.5-0.4-1.2-0.4-1.1-1.6c-0.2 0-0.6-0.1-0.7 0h-0.6c-0.4 0-0.7-0.1-1.1-0.1 0-0.2 0-0.7 0.1-0.7h0.4 0.3 0.4 1 0.8 1 1.8 2v-0.4h-0.2-0.4c-0.1 0-0.3-0.1-0.4 0-0.2 0-0.5-0.1-0.7 0-0.4 0-0.7 0-1-0.1h-0.4-0.5c-0.2 0-0.5-0.1-0.6 0h-0.8-0.4-0.9c-0.1 0-0.3-0.1-0.4 0h-0.9v-0.1c0-0.2 0-0.7 0.2-0.7h1.2 0.6 1.5 0.8 0.3c0.2 0 0.4 0 0.6 0.1h2.4v-0.4h-0.6-2.3c-0.3 0-0.9-0.1-1.1 0-0.1 0-0.3-0.1-0.4 0h-0.2-1c-0.4 0-0.7-0.1-1.1-0.1h-0.3c-0.2 0-0.5 0-0.7-0.1-0.1 0 0-0.1 0-0.1 0.1-0.5 0.1-0.6 0.7-0.6h0.4 0.5c0.3 0 0.7 0 1.1 0.1h0.5c1.5 0 3.1 0 4.6 0.1v-0.4h-0.3-1.2-0.6-0.5c-0.2 0-0.5-0.1-0.7 0-0.4 0-0.9 0-1.3-0.1h-0.4c-0.2 0-0.7-0.1-0.8 0h-1.6v-0.1c0-0.2 0-0.6 0.2-0.6 0.2-0.1 0.5-0.1 0.7-0.1h1 0.3c0.8 0.1 1.6 0.1 2.4 0.1h0.7 1 0.5 0.8v-0.4h-0.3-0.5-1.4c-0.1 0-0.4-0.1-0.5 0h-2.9-1.2c-0.2 0-0.3 0-0.4-0.1 0-0.1 0.1-0.5 0.2-0.6 0.1 0 0.1-0.1 0.2-0.1 0.6 0 1.2 0 1.8 0.1h0.7c0.1 0 0.3-0.1 0.4 0 0.8 0 1.6 0.1 2.4 0.1h0.7 0.9v-0.4h-0.6-0.4-1.5c-0.2 0-0.5-0.1-0.6 0-0.6 0-1.2 0-1.8-0.1-0.2 0-0.6-0.1-0.7 0h-0.2c-0.4 0-0.7-0.1-1.1-0.1 0-0.2 0.1-0.6 0.3-0.7 0.1-0.1 0.2 0 0.2-0.1 0.1 0 0.2 0 0.4 0.1h0.4 0.6 0.7c0.5 0 1 0.1 1.5 0.1h1.8 1.1v-0.4c-0.3 0-0.7 0-0.9 0.1h-0.5-0.5-0.3-0.6-0.3-1.9c-0.2 0-0.6-0.1-0.8 0-0.2 0-0.8 0-0.9-0.1s0.1-0.6 0.1-0.6c0.1-0.1 0.2-0.1 0.3-0.1 0.3 0 0.6 0.1 1 0.1h1 0.3 0.6 0.7 0.9 1.6v-0.4h-0.5c-0.2 0-0.7-0.1-0.9 0-0.1 0-0.3-0.1-0.4 0h-0.3c-0.4 0-0.7-0.1-1.1-0.1h-0.4-0.6-0.3-0.3c-0.3 0-1 0.1-1.2-0.1 0-0.2 0.2-0.6 0.3-0.7 0.5 0 1 0.1 1.5 0.1h1.4c0.1 0 0.3 0 0.4 0.1h0.6 0.4 1.1 0.5v-0.4h-0.3-1.3-1.1c-0.2 0-0.6-0.1-0.8 0-0.1 0-0.2 0-0.3 0.1-0.2 0-0.5-0.1-0.7-0.1h-1.1c0-0.2 0.1-0.3 0.2-0.5 0-0.1 0-0.2 0.1-0.3 0-0.1 0.1-0.1 0.2-0.1h1 0.6c0.5 0 1 0.1 1.4 0.1h0.9c0.5 0 1 0 1.4 0.1v-0.4c-0.2 0.1-1.1 0.1-1.3 0-0.2 0-0.5-0.1-0.6 0h-0.6-0.4-1.6c-0.2 0-0.4-0.1-0.6-0.1 0-0.3 0.2-0.6 0.3-0.8 0.2 0 0.4 0.1 0.6 0h1.5 0.4 1.7c0.3 0 0.5 0.1 0.8 0.1v-0.4h-0.2c-0.2 0-0.5-0.1-0.7 0h-1.2c-0.2 0-0.6-0.1-0.7 0h-0.2c-0.3 0-0.7 0-1-0.1-0.2 0-0.4 0-0.6-0.1v-0.1c0-0.1 0.2-0.5 0.3-0.6 0 0 0.1-0.1 0.2-0.1h1.3 1.7 1.2v-0.4h-0.3-0.5c-0.2 0-0.6-0.1-0.8 0-0.2 0-0.5-0.1-0.7 0-0.3 0-0.7-0.1-0.9 0h-0.4-0.4c0-0.1 0.3-0.7 0.4-0.8 0.2-0.1 0.6 0 0.8 0h1.2 0.7 0.3 0.5 0.1v-0.4h-0.1c-0.2 0-0.4 0-0.5 0.1h-0.4c-0.2 0-0.4-0.1-0.6 0h-0.2-0.2-0.4-0.9c-0.1 0 0-0.2 0-0.2 0.1-0.1 0.3-0.5 0.4-0.6s0.3-0.1 0.4-0.1h0.6 1 0.4 0.4v-0.4h-0.2-0.8-0.3c-0.2 0-0.6-0.1-0.8 0h-0.3c0-0.2 0.1-0.3 0.2-0.4s0.1-0.3 0.3-0.3h0.3 1 0.5 0.3v-0.4c-0.2 0-0.5-0.1-0.7 0h-0.2c-0.2 0-0.5 0-0.6-0.1 0-0.2 0.3-0.3 0.4-0.4s0.2-0.3 0.3-0.4h0.9v-0.3h-0.5v-0.1s0.5-0.6 0.6-0.7c0.2-0.4 1.5-1.4 1.7-1.6 0.2-0.1 0.4-0.3 0.6-0.4 0.3-0.1 0.7 0 1.1 0h1.4 1.3 0.8 2.9 0.3 0.6c0.6 0 1.2-0.1 1.8 0 0.7 0 1.4 0.1 2.1 0.1 0.4 0 0.8-0.1 1.2 0 0.3 0 0.5 0.1 0.8 0.1h2.1 1.4 0.4 0.7 0.4 0.3 0.5c0.2 0 0.4 0.1 0.6 0.1h0.6 2.3 0.8c0.5 0 0.9-0.1 1.4-0.1s0.9 0.1 1.4 0h0.7 0.5 2.1 1.9 0.4c0.5 0 1 0.1 1.6 0 0.2 0 0.4-0.1 0.7-0.1 0.2 0 0.4 0 0.6-0.1h1.3c0.2 0 0.5-0.1 0.7 0 0.1 0 0.2 0.1 0.2 0.2 0.4 0.3 1.3 1.1 2 1.8v0.1h0.1c0.2 0.1 0.5 0.4 0.4 0.5 0 0.1-0.2 0.1-0.3 0.1h-0.3v0.4c0.3 0 0.6 0 0.9 0.1 0.2 0.1 0.6 0.6 0.6 0.8h-0.2c-0.1 0-1 0-1.3-0.1v0.4h1.7 0.3c0.1 0.1 0.2 0.3 0.3 0.4 0 0.1 0.2 0.2 0.1 0.3 0 0.1-0.1 0.1-0.1 0.1h-1.3-0.4-0.6v1.7h1.8c0.3 0 0.7 0 0.9 0.1 0.1 0.1 0.4 0.6 0.5 0.8 0 0-0.1 0-0.1 0.1-0.2 0-0.7-0.1-0.8 0h-0.5c-0.2 0-0.5-0.1-0.7 0h-0.2c-0.3 0-0.6 0-0.9-0.1v0.4c0.8 0 1.8 0.1 2.6 0.1 0.2 0 0.9-0.1 1 0s0.1 0.2 0.2 0.3c0 0.1 0.1 0.1 0.1 0.2s0.1 0.2 0.1 0.3c-0.1 0-0.1 0-0.2 0.1-0.3 0-0.8-0.1-1-0.1h-0.2-0.5-1.3-0.5-0.4v0.4h0.4 0.8 0.5 1.9 0.7c0.2 0.1 0.2 0.3 0.3 0.4s0.1 0.2 0 0.3h-0.3c-0.2 0-0.5-0.1-0.6 0h-0.3c-0.2 0-0.6-0.1-0.7 0h-0.8-0.3-0.7-0.3-0.4v0.4c0.3-0.1 0.7-0.1 0.9-0.1h0.1c0.4 0.1 0.8 0 1.1 0h2.1c0.2 0 0.4-0.1 0.5 0s0.3 0.5 0.3 0.7c0.1 0-0.2 0.1-0.2 0.1h-0.7c-0.2 0-0.5-0.1-0.7 0h-0.9-0.2c-0.2 0-0.8-0.1-0.9 0h-1.4v0.4h0.5 1c0.3 0 0.5 0.1 0.8 0.1h0.7 1.4 0.5 0.4c0.1 0 0.3 0.7 0.3 0.8-0.2 0.1-0.7 0-0.9 0h-0.4-0.2-0.5c-0.2 0-0.6-0.1-0.8-0.1-0.1 0-0.2 0-0.3 0.1h-1-0.4c-0.2 0-0.4-0.1-0.6 0h-0.6v0.3h0.7 0.4 0.5 1.9c0.4 0 1 0.1 1.4 0 0.2 0.1 0.9-0.1 1 0.1 0.1 0.1 0.1 0.3 0.2 0.5s0.1 0.2-0.1 0.3h-1.2c-0.2 0-0.5-0.1-0.6 0h-0.7-0.3-0.5-0.6-0.3c-0.3 0-0.7-0.1-0.9 0h-0.7v0.4c0.3-0.1 1 0 1.2 0h1.2 0.8 0.6 0.5c0.4 0 0.8 0 1.2-0.1h0.3c0.2 0 0.4 0 0.5 0.1s0.3 0.6 0.1 0.7-0.5 0-0.7 0h-1.6-0.6-0.4c-0.2 0-0.8-0.1-1 0h-0.5c-0.2 0-0.4-0.1-0.6 0-0.4 0-0.7-0.1-1.1-0.1v0.4h0.5 0.9 1.7 0.3 0.3 0.9 0.4 0.5 0.6c0.1 0 0.3 0 0.4 0.1 0.2 0.1 0.2 0.5 0.3 0.7h-0.3-0.1-0.3-1.2-0.4-0.3-1.1c-0.2 0-0.4-0.1-0.6 0h-0.7-1-1v0.4h0.2 0.6 1.1 0.8 0.6 0.8 0.8 0.6c0.2 0 0.6 0.1 0.8 0 0.2 0 0.4 0 0.6 0.1 0.1 0.1 0.2 0.5 0.2 0.7 0 0-0.1 0-0.1 0.1h-0.5-0.6-2-0.8c-0.2 0-0.8-0.1-1 0h-1.5-0.5-0.3v0.4h0.4c0.5-0.1 0.9 0 1.4 0h2c0.4 0 0.9 0.1 1.2 0 0.3 0 2.1 0 2.3 0.1 0.1 0.2 0.1 0.5 0.1 0.7 0 0-0.1 0-0.2 0.1h-1.3c-0.1 0-0.3-0.1-0.4 0h-0.5c-0.2 0-0.7-0.1-0.9 0h-0.6-2.2c-0.2 0-0.4-0.1-0.5 0-0.1 0-0.7 0-0.9-0.1v0.4h0.6 0.5 0.6 0.5 1.8 0.4c0.5 0 1 0.1 1.5 0h0.5c0.2 0 1 0 1.1 0.1s0.2 0.5 0.2 0.7h-0.1-0.6c-0.2 0-0.5-0.1-0.7 0h-0.6-0.3c-0.4 0-0.7-0.1-1-0.1h-1.2-0.3-0.4-0.8c-0.1 0-0.3-0.1-0.4 0h-1.2v0.5c-0.8-0.2-0.6-0.2-0.4-0.2 0.3 0 0.5 0.1 0.8 0.1h0.8c0.3 0 0.6 0 0.9-0.1h3.3c0.2 0 1.3 0 1.4 0.1s0 0.2 0 0.3 0.1 0.3 0 0.4c-0.1 0.2-0.8 0-1 0.1h-0.3-0.9c-0.2 0-0.5-0.1-0.6 0-0.2 0-0.8-0.1-0.9 0-0.2 0-0.5-0.1-0.7 0h-1.4-0.4-0.5-0.4-0.4v0.4c0.3-0.1 0.8 0 1.1 0h0.6 1.2 0.7 1.3 2.2c0.3 0 0.5 0 0.8 0.1 0 0.2 0.2 0.6 0 0.7-0.1 0-0.2 0-0.2 0.1-0.2 0-0.4 0-0.6 0.1h-0.9-0.3-0.4c-0.3 0-0.7-0.1-1 0-0.3 0-0.6-0.1-0.9 0h-0.7c-0.2 0-0.6-0.1-0.7 0h-0.7-0.4-1v0.4h0.1c0.5 0 1-0.1 1.6-0.1h1.1c0.2 0 0.3 0.1 0.5 0h0.4 1.8 1.3 0.4c0.1 0 0.6 0 0.7 0.1v0.3c-0.3-0.1-0.3 0-0.4 0.1"/><path class="st2" d="m57.9 23.8v-0.8-0.8-0.4-1.2-1.8c0-0.2 0-0.4-0.1-0.6h-0.4-0.4-0.6c-0.4 0-0.9-0.1-1.3 0h-0.8-0.4-0.4-0.4c-0.2 0-0.3-0.1-0.5-0.1h-0.7-0.5-0.7c-0.3 0-0.7 0-1-0.1h-0.6c-0.2 0-0.3-0.1-0.5-0.1h-1.4-0.3-1.5-0.7-3.3-0.6-1.2-0.6c-0.3 0-0.5 0-0.8-0.1h-0.7-0.8c-0.4 0-0.7 0.1-1.1 0.1h-1.2-1.9-0.6-1.4-0.8c-0.2 0-0.4-0.1-0.7-0.1h-0.8-0.6-1.9-1.5-0.9-1.4c-0.5 0-1 0.1-1.5 0-0.4-0.1-0.9 0-1.3 0h-0.1c-0.1 0.2 0 0.5 0 0.7v0.8 1.2 1 2.8 0.5 0.8 1.1 3.3c0 0.2 0 0.5-0.1 0.7v0.8 0.4 1.9 0.8c0 0.3-0.1 0.6-0.1 0.9v0.7 0.6 1.1 0.5 0.6 0.7 0.9c0 0.4-0.1 0.8-0.1 1.2v0.4 0.8 0.7c0 1.8-0.1 3.5-0.1 5.2v1.2 1.9 0.4c0 0.6-0.1 1.3-0.1 1.9v0.5c0 0.9 0 1.7 0.2 2.5 0.1 0.2 0.1 0.3 0.2 0.5 0.1 0.3 0.2 0.7 0.4 1 0.3 0.4 0.6 0.8 1 1.1 0.1 0 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.3 0.2 0.2 0.1 0.3 0.1 0.5 0.2s0.5 0.2 0.7 0.3 0.5 0.1 0.7 0.2c0.4 0.1 0.9 0.3 1.4 0.4s0.9 0.1 1.4 0.2c1.4 0.2 2.8 0.4 4.2 0.5h0.9c0.4 0 0.8 0.1 1.2 0.1l1.2 0.3c0.2 0 0.4 0.1 0.6 0.1s0.4 0.1 0.6 0.1c0.2 0.1 0.4 0.2 0.5 0.2 0.2 0.1 0.3 0.1 0.5 0.2 0.8 0.3 1.5 0.9 2.2 1.5 0.2 0.3 0.4 0.5 0.6 0.8 0.1 0.2 0.2 0.3 0.3 0.5 0 0 0 0.1 0.1 0.1 0.3-0.8 0.7-1.5 1.3-2.1 0.2-0.2 0.5-0.3 0.8-0.5s0.6-0.5 1-0.5c0.2-0.1 0.4-0.1 0.5-0.2 0.2-0.1 0.5-0.2 0.8-0.2 0.1 0 0.2-0.1 0.2-0.1 0.1-0.1 0.3-0.1 0.4-0.1h0.2c0.1 0 0.1-0.1 0.2 0 0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.2-0.1 0.3-0.1 0.1-0.1 0.2-0.1 0.3-0.1h0.2c0.1-0.1 0.2-0.1 0.3-0.1h0.2 0.2 0.2 0.2c0.1-0.1 0.4 0 0.5 0h0.2 0.3c0.2-0.1 0.4 0 0.6 0h0.2c0.2-0.1 0.4-0.1 0.6-0.1 0.1 0 0.2-0.1 0.3-0.1s0.2-0.1 0.3-0.1h0.2c0.1-0.1 0.3 0 0.4 0s0.2-0.1 0.3-0.1c0.1-0.1 0.3 0 0.5 0 0.1-0.1 0.5-0.2 0.7-0.2 0.1 0 0.2-0.1 0.3-0.1h0.2c0.2-0.1 0.3-0.1 0.6-0.1 0.1-0.1 0.3-0.1 0.4-0.1 0.1-0.1 0.4-0.2 0.5-0.2s0.2-0.1 0.2-0.1c0.3-0.1 0.6-0.2 0.9-0.3s0.7-0.3 1-0.4c0.2-0.1 0.3-0.1 0.5-0.2 0.3-0.1 0.5-0.3 0.7-0.5 0.1-0.1 0.3-0.2 0.4-0.3 0.2-0.2 0.4-0.3 0.6-0.6s0.4-0.8 0.5-1.1c0-0.2 0.1-0.4 0.1-0.6s0.1-0.4 0.1-0.5v-0.9-1-0.3-0.5-1.7-1.4-0.6-0.3-0.8-1.6-2.2c0-0.2 0-0.4 0.1-0.6v-1.1c0-0.2 0-0.3 0.1-0.5 0-0.3-0.1-0.6-0.1-0.9 0-0.8 0.1-1.5 0.1-2.3 0-0.3-0.1-0.6-0.1-0.8v-0.6-0.3-0.5-0.3-0.8c0-0.5 0-1.1 0.1-1.6v-0.4-0.3-0.6-0.8-0.7-0.3c0-0.5-0.1-1-0.1-1.5v-0.8-0.4c0-0.3 0-0.7-0.1-1v-0.6-0.8-0.7-0.7-0.4c-0.2 0-0.2-0.3-0.2-0.7m-0.7 9.7v0.2 0.4 0.4 2.2 0.3 0.4 0.3 0.3 0.3 0.6c0 0.3 0.1 0.6 0.1 0.9v0.4 0.3 0.4 0.2 0.5c0 1.7 0 3.4-0.1 5.1v1.8 0.5 2.1c0 0.2-0.1 0.4-0.1 0.6s0.1 0.3 0.1 0.5 0 0.3-0.1 0.5v0.2 0.2 0.3 0.7 0.3 0.6c0 0.6 0 1.2-0.1 1.8v0.4c0 0.3-0.2 0.6-0.3 0.9-0.3 0.5-0.9 0.9-1.4 1.2-0.3 0.2-0.5 0.4-0.8 0.5-0.3 0.2-0.7 0.3-1.1 0.4s-0.9 0.3-1.3 0.4c-0.2 0-0.3 0.1-0.5 0.1-0.5 0.1-0.9 0.2-1.4 0.3h-0.3c-0.3 0.1-0.6 0.1-1 0.2-0.4 0-0.7 0.1-1.1 0.1s-0.8 0.1-1.2 0.1h-1c-0.3 0-0.5 0.1-0.8 0.1h-0.5c-0.6 0.1-1.2 0.3-1.9 0.4-0.3 0.1-0.7 0.1-1 0.2-0.2 0.1-0.3 0.1-0.5 0.2-0.1 0-0.3 0.1-0.4 0.1-0.9 0.5-1.7 1.1-2.3 1.9-0.1 0.1-0.1 0.2-0.2 0.3 0 0-0.2 0.1-0.2 0.2h-0.1c-0.1-0.1-0.2-0.2-0.2-0.3-0.3-0.3-0.5-0.6-0.8-0.8-0.2-0.2-0.5-0.3-0.8-0.5-0.1-0.1-0.3-0.2-0.4-0.3-0.2-0.1-0.5-0.2-0.7-0.4-0.3-0.1-0.7-0.2-1-0.4-0.2-0.1-0.4-0.1-0.7-0.2-0.1 0-0.2-0.1-0.3-0.1-0.4-0.1-0.7-0.1-1-0.2-0.1 0-0.2-0.1-0.4-0.1h-0.4c-0.3 0-0.5-0.1-0.8-0.1h-0.8c-0.1 0-0.3-0.1-0.4-0.1h-1c-0.7-0.1-1.4-0.2-2-0.3-0.3 0-0.6 0-1-0.1-0.3 0-0.7-0.1-1-0.2-0.4-0.1-0.8-0.1-1.2-0.2-0.5-0.1-1-0.4-1.5-0.6-0.7-0.3-1.5-0.8-1.9-1.5-0.6-1-0.6-2.4-0.6-3.7 0-0.2-0.1-0.3 0-0.5 0-0.1 0-0.3 0.1-0.4v-0.4-1-0.8-0.3-0.3-0.7c0-0.5 0.1-1 0.1-1.5 0-1.2 0-2.3 0.1-3.4v-0.5-1c0-0.3 0.1-0.6 0.1-0.9v-3.8c0-0.3 0-0.6 0.1-0.9v-0.7-2.1-1c0-0.2 0-0.5 0.1-0.7v-1.4-3.2c0-0.1 0-0.3 0.1-0.4v-0.2-0.7-1.9-1.1c0-0.2 0-0.3 0.1-0.5v-0.5c0-0.2 0.1-0.3 0.1-0.5v-2-0.7-0.5-0.5c0-0.2-0.1-0.9 0.1-1.1 0.1-0.1 0.3 0 0.5 0 0.2-0.1 0.7 0 1 0 0.2-0.1 0.4 0 0.6 0h2c0.1-0.1 0.4 0 0.6 0 0.2-0.1 0.4 0 0.6 0h0.3c0.2-0.1 0.4 0 0.6 0 0.5 0 1 0.1 1.5 0.1 0.2-0.1 0.6 0 0.9 0 0.2-0.1 0.7 0 0.9 0h1.1c0.1-0.1 0.3 0 0.4 0h0.9c0.2-0.1 0.4 0 0.6 0h0.3c0.3 0 0.6 0.1 0.9 0.1 0.1-0.1 0.3 0 0.5 0h0.4 0.5c0.2-0.1 0.8 0 1.1 0h0.6 0.3 0.6 2.3 0.3 0.2c0.3-0.1 0.8 0.1 1.1 0.1h0.2 0.2c0.2-0.1 0.5 0 0.7 0h1.6c0.2 0 0.4 0.1 0.6 0.1h0.3c0.1-0.1 0.3 0 0.4 0h0.8 0.2c0.3-0.1 0.6 0 0.9-0.1 0.4 0 0.7 0.1 1 0.1h0.7 0.2c0.2-0.1 0.6 0 0.8 0h1c0.1-0.1 0.6 0 0.7 0h1.9c0.2 0 0.4 0 0.5 0.1h0.4 0.3 1 1.5s0.3-0.1 0.3 0v1.5 1.5 2.8c-0.1 1.7 0 3.3 0 5v0.7c0 0.3-0.1 0.6 0 0.9v0.4 1.1c-0.4 0-0.4 0.2-0.4 0.5"/><path class="st2" d="m41.5 56.8c-0.1-0.3-0.2-0.5-0.2-0.7 0-0.1 0-0.2-0.1-0.3 0-0.1-0.1-0.1-0.2-0.1-0.1 0.1-0.2 0.1-0.2 0.2 0 0.2 0.1 0.4 0.2 0.6s0.2 0.5 0.3 0.8c0.1 0.2 0.1 0.3 0.2 0.5 0.1 0.1 0.3 0.3 0.5 0.2 0.1 0 0-0.2-0.1-0.3-0.2-0.3-0.3-0.6-0.4-0.9"/><path class="st2" d="m30.7 43.8c0.1-0.2 0.2-0.4 0.3-0.5s0.2-0.2 0.3-0.2c0.1-0.1 0.2-0.2 0.3-0.4 0.1-0.1 0.2-0.1 0.2-0.2 0.1-0.3 0.1-1 0.1-1.3v-0.9-0.6-1.2-0.6c0-0.5 0.1-1.1 0-1.6v-1.5-0.5-0.4-1-0.5-0.8c0-0.2 0.1-0.5 0-0.7-0.2 0.1-1 0.9-1 1.2-0.1 0.2 0 0.6 0 0.9 0 0.4-0.1 0.8-0.1 1.2v0.3 0.6c0 0.3-0.1 0.6-0.1 1v0.6 0.6 0.8c0 0.4-0.1 0.9-0.1 1.3 0 0.3 0 0.6 0.1 0.8 0 0.2-0.1 0.5-0.1 0.7s0.1 0.4 0 0.6c0 0.3-0.1 0.6-0.1 0.9 0.2 0.4 0.2 0.9 0.2 1.4"/><path class="st2" d="m44.8 44.1c0-0.3-0.2-0.5-0.4-0.7-0.1-0.1-0.2-0.3-0.4-0.4-0.3-0.2-0.6-0.4-1-0.4h-0.6c-0.1 0.1-0.3 0-0.4 0.1-0.2 0.1-0.5 0.1-0.7 0.2-0.7 0.2-1.3 0.5-1.9 0.8-0.2 0.1-0.4 0.3-0.6 0.4s-0.3 0.4-0.6 0.5c-0.2 0-0.3-0.2-0.4-0.3-0.1 0-0.1-0.1-0.2-0.1-0.3-0.2-0.5-0.5-0.8-0.6-0.5-0.3-0.9-0.3-1.5-0.4-0.2 0-0.3-0.1-0.5-0.1-0.8-0.2-1.9-0.2-2.6 0.3-0.2 0.1-0.3 0.2-0.4 0.4-0.3 0.2-0.4 0.3-0.5 0.6 0 0.1-0.1 0.2-0.1 0.3 0.1 0.1 0.3 0.1 0.4 0.1 0.1-0.1 0.4 0 0.5 0h1.4c0.1-0.1 0.3-0.1 0.5-0.1h1 0.4c0.4 0 0.8 0.1 1.3 0.1h0.1 0.6c0.1 0 0.1 0 0.2 0.1s0 0.3 0.1 0.4c0.1 0.4 0.4 0.6 0.8 0.6 0.5 0 0.8-0.4 0.8-0.9v-0.2c0.1-0.1 0.2-0.1 0.4-0.1h0.2 0.2c0.1-0.1 0.5 0 0.7 0 0.1 0 0.2-0.1 0.3-0.1 0.2-0.1 0.4-0.1 0.6-0.1h0.2c0.2-0.1 0.4 0 0.6 0 0.2-0.1 0.4-0.1 0.6-0.1h1.7c-0.2-0.3 0-0.2 0-0.3"/><path class="st2" d="m32.3 41.6v0.7h0.3c0.1 0 0.2-0.1 0.3-0.1s0.2-0.1 0.3 0h0.2c0.3-0.1 0.9 0 1.2 0.1s0.6 0 0.9 0.1c0.4 0.1 0.9 0.3 1.3 0.5 0.1 0.1 0.8 0.6 0.8 0.6 0.2-0.3 0.2-0.6 0.2-0.9 0.1-0.4 0.1-0.8 0.1-1.2 0-0.6 0.1-1.2 0.1-1.9v-0.8-2.3c0-1.2 0.1-2.4 0-3.6 0-0.4 0-0.8-0.2-1.1-0.4-0.6-1-0.8-1.6-1-0.2-0.1-0.3-0.1-0.5-0.2-0.2 0-0.4-0.1-0.6-0.1-0.3-0.1-0.6-0.1-0.9-0.1h-1.3c-0.1 0.1-0.3 0-0.4 0.2s0 0.6 0 0.8v2.2 1.3c0 0.4-0.1 0.7-0.1 1.1 0 0.3 0.1 0.5 0.1 0.8v1.7c0 0.2 0 0.5-0.1 0.7v1.4c0 0.2 0 0.5-0.1 0.7-0.1 0 0 0.2 0 0.4m4.6-0.7c-0.4-0.2-0.9-0.4-1.4-0.5-0.2-0.1-0.3-0.1-0.5-0.1-0.3-0.1-0.5-0.1-0.8-0.2-0.3 0-0.6-0.1-0.9-0.1h-0.1c-0.2-0.1-0.2-0.6 0.1-0.6 0.2 0 0.4 0.1 0.6 0.1s0.4 0.1 0.6 0.1c0.2 0.1 0.3 0.1 0.5 0.2 0.5 0.2 0.9 0.3 1.3 0.5 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.6 0.4 0.8 0.6 0.1 0.1 0.2 0.1 0.2 0.2-0.3 0-0.5-0.2-0.7-0.3m0.6-2.9c-0.1 0-0.1 0 0 0-0.3 0.1-1-0.6-1.2-0.7-0.3-0.1-0.5-0.2-0.8-0.3-0.4-0.1-0.7-0.3-1.1-0.4-0.2 0-0.3 0-0.5-0.1-0.2 0-0.6 0-0.7-0.1-0.2-0.2-0.1-0.6 0.2-0.6 1.2 0.1 2.2 0.6 3.1 1.2 0.3 0.1 0.9 0.5 1.1 0.8-0.1 0.1 0 0.2-0.1 0.2m-4.4-5.4c0.4 0 0.7 0.1 1 0.2 0.1 0 0.2 0 0.3 0.1 0.2 0.1 0.4 0.2 0.6 0.2 0.2 0.1 0.4 0.1 0.6 0.2 0.1 0 0.2 0.1 0.3 0.1 0.3 0.1 0.5 0.2 0.8 0.4 0.2 0.1 1.1 0.6 0.9 0.8 0 0.1-0.1 0.1-0.2 0-0.2 0-0.3-0.2-0.4-0.2-0.2-0.1-0.3-0.2-0.5-0.3-0.8-0.4-1.8-0.7-2.7-0.9-0.3-0.1-0.6-0.1-0.8-0.2-0.1 0-0.1-0.3 0.1-0.4"/><path class="st2" d="m39.3 26c0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.3-0.2 0.3-0.3 0.1-0.2-0.1-0.6-0.3-0.7h-0.2c0 0.2 0.1 0.2 0.1 0.4 0 0.1-0.1 0.2-0.2 0.3s-0.1 0.4 0 0.4"/><path class="st2" d="m39.9 23.4c-0.2-0.1-0.4-0.1-0.6-0.2s-0.3-0.2-0.5-0.2c-0.1 0-0.2 0.1-0.2 0.2 0 0.2 0.2 0.3 0.3 0.4s0.2 0.3 0.3 0.3 0.2-0.1 0.3-0.2 0.2-0.1 0.3-0.2c0.2 0 0.2-0.1 0.1-0.1"/><path class="st2" d="m38.7 27.2c0.2 0.1 0.6 0 0.6-0.2s-0.2-0.3-0.3-0.3c-0.1 0.1-0.5 0.4-0.3 0.5"/><path class="st2" d="m43.8 30.6c-0.1-0.1-0.3 0-0.4 0h-0.5c-0.2 0.1-0.4 0-0.7 0.1-1 0.2-1.9 0.3-2.7 0.8-0.2 0.1-0.4 0.2-0.6 0.4-0.1 0.1-0.1 0.3-0.1 0.5-0.1 0.5-0.1 0.9-0.1 1.4 0 0.2 0 0.5-0.1 0.7v1.1c0 0.1 0 0.3-0.1 0.4v1 1.5 1.5 0.4 0.2 0.7c0 0.7 0 1.5 0.2 2l0.1 0.1c0.3-0.1 0.6-0.3 0.8-0.5 0.2-0.1 0.5-0.2 0.8-0.3 0.3-0.2 0.4-0.3 0.8-0.3 0.1-0.1 0.4-0.1 0.6-0.1h0.2 0.2c0.3-0.1 0.9 0 1.2 0.1 0.1 0 0.3 0.1 0.4 0.1 0.1-0.4 0-0.9 0-1.3v-0.7-0.8-0.4-1-0.6-1.1-0.5-2-0.6-1.5c0-0.2-0.1-0.3-0.1-0.5v-0.6c0.1-0.1 0.1-0.2 0.1-0.2m-4.8 6.8c0.6-0.6 1.5-0.9 2.2-1.2 0.2-0.1 0.5-0.3 0.8-0.3 0.1-0.1 0.3-0.2 0.4-0.2 0.2 0 0.3 0.1 0.3 0.3s-0.1 0.3-0.2 0.4c-0.2 0.2-0.5 0.2-0.8 0.3s-0.6 0.2-0.9 0.3c-0.2 0.1-0.4 0.1-0.6 0.2-0.4 0.1-0.7 0.3-1 0.5-0.1 0.1-0.2 0.2-0.4 0.2h-0.1c0-0.3 0.2-0.5 0.3-0.5m3.7 2.1c-0.2 0.1-0.5 0.1-0.8 0.2-0.2 0-0.5 0.1-0.7 0.2-0.8 0.2-1.4 0.5-2.1 0.9-0.1 0-0.3 0.3-0.4 0.1-0.1-0.1 0.1-0.2 0.2-0.3 0.3-0.2 0.5-0.4 0.8-0.6s0.6-0.4 1-0.5c0.1-0.1 0.2-0.1 0.3-0.2 0.4-0.2 0.9-0.3 1.3-0.4 0.1 0 0.3 0 0.4 0.1 0.3 0.1 0.2 0.4 0 0.5m0.1-6.5c-0.1 0.1-0.3 0.1-0.4 0.1-0.3 0.1-0.6 0.2-0.9 0.3-0.4 0.1-0.8 0.3-1.2 0.5-0.3 0.2-0.5 0.3-0.8 0.5 0 0-0.4 0.2-0.4 0.1 0-0.3 0.4-0.5 0.6-0.6 0.1-0.1 0.2-0.1 0.3-0.2 0.3-0.2 0.6-0.3 0.8-0.5 0.3-0.1 0.6-0.2 0.9-0.3 0.1-0.1 0.2-0.1 0.3-0.1 0.1-0.1 0.3-0.1 0.4-0.1h0.3c0.3 0 0.2 0.2 0.1 0.3"/><path class="st2" d="m38.2 25.7c-0.1 0-0.1 0-0.2-0.1-0.1 0-0.2 0.1-0.2 0.2v0.3c0 0.2 0 0.4 0.1 0.5s0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1c0.2 0 0.6-0.3 0.6-0.5-0.1 0-0.6-0.5-0.7-0.6"/><path class="st2" d="m45.6 33.5c0-0.2-0.1-0.5-0.1-0.7v-0.4-0.3h-0.1c-0.1 0.5 0 1.1 0 1.6 0 0.2-0.1 0.4-0.1 0.6v0.3 0.3c-0.1 0-0.2 0-0.2-0.1v-0.5-0.3c0-0.6 0.1-1.3 0.1-1.9v-0.3-0.2h-0.1c0 0.5-0.1 0.9-0.1 1.3 0 0.1 0 0.2-0.1 0.2h-0.1c-0.1-0.4-0.1-0.8-0.1-1.2 0-0.2 0-0.4-0.1-0.6-0.1 0.1-0.1 0.3-0.1 0.5v0.7c0 0.2 0.1 0.5 0 0.7-0.1 1.5-0.1 3-0.1 4.6v0.9c0 0.3-0.1 0.5-0.1 0.8v1.2c0 0.4-0.1 0.8 0 1.2 0 0.1 0 0.2 0.1 0.2 0.1-0.2 0.1-0.5 0.1-0.7 0-0.4 0.1-0.8 0.1-1.3 0-0.3-0.1-0.6 0-0.9 0 0 0-0.1 0.1 0 0.1 0 0.1 0.2 0.1 0.3 0.1 0.3 0 0.6 0 1v0.8 0.9 0.4c0 0.1 0 0.3 0.2 0.3v-1.4-0.6c0-0.2 0-0.4 0.1-0.6 0-0.1 0-0.3 0.1-0.4 0-0.2-0.1-0.4-0.1-0.6v-0.9-0.5c0-0.1 0.1-0.1 0.1-0.1 0.1 0.1 0.2 0.2 0.2 0.3v1.1 0.3c0 0.3 0.1 0.6 0.1 0.9v0.4 1.6c0 0.4 0 0.8 0.1 1.2v0.2h0.1c0.1-0.2 0.1-0.5 0.1-0.8s0.1-0.6 0-1c0-0.2-0.1-0.4-0.1-0.6s0.1-0.4 0.1-0.6c0-0.3-0.1-0.6-0.1-1 0-0.3 0-0.7 0.1-1v-0.8-0.3c0-0.2 0-0.3 0.1-0.5v-0.8-1.3c-0.3-0.7-0.3-1.1-0.3-1.6m-0.9 4.1s-0.2 0.2-0.2 0.1v-0.3-0.8-1c0-0.3 0-0.6 0.1-0.8 0.1 0 0.1 0.1 0.2 0.2 0.1 0.3 0 0.6 0 0.9-0.1 0.6 0 1.3-0.1 1.7m0-3.8c-0.2 0-0.2-0.2-0.1-0.3 0.1 0 0.2 0.3 0.1 0.3m0.4 3.2c-0.1-0.2-0.1-0.4-0.1-0.7s-0.1-0.6 0.1-0.9c0.1 0 0.1 0 0.2 0.1 0.1 0.2 0.1 1.5-0.2 1.5"/><path class="st2" d="m41.7 51.2h0.3 0.7 0.2c-0.2-0.3-0.6-0.6-0.9-0.9l-2.1-2.1c-0.1-0.1-0.3-0.3-0.5-0.4l-0.7-0.7c-0.1-0.1-0.3-0.3-0.5-0.4v0.1c-0.1 0-0.2 0.1-0.3 0.2-0.3 0.3-0.5 0.6-0.8 0.8l-2.4 2.4c-0.1 0.1-1 1-1 1.1 0.6 0.1 1.3 0 1.9 0h0.7c0.1 0 0.3 0 0.4 0.1v0.1c-0.1 0.1-1.2 1.4-1.2 1.4v0.1h2.2 0.1c-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.2-0.4-0.5-0.5-0.8 0-0.1-0.1-0.2 0-0.2 0.1-0.3 1.4-0.1 1.7-0.1 0.2-0.1 0.6 0 0.8 0 0.3 0 0.7-0.1 1.1 0 0.1 0 0.1 0.1 0.1 0.2 0 0.2-0.5 0.9-0.6 1.2 0 0.1-0.1 0.1-0.1 0.2h1.2 0.7 0.1c0-0.2-0.7-1-0.8-1.2-0.1-0.1-0.2-0.2-0.2-0.3 0-0.4 0.4-0.3 0.7-0.3"/><path class="st2" d="m39.1 52.8c0.2-0.1 0.8-1 0.8-1.2h-0.4c-0.1 0-0.1 0.1-0.2 0.1-0.1 0.1-0.7 0.9-0.7 1 0.2 0.1 0.4 0.1 0.5 0.1"/><path class="st2" d="m35.3 51.6c-0.2 0.2-1.2 0.9-1.2 1.1h0.5c0.2-0.1 1-0.9 1-1.1h-0.3"/><path class="st2" d="m43.7 52.7c0-0.5 0-1-0.4-1.2-0.1 0.3-0.1 0.7-0.1 1.1v1.6 0.3h-2.5-1.1c-0.7 0-1.4-0.1-2.1-0.1-0.5 0-1 0.1-1.5 0.1-0.3 0-2.4-0.2-2.5 0v0.1c0.2 0.3 0.5 0.2 0.9 0.2h0.2 0.2 0.6 1 0.3c0.1-0.1 0.6 0 0.8 0h0.2 1.1c0.2-0.1 0.5 0 0.7 0h1.4c0.1-0.1 0.3 0 0.5 0 0.2-0.1 0.4 0 0.6 0h1.2 0.2v-0.1c0.1-0.2 0-0.5 0-0.8 0-0.2 0-0.3 0.1-0.5 0.3-0.1 0.3-0.4 0.2-0.7"/><path class="st2" d="m43.7 59.4v-0.4-0.3c-0.1-0.1-0.2-0.1-0.4-0.1l-0.1 0.1v0.6 2c0.1 0 0.4 0 0.4-0.2 0.1-0.2 0.1-0.8 0-1.1 0-0.1 0-0.3 0.1-0.6"/><path class="st2" d="m51.4 59.8c-0.5-0.5-1-1-1.5-1.4-0.6-0.6-1.2-1.3-1.9-1.9-0.2-0.2-0.5-0.4-0.7-0.7l-0.3-0.3c-0.9-1-2-1.9-2.9-2.8-0.1 0.4 0 0.8 0 1.2v0.8 0.7c-0.1 0.2-1.5 0.2-1.8 0.2-0.1 0-0.5 0-0.6 0.1v0.1c0.1 0.4 0.3 0.8 0.4 1.1 0.1 0.2 0.2 0.9 0.4 1.1 0.1 0.1 0.6 0.1 0.7 0.1 0.1-0.1 0.5 0 0.6 0 0.3-0.1 0.2 0.5 0.2 0.6v0.5c0 0.3-0.1 2 0.1 2.1 0.1 0.1 0.5 0 0.7 0 0.1 0 0.2-0.1 0.3-0.1 0.1-0.1 0.4 0 0.5 0h0.2c0.1-0.1 0.4 0 0.6 0 0.1 0 0.4-0.1 0.4-0.1 0.1 0 0.2 0.1 0.3 0.1h0.3c0.2-0.1 0.5-0.1 0.8-0.1h0.2c0.1-0.1 0.3 0 0.5 0h0.2 0.2c0.1-0.1 0.2 0 0.3-0.1 0.1 0 0.3-0.1 0.4-0.1 0.2 0 0.4-0.1 0.7-0.1 0.1-0.1 0.4-0.1 0.5-0.1s0.2-0.1 0.3-0.1c0 0 0.2-0.1 0.2-0.2 0-0.4-0.2-0.5-0.3-0.6"/><path class="st2" d="m56.8 33.9v-0.3-0.3-0.6-1-0.9-1.8c0-0.2 0.1-0.7-0.1-0.9-0.1 0.2-0.4 0.4-0.6 0.6-0.7 0.8-1.5 1.5-2.3 2.3-0.5 0.5-1 1.1-1.5 1.6-0.3 0.2-0.5 0.5-0.8 0.8l-0.7 0.7c-0.2 0.2-0.4 0.3-0.5 0.5s-0.3 0.3-0.4 0.5l-1.8 1.8c-0.2 0.2-0.4 0.5-0.6 0.7s-0.6 0.5-0.7 0.7v0.1c0 0.1 1.3 1.4 1.5 1.6 1 1 2.1 2 3.1 3 0.1 0.1 0.2 0.2 0.2 0.3 0.2 0.1 0.3 0.3 0.4 0.4 0.2 0.2 0.3 0.4 0.5 0.5 1 1.1 2.1 2.1 3.2 3.2 0.1 0.1 1 1.1 1.1 1.1 0.2 0 0.1-0.9 0.1-1.1v-0.5-0.4c0-0.1 0-0.2 0.1-0.4 0-0.2-0.1-0.4 0-0.6v-0.3-1.2-0.7-0.4-0.5-0.7-0.2c0-0.2 0-0.4 0.1-0.7 0-0.4 0-0.7-0.1-1.1 0-0.3 0.1-0.6 0.1-0.9 0-0.2 0-0.4-0.1-0.6v-0.3-1-0.4c0-0.3 0-0.5-0.1-0.8v-1.5c-0.1-0.1-0.1-0.2-0.1-0.3"/><path class="st2" d="m43.2 20.8c-0.1 0.1-0.1 0.2-0.2 0.3s-0.1 0.2-0.2 0.3c-0.1 0.2-0.3 0.2-0.4 0.4-0.1 0.1-0.1 0.3-0.3 0.4-0.3 0.2-0.5 0.5-0.6 0.8 0 0.1-0.1 0.1-0.1 0.2 0 0-0.1 0.1 0 0.1 0 0.1 0.1 0.2 0.2 0.3 0.2 0.2 0.3 0.4 0.3 0.7 0 0.2 0.1 0.4 0.1 0.6s-0.1 0.4-0.2 0.6c0 0.1 0 0.3-0.1 0.4s-0.1 0.2-0.2 0.3-0.1 0.2-0.2 0.3c-0.2 0.3-0.5 0.4-0.8 0.6-0.1 0.1-0.2 0.2-0.4 0.3s-0.4 0.1-0.6 0.3c-0.2 0.1-0.3 0.3-0.4 0.5-0.1 0.1-0.2 0.1-0.3 0.2-0.1 0.2 0 0.3 0 0.5 0 0.1 0 0.2-0.1 0.3v0.6 0.2c0.2-0.1 0.4-0.4 0.6-0.6l2.8-2.8c0.2-0.2 0.3-0.4 0.5-0.6 0.3-0.3 0.7-0.6 1-1 0.1-0.1 0.2-0.3 0.3-0.4l0.3-0.3c0.2-0.2 0.4-0.4 0.6-0.5 0.5-0.5 1-1.1 1.5-1.6 0.1-0.1 0.3-0.2 0.4-0.4l1.7-1.7c0.3-0.3 0.7-0.6 0.9-0.9-0.2 0.1-0.5 0.1-0.8 0h-0.2c-0.2 0-0.4 0.1-0.6 0.1s-0.5-0.1-0.7-0.1h-0.6c-0.1 0.1-0.2 0-0.4 0.1h-0.9-0.5l-0.2 0.2c-0.2 0.2-0.3 0.4-0.5 0.6-0.1 0.1-0.1 0.2-0.2 0.2-0.1 0.1-0.2 0.1-0.3 0.2l-0.2 0.2c0.2 0 0.1 0 0 0.1"/><path class="st2" d="m41.4 21.4c-0.1 0.2-0.4 0.3-0.4 0.6v0.3h0.1c0.2-0.3 0.6-0.7 0.3-0.9"/><path class="st2" d="m40.9 25.6s0.1 0.1 0.1 0c0.2-0.1 0.3-0.3 0.3-0.5-0.1 0.2-0.4 0.3-0.4 0.5"/><path class="st2" d="m40.7 23.6-0.2 0.2v1c0 0.1 0.1 0.1 0.2 0.1s0.1-0.1 0.2-0.1c0.3-0.3 0.2-0.6 0.1-0.9-0.1-0.2-0.1-0.3-0.3-0.3"/><path class="st2" d="m40 26.6c0.1 0.1 0.5-0.1 0.5-0.2-0.1-0.1-0.2-0.1-0.3-0.1s-0.3 0.2-0.2 0.3"/><path class="st2" d="m41.9 20.6c-0.1 0.1-0.2 0.3 0 0.4 0.1 0 0.2 0.1 0.2 0 0.1-0.1 0.2-0.3 0.3-0.4 0.2-0.2 0.9-1.2 1.2-1.2v-0.1c-0.2 0-0.4 0-0.6-0.1l-0.2 0.2c-0.1 0.1-0.2 0.3-0.3 0.4s-0.2 0.2-0.3 0.2-0.1 0.1-0.2 0.1c-0.1 0.3-0.1 0.4-0.1 0.5"/><path class="st2" d="m40.2 21.3c-0.1 0.1-0.4 0.6-0.4 0.7h0.1c0.2 0.1 0.4 0 0.5-0.1s0.1-0.3 0.3-0.4l0.6-0.6c0.1-0.1 0.1-0.2 0.2-0.3s0.2-0.3 0.3-0.4 0.2-0.3 0.3-0.4 0.2-0.2 0.2-0.4h-0.3c-0.1 0.1-0.3 0.1-0.3 0.2-0.1 0.1-0.1 0.3-0.2 0.4s-0.3 0.2-0.4 0.3-0.1 0.3-0.1 0.4-0.1 0.1-0.2 0.2c0 0.1 0 0.2-0.1 0.2-0.3 0.1-0.4 0.1-0.5 0.2"/><path class="st2" d="m38.7 21.6v0.3c0.3-0.1 0.6-0.5 0.8-0.8 0.1-0.1 0.1-0.3 0.2-0.4s0.1-0.2 0.2-0.3c0.1-0.3 0.3-0.7 0.5-1h0.1v-0.1h-0.4c-0.2 0.1-0.9 0-1 0.1s-0.1 0.3-0.1 0.4-0.2 0.2-0.2 0.3c-0.1 0.2 0.1 0.4 0.1 0.6s-0.1 0.3-0.1 0.4c-0.1 0.3-0.1 0.4-0.1 0.5"/><path class="st2" d="m38.1 23.6c-0.1 0-0.4 0.4-0.4 0.4 0 0.2 0.2 1 0.4 1s0.4-0.2 0.5-0.3 0.3-0.2 0.4-0.4-0.5-0.6-0.6-0.7h-0.3"/><path class="st2" d="m37.7 25.4c0.1-0.3-0.6-0.8-0.8-0.9-0.2 0.2-0.1 0.2-0.2 0.4 0 0.1-0.1 0.2-0.1 0.2-0.1 0.2 0.1 0.6 0.2 0.7s0.1 0.1 0.2 0.1 0.3-0.2 0.4-0.3c0.2 0 0.3-0.1 0.3-0.2"/><path class="st2" d="m37.3 26.8c-0.1-0.1-0.1-0.2-0.2-0.3 0 0-0.1 0-0.2-0.1-0.3 0.5 0.1 0.6 0.5 0.7h0.1c0-0.1-0.1-0.2-0.2-0.3"/><path class="st2" d="m36 24.6c0.1 0 0.2-0.1 0.3-0.2 0.3-0.4 0.1-0.7-0.3-1-0.1 0-0.3 0.3-0.3 0.3 0 0.1 0.1 0.2 0.1 0.3 0 0.3-0.1 0.7 0.2 0.6"/><path class="st2" d="m36.9 23.7c0.2 0 0.9-0.5 0.8-0.7-0.1-0.1-0.2-0.1-0.3-0.1-0.3 0.1-0.5 0.2-0.8 0.2h-0.2v0.1c0.1 0.2 0.2 0.5 0.5 0.5"/><path class="st2" d="m36.2 26.6c0.1 0 0.5-0.3 0.5-0.4s-0.5-0.6-0.6-0.7h-0.2c-0.1 0.3 0 0.7 0.1 1 0.1 0.1 0.1 0.2 0.2 0.1"/><path class="st2" d="m37.1 21c0.1 0.2 0.5 1.3 0.9 1.3v-0.8c0-0.4 0.1-0.8 0.1-1.2 0-0.1 0-0.2 0.1-0.3 0-0.1 0-0.2-0.1-0.3v-0.3c-0.2 0-0.6 0-0.8-0.1-0.2 0-0.5 0-0.6 0.1-0.3 0.3 0.1 1 0.2 1.3 0 0.1 0.1 0.1 0.2 0.3"/><path class="st2" d="m36.5 22.2h0.3c0.1 0 0.1-0.2 0.1-0.3s0-0.3-0.1-0.4-0.1-0.2-0.2-0.4-0.2-0.4-0.3-0.7-0.3-0.9-0.6-1.1c-0.1-0.1-0.3 0-0.5 0-0.1 0.1-0.6 0.1-0.6 0.2-0.1 0.2 1.8 2.6 1.9 2.7"/><path class="st2" d="m33.1 19.6c0.1 0.2 0.3 0.3 0.5 0.5 0.1 0.2 0.2 0.4 0.3 0.5s0.3 0.1 0.4 0.3c0.2 0.2 0.4 0.5 0.5 0.8l0.3 0.3c0.2 0.2 0.3 0.4 0.5 0.5 0.1 0.1 0.3 0.1 0.4 0.1 0 0 0-0.1 0.1-0.1-0.1-0.2-0.3-0.4-0.4-0.6-0.1-0.1-0.2-0.1-0.3-0.2 0-0.1-0.1-0.1-0.1-0.2-0.1-0.1-0.2-0.3-0.3-0.4l-0.4-0.4c-0.1-0.1-0.1-0.3-0.2-0.4-0.2-0.2-0.3-0.5-0.6-0.7-0.1-0.1-0.3-0.2-0.5-0.2 0 0-0.2 0-0.2 0.2"/><path class="st2" d="m28.1 20.2 2.2 2.2c0.9 0.8 1.7 1.7 2.6 2.5 0.1 0.1 0.2 0.2 0.3 0.4l0.8 0.8c0.5 0.5 1 0.9 1.5 1.4 0.2 0.3 0.5 0.5 0.7 0.8 0.3 0.3 0.7 0.6 1 0.9 0.2 0.2 0.6 0.7 0.8 0.7 0-0.2-0.1-0.6-0.1-0.8v-0.3c0-0.1 0-0.2-0.1-0.3l-0.3-0.3c-0.1-0.1-0.2-0.3-0.3-0.4-0.2-0.2-0.4-0.2-0.6-0.3-0.1-0.1-0.3-0.2-0.4-0.3-0.1 0-0.2-0.1-0.3-0.1-0.1-0.1-0.1-0.2-0.2-0.3s-0.2-0.1-0.3-0.2-0.1-0.3-0.2-0.5c-0.1-0.1-0.1-0.3-0.2-0.4 0-0.1-0.1-0.3-0.1-0.4 0-0.2 0-0.4 0.1-0.6 0-0.1 0-0.2 0.1-0.4 0.1-0.3 0.2-0.5 0.5-0.8 0.1-0.1 0.2-0.2 0.3-0.2-0.1-0.2-0.2-0.3-0.4-0.5-0.1-0.1-0.2-0.1-0.2-0.2-0.1-0.1-0.2-0.3-0.4-0.5s-0.5-0.4-0.7-0.7l-1.4-1.4c-0.2-0.2-0.4-0.4-0.6-0.5s-0.4 0.1-0.6 0.1c-0.1 0-0.2 0-0.3-0.1h-0.7-0.5-0.6c-0.2 0.1-0.6 0-0.8 0h-1.1c-0.3 0.1 0.3 0.4 0.5 0.7"/><path class="st2" d="m35.2 24.6c0 0.2-0.1 0.7 0.2 0.6 0.4-0.1 0-0.5-0.2-0.6"/><path class="st2" d="m25 43.2c0.3-0.3 0.5-0.6 0.8-0.8 0.4-0.4 0.8-0.8 1.3-1.2l0.9-0.9c0.1-0.1 0.2-0.3 0.3-0.4 0.4-0.3 0.9-0.8 1.2-1.2 0-0.1 0.1-0.1 0.1-0.2 0.1-0.3-1.9-2.2-2.2-2.5-0.5-0.5-1-1-1.5-1.6-0.5-0.5-1.1-1-1.6-1.5-0.1-0.1-0.2-0.2-0.2-0.3-0.2-0.2-0.5-0.4-0.7-0.6-0.1-0.1-0.2-0.2-0.3-0.4-0.3-0.4-0.7-0.7-1-1l-0.5-0.5c-0.5-0.4-0.9-0.9-1.4-1.3-0.2-0.2-0.4-0.5-0.7-0.6v1 0.3 0.6 0.5 0.4 2 0.5c0 0.3 0 0.6-0.1 1v2 0.9 1.2 0.6 0.4 1.5 0.5 0.9 0.6 1.4 0.5 1.4 1.7 0.6s0.1 0.2 0.1 0.1c0.1-0.2 0.4-0.4 0.6-0.6 0.6-0.5 1.1-1.1 1.7-1.6 0.4-0.4 0.7-0.8 1.1-1.1 0.7-0.6 1.4-1.3 2.1-1.9-0.1-0.3 0-0.4 0-0.4"/><path class="st2" d="m34.7 57.4c0.1-0.4 0.3-0.8 0.5-1.2 0.1-0.2 0.2-0.5 0.2-0.8h-1.2c-0.2 0-0.7 0-0.9-0.1-0.1-0.1-0.1-0.2-0.2-0.3-0.1-0.2-0.2-0.3-0.3-0.5s0-0.4 0-0.7v-1c0-0.2 0.1-0.8 0-1-0.2 0.2-0.3 0.4-0.5 0.5l-1.8 1.8c-0.4 0.4-0.9 0.9-1.3 1.4-0.7 0.7-1.5 1.4-2.2 2.1-0.1 0.1-0.2 0.3-0.3 0.4l-0.4 0.4c-0.3 0.3-0.6 0.5-0.9 0.8l-0.6 0.6c-0.2 0.2-0.5 0.4-0.6 0.6v0.1c0.2 0.1 0.5 0.1 0.8 0.1 0.3 0.1 0.6 0.1 1 0.2h0.4c0.1 0 0.2 0 0.3 0.1 0.2 0 0.4 0.1 0.7 0.1s0.5 0 0.8 0.1c0.6 0.1 1.2 0.2 1.8 0.2h0.4c0.3 0 0.6 0.1 0.8 0.1 0.1 0 0.3 0 0.4 0.1h0.6c0.2 0 0.4 0.1 0.6 0.1 0.1 0 0.1-0.1 0.1-0.2 0.1-0.3 0-0.8 0-1.1v-2.1c0-0.1 0-0.1 0.1-0.2s0.9 0 1.1 0h0.2c0.1 0 0.2 0 0.3-0.1 0-0.1 0-0.3 0.1-0.5"/><path class="st2" d="m37.2 62.7h0.3v-1.2c0-0.4 0-1 0.2-1.3 0.2-0.4 0.3-0.7 0.8-0.7 0.1 0 0.1 0 0.1-0.1 0-0.3-0.5-0.4-0.7-0.4-0.1 0-0.2 0.1-0.4 0.1-0.8 0.4-0.7 1.6-0.7 2.4 0 0.1 0 0.5-0.1 0.6-0.2 0.2-2 0.1-2.4 0.1 0.2 0.1 0.4 0.1 0.6 0.2s0.5 0.3 0.8 0.3h1 0.5"/><path class="st2" d="m39.1 62.3c0-0.1-0.1-0.2-0.1-0.3v-1.4-0.6c0-0.1-0.1-0.1-0.1-0.1-0.2 0.1-0.3 0.1-0.5 0.2-0.1 0.1-0.2 0.4-0.2 0.5s-0.1 0.3-0.1 0.5v0.8 0.4 0.4 0.4 0.2h-0.9c-0.1 0-0.2 0-0.3 0.1h-0.1c0.2 0.1 0.5 0.3 0.7 0.4 0.2 0.2 0.3 0.4 0.5 0.5 0.1-0.3 0.4-0.5 0.6-0.7l0.3-0.3c0.2-0.2 0.4-0.3 0.5-0.5-0.2-0.2-0.2-0.4-0.3-0.5"/><path class="st2" d="m39.6 62c0 0.2 0.1 0.4 0.2 0.5 0.2-0.1 0.5-0.2 0.7-0.3 0.1 0 0.2-0.1 0.3-0.1v-0.1h-0.9-0.3"/><path class="st2" d="m1.3 32.7c-0.6-0.2-0.7-0.6-0.5-1.3l0.2-0.9 4.3 1c0.7 0.2 0.8 0.4 0.7 0.8h0.2l0.4-2h-0.2c-0.1 0.5-0.3 0.6-1 0.4l-4.3-1 0.2-0.9c0.2-0.9 0.6-1 1.1-1v-0.1l-1.3-0.3v0.2c0.1 0.2 0.1 0.4 0 0.9l-0.7 2.9c-0.1 0.2-0.1 0.4-0.2 0.5s-0.1 0.2-0.2 0.3v0.2l1.3 0.3"/><path class="st2" d="m3.7 24.2 3.2 1.6c0.7 0.3 0.7 0.6 0.5 1l0.2 0.1 0.9-1.9-0.2-0.1c-0.2 0.4-0.5 0.5-1.1 0.2l-1.5-0.7 1.4-2.8 1.5 0.7c0.7 0.3 0.7 0.6 0.5 1l0.2 0.1 0.9-1.8-0.2-0.2c-0.2 0.4-0.5 0.5-1.1 0.2l-3.2-1.6c-0.6-0.3-0.8-0.5-0.5-1h-0.2l-0.9 1.8 0.2 0.1c0.2-0.4 0.5-0.5 1.1-0.2l1.5 0.7-1.4 2.8-1.5-0.6c-0.7-0.3-0.7-0.6-0.5-1l-0.2-0.1-0.9 1.9 0.2 0.1c0.2-0.5 0.5-0.6 1.1-0.3"/><path class="st2" d="m13.7 15.2-0.1 0.1c0.4 0.7 0.3 0.9-0.3 1.6l-0.6 0.8c-0.2 0.2-0.4 0.3-0.6 0.1l-1.6-1.3 0.9-1.1c0.4-0.5 0.5-0.5 0.9-0.3l0.1-0.1-1.1-0.9-0.1 0.1c0.3 0.4 0.3 0.5 0 0.8l-1 1.2-1.9-1.6 1.1-1.3c0.4-0.5 0.6-0.6 1.1-0.3l0.1-0.1-0.6-0.5-2.6 3.2 0.1 0.1c0.3-0.4 0.6-0.4 1.1 0.1l2.8 2.3c0.6 0.5 0.6 0.7 0.3 1.1l0.1 0.1 2.6-3.2-0.7-0.9"/><path class="st2" d="m22 10.3c0.7-0.4 1-0.9 1.2-1.8l0.4 0.7 1.2-0.7-0.1-0.1c-0.4 0.2-0.6 0.2-1-0.5l-1.7-3.1c-0.3-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.1 0.1c0.4-0.2 0.7-0.1 1 0.5l1.7 3c0 0.7-0.4 1.3-1 1.6-0.8 0.5-1.6 0.2-2-0.6l-1.4-2.5c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.2 0.1c0.4-0.2 0.6-0.2 1 0.5l1.4 2.5c0.5 0.8 1.4 1.3 2.6 0.7"/><path class="st2" d="m31.7 0.7v-0.2l-1.7 0.4v0.2c0.5-0.1 0.7 0 0.9 0.7l0.8 3.2-4.6-3.4-1.4 0.4v0.2c0.7-0.1 0.9 0.2 1.1 0.8l0.8 3.2c0.2 0.8 0 1-0.4 1.1v0.2l1.8-0.4v-0.2c-0.5 0.1-0.8 0-0.9-0.6l-1-3.9 5.2 3.8h0.2l-1.2-4.5c-0.3-0.6-0.2-0.9 0.4-1"/><path class="st2" d="m36.1 1.2 0.2 3.6c0 0.7-0.1 0.9-0.6 0.9v0.2l2.1-0.1v-0.2c-0.5 0-0.7-0.2-0.7-0.9l-0.2-3.6c0-0.7 0.1-0.9 0.6-0.9v-0.2l-2.1 0.1v0.2c0.5 0 0.6 0.2 0.7 0.9"/><path class="st2" d="m46.3 0.9v-0.2l-1.7-0.2v0.2c0.5 0.1 0.6 0.4 0.3 0.9l-1.8 3.4-0.9-3.9c-0.1-0.5 0.1-0.7 0.5-0.6v-0.2l-2-0.3v0.2c0.5 0.1 0.6 0.4 0.8 1.1l1.1 4.8h0.2l2.3-4.3c0.4-0.6 0.7-0.9 1.2-0.9"/><path class="st2" d="m50.3 7.7-0.9-0.3c-0.4-0.2-0.4-0.3-0.3-0.6l0.7-1.9 1.3 0.5c0.6 0.2 0.6 0.3 0.6 0.8l0.2 0.1 0.4-1.3-0.2-0.1c-0.2 0.4-0.4 0.4-0.8 0.3l-1.5-0.6 0.8-2.3 1.6 0.6c0.6 0.2 0.8 0.3 0.7 1h0.1l0.4-0.9-3.9-1.4-0.1 0.2c0.5 0.2 0.5 0.4 0.3 1.1l-1.2 3.4c-0.3 0.6-0.5 0.7-0.9 0.5l-0.1 0.2 3.9 1.4 0.6-0.9-0.2-0.1c-0.5 0.6-0.7 0.6-1.5 0.3"/><path class="st2" d="m56 10.7c-0.4-0.3-0.4-0.5 0-1.1l0.9-1.3 0.4 0.3c0.9 0.6 0.4 1.9 0.6 3.5l1 0.6 0.1-0.1c-0.8-0.6 0-2.4-0.5-3.5 0.8 0.2 1.4 0 1.8-0.5 0.4-0.6 0.3-1.6-0.8-2.3l-2-1.3-0.1 0.1c0.4 0.3 0.5 0.5 0.1 1.1l-2 3c-0.4 0.6-0.7 0.6-1 0.4l-0.1 0.1 1.7 1.1zm2.4-4.8 0.5 0.3c0.7 0.5 0.9 1.2 0.5 1.9-0.4 0.6-1 0.9-1.9 0.4l-0.6-0.4 1.5-2.2"/><path class="st2" d="m61 14.6c0.1 0.1 0.3 0.7 0.7 1.1 0.6 0.6 1.7 0.6 2.3 0 0.3-0.3 0.5-0.6 0.5-1.2 0-1.2-0.8-2.4-0.1-3.1 0.4-0.4 0.9-0.3 1.3 0.1s0.6 1.1 0.1 1.7l0.1 0.1 1-0.9-0.1-0.1c-0.1 0.1-0.2 0.1-0.2 0-0.2-0.2-0.2-0.5-0.6-1-0.7-0.7-1.5-0.7-2.1-0.1-0.3 0.3-0.5 0.7-0.5 1.2 0 0.9 0.7 2.3 0 3-0.4 0.4-1.1 0.4-1.5-0.1-0.4-0.4-0.7-1.2 0-2l-0.1-0.1-1.1 1.1 0.1 0.1c0 0.1 0.1 0.1 0.2 0.2"/><path class="st2" d="m64.9 19-0.1 0.1 1.2 1.7 0.1-0.1c-0.3-0.4-0.2-0.7 0.4-1.1l2.9-2c0.6-0.4 0.8-0.4 1.1 0l0.1-0.1-1.2-1.7-0.1 0.1c0.3 0.4 0.2 0.6-0.4 1.1l-2.9 2c-0.6 0.4-0.9 0.3-1.1 0"/><path class="st2" d="m72.6 21.5 0.3 0.8-4 1.8c-0.7 0.3-0.9 0.2-1.1-0.2l-0.1 0.1 0.8 1.8 0.2-0.1c-0.2-0.4-0.1-0.6 0.5-0.9l4-1.8 0.4 0.8c0.4 0.8 0.2 1.1-0.2 1.4v0.1l1.2-0.5-0.1-0.2c-0.2-0.1-0.4-0.3-0.6-0.7l-1.3-2.7c-0.1-0.2-0.2-0.4-0.2-0.5v-0.4l-0.1-0.2-1.2 0.5 0.1 0.2c0.7-0.2 1.1 0 1.4 0.7"/><path class="st2" d="m76.2 31.4h-0.2c0.1 0.5-0.3 0.5-0.8 0.4l-1.6-0.6 1.5-1.5c0.3-0.3 0.5-0.3 0.7 0.3h0.2l-0.5-2.2h-0.2c0.1 0.4 0 0.6-0.5 1.2l-1.6 1.6-1.8 0.4c-0.8 0.2-0.9-0.1-1-0.5h-0.2l0.4 2h0.2c-0.1-0.5 0.1-0.7 0.8-0.8l1.8-0.4 2.3 0.8c0.6 0.2 0.7 0.3 0.8 0.8h0.2l-0.5-1.5"/><path class="st2" d="m5 51.3c1.6-0.5 2.5-2.1 2-3.8s-2.1-2.6-3.7-2.1-2.5 2.1-2.1 3.8c0.5 1.7 2.1 2.6 3.8 2.1m-3.6-2.1c-0.4-1.2 0.5-2.4 2.1-2.9s2.9 0.1 3.3 1.4c0.3 1.1-0.4 2.3-2.1 2.8-1.4 0.4-2.9 0.1-3.3-1.3"/><path class="st2" d="m8.8 53.1c0.2 0.4 0.2 0.7-0.5 1l-3.1 1.8c-0.6 0.4-0.9 0.3-1.1-0.1l-0.2 0.1 1 1.8 0.1-0.1c-0.2-0.4-0.1-0.7 0.5-1l1.5-0.8 0.8 1.3c0.2 0.3 0.1 0.6-0.3 0.9l0.1 0.1 1.4-0.8-0.1-0.1c-0.4 0.2-0.7 0.2-0.9-0.2l-0.7-1.3 2.1-1.2 0.7 1.3c0.3 0.5 0.4 0.7-0.2 1.2h0.1l0.9-0.5-1.9-3.4h-0.2"/><path class="st2" d="m15.8 62.6c0.4 0.3 0.4 0.6-0.1 1.1l-2.3 2.8c-0.5 0.6-0.7 0.6-1.1 0.3l-0.1 0.1 3.2 2.6 0.9-0.7-0.1-0.1c-0.7 0.4-0.9 0.3-1.6-0.3l-0.8-0.6c-0.2-0.2-0.3-0.4-0.1-0.6l1.3-1.6 1.1 0.9c0.5 0.4 0.5 0.5 0.3 0.9l0.1 0.1 0.9-1.1-0.1-0.1c-0.4 0.3-0.5 0.3-0.8 0l-1.2-1 1.6-1.9 1.3 1c0.5 0.4 0.6 0.6 0.3 1.1l0.1 0.1 0.6-0.7-3.2-2.6-0.2 0.3"/><path class="st2" d="m24.3 68.2-2.4-1.1-0.1 0.2c0.4 0.2 0.5 0.5 0.2 1.1l-1.5 3.2c-0.3 0.6-0.6 0.7-1 0.6l-0.1 0.2 2.5 1.1c2 0.9 3.4 0.1 4-1.2 0.7-1.4 0.4-3.2-1.6-4.1m0.9 3.6c-0.7 1.4-1.8 2-3.1 1.4l-0.6-0.2c-0.5-0.2-0.6-0.5-0.2-1.3l1.8-3.8 1 0.5c1.6 0.7 1.7 2.2 1.1 3.4"/><path class="st2" d="m30.2 70.5c0.5 0.1 0.6 0.3 0.4 1l-0.7 3.5c-0.2 0.7-0.4 0.9-0.8 0.7v0.2l2 0.4v-0.2c-0.5-0.1-0.6-0.4-0.4-1l0.8-3.5c0.1-0.7 0.4-0.8 0.8-0.7v-0.2l-2-0.4-0.1 0.2"/><path class="st2" d="m39.9 71.3v0.2c0.5 0 0.7 0.2 0.7 0.9v3.4l-3.6-4.5h-1.5v0.2c0.7 0.1 0.9 0.4 0.9 1.1v3.4c0 0.8-0.2 1-0.7 1v0.2h1.7v-0.2c-0.5 0-0.8-0.2-0.8-0.8l-0.1-4 4.1 4.9h0.4v-4.7c0-0.7 0.2-0.9 0.7-0.9v-0.2h-1.8"/><path class="st2" d="m48.6 72.6c0.7-0.5 0.9-1 0.8-1.6-0.2-0.7-1-1.2-2.3-0.8l-2.1 0.6v0.2c0.5-0.1 0.7 0 0.9 0.7l0.9 3.4c0.2 0.7 0.1 0.9-0.4 1v0.2l2.5-0.7c1-0.3 1.6-1 1.4-1.8-0.1-0.8-0.8-1.3-1.7-1.2m-2.2-2 0.6-0.2c0.9-0.2 1.5 0.1 1.7 0.8s-0.2 1.3-1 1.5l-0.7 0.2zm2.4 4.8-0.5 0.1c-0.4 0.1-0.6 0-0.8-0.8l-0.4-1.6 0.5-0.1c1-0.3 1.7 0.1 2 0.9 0.2 0.8-0.3 1.3-0.8 1.5"/><path class="st2" d="m59.2 69.7-1.8-3.1c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.7 1 0.1 0.1c0.4-0.2 0.7-0.1 1 0.5l1.7 3c0 0.7-0.4 1.3-0.9 1.6-0.8 0.5-1.6 0.2-2-0.6l-1.6-2.4c-0.4-0.6-0.3-0.9 0.1-1.1l-0.1-0.1-1.8 1 0.1 0.1c0.4-0.2 0.6-0.2 1 0.5l1.4 2.4c0.5 0.9 1.5 1.4 2.7 0.7 0.7-0.4 1-0.9 1.2-1.8l0.4 0.7 1.2-0.7-0.1-0.1c-0.3 0.2-0.5 0.2-0.9-0.5"/><path class="st2" d="m64.1 63.3c0.4-0.8 0.3-1.4-0.2-1.8-0.5-0.5-1.5-0.6-2.4 0.3l-1.6 1.7 0.1 0.1c0.3-0.3 0.6-0.4 1.1 0.2l2.6 2.5c0.6 0.5 0.5 0.8 0.2 1.1l0.1 0.1 1.4-1.5-0.1-0.1c-0.3 0.3-0.6 0.3-1.1-0.2l-1.2-1.1 0.3-0.3c0.7-0.7 1.9 0 3.6 0.1l0.8-0.8-0.1-0.1c-0.7 0.6-2.3-0.5-3.5-0.2m-0.8 0.6-0.5 0.5-1.8-1.8 0.4-0.4c0.6-0.6 1.4-0.7 1.9-0.1 0.5 0.4 0.7 1.1 0 1.8"/><path class="st2" d="m70.8 54.8-0.1-0.1-1.2 2 0.1 0.1 0.1-0.2c0.2-0.4 0.5-0.4 1.1 0l0.5 0.3c0.4 0.3 0.2 0.8 0 1.1-0.7 1.2-2.3 1.4-3.7 0.5-1.3-0.8-1.8-2.1-1.1-3.1 0.4-0.7 1.3-1.3 2.3-0.8l0.1-0.1-1.4-0.9-0.1 0.2c0.1 0.1 0.1 0.2 0 0.4-0.2 0.4-0.6 0.5-1 1.2-0.7 1.2-0.6 3.1 1.2 4.2 1.1 0.7 2.9 0.8 4.2-1.4 0.1-0.2 0.6-1.1 0.7-1.4l-1.3-0.8c-0.5-0.5-0.7-0.7-0.4-1.2"/><path class="st2" d="m74.9 46.7-3.4-1c-0.7-0.2-0.8-0.4-0.7-0.9h-0.2l-0.6 2 0.2 0.1c0.1-0.5 0.4-0.6 1.1-0.4l1.6 0.5-0.9 3-1.6-0.5c-0.7-0.2-0.8-0.5-0.7-0.9h-0.2l-0.6 2h0.2c0.1-0.5 0.4-0.6 1.1-0.4l3.4 1c0.7 0.2 0.8 0.4 0.7 0.9h0.2l0.6-2h-0.2c-0.1 0.5-0.4 0.6-1.1 0.4l-1.5-0.5 0.9-3 1.6 0.5c0.7 0.2 0.8 0.4 0.7 0.9h0.2l0.6-2h-0.2c-0.2 0.4-0.5 0.5-1.2 0.3"/><path class="st2" d="m2 39.1c0 0.3 0.2 0.5 0.5 0.5s0.5-0.2 0.5-0.5-0.2-0.5-0.5-0.5-0.5 0.2-0.5 0.5"/><path class="st2" d="m74.7 39.1c0-0.3-0.2-0.5-0.5-0.5s-0.5 0.2-0.5 0.5 0.2 0.5 0.5 0.5 0.5-0.3 0.5-0.5"/></g></svg> diff --git a/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.pdf b/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.pdf Binary files differindex abccef5167..dc76c69163 100644 --- a/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.pdf +++ b/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.pdf diff --git a/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.tex b/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.tex index 875851d600..8bb95699ba 100644 --- a/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.tex +++ b/macros/latex/contrib/coloredtheorem/coloredtheorem-doc.tex @@ -40,9 +40,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% MAIN DOCUMENT \begin{document} - \title{The \tcthrm package {\footnotesize(v1.0.2)}} + \title{The \tcthrm package {\footnotesize(v1.0.3)}} \author{João M. Lourenço\\\texttt{\small joao.lourenco@fct.unl.pt}} - \date{March 31, 2024} + \date{August 28, 2024} \maketitle diff --git a/macros/latex/contrib/coloredtheorem/coloredtheorem.sty b/macros/latex/contrib/coloredtheorem/coloredtheorem.sty index 4e128bf80b..c35850cc22 100644 --- a/macros/latex/contrib/coloredtheorem/coloredtheorem.sty +++ b/macros/latex/contrib/coloredtheorem/coloredtheorem.sty @@ -14,7 +14,7 @@ %% \NeedsTeXFormat{LaTeX2e}[2020/06/01] \ProvidesPackage{coloredtheorem} - [2024/04/03 v1.0.2 - A colorful boxed theorem environment] + [2024/08/28 v1.0.3 - A colorful boxed theorem environment] \RequirePackage{tcolorbox} \tcbuselibrary{breakable} @@ -27,7 +27,7 @@ \expandafter\gdef\csname\tcbth list#1name\endcsname{List of #2s}% \expandafter\gdef\csname#1autorefname\endcsname{#2}% \AtEndPreamble{% - \ifdefined\crefname\expandafter\crefname\csname\tcbth#1\endcsname{#2}{#2s}\fi}% + \ifdefined\crefname\expandafter\crefname\expandafter{\tcbth#1}{#2}{#2s}\fi}% \expandafter\gdef\csname\tcbth listof#1s\endcsname {% \section*{\csname\tcbth list#1name\endcsname}% @@ -53,6 +53,9 @@ ~\csname the\tcbth#1\endcsname\fi}~~##2}, #3, ##3, ]% + \let\origpar=\par% + \def\par{\origpar\medskip}% + \ignorespaces% }{% \end{tcb<SOMETHING>} \end{tcolorbox}% \end{center}% diff --git a/macros/latex/contrib/edmaths/README.md b/macros/latex/contrib/edmaths/README.md index a850f29c6b..4647d361eb 100644 --- a/macros/latex/contrib/edmaths/README.md +++ b/macros/latex/contrib/edmaths/README.md @@ -1,5 +1,5 @@ # `edmaths` Report & Thesis Class -A report and thesis stylesheet for easier compliance with the [university’s typesetting rules](https://www.ed.ac.uk/academic-services/students/thesis-submission). See also the [_documentation_](https://foggalong.github.io/edinburgh-math-latex/edmaths-docs.pdf) and a [_compiled example_](https://foggalong.github.io/edinburgh-math-latex/example-report.pdf). To use, place the files and store them either with your .tex file(s) or in any directory that's findable by LaTeX (e.g. `$TEXINPUTS`). +A report and thesis stylesheet for easier compliance with the [university's typesetting rules](https://www.ed.ac.uk/academic-services/students/thesis-submission). See also the [_documentation_](https://foggalong.github.io/edinburgh-math-latex/edmaths-docs.pdf) and a [_compiled example_](https://foggalong.github.io/edinburgh-math-latex/example-report.pdf). To use, place the files and store them either with your .tex file(s) or in any directory that's findable by LaTeX (e.g. `$TEXINPUTS`). For more information on the wider project, including the beamer theme, [see GitHub](https://github.com/Foggalong/edinburgh-math-latex). The stylesheet [edmaths.sty](edmaths.sty) is provided under the [LaTeX Project Public License v1.3c](https://choosealicense.com/licenses/lppl-1.3c/) (LPPL) while the example [example-report.tex](example-report.tex) is provided under the [BSD Zero Clause License](https://choosealicense.com/licenses/0bsd/) (0BSD). diff --git a/macros/latex/contrib/edmaths/edmaths-docs.pdf b/macros/latex/contrib/edmaths/docs/edmaths-docs.pdf Binary files differindex cd62935fcd..b0839ecd16 100644 --- a/macros/latex/contrib/edmaths/edmaths-docs.pdf +++ b/macros/latex/contrib/edmaths/docs/edmaths-docs.pdf diff --git a/macros/latex/contrib/edmaths/docs/edmaths-docs.tex b/macros/latex/contrib/edmaths/docs/edmaths-docs.tex new file mode 100644 index 0000000000..d4a86affb4 --- /dev/null +++ b/macros/latex/contrib/edmaths/docs/edmaths-docs.tex @@ -0,0 +1,282 @@ +\documentclass[12pt]{article} + +% This is documentation for the `edmaths` LaTeX package, maintained by +% Josh Fogg for the University of Edinburgh. This file closely builds on +% that provided Alan Munn for the MSU Thesis Class, `msu-thesis`. The +% original documentation is licensed under LaTeX Project Public License +% (LPPL) version 1.3 or later, and this documentation is licensed under +% the LLP version 1.3c. For more information, see the GitHub repository: +% https://github.com/Foggalong/edinburgh-math-latex + +\def\msuversion{0.99} +\def\msudate{2024-08-30} +\title{\textbf{Using the \pkg{edmaths} Report \& Thesis Class}} +\author{\textbf{Josh Fogg}\\School of Mathematics\\The University of Edinburgh\\\texttt{\href{mailto:j.fogg@ed.ac.uk}{j.fogg@ed.ac.uk}}} +\date{Version \msuversion\\\msudate} + +% basic formatting tweaks +\usepackage[lmargin=2cm,rmargin=2cm,tmargin=3cm,bmargin=2cm]{geometry} +\usepackage[colorlinks=true]{hyperref} +\usepackage{enumitem} + +% use same fourier font available through edmaths +\usepackage{cmap} +\usepackage{fourier} +\usepackage[T1]{fontenc} +\usepackage{microtype} + +% setup syntax highlighting +\usepackage{highlightlatex} +\definecolor{whiteF0}{HTML}{F0F0F0} +\lstset{ + % external padding + aboveskip=.4em, + belowskip=-.2em, + xleftmargin=.03\textwidth, + xrightmargin=.03\textwidth, + % basic formatting + backgroundcolor=\color{whiteF0}, + showstringspaces=false, + columns=fixed, + basewidth=.5em, + basicstyle={\fontfamily{zlmtt}\selectfont}, + breaklines=true +} + + +% change new paragraph behaviour to no-indent and a linebreak +\usepackage[parfill]{parskip} + + +\newcommand\pkg[1]{\href{https://www.ctan.org/pkg/#1}{\color{teal}\lstinline{#1}}} +\newcommand\key[1]{{\color{orange}\lstinline|#1|}} + + +\begin{document} +\maketitle +\thispagestyle{empty} + +\section{Introduction} + +This is a package for use when writing reports or thesis for the \href{https://www.maths.ed.ac.uk/}{School of Mathematics} at the \href{https://www.ed.ac.uk/}{University of Edinburgh}. It provides an easy way to generate a document in \LaTeX{} which meets all the basic formatting requirements laid out by the \href{https://www.ed.ac.uk/academic-services/students/thesis-submission}{University's typesetting rules}. This means you can focus on your actual writing, rather than worrying about font spacing, margins sizes, {\it etc}. + +\section{Initial Setup} + +While this package can in theory work with many different document classes, it is designed to best work with the \pkg{report} class which should be available with any \TeX{} distribution. It can be used with any \LaTeX{} engine, including pdfLaTeX, XeTeX, or LuaTeX. While it should work with any reasonably up-to-date TeX distribution, it is tested with 2020 and later. + +The essential steps to setup are then: +\begin{enumerate} + \item Choose a document class using \lstinline|\documentclass[<options>]{report}|, with \key{<options>} + \begin{enumerate} + \item for font size, one of \key{10pt} (default), \key{11pt}, and \key{12pt}; + \item for sidedness, one of \key{oneside} (default) and \key{twoside}. + \end{enumerate} + \item Define information for the title page using \lstinline|\title{...}|, \lstinline|\author{...}|, and \lstinline|\date{...}|. + \item Load the \pkg{edmaths} package using \lstinline|\usepackage[<options>]{edmaths}|. +\end{enumerate} +These steps {\bf must} be done in exactly this order or the compiler will throw errors. + +The loading \pkg{edmaths} also loads the packages \pkg{amsmath}, \pkg{amsthm}, \pkg{amscd}, and \pkg{amssymb}, which are required by almost all mathematical publications. Through \pkg{setspace}, line spacing settings are available that only affect the body text and not footnotes and captions. + +The basic package has no other special requirements, but if you have certain additional packages installed then you can use some fancifying options (see below). + +\section{Package Options} + +When loading \pkg{edmaths} with +\begin{lstlisting} +\usepackage[<options>]{edmaths} +\end{lstlisting} +we can supply additional \key{<options>} as a comma-separated list of the following keywords. + +\subsection{Report Type} + +Exactly one of \key{firstyear}, \key{secondyear}, \key{thirdyear}, \key{fourthyear}, \key{phd}, \key{masterph}, or \key{mastersc} for postgrad projects, or exactly one of \key{mmath} or \key{y4project} for undergraduate projects. + +This prints the correct degree name or report type on the cover page. If you do not specify any of these, for example if your desired type is not listed, set \lstinline|\degreetext| manually before including this package. For example +\begin{lstlisting} +\newcommand{\degreetext}{Internal Report} +\end{lstlisting} +will produce a document labelled as an `Internal Report'. + +\subsection{Line Spacing} + +At most one of \key{single} (default), \key{onehalf}, or \key{double}. This sets the line spacing of the body text to single, one-half and double spaced, respectively. Check out \pkg{setspace} for custom spacing options. + +\subsection{Fonts} + +For better or worse, by default it uses \LaTeX's default font, \href{https://en.wikipedia.org/wiki/Computer_Modern}{Computer Modern}. However by specifying at most one of the font options it's to change this. + +Using \key{fourier} provides much improved typography by activating the \pkg{fourier} font package (based on Adobe's Utopia family) along with the \pkg{cmap} and \pkg{microtype} packages. All these dependencies must be met to use this option. + +Strictly speaking the thesis guidelines require a sans serif font, though it's not typically enforced for mathematics. However, if you do want to use one, \key{cmbright} sets the font to \href{https://tug.org/FontCatalogue/computermodernbright/}{Computer Modern Bright}. This requires the \pkg{cmbright}, \pkg{cmap}, \pkg{microtype}, and \pkg{fontenc} packages. + +\subsection{Links} + +Using \key{hyperref} creates a PDF output with clickable, all-black links. This depends on \pkg{hyperref} and \pkg{xcolor}. The packages are set up with sane default options, but to modify the behaviour, simply use the \lstinline|\hypersetup| command; see the \pkg{hyperref} documentation for details. + +If in addition \key{colour} is used, this sets clickable links to have a sane default colour (sepia for internal links, blue for external URLs). + +\subsection{Headers} + +If the \pkg{fancyhdr} package is installed, using \key{fancyhdr} creates nice page headers and footers (with sane default settings); to modify this behaviour, simply use the commands described in the \pkg{fancyhdr} documentation. + +\section{Usage} + +Once \pkg{edmaths} is set up, the following additional formatting commands and environments become available: + +\begin{itemize} + \item \lstinline|\maketitle| to create the cover page, + \item \lstinline|\declaration{...}| to create the declaration, + \item \lstinline|\dedication{...}| for a dedication page ({\it e.g.\/} `For Alex', not acknowledgements), + \item \lstinline|\begin{abstract}...\end{abstract}| for the abstract, + \item \lstinline|\begin{laysummary}...\end{laysummary}| for the \href{https://www.ed.ac.uk/sites/default/files/atoms/files/lay_summary_in_theses.pdf}{lay summary}, + \item \lstinline|\begin{acknowledgements}...\end{acknowledgements}| for any acknowledgements, + \item \lstinline|\tableofcontents| for the table of contents. +\end{itemize} + +\subsection{Declarations} + +While using \lstinline|\declaration{}| will give you a stock declaration page, in most cases this will need tailoring to the specific of your thesis \href{https://www.ed.ac.uk/sites/default/files/atoms/files/thesis_signed_declaration.pdf}{per university requirements}. For example, if your thesis includes previously-published work, it should be declared on this page. + +This can be done by for example, +\begin{lstlisting} +\declaration{ + I declare that this thesis has been composed solely by myself + and that it has not been submitted, in whole or in part, in any + previous application for a degree. Except where stated otherwise + by reference or acknowledgement, the work presented is entirely + my own. +} +\end{lstlisting} + +\subsection{Abstracts} + +If you wish to redefine the title of the abstract, this can be done by including +\begin{lstlisting} +\renewcommand{\abstractname}{My New Title} +\end{lstlisting} +anywhere before \lstinline|\begin{document}|. + +\subsection{Long Titles} + +If your \lstinline|\title| is quite long and you're using \pkg{fancyhdr}, you may also wish to define a \lstinline|\shorttitle{...}| to prevent wrapping within the header. This {\bf must} be done after loading \pkg{edmaths} else the compiler will throw an error. + +\subsection{Year 4 Projects} + +When using the \key{y4project} option, the command \lstinline|\yfourdeclaration{...}| can be used right after the abstract to print a declaration at the bottom of that page; the argument of this command is the name of the particular degree. + +\subsection{Basic Example} + +Below is a simple example of how this might be put together in a year one PhD report. + +\begin{lstlisting} +\documentclass[10pt]{report} + +\title{The title of my first year report} +\author{My name} +\date{YYYY} + +\usepackage[firstyear]{edmaths} + + +\begin{document} + +\maketitle + +\begin{abstract} + My abstract. +\end{abstract} + +\tableofcontents + +\chapter{First Chapter} + +\section{Section Name} + +\chapter{Second Chapter} + +\appendix + +\chapter{First Appendix} + +\end{document} +\end{lstlisting} + +A more complicated example for a PhD thesis is packaged with \pkg{edmaths} and \href{https://github.com/Foggalong/edinburgh-math-latex/blob/main/example-report.tex}{available here}. What this looks like compiled can be \href{https://foggalong.github.io/edinburgh-math-latex/example-report.pdf}{viewed here}. + +\section{Additional Tips} + +Below is an assortment of additional advice that may be useful when formatting a thesis or report. If you've got additional tips which you think would be useful to share, do share on the \href{https://github.com/Foggalong/edinburgh-math-latex}{GitHub}. + +\subsection{Spacing} + +When using larger line spacing than single spaced, you might want to single-space your table of contents, {\it etc}. For details, see the documentation for \pkg{setspace}, but to achieve this you could use \lstinline|{\singlespacing\tableofcontents}| and similar for \lstinline|\listoffigures| and \lstinline|\listoftables|. + +If you like custom line spacing, place \lstinline|\newcommand{\stretchfactor}{<x>}| before calling this package, where \key{<x>} is the line spacing factor (\key{1} gives single spacing). + +Put \lstinline|\flushbottom| right after \lstinline|\begin{document}| to obtain vertically justified pages. + +The very ``brave'' can also add \lstinline|\setlength{\parskip}{0pt}| in the preamble to remove any vertical rubber space between paragraphs, thus enforcing a strict grid layout. If you encounter underful boxes, add \lstinline|\vfill| as needed, most likely after headings ({\it e.g.\/} use \lstinline|\chapter{Introduction}\vfill|.). + +\subsection{Front Matter} + +Use \lstinline|\listoftables| and \lstinline|\listoffigures| to create a reference of all table and figure environments. Some may tell you that this is actually a requirement for a PhD thesis. + +Use \lstinline|\pagenumbering{roman}| and \lstinline|\pagenumbering{arabic}| to get different styles of page numbers for the front matter and make it all fancy like. + +If desired, use \lstinline|\addcontentsline| to add otherwise unreferenced chapters ({\it e.g.\/} the table of contents itself, the list of figures, the list of tables or the index) to the table of contents. + +\subsection{Fonts} + +If you don't want to use any of the fonts available by default simply do not specify \key{fourier} or \key{cmbright} option, and instead load \pkg{fontenc}, \pkg{cmap}, \pkg{microtype} and your font package as described in the font package's documentation. + +Use the \pkg{ccaption} package to customise the way that captions under figures and tables appear ({\it e.g.\/} if you prefer them to use a sans-serif font). + +\subsection{Subtitles} + +You may also wish to give your document a subtitle. Be aware that it is ambiguous whether this is allowable in the thesis guidelines, but it may be done by adding formatting commands within the title command, as below. + +\begin{lstlisting} +\title{Underwater Basket Weaving \\ + \large Analysing the optimal depth for willow rods} +\author{Author Name} +\date{YYYY} + +\usepackage[phd]{edmaths} +\end{lstlisting} + +If also using \key{fancyhdr}, remember to also add \lstinline|\shorttitle{Underwater Basket Weaving}| after loading \pkg{edmaths} also for consistency with your headers. + +\subsection{Overleaf} + +As a student or staff member at the University of Edinburgh you have access to \href{https://www.ed.ac.uk/information-services/computing/desktop-personal/software/main-software-deals/other-software/overleaf}{Overleaf Professional}! Do make use of this, it alleviates many of the headaches which come with using \LaTeX{} across multiple computers, which you surely will.. + +\subsection{Archiving your thesis for the future} + +The current version of \pkg{edmaths} class satisfies the typesetting requirements at any one time. Given these requirements change, you may find that if you need to recompile your thesis after you have graduated that the formatting changes. To avoid this, I'd recommend saving an archived version of the \href{https://github.com/Foggalong/edinburgh-math-latex/blob/main/edmaths.sty}{\lstinline|edmaths.sty|} file in the same folder as your thesis file. You only need to do this once you have completely finished your thesis however; there's no need to do it during the writing process. + +\section{Troubleshooting} + +I'm happy to \href{mailto:j.fogg@ed.ac.uk}{answer emails} or \href{https://github.com/Foggalong/edinburgh-math-latex/issues/new?assignees=&labels=report&projects=&template=report-issue.md&title=}{GitHub issues} about formatting issues with the class, {\bf especially} when you are in the final stages of formatting your dissertation or thesis. God knows that time is already stressful enough as it is. However, please keep in mind: + +\begin{itemize} + \item I do this as a volunteer on the side of all my other work. This is not something the university pay me for, just something I did because I identified the need. + + \item If you have general \LaTeX{} questions that are not specifically related to \pkg{edmaths}, please try to find answers elsewhere. Both \href{https://tex.stackexchange.com/}{tex.stackexchange.com} and \href{https://www.overleaf.com/learn}{Overleaf} are excellent resources. + + \item Please make sure you have the latest version of \pkg{edmaths}, it may be your issue has already been fixed. If in doubt, check the log file and compare it with \href{https://ctan.org/pkg/msu-thesis?lang=en}{CTAN} and \href{https://github.com/Foggalong/edinburgh-math-latex}{GitHub}. + + \item If you are using \href{https://www.overleaf.com}{Overleaf} , {\bf please} check the log file for errors, and fix them {\it before} you send me a sample document. By default Overleaf produces an output even when the document has lots of errors, so it could be that other errors you haven't noticed are obscuring the problem you're actually trying to fix. +\end{itemize} + + + +If you are using the class, please take a moment to fill out my \href{https://forms.gle/bm2AUzthFxW2naK36}{anonymous usage survey}. Thanks! You should be signed into your MSU Google account to access the form, but the form itself is anonymous. + +\section{Acknowledgements} + +The original \pkg{edmaths} was written by \href{https://github.com/tkoeppe}{Thomas K\"oppe} in 2007 and freely provided under the terms of the \href{https://choosealicense.com/licenses/lppl-1.3c/}{\LaTeX{} Project Public License v1.3c}. From 2020 onwards it has been maintained by \href{https://www.maths.ed.ac.uk/~jfogg/}{Josh Fogg} (me). Thanks also to \href{https://www.linkedin.com/in/adkbeckett}{Andrew Beckett} for his contribution in improving compliance, particularly around declarations which I'd missed entirely. + +Thanks to you too for using \pkg{edmaths}! I'd love to hear how you got on working with it, even if there weren't any specific issues. Just \href{mailto:j.fogg@ed.ac.uk}{shoot me an email}, it always makes my day! + +\end{document} diff --git a/macros/latex/contrib/edmaths/edmaths.sty b/macros/latex/contrib/edmaths/edmaths.sty index e11c515344..cbfd89a5be 100644 --- a/macros/latex/contrib/edmaths/edmaths.sty +++ b/macros/latex/contrib/edmaths/edmaths.sty @@ -1,4 +1,4 @@ -%% Package `edmaths' v0.98 +%% Package `edmaths' v0.99 %% File edmaths.sty %% Copyright 2024 Josh Fogg %% @@ -22,7 +22,7 @@ %% This work consists of the file edmaths.sty. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{edmaths}[2024-08-09 Edinburgh maths thesis/report style v0.98] +\ProvidesPackage{edmaths}[2024-08-30 Edinburgh maths thesis/report style v0.99] \RequirePackage{calc,ifthen,setspace,amsmath,amsthm,amscd,amssymb} @@ -98,7 +98,7 @@ % If with-cmbright selected, use the (sans-serif) Computer Modern Bright font. \ifthenelse{\boolean{with-cmbright}}{ - % NOTE must be compiled with xelatex or luatex + % NOTE if it doesn't compile, make sure you have CM Bright installed! \RequirePackage{cmap} \RequirePackage{cmbright} \RequirePackage[T1]{fontenc} @@ -255,4 +255,4 @@ \begin{center} \Large\it #1 \end{center} -} +}
\ No newline at end of file diff --git a/macros/latex/contrib/fontscale/CHANGELOG.md b/macros/latex/contrib/fontscale/CHANGELOG.md index 46a32e8fc9..cb259caa49 100644 --- a/macros/latex/contrib/fontscale/CHANGELOG.md +++ b/macros/latex/contrib/fontscale/CHANGELOG.md @@ -7,6 +7,14 @@ Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to ## [Unreleased] +## [v2.2.0] - 2024-08-29 + +### Changed +- Improved the messages issued by this package. + +### Added +- `\SetFontBaselineskip` + ## [v2.1.0] - 2024-08-12 ### Changed diff --git a/macros/latex/contrib/fontscale/beery.cls b/macros/latex/contrib/fontscale/beery.cls index f2fd7fd2c5..306ac43588 100644 --- a/macros/latex/contrib/fontscale/beery.cls +++ b/macros/latex/contrib/fontscale/beery.cls @@ -4,7 +4,7 @@ \NeedsTeXFormat{LaTeX2e}[2023-11-01] \ProvidesExplClass {beery} - {2024-08-12} + {2024-08-29} {} {} diff --git a/macros/latex/contrib/fontscale/fontscale-table-classic.tex b/macros/latex/contrib/fontscale/fontscale-table-classic.tex index 50ff413e36..5f3c727459 100644 --- a/macros/latex/contrib/fontscale/fontscale-table-classic.tex +++ b/macros/latex/contrib/fontscale/fontscale-table-classic.tex @@ -1,6 +1,6 @@ \ProvidesFile {fontscale-table-classic.tex} - [2024-08-12] + [2024-08-29] \begin{table} \centering diff --git a/macros/latex/contrib/fontscale/fontscale-table-font-steps.tex b/macros/latex/contrib/fontscale/fontscale-table-font-steps.tex index 5b20f18681..520a681587 100644 --- a/macros/latex/contrib/fontscale/fontscale-table-font-steps.tex +++ b/macros/latex/contrib/fontscale/fontscale-table-font-steps.tex @@ -1,6 +1,6 @@ \ProvidesFile {fontscale-table-font-steps.tex} - [2024-08-12] + [2024-08-29] \begin{table} \centering diff --git a/macros/latex/contrib/fontscale/fontscale-table-musical.tex b/macros/latex/contrib/fontscale/fontscale-table-musical.tex index e6a6ca5ce0..67709ef955 100644 --- a/macros/latex/contrib/fontscale/fontscale-table-musical.tex +++ b/macros/latex/contrib/fontscale/fontscale-table-musical.tex @@ -1,6 +1,6 @@ \ProvidesFile {fontscale-table-musical.tex} - [2024-08-12] + [2024-08-29] \begin{table} \centering diff --git a/macros/latex/contrib/fontscale/fontscale.pdf b/macros/latex/contrib/fontscale/fontscale.pdf Binary files differindex adcd809134..6e16d79ccf 100644 --- a/macros/latex/contrib/fontscale/fontscale.pdf +++ b/macros/latex/contrib/fontscale/fontscale.pdf diff --git a/macros/latex/contrib/fontscale/fontscale.sty b/macros/latex/contrib/fontscale/fontscale.sty index 70bfae6026..81a3a828b8 100644 --- a/macros/latex/contrib/fontscale/fontscale.sty +++ b/macros/latex/contrib/fontscale/fontscale.sty @@ -8,8 +8,8 @@ \NeedsTeXFormat{LaTeX2e}[2023-11-01] \ProvidesExplPackage {fontscale} - {2024-08-12} - {2.1.0} + {2024-08-29} + {2.2.0} {A flexible interface for setting font sizes} % l3kernel version 2023-10-10 added many 'e'-variants. @@ -116,20 +116,32 @@ \fp_new:N \l__fontscale_musical_notes_fp % Scratch variables -\tl_new:N \l__fontscale_tmp_tl -\str_new:N \l__fontscale_tmp_str -\dim_new:N \l__fontscale_tmp_dim -\fp_new:N \l__fontscale_tmp_fp +\tl_new:N \l__fontscale_tmp_tl +\str_new:N \l__fontscale_tmp_str +\dim_new:N \l__fontscale_tmp_dim +\skip_new:N \l__fontscale_tmp_skip +\fp_new:N \l__fontscale_tmp_fp -% SOME HELPER FUNCTIONS +% SOME FUNCTIONS +% Variants of l3kernel functions +\cs_generate_variant:Nn \msg_error:nnnnn { nnVV , nnvv } +\cs_generate_variant:Nn \msg_error:nnnn { nnv , nne } % Sets a dimen/skip variable from a dimen/skip expression, appending a default -% unit of pt. +% unit of pt. This also removes extra tokens. \cs_new_protected:Npn \__fontscale_dim_set_default_pt:Nn #1#2 - { \@defaultunits #1 = \dimexpr #2 pt \relax \relax \@nnil } + { + \afterassignment \use_none_delimit_by_q_stop:w + #1 = \dimexpr #2 pt \relax \relax + \q_stop + } \cs_generate_variant:Nn \__fontscale_dim_set_default_pt:Nn { c } \cs_new_protected:Npn \__fontscale_skip_set_default_pt:Nn #1#2 - { \@defaultunits #1 = \glueexpr #2 pt \relax \@nnil } + { + \afterassignment \use_none_delimit_by_q_stop:w + #1 = \glueexpr #2 pt \relax + \q_stop + } \cs_generate_variant:Nn \__fontscale_skip_set_default_pt:Nn { c } % Similar to \@setfontsize. Used to define \tiny to \Huge. Need \dim_use:N for % compatibility with the microtype package. @@ -160,13 +172,19 @@ { \dim_compare:nNnTF \l__fontscale_fontsize_skip < \l__fontscale_fontsize_dim - { \msg_error:nn { fontscale } { font-baselineskip-out-of-bounds } } + { + \msg_error:nnVV { fontscale } { font-baselineskip-out-of-bounds } + \l__fontscale_fontsize_skip \l__fontscale_fontsize_dim + } { \fontsize \l__fontscale_fontsize_dim \l__fontscale_fontsize_skip \selectfont } } - { \msg_error:nn { fontscale } { font-size-out-of-bounds } } + { + \msg_error:nnV { fontscale } { font-size-out-of-bounds } + \l__fontscale_fontsize_dim + } } % Similar to the above function, except that it sets the font baselineskip % equal to the new font size times the baselineskip-size-ratio. @@ -185,116 +203,98 @@ } \selectfont } - { \msg_error:nn { fontscale } { font-size-out-of-bounds } } + { + \msg_error:nnV { fontscale } { font-size-out-of-bounds } + \l__fontscale_fontsize_dim + } } % MESSAGES \msg_new:nnn { fontscale } { key-baselineskip-size-ratio-out-of-bounds } { + Invalid~ value~ '#1'~ \msg_line_context:. \\ The~ value~ of~ the~ key~ 'baselineskip-size-ratio'~ - \msg_line_context: \c_space_tl must~ be~ at~ least~ 1. } \msg_new:nnn { fontscale } { key-musical-base-out-of-bounds } { + Invalid~ value~ '#1'~ \msg_line_context:. \\ The~ value~ of~ the~ key~ 'musical / base'~ - \msg_line_context: \c_space_tl must~ be~ a~ positive~ length. } \msg_new:nnn { fontscale } { key-musical-ratio-out-of-bounds } { + Invalid~ value~ '#1'~ \msg_line_context:. \\ The~ value~ of~ the~ key~ 'musical / ratio'~ - \msg_line_context: \c_space_tl must~ be~ greater~ than~ 1. } \msg_new:nnn { fontscale } { key-musical-notes-out-of-bounds } { + Invalid~ value~ '#1'~ \msg_line_context:. \\ The~ value~ of~ the~ key~ 'musical / notes'~ - \msg_line_context: \c_space_tl must~ be~ a~ positive~ integer. } \msg_new:nnn { fontscale } { key-font-scale-out-of-bounds } { - The~ value~ of~ the~ key~ '#1 / scale'~ - \msg_line_context: \c_space_tl + Invalid~ value~ '#1'~ \msg_line_context:. \\ + The~ value~ of~ the~ key~ '#2 / scale'~ must~ be~ positive. } \msg_new:nnn { fontscale } { key-font-size-out-of-bounds } { - The~ value~ of~ the~ key~ '#1 / size'~ - \msg_line_context: \c_space_tl + Invalid~ value~ '#1'~ \msg_line_context:. \\ + The~ value~ of~ the~ key~ '#2 / size'~ must~ be~ a~ positive~ length. } \msg_new:nnn { fontscale } { key-font-scale-overwritten } { The~ font~ size~ set~ by~ the~ key~ '#1 / scale'~ - has~ been~ overwritten~ by~ the~ key~ '#1 / size'~ - \msg_line_context:. + has~ been~ overwritten~ by~ the~ key~ '#1 / size'~ \msg_line_context:. } \msg_new:nnn { fontscale } { key-font-baselineskip-out-of-bounds } { - The~ value~ of~ the~ key~ '#1 / baselineskip'~ - \msg_line_context: \c_space_tl + Invalid~ value~ '#1'~ \msg_line_context:. \\ + The~ value~ of~ the~ key~ '#3 / baselineskip'~ must~ be~ greater~ than~ or~ equal~ to~ - the~ font~ size~ of~ '\iow_char:N \\#1'. + the~ font~ size~ of~ \iow_char:N \\#3~ '#2'. } -\msg_new:nnn { fontscale } { font-sizes-out-of-order } +\msg_new:nnn { fontscale } { key-font-sizes-out-of-order } { The~ font~ sizes~ - \msg_line_context: \c_space_tl - are~ not~ in~ the~ correct~ order.~ + are~ not~ in~ the~ correct~ order~ \msg_line_context:. \\ The~ lengths~ of~ the~ font~ sizes~ should~ be~ ordered~ from~ - '\iow_char:N \\tiny'~ to~ '\iow_char:N \\Huge'. + \iow_char:N \\tiny~ to~ \iow_char:N \\Huge. } -\msg_new:nnn { fontscale } { font-baselineskips-out-of-order } +\msg_new:nnn { fontscale } { key-font-baselineskips-out-of-order } { The~ font~ baselineskips~ - \msg_line_context: \c_space_tl - are~ not~ in~ the~ correct~ order.~ + are~ not~ in~ the~ correct~ order~ \msg_line_context:. \\ The~ lengths~ of~ the~ font~ baselineskips~ should~ be~ ordered~ from~ - '\iow_char:N \\tiny'~ to~ '\iow_char:N \\Huge'. + \iow_char:N \\tiny~ to~ \iow_char:N \\Huge. } \msg_new:nnn { fontscale } { math-mode-warning } - { - '#1'~ - \msg_line_context: \c_space_tl - does~ nothing~ if~ used~ in~ math~ mode. - } + { '#1'~ does~ nothing~ if~ used~ in~ math~ mode~ \msg_line_context:. } \msg_new:nnn { fontscale } { math-mode-error } - { - '#1'~ - \msg_line_context: \c_space_tl - cannot~ be~ used~ in~ math~ mode. - } + { '#1'~ cannot~ be~ used~ in~ math~ mode~ \msg_line_context:. } \msg_new:nnn { fontscale } { font-size-out-of-bounds } - { - The~ font~ size~ - \msg_line_context: \c_space_tl - must~ be~ a~ positive~ length. - } + { The~ font~ size~ '#1'~ must~ be~ a~ positive~ length~ \msg_line_context:. } \msg_new:nnn { fontscale } { font-baselineskip-out-of-bounds } { - The~ font~ baselineskip~ - \msg_line_context: \c_space_tl - must~ be~ greater~ than~ or~ equal~ to~ the~ font~ size. + The~ font~ baselineskip~ '#1'~ must~ be~ greater~ than~ or~ equal~ to~ + the~ font~ size~ '#2'~ \msg_line_context:. } \msg_new:nnn { fontscale } { font-step-out-of-bounds } { - The~ font~ step~ - \msg_line_context: \c_space_tl - must~ equal~ an~ integer~ from~ -4~ to~ 5,~ - unless~ the~ value~ of~ the~ key~ 'typographic-scale'~ is~ 'musical'.~ - \msg_see_documentation_text:n { fontscale } + Invalid~ font~ step~ '#1'~ \msg_line_context:. \\ + The~ font~ step~ must~ equal~ an~ integer~ from~ -4~ to~ 5,~ + unless~ the~ value~ of~ the~ key~ 'typographic-scale'~ is~ 'musical'. } \msg_new:nnn { fontscale } { current-font-step-out-of-bounds } { - '\iow_char:N \\SetFontStep*'~ - \msg_line_context: \c_space_tl - could~ not~ calculate~ the~ new~ font~ step~ because~ - the~ current~ font~ step~ is~ undefined.~ - \msg_see_documentation_text:n { fontscale } + '\iow_char:N \\SetFontStep*'~ could~ not~ calculate~ the~ new~ font~ step~ + because~ the~ current~ font~ step~ is~ undefined~ \msg_line_context:. } % DEFINE KEYS @@ -571,23 +571,27 @@ { \fp_compare:nNnT \l__fontscale_baselineskip_size_ratio_fp < \c_one_fp { - \msg_error:nn { fontscale } + \msg_error:nne { fontscale } { key-baselineskip-size-ratio-out-of-bounds } + { \fp_use:N \l__fontscale_baselineskip_size_ratio_fp } \prg_break: } \dim_compare:nNnF \l__fontscale_musical_base_dim > \c_zero_dim { - \msg_error:nn { fontscale } { key-musical-base-out-of-bounds } + \msg_error:nnV { fontscale } { key-musical-base-out-of-bounds } + \l__fontscale_musical_base_dim \prg_break: } \fp_compare:nNnF \l__fontscale_musical_ratio_fp > \c_one_fp { - \msg_error:nn { fontscale } { key-musical-ratio-out-of-bounds } + \msg_error:nne { fontscale } { key-musical-ratio-out-of-bounds } + { \fp_use:N \l__fontscale_musical_ratio_fp } \prg_break: } \int_compare:nNnF \l__fontscale_musical_notes_int > 0 { - \msg_error:nn { fontscale } { key-musical-notes-out-of-bounds } + \msg_error:nnV { fontscale } { key-musical-notes-out-of-bounds } + \l__fontscale_musical_notes_int \prg_break: } } @@ -612,8 +616,8 @@ { \l__fontscale_normalsize_size_tl } \dim_compare:nNnF \l_fontscale_normalsize_size_dim > \c_zero_dim { - \msg_error:nnn { fontscale } { key-font-size-out-of-bounds } - { normalsize } + \msg_error:nnVn { fontscale } { key-font-size-out-of-bounds } + \l_fontscale_normalsize_size_dim { normalsize } \prg_break: } } @@ -637,8 +641,10 @@ \dim_compare:nNnT \l_fontscale_normalsize_baselineskip_skip < \l_fontscale_normalsize_size_dim { - \msg_error:nnn { fontscale } - { key-font-baselineskip-out-of-bounds } { normalsize } + \msg_error:nnVVn { fontscale } + { key-font-baselineskip-out-of-bounds } + \l_fontscale_normalsize_baselineskip_skip + \l_fontscale_normalsize_size_dim { normalsize } \prg_break: } } @@ -753,8 +759,8 @@ { \tl_map_break:n { - \msg_error:nnn { fontscale } { key-font-scale-out-of-bounds } - {#1} + \msg_error:nnen { fontscale } { key-font-scale-out-of-bounds } + { \fp_eval:n { \use:c { l__fontscale_#1_scale_tl } } } {#1} \prg_break: } } @@ -768,8 +774,8 @@ { \tl_map_break:n { - \msg_error:nnn { fontscale } { key-font-size-out-of-bounds } - {#1} + \msg_error:nnvn { fontscale } { key-font-size-out-of-bounds } + { l_fontscale_#1_size_dim } {#1} \prg_break: } } @@ -805,15 +811,17 @@ { \tl_map_break:n { - \msg_error:nnn { fontscale } - { key-font-baselineskip-out-of-bounds } {#1} + \msg_error:nnvvn { fontscale } + { key-font-baselineskip-out-of-bounds } + { l_fontscale_#1_baselineskip_skip } + { l_fontscale_#1_size_dim } {#1} \prg_break: } } } } -% Issues a warning if the font sizes or font baselineskips (ignoring the -% stretch and shrink components) are not in the correct order. +% Issues a warning if the font sizes or font baselineskips are not in the +% correct order. \cs_new_protected:Npn \__fontscale_keys_process_check_order: { \dim_compare:nF @@ -829,7 +837,7 @@ < \l_fontscale_huge_size_dim < \l_fontscale_Huge_size_dim } - { \msg_warning:nn { fontscale } { font-sizes-out-of-order } } + { \msg_warning:nn { fontscale } { key-font-sizes-out-of-order } } \dim_compare:nF { \l_fontscale_tiny_baselineskip_skip @@ -843,7 +851,7 @@ < \l_fontscale_huge_baselineskip_skip < \l_fontscale_Huge_baselineskip_skip } - { \msg_warning:nn { fontscale } { font-baselineskips-out-of-order } } + { \msg_warning:nn { fontscale } { key-font-baselineskips-out-of-order } } } % DOCUMENT COMMANDS @@ -1044,7 +1052,10 @@ } } } - { \msg_error:nn { fontscale } { font-step-out-of-bounds } } + { + \msg_error:nne { fontscale } { font-step-out-of-bounds } + { \fp_eval:n {#1} } + } } } \cs_new_protected:Npn \__fontscale_add_font_step:n #1 @@ -1132,6 +1143,28 @@ \cs_new_eq:NN \__fontscale_set_font_size_baselineskip:nn \__fontscale_fontsize:nn +\NewDocumentCommand \SetFontBaselineskip { s m } + { + \mode_if_math:TF + { + \msg_warning:nne { fontscale } { math-mode-warning } + { \token_to_str:N \SetFontBaselineskip } + } + { + \IfBooleanTF #1 + { \__fontscale_add_font_baselineskip:n {#2} } + { \__fontscale_set_font_baselineskip:n {#2} } + } + } +\cs_new_protected:Npn \__fontscale_set_font_baselineskip:n + { \__fontscale_fontsize:nn { \f@size pt } } +\cs_new_protected:Npn \__fontscale_add_font_baselineskip:n #1 + { + \__fontscale_skip_set_default_pt:Nn \l__fontscale_tmp_skip {#1} + \__fontscale_fontsize:nn { \f@size pt } + { \l__fontscale_tmp_skip + \f@baselineskip } + } + \NewDocumentCommand \PrintFontSizeParameters { } { \__fontscale_print_font_size_parameters: } \cs_new_protected:Npn \__fontscale_print_font_size_parameters: @@ -1292,4 +1325,6 @@ \text_declare_purify_equivalent:Nn \SetFontSize { \__fontscale_remove_arg_spec_sm:n } \text_declare_purify_equivalent:Nn \ScaleFont { \use_none:n } -\text_declare_purify_equivalent:Nn \SetFontSizeBaselineskip { \use_none:nn }
\ No newline at end of file +\text_declare_purify_equivalent:Nn \SetFontSizeBaselineskip { \use_none:nn } +\text_declare_purify_equivalent:Nn \SetFontBaselineskip + { \__fontscale_remove_arg_spec_sm:n }
\ No newline at end of file diff --git a/macros/latex/contrib/fontscale/fontscale.tex b/macros/latex/contrib/fontscale/fontscale.tex index 3737afe5b6..84cd85c859 100644 --- a/macros/latex/contrib/fontscale/fontscale.tex +++ b/macros/latex/contrib/fontscale/fontscale.tex @@ -14,7 +14,7 @@ A flexible interface for setting font sizes Oliver Beery -Version 2.1.0\quad{}12 August 2024 +Version 2.2.0\quad{}29 August 2024 \section{Introduction} @@ -182,7 +182,7 @@ The font baselineskips of the font size commands from \cs{tiny} to \cs{Huge} are Sets the font baselineskip of each font size command from \cs{tiny} to \cs{Huge} equal to its font size \texttimes{} the result of computing the \meta{floating point expression}. Sets the font baselineskip set by \cs{SetFontStep}, \cs{SetFontScale}, and \cs{SetFontSize} (\S\ref{subsec:fontsize}) equal to the new font size \texttimes{} the result of computing the \meta{floating point expression}. -The font baselineskip must be greater than or equal to the font size. +The value of this key must be at least \num{1}. \subsection{Overwriting the previous keys} @@ -235,7 +235,6 @@ This section documents the commands provided by the \pkg{fontscale} package. Sets and processes the \pkg{fontscale} package keys (\S\ref{sec:keys}) in \meta{key\-/value list} and then uses \cs{normalsize}. Adding the optional star first resets all the \pkg{fontscale} package keys to their initial values. -The order of the keys in \meta{key\-/value list} does not matter. Can be used mid\-/document. The effect is local to the current group. Does nothing, except issue a warning, if used in math mode. @@ -332,6 +331,18 @@ The font baselineskip must be greater than or equal to the font size. Does nothing, except issue a warning, if used in math mode. Can be used as an alternative to \cs{fontsize} + \cs{selectfont} as discussed in \S\ref{subsec:expandable}. +\subsection{Setting only the font baselineskip} +\label{subsec:setfontbaselineskip} + +\cs{SetFontBaselineskip} \sarg{} \marg{skip expression} +\KeepNextPar* + +Sets the font baselineskip to the value of \meta{skip expression}, appending a default unit of \unit{pt}. +Adding the optional star instead increases the current font baselineskip by the result of \meta{skip expression}, appending a default unit of \unit{pt}. +The font baselineskip must be greater than or equal to the font size. +Does not change the font size. +Does nothing, except issue a warning, if used in math mode. + \subsection{Testing and debugging} \label{subsec:debug} @@ -380,7 +391,7 @@ This section documents the \pkg{expl3} programming support provided by the \pkg{ } \label{subsec:textpurify} -\cs{text_purify:n} will correctly remove the formatting commands defined by this package, including \cs{fontscalesetup} and the commands documented in \S\ref{subsec:fontsize}. +\cs{text_purify:n} will correctly remove the formatting commands defined by this package, including the commands documented in \S\ref{subsec:fontscalesetup}, \S\ref{subsec:fontsize}, and \S\ref{subsec:setfontbaselineskip}. \subsection{Public functions and variables} \label{subsec:publicexpl3} diff --git a/macros/latex/contrib/suanpan-l3/README.md b/macros/latex/contrib/suanpan-l3/README.md index 091385aaeb..626b8f857b 100644 --- a/macros/latex/contrib/suanpan-l3/README.md +++ b/macros/latex/contrib/suanpan-l3/README.md @@ -7,16 +7,16 @@ The `suanpan-l3` package offers a unique environment for drawing abacuses, denot At the same time, the `suanpan-l3` package offers customization options for abacus, including line width, draw color, fill color, bid space, rod space, etc. These can be configured through package options, `suanpan` environment options, or `\suanpanset` macro. -For further details and examples, please refer to the manual(in Chinese). +For further details and examples, please refer to the manual(in Chinese/English). Contributing ------------ 1. gitee repository: (1). repository: [suanpan](https://gitee.com/nwafu_nan/suan-pan) - (2). Issues and PR: [issue](https://gitee.com/nwafu_nan/suanpan-/issues) or [pull request](https://gitee.com/nwafu_nan/suan-pan/pulls). - - 基于l3draw的中国传统7珠算盘LaTeX排版宏包 + (2). Issues and PR: [issue](https://gitee.com/nwafu_nan/suan-pan/issues) or [pull request](https://gitee.com/nwafu_nan/suan-pan/pulls). + +基于l3draw的中国传统7珠算盘LaTeX排版宏包 ======= `suanpan-l3`是一个基于l3draw绘图宏包,用Expl3开发的中国传统7珠圆珠算盘排版宏包,它能够实现普通上珠、下珠和使用底珠、顶珠和悬珠的算盘排版。 @@ -33,11 +33,11 @@ Contributing 1. gitee仓库: (1). 仓库地址: [suanpan](https://gitee.com/nwafu_nan/suan-pan) (2). Issues and PR: [issue](https://gitee.com/nwafu_nan/suan-pan/issues) or [pull request](https://gitee.com/nwafu_nan/suan-pan/pulls). - + Copyright and Licence --------------------- - Copyright (C) 2020-2022 by Nan Geng <nangeng@nwafu.edu.cn> + Copyright (C) 2020-2024 by Nan Geng <nangeng@nwafu.edu.cn> ---------------------------------------------------------------------- This work may be distributed and/or modified under the diff --git a/macros/latex/contrib/suanpan-l3/suanpan-l3.pdf b/macros/latex/contrib/suanpan-l3/suanpan-l3.pdf Binary files differindex 87345bc429..339b329f0f 100644 --- a/macros/latex/contrib/suanpan-l3/suanpan-l3.pdf +++ b/macros/latex/contrib/suanpan-l3/suanpan-l3.pdf diff --git a/macros/latex/contrib/suanpan-l3/suanpan-l3.sty b/macros/latex/contrib/suanpan-l3/suanpan-l3.sty index 0bdb8b6b1e..551702dfdb 100644 --- a/macros/latex/contrib/suanpan-l3/suanpan-l3.sty +++ b/macros/latex/contrib/suanpan-l3/suanpan-l3.sty @@ -8,7 +8,8 @@ \NeedsTeXFormat{LaTeX2e}[2020/10/01] \RequirePackage{expl3} % \ProvidesExplPackage{suanpan}{2024-08-20}{v1.0.0} % 初稿 -\ProvidesExplPackage{suanpan-l3}{2024-08-28}{v1.1.0} % 代码优化(统一尺寸计算,添加空白占位) +% \ProvidesExplPackage{suanpan}{2024-08-28}{v1.1.0} % 优化(统一尺寸计算,添加空白占位) +\ProvidesExplPackage{suanpan-l3}{2024-08-30}{v1.1.1} % 更名为suanpan-l3 {draw suanpan(abacus) with LaTeX3} \RequirePackage{l3keys2e} diff --git a/macros/latex/contrib/suanpan-l3/suanpan-l3.tex b/macros/latex/contrib/suanpan-l3/suanpan-l3.tex index b960ee7a48..e6cf62b186 100644 --- a/macros/latex/contrib/suanpan-l3/suanpan-l3.tex +++ b/macros/latex/contrib/suanpan-l3/suanpan-l3.tex @@ -7,19 +7,19 @@ \IndexPrologue { - \section*{索引} - \markboth{索引}{索引} - \addcontentsline{toc}{section}{索引} - 斜体数字说明了对应索引内容出现的页码, - 带有下划线的数据给出了索引内容的定义, - 其它的数字给出了索引内容引用的位置。 - % \section*{Index} - % \markboth{Index}{Index} - % \addcontentsline{toc}{section}{Index} - % The~italic~numbers~denote~the~pages~where~the~ - % corresponding~entry~is~described,~ - % numbers~underlined~point~to~the~definition,~ - % all~others~indicate~the~places~where~it~is~used. + % \section*{索引} + % \markboth{索引}{索引} + % \addcontentsline{toc}{section}{索引} + % 斜体数字说明了对应索引内容出现的页码, + % 带有下划线的数据给出了索引内容的定义, + % 其它的数字给出了索引内容引用的位置。 + \section*{Index} + \markboth{Index}{Index} + \addcontentsline{toc}{section}{Index} + The~italic~numbers~denote~the~pages~where~the~ + corresponding~entry~is~described,~ + numbers~underlined~point~to~the~definition,~ + all~others~indicate~the~places~where~it~is~used. } \newcommand\tikzmark[1]{\tikz \coordinate[overlay, remember picture] (#1);} @@ -58,6 +58,7 @@ top=2cm, bottom=2cm } + \PrintChanges \PrintIndex } @@ -89,7 +90,7 @@ \end{itemize} } { } -\keys_define:nn { cchess/doc } { +\keys_define:nn { suanpan/doc } { opt .tl_set:N = \l_opt_tl, desc .tl_set:N = \l_desc_tl, init .tl_set:N = \l_init_tl, @@ -98,7 +99,7 @@ \box_new:N \l__option_box \NewDocumentEnvironment { option } { m +b } { - \keys_set:nn { cchess/doc } { #1 } + \keys_set:nn { suanpan/doc } { #1 } \hbox_set:Nw \l__option_box \small \ttfamily \begin{minipage}[t]{\textwidth} @@ -110,13 +111,12 @@ {~}\l_desc_tl \hfill( \tl_if_eq:NnTF \l_init_tl { init-none } { no~value } - { 初始值:~\texttt{\l_init_tl} } + { init: ~\texttt{\l_init_tl} } ) \end{minipage} \hbox_gset_end: \box_use_drop:N \l__option_box #2 - % \vspace*{-4ex} \medskip } { } @@ -124,27 +124,28 @@ { \__codedoc_cmd:no {#1} { #2 } } \ExplSyntaxOff -\def\vers{\texttt{v1.1.0} } +\def\vers{\texttt{v1.1.1} } + +\changes{v1.0.0}{2024/08/20}{first version.} \begin{document} \title{ - \pkg{suanpan}---算盘(Abacus)排版宏包 - % \rlap{\makebox[4cm][r]{ - % \normalsize $\Longrightarrow$ \color{red} - % \protect\hyperlink{en}{English Version} - % \protect\hypertarget{zh}{} - % }} + \pkg{suanpan-l3}---算盘(Abacus)排版宏包 + \rlap{\makebox[4cm][r]{ + \normalsize $\Longrightarrow$ \color{red} + \protect\hyperlink{en}{English Version} + \protect\hypertarget{zh}{} + }} } \author{\textit{耿楠} \texttt{<nangeng@nwafu.edu.cn>}} \date{\the\year 年\the\month 月\the\day 日\qquad \vers -% \thanks{\url{https://github.com/registor/suanpan}} \thanks{\url{https://gitee.com/nwafu_nan/suan-pan}} } \maketitle \begin{abstract} - \pkg{suanpan}是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}% + \pkg{suanpan-l3}是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}% 开发的中国传统7珠圆珠算盘排版宏包,它能够实现使用普通上珠、下珠 和底珠、顶珠及悬珠的算盘排版。该宏包提供了唯一的一个 \env{suanpan}算盘排版环境及仅在该环境中使用的 \tn{rod}、 @@ -189,7 +190,7 @@ \section{引言} -\pkg{suanpan}宏包是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}% +\pkg{suanpan-l3}宏包是一个基于\pkg{l3draw}绘图宏包,用\pkg{Expl3}% 开发的中国传统7珠圆珠算盘排版宏包,它利用\pkg{l3draw}的绘图功能, 利用简单线条实现了算盘的排版。 @@ -218,7 +219,7 @@ 在\oarg{外观选项}中可以通过key-value的方式设置线宽、颜色、 缩放比例等外观属性。 - 通过\oarg{外观选项}设置的外观参数仅对当前命令局部有效, + 通过\oarg{外观选项}设置的外观参数仅对\env{suanpan}环境局部有效。 \begin{SideBySideExample}[frame=single,numbers=left,% xrightmargin=.48\linewidth,gobble=2] @@ -303,6 +304,7 @@ \end{suanpan} \end{SideBySideExample} +\changes{v1.0.1}{2024/08/26}{rename \tn{bidclr} to \tn{bid}.} \subsubsection{\tn{bid}算珠着色命令} \begin{function}{\bid} @@ -340,6 +342,7 @@ \end{suanpan} \end{SideBySideExample} +\changes{v1.1.0}{2024/08/28}{adde \tn{bids} macro.} \subsubsection{\tn{bids}内珠或外珠着色命令} \begin{function}{\bids} @@ -414,7 +417,7 @@ 操作有效。 \begin{notezh} - 由于\pkg{suanpan}宏包涉及大量绘图操作,因此建议尽量减少在每个 + 由于\pkg{suanpan-l3}宏包涉及大量绘图操作,因此建议尽量减少在每个 \env{suanpan}排版环境的可选项中使用\oarg{外观选项}设置,以 节约编译时间。如需要更改算盘外观,可以在引用宏包时,通过为宏包 添加选项实现,也可以执行\tn{suanpanset}命令进行必要的 @@ -423,20 +426,20 @@ \section{宏包选项} -在\pkg{suanpan}宏包中,算盘颜色、线条宽度、档位及算珠间距等 +在\pkg{suanpan-l3}宏包中,算盘颜色、线条宽度、档位及算珠间距等 算盘外观属性可以在引入宏包时通过\oarg{宏包选项}进行设置, 也可以在\env{suanpan}环境的\oarg{外观选项}中进行局部设置, 还可以通过\cs{suanpanset}命令进行全局或局部设置。 强烈建议在引用宏包时通过\oarg{宏包选项}为一个文档统一全局设置 -算盘外观属性,以节约编译时间。应避免频繁在命令和环境中使用 +算盘外观属性,以节约编译时间。应避免频繁\env{suanpan}环境中使用 \oarg{宏包选项}或使用\cs{suanpanset}命令设置算盘外观属性。 -\pkg{suanpan}宏包选项是一个英文逗号分隔的选项列表,其 +\pkg{suanpan-l3}宏包选项是一个英文逗号分隔的选项列表,其 选项是\marg{key}|=|\marg{value}形式。部分选项的\marg{value}可以省略。 对于同一选项,后续设置会覆盖以前设置。 -\pkg{suanpan}宏包采用\LaTeX3风格的键值设置,支持不同类型以及多种层次的 +\pkg{suanpan-l3}宏包采用\LaTeX3风格的键值设置,支持不同类型以及多种层次的 选项设定。键值列表中,``|=|''左右的空格不影响设置。但需注意,参数列表中% \textsf{不可以出现空行}。 @@ -646,28 +649,518 @@ \end{suanpan} \end{SideBySideExample} -% -% \bigskip - -% \bigskip - -% \title{ -% \pkg{suanpan} package for writing Chinese chess -% \rlap{\makebox[4cm][r]{ -% \normalsize $\Longrightarrow$ \color{red} -% \protect\hyperlink{zh}{中文版本} -% \protect\hypertarget{en}{} -% }} -% } -% \author{Nan Geng \texttt{<nangeng@nwafu.edu.cn>}} -% \date{\today\qquad \vers} -% \maketitle -% -% \section{Introduction} -% -% \section{Interface} -% -% \section{options} +\bigskip + +\changes{v1.1.1}{2024/08/30}{add English documentation.} + +\title{ + \pkg{suanpan-l3} package for traditional Chinese 7-bids suanpan(abacus) + \rlap{\makebox[4cm][r]{ + \normalsize $\Longrightarrow$ \color{red} + \protect\hyperlink{zh}{中文版本} + \protect\hypertarget{en}{} + }} +} +\author{Nan Geng \texttt{<nangeng@nwafu.edu.cn>}} +\date{\today\qquad \vers} + +\maketitle + +\section{Introduction} + +\pkg{suanpan-l3} is a traditional Chinese 7-bids suanpan drawing package +utilizes \pkg{l3draw} and is developed with \pkg{Expl3}. It can +effectively manage both upper and lower bids, while also considering +bottom bid, top bid, and hanging bid. + +This package offers a unique environment for drawing suanpan, +denoted as \env{suanpan}. Within this environment, 7 specialized macros +are available for the creation of suanpan. The \tn{rod} macro is used +to lay out a single rod, while the \tn{rod*} macro draws a counting point +on this rod’s beam. The \tn{rods} macro is capable of laying out a set of rods. +The \tn{bid} macro colors the specified bid. The \tn{bids} macro colors +all inner bids that are near the beam, while the \tn{bids*} macro colors +all outer bids that are far from the beam. Lastly, the \tn{lrframe} macro +is used to lay out the left and right frames of an abacus. + +At the same time, the package offers customization options for suanpan, +including line width, draw color, fill color, bid space, rod space, etc. +These can be configured through package options, \env{suanpan} environment +options, or the \tn{suanpanset} macro. + +\begin{center} + \begin{suanpan}[framedraw = brown2, scale = 0.45, bidsep=1.5pt, + roddraw = brown3, rodfill = brown4] + % rod's val list + \rods{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20} + % counting point + \rod*{4}{3} + \rod*{18}{17} + % top bid + \bid{12}{9}{azure7} + \bid{13}{9}{azure7} + \bid{14}{9}{azure7} + \bid{15}{9}{azure7} + \bid{16}{9}{azure7} + % hanging bid + \bid{17}{11}{red8} + \bid{18}{11}{red8} + \bid{19}{11}{red8} + \bid{20}{11}{red8} + \bid{21}{11}{red8} + % bottom bid + \bid{11}{3}{olive7} + \bid{16}{3}{olive7} + \bid{21}{3}{olive7} + \lrframe{1}{21} + \end{suanpan} +\end{center} + +\section{Interface} + +\subsection{\env{suanpan} environment} + +\begin{function}{suanpan} + \begin{syntax} + \tn{begin}|{suanpan}|\oarg{options} + ..... + \tn{end}|{suanpan}| + \end{syntax} +\end{function} + + Typesetting 7-bids Chinese suanpan with \oarg{options}. + + Within the \env{suanpan} environment, \tn{rod}, \tn{rod*}, \tn{rods}, \tn{bid}, + \tn{bids}, \tn{bids*} and \tn{lrframe} 7 specialized macros + are available for the creation of suanpan. + + \oarg{options} is a key-value list for line width, draw color, fill color, + bid space, rod space, etc. + + \oarg{options} is environment's local setting. + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rod{1}{0} + \rod{2}{3} + \rod{3}{0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{\env{suanpan}'s specialized macros} + +\subsubsection{\tn{rod}---single rod} + +\begin{function}{\rod} + \begin{syntax} + \cs{rod} \marg{num} \marg{val} + \end{syntax} +\end{function} + + The \tn{rod} macro is used to lay out a single rod. + + The \marg{num} argument numbers the rods from left to right. + The \marg{val} is the number to be represented on the rod from + 0 to 20. For number within [0, 9], it is represented using 4 lower deck + bids and 1 upper deck bid. Numbers within [10, 15] are represented additionally + using bottom bid and top bid. For numbers within [16, 20], hanging bid is also + required for representation. + + The starred version \tn{rod*} will draw a counting point on this rod's beam. + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rod{1}{1} % normal rod + \rod{2}{6} + \rod*{3}{10} % counting point and + % bottom bid + \rod{4}{12} % top bid + \rod{5}{18} % hanging bid + \end{suanpan} +\end{SideBySideExample} + +\subsubsection{\tn{rods}---a set of rods} + +\begin{function}{\rods} + \begin{syntax} + \cs{rods} \marg{val list} + \end{syntax} +\end{function} + + The \tn{rods} macro is used to lay out a set of rods. + + The \marg{val list} is a value list of each rod seperated by commas. + Each rod number is automatically numbered from left to right. + + Each value in \marg{val list} is the number to be represented on the rod from + 0 to 20. For number within [0, 9], it is represented using 4 lower deck + bids and 1 upper deck bid. Numbers within [10, 15] are represented additionally + using bottom bid and top bid. For numbers within [16, 20], hanging bid is also + required for representation. + + \begin{noteen} + The starred version \tn{rods*} for counting point is not provided. + Use the \tn{rod*} macro to overlay the specified rod for drawing. + \end{noteen} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rods{0, 6, 12, 18, 0} + \rod*{3}{12} + \end{suanpan} +\end{SideBySideExample} + +\subsubsection{\tn{bid}---color bid} + +\begin{function}{\bid} + \begin{syntax} + \cs{bid} \marg{num}\marg{pos}\marg{color} + \end{syntax} +\end{function} + + The \tn{bid} macro fills the specified bid. + + The \marg{num} is the same as for \tn{rod}; the \marg{color} argument + defines the fill color and the \marg{pos} argument tells which bid has to + be colored in \marg{num} rod. + + This macro also blends \marg{color} by 40\% black to be used for bid + drawing color. + + The \marg{pos} in a rod is numbered from the bottom up in the order + $1, 2, \cdots, 11$. The lower deck bids occupies position + $1, 2, \cdots, 7$, the upper deck bids occupies position $8, 9, 10$, + and the hanging bead occupies position $11$ between $9$ and $10$ . + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rods{0, 0, 7, 11, 8, 19} + \bid{1}{1}{gray7} + \bid{2}{5}{gray7} + \bid{3}{6}{red8} + \bid{4}{7}{red8} + \bid{4}{8}{azure6} + \bid{4}{9}{yellow9} + \bid{5}{10}{violet5} + \bid{6}{11}{teal4} + \end{suanpan} +\end{SideBySideExample} + +\subsubsection{\tn{bids}---color inner/outer bids} + +\begin{function}{\bids} + \begin{syntax} + \cs{bids} \marg{num}\marg{val}\marg{color} + \end{syntax} +\end{function} + + The \tn{bids} macro fills all inner bids that are near the beam. + + \marg{num} and \marg{color} are the same as for \tn{bid}; + the \marg{val} argument is the same as for \tn{rod}. + + The \marg{color} is fill color for inner bids. it also blends + \marg{color} by 40\% black to be used for inner bids drawing color. + + The starred version \tn{bids*} is used to color outer bids of \marg{num} rod. + + \begin{noteen} + This macro can only select the inner bids or the outer bids for coloring, + you can't select both the inner and outer bids at the same time. + \end{noteen} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rods{0, 0, 7, 11, 8, 19} + \bids{3}{7}{teal4} + \bids*{5}{8}{azure6} + \end{suanpan} +\end{SideBySideExample} + +\subsubsection{\tn{lrframe}---left and right frame} + +\begin{function}{\lrframe} + \begin{syntax} + \cs{lrframe} \marg{first num}\marg{last num} + \end{syntax} +\end{function} + + The \tn{lrframe} macro is used to lay out the left and right frames of + a suanpan. + + The \marg{first num} argument tells which rod is the first rod and + the \marg{last num} argument tells which rod is the last rod. + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.48\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65} + \begin{suanpan} + \rods{0, 6, 12, 18, 0} + \lrframe{1}{5} + \end{suanpan} +\end{SideBySideExample} + +\subsection{\tn{suanpanset}} + +\begin{function}{\suanpanset} + \begin{syntax} + \cs{suanpanset} \marg{options} + \end{syntax} +\end{function} + + The \tn{suanpanset} macro offers customization options for suanpan, + including line width, draw color, fill color, bid space, rod space, etc. + + The \marg{options} is a key-value list. + + The \marg{options} seted by the \cs{suanpanset} are valid for + all subsequent \env{suanpan} environments. + +\section{options} + +The \pkg{suanpan-l3} package offers customization options for abacus, +including line width, draw color, fill color, bid space, rod space, etc. +These can be configured through package \oarg{options}, \env{suanpan} +environment \oarg{options}, or the \tn{suanpanset} macro. + +It is strongly recommended that suanpan options be set globally +for a document uniformly via \oarg{options} of packages to save compilation time. +Frequent use of \oarg{options} in \env{suanpan} environments or +use of the \tn{suanpanset} command to set suanpan options should be avoided. + +The \oarg{options} is a comma-seperated list of options in the form +\marg{key}|=|\marg{value}. The \marg{value} can be omitted for some options. +For the same option, subsequent settings will override the previous one. + +The \pkg{suanpan-l3} package uses \LaTeX3 style key settings, +supporting different types and levels of options. In the key list, +spaces around ``='' do not affect the settings. +However, it is important to note that blank lines are not allowed in the list. + +The ``|=true|'' in the \marg{option}|=true| for Boolean types can be omitted. + +\subsection{draft} + +\begin{option}{ opt = draft, desc = {= \meta{draft}}, init=false } + Draft mode. +\end{option} + +The \oarg{draft} option speeds up compilation by canceling + bids rounded corner effect. + + \begin{noteen} + Suanpan layout in draft mode may differ from the desired layout. + \end{noteen} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.53\linewidth,gobble=2] + % \usepackage[draft]{suanpan} + \centering + \suanpanset{scale = 0.65} + \begin{suanpan}[draft] + \rods{0, 6, 12, 18, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{line width} + +\begin{option}{ opt = linewd, desc = {= \meta{linewd}}, init=2pt } + Drawing line width. +\end{option} + + The \oarg{linewd} is used to set the line width of the frame inner, + and will also set the line width the frame outer to 7.00 times linewd, + and the rod and bid line widths to 1.00 times linewd. + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.40\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, linewd = 3pt} + \begin{suanpan} + \rods{0, 6, 12, 18, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{rod spacing} + +\begin{option}{ opt = rodsep, desc = {= \meta{rodsep}}, init=3.0pt } + The spacing between suanpan rods. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.40\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, rodsep = 15pt} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + + \begin{noteen} + The \oarg{rodsep} will change the width of the suanpan. + \end{noteen} + +\subsection{bid spacing} + +\begin{option}{ opt = bidsep, desc = {= \meta{bidsep}}, init=1.8pt } + The spacing between suanpan bids. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.40\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, bidsep = 4pt} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + + \begin{noteen} + The \oarg{bidsep} does not change the size of the suanpan. + But the height of each bid will be changed. + In addition, too small an bid height will cause distortion + of the rounded corners of the bid. + \end{noteen} + +\subsection{scale} + +\begin{option}{ opt = scale, desc = {= \meta{scale}}, init=1.0 } + Scaling factor of whole suanpan. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.40\linewidth,gobble=2] + \centering + \suanpanset{scale = 1.20} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{frame color} + +\begin{option}{ opt = framedraw, desc = {= \meta{framedraw}}, init=black } + Frame drawing color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, framedraw = brown3} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + + \begin{noteen} + Frame colors include inner and outer of frame and beam colors. + \end{noteen} + +\subsection{rod drawing color} + +\begin{option}{ opt = roddraw, desc = {= \meta{roddraw}}, init=black } + Rod drawing color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, roddraw = brown4} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{rod filling color} + +\begin{option}{ opt = rodfill, desc = {= \meta{rodfill}}, init=white } + Rod filling color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, rodfill = brown6} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{outer bids drawing color} + +\begin{option}{ opt = outerdraw, desc = {= \meta{outerdraw}}, init=black } + The outer bids\footnote{The outer bid is that is not counted away from the beam.}drawing color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, outerdraw = yellow4} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{outer bids filling color} + +\begin{option}{ opt = outerfill, desc = {= \meta{outerfill}}, init=white } + The outer bids filling color。 +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, outerfill = yellow9} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{inner bids drawing color} + +\begin{option}{ opt = innerdraw, desc = {= \meta{innerdraw}}, init=black } + The inner bids\footnote{The inner bid is that is counted near to the beam.}drawing color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, innerdraw = red8} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} + +\subsection{inner bids filling color} + +\begin{option}{ opt = innerfill, desc = {= \meta{innerfill}}, init=black} + The inner bids filling color. +\end{option} + +\begin{SideBySideExample}[frame=single,numbers=left,% + xrightmargin=.37\linewidth,gobble=2] + \centering + \suanpanset{scale = 0.65, innerfill = red9} + \begin{suanpan} + \rods{0, 6, 0} + \end{suanpan} +\end{SideBySideExample} \end{documentation} |