summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-01-25 03:00:57 +0000
committerNorbert Preining <norbert@preining.info>2024-01-25 03:00:57 +0000
commit768d5db2700eb846ed6616dc4839993f193b22cd (patch)
treec06578df8e40e137d12018e0a4ba053466c86ca1 /macros/latex
parent30e494c68ef358eeb09d53920dd0658dc9238f51 (diff)
CTAN sync 202401250300
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/CHANGELOG.md51
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/LICENSE427
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/README.md60
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamercolorthememoloch.dtx212
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamerfontthememoloch.dtx61
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamerinnerthememoloch.dtx513
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamerouterthememoloch.dtx198
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.dtx108
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.ins29
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdfbin0 -> 263101 bytes
-rw-r--r--macros/latex/contrib/beamer-contrib/themes/moloch/moloch.tex425
-rw-r--r--macros/latex/contrib/genealogy-profiles/README.md13
-rw-r--r--macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.pdfbin0 -> 132492 bytes
-rw-r--r--macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.preamble.sty87
-rw-r--r--macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.tex601
-rw-r--r--macros/latex/contrib/genealogy-profiles/latex/genealogy-profiles.sty848
-rw-r--r--macros/latex/contrib/hvlogos/Changes1
-rw-r--r--macros/latex/contrib/hvlogos/doc/hvlogos-doc.pdfbin86730 -> 86714 bytes
-rw-r--r--macros/latex/contrib/hvlogos/latex/hvlogos.sty33
19 files changed, 3652 insertions, 15 deletions
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/CHANGELOG.md b/macros/latex/contrib/beamer-contrib/themes/moloch/CHANGELOG.md
new file mode 100644
index 0000000000..8064aee6b3
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/CHANGELOG.md
@@ -0,0 +1,51 @@
+# Changelog
+
+## 0.1.0 (2024-01-15)
+
+
+### ⚠ BREAKING CHANGES
+
+* remove \plain macro
+* drop deprecated options
+* remove appendix redefinition
+* remove pgfplots theme
+* remove high-contrast theme
+* uncouple fira fonts from theme
+* simplify blocks and remove blocks with background
+
+### Features
+
+* disable hyphenation in frame titles ([253234e](https://github.com/jolars/moloch/commit/253234e7b262d98e216dfadffddf29023f7af06f))
+* drop deprecated options ([548ede8](https://github.com/jolars/moloch/commit/548ede8413f1f0d5d2b762de9798f44351b2f81b))
+* group institute with author and subdue color ([0f3f6da](https://github.com/jolars/moloch/commit/0f3f6da5733f151368d181243d74055920074fc0))
+* increase minipage width for section pages ([160fe58](https://github.com/jolars/moloch/commit/160fe5854e87151f7b74faf29daf9969a1ef8328))
+* modify bullet symbols for itemize lists ([0042dcb](https://github.com/jolars/moloch/commit/0042dcb8b7caa4b4b277aaa779fd2fe62f8f2ec4))
+* modify example color to teal instead of light green ([1a2f157](https://github.com/jolars/moloch/commit/1a2f1573dc588c8e93ba6572c109620edde2d3c8))
+* remove \plain macro ([95f24ae](https://github.com/jolars/moloch/commit/95f24ae73ac72d9501de0760e48bbc0cacce797f))
+* remove appendix redefinition ([17edfad](https://github.com/jolars/moloch/commit/17edfad5975192df7561e6404bff14ba40726d2b))
+* remove high-contrast theme ([9932e55](https://github.com/jolars/moloch/commit/9932e55efcb3ed56e402301c8aec7a3583915dd9))
+* remove pgfplots theme ([c2f1bef](https://github.com/jolars/moloch/commit/c2f1bef3cc7b2a4c48bf2e4f3e7c0c857a54c6fa))
+* simplify blocks and remove blocks with background ([d5317d4](https://github.com/jolars/moloch/commit/d5317d4d05c06ac85f4cbaa7e4a17f493bc6cc32))
+* uncouple fira fonts from theme ([f960aba](https://github.com/jolars/moloch/commit/f960aba4ee56aabad24ab232a71e6673e00dc0db))
+
+
+### Bug Fixes
+
+* avoid overflow warnings from titlepage definition ([c1c5b85](https://github.com/jolars/moloch/commit/c1c5b85c301e0cd54213e15de8d5c606d0336059))
+* fix frametitle patchmd ([a302893](https://github.com/jolars/moloch/commit/a30289334007b497b24a111896cc68bcc08fbd42))
+* fix progress bar in inner theme too ([47dcf8d](https://github.com/jolars/moloch/commit/47dcf8df1ab26024e63e1f60ea59fd83a2210a2c))
+* fix reference to Knuth in demo ([fbfcc0b](https://github.com/jolars/moloch/commit/fbfcc0b7ad78bd3628b8f98b15f32a57aaf32d38))
+* insert missing parenthesis ([e72eaa9](https://github.com/jolars/moloch/commit/e72eaa9af24cdb1646e1785247c6579321cf6ad5))
+* metropolis -&gt; moloch ([24cbc04](https://github.com/jolars/moloch/commit/24cbc0497a95e2a91f81fb996a0453dfb4bcdff0))
+* set maxium progressbar to 1 ([b401410](https://github.com/jolars/moloch/commit/b4014101fec3c12a5f5960817f97234511ac1aa5))
+
+
+### Reverts
+
+* "build: use alternative texlive action" ([5d32f73](https://github.com/jolars/moloch/commit/5d32f73e69a178665b3bc059e8973bc394eb3a4f))
+* "fix: avoid overflow warnings from titlepage definition" ([24c5409](https://github.com/jolars/moloch/commit/24c540998b637bd80f4318d3df603329bcade81f))
+
+
+### Miscellaneous Chores
+
+* remove newline ([cd97b2d](https://github.com/jolars/moloch/commit/cd97b2dcb6758f674ce173ff4c45e080d37b5374))
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/LICENSE b/macros/latex/contrib/beamer-contrib/themes/moloch/LICENSE
new file mode 100644
index 0000000000..795087c264
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/LICENSE
@@ -0,0 +1,427 @@
+Attribution-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-ShareAlike 4.0 International Public
+License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-ShareAlike 4.0 International Public License ("Public
+License"). To the extent this Public License may be interpreted as a
+contract, You are granted the Licensed Rights in consideration of Your
+acceptance of these terms and conditions, and the Licensor grants You
+such rights in consideration of benefits the Licensor receives from
+making the Licensed Material available under these terms and
+conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. BY-SA Compatible License means a license listed at
+ creativecommons.org/compatiblelicenses, approved by Creative
+ Commons as essentially the equivalent of this Public License.
+
+ d. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ e. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ f. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ g. License Elements means the license attributes listed in the name
+ of a Creative Commons Public License. The License Elements of this
+ Public License are Attribution and ShareAlike.
+
+ h. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ i. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ j. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ k. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ l. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ m. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. Additional offer from the Licensor -- Adapted Material.
+ Every recipient of Adapted Material from You
+ automatically receives an offer from the Licensor to
+ exercise the Licensed Rights in the Adapted Material
+ under the conditions of the Adapter's License You apply.
+
+ c. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ b. ShareAlike.
+
+ In addition to the conditions in Section 3(a), if You Share
+ Adapted Material You produce, the following conditions also apply.
+
+ 1. The Adapter's License You apply must be a Creative Commons
+ license with the same License Elements, this version or
+ later, or a BY-SA Compatible License.
+
+ 2. You must include the text of, or the URI or hyperlink to, the
+ Adapter's License You apply. You may satisfy this condition
+ in any reasonable manner based on the medium, means, and
+ context in which You Share Adapted Material.
+
+ 3. You may not offer or impose any additional or different terms
+ or conditions on, or apply any Effective Technological
+ Measures to, Adapted Material that restrict exercise of the
+ rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material,
+ including for purposes of Section 3(b); and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public licenses.
+Notwithstanding, Creative Commons may elect to apply one of its public
+licenses to material it publishes and in those instances will be
+considered the “Licensor.” The text of the Creative Commons public
+licenses is dedicated to the public domain under the CC0 Public Domain
+Dedication. Except for the limited purpose of indicating that material
+is shared under a Creative Commons public license or as otherwise
+permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the public
+licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/README.md b/macros/latex/contrib/beamer-contrib/themes/moloch/README.md
new file mode 100644
index 0000000000..e5e0b235f2
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/README.md
@@ -0,0 +1,60 @@
+## Moloch
+
+[![CI](https://github.com/jolars/moloch/actions/workflows/ci.yml/badge.svg)](https://github.com/jolars/moloch/actions/workflows/ci.yml)
+
+Moloch is a simple Beamer theme suitable for anyone to use. It is
+a fork of the [Metropolis Theme](https://github.com/matze/mtheme).
+
+The fork was created for the following reasons:
+
+- To fix some outstanding issues that had not been addressed for a long time.
+- To remove some of the more opinionated design choices, such as special handling of the Fira family of fonts.
+- To strip away some features that added complexity to the code base without achieving valuable functionality for the majority of users, such as special code block designs and the pgfplots theme.
+
+Do not expect this theme to be backwards compatible with the Metropolis theme.
+
+## Installation
+
+A CTAN release is planned, but for now you can install the theme manually from source. You need a working LaTeX installation with `l3build` installed. Then just follow these steps:
+
+1. Clone the repository: `git clone https://github.com/jolars/moloch.git`
+2. Install the package: `l3build install`
+
+## Usage
+
+The following code shows a minimal example of a Beamer presentation using
+Moloch.
+
+```latex
+\documentclass{beamer}
+\usetheme{moloch}
+\title{A minimal example}
+\date{\today}
+\author{Johan Larsson}
+\institute{Centre for Modern Beamer Themes}
+\begin{document}
+ \maketitle
+ \section{First Section}
+ \begin{frame}{First Frame}
+ Hello, world!
+ \end{frame}
+\end{document}
+```
+
+## License
+
+The theme itself is licensed under a [Creative Commons Attribution-ShareAlike
+4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). This
+means that if you change the theme and re-distribute it, you _must_ retain the
+copyright notice header and license it under the same CC-BY-SA license. This
+does not affect the presentation that you create with the theme.
+
+## Contributing
+
+Contributions are welcome, but we are generally not interested in changes that can be easily added through the standard Beamer interface.
+
+Also, when writing commit messages, please use the [conventional commits format](https://www.conventionalcommits.org/en/v1.0.0/).
+
+## Versioning
+
+The project uses [semantic versioning](https://semver.org).
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamercolorthememoloch.dtx b/macros/latex/contrib/beamer-contrib/themes/moloch/beamercolorthememoloch.dtx
new file mode 100644
index 0000000000..c6a41c2f18
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamercolorthememoloch.dtx
@@ -0,0 +1,212 @@
+% \iffalse meta-comment -------------------------------------------------------
+% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+% contributors can be found at
+%
+% https://github.com/matze/mtheme/graphs/contributors
+%
+% and the original template was based on the HSRM theme by Benjamin Weiss.
+%
+% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson and contributors
+% ------------------------------------------------------------------------- \fi
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamercolorthememoloch}[2024-01-15 v0.1.0 Moloch color theme] % x-release-please-version
+%</package>
+% \fi
+% \CheckSum{0}
+% \StopEventually{}
+% \iffalse
+%<*package>
+% ------------------------------------------------------------------------- \fi
+%
+% \subsection{\themename color theme}
+%
+%
+%
+% \subsubsection{Package dependencies}
+% \begin{macrocode}
+\RequirePackage{pgfopts}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Options}
+%
+%
+% \begin{macro}{colors}
+% Provides the option to have a dark background and light foreground instead
+% of the reverse.
+% \begin{macrocode}
+\pgfkeys{
+ /moloch/color/background/.cd,
+ .is choice,
+ dark/.code=\moloch@colors@dark,
+ light/.code=\moloch@colors@light,
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\moloch@color@setdefaults}
+% Sets default values for color theme options.
+% \begin{macrocode}
+\newcommand{\moloch@color@setdefaults}{
+ \pgfkeys{/moloch/color/.cd,
+ background=light,
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Base colors}
+%
+% \begin{macrocode}
+\definecolor{mDarkBrown}{HTML}{604c38}
+\definecolor{mDarkTeal}{HTML}{23373b}
+\definecolor{mLightBrown}{HTML}{EB811B}
+\definecolor{mLightGreen}{RGB}{0,128,128}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Base styles}
+%
+% All colors in \themename are derived from the definitions of |normal text|,
+% |alerted text|, and |example text|.
+%
+% \begin{macrocode}
+\newcommand{\moloch@colors@dark}{
+ \setbeamercolor{normal text}{%
+ fg=black!2,
+ bg=mDarkTeal
+ }
+ \usebeamercolor[fg]{normal text}
+}
+\newcommand{\moloch@colors@light}{
+ \setbeamercolor{normal text}{%
+ fg=mDarkTeal,
+ bg=black!2
+ }
+}
+\setbeamercolor{alerted text}{%
+ fg=mLightBrown
+}
+\setbeamercolor{example text}{%
+ fg=mLightGreen
+}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Derived colors}
+%
+% The titles and structural elements (e.g. |itemize| bullets) are set in the
+% same color as |normal text|. This would ideally done by setting |normal text|
+% as a parent style, which we do to set |titlelike|, but this doesn't work for
+% |structure| as its foreground is set explicitly in
+% |beamercolorthemedefault.sty|.
+%
+% \begin{macrocode}
+\setbeamercolor{titlelike}{use=normal text, parent=normal text}
+\setbeamercolor{author}{use=normal text, parent=normal text}
+\setbeamercolor{date}{use=normal text, parent=normal text}
+\setbeamercolor{institute}{use=normal text, fg=normal text.fg!80!normal text.bg}
+\setbeamercolor{structure}{use=normal text, fg=normal text.fg}
+% \end{macrocode}
+%
+% The “primary” palette should be used for the most important navigational
+% elements, and possibly of other elements. \themename uses it for frame
+% titles and slides.
+%
+% \begin{macrocode}
+\setbeamercolor{palette primary}{%
+ use=normal text,
+ fg=normal text.bg,
+ bg=normal text.fg
+}
+\setbeamercolor{frametitle}{%
+ use=palette primary,
+ parent=palette primary
+}
+% \end{macrocode}
+%
+% The \themename inner or outer themes optionally display progress
+% bars in various locations. Their color is set by |progress bar| but the two
+% different kinds can be customized separately. The horizontal rule on the
+% title page is also set based on the progress bar color and can be customized
+% with |title separator|.
+%
+% \begin{macrocode}
+\setbeamercolor{progress bar}{%
+ use=alerted text,
+ fg=alerted text.fg,
+ bg=alerted text.fg!50!black!30
+}
+\setbeamercolor{title separator}{
+ use=progress bar,
+ parent=progress bar
+}
+\setbeamercolor{progress bar in head/foot}{%
+ use=progress bar,
+ parent=progress bar
+}
+\setbeamercolor{progress bar in section page}{
+ use=progress bar,
+ parent=progress bar
+}
+% \end{macrocode}
+%
+% Block environments use alerted tex and example text for the title
+%
+% \begin{macrocode}
+\setbeamercolor{block title alerted}{%
+ use={block title, alerted text},
+ fg=alerted text.fg
+}
+\setbeamercolor{block title example}{%
+ use={block title, example text},
+ fg=example text.fg
+}
+% \end{macrocode}
+%
+% Footnotes
+%
+% \begin{macrocode}
+\setbeamercolor{footnote}{fg=normal text.fg!90}
+\setbeamercolor{footnote mark}{fg=.}
+% \end{macrocode}
+%
+% We also reset the bibliography colors in order to pick up the surrounding
+% colors at the time of use. This prevents us having to set the correct color in
+% normal and standout mode.
+%
+% \begin{macrocode}
+\setbeamercolor{bibliography entry author}{fg=, bg=}
+\setbeamercolor{bibliography entry title}{fg=, bg=}
+\setbeamercolor{bibliography entry location}{fg=, bg=}
+\setbeamercolor{bibliography entry note}{fg=, bg=}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Process package options}
+%
+% \begin{macrocode}
+\moloch@color@setdefaults
+\ProcessPgfPackageOptions{/moloch/color}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\mode<all>
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamerfontthememoloch.dtx b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerfontthememoloch.dtx
new file mode 100644
index 0000000000..7b02600a14
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerfontthememoloch.dtx
@@ -0,0 +1,61 @@
+% \iffalse meta-comment -------------------------------------------------------
+% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+% contributors can be found at
+%
+% https://github.com/matze/mtheme/graphs/contributors
+%
+% and the original template was based on the HSRM theme by Benjamin Weiss.
+%
+% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson and contributors
+% ------------------------------------------------------------------------- \fi
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerfontthememoloch}[2024-01-15 v0.1.0 Moloch font theme] % x-release-please-version
+%</package>
+% \fi
+% \CheckSum{0}
+% \StopEventually{}
+% \iffalse
+%<*package>
+% ------------------------------------------------------------------------- \fi
+%
+% \subsection{\themename font theme}
+%
+% A |beamer| font theme sets the style of the font used in the document.
+%
+% \subsubsection{Package dependencies}
+%
+% \begin{macrocode}
+\RequirePackage{pgfopts}
+% \end{macrocode}
+%
+% \subsubsection{General font definitions}
+%
+% \begin{macrocode}
+\setbeamerfont{title}{size=\Large, series=\bfseries}
+\setbeamerfont{author}{size=\small}
+\setbeamerfont{date}{size=\small}
+\setbeamerfont{section title}{size=\Large, series=\bfseries}
+\setbeamerfont{block title}{size=\normalsize, series=\bfseries}
+\setbeamerfont{block title alerted}{size=\normalsize, series=\bfseries}
+\setbeamerfont*{subtitle}{size=\large}
+\setbeamerfont{frametitle}{size=\large, series=\bfseries}
+\setbeamerfont{caption}{size=\small}
+\setbeamerfont{caption name}{series=\bfseries}
+\setbeamerfont{description item}{series=\bfseries}
+\setbeamerfont{bibliography entry author}{size=\normalsize, series=\normalfont}
+\setbeamerfont{bibliography entry title}{size=\normalsize, series=\bfseries}
+\setbeamerfont{bibliography entry location}{size=\normalsize, series=\normalfont}
+\setbeamerfont{bibliography entry note}{size=\small, series=\normalfont}
+\setbeamerfont{standout}{size=\Large, series=\bfseries}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamerinnerthememoloch.dtx b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerinnerthememoloch.dtx
new file mode 100644
index 0000000000..8ab2b31185
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerinnerthememoloch.dtx
@@ -0,0 +1,513 @@
+% \iffalse meta-comment -------------------------------------------------------
+% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+% contributors can be found at
+%
+% https://github.com/matze/mtheme/graphs/contributors
+%
+% and the original template was based on the HSRM theme by Benjamin Weiss.
+%
+% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson and contributors
+% ------------------------------------------------------------------------- \fi
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerinnerthememoloch}[2024-01-15 v0.1.0 Moloch inner theme] % x-release-please-version
+%</package>
+% \fi
+% \CheckSum{0}
+% \StopEventually{}
+% \iffalse
+%<*package>
+% ------------------------------------------------------------------------- \fi
+%
+% \subsection{\themename inner theme}
+%
+% A |beamer| inner theme dictates the style of the frame elements traditionally
+% set in the ``body'' of each slide. These include:
+%
+% \begin{itemize}
+% \item title, part, and section pages;
+% \item itemize, enumerate, and description environments;
+% \item block environments including theorems and proofs;
+% \item figures and tables; and
+% \item footnotes and plain text.
+% \end{itemize}
+%
+%
+%
+% \subsubsection{Package dependencies}
+%
+% \begin{macrocode}
+\RequirePackage{keyval}
+\RequirePackage{calc}
+\RequirePackage{pgfopts}
+\RequirePackage{tikz}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Options}
+%
+% \begin{macro}{sectionpage}
+% Optionally add a slide marking the beginning of each section.
+% \begin{macrocode}
+\pgfkeys{
+ /moloch/inner/sectionpage/.cd,
+ .is choice,
+ none/.code=\moloch@disablesectionpage,
+ simple/.code={%
+ \moloch@enablesectionpage%
+ \setbeamertemplate{section page}[simple]%
+ },
+ progressbar/.code={%
+ \moloch@enablesectionpage%
+ \setbeamertemplate{section page}[progressbar]%
+ },
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{subsectionpage}
+% Optionally add a slide marking the beginning of each subsection.
+% \begin{macrocode}
+\pgfkeys{
+ /moloch/inner/subsectionpage/.cd,
+ .is choice,
+ none/.code=\moloch@disablesubsectionpage,
+ simple/.code={%
+ \moloch@enablesubsectionpage%
+ \setbeamertemplate{section page}[simple]%
+ },
+ progressbar/.code={%
+ \moloch@enablesubsectionpage%
+ \setbeamertemplate{section page}[progressbar]%
+ },
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\moloch@inner@setdefaults}
+% Set default values for inner theme options.
+% \begin{macrocode}
+\newcommand{\moloch@inner@setdefaults}{
+ \pgfkeys{/moloch/inner/.cd,
+ sectionpage=progressbar,
+ subsectionpage=none
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Title page}
+%
+% \begin{macro}{title page}
+% Template for the title page. Each element is only typset if it is defined
+% by the user. If |\subtitle| is empty, for example, it won't leave a blank
+% space on the title slide.
+% \begin{macrocode}
+\setbeamertemplate{title page}{
+ \begin{minipage}[b][\paperheight]{\textwidth}
+ \ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi
+ \vfill%
+ \ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
+ \ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
+ \usebeamertemplate*{title separator}
+ % \end{macrocode}
+ %
+ % Beamer's definition of |\insertauthor| is always nonempty, so we have
+ % to test another macro initialized by |\author{...}| to see if the user has
+ % defined an author. This solution was suggested by Enrico Gregorio in an
+ % answer to \href{https://tex.stackexchange.com/questions/241306/}{this
+ % Stack Exchange question}.
+ %
+ % \begin{macrocode}
+ \ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
+ \ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
+ \ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
+ \vfill
+ \null
+ \end{minipage}
+}
+% \end{macrocode}
+% \end{macro}%
+%
+% Normal people should use |\maketitle| or |\titlepage| instead of using the
+% |title page| beamer template directly. Beamer already defines these macros,
+% but we patch them here to make the title page |[plain]| by default, remove
+% |\@thanks|, and ensure the title frame number doesn't count.
+%
+% \begin{macro}{\maketitle}
+% \begin{macro}{\titlepage}
+%
+% Inserts the title frame, or causes the current frame to use the
+% |title page| template.
+%
+% \begin{macrocode}
+\def\maketitle{%
+ \ifbeamer@inframe
+ \titlepage
+ \else
+ \frame[plain,noframenumbering]{\titlepage}
+ \fi
+}
+\def\titlepage{%
+ \usebeamertemplate{title page}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{title graphic}
+% Set the title graphic in a zero-height box, so it doesn't change the
+% position of other elements.
+% \begin{macrocode}
+\setbeamertemplate{title graphic}{
+ \vbox to 0pt {
+ \vspace*{2em}
+ \inserttitlegraphic%
+ }%
+ \nointerlineskip%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{title}
+% Set the title on the title page.
+% \begin{macrocode}
+\setbeamertemplate{title}{
+ \raggedright%
+ \linespread{1.0}%
+ \inserttitle%
+ \par%
+ \vspace*{0.5em}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{subtitle}
+% Set the subtitle on the title page.
+% \begin{macrocode}
+\setbeamertemplate{subtitle}{
+ \raggedright%
+ \insertsubtitle%
+ \par%
+ \vspace*{0.5em}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{title separator}
+% Template to set the title graphic in a zero-height box. (It won't
+% change the position of other elements.)
+% \begin{macrocode}
+\newlength{\moloch@titleseparator@linewidth}
+\setlength{\moloch@titleseparator@linewidth}{0.4pt}
+\setbeamertemplate{title separator}{
+ \tikzexternaldisable%
+ \begin{tikzpicture}
+ \fill[fg] (0,0) rectangle (\textwidth, \moloch@titleseparator@linewidth);
+ \end{tikzpicture}%
+ \tikzexternalenable%
+ \par%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{author}
+% Set the author on the title page.
+% \begin{macrocode}
+\setbeamertemplate{author}{
+ \vspace*{2em}
+ \insertauthor%
+ \par%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{institute}
+% Set the institute on the title page.
+% \begin{macrocode}
+\setbeamertemplate{institute}{
+ \vspace*{0.5em}
+ \insertinstitute%
+ \par%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{date}
+% Set the date on the title page.
+% \begin{macrocode}
+\setbeamertemplate{date}{
+ \vspace*{1.5em}
+ \insertdate%
+ \par%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Section page}
+%
+% \begin{macro}{section page}
+%
+% Template for the section title slide at the beginning of each section.
+%
+% \begin{macrocode}
+\defbeamertemplate{section page}{simple}{
+ \begin{center}
+ \usebeamercolor[fg]{section title}
+ \usebeamerfont{section title}
+ \insertsectionhead\par
+ \ifx\insertsubsectionhead\@empty\else
+ \usebeamercolor[fg]{subsection title}
+ \usebeamerfont{subsection title}
+ \insertsubsectionhead
+ \fi
+ \end{center}
+}
+\defbeamertemplate{section page}{progressbar}{
+ \centering
+ \begin{minipage}{0.7875\linewidth}
+ \raggedright
+ \usebeamercolor[fg]{section title}
+ \usebeamerfont{section title}
+ \insertsectionhead\\[-1ex]
+ \usebeamertemplate*{progress bar in section page}
+ \par
+ \ifx\insertsubsectionhead\@empty\else%
+ \usebeamercolor[fg]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \insertsubsectionhead
+ \fi
+ \end{minipage}
+ \par
+ \vspace{\baselineskip}
+}
+\newcommand{\moloch@disablesectionpage}{
+ \AtBeginSection{
+ % intentionally empty
+ }
+}
+\newcommand{\moloch@enablesectionpage}{
+ \AtBeginSection{
+ \ifbeamer@inframe
+ \sectionpage
+ \else
+ \frame[plain,c,noframenumbering]{\sectionpage}
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{subsection page}
+%
+% Template for the subsection title slide that can optionally be added to
+% at the beginning of each subsection.
+%
+% \begin{macrocode}
+\setbeamertemplate{subsection page}{%
+ \usebeamertemplate*{section page}
+}
+\newcommand{\moloch@disablesubsectionpage}{
+ \AtBeginSubsection{
+ % intentionally empty
+ }
+}
+\newcommand{\moloch@enablesubsectionpage}{
+ \AtBeginSubsection{
+ \ifbeamer@inframe
+ \subsectionpage
+ \else
+ \frame[plain,c,noframenumbering]{\subsectionpage}
+ \fi
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{progress bar in section page}
+%
+% Template for the progress bar displayed by default on the section page.
+% This code is duplicated in large part in the outer theme's template
+% |progress bar in head/foot|.
+%
+% \begin{macrocode}
+\newlength{\moloch@progressonsectionpage}
+\newlength{\moloch@progressonsectionpage@linewidth}
+\setlength{\moloch@progressonsectionpage@linewidth}{0.4pt}
+\setbeamertemplate{progress bar in section page}{
+ \pgfmathsetlength{\moloch@progressonsectionpage}{
+ \textwidth * min(1,\insertframenumber/\inserttotalframenumber)
+ }
+ \tikzexternaldisable
+ \begin{tikzpicture}
+ \fill[bg]
+ (0,0)
+ rectangle
+ (\textwidth, \moloch@progressonsectionpage@linewidth);
+ \fill[fg]
+ (0,0)
+ rectangle
+ (\moloch@progressonsectionpage, \moloch@progressonsectionpage@linewidth);
+ \end{tikzpicture}
+ \tikzexternalenable
+}
+% \end{macrocode}
+%
+% The above code assumes that |\insertframenumber| is less than or equal to
+% |\inserttotalframenumber|. However, this is not true on the first compile;
+% in the absence of an |.aux| file, |\inserttotalframenumber| defaults to 1.
+% This behaviour could cause fatal errors for long presentations, as
+% |\moloch@progressonsectionpage| would exceed \TeX's maximum length
+% (16383.99999pt, roughly 5.75 metres or 18.9 feet).
+% To avoid this, we increase the default value for |\inserttotalframenumber|;
+% presentations with over 4000 slides will still break on first compile, but
+% users in that situation likely have deeper problems to solve.
+%
+% \begin{macrocode}
+\def\inserttotalframenumber{100}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Lists and floats}
+%
+% \begin{macrocode}
+\setbeamertemplate{itemize item}{\(\bullet\)}
+\setbeamertemplate{itemize subitem}{\(\circ\)}
+\setbeamertemplate{itemize subsubitem}{\textbullet}
+\setbeamertemplate{caption label separator}{: }
+\setbeamertemplate{caption}[numbered]
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Footnotes}
+% \begin{macrocode}
+\setbeamertemplate{footnote}{%
+ \parindent 0em\noindent%
+ \raggedright
+ \usebeamercolor{footnote}%
+ \hbox to 0.8em{\hfil\insertfootnotemark}%
+ \insertfootnotetext\par%
+}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Text and spacing settings}
+%
+% \begin{macrocode}
+\newlength{\moloch@parskip}
+\setlength{\moloch@parskip}{0.5em}
+\setlength{\parskip}{\moloch@parskip}
+\linespread{1.15}
+% \end{macrocode}
+%
+% By default, Beamer frames offer the |c| option to \textit{almost} vertically
+% center the text, but the placement is a little too high. To fix this, we
+% redefine the |c| option to equalize |\beamer@frametopskip| and
+% |\beamer@framebottomskip|. This solution was suggested by Enrico Gregorio in
+% an answer to \href{http://tex.stackexchange.com/questions/247826/}{this
+% Stack Exchange question}.
+%
+% \begin{macrocode}
+\define@key{beamerframe}{c}[true]{% centered
+ \beamer@frametopskip=0pt plus 1fill\relax%
+ \beamer@framebottomskip=0pt plus 1fill\relax%
+ \beamer@frametopskipautobreak=0pt plus .4\paperheight\relax%
+ \beamer@framebottomskipautobreak=0pt plus .6\paperheight\relax%
+ \def\beamer@initfirstlineunskip{}%
+}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Standout frames}
+%
+% \themename offers a custom frame format with large, centered text and an
+% inverted background. To use it, add the key |standout| to the frame:
+%
+% |\begin{frame}[standout] ... \end{frame}|.
+%
+% \begin{macro}{standout}
+%
+% Optional arguments to Beamer's frames are implemented using
+% |\define@key| from the |keyval| package, which will execute code when the
+% defined option is called. For the |standout| option, we begin a group,
+% change the colors and set frame options.
+%
+% \begin{macrocode}
+\providebool{moloch@standout}
+\define@key{beamerframe}{standout}[true]{%
+ \booltrue{moloch@standout}
+ \begingroup
+ \setkeys{beamerframe}{c}
+ \setkeys{beamerframe}{noframenumbering}
+ \ifbeamercolorempty[bg]{palette primary}{
+ \setbeamercolor{background canvas}{
+ use=palette primary,
+ bg=-palette primary.fg
+ }
+ }{
+ \setbeamercolor{background canvas}{
+ use=palette primary,
+ bg=palette primary.bg
+ }
+ }
+ \setbeamercolor{local structure}{
+ fg=palette primary.fg
+ }
+ \usebeamercolor[fg]{palette primary}
+}
+% \end{macrocode}
+%
+% Then we just have to close the group after the standout slide is finished
+% in order to restore the colours and fonts for the rest of the
+% presentation. Unfortunately, we cannot use \AfterEndEnvironment{frame} for
+% this (see \url{http://tex.stackexchange.com/questions/226319/}).
+% Instead, we prepend the |\endgroup| to |\beamer@reseteecodes|, which is run
+% exactly once at the end of each slide.
+%
+% \begin{macrocode}
+\pretocmd{\beamer@reseteecodes}{%
+ \ifbool{moloch@standout}{
+ \endgroup
+ \boolfalse{moloch@standout}
+ }{}
+}{}{}
+% \end{macrocode}
+%
+% We set the fonts and the \centering alignment on the inner content,
+% in such a way that the speaker's note layout isn't affected by the custom
+% formatting.
+%
+% \begin{macrocode}
+\AtBeginEnvironment{beamer@frameslide}{
+ \ifbool{moloch@standout}{
+ \centering
+ \usebeamerfont{standout}
+ }{}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Process package options}
+%
+% \begin{macrocode}
+\moloch@inner@setdefaults
+\ProcessPgfPackageOptions{/moloch/inner}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamerouterthememoloch.dtx b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerouterthememoloch.dtx
new file mode 100644
index 0000000000..a684e47743
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerouterthememoloch.dtx
@@ -0,0 +1,198 @@
+% \iffalse meta-comment -------------------------------------------------------
+% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+% contributors can be found at
+%
+% https://github.com/matze/mtheme/graphs/contributors
+%
+% and the original template was based on the HSRM theme by Benjamin Weiss.
+%
+% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson and contributors
+% ------------------------------------------------------------------------- \fi
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerouterthememoloch}[2024-01-15 v0.1.0 Moloch outer theme] % x-release-please-version
+%</package>
+% \fi
+% \CheckSum{0}
+% \StopEventually{}
+% \iffalse
+%<*package>
+% ------------------------------------------------------------------------- \fi
+%
+% \subsection{\themename outer theme}
+%
+% A |beamer| outer theme dictates the style of the frame elements traditionally
+% set outside the body of each slide: the head, footline, and frame title.
+%
+%
+%
+% \subsubsection{Package dependencies}
+%
+% \begin{macrocode}
+\RequirePackage{calc}
+\RequirePackage{pgfopts}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Options}
+%
+% \begin{macro}{progressbar}
+% Adds a progress bar to the top, bottom, or frametitle of each slide.
+% \begin{macrocode}
+\pgfkeys{
+ /moloch/outer/progressbar/.cd,
+ .is choice,
+ none/.code={%
+ \setbeamertemplate{headline}[plain]
+ \setbeamertemplate{frametitle}[plain]
+ \setbeamertemplate{footline}[plain]
+ },
+ head/.code={\pgfkeys{/moloch/outer/progressbar=none}
+ \addtobeamertemplate{headline}{}{%
+ \usebeamertemplate*{progress bar in head/foot}
+ }
+ },
+ frametitle/.code={\pgfkeys{/moloch/outer/progressbar=none}
+ \addtobeamertemplate{frametitle}{}{%
+ \usebeamertemplate*{progress bar in head/foot}
+ }
+ },
+ foot/.code={\pgfkeys{/moloch/outer/progressbar=none}
+ \addtobeamertemplate{footline}{}{%
+ \usebeamertemplate*{progress bar in head/foot}%
+ }
+ },
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\moloch@outer@setdefaults}
+% Sets default values for outer theme options.
+% \begin{macrocode}
+\newcommand{\moloch@outer@setdefaults}{
+ \pgfkeys{/moloch/outer/.cd,
+ progressbar=none,
+ }
+}
+% \end{macrocode}%
+% \end{macro}
+%
+%
+%
+% \subsubsection{Head and footline}
+%
+% All good |beamer| presentations should already remove the navigation symbols,
+% but \themename removes them automatically (just in case).
+%
+% \begin{macrocode}
+\setbeamertemplate{navigation symbols}{}
+% \end{macrocode}
+%
+%
+% \begin{macro}{headline}
+% \begin{macro}{footline}
+% Templates for the head- and footline at the top and bottom of each frame.
+% \begin{macrocode}
+\defbeamertemplate{headline}{plain}{}
+\defbeamertemplate{footline}{plain}{%
+ \begin{beamercolorbox}[
+ leftskip=4pt,%
+ rightskip=5pt,%
+ wd=\textwidth,%
+ ]{footline}%
+ \usebeamercolor[fg]{page number in head/foot}%
+ \usebeamerfont{page number in head/foot}%
+ \usebeamertemplate*{frame footer}%
+ \hfill%
+ \usebeamertemplate*{page number in head/foot}\vskip4pt%
+ \end{beamercolorbox}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Frametitle}
+%
+% \begin{macro}{frametitle}
+% Templates for the frame title, which is optionally underlined with a
+% progress bar.
+% \begin{macrocode}
+\newlength{\moloch@frametitle@padding}
+\setlength{\moloch@frametitle@padding}{2.2ex}
+\newcommand{\moloch@frametitlestrut@start}{%
+ \rule{0pt}{\moloch@frametitle@padding + \totalheightof{X}}%
+}
+\newcommand{\moloch@frametitlestrut@end}{%
+ \rule[-\moloch@frametitle@padding]{0pt}{\moloch@frametitle@padding}
+}
+\defbeamertemplate{frametitle}{plain}{%
+ \nointerlineskip%
+ \begin{beamercolorbox}[%
+ wd=\paperwidth,%
+ sep=0pt,%
+ leftskip=\moloch@frametitle@padding,%
+ rightskip=\the\glueexpr \moloch@frametitle@padding plus 1fill\relax,%
+ ]{frametitle}%
+ \moloch@frametitlestrut@start%
+ \insertframetitle%
+ \nolinebreak%
+ \moloch@frametitlestrut@end%
+ \end{beamercolorbox}%
+}
+\setbeamertemplate{frametitle continuation}{%
+ \usebeamerfont{frametitle}
+ \romannumeral \insertcontinuationcount
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{progress bar in head/foot}
+% Template for the progress bar optionally displayed below the frame title
+% on each page. Much of this code is duplicated in the inner theme's
+% template |progress bar in section page|.
+% \begin{macrocode}
+\newlength{\moloch@progressinheadfoot}
+\newlength{\moloch@progressinheadfoot@linewidth}
+\setlength{\moloch@progressinheadfoot@linewidth}{0.4pt}
+\setbeamertemplate{progress bar in head/foot}{
+ \nointerlineskip
+ \pgfmathsetlength{\moloch@progressinheadfoot}{%
+ \paperwidth * min(1,\insertframenumber/\inserttotalframenumber)%
+ }
+ \begin{beamercolorbox}[wd=\paperwidth]{progress bar in head/foot}
+ \tikzexternaldisable
+ \begin{tikzpicture}
+ \fill[bg]
+ (0,0)
+ rectangle
+ (\paperwidth, \moloch@progressinheadfoot@linewidth);
+ \fill[fg]
+ (0,0)
+ rectangle
+ (\moloch@progressinheadfoot, \moloch@progressinheadfoot@linewidth);
+ \end{tikzpicture}
+ \tikzexternalenable
+ \end{beamercolorbox}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Process package options}
+%
+% \begin{macrocode}
+\moloch@outer@setdefaults
+\ProcessPgfPackageOptions{/moloch/outer}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.dtx b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.dtx
new file mode 100644
index 0000000000..345ed8d133
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.dtx
@@ -0,0 +1,108 @@
+% \iffalse meta-comment -------------------------------------------------------
+% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+% contributors can be found at
+%
+% https://github.com/matze/mtheme/graphs/contributors
+%
+% and the original template was based on the HSRM theme by Benjamin Weiss.
+%
+% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+% ------------------------------------------------------------------------- \fi
+% \iffalse
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerthememoloch}[2024-01-15 v0.1.0 Moloch Beamer theme] % x-release-please-version
+%</package>
+% \fi
+% \CheckSum{0}
+% \StopEventually{}
+% \iffalse
+%<*package>
+% ------------------------------------------------------------------------- \fi
+%
+% \subsection{\themename parent theme}
+%
+% The primary job of this package is to load the component sub-packages of the
+% \themename theme and route the theme options accordingly. It also
+% provides some custom commands and environments for the user.
+%
+%
+%
+% \subsubsection{Package dependencies}
+%
+% \begin{macrocode}
+\RequirePackage{pgfopts}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Options}
+%
+% Most options are passed off to the component sub-packages.
+%
+% \begin{macrocode}
+\pgfkeys{/moloch/.cd,
+ .search also={
+ /moloch/inner,
+ /moloch/outer,
+ /moloch/color,
+ /moloch/font,
+ }
+}
+% \end{macrocode}
+%
+% To avoid generating externalized figures of the progressbar we have to disable
+% them with ``tikzexternalenable'' and ``tikzexternaldisable''. However, if the
+% ``external'' libray is not loaded we would get undefined control sequence
+% problems, hence we define them as no-ops if they are not defined yet.
+%
+% \begin{macrocode}
+\providecommand{\tikzexternalenable}{}
+\providecommand{\tikzexternaldisable}{}
+% \end{macrocode}
+%
+% \subsubsection{Component sub-packages}
+%
+% Having processed the options, we can now load the component sub-packages of
+% the theme.
+%
+% \begin{macrocode}
+\useinnertheme{moloch}
+\useoutertheme{moloch}
+\usecolortheme{moloch}
+\usefonttheme{moloch}
+% \end{macrocode}
+%
+% \subsubsection{Custom commands}
+%
+% The parent theme defines custom commands as their proper usage may depend
+% on multiple sub-packages.
+%
+% \begin{macro}{\molochset}
+% Allows the user to change options midway through a presentation.
+% \begin{macrocode}
+\newcommand{\molochset}[1]{\pgfkeys{/moloch/.cd,#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\mreducelistspacing}
+% \begin{macrocode}
+\newcommand{\mreducelistspacing}{\vspace{-\topsep}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{Process package options}
+%
+% \begin{macrocode}
+\ProcessPgfOptions{/moloch}
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.ins b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.ins
new file mode 100644
index 0000000000..c7d3c3efc5
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/beamerthememoloch.ins
@@ -0,0 +1,29 @@
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson
+%%
+%% Moloch is a fork of Metropolis, which aims to simplify the package and
+%% fix some long-standing issues.
+%%
+%% ---------------------------------------------------------------------------
+
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+
+\generate{\file{beamerthememoloch.sty}{\from{beamerthememoloch.dtx}{package}}}
+\generate{\file{beamerinnerthememoloch.sty}{\from{beamerinnerthememoloch.dtx}{package}}}
+\generate{\file{beamerouterthememoloch.sty}{\from{beamerouterthememoloch.dtx}{package}}}
+\generate{\file{beamerfontthememoloch.sty}{\from{beamerfontthememoloch.dtx}{package}}}
+\generate{\file{beamercolorthememoloch.sty}{\from{beamercolorthememoloch.dtx}{package}}}
+
+\endbatchfile
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdf b/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdf
new file mode 100644
index 0000000000..0a6b90a384
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.pdf
Binary files differ
diff --git a/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.tex b/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.tex
new file mode 100644
index 0000000000..94fd937a77
--- /dev/null
+++ b/macros/latex/contrib/beamer-contrib/themes/moloch/moloch.tex
@@ -0,0 +1,425 @@
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+%% Copyright 2024 Johan Larsson and contributors
+%% ---------------------------------------------------------------------------
+
+\documentclass{ltxdoc}
+
+\usepackage{parskip}
+\usepackage{setspace}
+\usepackage{xspace}
+\usepackage{xurl}
+\onehalfspacing
+
+\usepackage{enumitem}
+\setlist[itemize]{noitemsep}
+\setlist[enumerate]{noitemsep}
+
+\usepackage{xcolor}
+\definecolor{mDarkBrown}{HTML}{604c38}
+\definecolor{mDarkTeal}{HTML}{23373b}
+\definecolor{mLightBrown}{HTML}{EB811B}
+\definecolor{mLightGreen}{HTML}{14B03D}
+\definecolor{mBackground}{HTML}{FFFFFF}
+
+\usepackage{listings}
+\lstset{%
+ language=[LaTeX]{TeX},
+ basicstyle=\ttfamily,
+ keywordstyle=\color{mLightBrown}\bfseries,
+ commentstyle=\color{mLightGreen},
+ stringstyle=\color{mLightGreen},
+ backgroundcolor=\color{mBackground},
+ numbers=none,
+ numberstyle=\tiny\ttfamily,
+ stepnumber=2,
+ showspaces=false,
+ showstringspaces=false,
+ showtabs=false,
+ frame=none,
+ framerule=1pt,
+ tabsize=2,
+ rulesep=5em,
+ captionpos=b,
+ breaklines=true,
+ breakatwhitespace=false,
+ framexleftmargin=0em,
+ framexrightmargin=0em,
+ xleftmargin=0em,
+ xrightmargin=0em,
+ aboveskip=1em,
+ belowskip=1em,
+ morekeywords={usetheme,institute,maketitle,%
+ plain,setbeamercolor,molochset,setsansfont,setmonofont},
+}
+\lstMakeShortInline|
+\usepackage{metalogo}
+
+\usepackage[colorlinks=true,
+ linkcolor=mLightBrown,
+ menucolor=mLightBrown,
+ pagecolor=mLightBrown,
+ urlcolor=mLightBrown]{hyperref}
+
+\newcommand{\DescribeOption}[4]{
+ \DescribeMacro{#1}
+ \begin{minipage}[t]{\textwidth}
+ \textit{\textbf{\textcolor{mLightGreen}{#2}}}\dotfill\,#3\par
+ \begingroup
+ \vspace{0.5em}#4\par
+ \endgroup
+ \end{minipage}
+}
+
+\newcommand{\themename}{\textsf{moloch}\xspace}
+
+\def\molochversion{0.1.0} % x-release-please-version
+
+\usepackage{readprov}
+% \ReadPackageInfos{beamerthememoloch}
+
+\title{The \themename package (v\molochversion)}
+\author{Johan Larsson \and Matthias Vogelgesang\footnote{Matthias wrote the original version of this manual for the Metropolis theme, which has since been modified by Johan Larsson.}}
+\date{\today}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+
+\section{Introduction}
+
+
+Beamer is a great way to make presentations with LaTeX, but its theme
+selection is surprisingly sparse. The stock themes share an aesthetic that can
+be a little cluttered, while the few distinctive custom themes available are
+often specialized for a particular corporate or institutional brand.
+
+The goal of \themename is to provide a simple, modern Beamer theme suitable
+for anyone to use. It tries to minimize noise and maximize space for content;
+the only visual flourish it offers is an (optional) progress bar added to each
+slide or to the section slides.
+
+\themename's codebase is maintained at \url{https://github.com/jolars/moloch}.
+If you have any issues, find mistakes in the manual or want to help make
+the theme even better, please get in touch there.
+
+\themename is a fork of the popular Metroplis theme by Matthias Vogelgesang.
+The motivation for the fork was to fix some longstanding bugs in Metropolis
+and also simplify the codebase to make it easier to maintain and less
+fragile to changes in the underlying Beamer code.
+
+\section{Getting Started}
+
+\subsection{Installing from CTAN}
+
+For most users, we recommend installing \themename from
+\href{https://www.ctan.org}{CTAN}. If you keep your \TeX\ distribution
+up-to-date, chances are good that \themename is already installed. If it is
+not, you need to update your packages. If your distribution is \TeX\ Live
+(or Mac\TeX\ on OS X), the following command updates all packages.
+
+\begin{lstlisting}
+tlmgr update --all
+\end{lstlisting}
+
+If this results in an error, you may need to run it with administrative privileges:
+
+\begin{lstlisting}
+sudo tlmgr update --all
+\end{lstlisting}
+
+Mac\TeX\ on OS X also provides a graphical interface for |tlmgr| called
+\TeX\ Live Utility.
+
+For any other distribution please refer to its documentation on how to update
+your packages.
+
+\subsection{Installing from Source}
+
+If you want to use the development version of \themename, you can
+install it manually. You only need a recent \LaTeX\ distribution
+which includes \textbf{l3build}. Then simply follow the steps below.
+\begin{description}
+ \item[Download the source] with a |git clone| of
+ \url{https://github.com/jolars/moloch}
+
+ \item[Install the package] by running |l3build install| inside the downloaded
+ directory.
+\end{description}
+
+\subsection{A Minimal Example}
+
+The following code shows a minimal example of a Beamer presentation using
+\themename.
+
+\begin{lstlisting}
+\documentclass{beamer}
+\usetheme{moloch}
+\title{A minimal example}
+\date{\today}
+\author{Johan Larsson}
+\institute{Centre for Modern Beamer Themes}
+\begin{document}
+ \maketitle
+ \section{First Section}
+ \begin{frame}{First Frame}
+ Hello, world!
+ \end{frame}
+\end{document}
+\end{lstlisting}
+
+
+\subsection{Dependencies}
+
+\themename depends on the |beamer| class and the following standard packages:
+\begin{multicols}{3}
+ \begin{itemize}
+ \item |tikz|
+ \item |pgfopts|
+ \item |calc|
+ \end{itemize}
+\end{multicols}
+
+\subsection{Pandoc}
+
+To use this theme with \href{http://johnmacfarlane.net/pandoc/}{Pandoc}-based
+presentations, you can run the following command
+
+\begin{lstlisting}
+$ pandoc -t beamer -V theme:moloch -o output.pdf input.md
+\end{lstlisting}
+
+
+\section{Customization}
+
+\subsection{Package options}
+
+The theme provides a number of options, which can be set using a key=value
+interface. The primary way to set options is to provide a comma-separated list
+of option-value pairs when loading \themename in the preamble:
+\begin{lstlisting}
+\usetheme[option1=value1, option2=value2, ...]{moloch}
+\end{lstlisting}
+
+Options can be changed at any time---even mid-presentation---with the
+|\molochset| macro.
+\begin{lstlisting}
+\molochset{option1=newvalue1, option2=newvalue2, ...}
+\end{lstlisting}
+
+The list of options is structured as shown in the following example.
+
+\DescribeOption{option key}{list of possible values}{default}{
+ A short description of the option.
+}
+
+\subsubsection{Inner theme}
+
+\DescribeOption{sectionpage}{none, simple, progressbar}{progressbar}{
+ Adds a slide at the start of each section (|simple|) with an optional thin
+ progress bar below the section title (|progressbar|). The |none| option
+ disables the section page.
+}
+
+\DescribeOption{subsectionpage}{none, simple, progressbar}{none}{
+ Optionally adds a slide at the start of each subsection. If enabled with
+ the |simple| or |progressbar| options, the style of the |section page| will
+ be updated to match the style of the |subsection page|. Note that section
+ slides and subsection slides can appear consecutively if both are enabled;
+ you may want to use this option together with |sectionpage=none| depending
+ on the section structure of your presentation.
+}
+
+
+\subsubsection{Outer theme}
+
+\DescribeOption{progressbar}{none, head, frametitle, foot}{none}{
+ Optionally adds a progress bar to the top of each frame (|head|),
+ the bottom of each frame (|foot|), or directly below each frame title
+ (|frametitle|).
+}
+
+\subsubsection{Color theme}
+
+\DescribeOption{background}{dark, light}{light}{
+ Provides the option to have a dark background and light foreground instead
+ of the reverse.
+}
+
+\subsection{Color Customization}
+
+The included \themename color theme is used by default, but its colors can be
+easily changed to suit your tastes. All of the theme's styles are defined in
+terms of three beamer colors:
+\begin{itemize}
+ \item |normal text| (dark fg, light bg)
+ \item |alerted text| (colored fg, should be visible against dark or light)
+ \item |example text| (colored fg, should be visible against dark or light)
+\end{itemize}
+
+An easy way to customize the theme is to redefine these colors using
+
+\begin{lstlisting}
+\setbeamercolor{ ... }{ fg= ... , bg= ... }
+\end{lstlisting}
+in your preamble. For greater customization, you can redefine any of the other
+stock beamer colors. In addition to the stock colors the theme defines a number
+of \themename specific colors, which can also be redefined to your liking.
+
+\begin{lstlisting}
+\setbeamercolor{progress bar}{ ... }
+\setbeamercolor{title separator}{ ... }
+\setbeamercolor{progress bar in head/foot}{ ... }
+\setbeamercolor{progress bar in section page}{ ... }
+\end{lstlisting}
+
+For low-light situations \themename it might be helpful to use the
+|moloch-highcontrast| color theme. It is enabled like any other color theme:
+
+\begin{lstlisting}
+\usecolortheme{moloch-highcontrast}
+\end{lstlisting}
+
+
+\subsection{Commands}
+
+\subsubsection{Standout frames}
+
+The \themename inner theme offers a custom frame format with large, centered
+text and an inverted background---perfect for focusing attention on
+single sentence or image. To use it, add the key |standout| to the frame:
+
+\begin{lstlisting}
+\begin{frame}[standout]
+ Thank you!
+\end{frame}
+\end{lstlisting}
+
+\section{Known Issues}
+
+\subsection{Interactions with other color themes}
+
+\themename can be used along with any other Beamer color theme, such as
+|crane| or |seahorse|. If you wish to do this, it is usually best to include
+the \themename subpackages individually so the \themename color theme is
+never loaded. This will prevent conflicts between the \themename color theme
+and your preferred theme.
+
+For example, overriding the color theme as follows may not work as expected because |\usetheme{moloch}| loads the \themename color theme, which
+defines a relationship between the frametitle background and the primary
+palette of the theme. Since |seahorse| assumes a different relationship
+between its palettes, the result is a grey, rather than periwinkle,
+frametitle background.
+
+\begin{lstlisting}
+\usetheme{moloch}
+\usecolortheme{seahorse}
+\end{lstlisting}
+
+The correct colors are chosen if the \themename outer, inner, and font themes
+are loaded seperately:
+
+\begin{lstlisting}
+\useoutertheme{moloch}
+\useinnertheme{moloch}
+\usefonttheme{moloch}
+\usecolortheme{seahorse} % or your preferred color theme
+\end{lstlisting}
+
+Please note that \themename may not use all the colors defined in your
+favourite Beamer color theme. In particular, \themename does not set a
+background color for the title; this will cause issues when using color themes
+like |whale| which set a white foreground for the title.
+
+
+\subsection{Notes on second screen}
+
+If you use the \verb+[show notes on second screen]+ option built in to Beamer and
+compile with \XeLaTeX, text on slides following the first section slide may
+be rendered in white instead of the regular colour. This is due to
+\href{http://tex.stackexchange.com/questions/288408/}{a bug} in Beamer
+or \XeLaTeX\ itself. You can work around it either by compiling with \LuaTeX\
+or by adding the following code to your preamble to reset the text color
+on each slide.
+
+\begin{lstlisting}
+\makeatletter
+\def\beamer@framenotesbegin{% at beginning of slide
+ \usebeamercolor[fg]{normal text}
+ \gdef\beamer@noteitems{}%
+ \gdef\beamer@notes{}%
+}
+\makeatother
+\end{lstlisting}
+
+
+\subsection{Standout frames with labels}
+
+Because the |standout| frame option creates a group to restrict the colour
+change to a single slide, labels defined after calling |standout| will stay
+local to the group. In other words, the following may result in a ``label undefined'' error.
+
+\begin{lstlisting}
+\begin{frame}[standout, label=conclusion]{Conclusion}
+ Awesome slide
+\end{frame}
+\end{lstlisting}
+
+To fix this problem, change the order of the keys in the frame.
+
+\begin{lstlisting}
+\begin{frame}[label=conclusion, standout]{Conclusion}
+ Awesome slide
+\end{frame}
+\end{lstlisting}
+
+This error can be unwittingly triggered if you export your slides from Emacs
+Org mode, which automatically adds labels after frame options. Alex Branham
+\href{https://github.com/matze/mtheme/issues/203}{offers} the following
+solution for Org mode users, using |org-set-property|.
+
+\begin{lstlisting}
+* Start of a frame
+ :PROPERTIES:
+ :BEAMER_opt: label=conclusion,standout
+ :END:
+\end{lstlisting}
+
+
+\subsection{Standout frames with Pandoc}
+
+With Pandoc versions prior 1.17.2 it was not possible to create standout frames
+because Pandoc only supported a specific list of frame attributes thus ignoring
+additional attributes such as |{.standout}|.
+
+
+\section{License}
+
+\themename is licensed under a
+\href{http://creativecommons.org/licenses/by-sa/4.0/}{Creative Commons
+ Attribution-ShareAlike 4.0 International License}.
+This means that if you change the theme and re-distribute it, you must retain
+the copyright notice header and license it under the same CC-BY-SA license.
+This does not affect any presentations that you create with the theme.
+
+
+\section{Implementation}
+
+\DocInput{beamerthememoloch.dtx}
+\DocInput{beamerinnerthememoloch.dtx}
+\DocInput{beamerouterthememoloch.dtx}
+\DocInput{beamerfontthememoloch.dtx}
+\DocInput{beamercolorthememoloch.dtx}
+
+\end{document}
diff --git a/macros/latex/contrib/genealogy-profiles/README.md b/macros/latex/contrib/genealogy-profiles/README.md
new file mode 100644
index 0000000000..eb4dd087ef
--- /dev/null
+++ b/macros/latex/contrib/genealogy-profiles/README.md
@@ -0,0 +1,13 @@
+Genealogical profile macros for LaTeX
+=====================================
+
+Macros and environments for presenting genealogical profiles.
+
+See [genealogy-profiles.pdf](docs/genealogy-profiles.pdf) for the documentation.
+
+Contents last updated 2024-01-24.
+
+<!-- Package available via CTAN at https://www.ctan.org/pkg/genealogy-profiles -->
+
+License: CC-BY-SA 4.0
+Author: Mikkel Eide Eriksen <mikkel.eriksen@gmail.com>
diff --git a/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.pdf b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.pdf
new file mode 100644
index 0000000000..bf030bf364
--- /dev/null
+++ b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.pdf
Binary files differ
diff --git a/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.preamble.sty b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.preamble.sty
new file mode 100644
index 0000000000..a2dda4a26d
--- /dev/null
+++ b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.preamble.sty
@@ -0,0 +1,87 @@
+\usepackage{imakeidx}
+\indexsetup{noclearpage}
+\makeindex
+
+\usepackage{needspace}
+
+\usepackage[english]{babel}
+%\usepackage[
+% backend=biber,
+% urldate=long,
+% date=long,
+%]{biblatex}
+%\addbibresource{genealogy-profiles.bib}
+
+\usepackage{enumitem}
+\usepackage[
+% hidelinks,
+]{hyperref}
+
+\usepackage{tcolorbox}
+\tcbuselibrary{documentation}
+\tcbuselibrary{minted}
+\tcbuselibrary{breakable}
+
+\definecolor{DarkDefinition}{rgb}{0.392,0.392,0.942}
+
+\tcbset{
+ listing engine=minted,
+ color definition=DarkDefinition,
+ floatplacement=h,
+ index colorize=true,
+ doc head={
+ interior style={
+ fill,
+ color=blue!10,
+ },
+ boxsep=2pt,
+ after skip=0pt,
+ nobeforeafter,
+ },
+ doc raster={
+ raster after skip=0pt,
+ },
+ before doc body={
+ \begin{tcolorbox}[
+ colback=blue!5,
+ colframe=blue!5,
+ arc=0pt,
+ outer arc=0pt,
+ before skip=0pt,
+ nobeforeafter,
+ ]
+ },
+ after doc body={\end{tcolorbox}},
+ index format=off, % to get the profile index title to show up
+}
+
+\AtBeginEnvironment{tcb@manual@entry}{%
+ \needspace{4\baselineskip}%
+}
+
+\setlist[description]{
+ leftmargin=5em,
+ rightmargin=\leftmargin,
+ itemindent=\labelwidth,
+ align=right,
+ font=\docAuxKey,
+ noitemsep,
+}
+
+\usepackage{csquotes}
+
+\usepackage{fnpct}
+
+\usepackage{cleveref}
+
+\makeindex[name=gpr-surnames, title={Profile Index}]
+
+\usepackage{genealogy-profiles}
+
+\gprKeys{
+ patronymic index = gpr-surnames,
+ surname index = gpr-surnames,
+ byname index = gpr-surnames,
+}
+
+
diff --git a/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.tex b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.tex
new file mode 100644
index 0000000000..e65b90aa9a
--- /dev/null
+++ b/macros/latex/contrib/genealogy-profiles/docs/genealogy-profiles.tex
@@ -0,0 +1,601 @@
+% !TEX TS-program = LuaLaTeX-shell-escape
+\documentclass[
+ a4paper,
+]{article}
+
+\usepackage{genealogy-profiles.preamble}
+
+\title{Genealogical Profiles for \LaTeX}
+\author{Mikkel Eide Eriksen\\%
+ \href{mailto:mikkel.eriksen@gmail.com}{\texttt{mikkel.eriksen@gmail.com}}}
+
+\newcommand\brackval[1]{\brackets{\docValue{#1}}}
+
+\begin{document}
+
+\maketitle
+
+\section{Preface} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+This package enables the presenstation of individual \emph{profiles}, which may be useful for genealogical or local history treatises.
+
+Each profile is typeset using key/value-configurable environments, and a number of macros are provided to enable references and name formatting.
+
+Issues can be reported at\\\null\hfill\url{https://github.com/mikkelee/latex-genprofile/issues}
+
+\begin{figure}
+\begingroup
+\gprKeys{
+ name type = given and surname,
+ surname style = \scshape,
+ begin profile = {
+ \begin{tcolorbox}[title = \gprHeader]
+ },
+ begin life events = \small,
+ end life events = \tcblower,
+ end profile = \end{tcolorbox},
+}
+\begin{gprProfile}{Wolfgang_Amadeus Mozart}[
+ birth = {1756-01-27}{Getreidegasse 9, Salzburg},
+ death = {1791-12-05}{Vienna}
+]
+ Had a complex relationship with his rival \gprRef{Antonio Salieri}.
+\end{gprProfile}
+\begin{gprProfile}{Antonio Salieri}[
+ birth = {1750-08-18}{Legnago, Republic of Venice},
+ death = {1825-05-07}{Vienna}
+]
+ Was falsely accused of poisoning \gprRef[WM1]{_ Mozart}.
+\end{gprProfile}
+\endgroup
+\end{figure}
+
+\clearpage
+\section{Configuration} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The package is configured in the following manner:
+
+\begin{docCommand}
+ {usepackage}
+ {\brackets{genealogy-profiles}}
+
+ Loads the package and sets some sensible defaults as further described below.
+
+\end{docCommand}
+
+\begin{docCommand}
+ {gprKeys}
+ {\marg{general options}}
+
+ Can be used to set options globally (in the preamble) or locally (in a group). See \cref{sec:genconf} for possible keys/values.
+
+\end{docCommand}
+
+\section{Usage} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\begin{docEnvironment}
+ {gprProfile}
+ {\oarg{profile options}\marg{name}\oarg{life events}}
+
+ Typesets its contents according to the configured layout (see \cref{sec:structure}). For possible profile options, see \cref{sec:profopts}.
+
+ The name will be parsed according to the current \refKey{name part order} (see \cref{sec:nameparsing} for discussion) and styled according to \refKey{givenname style} etc.
+
+ Each profile must have an ID, either supplied by the author via the \refKey{id} profile option key or automatically generated via the general \refKey{auto id} key.
+
+ The \refKey{life events} will be parsed as a database by the \href{https://ctan.org/pkg/genealogytree}{genealogytree} package.
+
+\end{docEnvironment}
+
+\begin{docEnvironment}
+ {gprProfile*}
+ {\marg{profile options}\oarg{life events}}
+
+ The \refEnv*{gprProfile*} environment provides more control at the expense of convenience, by requiring the name part(s) be set explicitly as profile options. See \refKey{givenname} etc.
+
+\end{docEnvironment}
+
+
+\begin{docCommands}[
+ doc name = {gprName}
+ ]
+ {
+ { doc parameter = {\marg{name}}},
+ { doc parameter = {\sarg\marg{name}}},
+ }
+
+ Typesets a name, styled according to \refKey{givenname style} etc.
+
+ The regular version adds the name to any indices, the starred veresion does not.
+
+\end{docCommands}
+
+
+\begin{docCommands}[
+ doc name = {gprRef}
+ ]
+ {
+ { doc parameter = {\oarg{id}\marg{name}}},
+ { doc parameter = {\sarg\oarg{id}\marg{name}}},
+ }
+
+ Typesets a reference to a profile.
+
+ The ID is optional, in case they are not known or available at the time of writing. However, if the name is unique to the document, the reference should automatically be recognized.
+
+ If it is not possible for the package to identify the intended reference, either via ID or unique name, warnings will be emitted in the log as well as in the document (the latter can be configured via the \refKey{unknown reference style}).
+
+ When using an ID, the name parameter can be left empty, or alternately be used to override the displayed name, eg. to change case to genitive, etc.
+
+ The regular version adds the reference to configured indices, the starred version does not.
+
+ These commands require two runs to account for forward references.
+\end{docCommands}
+
+
+\begin{docCommands}[
+ doc name = {gprYear}
+ ]
+ {
+ { doc parameter = {\marg{year}}},
+ { doc parameter = {\sarg\marg{year}}},
+ }
+
+ All tagged years in a profile will be gathered and inserted as a range into a \docValue*{floruit} life event, which will by default only be displayed if there is no defined lifespan (ie. birth or baptism \emph{and} death or burial).
+
+ The starred version does not typeset anything, and can thus be used to add \enquote{hidden} years to the floruit event.
+
+ These commands require two runs.
+\end{docCommands}
+
+
+\begin{docCommands}[
+ doc name = {gprYears}
+ ]
+ {
+ { doc parameter = {\marg{year range}}},
+ { doc parameter = {\sarg\marg{year range}}},
+ }
+
+ Adds two years to the \docValue*{floruit} event, by splitting at one or more hyphens.
+
+ Values such as \docValue*{1750--1755} or \docValue*{1750--55} will both be parsed as the two years \docValue*{1750} and \docValue*{1755} and typesets as the expected 1750--1755 or 1750--55, respectively.
+
+ Like \refCom{gprYear}, the starred version produces no output, and two runs are required.
+\end{docCommands}
+
+
+\clearpage
+\section{Profile Layout} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\label{sec:structure}
+The typeset profiles are laid out according to the following structure.
+
+\begin{enumerate}
+
+\item The contents of \refKey{begin profile}
+
+\item If \refKey{auto header} is \docValue*{true}:
+ \begin{enumerate}
+ \item The contents of \refKey{begin header}
+ \item The contents of \refKey{header format}
+ \item The contents of \refKey{end header}
+ \end{enumerate}
+
+\item If \refKey{life events} and/or \refCom{gprYear}(s) were used:
+ \begin{enumerate}
+ \item The contents of \refKey{begin life events}.
+ \item The events formatted according to the database format configured via the \href{https://ctan.org/pkg/genealogytree}{genealogytree} package. The provided default simply lists life events separated by commas.
+ \item The contents of \refKey{end life events}
+ \end{enumerate}
+
+\item The content provided to the environment by the author.
+
+\item The contents of \refKey{end profile}
+
+\end{enumerate}
+
+
+\section{Name Parsing} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\label{sec:nameparsing}
+Names are parsed according to the configured \refKey{name part order} (some presets are provided with \refKey{name type}), in a left-to-right evaluation.
+
+In order for single name parts to include multiple separate tokens (eg. multiple given names), underscores can be used to combine them. For example, \docValue*{Wolfgang\_Amadeus Mozart} will, with the default \docValue{given and surname} name type, be parsed as the given name(s) \docValue*{Wolfgang Amadeus} and the surname \docValue*{Mozart}.
+
+If the \refKey{name part order} has more parts than the supplied value, the right-most parts will be empty. If this is not desired, one may mark empty name parts with a single underscore; for example, using the \docValue{nordic historical} name type, \docValue*{Jens _ Smed} will parse as the given name \docValue*{Jens}, no patronymic, and the byname \docValue*{Smed} (ie. blacksmith).
+
+Inside a profile environment, a number of shortcuts are provided to access the available name parts, as well as the ID and a full name styled according to the name style keys.
+
+
+\clearpage
+\section{Profile Macros} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+A number of extra macros are available inside profiles to allow accessing some key values.
+
+\begin{docCommand}
+ {gprHeader}
+ {\brackets{}}
+
+ A header styled according to \refKey{header format}.
+
+ If \refKey{auto header} is \docValue*{false}, one may wish to use \refCom{gprHeader} to manually insert the header at the desired location (see \cref{sec:examples} for an example).
+
+\end{docCommand}
+
+
+\begin{docCommands}[
+ doc parameter = {\brackets{}}
+ ]
+ {
+ { doc name = gprID},
+ { doc name = gprStyledName},
+ { doc name = gprFullName},
+ { doc name = gprGivenName},
+ { doc name = gprPatronymic},
+ { doc name = gprSurname},
+ { doc name = gprByname},
+ }
+
+ Typesets the ID and name parts accordig to configured styles.
+
+ The styled name is formatted according to the style keys, see \refKey{givenname style} etc.
+
+\end{docCommands}
+
+
+\subsection{Option Keys} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\subsubsection{General Options} %---------------------------------------------------------
+
+\label{sec:genconf}
+These are used with the \refCom{gprKeys} command, either globally in the preamble or locally in a group.
+
+\begin{docKey}
+ {auto header}
+ {=\meta{true/false}}
+ {initially \docValue*{false}}
+
+ Automatically inserts a header using \refKey{header format} at the beginning of profiles. See \cref{sec:structure}.
+\end{docKey}
+
+\begin{docKey}
+ {auto id}
+ {=\meta{true/false}}
+ {initially \docValue*{true}}
+
+ Generates an ID for each profile if no \refKey{id} is supplied. The format is the name part initials combined with a number to ensure uniqueness.
+
+ If no ID is set either automatically or manually, an error is emitted.
+\end{docKey}
+
+\begin{docKey}
+ {auto id prefix}
+ {=\meta{...}}
+ {initially not set}
+
+ Prefixes auto-generated IDs with a string, which may be useful for works containing multiple sections.
+\end{docKey}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{...}},
+ doc description = {initially not set},
+ ]
+ {
+ {
+ doc name = begin profile,
+ },
+ {
+ doc name = begin header,
+ },
+ {
+ doc name = end header,
+ },
+ {
+ doc name = begin life events,
+ },
+ {
+ doc name = end life events,
+ },
+ {
+ doc name = end profile,
+ },
+ }
+
+ These keys allow configuring arbitrary \LaTeX{} code to be inserted before/during/after the typeset \refEnv{gprProfile} and \refEnv{gprProfile*} environments (see \cref{sec:structure}).
+
+\end{docKeys}
+
+\begin{docKey}
+ {header format}
+ {=\meta{...}}
+ {initially \brackets{\docValue*{\cs{gprStyledName}\brackets{}\cs{hfill}\cs{gprID}\brackets{}}}}
+
+ Formats a profile header. See \refCom{gprID} etc. for available macros.
+\end{docKey}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{...}},
+ ]
+ {
+ {
+ doc name = name type,
+ doc description = {initially \docValue{given and surname}}
+ },
+ {
+ doc name = name part order,
+ doc description = {initially \brackets{\docValue*{givenname, surname}}}
+ },
+ }
+
+ The \refKey*{name part order} is used for splitting a \refKey{fullname} to its constituent parts for formatting, index entries, and (if configured) IDs.
+
+ Using the \refKey*{name type} key provides access to a number of preconfigured \refKey*{name part order}s:
+
+ \begin{itemize}
+ \item \docValue{given and surname} will set the \refKey*{name part order} key to \brackets{\docValue*{givenname, surname}} (the default).
+ \item \docValue{nordic historical} will set the \refKey*{name part order} key to \brackets{\docValue*{givenname, patronymic, byname}}, commonly used in Scandinavia and the rest of the nordic countries.
+ \end{itemize}
+
+ If no preset \refKey*{name type} exists for the intended use case, the \refKey*{name part order} can be set directly (suggestions are welcome).
+\end{docKeys}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{...}},
+ doc description = {initially not set},
+ ]
+ {
+ {
+ doc name = givenname style,
+ },
+ {
+ doc name = patronymic style,
+ },
+ {
+ doc name = surname style,
+ },
+ {
+ doc name = byname style,
+ },
+ }
+
+ These keys set the styling for each name part, which will be available as the \refCom{gprStyledName}.
+
+\end{docKeys}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{...}},
+ doc description = {initially not set},
+ ]
+ {
+ {
+ doc name = id index,
+ },
+ {
+ doc name = fullname index,
+ },
+ {
+ doc name = givenname index,
+ },
+ {
+ doc name = patronymic index,
+ },
+ {
+ doc name = surname index,
+ },
+ {
+ doc name = byname index,
+ },
+ }
+
+ Setting these keys will cause \refEnv{gprProfile} and \refCom{gprRef} to emit index data to the named index. The index must be created with eg. \texttt{imakeidx} before using.
+
+ They can point to the same index (eg. one may wish to use one index for patronymics, surnames, and/or bynames). In fact, that has been set for this document (see final page).
+
+ At the end of the document, \docAuxCommand*{printindex} can then be used for each index as normal.
+
+\end{docKeys}
+
+\begin{docKey}
+ {id in index entries}
+ {=\meta{true/false}}
+ {initially not set}
+
+ Causes index entries to include the IDs in parentheses.
+\end{docKey}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{true/false}},
+ doc description = {initially not set},
+ ]
+ {
+ {
+ doc name = include unknown in index,
+ },
+ {
+ doc name = include ambiguous in index,
+ },
+ }
+
+ Causes the indexes to include references to persons with unknown IDs or ambiguous names, which can be used for correcting drafts.
+
+\end{docKeys}
+
+\begin{docKey}
+ {main index entry style}
+ {=\meta{...}}
+ {initially not set}
+
+ Adds formatting to the main index entry page numbers (ie. the ones pointing to the profile), leaving the ones reference with \refCom{gprRef} untouched; for example \docValue*{textbf} will bold the main entry.
+\end{docKey}
+
+\begin{docKey}
+ {nest index entries}
+ {=\meta{true/false}}
+ {initially not set}
+
+ Causes index entries to be nested under the various patronymics/surnames/bynames.
+\end{docKey}
+
+\begin{docKey}
+ {reference style}
+ {=\meta{...}}
+ {see below}
+
+ Formats references. The value is expanded with the arguments \docValue*{\#1} being the name, \docValue*{\#2} being the ID, and \docValue*{\#2} being the page reference. The default is to present these as the name followed by combined super- and subscripts (see also \cref{sec:examples} for another style).
+\end{docKey}
+
+\begin{docKey}
+ {unknown reference style}
+ {=\meta{...}}
+ {see below}
+
+ Formats unknown references. The value is expanded with the arguments \docValue*{\#1} being the name supplied by \refCom{gprRef} and \docValue*{\#2} being a short description of the reason. The default is to present the name as red text with the reason (unknown/ambiguous) following in parentheses.
+\end{docKey}
+
+
+\subsubsection{Profile Options} %---------------------------------------------------------
+
+\label{sec:profopts}
+These are used with the \refEnv{gprProfile} and \refEnv{gprProfile*} environments.
+
+\begin{docKey}
+ {id}
+ {=\meta{...}}
+ {initially not set}
+
+ Sets an ID for the profile. If none is specified and \refKey{auto id} is \docValue*{true}, one will be generated from name initials combined with a number to ensure uniqueness.
+
+ If an already used ID is specified, an error will be emitted.
+
+ Likewise, not specifying an ID while \refKey{auto id} is \docValue*{false} will cause an error.
+\end{docKey}
+
+\begin{docKey}
+ {fullname}
+ {=\marg{...}}
+ {initially not set}
+
+ Sets the full name of the person. If it is specified, the configured \refKey{name part order} will be used to set the individual name parts.
+
+ If it is not specified, one will be generated by combining the given name parts according to the configured \refKey{name part order}, using the below keys. See \cref{sec:nameparsing} for further details.
+\end{docKey}
+
+\begin{docKeys}
+ [
+ doc parameter = {=\meta{...}},
+ doc description = {initially not set},
+ ]
+ {
+ {
+ doc name = givenname,
+ },
+ {
+ doc name = patronymic,
+ },
+ {
+ doc name = surname,
+ },
+ {
+ doc name = byname,
+ },
+ }
+
+ Sets individual name parts.
+
+\end{docKeys}
+
+\begin{docKey}
+ {life events}
+ {=\meta{...}}
+ {initially not set}
+
+ Populates a \href{https://ctan.org/pkg/genealogytree}{genealogytree} database, which will be typeset according to the settings of that package; refer to its documenation for configuration. Simple display defaults have been provided.
+
+ For convenience, this key can be set with the final optional argument of the \refEnv{gprProfile} and \refEnv{gprProfile*} environments.
+\end{docKey}
+
+\begin{docKey}
+ {no index}
+ {=\meta{true/false}}
+ {initially not set}
+
+ Skips adding index entries for this profile.
+\end{docKey}
+
+\clearpage
+\section{Examples} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\label{sec:examples}
+
+\subsection{Using \texttt{tcolorbox} \& \docValue*{nordic historical}}
+
+A simple example to show name parsing and use of \refCom{gprRef} and \refCom{gprYear}.
+\begin{dispExample}
+\gprKeys{
+ name type = nordic historical,
+ patronymic style = \itshape,
+ byname style = \scshape,
+ begin profile = {\begin{tcolorbox}[title = \gprHeader]},
+ end life events = \tcblower,
+ end profile = \end{tcolorbox},
+}
+
+\begin{gprProfile}{Jens Hansen}[ birth = {1790}{Denmark} ]
+ Wife: \gprRef{Anne_Marie Olsdatter}.
+
+ Let's also tag some years:
+ \gprYear{1830}, \gprYear{1835}, and \gprYear{1840}.
+\end{gprProfile}
+
+\begin{gprProfile}{Anne_Marie Olsdatter}[ birth = {1795}{Denmark} ]
+ Husband: \gprRef{Jens Hansen}.
+\end{gprProfile}
+
+\begin{gprProfile}{Jens Hansen Smed}
+ An unrelated person with a byname.
+\end{gprProfile}
+
+\end{dispExample}
+
+\clearpage
+\subsection{Using \texttt{hrule} \& \docValue*{given and surname}}
+
+A simple example to show different layout and reference styles.
+
+\begin{dispExample}
+\newcommand\spacedrule{\vspace*{5pt}\hrule\vspace*{5pt}}
+\gprKeys{
+ name type = given and surname,
+ surname style = \scshape,
+ auto header,
+ begin profile = \spacedrule,
+ end life events = \spacedrule,
+ end profile = \spacedrule,
+ reference style = {#1\footnote{#2, #3}}
+}
+
+\begin{gprProfile}{George Washington}[
+ birth = {1732-02-22}{Popes Creek, Virginia Colony},
+ death = {1799-12-14}{Mount Vernon, Virginia, U.S.}
+]
+ Attended the first \gprRef[WM1]{_ Mozart} performance
+ in America in \gprYear{1784}.
+\end{gprProfile}
+
+\end{dispExample}
+
+\clearpage %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\small % because index format=off
+\printindex
+
+\indexprologue{This index was created by setting the keys \refKey*{patronymic index}, \refKey*{surname index}, and \refKey*{byname index} all to the same index.}
+\printindex[gpr-surnames]
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/genealogy-profiles/latex/genealogy-profiles.sty b/macros/latex/contrib/genealogy-profiles/latex/genealogy-profiles.sty
new file mode 100644
index 0000000000..69f1cf00d7
--- /dev/null
+++ b/macros/latex/contrib/genealogy-profiles/latex/genealogy-profiles.sty
@@ -0,0 +1,848 @@
+\RequirePackage{expl3}[2023-10-10]
+\ProvidesExplPackage{genealogy-profiles}{2024/01/24}{0.1}{Macros for creating genealogical profiles}
+
+% License: CC-BY-SA 4.0
+% Author: Mikkel Eide Eriksen <mikkel.eriksen@gmail.com>
+
+\RequirePackage{genealogytree}
+\RequirePackage{hyperref}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Key setup
+%
+
+\keys_define:nn { genealogy-profiles }
+{
+ name~part~order .code:n = {
+ \seq_gset_from_clist:Nn \g__gpr_name_part_order_seq {#1}
+ } ,
+ name~type .choices:nn = {
+ given~and~surname ,
+ nordic~historical ,
+ } {
+ \int_case:nn { \l_keys_choice_int } {
+ {1} {
+ \seq_gset_from_clist:Nn \g__gpr_name_part_order_seq
+ { givenname, surname }
+ }
+ {2} {
+ \seq_gset_from_clist:Nn \g__gpr_name_part_order_seq
+ { givenname, patronymic, byname }
+ }
+ }
+
+
+ } ,
+
+ auto~id .bool_set:N = \l__gpr_autoid_bool ,
+ auto~id .default:n = { true } ,
+ auto~id~prefix .tl_set:N = \l__gpr_id_prefix_tl ,
+
+ % formatting profiles
+ begin~profile .tl_set:N = \l__gpr_begin_profile_tl ,
+ end~profile .tl_set:N = \l__gpr_end_profile_tl ,
+ begin~header .tl_set:N = \l__gpr_begin_header_tl ,
+ end~header .tl_set:N = \l__gpr_end_header_tl ,
+ begin~life~events .tl_set:N = \l__gpr_begin_life_events_tl ,
+ end~life~events .tl_set:N = \l__gpr_end_life_events_tl ,
+
+ reference~style .cs_set:Np = \gpr__reference_style_handler:nnn #1#2#3 ,
+ unknown~reference~style .cs_set:Np = \gpr__unknown_reference_handler:nn #1#2 ,
+ page~number~style .cs_set:Np = \gpr__page_number_handler:n #1 ,
+
+ % name part styling
+ givenname~style .tl_set:N = \l__gpr_givenname_style_tl ,
+ patronymic~style .tl_set:N = \l__gpr_patronymic_style_tl ,
+ surname~style .tl_set:N = \l__gpr_surname_style_tl ,
+ byname~style .tl_set:N = \l__gpr_byname_style_tl ,
+
+ header~format .tl_set:N = \l__gpr_header_format_tl ,
+ auto~header .bool_set:N = \l__gpr_auto_header_bool ,
+
+ % indexes
+ id~index .tl_set:N = \l__gpr_id_index_tl ,
+ fullname~index .tl_set:N = \l__gpr_fullname_index_tl ,
+ patronymic~index .tl_set:N = \l__gpr_patronymic_index_tl ,
+ surname~index .tl_set:N = \l__gpr_surname_index_tl ,
+ byname~index .tl_set:N = \l__gpr_byname_index_tl ,
+
+ nest~index~entries .bool_set:N = \l__gpr_nest_index_entries_bool ,
+ id~in~index~entries .bool_set:N = \l__gpr_id_in_index_entries_bool ,
+ main~index~entry~style .tl_set:N = \l__gpr_main_index_entry_style_tl ,
+ include~unknown~in~index .bool_set:N = \l__gpr_include_unknown_in_index_bool ,
+ include~unknown~in~index .default:n = { true } ,
+ include~ambiguous~in~index .bool_set:N = \l__gpr_include_ambiguous_in_index_bool ,
+ include~ambiguous~in~index .default:n = { true } ,
+
+ debug~log .bool_set:N = \l__gpr_debug_log_bool
+}
+
+\keys_define:nn { genealogy-profiles / profile }
+{
+ id .tl_set:N = \l__gpr_id_tl ,
+ fullname .tl_set:N = \l__gpr_fullname_tl ,
+ givenname .tl_set:N = \l__gpr_givenname_tl ,
+ patronymic .tl_set:N = \l__gpr_patronymic_tl ,
+ surname .tl_set:N = \l__gpr_surname_tl ,
+ byname .tl_set:N = \l__gpr_byname_tl ,
+
+ life~events .tl_set:N = \l__gpr_life_events_tl ,
+
+ no~index .bool_set:N = \l__gpr_no_index_bool ,
+}
+
+\NewDocumentCommand { \gprKeys } { +m } {
+ \keys_set:nn { genealogy-profiles } { #1 }
+}
+
+% set some defaults
+\keys_set:nn { genealogy-profiles } {
+ auto~id ,
+ include~unknown~in~index ,
+ include~ambiguous~in~index ,
+ name~type = { given~and~surname } ,
+ header~format = { \gprStyledName \hfill \gprID } ,
+ reference~style = {
+ #1 \gpr_super_subscript:nn {#2} {#3}
+ } ,
+ page~number~style = {
+ p.\nobreakspace#1
+ } ,
+ unknown~reference~style = {
+ \color_select:n {red}
+ #1
+ \tl_if_novalue:nF {#2} { ~ (#2) }
+ } ,
+}
+
+\cs_generate_variant:Nn \gpr__unknown_reference_handler:nn {
+ Vn, nV
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Errors and warnings
+%
+
+\msg_new:nnn
+{ genealogy-profiles } { reference-recorded }
+{ Reference ~ recorded ~ from ~ #1 ~ to ~ #2 ~ on ~ input ~ line ~ #3 }
+
+\msg_new:nnn
+{ genealogy-profiles } { ambiguous-reference }
+{ Ambiguous ~ reference: ~ #1 ~ on ~ input ~ line ~ #2, ~
+ use ~ IDs ~ to ~ fix ~ references }
+
+\msg_new:nnn
+{ genealogy-profiles } { unknown-reference-id }
+{ Reference ~ to ~ unknown ~ id: ~ #1 ~ on ~ input ~ line ~ #2 }
+
+\msg_new:nnn
+{ genealogy-profiles } { unknown-reference-name }
+{ Reference ~ to ~ unknown ~ name: ~ #1 ~ on ~ input ~ line ~ #2 }
+
+\msg_new:nnn
+{ genealogy-profiles } { missing-backref }
+{ Missing ~ backreference: ~ #1 ~ refers ~ to ~ #2 ~ but ~ not ~ vice ~ versa ~
+ on ~ input ~ line ~ #3 }
+
+\msg_new:nnnn
+{ genealogy-profiles } { missing-id }
+{ You ~ have ~ not ~ assigned ~ an ~ ID ~ to ~ profile: ~ #1 ~ on ~ input ~ line ~ #2 }
+{ You ~ must ~ either ~ give ~ each ~ profile ~ a ~ unique ~ ID, ~
+ or ~ let ~ them ~ be ~ autogenerated. }
+
+\msg_new:nnnn
+{ genealogy-profiles } { reused-id }
+{ You ~ have ~ assigned ~ an ~ ID ~ that ~ is ~ already ~ in ~ use: ~ #1 ~
+ on ~ input ~ line ~ #2 }
+{ You ~ must ~ either ~ give ~ every ~ profile ~ a ~ unique ~ ID, ~
+ or ~ let ~ them ~ be ~ autogenerated. }
+
+\msg_new:nnn
+{ genealogy-profiles } { ambiguous-rawname }
+{ Multiple ~ profiles ~ with ~ the ~ name ~ '#1', ~
+ you ~ will ~ need ~ to ~ use ~ IDs ~ to ~ reference ~ them }
+
+\cs_new_protected:Nn \gpr_warning:nn
+{
+ \msg_warning:nnee { genealogy-profiles } { #1 } { #2 } { \the\inputlineno }
+}
+
+\cs_new_protected:Nn \gpr_warning:nnn
+{
+ \msg_warning:nneee { genealogy-profiles } { #1 } { #2 } { #3 } { \the\inputlineno }
+}
+
+\cs_new_protected:Nn \gpr_error:nn
+{
+ \msg_error:nnee { genealogy-profiles } { #1 } { #2 } { \the\inputlineno }
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Extensions to expl3 library
+%
+
+\prg_generate_conditional_variant:Nnn \tl_if_blank:n
+ { v, V } { F }
+
+\prg_generate_conditional_variant:Nnn \property_if_recorded:nn
+ { en } { T, TF }
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Properties
+%
+
+\seq_clear_new:N \l__gpr_floruit_years_seq
+\property_new:nnnn { floruit-years } { now } { \c_novalue_tl } {
+ \seq_use:Nn \l__gpr_floruit_years_seq {,}
+}
+
+\tl_clear_new:N \l__gpr_fullname_raw_tl
+\property_new:nnnn { raw-name } { now } { \c_novalue_tl } {
+ \tl_use:N \l__gpr_fullname_raw_tl
+}
+
+\prop_clear_new:N \g__gpr_name_to_id_prop % saved at end, loaded into _active at start
+\prop_clear_new:N \g__gpr_name_to_id_active_prop % used for lookups during run
+\property_new:nnnn { names-ids } { now } { \c_novalue_tl } {
+ \prop_to_keyval:N \g__gpr_name_to_id_prop
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Names
+%
+
+\tl_const:Ne \c_gpr_underscore_tl { \char_generate:nn { `_ } { 8 } }
+
+\cs_new_protected:Nn \gpr_name_handler:n
+{
+ \tl_set:Nn \l__gpr_fullname_tl {#1}
+ \tl_replace_all:NVn \l__gpr_fullname_tl \c_gpr_underscore_tl { ~ }
+
+ \seq_set_split:Nnn \l_tmpa_seq {~} {#1}
+ \seq_map_indexed_inline:Nn \g__gpr_name_part_order_seq {
+ \tl_set:Ne \l_tmpa_tl { \seq_item:Nn \l_tmpa_seq {##1} }
+ \tl_replace_all:NVn \l_tmpa_tl \c_gpr_underscore_tl { ~ }
+ \tl_if_blank:VTF \l_tmpa_tl {
+ \tl_clear:c { l__gpr_##2_tl }
+ } {
+ \tl_set:cV { l__gpr_##2_tl } \l_tmpa_tl
+ }
+ }
+
+ \tl_clear_new:N \l__gpr_styled_name_tl
+ \gpr_style_name:N \l__gpr_styled_name_tl
+}
+\cs_generate_variant:Nn \gpr_name_handler:n {
+ V, e
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% IDs
+%
+
+\cs_new_protected:Nn \gpr_map_name_to_id:Nnn
+{
+ % check if name already has an associated id
+ \prop_get:NVNTF #1 \l__gpr_fullname_raw_tl \l_tmpb_tl
+ {
+ % mark name ambiguous if already reserved
+ \tl_if_eq:NNF \l__gpr_id_tl \l_tmpb_tl
+ {
+ \msg_note:nne { genealogy-profiles } { ambiguous-rawname }
+ { \tl_use:N \l__gpr_fullname_raw_tl }
+ \prop_gput:NVn #1 \l__gpr_fullname_raw_tl {_AMBIGUOUS_}
+ }
+ }
+ {
+ % otherwise save raw name -> id
+ \prop_gput:NVV #1 \l__gpr_fullname_raw_tl \l__gpr_id_tl
+ }
+}
+\cs_generate_variant:Nn \gpr_map_name_to_id:Nnn {
+ NVV
+}
+
+\seq_clear_new:N \g__gpr_used_profile_ids_seq
+
+\cs_new_protected:Nn \gpr_generate_unique_id:
+{
+ \tl_clear_new:N \l_tmpa_tl
+
+ \tl_put_right:NV \l_tmpa_tl \l__gpr_id_prefix_tl
+
+ % build base id from initials
+ \seq_map_indexed_inline:Nn \g__gpr_name_part_order_seq {
+ \tl_if_empty:cTF { l__gpr_##2_tl } {
+ \tl_put_right:Ne \l_tmpa_tl { - }
+ } {
+ \tl_put_right:Ne \l_tmpa_tl { \tl_item:cn { l__gpr_##2_tl } {1} }
+ }
+ }
+
+ % find unused variant
+ \int_zero_new:N \l__gpr_id_index_int
+ \bool_set_false:N \l__gpr_id_found_bool
+
+ \bool_do_until:nn { \l__gpr_id_found_bool } {
+ \int_incr:N \l__gpr_id_index_int
+ \tl_set:Ne \l__gpr_id_tl {
+ \tl_use:N \l_tmpa_tl
+ \int_use:N \l__gpr_id_index_int
+ }
+ \seq_if_in:NVTF \g__gpr_used_profile_ids_seq \l__gpr_id_tl
+ {
+ \bool_set_false:N \l__gpr_id_found_bool
+ }
+ {
+ % mark id as used
+ \seq_gput_right:NV \g__gpr_used_profile_ids_seq \l__gpr_id_tl
+
+ \bool_set_true:N \l__gpr_id_found_bool
+ }
+ }
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% References
+%
+
+\prop_new:N \g__gpr_references_prop
+
+\cs_new_protected:Nn \gpr_save_reference:nn
+{
+ \prop_if_in:NnTF \g__gpr_references_prop { #1 } {
+ \prop_get:NnN \g__gpr_references_prop { #1 } \l_tmpa_tl
+ } {
+ \tl_clear:N \l_tmpa_tl
+ }
+
+ % wrap ID as _ID_ so we can match them out later
+ \tl_put_right:Nn \l_tmpa_tl { _#2_ }
+
+ \prop_gput:NnV \g__gpr_references_prop { #1 } \l_tmpa_tl
+
+% \msg_note:nneee { genealogy-profiles } { reference-recorded }
+% { #1 } { #2 } {\the\inputlineno}
+}
+\cs_generate_variant:Nn \gpr_save_reference:nn {
+ Vn
+}
+
+\cs_new_protected:Nn \gpr_check_backrefs:nn
+{
+ \regex_extract_all:nnN { _([^_]+)_ } {#2} \l_tmpa_seq
+ \seq_map_inline:Nn \l_tmpa_seq {
+ % dont test entire matches (_ID_), only submatches (ID)
+ \tl_if_eq:neF { _ } { \tl_item:nn { ##1 } {1} }
+ {
+ \seq_if_in:NnT \g__gpr_used_profile_ids_seq { ##1 } {
+ \prop_get:NnN \g__gpr_references_prop {##1} \l_tmpa_tl
+ \regex_match:nVF { #1 } { \l_tmpa_tl } {
+ \gpr_warning:nnn { missing-backref } { #1 } { ##1 }
+ }
+ }
+ }
+ }
+}
+
+\cs_new:Nn \gpr_init_names_to_keys:n
+{
+ \tl_if_novalue:nF {#1} {
+ \prop_set_from_keyval:Nn \g__gpr_name_to_id_active_prop {#1}
+ }
+}
+\cs_generate_variant:Nn \gpr_init_names_to_keys:n {
+ e
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hooks
+%
+
+\AddToHook{begindocument/end}
+{
+ \gpr_init_names_to_keys:e { \property_ref:nn { gpr } { names-ids } }
+}
+
+\AddToHook{shipout/lastpage}
+{
+ \property_record:ee { gpr } { names-ids }
+ \prop_map_inline:Nn \g__gpr_references_prop {
+ \gpr_check_backrefs:nn {##1} {##2}
+ }
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Indexing
+%
+
+\cs_new:Nn \gpr_add_to_named_index:nnN {
+ \index[#1]{
+ #2
+ \bool_if:nT { #3 && !\tl_if_blank_p:V \l__gpr_main_index_entry_style_tl }
+ { | \tl_use:N \l__gpr_main_index_entry_style_tl }
+ }
+}
+\cs_generate_variant:Nn \gpr_add_to_named_index:nnN {
+ VVN, VeN
+}
+
+\cs_new:Nn \gpr_build_index_entry:Nnnn {
+ \seq_clear:N \l_tmpa_seq
+ \clist_map_inline:nn {#2} {
+ \tl_if_blank:vF { l__gpr_##1_tl } {
+ \seq_put_right:Nv \l_tmpa_seq { l__gpr_##1_tl }
+ }
+ }
+
+ \seq_clear:N \l_tmpb_seq
+ \clist_map_inline:nn {#3} {
+ \tl_if_blank:vF { l__gpr_##1_tl } {
+ \seq_put_right:Nv \l_tmpb_seq { l__gpr_##1_tl }
+ }
+ }
+
+ \tl_set:Ne #1 {
+ \seq_use:Nn \l_tmpa_seq {~}
+ \bool_if:NTF \l__gpr_nest_index_entries_bool { ! } { ,~ }
+ \seq_use:Nn \l_tmpb_seq {~}
+ \bool_if:NT \l__gpr_id_in_index_entries_bool { ~ (#4) }
+ }
+}
+
+\cs_new:Nn \gpr_add_to_indexes:nN
+{
+ \tl_if_blank:VF \l__gpr_id_index_tl {
+ \tl_if_novalue:nF {#1} {
+ \gpr_add_to_named_index:VeN \l__gpr_id_index_tl
+ { #1 ~ \tl_use:N \l__gpr_fullname_tl }
+ #2
+ }
+ }
+
+ \tl_if_blank:VF \l__gpr_fullname_index_tl {
+ \gpr_add_to_named_index:VVN
+ \l__gpr_fullname_index_tl
+ {
+ \tl_use:N \l__gpr_fullname_tl
+ \bool_if:NT \l__gpr_id_in_index_entries_bool { ~ (\tl_use:N #1) }
+ }
+ #2
+ }
+
+ \tl_if_blank:VF \l__gpr_patronymic_index_tl {
+ \tl_if_blank:VF \l__gpr_patronymic_tl {
+ \gpr_build_index_entry:Nnnn \l_tmpa_tl
+ { patronymic, surname, byname }
+ { givenname }
+ { #1 }
+
+ \gpr_add_to_named_index:VVN \l__gpr_patronymic_index_tl \l_tmpa_tl #2
+ }
+ }
+ \tl_if_blank:VF \l__gpr_surname_index_tl {
+ \tl_if_blank:VF \l__gpr_surname_tl {
+ \gpr_build_index_entry:Nnnn \l_tmpa_tl
+ { surname, byname }
+ { givenname, patronymic }
+ { #1 }
+
+ \gpr_add_to_named_index:VVN \l__gpr_surname_index_tl \l_tmpa_tl #2
+ }
+ }
+ \tl_if_blank:VF \l__gpr_byname_index_tl {
+ \tl_if_blank:VF \l__gpr_byname_tl {
+ \gpr_build_index_entry:Nnnn \l_tmpa_tl
+ { byname }
+ { givenname, patronymic, surname }
+ { #1 }
+
+ \gpr_add_to_named_index:VVN \l__gpr_byname_index_tl \l_tmpa_tl #2
+ }
+ }
+}
+\cs_generate_variant:Nn \gpr_add_to_indexes:nN {
+ VN
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Styling
+%
+
+\cs_new_protected:Nn \gpr_style_name:N
+{
+ \seq_clear_new:N \l__gpr_styled_name_seq
+
+ \seq_map_inline:Nn \g__gpr_name_part_order_seq {
+ \tl_if_blank:vF { l__gpr_##1_tl } {
+ \seq_put_right:Nn \l__gpr_styled_name_seq {
+ \group_begin:
+ \tl_use:c { l__gpr_##1_style_tl }
+ \tl_use:c { l__gpr_##1_tl }
+ \group_end:
+ }
+ }
+ }
+
+ \tl_set:Nn #1 { \seq_use:Nn \l__gpr_styled_name_seq {~} }
+}
+
+\cs_new_protected:Nn \gpr_format_floruit:N
+{
+ \int_compare:nNnTF { \seq_count:N \l__gpr_floruit_years_seq } = {1}
+ {
+ \tl_set:Ne #1 { floruit- = { \seq_item:Nn \l__gpr_floruit_years_seq {1} } }
+ }
+ {
+ \int_zero_new:N \l__gpr_floruit_from_int
+ \int_set:Nn \l__gpr_floruit_from_int { 9999 }
+ \int_zero_new:N \l__gpr_floruit_to_int
+ \int_set:Nn \l__gpr_floruit_to_int { 0000 }
+ \seq_map_inline:Nn \l__gpr_floruit_years_seq {
+ \int_set:Nn \l__gpr_floruit_from_int
+ { \int_min:nn {##1} { \l__gpr_floruit_from_int } }
+ \int_set:Nn \l__gpr_floruit_to_int
+ { \int_max:nn {##1} { \l__gpr_floruit_to_int } }
+ }
+ \tl_set:Ne #1 {
+ floruit- = {
+ \int_use:N \l__gpr_floruit_from_int / \int_use:N \l__gpr_floruit_to_int
+ }
+ }
+ }
+}
+
+\cs_new_protected:Nn \gpr_super_subscript:nn
+{
+ \group_begin:
+ \hbox_set:Nn \l_tmpa_box { \textsuperscript {#1} }
+ \hbox_set:Nn \l_tmpb_box { \textsubscript {#2} }
+ \hbox_to_wd:nn
+ { \dim_max:nn { \box_wd:N \l_tmpa_box } { \box_wd:N \l_tmpb_box } }
+ { \hbox_overlap_right:n { \box_use:N \l_tmpa_box } \box_use:N \l_tmpb_box }
+ \group_end:
+}
+
+\cs_new_protected:Nn \gpr_typeset_reference:nnnN
+{
+ \property_if_recorded:nTF { gpr/#1/target }
+ {
+ \hyperlink{ \property_ref:nn { gpr/#1/target } { target } } {
+ \gpr__reference_style_handler:nnn {
+ \tl_if_blank:nTF { #3 } { #2 } {
+ % render styled #3 if present
+ \group_begin:
+ \gpr_name_handler:n {#3}
+ \tl_use:N \l__gpr_styled_name_tl
+ \group_end:
+ }
+ } {
+ #1
+ } {
+ \gpr__page_number_handler:n {
+ \property_ref:nnn { gpr/#1/target } { page } {
+ \gpr__unknown_reference_handler:nV { \bfseries ?? } \c_novalue_tl
+ }
+ }
+ }
+ }
+ }
+ {
+ \gpr_warning:nn { unknown-reference-id } { #1 }
+ \gpr__unknown_reference_handler:nn {#2} { unknown~id: ~ #1 }
+ }
+ \bool_if:NF #4 {
+ \gpr_add_to_indexes:nN { #1 } \c_false_bool
+ }
+ \gpr_save_reference:Vn \l__gpr_id_tl { #1 }
+}
+\cs_generate_variant:Nn \gpr_typeset_reference:nnnN {
+ nVnN, VVnN
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% genealogytree package integration
+%
+
+\cs_new_protected:Nn \gpr_set_genealogytree_keys:n
+{
+ \gtrset{ database/.cd, #1 }
+}
+\cs_generate_variant:Nn \gpr_set_genealogytree_keys:n {
+ V
+}
+
+\prg_new_protected_conditional:Nnn \gpr_if_lifespan_defined: {T,F,TF}
+{
+ \bool_if:nTF {
+ ( \cs_if_exist_p:c { gtrDBbirthyear }
+ || \cs_if_exist_p:c { gtrDBbaptismyear } )
+ &&
+ ( \cs_if_exist_p:c { gtrDBdeathyear }
+ || \cs_if_exist_p:c { gtrDBburialyear } )
+ } {
+ \prg_return_true:
+ } {
+ \prg_return_false:
+ }
+}
+
+\gtrDeclareDatabaseFormat{gtr_db_format}{}{%
+ \begin{gtrprintlist}{\par}{\unskip,\ }{\unskip.}{\unskip}%
+ \gtr@list@event{birth}%
+ \gtr@list@event{baptism}%
+ \gpr_if_lifespan_defined:F {
+ \gtr@list@event{floruit}
+ }
+ \gtr@list@event{death}%
+ \gtr@list@event{burial}%
+ \end{gtrprintlist}%
+ \gtr@print@infolist%
+}
+\gtrset{database~format=gtr_db_format}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% User commands
+%
+
+\NewDocumentEnvironment { gprProfile* } { m O{} } {
+ \bool_if:NT \l__gpr_debug_log_bool {
+ \tl_log:e {\the\inputlineno}
+ \tl_log:n {BEGIN ~ #1}
+ }
+ \group_begin:
+ \keys_set:nn { genealogy-profiles / profile } { #1, life~events={#2} }
+
+ \tl_if_empty:NTF \l__gpr_fullname_tl {
+ % if no full name supplied, build one from given parts
+ \seq_clear:N \l_tmpa_seq
+ \seq_map_inline:Nn \g__gpr_name_part_order_seq {
+ \tl_if_blank:vF { l__gpr_##1_tl } {
+ \seq_put_right:Nv \l_tmpa_seq { l__gpr_##1_tl }
+ }
+ }
+ \tl_set:Ne \l__gpr_fullname_tl { \seq_use:Nn \l_tmpa_seq {~} }
+ \tl_set_eq:NN \l__gpr_fullname_raw_tl \l__gpr_fullname_tl
+ \tl_clear_new:N \l__gpr_styled_name_tl
+ \gpr_style_name:N \l__gpr_styled_name_tl
+ } {
+ % otherwise use full name to split into parts
+ \tl_set_eq:NN \l__gpr_fullname_raw_tl \l__gpr_fullname_tl
+ \gpr_name_handler:V \l__gpr_fullname_tl
+ }
+
+ % ensure unique id
+ \tl_if_empty:NTF \l__gpr_id_tl {
+ \bool_if:NTF \l__gpr_autoid_bool {
+ \gpr_generate_unique_id:
+ } {
+ \gpr_error:nn { missing-id } { \l__gpr_fullname_tl }
+ }
+ } {
+ \seq_if_in:NVT \g__gpr_used_profile_ids_seq \l__gpr_id_tl {
+ \gpr_error:nn { reused-id } { \l__gpr_id_tl }
+ }
+ \seq_gput_right:NV \g__gpr_used_profile_ids_seq \l__gpr_id_tl
+ }
+ \gpr_map_name_to_id:NVV \g__gpr_name_to_id_prop \l__gpr_fullname_raw_tl \l__gpr_id_tl
+ \gpr_map_name_to_id:NVV \g__gpr_name_to_id_active_prop \l__gpr_fullname_raw_tl \l__gpr_id_tl
+
+ % store raw name in aux
+ \property_record:ee { gpr/\tl_use:N \l__gpr_id_tl/name } { raw-name }
+
+ % init floruit years
+ \property_if_recorded:enT { gpr/\tl_use:N \l__gpr_id_tl/floruit } { floruit-years } {
+ \tl_set:Ne \l_tmpa_tl {
+ \property_ref:ee { gpr/\tl_use:N \l__gpr_id_tl/floruit } { floruit-years }
+ }
+ \seq_set_split:NnV \l__gpr_floruit_years_seq {,} \l_tmpa_tl
+
+ \tl_clear_new:N \l__formatted_gpr_floruit_tl
+ \gpr_format_floruit:N \l__formatted_gpr_floruit_tl
+ \tl_put_right:Ne \l__gpr_life_events_tl {
+ ,
+ \tl_use:N \l__formatted_gpr_floruit_tl
+ }
+ }
+ \seq_clear_new:N \l__gpr_floruit_years_seq
+
+ % placeholders for id and names
+ \cs_set:Npe \gprID { \tl_use:N \l__gpr_id_tl }
+ \cs_set:Npe \gprStyledName { \tl_use:N \l__gpr_styled_name_tl }
+ \cs_set:Npe \gprFullName { \tl_use:N \l__gpr_fullname_tl }
+ \cs_set:Npe \gprGivenName { \tl_use:N \l__gpr_givenname_tl }
+ \cs_set:Npe \gprPatronymic { \tl_use:N \l__gpr_patronymic_tl }
+ \cs_set:Npe \gprSurname { \tl_use:N \l__gpr_surname_tl }
+ \cs_set:Npe \gprByname { \tl_use:N \l__gpr_byname_tl }
+ \cs_set:Npe \gprHeader { \tl_use:N \l__gpr_header_format_tl }
+
+ % set hyperref target just before typesetting
+ \MakeLinkTarget*{ gpr/\tl_use:N \l__gpr_id_tl/target }
+
+ % begin typesetting
+ \tl_use:N \l__gpr_begin_profile_tl
+
+ % record properties for id
+ \property_record:ee { gpr/\tl_use:N \l__gpr_id_tl/target } { page, target }
+
+ % add to indexes unless key set
+ \bool_if:NF \l__gpr_no_index_bool {
+ \gpr_add_to_indexes:VN \l__gpr_id_tl \c_true_bool
+ }
+
+ \bool_if:NT \l__gpr_auto_header_bool {
+ \tl_use:N \l__gpr_begin_header_tl
+ \tl_use:N \l__gpr_header_format_tl
+ \tl_use:N \l__gpr_end_header_tl
+ }
+
+ % typeset life events
+ \tl_if_empty:NF \l__gpr_life_events_tl {
+ \tl_use:N \l__gpr_begin_life_events_tl
+
+ \gpr_set_genealogytree_keys:V \l__gpr_life_events_tl
+ \gtrPrintDatabase
+
+ \tl_use:N \l__gpr_end_life_events_tl
+ }
+}{
+ % end typesetting
+ \tl_use:N \l__gpr_end_profile_tl
+
+ % save floruit years including updates from \gprYear
+ \seq_if_empty:NF \l__gpr_floruit_years_seq {
+ \property_record:ee { gpr/\tl_use:N \l__gpr_id_tl/floruit } { floruit-years }
+ }
+ \group_end:
+ \bool_if:NT \l__gpr_debug_log_bool {
+ \tl_log:e {\the\inputlineno}
+ \tl_log:n {END ~ #1}
+ }
+}
+
+\NewDocumentEnvironment { gprProfile } { O{} m O{} } {
+ \begin{gprProfile*}{fullname={#2}, #1}[#3]
+}{
+ \end{gprProfile*}
+}
+
+\cs_new_protected:Nn \gpr_cmd_ref:Nnn
+{
+ \group_begin:
+ \tl_if_empty:nTF {#2}
+ {
+ % no id provided, so we use the name to try looking it up
+ \gpr_name_handler:n { #3 }
+ \prop_get:NnNTF \g__gpr_name_to_id_active_prop {#3} \l_tmpa_tl
+ {
+ \str_if_eq:VnTF \l_tmpa_tl {_AMBIGUOUS_}
+ {
+ \gpr_warning:nn { ambiguous-reference } { \l__gpr_fullname_tl }
+ \gpr__unknown_reference_handler:Vn \l__gpr_styled_name_tl
+ { ambiguous }
+ \bool_if:NT \l__gpr_include_ambiguous_in_index_bool {
+ \gpr_add_to_indexes:nN { ambiguous } \c_false_bool
+ }
+ }
+ {
+ \gpr_typeset_reference:VVnN \l_tmpa_tl \l__gpr_styled_name_tl {} #1
+ }
+ }
+ {
+ \gpr_warning:nn { unknown-reference-name } { #3 }
+ \gpr__unknown_reference_handler:Vn \l__gpr_styled_name_tl { unknown~name }
+ \bool_if:NT \l__gpr_include_unknown_in_index_bool {
+ \gpr_add_to_indexes:nN { unknown } \c_false_bool
+ }
+ }
+ }
+ {
+ % id provided, find the name to use for indexes
+ \property_if_recorded:nTF { gpr/#2/name } {
+ \gpr_name_handler:e {
+ \property_ref:nn { gpr/#2/name } { raw-name }
+ }
+ } {
+ \gpr_name_handler:n {#3}
+ }
+ \gpr_typeset_reference:nVnN {#2} \l__gpr_styled_name_tl {#3} #1
+ }
+ \group_end:
+}
+\cs_generate_variant:Nn \gpr_cmd_ref:Nnn {
+ Nee
+}
+\NewDocumentCommand { \gprRef } { s O{} m } {
+ \gpr_cmd_ref:Nee #1 {#2} {#3}
+}
+
+
+\NewDocumentCommand { \gprName } { s m } {
+ \group_begin:
+ \gpr_name_handler:n { #2 }
+ \tl_use:N \l__gpr_styled_name_tl
+ \bool_if:nT { !#1 && \l__gpr_include_unknown_in_index_bool }
+ {
+ \bool_set_false:N \l__gpr_id_in_index_entries_bool
+ \gpr_add_to_indexes:nN { unknown } \c_false_bool
+ }
+ \group_end:
+}
+
+
+\cs_new_protected:Nn \gpr_cmd_year:n
+{
+ % record floruit year
+ \seq_if_in:NnF \l__gpr_floruit_years_seq {#1} {
+ \seq_gput_right:Nn \l__gpr_floruit_years_seq {#1}
+ }
+}
+\cs_generate_variant:Nn \gpr_cmd_year:n {
+ e
+}
+\NewDocumentCommand { \gprYear } { s m } {
+ \gpr_cmd_year:e {#2}
+ \bool_if:NF { #1 } { #2 }
+}
+
+
+\cs_new_protected:Nn \gpr_cmd_years:n
+{
+ % split year range
+ \seq_set_split:Nnn \l_tmpa_seq { - } {#1}
+
+ % first year
+ \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+ \seq_if_in:NVF \l__gpr_floruit_years_seq \l_tmpa_tl {
+ \seq_gput_right:NV \l__gpr_floruit_years_seq \l_tmpa_tl
+ }
+
+ % last year
+ \seq_pop_right:NN \l_tmpa_seq \l_tmpb_tl
+ \int_set:Nn \l_tmpa_int { \tl_count:N \l_tmpa_tl - \tl_count:N \l_tmpb_tl }
+ \tl_put_left:Ne \l_tmpb_tl {
+ \tl_range:Nnn \l_tmpa_tl { 1 } { \l_tmpa_int }
+ }
+ \seq_if_in:NVF \l__gpr_floruit_years_seq \l_tmpb_tl {
+ \seq_gput_right:NV \l__gpr_floruit_years_seq \l_tmpb_tl
+ }
+}
+\cs_generate_variant:Nn \gpr_cmd_years:n {
+ e
+}
+\NewDocumentCommand { \gprYears } { s m } {
+ \gpr_cmd_years:e {#2}
+ \bool_if:NF { #1 } { #2 }
+}
+
+
+\NewDocumentCommand { \gprSpouse } { s o m o } {
+ \gtrsymMarried{} ~
+ \IfValueT{#4} { #4 ~ }
+ \IfBooleanTF {#1} {
+ \gprRef*[#2]{#3}
+ } {
+ \gprRef[#2]{#3}
+ }
+} \ No newline at end of file
diff --git a/macros/latex/contrib/hvlogos/Changes b/macros/latex/contrib/hvlogos/Changes
index b1284adf8a..8435c80248 100644
--- a/macros/latex/contrib/hvlogos/Changes
+++ b/macros/latex/contrib/hvlogos/Changes
@@ -1,4 +1,5 @@
hvlogos.sty:
+0.12 2024-01-24 - fix for introduced bug
0.11 2024-01-23 - do not load a mathfont
0.10 2023-10-16 - changed \MetaPost to \MP
0.09 2022-05-06 - changed almost all \def to \providecommand
diff --git a/macros/latex/contrib/hvlogos/doc/hvlogos-doc.pdf b/macros/latex/contrib/hvlogos/doc/hvlogos-doc.pdf
index 487250e33f..4fa98b55c7 100644
--- a/macros/latex/contrib/hvlogos/doc/hvlogos-doc.pdf
+++ b/macros/latex/contrib/hvlogos/doc/hvlogos-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/hvlogos/latex/hvlogos.sty b/macros/latex/contrib/hvlogos/latex/hvlogos.sty
index ef9dfdc5b8..bfdf9332b0 100644
--- a/macros/latex/contrib/hvlogos/latex/hvlogos.sty
+++ b/macros/latex/contrib/hvlogos/latex/hvlogos.sty
@@ -10,19 +10,19 @@
%
%
% -------------------------------------
-\ProvidesPackage{hvlogos}[2024/01/23 v. 0.11 Logos (hv)]
+\ProvidesPackage{hvlogos}[2024/01/24 v. 0.12 Logos (hv)]
%
\newif\if@dtk@newengine \@dtk@newenginetrue
%
\RequirePackage{fetamont,hologo,dantelogo,xspace,expl3}
-%\ifluatex\else\ifxetex\else\@dtk@newenginefalse\fi\fi
-%\if@dtk@newengine
-% \RequirePackage{unicode-math}
-% \setmathfont{LatinModernMath-Regular}
-% \setmathfont[version=XITS]{XITSMath-Regular.otf}
-%\fi
+\ifluatex\else\ifxetex\else\@dtk@newenginefalse\fi\fi
+\if@dtk@newengine
+ \RequirePackage{unicode-math}
+ \setmathfont[version=LM]{LatinModernMath-Regular}
+ \setmathfont[version=XITS]{XITSMath-Regular.otf}
+\fi
%
\iffalse
\DeclareRobustCommand\ffmfamily{\not@math@alphabet\ffmfamily\relax
@@ -41,6 +41,7 @@
{ L%
\ifx\f@family\sfdefault\kern#1\else\kern\dimexpr#1+0.02em\relax\fi
\begingroup
+ \if@dtk@newengine\mathversion{LM}\fi
\setbox\ltx@zero\hbox{T}%
\vbox to\ht\ltx@zero{%
\hbox{%
@@ -49,7 +50,8 @@
}{%
\check@mathfonts
\fontsize\sf@size{0pt}%
- \math@fontsfalse\selectfont
+ \math@fontsfalse
+ \selectfont
}%
A%
}%
@@ -77,13 +79,14 @@
\providecommand\AmSTeX{\mbox{\textsf{AMS}-\hologo{TeX}}}
\DeclareRobustCommand\Biber{\textsf{Biber}\xspace}
\let\biber\Biber
-\DeclareRobustCommand{\BibLaTeXML}{B\kern-.05em%
- \hbox{$\m@th$% %% force math size calculations
- \csname S@\f@size\endcsname
- \fontsize\sf@size\z@
- \math@fontsfalse\selectfont
- I\kern-.025emB}%
- \kern-.08em\-\LaTeX{}ML}
+\DeclareRobustCommand\BibLaTeXML{\BibLaTeX{}ML}
+%\kern-.05em%
+% \hbox{$\m@th$% %% force math size calculations
+% \csname S@\f@size\endcsname
+% \fontsize\sf@size\z@
+% \math@fontsfalse\selectfont
+% I\kern-.025emB}%
+% \kern-.08em\-\LaTeX{}ML}
\DeclareRobustCommand\BibTeX{\@ifnextchar8\@@BibTeX\@BibTeX}
\def\@BibTeX{{\hologoLogoSetup{BibTeX}{variant=sc}\hologo{BibTeX}}}
\providecommand\BibTeXacht{{\hologoLogoSetup{BibTeX8}{variant=sc}\hologo{BibTeX8}}}