summaryrefslogtreecommitdiff
path: root/macros/latex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-05-10 03:00:55 +0000
committerNorbert Preining <norbert@preining.info>2024-05-10 03:00:55 +0000
commit889ef8595dafee235cb1106ec4efbdd3169481c2 (patch)
tree45863693da937beb703aee0e4407cc51cfc9956b /macros/latex
parent1feed955eca29818ea536dba591c12b7b3b55003 (diff)
CTAN sync 202405100300
Diffstat (limited to 'macros/latex')
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/README3
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdfbin411119 -> 412844 bytes
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex29
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx41
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx4
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx2
-rw-r--r--macros/latex/contrib/easybook/easybook.dtx25
-rw-r--r--macros/latex/contrib/easybook/easybook.pdfbin630817 -> 631693 bytes
-rw-r--r--macros/latex/contrib/easybook/easybook.tex11
-rw-r--r--macros/latex/contrib/univie-ling/README6
-rw-r--r--macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx2
-rw-r--r--macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx2
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdfbin130780 -> 132626 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdfbin126894 -> 127848 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdfbin200672 -> 201366 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex1
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdfbin200676 -> 200967 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex1
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdfbin158161 -> 172478 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdfbin154403 -> 167579 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdfbin227166 -> 227174 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdfbin224973 -> 224980 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdfbin171777 -> 190196 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdfbin168772 -> 186339 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdfbin372040 -> 250470 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdfbin371831 -> 250366 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdfbin457978 -> 458151 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex10
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdfbin448122 -> 448221 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex7
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdfbin454263 -> 455332 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex16
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdfbin450725 -> 454323 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex53
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdfbin458988 -> 459107 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex6
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdfbin345784 -> 345852 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex14
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling.pdfbin365425 -> 365602 bytes
-rw-r--r--macros/latex/contrib/univie-ling/doc/univie-ling.tex2
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls20
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls47
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls73
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls70
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls21
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg12
-rw-r--r--macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls43
-rw-r--r--macros/latex/contrib/ximera/LICENSE339
-rw-r--r--macros/latex/contrib/ximera/Makefile50
-rw-r--r--macros/latex/contrib/ximera/README.md62
-rw-r--r--macros/latex/contrib/ximera/installingLocally.md91
-rw-r--r--macros/latex/contrib/ximera/pgfsys-ximera.def62
-rw-r--r--macros/latex/contrib/ximera/src/abstract.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/activity.dtx158
-rw-r--r--macros/latex/contrib/ximera/src/answer.dtx111
-rw-r--r--macros/latex/contrib/ximera/src/banner.dtx21
-rw-r--r--macros/latex/contrib/ximera/src/choice.dtx226
-rw-r--r--macros/latex/contrib/ximera/src/clearEnv.dtx18
-rw-r--r--macros/latex/contrib/ximera/src/dialogue.dtx28
-rw-r--r--macros/latex/contrib/ximera/src/ending.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/enumerate.dtx10
-rw-r--r--macros/latex/contrib/ximera/src/feedback.dtx72
-rw-r--r--macros/latex/contrib/ximera/src/foldable.dtx76
-rw-r--r--macros/latex/contrib/ximera/src/footnotes.dtx63
-rw-r--r--macros/latex/contrib/ximera/src/freeresponse.dtx60
-rw-r--r--macros/latex/contrib/ximera/src/graded.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/hideEnv.dtx36
-rw-r--r--macros/latex/contrib/ximera/src/hints.dtx53
-rw-r--r--macros/latex/contrib/ximera/src/html.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/hyperref.dtx12
-rw-r--r--macros/latex/contrib/ximera/src/image.dtx60
-rw-r--r--macros/latex/contrib/ximera/src/instructornotes.dtx101
-rw-r--r--macros/latex/contrib/ximera/src/interactives/desmos.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/interactives/geogebra.dtx27
-rw-r--r--macros/latex/contrib/ximera/src/interactives/google.dtx26
-rw-r--r--macros/latex/contrib/ximera/src/interactives/graph.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/interactives/include.dtx22
-rw-r--r--macros/latex/contrib/ximera/src/interactives/javascript.dtx31
-rw-r--r--macros/latex/contrib/ximera/src/interactives/sagemath.dtx43
-rw-r--r--macros/latex/contrib/ximera/src/interactives/video.dtx21
-rw-r--r--macros/latex/contrib/ximera/src/jax.dtx115
-rw-r--r--macros/latex/contrib/ximera/src/labels.dtx15
-rw-r--r--macros/latex/contrib/ximera/src/leash.dtx18
-rw-r--r--macros/latex/contrib/ximera/src/link.dtx31
-rw-r--r--macros/latex/contrib/ximera/src/logo.dtx30
-rw-r--r--macros/latex/contrib/ximera/src/macros.dtx14
-rw-r--r--macros/latex/contrib/ximera/src/makeCounter.dtx37
-rw-r--r--macros/latex/contrib/ximera/src/metadata.dtx32
-rw-r--r--macros/latex/contrib/ximera/src/only.dtx38
-rw-r--r--macros/latex/contrib/ximera/src/options.dtx123
-rw-r--r--macros/latex/contrib/ximera/src/optionsxourse.dtx27
-rw-r--r--macros/latex/contrib/ximera/src/outcomes.dtx34
-rw-r--r--macros/latex/contrib/ximera/src/packages.dtx54
-rw-r--r--macros/latex/contrib/ximera/src/pagesetup.dtx55
-rw-r--r--macros/latex/contrib/ximera/src/problem.dtx197
-rw-r--r--macros/latex/contrib/ximera/src/proof.dtx10
-rw-r--r--macros/latex/contrib/ximera/src/sectioning.dtx49
-rw-r--r--macros/latex/contrib/ximera/src/solution.dtx30
-rw-r--r--macros/latex/contrib/ximera/src/suppress.dtx33
-rw-r--r--macros/latex/contrib/ximera/src/textcolor.dtx20
-rw-r--r--macros/latex/contrib/ximera/src/theorems.dtx174
-rw-r--r--macros/latex/contrib/ximera/src/tikzexport.dtx42
-rw-r--r--macros/latex/contrib/ximera/src/title.dtx122
-rw-r--r--macros/latex/contrib/ximera/src/ungraded.dtx22
-rw-r--r--macros/latex/contrib/ximera/src/utilitymacros.dtx45
-rw-r--r--macros/latex/contrib/ximera/src/verbatim.dtx36
-rw-r--r--macros/latex/contrib/ximera/src/xkcd.dtx13
-rw-r--r--macros/latex/contrib/ximera/ximera.dtx362
-rw-r--r--macros/latex/contrib/ximera/ximera.ins211
-rw-r--r--macros/latex/contrib/ximera/ximera.pdfbin0 -> 321122 bytes
110 files changed, 4350 insertions, 141 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/README b/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
index 10c4d180a9..3cebed7b7b 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/README
@@ -46,6 +46,9 @@ instructions.
== CHANGES ==
+* V. 2.9 (2025-05-09):
+ - Add bibchecks to exclude (specific kinds of) unpublished work.
+
* V. 2.8 (2024-03-08):
- Fix delimiter with plauthor second in a truncated author list (#50).
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
index 2fd5c90dbe..fb8333ecf7 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
Binary files differ
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
index 19b80cb4f2..aa64fc9861 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
@@ -115,7 +115,7 @@
\thanks{Please report issues via \protect\url{https://github.com/jspitz/biblatex-publist}.}%
}
-\date{Version 2.8, 2024/03/08}
+\date{Version 2.9, 2025/05/09}
\maketitle
\begin{abstract}
@@ -862,6 +862,28 @@ entries of diverse type and authors, specify:
Note that this method sometimes requires several reruns of \texttt{latex}
to fix the numbering.
+Sometimes you might also want to omit some publications from the list which are not yet
+published or not yet accepted (e.g., because they are under blind review and you do not
+want to reveal your identity yet). To this end, \bpl\ features some \joption{bibchecks}
+(for the concept, please refer to \cite[sec.~3.8.2]{bibltx}). Bibchecks can be activated
+by passing \joption{check=<bibcheck>} to the optional argument of \jfcsmacro{printbibliography}.
+
+The following bibchecks are available:
+\begin{itemize}
+ \item \joption{nosubmitted}: omits all entries with pubstate \joption{submitted}.
+ \item \joption{noprepared}: omits all entries with pubstate \joption{inpreparation}.
+ \item \joption{onlypublished}: omits all unpublished entries (i.e., entries that have
+ a pubstate) with the exception of \joption{prepublished} entries.
+ \item \joption{onlyaccepted}: omits all unpublished entries (i.e., entries that have
+ a pubstate) with the exception of \joption{prepublished} and \joption{forthcoming}
+ (and thus accepted) entries.
+\end{itemize}
+%
+Several of these bibchecks might be used in a row, e.g.:
+\begin{lstlisting}[moretexcs={[1]{printbibliography}}]
+\printbibliography[heading=none,filter=mine,check=nosubmitted,check=noprepared]
+\end{lstlisting}
+
\section{Sorting\label{sec:sorting}}
@@ -942,6 +964,11 @@ until further change).
\section{Revision Log}
\begin{description}
+ \item [{V. 2.9 (2025/05/09):}]~
+ \begin{itemize}
+ \item Add bibchecks to exclude (specific kinds of) unpublished work
+ (see sec.~\ref{sec:filtering}).
+ \end{itemize}
\item [{V. 2.8 (2024/03/08):}]~
\begin{itemize}
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
index 7e955db150..c7d385b452 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
@@ -25,8 +25,8 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\bpl@version{2.8}
-\def\bpl@rdate{2024/03/08}
+\def\bpl@version{2.9}
+\def\bpl@rdate{2025/05/09}
\ProvidesFile{publist.bbx}[\bpl@rdate\space v.\bpl@version\space
biblatex bibliography style (JSP)]
@@ -1105,6 +1105,43 @@
\defbibfilter{mine}{category=filtered}
+%
+% bibchecks
+%
+% check to exclude submitted work (which is under review)
+% from publist
+\defbibcheck{nosubmitted}{%
+ \edef\tmpps{\bibstring{submitted}}%
+ \iffieldequals{pubstate}{\tmpps}{\skipentry}{}%
+}
+
+% check to exclude work in preparation
+% from publist
+\defbibcheck{noprepared}{%
+ \edef\tmpps{\bibstring{inpreparation}}%
+ \iffieldequals{pubstate}{\tmpps}{\skipentry}{}%
+}
+
+% check to exclude all work which is not (pre-)published
+\defbibcheck{onlypublished}{%
+ \iffieldundef{pubstate}{}{%
+ \edef\tmpps{\bibstring{prepublished}}%
+ \iffieldequals{pubstate}{\tmpps}{}{\skipentry}%
+ }%
+}
+
+% check to exclude all work which is not accepted or published
+\defbibcheck{onlyaccepted}{%
+ \iffieldundef{pubstate}{}{%
+ \edef\tmpps{\bibstring{prepublished}}%
+ \edef\tmppss{\bibstring{forthcoming}}%
+ \iffieldequals{pubstate}{\tmpps}{}{%
+ \iffieldequals{pubstate}{\tmppss}{}{%
+ \skipentry}%
+ }%
+ }%
+}
+
%
% Count non-plauthors
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
index d1b46b1ab9..bfc159a131 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
@@ -26,8 +26,8 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\bpl@version{2.8}
-\def\bpl@rdate{2024/03/08}
+\def\bpl@version{2.9}
+\def\bpl@rdate{2025/05/09}
\ProvidesFile{publist.cbx}[\bpl@rdate\space v.\bpl@version\space
biblatex citation style (JSP)]
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
index 87aebdbf2b..d43f60a465 100644
--- a/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.dbx
@@ -1,5 +1,5 @@
% publist.dbx, biblatex data model specification for the biblatex-publist
-% package, version 2.8 (2024/03/08).
+% package, version 2.9 (2025/05/09).
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
diff --git a/macros/latex/contrib/easybook/easybook.dtx b/macros/latex/contrib/easybook/easybook.dtx
index ff41382cdc..1396d311ba 100644
--- a/macros/latex/contrib/easybook/easybook.dtx
+++ b/macros/latex/contrib/easybook/easybook.dtx
@@ -14,7 +14,7 @@
% This work has the LPPL maintenance status `maintained'.
%<*class>
\NeedsTeXFormat{LaTeX2e}[2021/11/15]
-\ProvidesExplClass{easybook}{2024/05/08}{2024bl}
+\ProvidesExplClass{easybook}{2024/05/09}{2024bm}
{Easily typesetting Chinese theses or books}
\bool_new:N \l__eb_compile_draft_bool
@@ -301,7 +301,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}[2021/11/15]
\RequirePackage{etoolbox}
-\ProvidesExplPackage{easybase}{2024/05/08}{2024bl}
+\ProvidesExplPackage{easybase}{2024/05/09}{2024bm}
{Easily typesetting Chinese theses or books}
\cs_generate_variant:Nn \dim_set:Nn { NV }
@@ -1607,11 +1607,8 @@
\tl_new:N \l__eb_toc_tmpb_tl
\cs_new_protected:Npn \eb_toc_format_initial:nn #1#2
{
- \exp_last_unbraced:Nx
- \use:n
+ \exp_last_unbraced:Nx \titlecontents
{
- \exp_not:N
- \titlecontents
\tl_use:N \l__eb_toc_tmpa_tl
\exp_not:n
{
@@ -1677,6 +1674,18 @@
}
}
}
+\eb_seq_map_inline:nn
+ { tocafter,tocindent,tocrule }
+ {
+ \ctex_define:nn { toc }
+ {
+ #1-every .code:n =
+ {
+ \seq_map_inline:Nn \c__ctex_headings_seq
+ { \ctex_set:n { ####1/#1 = {##1} } }
+ }
+ }
+ }
\NewDocumentCommand{\tocrule}{st-O{0.7pc}d()mO{}}
{
\normalsize\normalfont
@@ -1926,7 +1935,7 @@
caption-every = {#1},footnote = {#1}
},
abovedisplayskip .code:n =
- {\AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}}},
+ { \AfterPreamble{\skip_set:Nn \abovedisplayskip {#1}} },
abovedisplayskip .initial:n = 0.5ex plus .1ex minus .1ex,
belowdisplayskip .code:n =
{
@@ -2531,7 +2540,7 @@
}
%</package>
%<*tcolorbox>
-\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/08}{2024bl}
+\ProvidesExplFile{eb-tcolorbox.cfg}{2024/05/09}{2024bm}
{Customization of tcolorbox for easybook}
\cs_set_protected:Npn \addtotcbstyle #1#2
diff --git a/macros/latex/contrib/easybook/easybook.pdf b/macros/latex/contrib/easybook/easybook.pdf
index 2219c5c382..2a0e3e57c1 100644
--- a/macros/latex/contrib/easybook/easybook.pdf
+++ b/macros/latex/contrib/easybook/easybook.pdf
Binary files differ
diff --git a/macros/latex/contrib/easybook/easybook.tex b/macros/latex/contrib/easybook/easybook.tex
index b65eede305..7bc19cadd5 100644
--- a/macros/latex/contrib/easybook/easybook.tex
+++ b/macros/latex/contrib/easybook/easybook.tex
@@ -23,8 +23,8 @@
name = easybook,
color-scheme = blue,
title = EASYBOOK使用手册,
- version = v2024bl,
- date = 2024/05/08,
+ version = v2024bm,
+ date = 2024/05/09,
authors = 瞿毅,
info = 简便地排版中文学ä½è®ºæ–‡æˆ–书ç±,
email = toquyi@163.com,
@@ -976,6 +976,12 @@
将目录页ç è£…进一个å³å¯¹é½çš„水平盒å­é‡Œã€‚这样å¯ä»¥ä½¿ç›®å½•å¼•å¯¼çº¿å³ç«¯å¯¹é½å¹¶ä¸Žé¡µç ä¿æŒä¸€å®šé—´è·ï¼Œå¦åˆ™ä¼šä¸Žé¡µç ç›¸è¿žã€‚
\keyval{pagenumwd}{刚性长度}\Default{1.55em}
è®¾ç½®å¼€å¯ \option{dotalign} 选项时页ç æ°´å¹³ç›’å­çš„宽度。
+ \keyval{tocafter-every}{è·ç¦»å‘½ä»¤}\Default{\cs*{hspace}\Marg{1em}}
+ 统一设置所有类型æ¡ç›®ç¼–å·ä¸Žæ ‡é¢˜é—´çš„代ç ï¼ˆä»…支æŒä¸Šè¿°é¢„注册的æ¡ç›®ï¼‰ã€‚
+ \keyval{tocindent-every}{刚性长度}
+ 统一设置所有类型æ¡ç›®çš„左边缩进(仅支æŒä¸Šè¿°é¢„注册的æ¡ç›®ï¼‰ã€‚
+ \keyval{tocrule-every}{引导线命令}
+ 统一设置所有类型的目录引导线样å¼ï¼ˆä»…支æŒä¸Šè¿°é¢„注册的æ¡ç›®ï¼‰ã€‚
\end{options}
\section{环境和命令}
@@ -1516,6 +1522,7 @@
\shortversion{v = 2024aw,date = 2022/04/22,changes = 新增新建章节标题命令 \cs{NewTitleCommand} 和 \cs{NewTitleEntryCommand}。}
\shortversion{v = 2024bb,date = 2022/04/26,changes = 增加对 \pkg*{thmtools} å®åŒ…定ç†çŽ¯å¢ƒç›®å½• \cs{listoftheorems} 的支æŒã€‚}
\shortversion{v = 2024bk,date = 2022/05/07,changes = 新增局部题注目录分é…命令 \cs{AllotPartialExt}。}
+ \shortversion{v = 2024bm,date = 2022/05/09,changes = ä¿®å¤ \module*{toc} 模å—中带有 \option*{every} åŽç¼€çš„选项ä¸å¯¹æ‰€æœ‰é¢„注册æ¡ç›®æœ‰æ•ˆçš„问题。}
\end{changelog}
\nocite{*}
diff --git a/macros/latex/contrib/univie-ling/README b/macros/latex/contrib/univie-ling/README
index 57de3e566b..6d589988de 100644
--- a/macros/latex/contrib/univie-ling/README
+++ b/macros/latex/contrib/univie-ling/README
@@ -97,6 +97,12 @@ also have a look at the example files.
== CHANGES ==
+V. 2.5 (2024-05-09):
+ - univie-ling-paper: implement "short" option.
+ - univie-ling-poster: Add \restspace accessibility helper function.
+ - univie-ling-handout: implement \hoDate.
+ - univie-ling-wlg: upgrade editorial structure.
+
V. 2.4 (2023-03-31):
- univie-ling-paper: fix default ps and se text type.
diff --git a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
index 9dffd636c5..60172f7ebd 100644
--- a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
+++ b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.bbx
@@ -38,7 +38,7 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesFile{univie-ling.bbx}[2023/03/31 v.2.4 biblatex bibliography style]
+\ProvidesFile{univie-ling.bbx}[2024/05/09 v.2.5 biblatex bibliography style]
% Load base style (authoryear-comp)
\RequireBibliographyStyle{authoryear-comp}
diff --git a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
index a1617d71af..837f66d53d 100644
--- a/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
+++ b/macros/latex/contrib/univie-ling/biblatex-univie-ling/univie-ling.cbx
@@ -36,7 +36,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ProvidesFile{univie-ling.cbx}[2023/03/31 v.2.4 biblatex citation style]
+\ProvidesFile{univie-ling.cbx}[2024/05/09 v.2.5 biblatex citation style]
\RequireCitationStyle{authoryear-comp}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
index 16d3622e11..022d7b0ffb 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-expose-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
index 0fc933eab6..bd912dfba4 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-expose-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
index 51cdff71d1..bab72dbf24 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
index 1d4a093335..da696a8fe1 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-deutsch.tex
@@ -7,6 +7,7 @@
%\hoEventLoc{Andere Uni}
\hoTitle{Titel des Handouts/Referats}
\hoSubtitle{Untertitel}
+\hoDate{Datum der Präsentation}
% Vortragende
\hoName{Mein Name \and Zweiter Name}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
index df801a2e82..c7add82055 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
index ed375e7a9a..0c4ac2bb6c 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-handout-english.tex
@@ -7,6 +7,7 @@
%\hoEventLoc{Other University}
\hoTitle{Title of the Handout/Presentation}
\hoSubtitle{Subtitle}
+\hoDate{Date of the presentation}
% Presenters
\hoName{My Name \and Second Name}
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
index 414979d08c..f701cadb32 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-paper-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
index 029263939b..9ca6f625cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-paper-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
index e0865ede5e..0ed4b5d7cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-poster-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
index 2f58113d8b..ed8866e79a 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-poster-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
index 374070d7af..38fe04556c 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-deutsch.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
index 8d4b50cec6..eb482b6af2 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-thesis-english.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
index 5e7c3de1a0..ffaa154e26 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-article.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
index e71523f535..65411031cc 100644
--- a/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
+++ b/macros/latex/contrib/univie-ling/doc/templates/template-wlg-review.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
index b3fd65afb9..c4540b6210 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
index 28c602cf3f..9a9fc48809 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-expose.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -340,7 +340,11 @@ Templates are provided as well:
\section{Release History}
-\begin{description}
+\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item No change to this class.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
@@ -424,7 +428,7 @@ Templates are provided as well:
\item Extend documentation of bibliographic features.
\end{itemize}
\item 2016/01/29 (v.\,0.4) Initial release.
-\end{description}
+\end{itemize}
\begin{thebibliography}{1}
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
index 662260a499..4576acd967 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
index c35b731e87..f67e3f1846 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-handout.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -285,6 +285,7 @@ For student handouts, it is advised to only use name and possibly e-mail.
\item{\jcsmacro{hoEventLoc[<header>]\{<event>\}}}: The location of the event you are presenting at.
Useful for conference presentations.
\item{\jcsmacro{hoEventDate[<header>]\{<event date>\}}}: The date of the event you are presenting at, or the term of your class.
+ \item{\jcsmacro{hoDate[<header>]\{<date>\}}}: The date of your presentation, which might be a subset of the event date only.
\end{description}
\section{Semantic markup}
@@ -385,6 +386,10 @@ Templates are provided as well:
\section{Release History}
\begin{description}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Add \jcsmacro{hoDate}.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
index 60aeed4510..26aaaabcd5 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
index 7b78acec1b..773dfdb47d 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-paper.tex
@@ -63,7 +63,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -239,6 +239,14 @@ option (e.\,g., \joption{all=false,microtype=true} will switch off all packages
The option \joption{draftmark=true|false|firstpage} allows you to mark your document as a draft, which is indicated by a watermark (including the current date). This might be useful when sharing preliminary versions with your supervisor.
With \joption{draftmark=true}, this mark is printed on top of each page. With \joption{draftmark=firstpage}, the draft mark appears on the title page only.
+\subsection{Short papers}
+
+Via the option \joption{short=true|false}, \uvlt\ provides a layout setting which is more suitable for short written papers such as home exams
+or short concepts. As opposed to the default layout, this uses smaller font sizes and does not insert a title page. Rather than that, the
+title is printed on top of the first page, and the main text immediately follows.
+
+Such short papers usually do not have a table of contents or a declaration, but you can use it if you want.
+
\subsection{Further options}
The class builds on \textsf{scrartcl} (KOMA article), which provides many more options to tweak the appearance of your document. You can use
@@ -256,7 +264,7 @@ given that you have specified the following data in the preamble.
\setlength\itemsep{0pt}
\item{\jcsmacro{author\{<name>\}}}: Name(s) of the paper's author(s). Separate multiple authors by \jcsmacro{and}.
\item{\jcsmacro{studienkennzahl\{<code>\}}}: The degree programme code (\emph{Studienkennzahl}) as it appears on
- the student record sheet, e.\,g. \emph{A\,792\,327}.
+ the student record sheet, e.\,g. \emph{A\,792\,327}. Note that this is not output with \joption{short=true}.
\item{\jcsmacro{matrikelnummer\{<registration number>\}}}: Your registration number (\emph{Matrikelnummer}). In case of multiple authors, separate the codes by \jcsmacro{and}.
\end{description}
@@ -374,6 +382,10 @@ Templates are provided as well:
\section{Release History}
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Implement \joption{short} option.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item Fix default \joption{ps} and \joption{se} text type.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
index fc8b6663e6..391bec0c00 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
index 4c78545c2d..dcd04b3338 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-poster.tex
@@ -65,7 +65,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -110,6 +110,7 @@ The following class and packages are required and loaded by \uvlt:
\item \textsf{l3keys}: Key-value interface for class options.
\item \textsf{translator}: Localization machinery.
\item \textsf{url}: Support for typesetting URLs.
+ \item \textsf{tikzpagenodes}: Page measuring (for accessibility).
\end{itemize}
The following packages are required for specific features and loaded by default. However, the loading can be individually and generally omitted (see sec.~\ref{coptions}):
\begin{itemize}
@@ -481,6 +482,52 @@ Please refer to the comprehensive beamer manual \cite{beamer} for information.
Please also refer to the template files included in the package for some further usage instructions and hints.
+
+\subsection{Accessibility helpers}
+
+For visually impaired users, setting up posters is quite a challenge, as \LaTeX\ does not really give you good feedback
+on whether the poster is filled evenly, or even in the crucial case if the text overruns the poster page.
+In the latter case, you could watch out for \emph{overfull vbox} warnings, but these are quite ambiguous.
+
+To enhance accessibility in this regard, \uvlt\ provides the following helper function:
+\begin{description}
+ \item{\jcsmacro{restspace[<label>]}}
+\end{description}
+%
+If you insert this to your poster, it will tell you through a package warning in the log file how many normal lines
+there are still available (in the current column, if you are using columns) after the point where the command
+has been inserted:
+\begin{quote}
+ \enquote{Package univie-ling-poster warning: Remaining space: <n> normal lines}
+ (with <n> being the actual number of lines)
+\end{quote}
+%
+With \emph{normal lines}, the warning refers to lines in the normal font size of running text.
+In the warning, the package also provides you with its own evaluation on how to deal with the result.
+Either of these four verdicts will be given:
+\begin{enumerate}
+ \item \enquote{Good, still space left}: poster/column is not full yet, you can safely add more text
+ (more than one normal line left).
+ \item \enquote{All good, but this is full now}: poster/column is filled, and not too crowded,
+ but you should not add more text (one line more will make it look less good).
+ \item \enquote{It is still OK, but the poster is quite full}: The content already touches the footer line.
+ If you don't have space available in other columns and need all text, you can keep this, but it will
+ probably look a bit crowded. So if you can, re-arrange (take out at least one line).
+ \item \enquote{Text exceeds poster! You need to re-arrange the content}:
+ If you get this warning, text runs out of the poster page, and you definitely need to fix that.
+\end{enumerate}
+%
+The optional argument of the macro allows you to set an arbitrary label which is used in the warning.
+This might be helpful if you use multiple \verb|\restspace| macros (e.\,g., in multiple columns).
+So if you insert, for instance \verb|\restspace[1]|, the warning will read
+\enquote{Remaining space (1): <n> normal lines}.
+
+Note that \verb|\restspace| should always be the last element in the column or the text. This means that if
+you are using boxes, set the macro \emph{after} the end of the box, not within the box.
+
+Note further that the \verb|\restspace| macro does not print anything on the poster itself, so you can safely keep
+them in the published version.
+
\subsection{\LyX\ layouts and templates}
A layout for \LyX\footnote{See \url{https://www.lyx.org}.}\ can be retrieved from \url{https://github.com/jspitz/univie-ling/raw/master/lyx/layouts/univie-ling-poster.layout}.
@@ -498,6 +545,10 @@ Templates are provided as well:
\section{Release History}
\begin{description}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Add \verb|\restspace| accessibility helper function.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
index e91bb21ee7..199dd750a3 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
index 5680490e7e..9b99e1db6c 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-thesis.tex
@@ -59,7 +59,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -404,6 +404,10 @@ Templates are provided as well:
\section{Release History}
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item No change to this class.
+ \end{itemize}
\item 2023/01/26 (v.\,2.3)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
index 13c4c8e24d..c9d37e2221 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
index 5dedae5b72..96cf80916f 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling-wlg.tex
@@ -59,7 +59,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
@@ -165,14 +165,12 @@ Data for a particular issue can be set via:
\item{\jcsmacro{issuesubtitle\{<subtitle>\}}} Set subtitle of special issue
\end{description}
%
-If needed, the editorial board (as printed in the imprint) can be adapted for a particular issue via:
+If needed, the editorial (as printed in the imprint) can be adapted for a particular issue via:
\begin{description}
\setlength\itemsep{0pt}
- \item{\jcsmacro{edboardGL\{<name>\}}} Set editorial board member(s) for General Linguistics
- \item{\jcsmacro{edboardAL\{<name>\}}} Set editorial board member(s) for Applied Linguistics
- \item{\jcsmacro{edboardHL\{<name>\}}} Set editorial board member(s) for Historical Linguistics
- \item{\jcsmacro{techboard\{<name>\}}} Set technical board member(s)
+ \item{\jcsmacro{jeditors\{<name>\}}} Set editor(s) of the journal
+ \item{\jcsmacro{jedboard\{<name>\}}} Set editorial board member(s)
\end{description}
%
In general, the data for the editorial board should be set/changed in a local copy of the file
@@ -247,6 +245,10 @@ A template is provided as well: \url{https://github.com/jspitz/univie-ling/raw/m
\raggedright
\begin{itemize}
+ \item 2024/05/09 (v.\,2.5)
+ \begin{itemize}
+ \item Update the editorial structure.
+ \end{itemize}
\item 2023/03/31 (v.\,2.4)
\begin{itemize}
\item No change to this class.
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling.pdf b/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
index 2452df688b..057fd5d0ff 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling.pdf
Binary files differ
diff --git a/macros/latex/contrib/univie-ling/doc/univie-ling.tex b/macros/latex/contrib/univie-ling/doc/univie-ling.tex
index a3d9e05db9..6cc4ac25f8 100644
--- a/macros/latex/contrib/univie-ling/doc/univie-ling.tex
+++ b/macros/latex/contrib/univie-ling/doc/univie-ling.tex
@@ -42,7 +42,7 @@
\author{\texorpdfstring{Jürgen Spitzmüller%
\thanks{Please report issues via \protect\url{https://github.com/jspitz/univie-ling}.}}{Jürgen Spitzmüller}}
-\date{Version 2.4, 2023/03/31}
+\date{Version 2.5, 2024/05/09}
\maketitle
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
index c372c01a38..29576a930f 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-expose.cls
@@ -32,8 +32,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-expose}[2023/03/31 v.2.4 Univie Linguistic Exposes (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-expose}[2024/05/09 v.2.5 Univie Linguistic Exposes (JSp)]
%% ============================================================
@@ -54,10 +54,8 @@
\newif\if@uve@usefontenc\@uve@usefontenctrue
\def\uve@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uve }
+% Define keys and values
+\DeclareKeys[uve]
{
% all=<true|false>
% Load all (most) packages
@@ -167,17 +165,9 @@
\@uve@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uve]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uve}
-}
+\ProcessKeyOptions[uve]
%% ============================================================
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
index 7c7a8ff1da..22a451329d 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-handout.cls
@@ -34,8 +34,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}[1997/06/01]
-\ProvidesClass{univie-ling-handout}[2023/03/31 v.2.4 Univie Ling handout class (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesClass{univie-ling-handout}[2024/05/09 v.2.5 Univie Ling handout class (JSp)]
%% ============================================================
%% CLASS OPTIONS
@@ -107,10 +107,8 @@
}
\uvh@cd@german
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvh }
+% Define keys and values
+\DeclareKeys[uvh]
{
% all=<true|false>
% Load all (most) packages
@@ -286,17 +284,9 @@
\@uvh@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvh]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvh}
-}
+\ProcessKeyOptions[uvh]
%% ============================================================
@@ -386,11 +376,13 @@
\newlength\beforeevent
\newlength\beforetitle
\newlength\beforesubtitle
+\newlength\beforedate
\newlength\aftertitle
\setlength\beforetitling{18pt}
\setlength\beforeevent{6pt}
\setlength\beforesubtitle{6pt}
\setlength\beforetitle{6pt}
+\setlength\beforedate{8pt}
\setlength\aftertitle{18pt}
% Boxes
@@ -561,6 +553,15 @@
\def\uvh@eventdate{#2}
}
+% f.) Presentation date
+\def\uvh@date{}
+\def\uvh@date@header{}
+\newcommand*{\hoDate}[2][\@empty]{%
+ \ifx\@empty#1\def\uvh@date@header{#2}
+ \else\def\uvh@date@header{#1}\fi
+ \def\uvh@date{#2}
+}
+
% The maketitle routine
\renewcommand\maketitle{%
\newif\ifuvh@eventline\uvh@eventlinefalse%
@@ -592,7 +593,7 @@
\ifx\uvh@subtitle\empty%
\else
\vspace{\beforesubtitle}\noindent\bgroup\raggedright\uvh@font@subtitle\uvh@subtitle\par\egroup%
- \fi
+ \fi%
\else%
\vspace{.15\baselineskip}%
\begin{minipage}{\textwidth}
@@ -605,7 +606,7 @@
\fi
\end{tabularx}%
\end{minipage}%
- \fi
+ \fi%
\@ifundefined{hypersetup}{}{%
\hypersetup{pdftitle=\ifx\uvh@titleprefix\empty\else\uvh@titleprefix~\fi\uvh@title,
pdfauthor=\uvh@name,
@@ -616,6 +617,11 @@
\else%
\vspace{\beforesubtitle}\bgroup\noindent\raggedright\uvh@font@subtitle\uvh@widesubtitle\par\egroup%
\fi%
+ \ifx\uvh@date\empty%
+ \else%
+ \vspace{\beforedate}%
+ \bgroup\noindent\uvh@font@eventlocdate\uvh@date\egroup%
+ \fi%
\vspace{\aftertitle}%
\@afterindentfalse\@afterheading%
}
@@ -710,19 +716,20 @@
\def\ps@headings{%
\let\uvh@save@and\and%
- \def\and{$\cdot$\ }%
+ \def\uvh@header@and{$\cdot$\ }%
\if@uvh@pplogo\sbox{\uvh@box@logo}{\uvh@printsmalllogo}\fi
\def\uvh@thelogo{\parbox{90mm}{\usebox{\uvh@box@logo}}}
\headheight30mm\headsep2.5mm\footskip8mm
\def\titleline{\ifx\uvh@title@header\empty\else\uvh@font@headertitle%
\ifx\uvh@titleprefix\empty\else\uvh@titleprefix~\fi%
- \uvh@title@header\linebreak\fi}%
+ \uvh@title@header\ifx\uvh@date@header\empty\else\ (\uvh@date@header)\linebreak\fi}%
\ifx\uvh@eventlocation@header\empty\ifx\uvh@eventdate@header\empty\@uvh@noeventtrue\fi\fi%
\def\eventline{%
\uvh@font@header\uvh@event@header\ifx\uvh@eventdate@header\empty\else\if@uvh@breakevent\linebreak\else\ \fi%
\if@uvh@noevent\else(\ifx\uvh@eventlocation@header\empty\else\uvh@eventlocation@header, \fi\uvh@eventdate@header)\fi\linebreak\fi%
}
\def\@oddhead{%
+ \let\and\uvh@header@and%
\unitlength1mm
\hspace{\headeroffset}
\begin{picture}(0,0)
@@ -747,12 +754,12 @@
}%
}
\end{picture}
+ \let\and\uvh@save@and%
\hfill%
}
\def\@oddfoot{\hfill\uvh@font@footer\raggedright\uvh@pageprefix~\thepage\if@uvh@lastpage /\pageref{LastPage}\fi}
\def\@evenhead{\@oddhead}
\def\@evenfoot{\@oddfoot}
- \let\and\uvh@save@and%
}
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
index 289315beb8..4ee6eaf8f8 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-paper.cls
@@ -31,8 +31,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-paper}[2023/03/31 v.2.4 Univie Linguistic Papers (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-paper}[2024/05/09 v.2.5 Univie Linguistic Papers (JSp)]
%% ============================================================
@@ -51,13 +51,12 @@
\newif\if@uvp@polyglossia\@uvp@polyglossiafalse
\newif\if@uvp@psfonts\@uvp@psfontstrue
\newif\if@uvp@otffonts\@uvp@otffontsfalse
+\newif\if@uvp@short\@uvp@shortfalse
\newif\if@uvp@usefontenc\@uvp@usefontenctrue
\def\uvp@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvp }
+% Define keys and values
+\DeclareKeys[uvp]
{
% all=<true|false>
% Load all (most) packages
@@ -166,18 +165,14 @@
{ \@uvp@psfontsfalse
\@uvp@otffontsfalse
},
+ % short=<true|false>
+ % short paper
+ short.legacy_if_set:n = @uvp@short,
+ short.usage:n = preamble,
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvp]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvp}
-}
+\ProcessKeyOptions[uvp]
%% ============================================================
@@ -195,6 +190,12 @@
sectionentrydots=true
]{scrartcl}[2003/04/22]
+\if@uvp@short
+ \KOMAoptions{fontsize=11pt,
+ headings=small,
+ titlepage=false}
+\fi
+
%% ============================================================
%% LOCALIZATION:
@@ -218,6 +219,8 @@
\deftranslation[to=English]{example}{example}
\deftranslation[to=German]{matnr}{Matrikelnummer}
\deftranslation[to=English]{matnr}{Matrikelnummer}
+\deftranslation[to=German]{instructor}{Leitung}
+\deftranslation[to=English]{instructor}{Instructor}
\deftranslation[to=German]{stkz}{Studienkennzahl}
\deftranslation[to=English]{stkz}{Studienkennzahl}
\deftranslation[to=German]{erkl}{Erkl\"arung}
@@ -290,6 +293,12 @@ This includes all drawings, sketches, graphics and internet sources.}
\setkomafont{subtitle}{\normalfont\fontsize{12}{14pt}\sffamily}
\setkomafont{date}{\normalfont\fontsize{10}{12pt}\mdseries\sffamily}
\newkomafont{course}{\normalfont\mdseries\sffamily}
+% short paper settings
+\newkomafont{spauthor}{\normalfont\mdseries}
+\newkomafont{sptitle}{\Large\bfseries}
+\newkomafont{spsubtitle}{\large\bfseries}
+\newkomafont{spdate}{\normalfont\normalsize\mdseries}
+\newkomafont{spcourse}{\footnotesize\mdseries\sffamily}
%% ============================================================
@@ -436,6 +445,35 @@ This includes all drawings, sketches, graphics and internet sources.}
\begin{tabular}[t]{c}%
}%
\fi
+ \if@uvp@short
+ \bgroup
+ \let\footnote\thanks
+ \renewcommand*\thefootnote{\@fnsymbol\c@footnote}%
+ \let\@oldmakefnmark\@makefnmark
+ \renewcommand*{\@makefnmark}{\rlap\@oldmakefnmark}%
+ \setparsizes{\z@}{\z@}{\z@\@plus 1fil}\par@updaterelative
+ \parbox[b]{11.5cm}{%
+ \ifx\@course\@empty\else%
+ \usekomafont{spcourse}{\lectypeverb\ \emph{\@course} (\lecsemshort~\@semester)}%
+ \ifx\@instructor\@empty\else\newline\fi%
+ \fi%
+ \ifx\@instructor\@empty\else%
+ \usekomafont{spcourse}{\translate{instructor}:~\@instructor}\fi
+ }\hfill
+ \parbox[b]{3cm}{\includegraphics[width=3cm]{univielogo-sw}}\par
+ \vskip 3em
+ \def\and{\leavevmode\unskip\slash}%
+ {\usekomafont{spauthor}{\@author\ifx\@matrikelnr\@empty\else\ (\translate{matnr}:~\@matrikelnr)\fi\par\vskip .5em}}%
+ \ifx\@title\@empty\else
+ {\usekomafont{sptitle}{\@title%
+ \ifx\@subtitle\@empty\else\\\usekomafont{spsubtitle}{\@subtitle}\fi\par}}%
+ \fi
+ \vskip .5em
+ {\usekomafont{spdate}{\ifx\@texttype\@empty\else\@texttype, \fi\@date\par%
+ \vspace{.5\baselineskip}}\noindent}%
+ \@thanks\let\@thanks\@empty
+ \egroup
+ \else
\begin{titlepage}
\sffamily%
\setcounter{page}{%
@@ -569,6 +607,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\fi
\ifx\titlepage@restore\relax\else\clearpage\titlepage@restore\fi
\end{titlepage}
+ \fi% not \if@uvp@short
\setcounter{footnote}{0}%
\expandafter\ifnum \csname scr@v@3.12\endcsname>\scr@compatibility\relax
\let\thanks\relax
@@ -607,7 +646,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\begin{tabular}[t]{c}%
\hline
}%
-\clearpage
+\if@uvp@short\else\clearpage\fi
\section*{\translate{erkl}}
\if@uvp@multiauthors
@@ -636,7 +675,7 @@ This includes all drawings, sketches, graphics and internet sources.}
\@author
\end{tabular}\par
\egroup
-\clearpage
+\if@uvp@short\else\clearpage\fi
\global\let\and\relax
}
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
index bb54e614ae..d2b68940af 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-poster.cls
@@ -33,8 +33,8 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}[1997/06/01]
-\ProvidesClass{univie-ling-poster}[2023/03/31 v.2.4 Univie Ling poster class (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesClass{univie-ling-poster}[2024/05/09 v.2.5 Univie Ling poster class (JSp)]
%% ============================================================
%% CLASS OPTIONS
@@ -76,10 +76,8 @@
}
\uvpt@cd@german
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvpt }
+% Define keys and values
+\DeclareKeys[uvpt]
{
% all=<true|false>
% Load all (most) packages
@@ -223,17 +221,9 @@
\@uvpt@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvpt]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvpt}
-}
+\ProcessKeyOptions[uvpt]
%% ============================================================
@@ -942,13 +932,61 @@
\fi
%% ============================================================
-%% Semantic markup
+%% SEMANTIC MARKUP:
%% ============================================================
\newcommand\Expression[1]{\textit{#1}}
\newcommand\Concept[1]{\textsc{#1}}
\newcommand\Meaning[1]{\enquote*{#1}}
+%% ============================================================
+%% ACCESSIBILITY:
+%% ============================================================
+
+% Helper function that reports on the remaining space on the poster
+% as of the point where the command has been entered
+\RequirePackage{tikzpagenodes}
+\usetikzlibrary{calc}
+
+\newcommand*\restspace[1][]{%
+ \begin{tikzpicture}[overlay,remember picture]
+ \node (cp) at (current page text area.south west) {};%
+ \path let \p0 = (0,0), \p1 = (cp.north) in node [inner sep=0pt,outer sep=0pt,anchor=south] at (\x1,\y1)%
+ {%
+ \pgfmathsetmacro\restheight{((\y0-\y1) / \baselineskip) + 1}%
+ \pgfkeys{/pgf/number format/precision=1}%
+ \pgfmathroundto{\restheight}%
+ \ifx#1\empty%
+ \edef\univie@space@warning{Remaining space: \pgfmathresult\space normal lines}%
+ \else%
+ \edef\univie@space@warning{Remaining space (#1): \pgfmathresult\space normal lines}%
+ \fi%
+ \let\firstpgfmathresult\pgfmathresult%
+ \pgfmathparse{\pgfmathresult > 0}%
+ \def\univie@tmpa{0}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \pgfmathparse{\firstpgfmathresult > -1}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \def\univie@space@expl{\univie@space@warning\MessageBreak
+ Text exceeds poster! You need to re-arrange the content.}%
+ \else%
+ \def\univie@space@expl{It is still OK, but the poster is quite full\MessageBreak
+ Better take out at least one line here.}%
+ \fi%
+ \else%
+ \pgfmathparse{\firstpgfmathresult > 1}%
+ \ifx\pgfmathresult\univie@tmpa%
+ \def\univie@space@expl{All good, but this is full now.}%
+ \else
+ \def\univie@space@expl{Good, still space left!}%
+ \fi
+ \fi%
+ \PackageWarning{univie-ling-poster}{\univie@space@warning\MessageBreak
+ \univie@space@expl}%
+ };%
+ \end{tikzpicture}%
+}
+
\endinput
%%
%% End of file `univie-ling-poster.cls'.
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
index 87bd736880..bfe9204471 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-thesis.cls
@@ -32,16 +32,14 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-thesis}[2023/03/31 v.2.4 Univie Linguistic Theses (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-thesis}[2024/05/09 v.2.5 Univie Linguistic Theses (JSp)]
%% ============================================================
%% CLASS OPTIONS
%% ============================================================
-\RequirePackage{xkeyval}
-
\newif\if@uvt@apa\@uvt@apafalse
\newif\if@uvt@biblatex\@uvt@biblatextrue
\newif\if@uvt@captionp\@uvt@captionptrue
@@ -59,10 +57,8 @@
\newif\if@uvt@usefontenc\@uvt@usefontenctrue
\def\uvt@fontenc{T1}
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { uvt }
+% Define keys and values
+\DeclareKeys[uvt]
{
% all=<true|false>
% Load all (most) packages
@@ -180,17 +176,10 @@
\@uvt@otffontsfalse
},
}
-\ExplSyntaxOff
% Process
+\ProcessKeyOptions[uvt]
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[uvt]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{uvt}
-}
%% ============================================================
%% BASE CLASS:
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
index 6698cb693e..2c00101fc9 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cfg
@@ -3,14 +3,12 @@
%
%
-% Editorial Board
+% Editorial
%
-% General Linguistics
-\edboardGL{Markus P\"ochtrager}
-% Applied Linguistics
-\edboardAL{Mi-Cha Flubacher, Florian Grosser \& Carina Lozo}%
-% Historical Linguistics
-\edboardHL{Stefan Schumacher}
+% Editors
+\jeditors{Florian Grosser, Jonas Hassemer \& Carina Lozo}%
+% Editorial Board
+\jedboard{Markus P\"ochtrager \& Stefan Schumacher}
%
% Technical Board
diff --git a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
index d5a399fec8..0bdf4b8552 100644
--- a/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
+++ b/macros/latex/contrib/univie-ling/tex/univie-ling-wlg.cls
@@ -33,8 +33,8 @@
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{univie-ling-wlg}[2023/03/31 v.2.4 Univie WLG journal layout (JSp)]
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\ProvidesPackage{univie-ling-wlg}[2024/05/09 v.2.5 Univie WLG journal layout (JSp)]
%% ============================================================
@@ -50,10 +50,8 @@
\newif\if@wlg@specialprint\@wlg@specialprintfalse
\newif\if@wlg@review\@wlg@reviewfalse
-% We use l3keys here since (1) LaTeX2e keys are rather
-% new and (2) do not provide for choice keys yet.
-\ExplSyntaxOn
-\keys_define:nn { wlg }
+% Define keys and values
+\DeclareKeys[wlg]
{
% biblatex=<true|false>
% Load biblatex
@@ -125,16 +123,8 @@
% no val equals to true
draftmark .default:n = {true},
}
-\ExplSyntaxOff
-
-\IfFormatAtLeastTF{2022-06-01}
-{
- \ProcessKeyOptions[wlg]
-}{
- \RequirePackage{l3keys2e}
- \ProcessKeysOptions{wlg}
-}
+\ProcessKeyOptions[wlg]
%% ============================================================
@@ -164,6 +154,10 @@
%% CONFIGURATION:
%% ============================================================
+% Current structure
+\newcommand*\jedboard[1]{\def\wlg@jedboard{#1}}
+\newcommand*\jeditors[1]{\def\wlg@jeditors{#1}}
+% Old structure
\newcommand*\edboardAL[1]{\def\wlg@edboardAL{#1}}
\newcommand*\edboardGL[1]{\def\wlg@edboardGL{#1}}
\newcommand*\edboardHL[1]{\def\wlg@edboardHL{#1}}
@@ -293,6 +287,10 @@
\deftranslation[to=English]{univie-address}{Sensengasse 3a\\1090 Vienna\\Austria}
\deftranslation[to=German]{edboard}{Redaktion}
\deftranslation[to=English]{edboard}{Editorial board}
+\deftranslation[to=German]{jeditors}{Redaktion}
+\deftranslation[to=English]{jeditors}{Editors}
+\deftranslation[to=German]{jedboard}{Redaktioneller Beirat}
+\deftranslation[to=English]{jedboard}{Editorial board}
\deftranslation[to=German]{techboard}{Technische Redaktion}
\deftranslation[to=English]{techboard}{Technical editor}
\deftranslation[to=German]{contact}{Kontakt}
@@ -341,12 +339,13 @@
\translate{univie}, \translate{lingdep}\\
\translate{univie-address}
\vspace*{-.5em}
-\begin{labeling}{\textbf{\translate{edboard}:}}
+\begin{labeling}{\textbf{\translate{jedboard}:}}
\setlength\itemsep{0pt}
\setlength\parsep{0pt}
\setlength{\parskip}{0pt}
\def\wlg@lb{}
-\item[\textbf{\translate{edboard}:}]
+\ifcsname wlg@edboardAL\endcsname
+ \item[\textbf{\translate{edboard}:}]
\ifcsname wlg@edboardGL\endcsname
\wlg@edboardGL\ (\translate{general}),%
\def\wlg@lb{\\}%
@@ -358,6 +357,16 @@
\ifcsname wlg@edboardHL\endcsname
\wlg@lb\wlg@edboardHL\ (\translate{hist})
\fi
+\else
+ \ifcsname wlg@jeditors\endcsname
+ \item[\textbf{\translate{jeditors}:}]
+ \wlg@jeditors%
+ \fi
+ \ifcsname wlg@jedboard\endcsname
+ \item[\textbf{\translate{jedboard}:}]
+ \wlg@lb\wlg@jedboard%
+ \fi
+\fi
\ifcsname wlg@techboard\endcsname
\item[\textbf{\translate{techboard}:}] \wlg@techboard
\fi
diff --git a/macros/latex/contrib/ximera/LICENSE b/macros/latex/contrib/ximera/LICENSE
new file mode 100644
index 0000000000..d7f1051397
--- /dev/null
+++ b/macros/latex/contrib/ximera/LICENSE
@@ -0,0 +1,339 @@
+GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {description}
+ Copyright (C) {year} {fullname}
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ {signature of Ty Coon}, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/macros/latex/contrib/ximera/Makefile b/macros/latex/contrib/ximera/Makefile
new file mode 100644
index 0000000000..dd9c367745
--- /dev/null
+++ b/macros/latex/contrib/ximera/Makefile
@@ -0,0 +1,50 @@
+NAME = ximera
+SHELL = bash
+PWD = $(shell pwd)
+VERS = $(shell ltxfileinfo -v $(NAME).dtx|sed -e 's/^v//')
+LOCAL = $(shell kpsewhich --var-value TEXMFLOCAL)
+UTREE = $(shell kpsewhich --var-value TEXMFHOME)
+INPUTS = $(wildcard src/*.dtx) $(wildcard src/interactives/*.dtx) $(NAME).dtx
+OUTPUTS = ximera.cls xourse.cls ximera.4ht xourse.4ht ximera.cfg
+
+# based on
+#
+# https://stackoverflow.com/questions/2973445/gnu-makefile-rule-generating-a-few-targets-from-a-single-source-file
+#
+# I use a silly pattern rule to convince GNU make that multiple
+# outputs are created with a single invocation
+
+all: $(NAME).pdf $(OUTPUTS)
+ test -e README.txt && mv README.txt README || exit 0
+
+$(NAME)%pdf ximera%cls xourse%cls ximera%4ht xourse%4ht ximera%cfg: $(INPUTS)
+ pdflatex -shell-escape -recorder -interaction=batchmode $(NAME).dtx >/dev/null
+ if [ -f $(NAME).glo ]; then makeindex -q -s gglo.ist -o $(NAME).gls $(NAME).glo; fi
+ if [ -f $(NAME).idx ]; then makeindex -q -s gind.ist -o $(NAME).ind $(NAME).idx; fi
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+ pdflatex --recorder --interaction=nonstopmode $(NAME).dtx > /dev/null
+
+clean:
+ rm -f $(NAME).{aux,fls,glo,gls,hd,idx,ilg,ind,ins,log,out}
+
+distclean: clean
+ rm -f ximera.pdf README $(OUTPUTS)
+
+# BADBAD: The code below still needs to be fixed
+
+inst: all
+ mkdir -p $(UTREE)/{tex,source,doc}/latex/$(NAME)
+ cp $(NAME).dtx $(UTREE)/source/latex/$(NAME)
+ cp $(NAME).cls $(UTREE)/tex/latex/$(NAME)
+ cp $(NAME).pdf $(UTREE)/doc/latex/$(NAME)
+
+install: all
+ sudo mkdir -p $(LOCAL)/{tex,source,doc}/latex/$(NAME)
+ sudo cp $(NAME).dtx $(LOCAL)/source/latex/$(NAME)
+ sudo cp $(NAME).cls $(LOCAL)/tex/latex/$(NAME)
+ sudo cp $(NAME).pdf $(LOCAL)/doc/latex/$(NAME)
+
+zip: all
+ ln -sf . $(NAME)
+ zip -Drq $(PWD)/$(NAME)-$(VERS).zip $(NAME)/{README,$(NAME).{pdf,dtx}}
+ rm $(NAME)
diff --git a/macros/latex/contrib/ximera/README.md b/macros/latex/contrib/ximera/README.md
new file mode 100644
index 0000000000..73dddcbcfc
--- /dev/null
+++ b/macros/latex/contrib/ximera/README.md
@@ -0,0 +1,62 @@
+Greetings! [![Build Status](https://travis-ci.org/XimeraProject/ximeraLatex.svg?branch=master)](https://travis-ci.org/XimeraProject/ximeraLatex)
+==========
+
+In this repository, we hope to supply potential authors of Ximera
+activities with the LaTeX document classes they need to write Ximera
+documents.
+
+To install the XimeraLaTeX package, see:
+
+[Installing Locally](./installingLocally.md)
+
+For a list of different Ximera commands, see:
+
+[Examples of Ximera Envrionments](https://ximera.osu.edu/tester/exampleActivityCollection)
+
+
+Since Ximera is built on LaTeX source, we want to use LaTeX as a
+method of validating the code authors write. Hence, if you want to
+write a Ximera online activity, the first step is constructing LaTeX
+documents.
+
+Once you have the LaTeX documents, and you have checked them for
+typos, accuracy, etc, the fact that they compile should be reasonable
+evidence that they will display correctly in Ximera.
+
+
+
+Contents of the repository
+---------------------------
+
+* This README.md file.
+
+* The GNU license.
+
+* The Ximera document class, ximera.cls
+
+* The Xourse document class, xourse.cls
+
+* Documentation for the document classes above, ximeraLaTeX.pdf
+
+* The Ximera documented LaTeX file type, ximera.dtx. This file
+ generates ximera.cls, xourse.cls, and ximeraLaTeX.pdf, as well as a
+ few other files.
+
+
+Staying up-to-date
+------------------
+
+While we hope to solidify the ximera.cls file, at this point we are
+still in development stages.
+
+To keep your file up-to-date, you may need to periodically sync or
+pull the the ximera.cls within the ximeraLatex directory.
+
+`ximeraLatex$ git fetch --all`
+
+`ximeraLatex$ git reset --hard origin/master`
+
+will reset your ximeraLatex directory. Note it will also overwrite
+*any* modifications you have made in this directory. You should not be
+building your activities in this directory.
+
diff --git a/macros/latex/contrib/ximera/installingLocally.md b/macros/latex/contrib/ximera/installingLocally.md
new file mode 100644
index 0000000000..7c1005e108
--- /dev/null
+++ b/macros/latex/contrib/ximera/installingLocally.md
@@ -0,0 +1,91 @@
+# Installing Locally
+
+To get started as an author in Ximera, all you need is the XimeraLaTeX
+LaTeX Package. Unfortunately, at this point, this package is not part
+of CTAN. However, you can install it manually with the instructions
+below. Please feel free to contact Bart Snapp with questions
+(snapp.14@osu.edu).
+
+1. Get a GitHub account
+2. Go to: [XimeraLaTeX on GitHub](https://github.com/XimeraProject/ximeraLatex)
+3. Click on the green code button: ![Click on the green code button.](https://github.com/XimeraProject/.github/blob/main/profile/codeButton.png "Click on the green code button.") and copy the code, (or just copy: `git@github.com:XimeraProject/ximeraLatex.git`)
+4. Clone the repository.
+
+At this point the installation becomes operating-system specific.
+
+## Linux
+
+If you are running linux, create the local directory structure `~/texmf/tex/latex`
+
+├── texmf
+
+├───└── tex
+
+└───────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder. At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
+
+## MacOS
+
+If you are running MacOS, create the local directory structure `~/Library/texmf/tex/latex`. To do this, you'll need to make your Library folder visible, see [How to make your Library folder visible in the Finder](http://kb.mit.edu/confluence/display/istcontrib/How+to+make+your+Library+folder+visible+in+the+Finder+in+OS+X+10.9+%28Mavericks%29+or+later).
+
+├── Library
+
+├───└── texmf
+
+├───────└── tex
+
+└───────────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder. At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
+
+
+## Windows
+
+If you are running Windows, create the local directory structure `C:\localtexmf\tex\latex\`
+
+├── C:
+
+├───└── localtexmf
+
+├───────└── tex
+
+└───────────└── latex
+
+Now move the `ximeraLatex` folder (cloned in step 4. above) into the latex folder.
+
+For MiKteX to notice this directory, go to:
+
+* Start → All programs → MiKTeX Folder → Maintenance (Admin) Folder → Settings (Admin).
+* Now select the tab “Roots.â€
+* Click “Add†because you are going to add a path.
+* Find `C:\localtexmf\` and click “OK.â€
+* Click “apply†then “OK.â€
+* Reopen Miktex Settings (Admin). Click **Refresh FNDB.**
+
+The steps above will vary between systems. However, the key steps are **adding the path** and **Refreshing FNDB.**
+At this point you have installed XimeraLaTeX! You can test your installation by compiling:
+```
+\documentclass{ximera}
+\begin{document}
+\begin{problem}
+Hello $\answer[format=string]{World}$
+\end{problem}
+\end{document}
+```
diff --git a/macros/latex/contrib/ximera/pgfsys-ximera.def b/macros/latex/contrib/ximera/pgfsys-ximera.def
new file mode 100644
index 0000000000..ffa3205304
--- /dev/null
+++ b/macros/latex/contrib/ximera/pgfsys-ximera.def
@@ -0,0 +1,62 @@
+%%
+%% This is file `pgfsys-ximera.def',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ximera.dtx (with options: `pgfsys')
+%% src/pgfsys.dtx (with options: `pgfsys')
+%% ------------:| ------------------------------------------------------------
+%% ximera:| Simultaneously writing print and online interactive materials
+%% Author:| Jim Fowler and Oscar Levin and Jason Nowell and Hans Parshall and Bart Snapp
+%% E-mail:| bart.snapp@gmail.com
+%% License:| Released under the LaTeX Project Public License v1.3c or later
+%% See:| http://www.latex-project.org/lppl.txt
+%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesFileRCS{pgfsys-ximera.def}
+
+\input pgfsys-dvisvgm.def
+
+\def\pgfsys@beginpicture{%
+ \special{color push gray 0}% make dvisvgm *not* add anything to text
+ \pgf@sys@svg@inpicturetrue% in a picture
+ \pgfsys@svg@boxmodefalse%
+ \special{dvisvgm:beginpicture}
+ \pgfsys@invoke{<g \ifx\pgf@sys@svg@last@stroke\relax\else
+ stroke="\pgf@sys@svg@last@stroke" \fi stroke-miterlimit="10" transform="scale(1,-1)">}}
+
+\def\pgfsys@endpicture{\pgfsys@invoke{</g>}\special{dvisvgm:endpicture}\special{color pop}}
+
+%%
+%% Copyright (C) 2018-2021 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+%%
+%% This work may be distributed and/or modified under the conditions of
+%% the LaTeX Project Public License (LPPL), either version 1.3c of this
+%% license or (at your option) any later version. The latest version of
+%% this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Bart Snapp. The source code can be found at:
+%%
+%% https://github.com/XimeraProject/ximeraLatex
+%%
+%% This work consists of the file ximera.dtx, the associated files
+%% under src/, and a Makefile.
+%%
+%% Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+%%
+%% Running "make inst" installs the files in the user's TeX tree.
+%%
+%% Running "make install" installs the files in the local TeX tree.
+%%
+%%
+%% End of file `pgfsys-ximera.def'.
diff --git a/macros/latex/contrib/ximera/src/abstract.dtx b/macros/latex/contrib/ximera/src/abstract.dtx
new file mode 100644
index 0000000000..2a895568d3
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/abstract.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Abstract}
+% \DescribeEnv{abstract}{Every activity should include a short abstract.}
+% \begin{macrocode}
+%<*classXimera>
+\let\abstract\relax
+\let\endabstract\relax
+% Use of environ package, may want to find a better way.
+\NewEnviron{abstract}{\protected@xdef\theabstract{\BODY}}
+%</classXimera>
+% \end{macrocode}
+% The abstract has been stored in |\theabstract| and should be emitted
+% as a div, but confusingly I guess |<div class="abstract">| is
+% defined somewhere deeper inside tex4ht, so the code below is
+% probably unnecessary. \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/activity.dtx b/macros/latex/contrib/ximera/src/activity.dtx
new file mode 100644
index 0000000000..647be0565d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/activity.dtx
@@ -0,0 +1,158 @@
+% \subsection{Activities}
+% The core of the |xourse| system. It works by redefining the
+% |document| environment, thus making the |\begin| and
+% |\end{document}| of the subfile `transparent' to the
+% inclusion. The redefinition of |\documentclass| is analogous, just
+% having a required and an optional arguments which mean nothing to
+% |\subfile|.
+% \begin{macrocode}
+%<*classXourse>
+\newcommand{\skip@preamble}{%
+ \let\document\relax\let\enddocument\relax%
+ \newenvironment{document}{\let\input\otherinput}{}%
+ \renewcommand{\documentclass}[2][subfiles]{}}
+% \end{macrocode}
+% Note that the new command |\subfile| calls for |\skip@preamble| \emph{within a group}. The changes to |document| and |\documentclass| are undone after the inclusion of the subfile.
+%
+% Numbering starts a page too soon without this:
+% \begin{macrocode}
+\let\otherinput\input
+% \end{macrocode}
+% Store usual |\maketitle| as |\othermaketitle|
+% \begin{macrocode}
+\let\othermaketitle\maketitle
+% \end{macrocode}
+% \DescribeMacro{\maketitle}{In a \textsf{xourse} file, |\maketitle| is redefined to give course packet title page and toc.}
+% \begin{macrocode}
+\renewcommand{\maketitle}{ %
+\pagestyle{empty}
+\begin{center}
+~\\ %puts space at top of page to move title down.
+\vskip .25\textheight
+\hrulefill\\
+\vskip 1em
+\bfseries{\Huge \@title} \\
+\hrulefill\\
+\vskip 3em
+{\Large \@author}
+\vskip 2em
+{\large \@date}
+\end{center}
+\clearpage
+% \end{macrocode}
+% When |notoc| option is used, we do not include a table of contents.
+% Otherwise we include a table of contents in every course packet.
+% \begin{macrocode}
+\ifnotoc
+\else
+ \tableofcontents\clearpage
+ \clearpage
+\fi
+% \end{macrocode}
+% Switch to main pagestyle, just like a document with documentclass \textsf{ximera}.
+% \begin{macrocode}
+\pagestyle{main}
+% \end{macrocode}
+% Renew maketitle to usual definition.
+% \begin{macrocode}
+\let\maketitle\othermaketitle
+% \end{macrocode}
+% And we finish with our redefinition of |\maketitle|.
+% \begin{macrocode}
+}
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% \subsubsection{Regular activities}
+% \DescribeMacro{\activity}{Documents included with |\activity| will
+% be included in the body of the xourse document. Any |\input|
+% commands within included \textsf{ximera} documents will be ignored.
+% Any |\usepackage| commands within included ximera documents will
+% cause an error. Overlapping |\newcommand| definitions within
+% multiple ximera documents included simultaneously will cause an
+% error.} The |\activity| command inputs the file name provided
+% without |\documentclass|, without
+% |\begin{document}|/|\end{document}| and without any inputs in the
+% preamble of the included file.
+% \begin{macrocode}
+%<*classXourse>
+\ifnonewpage
+\newcommand{\activity}[2][]{%
+ \setkeys{activity}{#1}
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup\par\vspace{\topsep}
+ \let\input\otherinput}
+\else
+\newcommand{\activity}[2][]{%
+ \setkeys{activity}{#1}
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup\clearpage
+ \let\input\otherinput}
+\fi
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\activity[2][]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<a class="activity card \activitystyle" href="#2" data-options="#1">#2</a>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+
+% When running xake, we can just ignore activities
+% \begin{macrocode}
+%<*classXourse>
+\ifxake
+\renewcommand\activity[2][]{}
+\fi
+%</classXourse>
+% \end{macrocode}
+
+
+% \subsubsection{Practice activities}
+% \DescribeMacro{\practice}{Like |\activity| but not expecting a title.}
+% \begin{macrocode}
+%<*classXourse>
+\ifhandout
+\newcommand{\practice}[2][]{
+ \setkeys{practice}{#1}%!!!!!
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup
+ \let\input\otherinput}
+\else
+\newcommand{\practice}[2][]{\texttt{\detokenize{#2}}%% gives file name for practice
+ \setkeys{practice}{#1}%!!!!!
+ \renewcommand{\input}[1]{}
+ \begingroup\skip@preamble\otherinput{#2}\endgroup
+ \let\input\otherinput}
+\fi
+\relax
+%</classXourse>
+% \end{macrocode}
+
+% The practice environment does nothing, but will eventually produce
+% exercises at the end of an activity
+% \begin{macrocode}
+%<*classXourse>
+\ifxake
+\renewcommand\practice[2][]{}
+\fi
+%</classXourse>
+% \end{macrocode}
+
+% I suppose it is reasonable for practice cards to NOT have an activitystyle, since the activitystyle is basically PRACTICE.
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\practice[2][]{%
+ \ifvmode\IgnorePar\fi\EndP%
+ \HCode{<a class="activity card practice" href="#2" data-options="#1">#2</a>}%
+ \IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/answer.dtx b/macros/latex/contrib/ximera/src/answer.dtx
new file mode 100644
index 0000000000..c6f5460d05
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/answer.dtx
@@ -0,0 +1,111 @@
+% \subsubsection{Answers}
+% \DescribeMacro{\answer}{A math answer}
+% \begin{macrocode}
+%<*classXimera>
+
+\ifdefined\HCode
+\newcommand{\recordvariable}[1]{}
+\else
+\newwrite\idfile
+\immediate\openout\idfile=\jobname.ids
+\newcommand{\recordvariable}[1]{\ifthenelse{\equal{#1}{}}{}{\immediate\write\idfile{var #1;}}}
+\fi
+% \end{macrocode}
+% Determines if answer is shown in handout mode. when |given=true|,
+% show answer in handout mode, show answer in ``given box'' outside
+% handout mode. When |given=false|, do not show answer in handout
+% mode, show answer outside handout mode
+% \begin{macrocode}
+\define@key{answer}{given}[true]{\def\ans@given{#1}}
+% \end{macrocode}
+% Used for setting numeric answer tolerance for online student input.
+% \begin{macrocode}
+\define@key{answer}{tolerance}{\def\ans@tol{#1}}
+% \end{macrocode}
+% Used to run dynamic js code on student provided answers. Note:
+% currently pdf outputs the validator code itself.
+% \begin{macrocode}
+\define@key{answer}{validator}{}
+% \end{macrocode}
+% Used for assigning a js ID to answer for dynamic code (eg validators).
+% \begin{macrocode}
+\define@key{answer}{id}{\def\ans@id{#1}}
+% \end{macrocode}
+% Used to set anticipated input format; eg "string".
+% \begin{macrocode}
+\define@key{answer}{format}{}
+% \end{macrocode}
+% Used to hide the answer input box on the web.
+% \begin{macrocode}
+\define@key{answer}{onlinenoinput}[false]{}
+% \end{macrocode}
+% Used to add a `show answer' button to the answer blank.
+% \begin{macrocode}
+\define@key{answer}{onlineshowanswerbutton}[false]{}
+% \end{macrocode}
+% Set default values for |\answer| command |key=value| pairs.
+% Default values are |given = false|.
+% \begin{macrocode}
+\setkeys{answer}{id=,given=false,onlinenoinput=false,onlineshowanswerbutton=false}
+% \end{macrocode}
+% Basic code for |\answer|.
+% \begin{macrocode}
+
+% Options for handout
+\newcommand{\answerFormatLength}{2cm}
+
+\newcommand{\answerFormatDots}[1]{\ldots\ldots}
+\newcommand{\answerFormatLine}[1]{\protect\rule{\answerFormatLength}{0.4pt}}
+\newcommand{\answerFormatFlexibleLine}[1]{\protect\rule{\widthof{$#1$}*2}{0.4pt}}
+\newcommand{\answerFormatFlexibleBox}[1]{\fbox{\scalebox{2}{\phantom{$#1$}}}}
+
+% options for default (i.e with answers filled in)
+\newcommand{\answerFormatPlain}[1]{\ensuremath{#1}}
+\newcommand{\answerFormatBlue}[1]{\color{blue}\ensuremath{#1}}
+\newcommand{\answerFormatBoxed}[1]{\fbox{\ensuremath{#1}}}
+\newcommand{\answerFormatBoxedGiven}[1]{\underset{\scriptstyle\mathrm{given}}{\fbox{\ensuremath{#1}}}}
+
+% defaults for handout and default mode, and for \answer[given]
+\let\handoutAnswerFormat\answerFormatDots
+\let\defaultAnswerFormat\answerFormatBlue
+\let\givenAnswerFormat\answerFormatBoxedGiven
+
+\newcommand{\answer}[2][]{%
+ \ifmmode%
+ \setkeys{answer}{#1}%
+ \recordvariable{\ans@id}
+ \ifthenelse{\boolean{\ans@given}}
+ {% Start then statement
+ \ifhandout
+ #2
+ \else
+ \givenAnswerFormat{#2} %% in case the argument helps formatting
+ \fi
+ }% End then statement
+ {% Start else statement
+ \ifhandout
+ \handoutAnswerFormat{#2} %% in case the argument helps formatting
+ \else% show answer in box outside handout mode
+ \defaultAnswerFormat{#2} %% in case the argument helps formatting
+ \fi
+ }% End else statement
+ \else%
+ \GenericError{\space\space\space\space}% Throw an error based on... something? -- Jason
+ {Attempt to use \@backslashchar answer outside of math mode}
+ {See https://github.com/ximeraProject/ximeraLatex for explanation.}
+ {Need to use either inline or display math.}%
+ \fi
+}
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, |\answer| emits spans---but it is usually just
+% handled directly by MathJax.
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\answer}[2][false]{\HCode{<span class="answer respondable">}#2\HCode{</span>}}
+
+\def\validator[#1]{\stepcounter{identification}\HCode{<div class="validator" id="validator\arabic{identification}"><script type="text/javascript">function validator\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script>}}
+\def\endvalidator{\HCode{</div>}}
+
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/banner.dtx b/macros/latex/contrib/ximera/src/banner.dtx
new file mode 100644
index 0000000000..ec5d62b283
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/banner.dtx
@@ -0,0 +1,21 @@
+% \begin{macrocode}
+%<*classXimera>
+\let\m\message
+\def\w{\m{::}}\def\t{\m{:::}}\def\s{\m{ }}\def\n{\m{^^J}}\def\u{::'}\def\d{'::}\def\v{:::::}
+\n
+\m{\d.}\s\m{.\u}\w\m{}\m{\v}\s\s\m{\v}\m{}\m{.\v\v\v::::.}\s\m{}\t\n
+\s\m{\d.\u}\s\w\t\t\s\t\t\w\m{}\s\s\s\s\s\s\s\t\s\m{\u::}\n
+\s\s\t\s\s\w\t\m{}\t\t\m{}\t\m{ ::::\v}\m{.\v:\u}\m{}\m{\u}\m{\d}\n
+\s\m{.\u::.}\s\w\t\m{}\t\t\m{}\t\w\s\s\s\s\w\m{}\m{\d.}\s\m{\u}\s\m{\d}\n
+\m{.\u}\s\m{\d.}\w\t\s\m{':\u}\s\t\m{\d\v::}\w\s\m{}\m{\d.\u}\s\s\m{\d}\n
+\n
+\let\w\undefined
+\let\t\undefined
+\let\s\undefined
+\let\n\undefined
+\let\u\undefined
+\let\d\undefined
+\let\v\undefined
+\let\m\undefined
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/choice.dtx b/macros/latex/contrib/ximera/src/choice.dtx
new file mode 100644
index 0000000000..70770cd24e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/choice.dtx
@@ -0,0 +1,226 @@
+% \subsubsection{Multiple choice and the like}
+% \DescribeEnv{multipleChoice}{Multiple choice}
+% \begin{macrocode}
+%<*classXimera>
+% Jim: Originally this was \renewcommand{\theenumi}{$(\mathrm{\alph{enumi}})$}
+% but that breaks tex4ht because mathmode can only be processed by mathjax.
+% so now I made this just italicized.
+% \end{macrocode}
+% \subsubsection{Options}
+% \begin{macrocode}
+\define@key{choice}{value}[]{\def\choice@value{#1}}
+% \end{macrocode}
+% This flags the answer as the correct answer
+% \begin{macrocode}
+\define@boolkey{choice}{correct}[true]{\def\choice@correct{#1}}
+% \end{macrocode}
+% Use an ID to refer to the choice.
+% \begin{macrocode}
+\define@key{multipleChoice}{id}{\def\mc@id{#1}}
+% \end{macrocode}
+% |\otherchoice| outputs the item if correct and nothing if incorrect.
+% \begin{macrocode}
+\define@key{otherchoice}{value}[]{\def\otherchoice@value{#1}}
+\define@boolkey{otherchoice}{correct}[true]{\def\otherchoice@correct{#1}}
+% \end{macrocode}
+% Default key choices for multiple choice options.
+% Default for choice pairs.
+% Default: answers without the option "correct=true" is "incorrect".
+% \begin{macrocode}
+\setkeys{choice}{correct=false,value=}
+% \end{macrocode}
+% Defaults for multipleChoice pairs.
+% Default to no id? -- Jason
+% \begin{macrocode}
+\setkeys{multipleChoice}{id=}
+% \end{macrocode}
+% Defaults for otherchoice pairs.
+% Default "otherchoice" to behave like "choice" for error checking.
+% \begin{macrocode}
+\setkeys{otherchoice}{correct=false,value=}
+%</classXimera>
+% \end{macrocode}
+%
+% \subsubsection{Choices}
+% \DescribeMacro{\choice}{Like |\item| but for choice environments.}
+% choice command denotes a possible answer choice for the multiple choice question.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\choice}[2][]{%
+\setkeys{choice}{#1}%
+\item{#2}
+\ifthenelse{\boolean{\choice@correct}}
+ {% Begin then result
+ \ifhandout% if it's a handout do nothing.
+ \else% otherwise place a checkmark when you select the "correct choice"... maybe? -- Jason
+ \,\checkmark\,\setkeys{choice}{correct=false}
+ \fi
+ }% End then result
+ {}% Begin/End else result.
+}
+
+%Define an expandable version of choice Not really meant to be used outside this package (used in wordChoice)
+% Is there a reason we can't just always use this as default? -- Jason
+\newcommand{\choiceEXP}[2][]{%
+ \expandafter\setkeys\expandafter{choice}{#1}%
+ \item{#2}
+ \ifthenelse{\boolean{\choice@correct}}
+ {% Begin then result
+ \ifhandout
+ \else
+ \,\checkmark\,\setkeys{choice}{correct=false}
+ \fi
+ }% End then result
+ {}% Begin/End else result.
+ } %% note all the {} are needed in case the choice has [] in it.
+
+% \otherchoice is the \choice used in wordChoice command.
+\newcommand{\otherchoice}[2][]{%
+\ignorespaces%
+\setkeys{otherchoice}{#1}%
+\ifthenelse{\boolean{\otherchoice@correct}}%
+{% Start then result
+#2\ignorespaces\setkeys{otherchoice}{correct=false}\ignorespaces%
+}% End then result
+{}% Start/End else result
+\ignorespaces%
+}%
+\newcommand{\inlinechoice}[2][]{%
+\setkeys{choice}{#1}%
+\iffirstinlinechoice
+(\hspace{-.25em}
+\firstinlinechoicefalse
+\else
+/
+\fi
+#2
+\ifthenelse{\boolean{\choice@correct}}%
+{% Start then result
+\ifhandout\else\checkmark\ignorespaces\setkeys{choice}{correct=false}\ignorespaces\fi%
+}% End then result
+{}% Start/End else result
+\hspace{-.25em}\ignorespaces%
+}
+
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, |\choice| emits |<span>|s.
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{choiceId}
+\renewcommand{\choice}[2][]{%
+\setkeys{choice}{correct=false}%
+\setkeys{choice}{#1}%
+\stepcounter{choiceId}\IgnorePar%
+\HCode{<span class="choice }%
+\ifthenelse{\boolean{\choice@correct}}{\HCode{correct}}{}
+\HCode{" }
+\ifthenelse{\equal{\choice@value}{}}{}{\HCode{data-value="\choice@value" }}
+\HCode{id="choice\arabic{choiceId}">}%
+#2\HCode{</span>}}
+\let\inlinechoice\choice
+%</htXimera>
+% \end{macrocode}
+
+% \subsubsection{Environment(s)}
+% The environment |multipleChoice@| is for internal use only.
+% \DescribeEnv{multipleChoice}{Wrap |\choice|s in a |multipleChoice| environment to make a multiple choice question.}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{multipleChoice}[1][]
+ {% Environment Start Code
+ \setkeys{multipleChoice}{#1}%
+ \recordvariable{\mc@id}%
+ \begin{trivlist}
+ \item[\hskip \labelsep\small\bfseries Multiple Choice:]\hfil
+ \begin{enumerate}
+ }% Note this means that \item has to be the first line after \begin{multipleChoice}.
+ {% Environment End Code
+ \end{enumerate}
+ \end{trivlist}
+ }
+
+%multipleChoice@ is for internal use only! (used in wordChoice)
+%this is simply a wrapper for the sole showing (other)choice.
+\newenvironment{multipleChoice@}[1][]{}{)}
+%</classXimera>
+% \end{macrocode}
+
+
+
+% On the web, you might also expect these to be "problem environments"
+% but they aren't -- they're respondables. You might expect a
+% |\setcounter{choiceId}{0}| here --- that would be wrong, because then
+% the generated IDs would no longer be unique.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{multipleChoice}[1][]
+{\setkeys{multipleChoice}{#1}%
+\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="multiple-choice" }%
+\ifthenelse{\equal{\mc@id}{}}{}{\HCode{data-id="\mc@id" }}%
+\HCode{id="problem\arabic{identification}">}%
+}{\HCode{</div>}\IgnoreIndent}
+\ConfigureEnv{multipleChoice}{}{}{}{}
+%</htXimera>
+% \end{macrocode}
+
+% \subsection{Word choice}
+% \DescribeMacro{\wordChoice}{An in-line version of multipleChoice:
+% uses enumitem package note, it is coded as a single line to avoid
+% unwanted spaces in ``given'' mode.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\wordChoice}[1]{%
+\let\choicetemp\choice% Assign a "choicetemp" command to duplicate choice.
+\ifwordchoicegiven% If wordchoice option is on, we need to juggle around some definitions.
+\let\choice\otherchoice%
+%\begin{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond)
+#1
+%\end{multipleChoice@}% -unnecessary (REMOVE THIS LINE IF THE YEAR IS 2019 or Beyond)
+\else% If it isn't the regular "choice" command should work.
+\let\choice\inlinechoice%
+\begin{multipleChoice@}%
+#1%
+\end{multipleChoice@}%
+\fi%
+\let\choice\choicetemp% Now that choicetmp has been manipulated to what we want, replace choice with it.
+}%
+
+
+%</classXimera>
+% \end{macrocode}
+% This is actually just word choice
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{multipleChoice@}{\refstepcounter{problem}}{}%
+\ConfigureEnv{multipleChoice@}{\stepcounter{identification}\IgnorePar\HCode{<span class="word-choice" id="word-choice\arabic{identification}">}}{\HCode{</span>}\IgnoreIndent}{}{}
+%</htXimera>
+% \end{macrocode}
+
+% \subsection{Select all}
+% \DescribeEnv{selectAll}{A multiple-multiple choice question}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{selectAll}[1][]
+{\begin{trivlist}\item[\hskip \labelsep\small\bfseries Select All Correct Answers:]\hfil\begin{enumerate}}
+ {\end{enumerate}\end{trivlist}}
+%</classXimera>
+% \end{macrocode}
+
+% In the future we need this to (optionally) be displayed in the
+% problem, while the actual code lives in the solution. Here is how
+% this could be implemented: Like the title/maketitle commands, the
+% multiple-choice could be stored in |\themultiplechoice|, flip a
+% boolean, and execute |\makemultiplechoice| at the |\end| of the
+% problem. We should also make a command called |\showchoices| that
+% will show choices in the handout.
+
+% On the web, |selectAll| is handled just like |multipleChoice|.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{selectAll}{\refstepcounter{problem}}{}%
+\ConfigureEnv{selectAll}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="select-all" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}
+%</htXimera>
+% \end{macrocode}
+
+
diff --git a/macros/latex/contrib/ximera/src/clearEnv.dtx b/macros/latex/contrib/ximera/src/clearEnv.dtx
new file mode 100644
index 0000000000..af906995d9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/clearEnv.dtx
@@ -0,0 +1,18 @@
+% \subsubsection{clearEnv}
+% \DescribeMacro{clearEnv}{envName}
+% This macro allows you to delete an environment by redefining it as null. This also deletes any corresponding internal counter - such as those generated by "\newtheorem" command.
+% #1 is envName is the name of the environment you want to clear. This will (re)define the
+% begin and end environments, as well as the internal counter from \newtheoremenv to \relax.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\clearEnv}[1]{
+ %% Syntax: \clearEnv{envName}
+ % #1 is envName is the name of the environment you want to clear. This will (re)define the
+ % begin and end environments, as well as the internal counter from \newtheoremenv to \relax.
+ \expandafter\let\csname #1\endcsname\relax
+ \expandafter\let\csname end#1\endcsname\relax
+ \expandafter\let\csname c@#1\endcsname\relax
+ }
+%</classXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/dialogue.dtx b/macros/latex/contrib/ximera/src/dialogue.dtx
new file mode 100644
index 0000000000..b4b31580df
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/dialogue.dtx
@@ -0,0 +1,28 @@
+% \subsubsection{Dialogues}
+% \DescribeEnv{dialogue}{A dialogue between people.}
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{dialogue}{%
+ \renewcommand\descriptionlabel[1]{\hspace{\labelsep}\textbf{##1:}}
+ \begin{description}%
+}{%
+ \end{description}%
+}
+%</classXimera>
+% \end{macrocode}
+% On the web, the resulting |<dl>| should have an appropriate |class| set.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{dialogue}{\begin{description}}{\end{description}}
+
+\ConfigureList{dialogue}%
+ {\EndP\HCode{<dl \a:LRdir class="dialogue">}%
+ \PushMacro\end:itm
+\global\let\end:itm=\empty}
+ {\PopMacro\end:itm \global\let\end:itm \end:itm
+\EndP\HCode{</dd></dl>}\ShowPar}
+ {\end:itm \global\def\end:itm{\EndP\Tg</dd>}\HCode{<dt
+ class="actor">}\bgroup \bf}
+ {\egroup\EndP\HCode{</dt><dd\Hnewline class="speech">}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/ending.dtx b/macros/latex/contrib/ximera/src/ending.dtx
new file mode 100644
index 0000000000..8f53a0fd27
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/ending.dtx
@@ -0,0 +1,20 @@
+% \subsubsection{The End}
+% It seems that some of the files need to conclude with something or another.
+% \begin{macrocode}
+%<*htXimera>
+\Hinput{ximera}
+%</htXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXourse>
+\Hinput{xourse}
+%</htXourse>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*cfgXimera>
+\begin{document}
+\EndPreamble
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/enumerate.dtx b/macros/latex/contrib/ximera/src/enumerate.dtx
new file mode 100644
index 0000000000..7c37e9743e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/enumerate.dtx
@@ -0,0 +1,10 @@
+% \subsubsection{Enumerate fixes}
+% Make enumerate use a letter
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\theenumi}{\textup{(\alph{enumi})}}
+\renewcommand{\labelenumi}{\theenumi}
+\renewcommand{\theenumii}{\textup{(\roman{enumii})}}
+\renewcommand{\labelenumii}{\theenumii}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/feedback.dtx b/macros/latex/contrib/ximera/src/feedback.dtx
new file mode 100644
index 0000000000..03d09770b8
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/feedback.dtx
@@ -0,0 +1,72 @@
+% \subsubsection{Feedback}
+% \DescribeEnv{feedback}{An initially hidden environment that uncovers itself at an appropriate time.}
+% New Validator rewrite code added by Jason Nowell. Original code
+% orovided by Jim Fowler Validator is an environment designed to run a
+% custom check on answers (usually) using javascript code.
+%
+% Define a placeholder command for validator and feedback.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\PH@Command}{}
+% \end{macrocode}
+% Validator should take an argument and detokenize it and display it
+% at the start of the environment. The original Validator environment
+% had everything framed in an mbox; presumably to make the text look
+% a bit nicer, although this seems redundant with |texttt|. It
+% shouldn't cause any harm so I have left it in for now.
+% \begin{macrocode}
+\newenvironment{validator}[1][]{
+ \def\PH@Command{#1}% Use PH@Command to hold the content and be a target for "\expandafter" to expand once.
+ \mbox{\texttt{\detokenize\expandafter{\PH@Command}}}% Now expand PH@Command once and then detokenize.
+ }{}
+% \end{macrocode}
+% First, if it's a handout, we want feedback to eat everything and
+% then disappear entirely. So we do this:
+% \begin{macrocode}
+\ifhandout%
+\newenvironment{feedback}
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+% \end{macrocode}
+% If this isn't a handout, then we want to display the Feedback by
+% using a label, positioned and formated as a |\item| in a
+% trivlist. It is important that we also detokenize the content of
+% the optional argument, as it is likely to contain javascript or
+% other code that latex won't be able to make sense of.
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% \begin{macrocode}
+\newenvironment{feedback}[1][attempt]{
+
+ \def\PH@Command{#1}% Use PH@Command to hold the content and be a target for "\expandafter" to expand once.
+
+ \begin{trivlist}% Begin the trivlist to use formating of the "Feedback" label.
+ \item[\hskip \labelsep\small\slshape\bfseries Feedback% Format the "Feedback" label. Don't forget the space.
+ (\texttt{\detokenize\expandafter{\PH@Command}}):% Format (and detokenize) the condition for feedback to trigger
+ \hspace{2ex}]\small\slshape% Insert some space before the actual feedback given.
+ }{
+ \end{trivlist}
+ }
+
+\fi
+%</classXimera>
+% \end{macrocode}
+% Feedback environments take an optional parameter (which describes
+% when the feedback is to be provided)
+% \begin{macrocode}
+%<*htXimera>
+\def\feedback{\@ifnextchar[{\@feedbackcode}{\@feedbackattempt}}
+\def\@feedbackattempt{\@feedbackcode[attempt]}
+\def\@feedbackcode[#1]{\stepcounter{identification}%
+\ifvmode \IgnorePar\fi \EndP%
+\ifthenelse{\equal{#1}{attempt}}{\HCode{<div class="feedback" data-feedback="attempt" id="feedback\arabic{identification}">}}%
+{\ifthenelse{\equal{#1}{correct}}{\HCode{<div class="feedback" data-feedback="correct" id="feedback\arabic{identification}">}}%
+{\HCode{<div class="feedback" data-feedback="script" id="feedback\arabic{identification}"><script type="text/javascript">function feedback\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script>}}}}
+\def\endfeedback{\HCode{</div>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/foldable.dtx b/macros/latex/contrib/ximera/src/foldable.dtx
new file mode 100644
index 0000000000..94c5eb36cb
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/foldable.dtx
@@ -0,0 +1,76 @@
+% \subsubsection{Foldable}
+% The package \verb|mdframed| is used to make pretty foldable, but the
+% amsthm/mdframed conflict also messes up the .jax file so we don't
+% load mdframed when performing the xake step. But even the below
+% isn't enough to fix this.
+% \begin{macrocode}
+%\iftikzexport\else\RequirePackage[framemethod=TikZ]{mdframed}\fi
+% \end{macrocode}
+% \DescribeEnv{foldable}{Does it fold?}
+% \begin{macrocode}
+%<*classXimera>
+
+\colorlet{textColor}{black} % since textColor is referenced below
+\colorlet{background}{white} % since background is referenced below
+
+% The core environments. Find results in 4ht file.
+%% pretty-foldable
+%\iftikzexport
+\newenvironment{foldable}{%
+}{%
+}
+%\else
+%\renewmdenv[
+% font=\upshape,
+% outerlinewidth=3,
+% topline=false,
+% bottomline=false,
+% leftline=true,
+% rightline=false,
+% leftmargin=0,
+% innertopmargin=0pt,
+% innerbottommargin=0pt,
+% skipbelow=\baselineskip,
+% linecolor=textColor!20!white,
+% fontcolor=textColor,
+% backgroundcolor=background
+%]{foldable}%
+%\fi
+
+%% pretty-expandable
+%\iftikzexport
+\newenvironment{expandable}{%
+}{%
+}
+%\else
+%\newmdenv[
+% font=\upshape,
+% outerlinewidth=3,
+% topline=false,
+% bottomline=false,
+% leftline=true,
+% rightline=false,
+% leftmargin=0,
+% innertopmargin=0pt,
+% innerbottommargin=0pt,
+% skipbelow=\baselineskip,
+% linecolor=black,
+%]{expandable}%
+%\fi
+
+\newcommand{\unfoldable}[1]{#1}
+
+%</classXimera>
+% \end{macrocode}
+% On the web, these foldable elements could be HTML5 details and summary.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{foldable}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div id="foldable\arabic{identification}" class="foldable">}}{\HCode{</div>}\IgnoreIndent}
+
+\renewenvironment{expandable}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div data-original="expandable" id="foldable\arabic{identification}" class="foldable">}
+
+}{\HCode{</div>}\IgnoreIndent}
+
+\renewcommand{\unfoldable}[1]{\HCode{<span class="unfoldable">}#1\HCode{</span>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/footnotes.dtx b/macros/latex/contrib/ximera/src/footnotes.dtx
new file mode 100644
index 0000000000..cd37a086e4
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/footnotes.dtx
@@ -0,0 +1,63 @@
+% \subsection{How to handle footnotes in this setting.}
+% \DescribeMacro{\footnote}{% Written by Jason Nowell Standard Footnotes in pdf, but expandable parenthetical online. Supports different coloring by using |\colorlet{fncolor}{COLOR}| and setting COLOR to whatever color you want (Default is blue).}%
+%
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{footnoteNum}% This will track footnote numbering for the superscript and for the ID.
+\colorlet{fncolor}{red!30!blue}% This is the footnote text coloring. This will allow users to renew this coloring to their own preference if they want to. The default here is a blue coloring. NOTE: Currently; trying to use `footnotecolor' (as a more descriptive color name) breaks everything on my system pretty spectacularly for some reason. This may be just mine or a clash somewhere in the ximera package, so for now I'm leaving it as `fncolor'.
+\renewcommand{\footnote}[1]{\ifvmode\ShowPar\fi
+ \stepcounter{footnoteNum}% Step the counter to make a new footnote
+ %% The following HCode should setup the javascript function that shows or hides the footnote. If you want to change the footnote location, you may want to change the 'inline' part of x.style.display = 'inline'; to another CSS display type, like 'block' or 'inherit'. Current the `x.display.color' seems to not be working.
+ \HCode{
+ <script type="text/javascript">
+ function footnotefunction(ID) {
+ var x = document.getElementById(ID);
+ if (x.style.display === "none") {
+ x.style.color = "blue";
+ x.style.display = "inline";
+ } else {
+ x.style.display = "none";
+ }
+ }
+ </script>
+ }
+ %% The next command needs \expandafter in order to expand the counter footnoteNum into a roman character for the footnote ID. These seem to work better than arabic numerals in some cases, although why is not clear.
+ %% The next HCode controls the formatting for the actual footnote reference number (ie the superscript), but not the footnote itself.
+ \expandafter\HCode{
+ <span style=
+ "position=relative;
+ vertical-align=baseline;"
+ >
+ <button onclick="footnotefunction('footnote\roman{footnoteNum}')"
+ style=
+ "background:none!important;
+ color:inherit;
+ border:none;
+ padding:0!important;
+ font: inherit;
+ cursor: pointer;"
+ >
+ <sup>}[\arabic{footnoteNum}]\HCode{</sup></button>
+ }
+ %% The next command needs \expandafter in order to expand the counter footnoteNum into a roman character for the footnote ID. These seem to work better than arabic numerals in some cases, although why is not clear. Note that the ID counter style choice (roman vs arabic etc) needs to match the previous HCode choice.
+ %% Currently most of the formatting doesn't seem to work as intended, so that still needs to be figured out and fixed. Ideally we would have the footnote appear as a bubble above the footnote superscript when the footnote superscript is clicked.
+ \expandafter\HCode{
+ <span id="footnote\roman{footnoteNum}"
+ style=
+ "display:none;
+ min-width:20em;
+ position:relative;
+ left:2px;
+ padding:5px;
+ color:blue;
+ word-wrap:break-word;
+ z-index=9999;
+ overflow=auto;"
+ >
+ }
+ \textcolor{fncolor}{(#1)}% Display the actual footnote here with color `fncolor' and within ()'s.
+ \HCode{</span></span>}
+ }% End of footnote definition.
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/freeresponse.dtx b/macros/latex/contrib/ximera/src/freeresponse.dtx
new file mode 100644
index 0000000000..2fe03c5287
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/freeresponse.dtx
@@ -0,0 +1,60 @@
+% \subsubsection{Free response}
+% \DescribeEnv{freeResponse}{A freeform input box.}
+% \begin{macrocode}
+%<*classXimera>
+\newboolean{given} %% required for freeResponse
+\setboolean{given}{true} %% could be replaced by a key=value pair later if needed
+
+\ifhandout
+ \newenvironment{freeResponse}[1][false]%
+ {%
+ \def\givenatend{\boolean{#1}}
+ \ifthenelse{\boolean{#1}}
+ {% Begin then result
+ \begin{trivlist}
+ \item
+ }% End then result
+ {% Begin else result
+ \setbox0\vbox\bgroup
+ }% End else result
+% {}% Don't think this is doing anything? -- Jason
+ }
+ {%
+ \ifthenelse{\givenatend}
+ {% Begin then result
+ \end{trivlist}
+ }% End then result
+ {% Begin else result
+ \egroup
+ }% End else result
+% {}% Don't think this is doing anything? -- Jason
+ }
+\else
+ \newenvironment{freeResponse}[1][false]%
+ {% Environment Beginning Code
+ \ifthenelse{\boolean{#1}}%% Could probably change this with just putting the (given) in the boolean?-- Jason
+ {% Begin then result
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Free Response (Given):\hspace{2ex}]
+ }% End then result
+ {% Begin else result
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Free Response:\hspace{2ex}]
+ }% End else result
+ }
+ {% Environment Ending Code
+ \end{trivlist}
+ }
+\fi
+
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+
+\renewenvironment{freeResponse}{\refstepcounter{problem}}{}%
+\ConfigureEnv{freeResponse}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="free-response" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}%
+
+%</htXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/graded.dtx b/macros/latex/contrib/ximera/src/graded.dtx
new file mode 100644
index 0000000000..24ec67052d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/graded.dtx
@@ -0,0 +1,20 @@
+% \subsection{Grading by points}
+% \DescribeEnv{graded}{The |graded| environment does nothing in latex,
+% but in html, it wraps the activities in a div in order to assign
+% some weight to them for grading.}
+% \begin{macrocode}
+%<*classXourse>
+\newenvironment{graded}[1]{}{}
+%</classXourse>
+% \end{macrocode}
+% So indeed this environment in html wraps the activities in a div in
+% order to assign some number of points to them.
+% \begin{macrocode}
+%<*htXourse>
+\renewenvironment{graded}[1]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<div class="graded" data-weight="#1">}\IgnoreIndent%
+}{
+\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/hideEnv.dtx b/macros/latex/contrib/ximera/src/hideEnv.dtx
new file mode 100644
index 0000000000..5abcdfb0c0
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hideEnv.dtx
@@ -0,0 +1,36 @@
+% \subsubsection{hideEnv}
+% \DescribeMacro{hideEnv}[replacementCode]{environmentName}
+% This macro allows you to hide an environment by name, ensuring it - and all its contents - are no longer visible on the pdf output. It also allows you an optional input to replace the block of content with new (uniform) content if desired.
+% #1 is replacementCode and is optional. This will be code that is executed when the env is executed,
+% even though the content of the environment is hidden.
+% #2 is the name of the environment which gets hidden.
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\hideEnv}[2][]{
+ %% Syntax: \hideEnv[NewCode]{environmentName}
+
+ \expandafter\def\csname temp@#2\endcsname\csname #2\endcsname
+ \expandafter\def\csname temp@end#2\endcsname\csname end#2\endcsname
+ \expandafter\def\csname#2\endcsname{
+ \ifnum\value{depth@Check}<1
+ Suppress Should start here.
+ \suppress
+ \fi
+ \stepcounter{depth@Check}
+
+% Current Depth reported as: \arabic{depth@Check}
+ }
+ \expandafter\def\csname end#2\endcsname{
+ \addtocounter{depth@Check}{-1}
+ \ifnum\value{depth@Check}<1
+ Suppress Should End Here.
+ \endsuppress
+ \fi
+
+% Current Depth reported as: \arabic{depth@Check}
+ \noexpand{#1}
+ }
+ }
+%</classXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/hints.dtx b/macros/latex/contrib/ximera/src/hints.dtx
new file mode 100644
index 0000000000..b777bd8235
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hints.dtx
@@ -0,0 +1,53 @@
+% \subsubsection{Hints}
+% \DescribeEnv{hint}{Hint environments can be embedded inside problems.}
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% Create a counter that will track how deeply nested the current hint is
+% \begin{macrocode}
+\newcounter{hintLevel}
+\setcounter{hintLevel}{0}
+% \end{macrocode}
+% Create an empty shell to renew
+% \begin{macrocode}
+\newenvironment{hint}{}{}
+% \end{macrocode}
+% Now we renew the environment as needed, this should allow support
+% for any transition code that treats some parts as a "handout" and
+% some parts as non-handout. renewing the environment on the fly is a
+% bit hacky.
+% \begin{macrocode}
+\renewenvironment{hint}
+ {
+ \ifhandout
+ \setbox0\vbox\bgroup
+ \else
+ \begin{trivlist}\item[\hskip \labelsep\small\slshape\bfseries Hint:\hspace{2ex}]
+ \small\slshape
+ \fi
+% \end{macrocode}
+% Step up hint level to track the nested level of the hint. This will be used for problem numbering.
+% \begin{macrocode}
+ \stepcounter{hintLevel}
+ }
+ {
+ \ifhandout
+ \egroup\ignorespacesafterend
+ \else
+ \end{trivlist}
+ \fi
+% \end{macrocode}
+% Detract from hint level counter to track hint nested level
+% \begin{macrocode}
+ \addtocounter{hintLevel}{-1}
+ }
+
+\ifhints
+ \renewenvironment{hint}{
+ \begin{trivlist}\item[\hskip \labelsep\small\slshape\bfseries Hint:\hspace{2ex}]
+ \small\slshape}
+ {\end{trivlist}}
+\fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/html.dtx b/macros/latex/contrib/ximera/src/html.dtx
new file mode 100644
index 0000000000..8c0b458bf1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/html.dtx
@@ -0,0 +1,20 @@
+% \subsubsection{Semantic HTML}
+% \DescribeMacro{\textbf}{Using \verb|\textbf| emits a \verb|<strong>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{textbf}{\ifvmode\ShowPar\fi\HCode{<strong>}}{\HCode{</strong>}}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\textit}{Using \verb|\textit| or similar emits an \verb|<em>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{textit}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
+\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\texttt}{Using \verb|\texttt| emits a \verb|<code>| tag.}
+% \begin{macrocode}
+%<*cfgXimera>
+\Configure{texttt}{\ifvmode\ShowPar\fi\HCode{<code>}}{\HCode{</code>}}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/hyperref.dtx b/macros/latex/contrib/ximera/src/hyperref.dtx
new file mode 100644
index 0000000000..d035b4d976
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/hyperref.dtx
@@ -0,0 +1,12 @@
+% We put hyperref after all other packages becuase that is better.
+% \begin{macrocode}
+%<*classXimera>
+% Don't use hyperref when using Tex4ht
+\ifdefined\HCode
+\RequirePackage{hyperref}
+\else
+\RequirePackage[pdfpagelabels,colorlinks=true,allcolors=blue!30!black]{hyperref}
+\pdfstringdefDisableCommands{\def\hskip{}}%% quiets warning
+\fi
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/image.dtx b/macros/latex/contrib/ximera/src/image.dtx
new file mode 100644
index 0000000000..e8e0a96e5a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/image.dtx
@@ -0,0 +1,60 @@
+% \subsubsection{Images}
+% \DescribeEnv{image}{Place images inside an |image| environment. On paper, this centers the image. On the web, this provides additional benefits.}
+% \begin{macrocode}
+%<*classXimera>
+%\newenvironment{image}[1][]{\begin{center}}{\end{center}}
+\NewEnviron{image}[1][3in]{%
+ \begin{center}\resizebox{#1}{!}{\BODY}\end{center}% resize and center
+}
+%</classXimera>
+% \end{macrocode}
+% \DescribeMacro{\alt}{Inside an |image| environment, |\alt| provides alt-text for assistive technology like screenreaders.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\alt}[1]{}
+%</classXimera>
+% \end{macrocode}
+% The |image| environment doesn't actually work in tex4ht as defined
+% with NewEnviron; so this renewenvironment is needed.
+% image-environment also gets formatted in a well, and when the user
+% clicks on the image, it zooms in.
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{imagealt}
+\setcounter{imagealt}{0}
+\renewenvironment{image}[1][]{\stepcounter{imagealt}%
+ \ifvmode \IgnorePar\fi \EndP%
+ \HCode{<div class="image-environment" role="img" aria-labelledby="image-alt-\arabic{imagealt}">}%
+}{\HCode{</div>}}
+\renewcommand{\alt}[1]{\HCode{<div style="display: none;" id="image-alt-\arabic{imagealt}">}#1\HCode{</div>}}
+%</htXimera>
+% \end{macrocode}
+% Although we accept many formats, SVG is preferred on the web.
+% Since we have a different mechanism for producing |alt| text, we
+% want to ignore tex4ht's own method fo producing alt text.
+% \begin{macrocode}
+%<*cfgXimera>
+\DeclareGraphicsExtensions{.jpg,.png,.gif,.svg}
+\Configure{graphics*}
+{svg}{
+ {\Configure{Needs}{File: \Gin@base.svg}\Needs{}}
+ \Picture[]{\csname Gin@base\endcsname.svg \csname a:Gin-dim\endcsname}%
+}
+%</cfgXimera>
+% \end{macrocode}
+% This is a hack to kill |includegraphics| commands in
+% |\documentclass{standalone}| files
+% \begin{macrocode}
+%<*cfgXimera>
+\ifcsname ifstandalone\endcsname
+ \ifstandalone
+ \renewcommand\includegraphics[2][]{}
+ \fi
+%</cfgXimera>
+% \end{macrocode}
+% PGF sometimes causes trouble, but we simply don't care in tex4ht mode.
+% \begin{macrocode}
+%<*htXimera>
+\newcommand{\pgfsyspdfmark}[3]{}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/instructornotes.dtx b/macros/latex/contrib/ximera/src/instructornotes.dtx
new file mode 100644
index 0000000000..c175319f69
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/instructornotes.dtx
@@ -0,0 +1,101 @@
+% \subsubsection{Instructor notes}
+% \begin{macrocode}
+%<*classXimera>
+
+%% instructor intro/instructor notes
+%%
+\ifhandout % what follows is handout behavior
+ \ifinstructornotes
+ \newenvironment{instructorIntro}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Introduction:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \else
+ \newenvironment{instructorIntro}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%If this mysteriously starts breaking
+ % remove \ignorespacesafterend
+ \egroup\ignorespacesafterend
+ }
+ \fi
+\else% for handout, so what follows is default
+\ifinstructornotes
+ \newenvironment{instructorIntro}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \else
+ \newenvironment{instructorIntro}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Introduction:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \fi
+\fi
+
+
+
+
+%% instructorNotes environment
+\ifhandout % what follows is handout behavior
+\ifinstructornotes
+\newenvironment{instructorNotes}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Notes:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \else
+ \newenvironment{instructorNotes}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \fi
+\else% for handout, so what follows is default
+\ifinstructornotes
+\newenvironment{instructorNotes}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+ \else
+ \newenvironment{instructorNotes}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Instructor Notes:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+ \fi
+ \fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/desmos.dtx b/macros/latex/contrib/ximera/src/interactives/desmos.dtx
new file mode 100644
index 0000000000..9a55db8f43
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/desmos.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Desmos}
+% \DescribeMacro{\desmos}{Desmos command. Requires id, width, and height as arguments.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\desmos}[3]{Desmos link: \url{https://www.desmos.com/calculator/#1}}
+\newcommand{\desmosThreeD}[3]{Desmos3D link: \url{https://www.desmos.com/3d/#1}}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\desmos}[3]{\HCode{<iframe src="https://www.desmos.com/calculator/#1" width="100\%" height="#3px" style="border: 1px solid \#ccc" frameborder=0>This browser does not support embedded elements.</iframe>}}
+\renewcommand{\desmosThreeD}[3]{\HCode{<iframe src="https://www.desmos.com/3d/#1" width="#2px" height="#3px" style="border: 1px solid \#ccc" frameborder=0>This browser does not support embedded elements.</iframe>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/geogebra.dtx b/macros/latex/contrib/ximera/src/interactives/geogebra.dtx
new file mode 100644
index 0000000000..696ac32236
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/geogebra.dtx
@@ -0,0 +1,27 @@
+% \subsubsection{Geogebra}
+% \DescribeMacro{\geogebra}{Geogebra command. Requires id, width, and
+% height as arguments.}
+% \begin{macrocode}
+%<*classXimera>
+%Geogebra link
+\newcommand{\geogebra}[3]{Geogebra link: \url{https://www.geogebra.org/m/#1}}
+%</classXimera>
+% \end{macrocode}
+% Define keys for answer geogebra key=value pairs.
+% \begin{macrocode}
+%<*htXimera>
+\define@key{geogebra}{rc}[true]{\def\geo@rc{#1}}
+\define@key{geogebra}{sdz}[true]{\def\geo@sdz{#1}}
+\define@key{geogebra}{smb}[true]{\def\geo@smb{#1}}
+\define@key{geogebra}{stb}[true]{\def\geo@stb{#1}}
+\define@key{geogebra}{stbh}[true]{\def\geo@stbh{#1}}
+\define@key{geogebra}{ld}[true]{\def\geo@ld{#1}}
+\define@key{geogebra}{sri}[true]{\def\geo@sri{#1}}
+%set default key values
+\setkeys{geogebra}{rc=false,sdz=false,smb=false,stb=false,stbh=false,ld=false,sri=false}
+%command definition
+\renewcommand{\geogebra}[4][]{%
+ \setkeys{geogebra}{#1}% Set new keys
+ \HCode{<iframe scrolling="no" src="https://www.geogebra.org/material/iframe/id/#2/width/#3/height/#4/border/888888/rc/\geo@rc/ai/false/sdz/\geo@sdz/smb/\geo@smb/stb/\geo@stb/stbh/\geo@stbh/ld/\geo@ld/sri/\geo@sri/at/auto" width="#3px" height="#4px" style="border:0px; max-width: fit-content"> </iframe>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/google.dtx b/macros/latex/contrib/ximera/src/interactives/google.dtx
new file mode 100644
index 0000000000..cbe75498f1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/google.dtx
@@ -0,0 +1,26 @@
+% \subsubsection{Google Sheet}
+% \DescribeMacro{\googleSheet}{googleSheet command. Requires id,
+% width, and height as arguments. optional arguments are gid for
+% sheet ID and range for cell range. command definition}
+% \begin{macrocode}
+%<*classXimera>
+% Google Spreadsheet link (read only)
+\newcommand{\googleSheet}[5]{%
+ Google Spreadsheet link: \url{https://docs.google.com/spreadsheets/d/#1}%
+}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\googleSheet}[5]{%
+ \ifthenelse{\equal{#4}{}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?widget=true">This browser does not support embedded elements.</iframe>}}%
+ {\ifthenelse{\equal{#5}{}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?single=true&amp;gid=#4&amp;widget=false">This browser does not support embedded elements.</iframe>}}%
+ {\HCode{<iframe width="#2px" height="#3px" src="https://docs.google.com/spreadsheets/d/#1/htmlembed?single=true&amp;gid=#4&amp;range=#5&amp;widget=false">This browser does not support embedded elements.</iframe>}}%
+ }%
+ }%
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/graph.dtx b/macros/latex/contrib/ximera/src/interactives/graph.dtx
new file mode 100644
index 0000000000..154c2803af
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/graph.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Graphs}
+% \DescribeMacro{\graph}{An embedded graph (in math mode).}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\graph}[2][]{\text{Graph of $#2$}}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\graph}[2][]{\HCode{<div class="graph" data-options="#1">}#2\HCode{</div>}}
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/include.dtx b/macros/latex/contrib/ximera/src/interactives/include.dtx
new file mode 100644
index 0000000000..76eaa0dd6f
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/include.dtx
@@ -0,0 +1,22 @@
+% \subsubsection{Including widgets}
+% \DescribeMacro{\includeinteractive}{Cognate to |includegraphics| but
+% instead of a graphics file, accepts a |.js| file which will be
+% loaded as an interactive widget.}
+% \begin{macrocode}
+%<*classXimera>
+\define@key{interactive}{id}{\def\interactive@id{#1}}
+\setkeys{interactive}{id=}
+\newcommand{\includeinteractive}[2][]{
+\setkeys*{interactive}{#1}%
+\ifthenelse{\equal{\interactive@id}{}}{}{\recordvariable{\interactive@id}}
+Interactive
+}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\includeinteractive}[2][]{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div id="interactive\arabic{identification}" class="interactive"> </div>}\HCode{<script src="#2" data-argument="#1" data-target="interactive\arabic{identification}"> </script>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
+
+
diff --git a/macros/latex/contrib/ximera/src/interactives/javascript.dtx b/macros/latex/contrib/ximera/src/interactives/javascript.dtx
new file mode 100644
index 0000000000..c67a7e5235
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/javascript.dtx
@@ -0,0 +1,31 @@
+% \subsubsection{JavaScript}
+
+% \DescribeEnv{javascript}{Code inside a javascript environment is printed on paper, but executed on the web.}
+
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{javascript}{Verbatim}{numbers=left,frame=lines,label=JavaScript,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+% for programming javascript
+\renewenvironment{javascript}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{javascript}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="javascript" id="javascript\arabic{identification}"><script type="text/javascript">}\HtmlParOff}{\HtmlParOn\HCode{</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\js}{Code inside a |\js| macro is evaluated and replaced with its value.}
+% \begin{macrocode}
+%<*classXimera>
+\def\js#1{\mbox{\texttt{\detokenize{#1}}}}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\def\js#1{\stepcounter{identification}\HCode{<span class="inline-javascript" id="javascript\arabic{identification}"><script type="text/javascript"> function javascript\arabic{identification}() }\{\HCode{ return \detokenize{#1}; }\}\HCode{</script></span>}}
+%</htXimera>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/interactives/sagemath.dtx b/macros/latex/contrib/ximera/src/interactives/sagemath.dtx
new file mode 100644
index 0000000000..95d378afde
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/sagemath.dtx
@@ -0,0 +1,43 @@
+% \subsection{SageMath support}
+% Load Sage\TeX\ if it exists.
+% \begin{macrocode}
+%<*classXimera>
+\IfFileExists{sagetex.sty}{\RequirePackage{sagetex}}{}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageCell}{Create an interactive SageMath widget.}
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{sageCell}{Verbatim}{numbers=left,frame=lines,label=SAGE,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{sageCell}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sageCell}{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="sage"><script type="text/x-sage">}\HtmlParOff}{\HtmlParOn\HCode{\Hnewline</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageOutput}{Execute SageMath code and output the result.}
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{sageOutput}{Verbatim}{numbers=left,frame=lines,label=SAGE-Output,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{sageOutput}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sageOutput}{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="sageOutput"><script type="text/x-sage">}}{\HCode{\Hnewline</script></div>}}
+%</htXimera>
+% \end{macrocode}
+
+% \DescribeEnv{sageSilent}{Execute SageMath code without outputing the result.}
+% \begin{macrocode}
+%<*htXimera>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\renewenvironment{sagesilent}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{sagesilent}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="text/sagemath">}\HtmlParOff}{\HtmlParOn\HCode{</script></div>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/interactives/video.dtx b/macros/latex/contrib/ximera/src/interactives/video.dtx
new file mode 100644
index 0000000000..7f7979db3f
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/interactives/video.dtx
@@ -0,0 +1,21 @@
+% \subsubsection{Video}
+% \DescribeMacro{\youtube}{Youtube command. Requires id.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\youtube}[1]{YouTube link: \url{https://www.youtube.com/watch?v=#1}}
+%</classXimera>
+% \end{macrocode}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\youtube}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<div class="video youtube-player" data-youtube="#1">_</div>}}
+%</htXimera>
+% \end{macrocode}
+% Video commands are also emitted, slightly differently, when placed
+% at top-level in a xourse file.
+% \begin{macrocode}
+%<*htXourse>
+\renewcommand\youtube[1]{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<a class="youtube" href="https://www.youtube.com/watch?v=#1">#1</a>}\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/jax.dtx b/macros/latex/contrib/ximera/src/jax.dtx
new file mode 100644
index 0000000000..5441a139e1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/jax.dtx
@@ -0,0 +1,115 @@
+% \subsubsection{MathJax support}
+% When using mathjax, dump all the |\newcommand|s to a |.jax| file.
+%
+% First, create the |.jax| file.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+ \newwrite\myfile
+ \immediate\openout\myfile=\jobname.jax
+\fi
+%</classXimera>
+% \end{macrocode}
+% From |only.dtx| we must also create |prompt| on the MathJax side.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+ \immediate\write\myfile{\unexpanded{\newenvironment}{prompt}{}{}}
+\fi
+%</classXimera>
+% \end{macrocode}
+% Redefine newcommand appropriately.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \else
+\let\@oldargdef\@argdef
+\long\def\@argdef#1[#2]#3{%
+\immediate\write\myfile{\unexpanded{\newcommand}{\unexpanded{#1}}[\unexpanded{#2}]{\unexpanded{#3}}}%
+\@oldargdef#1[#2]{#3}%
+}
+
+\let\@OldDeclareMathOperator\DeclareMathOperator
+\renewcommand{\DeclareMathOperator}[2]{\@OldDeclareMathOperator{#1}{#2}\immediate\write\myfile{\unexpanded{\DeclareMathOperator}{\unexpanded{#1}}{\unexpanded{#2}}}}
+
+\fi
+%</classXimera>
+% \end{macrocode}
+% Include the jax'ed newcommands
+% \begin{macrocode}
+%<*cfgXimera>
+% Remove commands that use @
+\immediate\write18{sed -i "/@/d" \jobname.jax}
+% Replace ##1 with #1 and so forth
+\immediate\write18{sed -i "s/\string#\string#\string\\([0-9]\string\\)/\string#\string\\1/g" \jobname.jax}
+
+\Configure{BVerbatimInput}{}{}{}{}
+
+\Configure{verbatiminput}{}{}{}{}
+
+% Instead of a nonbreaking space, use a standard space
+\makeatletter
+\def\FV@Space{\space}
+\makeatother
+
+% Include the mathjax newcommands in a math/tex script right at the beginning of the body
+\Configure{BODY}{%
+\HCode{<body>\Hnewline}%
+\Tg<div class="preamble">%
+\Tg<script type="math/tex">%
+\BVerbatimInput{\jobname.jax}%
+\Tg</script>%
+\IfFileExists{\jobname.ids}{\HCode{<script type="text/javascript">\Hnewline}%
+\BVerbatimInput{\jobname.ids}%
+\HCode{</script>\Hnewline}%
+\Tg</div>%
+}{}
+}{%
+\HCode{</body>\Hnewline}%
+}
+% \end{macrocode}
+% Now I just need to add a newcommand command which outputs the
+% appropriate newcommands to MathJax; then this should be "good
+% enough" for our purposes.
+% \begin{macrocode}
+\newtoks\eqtoks
+\def\AltMath#1${\eqtoks{#1}%
+ \HCode{<script type="math/tex">\the\eqtoks</script>}$}
+\Configure{$}{}{}{\expandafter\AltMath}
+
+\def\AltlMathI#1\){\eqtoks{#1}%
+ \HCode{<script type="math/tex">\the\eqtoks</script>}\)}
+\Configure{()}{\AltlMathI}{}
+
+\def\AltlDisplay#1\]{\eqtoks{#1}%
+ \HCode{<script type="math/tex; mode=display">\the\eqtoks</script>}\]}
+\Configure{[]}{\AltlDisplay}{}
+
+\def\AltlDisplayI#1$${\eqtoks{#1}%
+ \HCode{<script type="math/tex; mode=display">\the\eqtoks</script>}$$}
+\Configure{$$}{}{}{\expandafter\AltlDisplayI}
+% \end{macrocode}
+% Need to turn off htmlpar too, as expained in http://tex.stackexchange.com/questions/204930/vertical-spaces-in-htlatex-scriptenv
+% \begin{macrocode}
+\newcommand\VerbMath[1]{%
+\renewenvironment{#1}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{#1}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="math/tex; mode=display"> \string\begin{#1}\Hnewline}\HtmlParOff}{\HtmlParOn\HCode{\string\end{#1}</script>}}
+}
+% \end{macrocode}
+% This is a fix for the LAODE book, which uses matlabEquation as if it were an equation
+% \begin{macrocode}
+\ScriptEnv{matlabEquation}{\ifvmode \IgnorePar\fi \EndP\HCode{<script type="math/tex; mode=display"> \string\begin{equation}\Hnewline}\HtmlParOff}{\HtmlParOn\HCode{\string\end{equation}</script>}}
+
+\VerbMath{equation}
+\VerbMath{equation*}
+\VerbMath{align}
+\VerbMath{align*}
+\VerbMath{alignat}
+\VerbMath{alignat*}
+\VerbMath{eqnarray}
+\VerbMath{eqnarray*}
+
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/labels.dtx b/macros/latex/contrib/ximera/src/labels.dtx
new file mode 100644
index 0000000000..05ecf31fc9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/labels.dtx
@@ -0,0 +1,15 @@
+% \subsubsection{Labels and references}
+% Labels and refs both generate anchors.
+% \DescribeMacro{\label}{A |\label| can be referenced from any file in the xourse.}
+% \begin{macrocode}
+%<*htXimera>
+\let\oldlabel\label
+\renewcommand{\label}[1]{\oldlabel{#1}\HCode{<a class="ximera-label" id="#1"></a>}}
+%</htXimera>
+% \end{macrocode}
+% \DescribeMacro{\ref}{A |\ref| can connect one \TeX\ file to another if they are in the same xourse.}
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\ref}[1]{\HCode{<a class="reference" href="\##1">#1</a>}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/leash.dtx b/macros/latex/contrib/ximera/src/leash.dtx
new file mode 100644
index 0000000000..b52b5e2bf0
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/leash.dtx
@@ -0,0 +1,18 @@
+% \subsubsection{Leashes}
+% \DescribeEnv{leash}{Put content inside a scrollable box.}
+% \begin{macrocode}
+%<*classXimera>
+
+\newenvironment{leash}[1]{%
+}{%
+}
+
+
+%</classXimera>
+% \end{macrocode}
+
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{leash}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<div style="overflow: auto; height: #1px">}}{\HCode{</div>}\IgnoreIndent}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/link.dtx b/macros/latex/contrib/ximera/src/link.dtx
new file mode 100644
index 0000000000..9e76659e83
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/link.dtx
@@ -0,0 +1,31 @@
+% Hyperlinks to outside documents
+% \begin{macrocode}
+%<*classXimera>
+\newcommand*{\link}[2][]{#1%
+ \ifthenelse{\equal{#1}{}}%
+ {\footnote{Link: \url{#2}}}%
+ {\footnote{See #1 at \url{#2}}}
+ }
+%</classXimera>
+% \end{macrocode}
+
+
+% \begin{macrocode}
+%<*htXimera>
+% This is a command used in versions of documents created with
+% these classes; in Jim's opinion it should be deprecated for |\href|
+% Bart on the other hand likes |\link|
+\renewcommand*{\link}[2][]{%
+\ifthenelse{\equal{#1}{}}%
+{\url{#2}}
+{\href{#2}{#1}}}
+%\renewcommand*{\link}[2][]{%
+%\ifthenelse{\equal{#1}{}}%
+%{\url{#2}}
+%{\href{#2}{#1}}}
+
+% because hyperref redefines stuff atbegindocument, we do too.
+\AtBeginDocument{\renewcommand{\ref}[1]{\HCode{<a class="reference" href="\##1">#1</a>}}}
+
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/logo.dtx b/macros/latex/contrib/ximera/src/logo.dtx
new file mode 100644
index 0000000000..cbe808502a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/logo.dtx
@@ -0,0 +1,30 @@
+% \subsection{Logos}
+% \DescribeMacro{\logo}{A logo for the xourse.}
+% \begin{macrocode}
+%<*classXourse>
+\newcommand*{\logo}[1]{%
+ \ifx\@onlypreamble\@notprerr
+ \ClassError{xourse}{logo can only be used in the preamble}
+ {Move your logo command to the preamble}
+ \else %
+ \IfFileExists{#1}%
+ {\gdef\xourse@logo{#1}}%
+ {\ClassError{xourse}{logo file does not exist}
+ {To use logo, make sure that the referenced image file exists}}%
+ \fi%
+}
+
+%</classXourse>
+% \end{macrocode}
+
+% The xourse logo is an |og:image| in the opengraph taxonomy.
+% \begin{macrocode}
+%<*htXourse>
+\Configure{@HEAD}{%
+ \HCode{<meta name="og:image" content="}%
+\ifdefined\xourse@logo%
+ \xourse@logo%
+\fi%
+\HCode{" />\Hnewline}}%
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/macros.dtx b/macros/latex/contrib/ximera/src/macros.dtx
new file mode 100644
index 0000000000..0968942be5
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/macros.dtx
@@ -0,0 +1,14 @@
+% \subsubsection{Macros}
+% Makes everymath display style even when inline, could be optional.
+% \begin{macrocode}
+%<*classXimera>
+\everymath{\displaystyle}
+%</classXimera>
+% \end{macrocode}
+% Ok not everything, we also need to configure ``display style'' limits.
+% \begin{macrocode}
+%<*classXimera>
+\let\prelim\lim
+\renewcommand{\lim}{\displaystyle\prelim}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/makeCounter.dtx b/macros/latex/contrib/ximera/src/makeCounter.dtx
new file mode 100644
index 0000000000..2e898255e7
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/makeCounter.dtx
@@ -0,0 +1,37 @@
+% \subsubsection{Utility macros}
+% These are a list of new utility macros that are generally useful and are loaded after packages and the Tikz Fix.
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{NewCounter}
+% Improved version of |\newcounter| to check for existance before creating a counter to minimize conflicts with packages. Added by Jason Nowell
+% \begin{macrocode}
+\newcommand{\Make@Counter}[1]{% This is an internal macro that should probably be depreciated for the below universal macro.
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+
+\newcommand{\MakeCounter}[1]{%% Code located in "Utilitymacros.dtx"
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+% \end{macrocode}
+%</classXimera>
+% \end{macro}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/metadata.dtx b/macros/latex/contrib/ximera/src/metadata.dtx
new file mode 100644
index 0000000000..5f33cde072
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/metadata.dtx
@@ -0,0 +1,32 @@
+% \subsubsection{Metadata}
+% To encourage authors to include relevant parseable metadata in the
+% preamble, we define some currently ignored commands.
+
+% \DescribeMacro{\license}{In the preamble, use |\license| with an SPDX license expression.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\license}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\acknowledgement}{In the preamble, use |\acknowledgement| to credit others who contributed to the intellectual content beside the author.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\acknowledgement}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+
+% \DescribeMacro{\tag}{In the preamble, a |\tag| provides a free-form taxonomy.}
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\tag}{\excludecomment}
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, we mark the file as the appropriate kind of
+% object---either activity or xourse.
+% \begin{macrocode}
+%<*htXourse>
+% Mark this as a xourse file
+\Configure{@HEAD}{\HCode{<meta name="description" content="xourse" />\Hnewline}}
+%</htXourse>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/only.dtx b/macros/latex/contrib/ximera/src/only.dtx
new file mode 100644
index 0000000000..cdb676c90e
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/only.dtx
@@ -0,0 +1,38 @@
+% \subsubsection{Only}
+
+% \DescribeEnv{prompt}{The prompt part for mathmode}
+% \begin{macrocode}
+%<*classXimera>
+\ifxake
+ \newenvironment{prompt}{}{}
+\else
+\ifhandout
+ \NewEnviron{prompt}{}
+% Currently breaks when put in mathmode!
+% \newenvironment{prompt}{\suppress}{\endsuppress}
+\else
+ \newenvironment{prompt}
+ {\bgroup\color{gray!50!black}}
+ {\egroup}
+\fi
+\fi
+% \end{macrocode}
+
+% \DescribeEnv{onlineOnly}{Only display it online}
+% \begin{macrocode}
+\ifhandout
+ \NewEnviron{onlineOnly}{
+ \iftikzexport
+ \BODY
+ \else
+ \fi
+ }
+\else
+ \newenvironment{onlineOnly}
+ {\bgroup\color{red!50!black}}
+ {\egroup}
+\fi
+
+\newcommand{\pdfOnly}[1]{\iftikzexport\else #1\fi}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/options.dtx b/macros/latex/contrib/ximera/src/options.dtx
new file mode 100644
index 0000000000..7e131bb0ba
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/options.dtx
@@ -0,0 +1,123 @@
+% \subsection{Options for the class}
+% We start by listing the options for the \textsf{ximera} document class. Note, since the \textsf{xourse} class is based on the \textsf{ximera} class, all listed options are available there too.
+%
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{handout}
+% The default behavior of the class is to display \textbf{all} content. This means that if any questions are asked, all answers are shown. Moreover, some content will only have a meaningful presentation when displayed online. When compiled without any options, this content will be shown too. This option will supress such content and generate a reasonable printiable ``handout.''
+% \begin{macrocode}
+\newif\ifhandout
+\handoutfalse
+\DeclareOption{handout}{\handouttrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{noauthor}
+% By default, authors are listed at the bottom of the first page of a document. This option will supress the listing of the authors.
+% \begin{macrocode}
+\newif\ifnoauthor
+\noauthorfalse
+\DeclareOption{noauthor}{\noauthortrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{nooutcomes}
+% By default, learning outcomes are listed at the bottom of the first page of a document. This option will supress the listing of the learning outcomes.
+% \begin{macrocode}
+\newif\ifnooutcomes
+\nooutcomesfalse
+\DeclareOption{nooutcomes}{\nooutcomestrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{instructornotes}
+% This option will turn on (and off) notes written for the instructor.
+% \begin{macrocode}
+\newif\ifinstructornotes
+\instructornotesfalse
+\DeclareOption{instructornotes}{\instructornotestrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{noinstructornotes}
+% This option will turn off (and on) notes written for the instructor.
+% \begin{macrocode}
+\DeclareOption{noinstructornotes}{\instructornotestrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{hints}
+% When the \texttt{handout} options is used, hints are not shown. This option will make hints visible in handout mode.
+% \begin{macrocode}
+\newif\ifhints
+\hintsfalse
+\DeclareOption{hints}{\hintstrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{newpage}
+% This option will start each problem-like environment (\texttt{exercise}, \texttt{question}, \texttt{problem}, and \texttt{exploration}) start on a new page.
+% \begin{macrocode}
+\newif\ifnewpage
+\newpagefalse
+\DeclareOption{newpage}{\newpagetrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{numbers}
+% This option will number the titles of the activity. By default the activities are unnumbered.
+% \begin{macrocode}
+\newif\ifnumbers
+\numbersfalse
+\DeclareOption{numbers}{\numberstrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{wordchoicegiven}
+% This option will replace the choices shown by \texttt{wordChoice} with the correct choice. No indication of the \texttt{wordChoice} environment will be shown.
+% \begin{macrocode}
+\newif\ifwordchoicegiven
+\wordchoicegivenfalse
+\DeclareOption{wordchoicegiven}{\wordchoicegiventrue}
+\newif\iffirstinlinechoice% Support for other wordchoice command contents.
+\firstinlinechoicetrue
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+
+\newif\ifxake
+\xakefalse
+\DeclareOption{xake}{\xaketrue}
+
+\newif\iftikzexport
+\tikzexportfalse
+\DeclareOption{tikzexport}{%
+ \tikzexporttrue%
+ \handoutfalse%
+ \numbersfalse%
+ \newpagefalse%
+ \hintsfalse%
+ \nooutcomesfalse%
+}
+
+\DeclareOption*{%
+ \PassOptionsToClass{\CurrentOption}{article}%
+}
+\ProcessOptions\relax
+\LoadClass{article}
+
+\ifdefined\HCode
+ \xaketrue%
+ \tikzexporttrue%
+ \handoutfalse%
+ \numbersfalse%
+ \newpagefalse%
+ \hintsfalse%
+ \nooutcomesfalse%
+\fi
+
+%</classXimera>
+% \end{macrocode}
+
+
+
diff --git a/macros/latex/contrib/ximera/src/optionsxourse.dtx b/macros/latex/contrib/ximera/src/optionsxourse.dtx
new file mode 100644
index 0000000000..1217fce199
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/optionsxourse.dtx
@@ -0,0 +1,27 @@
+% \begin{macrocode}
+%<*classXourse>
+% \end{macrocode}
+% \begin{macro}{notoc}
+% The default behavior of the class is to provide a table of contents listing all activities in the course. This option will supress this table of contents.
+% \begin{macrocode}
+\newif\ifnotoc
+\notocfalse
+\DeclareOption{notoc}{\notoctrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{nonewpage}
+% The default behavior of the class is to start each activity on a new page. This option will start activities without making a new page.
+% \begin{macrocode}
+\newif\ifnonewpage
+\nonewpagefalse
+\DeclareOption{nonewpage}{\nonewpagetrue}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\DeclareOption*{\PassOptionsToClass{\CurrentOption}{ximera}}
+\ProcessOptions\relax
+\LoadClass{ximera}
+% \begin{macrocode}
+%</classXourse>
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/outcomes.dtx b/macros/latex/contrib/ximera/src/outcomes.dtx
new file mode 100644
index 0000000000..1e174b7655
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/outcomes.dtx
@@ -0,0 +1,34 @@
+% \subsubsection{Learning Outcomes}
+% \DescribeMacro{\outcome}{Specify a learning outcome, either at the level of a |problem| or an entire document in the preamble.}
+% \begin{macrocode}
+%<*classXimera>
+\def\theoutcomes{}
+
+\ifdefined\HCode%
+ \newcommand{\outcome}[1]{}
+\else%
+ \newwrite\outcomefile
+ \immediate\openout\outcomefile=\jobname.oc
+
+ \newcommand{\outcome}[1]{\edef\theoutcomes{\theoutcomes #1~}%
+ \immediate\write\outcomefile{\unexpanded{\outcome}{#1}}}
+ \fi%
+%</classXimera>
+% \end{macrocode}
+% These can appear in either the preamble or in problem environments.
+% with pdflatex, we produce the .oc file which includes ALL the
+% outcomes; in the tex4ht world, we just produce spans for the
+% specific outcomes.
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\outcome}[1]{
+ \Configure{@HEAD}{\HCode{<meta name="learning-outcome" content="#1"/>\Hnewline}}
+}
+% Sometimes there are no outcomes at all
+\IfFileExists{\jobname.oc}{\input{\jobname.oc}}{}
+
+\renewcommand{\outcome}[1]{%
+ \HCode{<span class="learning-outcome">#1</span>}
+}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/packages.dtx b/macros/latex/contrib/ximera/src/packages.dtx
new file mode 100644
index 0000000000..72fb4c6e2a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/packages.dtx
@@ -0,0 +1,54 @@
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \subsection{Loading packages}
+% Since we want |\cancel| to work, we load it here to avoid polluting the |.jax| output.
+% \begin{macrocode}
+\RequirePackage[makeroom]{cancel}
+% \end{macrocode}
+% Quite a few packages are required by the document class. This is a
+% list of required packages. As packages are added to this list, we
+% should include a comment as to where they are being utilized. This
+% will help keep this list from being redundant and/or outdated.
+% \begin{macrocode}
+\RequirePackage[inline]{enumitem}
+\RequirePackage[pagestyles]{titlesec}
+\RequirePackage{titletoc}
+\RequirePackage{titling}
+\RequirePackage{url}
+\RequirePackage[table]{xcolor}
+\RequirePackage{tikz}
+\RequirePackage{pgfplots}
+\usepgfplotslibrary{groupplots}
+\usetikzlibrary{calc}
+\RequirePackage{fancyvrb}
+% \end{macrocode}
+% Load |forloop| for the problem environment dynamic naming and
+% building.
+% \begin{macrocode}
+\RequirePackage{forloop}
+% \end{macrocode}
+% Now we load even more packages.
+% \begin{macrocode}
+\RequirePackage{environ}% Included to allow saving of environment contents. This does *not* play well with various verbatem environments however and would be great to find a way around utilizing this package. One option is the "Suppress" command included below.
+\RequirePackage{amssymb}% Included to have access to math typeset.
+\RequirePackage{amsmath}% Included to have access to math typeset.
+\RequirePackage{amsthm}% Included to have access to math typeset.
+\RequirePackage{xifthen}% http://ctan.org/pkg/xifthen
+\RequirePackage{multido}% http://ctan.org/pkg/multido
+\RequirePackage{listings} %% is this required???
+
+\RequirePackage{xkeyval}
+
+\RequirePackage{comment}
+%</classXimera>
+% \end{macrocode}
+% Various packages must be loaded early to avoid polluting the |.jax|
+% file.
+% \begin{macrocode}
+%<*classXimera>
+\RequirePackage{gettitlestring}
+\RequirePackage{nameref}
+\RequirePackage{epstopdf}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/pagesetup.dtx b/macros/latex/contrib/ximera/src/pagesetup.dtx
new file mode 100644
index 0000000000..9bf13d3cd9
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/pagesetup.dtx
@@ -0,0 +1,55 @@
+% \subsection{Page setup}
+% We want non-indented spaced-out paragraphs.
+% \begin{macrocode}
+%<*classXimera>
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt}
+%</classXimera>
+% \end{macrocode}
+% To avoid weird margins in 2-sided mode, change the margins.
+% \begin{macrocode}
+%<*classXimera>
+\oddsidemargin 62pt
+\evensidemargin 62pt
+\textwidth 345pt
+\headheight 14pt
+%</classXimera>
+% \end{macrocode}
+% On the HTML side, there is more complicated page setup to perform.
+% \begin{macrocode}
+%<*cfgXimera>
+\Preamble{xhtml}
+
+% We don't want to translate font suggestions with ugly wrappers like
+% <span class="cmti-10"> for italic text
+\NoFonts
+
+% Don't output xml version tag
+\Configure{VERSION}{}
+
+% Output HTML5 doctype instead of the default for HTML4
+\Configure{DOCTYPE}{\HCode{<!doctype html>\Hnewline}}
+
+% Custom page opening
+\Configure{HTML}{\HCode{<html lang="en">\Hnewline}}{\HCode{\Hnewline</html>}}
+
+% Reset <head>, aka delete all default boilerplate; alternatively set up new content
+\Configure{@HEAD}{\HCode{<meta name="generator" content="TeX4ht (http://www.cse.ohio-state.edu/\string~gurari/TeX4ht/)" />\Hnewline}}
+\Configure{@HEAD}{\HCode{<meta name="ximera" content="version 0.0.1" />\Hnewline}}
+\Configure{@HEAD}{\HCode{<link href="https://ximera.osu.edu/public/stylesheets/standalone.css" rel="stylesheet" media="screen"/>\Hnewline}}
+\Configure{@HEAD}{\HCode{<script type="text/javascript" async src="https://ximera.osu.edu/public/javascripts/standalone.min.js"></script>\Hnewline}}
+%</cfgXimera>
+% \end{macrocode}
+% Disable certain ligatures in HTML.
+% \begin{macrocode}
+%<*htXimera>
+\usepackage{microtype}
+\DisableLigatures[f]{encoding=*}
+%</htXimera>
+% \end{macrocode}
+% I am not sure what this does.
+% \begin{macrocode}
+%<*htXimera>
+\NewEnviron{html}{\HCode{\BODY}}
+%</htXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/problem.dtx b/macros/latex/contrib/ximera/src/problem.dtx
new file mode 100644
index 0000000000..4a8cfaeddb
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/problem.dtx
@@ -0,0 +1,197 @@
+% \subsubsection{Problem environments}
+
+% These are problem environment decorations (these should be user invoked, not default).
+% The decoration for these environments were inspired by
+% \url{http://tex.stackexchange.com/questions/11098/nice-formatting-for-theorems}
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+
+% \begin{macro}{latexProblemContent}
+% Added for those that want to use UF problems without using the problem filter code. This command is renewed into something meaningful in the 'ProblemSelector.sty'.
+% \begin{macrocode}
+\providecommand{\latexProblemContent}[1]{#1}
+% Iterate count for problem counts.
+\Make@Counter{Iteration@probCnt}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\hang}{% top theorem decoration
+ \begingroup%
+ \setlength{\unitlength}{.005\linewidth}% \linewidth/200
+ \begin{picture}(0,0)(1.5,0)%
+ \linethickness{1pt} \color{black!50}%
+ \put(-3,2){\line(1,0){206}}% Top line
+ \multido{\iA=2+-1,\iB=50+-10}{5}{% Top hangs
+ \color{black!\iB}%
+ \put(-3,\iA){\line(0,-1){1}}% Top left hang
+ %\put(203,\iA){\line(0,-1){1}}% Top right hang
+ }%
+ \end{picture}%
+ \endgroup%
+}%
+\newcommand{\hung}{% bottom theorem decoration
+ \nobreak
+ \begingroup%
+ \setlength{\unitlength}{.005\linewidth}% \linewidth/200
+ \begin{picture}(0,0)(1.5,0)%
+ \linethickness{1pt} \color{black!50}%
+ \put(60,0){\line(1,0){143}}% Bottom line
+ \multido{\iA=0+1,\iB=50+-10}{5}{% Bottom hangs
+ \color{black!\iB}%
+ %\put(-3,\iA){\line(0,1){1}}% Bottom left hang
+ \put(203,\iA){\line(0,1){1}}% Bottom right hang
+ \put(\iB,0){\line(60,0){10}}% Left fade out
+ }%
+ \end{picture}%
+ \endgroup%
+}%
+% \end{macrocode}
+%
+% Configure environment configuration commands
+%
+% The command |\problemNumber| contains all the format code to determine the number (and the format of the number) for any of the problem environments.
+%
+% \begin{macrocode}
+\MakeCounter{problem}
+\newcommand{\problemNumber}{
+% First we determine if we have a counter for this question depth level.
+\ifcsname c@depth\Roman{problem@Depth}Count\endcsname% Check to see if counter exists
+ %If so, do nothing.
+ \else
+ %If not, create it.
+ \expandafter\newcounter{depth\Roman{problem@Depth}Count}
+ \expandafter\setcounter{depth\Roman{problem@Depth}Count}{0}
+ \fi
+
+\expandafter\stepcounter{depth\Roman{problem@Depth}Count}
+\arabic{depthICount}% The first problem depth, what use to be |\theproblem|.
+
+\forloop{Iteration@probCnt}{2}{\arabic{Iteration@probCnt} < \numexpr \value{problem@Depth} + 1 \relax}{%
+ .\expandafter\arabic{depth\Roman{Iteration@probCnt}Count}% Get the problem number of the next depth level and append it with a ".".
+}
+%\@ifpackageloaded{shuffle}{<true>}{<false>}% Check if Shuffle has been added. If so, add special numbering to the shuffled "groups". Currently commented out while we decide what that should look like (compared to the normal nested problems).
+%\ifhandout % Currently handout mode doesn't allow hints. Putting this code in place in case that changes.
+% \theproblem
+%\else
+% \theproblem
+%\fi
+}
+
+
+%%%%%% Configure various problem environment commands
+\Make@Counter{problem@Depth}
+
+
+
+%%%% Configure environments start content
+
+\newcommand{\problemEnvironmentStart}[2]{%
+% This takes in 2 arguments.
+% The first is optional and is the old optional argument from existing environments.
+% This is passed down to the associated problem environment name in case you want a global value.
+% The second argument is mandatory and is the name of the 'problem' environment,
+% such as problem, question, exercise, etc.
+% It then configures everything needed at the start of that environment.
+
+\stepcounter{problem@Depth}% Started a problem, so we've sunk another problem layer.
+\def\spaceatend{#1}%
+\begin{trivlist}%
+\item%
+ [%
+ \hskip\labelsep\sffamily\bfseries
+ #2 \problemNumber% Determine the correct number of the problem, and the format of that number.
+ ]%
+\slshape
+}
+
+
+
+%%%%% Configure environments end content
+
+\newcommand{\problemEnvironmentEnd}{%This configures all the end content for a problem.
+%
+% First we need to see if we've dropped fully out of a depth level,
+% so we can reset that counter back to zero for the next time we enter that depth level.
+\stepcounter{problem@Depth}
+\ifcsname c@depth\Roman{problem@Depth}Count\endcsname
+ \expandafter\ifnum\expandafter\value{depth\Roman{problem@Depth}Count}>0
+ \expandafter\setcounter{depth\Roman{problem@Depth}Count}{0}
+ \fi
+\fi
+
+\addtocounter{problem@Depth}{-2}% Exited a problem so we've exited a problem layer. Need -2 because we steppped once at the start to check for needing a depth-level count reset.
+
+\par\addvspace{.5ex}\nobreak\noindent\hung %% line at the bottom
+
+\ifhandout
+ \ifnewpage
+ \newpage
+ \fi
+\fi
+\end{trivlist}
+}
+
+
+
+%%%% Now populate the old environment names
+%
+% Old environments were "problem", "exercise", "exploration", and "question".
+% Note that you can add content to the start/end code on top of these base code pieces if you want.
+
+
+\newenvironment{problem}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Problem}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{exercise}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Exercise}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{exploration}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Exploration}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+
+\newenvironment{question}[1][2in]%
+{%Env start code
+\problemEnvironmentStart{#1}{Question}
+}
+{%Env end code
+\problemEnvironmentEnd
+}
+%</classXimera>
+% \end{macrocode}
+
+
+% Use an ``identification'' counter to assign IDs to the various problem-related DOM elements
+% \begin{macrocode}
+%<*htXimera>
+\newcounter{identification}
+\setcounter{identification}{0}
+
+\newcommand{\ConfigureQuestionEnv}[2]{%
+% refstepcounter ensures that labels get updated within these environments
+\renewenvironment{#1}{\refstepcounter{problem}}{}%
+\ConfigureEnv{#1}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div role="article" class="problem-environment #2" id="problem\arabic{identification}">}}{\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent}{}{}%
+}
+
+\ConfigureQuestionEnv{problem}{problem}
+\ConfigureQuestionEnv{exercise}{exercise}
+\ConfigureQuestionEnv{question}{question}
+\ConfigureQuestionEnv{exploration}{exploration}
+\ConfigureQuestionEnv{hint}{hint}
+%%%%\ConfigureQuestionEnv{shuffle}{shuffle}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/proof.dtx b/macros/latex/contrib/ximera/src/proof.dtx
new file mode 100644
index 0000000000..ab86e93f52
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/proof.dtx
@@ -0,0 +1,10 @@
+% \subsubsection{Proofs}
+% \DescribeEnv{proof}{A mathematical proof environment.}
+% \begin{macrocode}
+%<*classXimera>
+\renewcommand{\qedsymbol}{$\blacksquare$}
+\renewenvironment{proof}[1][\proofname]
+ {\begin{trivlist}\item[\hskip \labelsep \itshape \bfseries #1{}\hspace{2ex}]}
+{\qed\end{trivlist}}
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/sectioning.dtx b/macros/latex/contrib/ximera/src/sectioning.dtx
new file mode 100644
index 0000000000..3f9100294d
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/sectioning.dtx
@@ -0,0 +1,49 @@
+% \subsection{Sectioning}
+% Makes the table of contents look a bit better. This can be
+% redefined in the preamble if you do not like the appearance.
+% \DescribeMacro{\section}{The name of a section inside an activity.}
+% \begin{macrocode}
+%<*classXourse>
+\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{4.2em}}
+%</classXourse>
+% \end{macrocode}
+% \DescribeMacro{\subsection}{The name of a subsection inside an activity.}
+% \begin{macrocode}
+%<*classXourse>
+\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{4.2em}}
+%</classXourse>
+% \end{macrocode}
+% Xourse files can have parts.
+% \DescribeMacro{\part}{The name of a large part of a xourse.}
+% \begin{macrocode}
+%<*htXourse>
+\newcounter{ximera@part}
+\setcounter{ximera@part}{0}
+\renewcommand\part[1]{%
+\stepcounter{ximera@part}%
+\ifvmode \IgnorePar\fi \EndP%
+%\HCode{<h1 id="part\arabic{ximera@part}" class="card part">}#1\HCode{</h1>}% makes cards disappear?
+\HCode{<h1 id="part\arabic{ximera@part}" class="card part">#1</h1>}%
+\IgnoreIndent%
+}
+%</htXourse>
+% \end{macrocode}
+% Paragraph commands emit spans.
+% \DescribeMacro{\paragraph}{A small heading.}
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\paragraph}[1]{%
+ \HCode{<span class="paragraphHead">}%
+ #1%
+ \HCode{</span>}\par\IgnorePar}
+%</cfgXimera>
+% \end{macrocode}
+% \DescribeMacro{\subparagraph}{An even smaller heading.}
+% \begin{macrocode}
+%<*cfgXimera>
+\renewcommand{\subparagraph}[1]{%
+ \HCode{<span class="subparagraphHead">}%
+ #1%
+ \HCode{</span>}\par\IgnorePar}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/solution.dtx b/macros/latex/contrib/ximera/src/solution.dtx
new file mode 100644
index 0000000000..45f6301031
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/solution.dtx
@@ -0,0 +1,30 @@
+% \subsubsection{Solution}
+% \DescribeEnv{solution}{The solution to a problem.}
+% \begin{macrocode}
+%<*classXimera>
+%% solution environment
+\ifhandout % what follows is handout behavior
+\newenvironment{solution}%
+ {%
+ \setbox0\vbox\bgroup
+ }
+ {%
+ \egroup
+ }
+\else
+\newenvironment{solution}%
+ {%
+ \begin{trivlist}
+ \item[\hskip \labelsep\bfseries Solution:\hspace{2ex}]
+ }
+ % %% line at the bottom}
+ {
+ \end{trivlist}
+ \par\addvspace{.5ex}\nobreak\noindent\hung
+ }
+\fi
+
+
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/suppress.dtx b/macros/latex/contrib/ximera/src/suppress.dtx
new file mode 100644
index 0000000000..dcdcf924d1
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/suppress.dtx
@@ -0,0 +1,33 @@
+% \subsubsection{Suppress}
+% \DescribeEnv{suppress}{The suppress environment is a good way to suppress output without
+% commenting it. This way we can avoid many of the places we use
+% environ package and this should also avoid most of the verbatim
+% conflicts.}
+% This is code adapted from |syntonly.sty|.
+% \begin{macrocode}
+%<*classXimera>
+\font\dummyft@=dummy \relax
+\def\suppress{%
+ \begingroup\par
+ \parskip\z@
+ \offinterlineskip
+ \baselineskip=\z@skip
+ \lineskip=\z@skip
+ \lineskiplimit=\maxdimen
+ \dummyft@
+ \count@\sixt@@n
+ \loop\ifnum\count@ >\z@
+ \advance\count@\m@ne
+ \textfont\count@\dummyft@
+ \scriptfont\count@\dummyft@
+ \scriptscriptfont\count@\dummyft@
+ \repeat
+ \let\selectfont\relax
+ \let\mathversion\@gobble
+ \let\getanddefine@fonts\@gobbletwo
+ \tracinglostchars\z@
+ \frenchspacing
+ \hbadness\@M}
+\def\endsuppress{\par\endgroup}
+%</classXimera>
+% \end{macrocode} \ No newline at end of file
diff --git a/macros/latex/contrib/ximera/src/textcolor.dtx b/macros/latex/contrib/ximera/src/textcolor.dtx
new file mode 100644
index 0000000000..318d34365a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/textcolor.dtx
@@ -0,0 +1,20 @@
+% Make \textcolor work using https://tex.stackexchange.com/questions/390127/textcolor-with-tex4ht
+% \begin{macrocode}
+%<*cfgXimera>
+\makeatletter
+\Configure{textcolor}{\HCode{<span style="color:\#\tsf@color;">}}{\HCode{</span>}}
+% redefine \textcolor command
+\let\oldtextcolor\textcolor
+
+\renewcommand\textcolor[2]{%
+ % we need to convert the current color to hexadecimal form usable in the style attribute
+ % the \tsf@color macro is used in the \Configure{textcolor} configuration to insert the
+ % CSS color
+ \extractcolorspec{#1}{\tsf@color}%
+ \expandafter\convertcolorspec\tsf@color{HTML}\tsf@color%
+ % call the original command
+ \oldtextcolor{#1}{#2}%
+}%
+\makeatother
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/theorems.dtx b/macros/latex/contrib/ximera/src/theorems.dtx
new file mode 100644
index 0000000000..292d7a89b2
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/theorems.dtx
@@ -0,0 +1,174 @@
+% \subsubsection{Theorem and theorem-like environments}
+% On the web, a theorem is emitted as a special |<div>|.
+% \begin{macrocode}
+%<*htXimera>
+\newcommand{\ConfigureTheoremEnv}[1]{%
+\renewenvironment{#1}[1][]{\refstepcounter{problem}%
+\ifthenelse{\equal{##1}{}}{}{%
+ \HCode{<span class="theorem-like-title">}##1\HCode{</span>}%
+}}{}
+\ConfigureEnv{#1}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="theorem-like problem-environment #1" id="problem\arabic{identification}">}}{\HCode{</div>}\IgnoreIndent}{}{}%
+}
+%</htXimera>
+%<classXimera>\theoremstyle{definition} % No italic (because this makes also text in TikZ italic !!!)
+% \end{macrocode}
+
+% The key is to make sure that the theorem environments are defined in
+% a corresponding fashion on the web and on paper.
+
+% \DescribeEnv{theorem}{Theorem}
+% \begin{macrocode}
+%<classXimera> \newtheorem{theorem}{Theorem}
+%<htXimera> \ConfigureTheoremEnv{theorem}
+% \end{macrocode}
+
+% \DescribeEnv{algorithm}{Algorithm}
+% \begin{macrocode}
+%<classXimera> \newtheorem{algorithm}{Algorithm}
+%<htXimera> \ConfigureTheoremEnv{algorithm}
+% \end{macrocode}
+
+% \DescribeEnv{axiom}{Axiom}
+% \begin{macrocode}
+%<classXimera> \newtheorem{axiom}{Axiom}
+%<htXimera> \ConfigureTheoremEnv{axiom}
+% \end{macrocode}
+
+% \DescribeEnv{claim}{Claim}
+% \begin{macrocode}
+%<classXimera> \newtheorem{claim}{Claim}
+%<htXimera> \ConfigureTheoremEnv{claim}
+% \end{macrocode}
+
+% \DescribeEnv{conclusion}{Conclusion}
+% \begin{macrocode}
+%<classXimera> \newtheorem{conclusion}{Conclusion}
+%<htXimera> \ConfigureTheoremEnv{conclusion}
+% \end{macrocode}
+
+% \DescribeEnv{condition}{Condition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{condition}{Condition}
+%<htXimera> \ConfigureTheoremEnv{condition}
+% \end{macrocode}
+
+% \DescribeEnv{conjecture}{Conjecture}
+% \begin{macrocode}
+%<classXimera> \newtheorem{conjecture}{Conjecture}
+%<htXimera> \ConfigureTheoremEnv{conjecture}
+% \end{macrocode}
+
+% \DescribeEnv{corollary}{Corollary}
+% \begin{macrocode}
+%<classXimera> \newtheorem{corollary}{Corollary}
+%<htXimera> \ConfigureTheoremEnv{corollary}
+% \end{macrocode}
+
+% \DescribeEnv{criterion}{Criterion}
+% \begin{macrocode}
+%<classXimera> \newtheorem{criterion}{Criterion}
+%<htXimera> \ConfigureTheoremEnv{criterion}
+% \end{macrocode}
+
+% \DescribeEnv{definition}{Definition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{definition}{Definition}
+%<htXimera> \ConfigureTheoremEnv{definition}
+% \end{macrocode}
+
+% \DescribeEnv{example}{Example}
+% \begin{macrocode}
+%<classXimera> \newtheorem{example}{Example}
+%<htXimera> \ConfigureTheoremEnv{example}
+% \end{macrocode}
+
+% \DescribeEnv{explanation}{Explanation}
+% \begin{macrocode}
+%<classXimera> \newtheorem*{explanation}{Explanation}
+%<htXimera> \ConfigureTheoremEnv{explanation}
+% \end{macrocode}
+
+% \DescribeEnv{fact}{Fact}
+% \begin{macrocode}
+%<classXimera> \newtheorem{fact}{Fact}
+%<htXimera> \ConfigureTheoremEnv{fact}
+% \end{macrocode}
+
+% \DescribeEnv{lemma}{Lemma}
+% \begin{macrocode}
+%<classXimera> \newtheorem{lemma}{Lemma}
+%<htXimera> \ConfigureTheoremEnv{lemma}
+% \end{macrocode}
+
+% \DescribeEnv{formula}{Formula}
+% \begin{macrocode}
+%<classXimera> \newtheorem{formula}{Formula}
+%<htXimera> \ConfigureTheoremEnv{formula}
+% \end{macrocode}
+
+% \DescribeEnv{idea}{Idea}
+% \begin{macrocode}
+%<classXimera> \newtheorem{idea}{Idea}
+%<htXimera> \ConfigureTheoremEnv{idea}
+% \end{macrocode}
+
+% \DescribeEnv{notation}{Notation}
+% \begin{macrocode}
+%<classXimera> \newtheorem{notation}{Notation}
+%<htXimera> \ConfigureTheoremEnv{notation}
+% \end{macrocode}
+
+% \DescribeEnv{model}{Model}
+% \begin{macrocode}
+%<classXimera> \newtheorem{model}{Model}
+%<htXimera> \ConfigureTheoremEnv{model}
+% \end{macrocode}
+
+% \DescribeEnv{observation}{Observation}
+% \begin{macrocode}
+%<classXimera> \newtheorem{observation}{Observation}
+%<htXimera> \ConfigureTheoremEnv{observation}
+% \end{macrocode}
+
+% \DescribeEnv{proposition}{Proposition}
+% \begin{macrocode}
+%<classXimera> \newtheorem{proposition}{Proposition}
+%<htXimera> \ConfigureTheoremEnv{proposition}
+% \end{macrocode}
+
+% \DescribeEnv{paradox}{Paradox}
+% \begin{macrocode}
+%<classXimera> \newtheorem{paradox}{Paradox}
+%<htXimera> \ConfigureTheoremEnv{paradox}
+% \end{macrocode}
+
+% \DescribeEnv{procedure}{Procedure}
+% \begin{macrocode}
+%<classXimera> \newtheorem{procedure}{Procedure}
+%<htXimera> \ConfigureTheoremEnv{procedure}
+% \end{macrocode}
+
+% \DescribeEnv{remark}{Remark}
+% \begin{macrocode}
+%<classXimera> \newtheorem{remark}{Remark}
+%<htXimera> \ConfigureTheoremEnv{remark}
+% \end{macrocode}
+
+% \DescribeEnv{summary}{Summary}
+% \begin{macrocode}
+%<classXimera> \newtheorem{summary}{Summary}
+%<htXimera> \ConfigureTheoremEnv{summary}
+% \end{macrocode}
+
+% \DescribeEnv{template}{Template}
+% \begin{macrocode}
+%<classXimera> \newtheorem{template}{Template}
+%<htXimera> \ConfigureTheoremEnv{template}
+% \end{macrocode}
+
+% \DescribeEnv{warning}{Warning}
+% \begin{macrocode}
+%<classXimera> \newtheorem{warning}{Warning}
+%<htXimera> \ConfigureTheoremEnv{warning}
+% \end{macrocode}
+
diff --git a/macros/latex/contrib/ximera/src/tikzexport.dtx b/macros/latex/contrib/ximera/src/tikzexport.dtx
new file mode 100644
index 0000000000..c89f26a49a
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/tikzexport.dtx
@@ -0,0 +1,42 @@
+% \subsubsection{TikZ export}
+% We generate SVGs and PNGs for any TikZ images, via the
+% ``externalize'' feature of TikZ.
+%
+% Currently TikZ doesn't compile natively into the website because of
+% how the xake bake compilation works. In order to make Tikz work,
+% you need to get the tool \verb|mutool| on the machine that is
+% performing \verb|xake bake|.
+% \begin{macrocode}
+%<*classXimera>
+\ifdefined\HCode
+ \tikzexporttrue
+\fi
+
+\iftikzexport
+ \usetikzlibrary{external}
+
+ \ifdefined\HCode
+ % in htlatex, just include the svg files
+ \def\pgfsys@imagesuffixlist{.svg}
+
+ \tikzexternalize[prefix=./,mode=graphics if exists]
+ \else
+ % in pdflatex, actually generate the svg files
+ \tikzset{
+ /tikz/external/system call={
+ pdflatex \tikzexternalcheckshellescape
+ -halt-on-error -interaction=batchmode
+ -jobname "\image" "\\PassOptionsToClass{tikzexport}{ximera}\texsource";
+ mutool draw -F svg \image.pdf > \image.svg ; % mutool adds "1" to filename ????
+ mutool draw -o \image.svg \image.pdf ;
+ mutool draw -r 150 -c rgbalpha -o \image.png \image.pdf ;
+ ebb -x \image.png
+ }
+ }
+ \tikzexternalize[optimize=false,prefix=./]
+ \fi
+
+ \fi
+
+%</classXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/title.dtx b/macros/latex/contrib/ximera/src/title.dtx
new file mode 100644
index 0000000000..56380af5d7
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/title.dtx
@@ -0,0 +1,122 @@
+% \subsubsection{Titles and authors}
+%
+% \subsubsection{Authors}
+% \DescribeMacro{\author}{Activities have authors. Warn the user if no author is provided.}
+% \begin{macrocode}
+%<*classXimera>
+\let\@emptyauthor\@author
+\def\author#1{\gdef\@author{#1}}
+\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
+%</classXimera>
+% \end{macrocode}
+% Include author name in meta tags
+% \begin{macrocode}
+%<*htXimera>
+\Configure{@HEAD}{\HCode{<meta name="author" content="}\@author\HCode{" />\Hnewline}}
+%</htXimera>
+% \end{macrocode}
+% The |\and| command would emit tabular environments which really
+% should not appear in a meta tag.
+% \begin{macrocode}
+%<htXimera|classXimera>\def\and{and }
+% \end{macrocode}
+
+% \subsubsection{Title}
+% \DescribeMacro{\title}{Activities have titles.}
+% \begin{macrocode}
+%<*classXimera>
+\let\title\relax
+\newcommand{\title}[1][]{{\protected@xdef\@pretitle{#1}}\protected@xdef\@title}
+
+\title{}
+
+\newcounter{titlenumber}
+\renewcommand{\thetitlenumber}{\arabic{titlenumber}}
+%\renewcommand{\thesection}{\arabic{titlenumber}} %% Makes section numbers work
+\setcounter{titlenumber}{0}
+
+\newpagestyle{main}{
+\sethead[\textsl{\ifnumbers\thetitlenumber\hspace{1em}\fi\@title}][][] % even
+{}{}{\textsl{\ifnumbers\thetitlenumber\hspace{1em}\fi\@title}} % odd
+\setfoot[\thepage][][] % even
+{}{}{\thepage} % odd
+}
+\pagestyle{main}
+% \end{macrocode}
+% \DescribeMacro{\maketitle}{In a \textsf{ximera} document, redefine
+% |\maketitle| and put them in a table of contents. The
+% |\phantomsection| is to fix the hrefs.}
+% \begin{macrocode}
+\renewcommand\maketitle{%
+ \addtocounter{titlenumber}{1}%
+ {\flushleft\large\bfseries \@pretitle\par\vspace{-1em}}
+ {\flushleft\LARGE\bfseries {\ifnumbers\thetitlenumber\fi}{\ifnumbers\hspace{1em}\else\hspace{0em}\fi}\@title \par }
+ \phantomsection%
+ \ifnumbers\addcontentsline{toc}{section}{\thetitlenumber~\@title}\else\addcontentsline{toc}{section}{\@title}\fi
+ \vskip .6em\noindent\textit\theabstract\setcounter{problem}{0}\setcounter{section}{0}\setcounter{subsection}{0}\par\vspace{2em}
+ \ifnooutcomes\else\let\thefootnote\relax\footnote{Learning outcomes: \theoutcomes}\fi
+ \ifnoauthor\else\let\thefootnote\relax\footnote{Author(s):~\@author}\fi
+ \aftergroup\@afterindentfalse
+ \aftergroup\@afterheading}
+
+\ifnumbers
+\setcounter{secnumdepth}{2}
+\renewcommand{\thesection}{\arabic{titlenumber}.\arabic{section}}
+\renewcommand{\thesubsection}{\arabic{titlenumber}.\arabic{section}.\arabic{subsection}}
+\else
+\setcounter{secnumdepth}{-2}
+\fi
+
+\def\activitystyle{}
+\newcounter{sectiontitlenumber}
+\setcounter{secnumdepth}{2}
+\setcounter{tocdepth}{2}
+\newcommand\chapterstyle{%
+ \def\activitystyle{activity-chapter}
+ \def\maketitle{%
+ \addtocounter{titlenumber}{1}%
+ {\flushleft\small\sffamily\bfseries\@pretitle\par\vspace{-1.5em}}%
+ {\flushleft\LARGE\sffamily\bfseries\thetitlenumber\hspace{1em}\@title \par }%
+ {\vskip .6em\noindent\textit\theabstract\setcounter{problem}{0}\setcounter{section}{0}}%
+ \par\vspace{2em}
+ \phantomsection\addcontentsline{toc}{section}{\textbf{\thetitlenumber\hspace{1em}\@title}}%
+}}
+
+
+\newcommand\sectionstyle{%
+ \def\activitystyle{activity-section}
+ \def\maketitle{%
+ \addtocounter{section}{1}
+ \setcounter{sectiontitlenumber}{\value{section}}
+ {\flushleft\small\sffamily\bfseries\@pretitle\par\vspace{-1.5em}}%
+ {\flushleft\Large\sffamily\bfseries\thetitlenumber.\thesectiontitlenumber\hspace{1em}\@title \par}%
+ {\vskip .6em\noindent\textit\theabstract\setcounter{subsection}{0}}%
+ \par\vspace{2em}
+ \phantomsection\addcontentsline{toc}{section}{\thetitlenumber.\thesectiontitlenumber\hspace{1em}\@title}%
+ \renewcommand\section{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\normalfont\large\bfseries}}
+
+ \renewcommand\subsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\normalfont\normalsize\bfseries}}
+
+}}
+
+
+\iftikzexport%% allows xake to handle \chapterstyle and \sectionstye
+\renewcommand\chapterstyle{\def\activitystyle{chapter}}
+\renewcommand\sectionstyle{\def\activitystyle{section}}
+\else
+\fi
+
+%</classXimera>
+% \end{macrocode}
+% Eliminate some formatting that we'll handle later with CSS
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\maketitle}{}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/ungraded.dtx b/macros/latex/contrib/ximera/src/ungraded.dtx
new file mode 100644
index 0000000000..78b3e29738
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/ungraded.dtx
@@ -0,0 +1,22 @@
+% \subsubsection{Ungraded activities}
+% \DescribeEnv{ungraded}{The |ungraded| environment is used to record
+% that certain parts of activities should not be worth points. For
+% example, if you want to use a multipleChoice as a survey question,
+% you can place it inside an |ungraded| environment.}
+% On the \LaTeX\ side, the |ungraded| environment does nothing.
+% \begin{macrocode}
+%<*classXimera>
+\newenvironment{ungraded}{}{}
+%</classXimera>
+% \end{macrocode}
+% But on the html side, |ungraded| wraps the activities in a div in
+% order to assign some weight to them for grading.
+% \begin{macrocode}
+%<*htXimera>
+\renewenvironment{ungraded}{%
+\ifvmode \IgnorePar\fi \EndP\HCode{<div class="ungraded">}\IgnoreIndent%
+}{
+\ifvmode \IgnorePar\fi \EndP\HCode{</div>}\IgnoreIndent%
+}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/utilitymacros.dtx b/macros/latex/contrib/ximera/src/utilitymacros.dtx
new file mode 100644
index 0000000000..e44b490e06
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/utilitymacros.dtx
@@ -0,0 +1,45 @@
+% \subsubsection{Utility macros}
+% These are a list of new utility macros that are generally useful and are loaded after packages and the Tikz Fix.
+% \begin{macrocode}
+%<*classXimera>
+% \end{macrocode}
+% \begin{macro}{NewCounter}
+% Improved version of |\newcounter| to check for existance before creating a counter to minimize conflicts with packages. Added by Jason Nowell
+% \begin{macrocode}
+\newcommand{\Make@Counter}[1]{% This is an internal macro that should probably be depreciated for the below universal macro.
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+
+\newcommand{\MakeCounter}[1]{%% Code located in "Utilitymacros.dtx"
+% Code located in "Utilitymacros.dtx"
+ \@ifundefined{c@#1}% Check to see if counter exists
+ { % If not, create it and set it to 0.
+ \newcounter{#1}
+ \setcounter{#1}{0}
+ }
+ {%If so, reset to 0.
+ \setcounter{#1}{0}
+ }
+}
+% \end{macrocode}
+%</classXimera>
+% \end{macro}
+
+% \begin{macro}{latexProblemContent}
+% Added for those that want to use UF problems without using the problem filter code. This command is renewed into something meaningful in the 'ProblemSelector.sty'.
+% \begin{macrocode}
+\providecommand{\latexProblemContent}[1]{#1}
+% Iterate count for problem counts.
+\Make@Counter{Iteration@probCnt}
+% \end{macrocode}
+% \end{macro}
+
+
diff --git a/macros/latex/contrib/ximera/src/verbatim.dtx b/macros/latex/contrib/ximera/src/verbatim.dtx
new file mode 100644
index 0000000000..88da69a318
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/verbatim.dtx
@@ -0,0 +1,36 @@
+% \subsubsection{Code listing environments}
+% \DescribeEnv{code}{A code answer environment} You cannot use Environ
+% with the fancyvrb/listings package if you want nested environments.
+%
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{code}{Verbatim}{numbers=left,frame=lines,label=Code,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \DescribeEnv{python}{A python answer environment} You cannot use
+% Environ with the fancyvrb/listings package if you want nested
+% environments
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{python}{Verbatim}{numbers=left,frame=lines,label=Python,labelposition=topline}
+%</classXimera>
+% \end{macrocode}
+% \DescribeEnv{javascriptCode}{A JavaScript answer environment} Unfortunately the name |javascript| is already used for the actual, executed (!) JavaScript interactive.
+% environments
+% \begin{macrocode}
+%<*classXimera>
+\DefineVerbatimEnvironment{javascriptCode}{Verbatim}{numbers=left,frame=lines,label=JavaScript,labelposition=topline}
+%</classXimera>
+%<*cfgXimera>
+\renewenvironment{javascriptCode}{\NoFonts}{\EndNoFonts}
+\ScriptEnv{javascriptCode}{\stepcounter{identification}\ifvmode \IgnorePar\fi \EndP\HCode{<div class="javascript-code" id="javascript\arabic{identification}"><script type="text/text">}\HtmlParOff}{\HtmlParOn\HCode{\Hnewline</script></div>}}
+%</cfgXimera>
+% \end{macrocode}
+% On the web, translate verbatim and lstlisting blocks into |<pre>|
+% elements.
+% \begin{macrocode}
+%<*cfgXimera>
+\ConfigureEnv{verbatim}{\HCode{<pre>}}{\HCode{</pre>}}{}{}
+\ConfigureEnv{lstlisting}{\HCode{<pre>}}{\HCode{</pre>}}{}{}
+%</cfgXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/src/xkcd.dtx b/macros/latex/contrib/ximera/src/xkcd.dtx
new file mode 100644
index 0000000000..1d08288803
--- /dev/null
+++ b/macros/latex/contrib/ximera/src/xkcd.dtx
@@ -0,0 +1,13 @@
+% \subsubsection{XKCD}
+% \DescribeMacro{\xkcd}{Reference an XKCD cartoon.}
+% \begin{macrocode}
+%<*classXimera>
+\newcommand{\xkcd}[1]{#1}
+%</classXimera>
+% \end{macrocode}
+% On the web, this should be an image linked to the actual XKCD website.
+% \begin{macrocode}
+%<*htXimera>
+\renewcommand{\xkcd}[1]{\ifvmode \IgnorePar\fi \EndP\HCode{<img src="https://imgs.xkcd.com/comics/#1.png">}}
+%</htXimera>
+% \end{macrocode}
diff --git a/macros/latex/contrib/ximera/ximera.dtx b/macros/latex/contrib/ximera/ximera.dtx
new file mode 100644
index 0000000000..27be2648db
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.dtx
@@ -0,0 +1,362 @@
+% \iffalse meta-comment
+% vim: textwidth=75
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+|
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously write print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+Short description:
+Some text about the class: probably the same as the abstract.
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+ \expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously writing print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+\endpreamble
+\postamble
+
+Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Bart Snapp. The source code can be found at:
+
+https://github.com/XimeraProject/ximeraLatex
+
+This work consists of the file ximera.dtx, the associated files
+under src/, and a Makefile.
+
+Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+
+Running "make inst" installs the files in the user's TeX tree.
+
+Running "make install" installs the files in the local TeX tree.
+
+\endpostamble
+
+\usedir{tex/latex/ximera}
+\input docstrip
+\askforoverwritefalse
+\generate{
+ \file{ximera.cls}{
+ \from{ximera.dtx}{classXimera}
+ \from{src/banner.dtx}{classXimera}
+ \from{src/options.dtx}{classXimera}
+ \from{src/packages.dtx}{classXimera}
+ \from{src/tikzexport.dtx}{classXimera}
+ \from{src/hyperref.dtx}{classXimera}
+ \from{src/suppress.dtx}{classXimera}
+ \from{src/makeCounter.dtx}{classXimera}
+ \from{src/pagesetup.dtx}{classXimera}
+ \from{src/metadata.dtx}{classXimera}
+ \from{src/outcomes.dtx}{classXimera}
+ \from{src/macros.dtx}{classXimera}
+ \from{src/theorems.dtx}{classXimera}
+ \from{src/enumerate.dtx}{classXimera}
+ \from{src/proof.dtx}{classXimera}
+ \from{src/only.dtx}{classXimera}
+ \from{src/problem.dtx}{classXimera}
+ \from{src/hints.dtx}{classXimera}
+ \from{src/abstract.dtx}{classXimera}
+ \from{src/title.dtx}{classXimera}
+ \from{src/image.dtx}{classXimera}
+ \from{src/interactives/javascript.dtx}{classXimera}
+ \from{src/interactives/include.dtx}{classXimera}
+ \from{src/interactives/geogebra.dtx}{classXimera}
+ \from{src/interactives/desmos.dtx}{classXimera}
+ \from{src/interactives/google.dtx}{classXimera}
+ \from{src/interactives/graph.dtx}{classXimera}
+ \from{src/link.dtx}{classXimera}
+ \from{src/interactives/video.dtx}{classXimera}
+ \from{src/answer.dtx}{classXimera}
+ \from{src/choice.dtx}{classXimera}
+ \from{src/solution.dtx}{classXimera}
+ \from{src/feedback.dtx}{classXimera}
+ \from{src/freeresponse.dtx}{classXimera}
+ \from{src/verbatim.dtx}{classXimera}
+ \from{src/dialogue.dtx}{classXimera}
+ \from{src/instructornotes.dtx}{classXimera}
+ \from{src/xkcd.dtx}{classXimera}
+ \from{src/foldable.dtx}{classXimera}
+ \from{src/leash.dtx}{classXimera}
+ \from{src/interactives/sagemath.dtx}{classXimera}
+ \from{src/jax.dtx}{classXimera}
+ \from{src/ungraded.dtx}{classXimera}
+ \from{src/clearEnv.dtx}{classXimera}
+ \from{src/hideEnv.dtx}{classXimera}
+ }
+}
+\generate{
+ \file{xourse.cls}{
+ \from{ximera.dtx}{classXourse}
+ \from{src/optionsxourse.dtx}{classXourse}
+ \from{src/activity.dtx}{classXourse}
+ \from{src/sectioning.dtx}{classXourse}
+ \from{src/logo.dtx}{classXourse}
+ \from{src/graded.dtx}{classXourse}
+ }
+}
+\generate{
+ \file{ximera.cfg}{
+ \from{ximera.dtx}{cfgXimera}
+ \from{src/pagesetup.dtx}{cfgXimera}
+ \from{src/packages.dtx}{cfgXimera}
+ \from{src/jax.dtx}{cfgXimera}
+ \from{src/sectioning.dtx}{cfgXimera}
+ \from{src/title.dtx}{cfgXimera}
+ \from{src/abstract.dtx}{cfgXimera}
+ \from{src/image.dtx}{cfgXimera}
+ \from{src/outcomes.dtx}{cfgXimera}
+ \from{src/textcolor.dtx}{cfgXimera}
+ \from{src/verbatim.dtx}{cfgXimera}
+ \from{src/html.dtx}{cfgXimera}
+ \from{src/ending.dtx}{cfgXimera}
+ }
+}
+\generate{
+ \file{ximera.4ht}{
+ \from{ximera.dtx}{htXimera}
+ \from{src/pagesetup.dtx}{htXimera}
+ \from{src/title.dtx}{htXimera}
+ \from{src/problem.dtx}{htXimera}
+ \from{src/macros.dtx}{htXimera}
+ \from{src/theorems.dtx}{htXimera}
+ \from{src/image.dtx}{htXimera}
+ \from{src/dialogue.dtx}{htXimera}
+ \from{src/foldable.dtx}{htXimera}
+ \from{src/interactives/video.dtx}{htXimera}
+ \from{src/xkcd.dtx}{htXimera}
+ \from{src/link.dtx}{htXimera}
+ \from{src/interactives/graph.dtx}{htXimera}
+ \from{src/answer.dtx}{htXimera}
+ \from{src/choice.dtx}{htXimera}
+ \from{src/freeresponse.dtx}{htXimera}
+ \from{src/interactives/javascript.dtx}{htXimera}
+ \from{src/interactives/include.dtx}{htXimera}
+ \from{src/interactives/geogebra.dtx}{htXimera}
+ \from{src/interactives/desmos.dtx}{htXimera}
+ \from{src/interactives/google.dtx}{htXimera}
+ \from{src/feedback.dtx}{htXimera}
+ \from{src/leash.dtx}{htXimera}
+ \from{src/labels.dtx}{htXimera}
+ \from{src/interactives/sagemath.dtx}{htXimera}
+ \from{src/ungraded.dtx}{htXimera}
+ \from{src/footnotes.dtx}{htXimera}
+ \from{src/ending.dtx}{htXimera}
+ }
+}
+\generate{
+ \file{xourse.4ht}{
+ \from{ximera.dtx}{htXourse}
+ \from{src/logo.dtx}{htXourse}
+ \from{src/metadata.dtx}{htXourse}
+ \from{src/activity.dtx}{htXourse}
+ \from{src/sectioning.dtx}{htXourse}
+ \from{src/graded.dtx}{htXourse}
+ \from{src/interactives/video.dtx}{htXourse}
+ \from{src/ending.dtx}{htXourse}
+ }
+}
+%</install>
+%<install>\endbatchfile
+%<*internal>
+\usedir{source/latex/ximera}
+\generate{
+ \file{ximera.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\usedir{doc/latex/ximera}
+\generate{
+ \file{README.txt}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+ \expandafter\endbatchfile
+\else
+ \expandafter\endgroup
+\fi
+%</internal>
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{ximera.dtx}
+%</driver>
+%<classXimera|classXourse>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+%<classXimera>\ProvidesClass{ximera}
+%<classXourse>\ProvidesClass{xourse}
+%<classXimera|classXourse> [2024/5/8 v1.5
+%<classXimera> Simultaneously write print and online interactive materials]
+%<classXourse> Combining Ximera activities into Xourses]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[a4paper,margin=25mm,left=50mm,nohead]{geometry}
+\usepackage[numbered]{hypdoc}
+\usepackage{hyperref}
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+\DocInput{\jobname.dtx}
+\section{ximera.cls}
+\DocInput{src/options.dtx}
+\DocInput{src/packages.dtx}
+\DocInput{src/pagesetup.dtx}
+\subsection{Structure}
+\DocInput{src/macros.dtx}
+\DocInput{src/theorems.dtx}
+\DocInput{src/enumerate.dtx}
+\DocInput{src/proof.dtx}
+\DocInput{src/problem.dtx}
+\DocInput{src/hints.dtx}
+\DocInput{src/solution.dtx}
+\DocInput{src/verbatim.dtx}
+\DocInput{src/dialogue.dtx}
+\DocInput{src/instructornotes.dtx}
+\DocInput{src/only.dtx}
+\DocInput{src/foldable.dtx}
+\DocInput{src/leash.dtx}
+\subsection{Document metadata}
+\DocInput{src/metadata.dtx}
+\DocInput{src/abstract.dtx}
+\DocInput{src/title.dtx}
+\DocInput{src/outcomes.dtx}
+\DocInput{src/labels.dtx}
+\subsection{Images}
+\DocInput{src/image.dtx}
+\DocInput{src/tikzexport.dtx}
+\DocInput{src/xkcd.dtx}
+\subsection{Links}
+\DocInput{src/hyperref.dtx}
+\subsection{Interactives}
+\DocInput{src/interactives/include.dtx}
+\DocInput{src/interactives/google.dtx}
+\DocInput{src/interactives/geogebra.dtx}
+\DocInput{src/interactives/desmos.dtx}
+\DocInput{src/interactives/graph.dtx}
+\DocInput{src/interactives/video.dtx}
+\DocInput{src/interactives/javascript.dtx}
+\DocInput{src/interactives/sagemath.dtx}
+\subsection{Answerables}
+\DocInput{src/answer.dtx}
+\DocInput{src/choice.dtx}
+\DocInput{src/freeresponse.dtx}
+\DocInput{src/feedback.dtx}
+\DocInput{src/ungraded.dtx}
+\subsection{Support for the web}
+\DocInput{src/jax.dtx}
+\DocInput{src/html.dtx}
+\subsection{Tools}
+\DocInput{src/suppress.dtx}
+\DocInput{src/ending.dtx}
+\section{xourse.cls}
+\DocInput{src/optionsxourse.dtx}
+\DocInput{src/activity.dtx}
+\DocInput{src/sectioning.dtx}
+\DocInput{src/graded.dtx}
+\DocInput{src/logo.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%\def\fileversion{v1.5}
+%\def\filedate{2024/5/8}
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%\title{\textsf{ximera} --- Simultaneously write print and online interactive materials.\thanks{This file
+% describes version \fileversion, last revised \filedate.}
+%}
+%\author{Jim Fowler \and Jeramiah Hocutt \and Oscar Levin \and Jason Nowell \and Wim Obbels \and Hans Parshall \and Bart Snapp}
+%\date{Released \filedate}
+%
+%\maketitle
+%
+%\changes{v1.0.0}{2018/05/25}{First public release}
+%\changes{v1.5.0}{2024/05/8}{Submitting to CTAN}
+
+% \begin{abstract}
+% ``\textsf{Ximera} begins where \TeX\ ends.'' The \textsf{ximera}
+% class aids in the creation of handouts, worksheets, exercises, and
+% sections of textbooks to be used either individually or ``glued''
+% together via a \textsf{xourse} file. All \textsf{ximera} documents
+% can be deployed in an online interactive form via \texttt{xake}
+% See: \href{https://ximera.osu.edu}{Ximera Project} and the source
+% code on \href{https://github.com/XimeraProject}{GitHub}.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Ximera, pronounced ``chimera,'' (\textbf{X}imera:
+% \textbf{I}nteractive, \textbf{M}athematics,
+% \textbf{E}\textbf{R}esources, for \textbf{A}ll) is an open-source
+% platform that provides tools for authoring and publishing (PDF and
+% Online), open-source, interactive educational content, such as textbooks, assessments, and online courses.
+% The Ximera document class provides the following features:
+% \begin{description}
+% \item[Formatting for different domains] The Ximera document class
+% provides built-in support for formatting documents in both PDF and
+% online formats, which can be a big time-saver for
+% authors. Additionally, it allows for the simultaneous creation of
+% solution manuals and teaching editions, which can be especially
+% useful for educators.
+%\item[Compiling individually or as a whole] With the Ximera document
+% class, authors can easily compile individual documents or an entire
+% collection of documents. This flexibility can be helpful when making
+% changes to specific documents without having to re-compile the
+% entire collection. Moreover, this allows an author to share large
+% portions of a text with another, with minimal changes.
+%\item[Interactive content] The Ximera document class allows for the
+% inclusion of interactive content, such as answer boxes that are
+% validated by a client-side computer algebra system. Additionally, it
+% allows for the embedding of YouTube videos, Desmos graphs, and
+% GeoGebra interactives.
+%\item[All content displayed] By default, the Ximera document class
+% displays all content to the author. This means the author see what
+% the students see, along with answers and solutions, and links (that
+% can be checked) to various interactive elements (when deployed, the
+% interactive elements are truly embedded). This can be especially
+% helpful for catching errors or inconsistencies in the content.
+%\end{description}
+%
+%Online examples can be found at
+%\begin{center}
+%\url{https://go.osu.edu/ximera-examples}
+%\end{center}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%\Finale
diff --git a/macros/latex/contrib/ximera/ximera.ins b/macros/latex/contrib/ximera/ximera.ins
new file mode 100644
index 0000000000..54545d64cc
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.ins
@@ -0,0 +1,211 @@
+%%
+%% This is file `ximera.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% ximera.dtx (with options: `install')
+%% ------------:| ------------------------------------------------------------
+%% ximera:| Simultaneously writing print and online interactive materials
+%% Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+%% E-mail:| bart.snapp@gmail.com
+%% License:| Released under the LaTeX Project Public License v1.3c or later
+%% See:| http://www.latex-project.org/lppl.txt
+%%
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+------------:| ------------------------------------------------------------
+ ximera:| Simultaneously writing print and online interactive materials
+ Author:| Jim Fowler and Oscar Levin and Jason Nowell and Wim Obbels and Hans Parshall and Bart Snapp
+ E-mail:| bart.snapp@gmail.com
+ License:| Released under the LaTeX Project Public License v1.3c or later
+ See:| http://www.latex-project.org/lppl.txt
+
+\endpreamble
+\postamble
+
+Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Bart Snapp. The source code can be found at:
+
+https://github.com/XimeraProject/ximeraLatex
+
+This work consists of the file ximera.dtx, the associated files
+under src/, and a Makefile.
+
+Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+
+Running "make inst" installs the files in the user's TeX tree.
+
+Running "make install" installs the files in the local TeX tree.
+
+\endpostamble
+
+\usedir{tex/latex/ximera}
+\input docstrip
+\askforoverwritefalse
+\generate{
+ \file{ximera.cls}{
+ \from{ximera.dtx}{classXimera}
+ \from{src/banner.dtx}{classXimera}
+ \from{src/options.dtx}{classXimera}
+ \from{src/packages.dtx}{classXimera}
+ \from{src/tikzexport.dtx}{classXimera}
+ \from{src/hyperref.dtx}{classXimera}
+ \from{src/suppress.dtx}{classXimera}
+ \from{src/makeCounter.dtx}{classXimera}
+ \from{src/pagesetup.dtx}{classXimera}
+ \from{src/metadata.dtx}{classXimera}
+ \from{src/outcomes.dtx}{classXimera}
+ \from{src/macros.dtx}{classXimera}
+ \from{src/theorems.dtx}{classXimera}
+ \from{src/enumerate.dtx}{classXimera}
+ \from{src/proof.dtx}{classXimera}
+ \from{src/only.dtx}{classXimera}
+ \from{src/problem.dtx}{classXimera}
+ \from{src/hints.dtx}{classXimera}
+ \from{src/abstract.dtx}{classXimera}
+ \from{src/title.dtx}{classXimera}
+ \from{src/image.dtx}{classXimera}
+ \from{src/interactives/javascript.dtx}{classXimera}
+ \from{src/interactives/include.dtx}{classXimera}
+ \from{src/interactives/geogebra.dtx}{classXimera}
+ \from{src/interactives/desmos.dtx}{classXimera}
+ \from{src/interactives/google.dtx}{classXimera}
+ \from{src/interactives/graph.dtx}{classXimera}
+ \from{src/link.dtx}{classXimera}
+ \from{src/interactives/video.dtx}{classXimera}
+ \from{src/answer.dtx}{classXimera}
+ \from{src/choice.dtx}{classXimera}
+ \from{src/solution.dtx}{classXimera}
+ \from{src/feedback.dtx}{classXimera}
+ \from{src/freeresponse.dtx}{classXimera}
+ \from{src/verbatim.dtx}{classXimera}
+ \from{src/dialogue.dtx}{classXimera}
+ \from{src/instructornotes.dtx}{classXimera}
+ \from{src/xkcd.dtx}{classXimera}
+ \from{src/foldable.dtx}{classXimera}
+ \from{src/leash.dtx}{classXimera}
+ \from{src/interactives/sagemath.dtx}{classXimera}
+ \from{src/jax.dtx}{classXimera}
+ \from{src/ungraded.dtx}{classXimera}
+ \from{src/clearEnv.dtx}{classXimera}
+ \from{src/hideEnv.dtx}{classXimera}
+ }
+}
+\generate{
+ \file{xourse.cls}{
+ \from{ximera.dtx}{classXourse}
+ \from{src/optionsxourse.dtx}{classXourse}
+ \from{src/activity.dtx}{classXourse}
+ \from{src/sectioning.dtx}{classXourse}
+ \from{src/logo.dtx}{classXourse}
+ \from{src/graded.dtx}{classXourse}
+ }
+}
+\generate{
+ \file{ximera.cfg}{
+ \from{ximera.dtx}{cfgXimera}
+ \from{src/pagesetup.dtx}{cfgXimera}
+ \from{src/packages.dtx}{cfgXimera}
+ \from{src/jax.dtx}{cfgXimera}
+ \from{src/sectioning.dtx}{cfgXimera}
+ \from{src/title.dtx}{cfgXimera}
+ \from{src/abstract.dtx}{cfgXimera}
+ \from{src/image.dtx}{cfgXimera}
+ \from{src/outcomes.dtx}{cfgXimera}
+ \from{src/textcolor.dtx}{cfgXimera}
+ \from{src/verbatim.dtx}{cfgXimera}
+ \from{src/html.dtx}{cfgXimera}
+ \from{src/ending.dtx}{cfgXimera}
+ }
+}
+\generate{
+ \file{ximera.4ht}{
+ \from{ximera.dtx}{htXimera}
+ \from{src/pagesetup.dtx}{htXimera}
+ \from{src/title.dtx}{htXimera}
+ \from{src/problem.dtx}{htXimera}
+ \from{src/macros.dtx}{htXimera}
+ \from{src/theorems.dtx}{htXimera}
+ \from{src/image.dtx}{htXimera}
+ \from{src/dialogue.dtx}{htXimera}
+ \from{src/foldable.dtx}{htXimera}
+ \from{src/interactives/video.dtx}{htXimera}
+ \from{src/xkcd.dtx}{htXimera}
+ \from{src/link.dtx}{htXimera}
+ \from{src/interactives/graph.dtx}{htXimera}
+ \from{src/answer.dtx}{htXimera}
+ \from{src/choice.dtx}{htXimera}
+ \from{src/freeresponse.dtx}{htXimera}
+ \from{src/interactives/javascript.dtx}{htXimera}
+ \from{src/interactives/include.dtx}{htXimera}
+ \from{src/interactives/geogebra.dtx}{htXimera}
+ \from{src/interactives/desmos.dtx}{htXimera}
+ \from{src/interactives/google.dtx}{htXimera}
+ \from{src/feedback.dtx}{htXimera}
+ \from{src/leash.dtx}{htXimera}
+ \from{src/labels.dtx}{htXimera}
+ \from{src/interactives/sagemath.dtx}{htXimera}
+ \from{src/ungraded.dtx}{htXimera}
+ \from{src/footnotes.dtx}{htXimera}
+ \from{src/ending.dtx}{htXimera}
+ }
+}
+\generate{
+ \file{xourse.4ht}{
+ \from{ximera.dtx}{htXourse}
+ \from{src/logo.dtx}{htXourse}
+ \from{src/metadata.dtx}{htXourse}
+ \from{src/activity.dtx}{htXourse}
+ \from{src/sectioning.dtx}{htXourse}
+ \from{src/graded.dtx}{htXourse}
+ \from{src/interactives/video.dtx}{htXourse}
+ \from{src/ending.dtx}{htXourse}
+ }
+}
+\endbatchfile
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%
+%% Copyright (C) 2024 by Bart Snapp <bart.snapp@gmail.com> and Jim Fowler <kisonecat@gmail.com>
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Bart Snapp. The source code can be found at:
+%%
+%% https://github.com/XimeraProject/ximeraLatex
+%%
+%% This work consists of the file ximera.dtx, the associated files
+%% under src/, and a Makefile.
+%%
+%% Running "make" generates the derived files README, ximera.pdf, ximera.cls, xourse.cls.
+%%
+%% Running "make inst" installs the files in the user's TeX tree.
+%%
+%% Running "make install" installs the files in the local TeX tree.
+%%
+%%
+%% End of file `ximera.ins'.
diff --git a/macros/latex/contrib/ximera/ximera.pdf b/macros/latex/contrib/ximera/ximera.pdf
new file mode 100644
index 0000000000..7c771736db
--- /dev/null
+++ b/macros/latex/contrib/ximera/ximera.pdf
Binary files differ