summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2022-07-01 03:01:35 +0000
committerNorbert Preining <norbert@preining.info>2022-07-01 03:01:35 +0000
commit360c779f505ae5d8baf567f534861a7a9c7afcb2 (patch)
tree837de52204d635131e7f9b319401fedfa8782e41 /macros
parentfe3dca04dca5358c6fb9463cfadf9079600e911d (diff)
CTAN sync 202207010301
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/crefthe/crefthe-doc.pdfbin114833 -> 53184 bytes
-rw-r--r--macros/latex/contrib/crefthe/crefthe-doc.tex12
-rw-r--r--macros/latex/contrib/crefthe/crefthe.sty44
-rw-r--r--macros/latex/contrib/lt3rawobjects/README.md24
-rw-r--r--macros/latex/contrib/lt3rawobjects/lt3rawobjects.dtx793
-rw-r--r--macros/latex/contrib/lt3rawobjects/lt3rawobjects.ins64
-rw-r--r--macros/latex/contrib/lt3rawobjects/lt3rawobjects.pdfbin0 -> 375187 bytes
-rw-r--r--macros/latex/contrib/mathtools/empheq.pdfbin329716 -> 330511 bytes
-rw-r--r--macros/latex/contrib/mathtools/mathtools.dtx307
-rw-r--r--macros/latex/contrib/mathtools/mathtools.ins3
-rw-r--r--macros/latex/contrib/mathtools/mathtools.pdfbin498910 -> 503979 bytes
-rw-r--r--macros/latex/contrib/mathtools/mhsetup.ins8
-rw-r--r--macros/latex/contrib/mathtools/mhsetup.pdfbin255014 -> 256987 bytes
-rw-r--r--macros/latex/contrib/mathtools/test.pdfbin0 -> 3812 bytes
-rw-r--r--macros/latex/contrib/msu-thesis/README.md2
-rw-r--r--macros/latex/contrib/msu-thesis/msu-thesis.cls24
-rw-r--r--macros/latex/contrib/msu-thesis/msu-thesis.pdfbin247699 -> 250087 bytes
-rw-r--r--macros/latex/contrib/msu-thesis/msu-thesis.tex45
-rw-r--r--macros/latex/contrib/msu-thesis/samples/MSU-thesis-template.tex9
-rw-r--r--macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.pdfbin160223 -> 160096 bytes
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdfbin655594 -> 667760 bytes
-rw-r--r--macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex217
-rw-r--r--macros/latex/contrib/proflycee/tex/ProfLycee.sty153
-rw-r--r--macros/latex/contrib/sanitize-umlaut/CHANGES27
-rw-r--r--macros/latex/contrib/sanitize-umlaut/CHANGES.md60
-rw-r--r--macros/latex/contrib/sanitize-umlaut/README41
-rw-r--r--macros/latex/contrib/sanitize-umlaut/README.md43
-rw-r--r--macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.pdfbin419322 -> 453171 bytes
-rw-r--r--macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.sty29
-rw-r--r--macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.tex23
30 files changed, 1733 insertions, 195 deletions
diff --git a/macros/latex/contrib/crefthe/crefthe-doc.pdf b/macros/latex/contrib/crefthe/crefthe-doc.pdf
index 57189c0a06..996f302915 100644
--- a/macros/latex/contrib/crefthe/crefthe-doc.pdf
+++ b/macros/latex/contrib/crefthe/crefthe-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/crefthe/crefthe-doc.tex b/macros/latex/contrib/crefthe/crefthe-doc.tex
index f738d30107..5d02b6d9d5 100644
--- a/macros/latex/contrib/crefthe/crefthe-doc.tex
+++ b/macros/latex/contrib/crefthe/crefthe-doc.tex
@@ -47,6 +47,7 @@
crefthe,crefthename,
Crefthe,Crefthename,
crefthemark,
+ crefthepatchname,
selectlanguage,
}
}
@@ -111,7 +112,7 @@
\begin{document}
-\def\PackageVersion{2022/05/13}
+\def\PackageVersion{2022/06/30}
\title{\crefthepackage{}\\\smallskip\itshape Cross referencing with proper definite articles}
\author{Jinwen XU}
@@ -252,6 +253,14 @@ Of course you will have to define the \lstinline|\Crefthename|s separately, for
To place hyperlinks at the right place, \lstinline|\crefthename| touches the corresponding \lstinline|\crefformat| internally, which makes the format language-dependent. If you are writing multi-language documents, you may consider putting \lstinline|\crefthename| inside your language configuration so as to reset it each time you select a new language.
+\section{Dealing with existed \texttt{cref} / \texttt{Cref} names}
+
+For those preset names defined with \lstinline|\crefname|\,/\,\lstinline|\Crefname|, such as the ones for \texttt{chapter}, \texttt{section} and \texttt{subsection}, etc., the optional argument of \lstinline|\crefthe|\,/\,\lstinline|\Crefthe| shall be useless: names defined with \lstinline|\crefthename|\,/\,\lstinline|\Crefthename| have a \lstinline|\crefthemark| marking the definite articles, which also deals with the given preposition ; without \lstinline|\crefthemark|, the preposition is simply ignored.
+
+\lstinline|\crefthepatchname{|\meta{counters}\lstinline|}| is provided for this purpose. With this, an empty mark shall be added before the existed singular and plural names. However, it is still recommended to simply redefine the names with \lstinline|\crefthename|\,/\,\lstinline|\Crefthename|, especially in multilingual documents.
+
+% For multilingual documents, you may need to add this to your language configuration so as to reapply it each time you select a new language.
+
\section{The relationship with \textsf{cleveref}}
@@ -259,6 +268,7 @@ To place hyperlinks at the right place, \lstinline|\crefthename| touches the cor
With the package option \packageoption{overwrite}, user commands in \textsf{cleveref} will be replaced by those offered here, thus you can simply write \lstinline|\cref| for \lstinline|\crefthe| -- and similarly with \lstinline|\Cref|, \lstinline|\crefname| and \lstinline|\Crefname|.
+
\clearpage
\section{Known issues}
diff --git a/macros/latex/contrib/crefthe/crefthe.sty b/macros/latex/contrib/crefthe/crefthe.sty
index 286a5dac86..f993302d76 100644
--- a/macros/latex/contrib/crefthe/crefthe.sty
+++ b/macros/latex/contrib/crefthe/crefthe.sty
@@ -9,11 +9,10 @@
%%
%% http://www.latex-project.org/lppl.txt
%%
-\NeedsTeXFormat{LaTeX2e}[2020-10-01]
-\RequirePackage{l3keys2e}
+\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesExplPackage
{crefthe}
- {2022/05/13} {}
+ {2022/06/30} {}
{Cross referencing with proper definite articles}
\keys_define:nn { crefthe }
@@ -25,7 +24,7 @@
, unknown .code:n =
{ \PassOptionsToPackage { \CurrentOption } { cleveref } }
}
-\ProcessKeysOptions { crefthe }
+\ProcessKeyOptions [ crefthe ]
\bool_if:NT \l__crefthe_nameinlink_bool
{
@@ -116,18 +115,29 @@
\__crefthe_name_general:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { C }
}
-\cs_new_protected:Nn \__crefthe_name_general:nnnnnn
+\cs_new:Nn \crefthe_empty_adjust:n
{
- % #6 is c or C
- \tl_if_blank:nTF { #2 }
+ \tl_if_blank:nTF { #1 }
{
- \__crefthe_name_general_do:nnnnnn { #1 } {} { #3 } {} { #5 } { #6 }
+ \skip_horizontal:n { -.75ex }
}
{
- \__crefthe_name_general_do:nnnnnn { #1 } { \crefthemark { #2 } } { #3 } { \crefthemark { #4 } } { #5 } { #6 }
+ #1
}
}
+\cs_new_protected:Nn \__crefthe_name_general:nnnnnn
+ {
+ % #6 is c or C
+ \__crefthe_name_general_do:nnnnnn
+ { #1 }
+ { \crefthemark { \crefthe_empty_adjust:n { #2 } } }
+ { \crefthe_empty_adjust:n { #3 } }
+ { \crefthemark { \crefthe_empty_adjust:n { #4 } } }
+ { \crefthe_empty_adjust:n { #5 } }
+ { #6 }
+ }
+
\cs_new_protected:Nn \__crefthe_name_general_do:nnnnnn
{
\use:c { crefthe_#6refname_original:w } { #1 } { #2 #3 } { #4 #5 }
@@ -215,6 +225,22 @@
{ #1 }
}
+\NewDocumentCommand \crefthepatchname { m }
+ {
+ \clist_map_inline:nn { #1 }
+ {
+ \crefthe_patch_name:n { ##1 }
+ }
+ }
+
+\cs_new:Nn \crefthe_patch_name:n
+ {
+ \tl_gput_left:cn { cref@#1@name } { \crefthemark { \crefthe_empty_adjust:n {} } }
+ \tl_gput_left:cn { cref@#1@name@plural } { \crefthemark { \crefthe_empty_adjust:n {} } }
+ \tl_gput_left:cn { Cref@#1@name } { \crefthemark { \crefthe_empty_adjust:n {} } }
+ \tl_gput_left:cn { Cref@#1@name@plural } { \crefthemark { \crefthe_empty_adjust:n {} } }
+ }
+
\hook_gput_code:nnn { begindocument/end } { crefthe }
{
\bool_if:NT \l__crefthe_overwrite_bool
diff --git a/macros/latex/contrib/lt3rawobjects/README.md b/macros/latex/contrib/lt3rawobjects/README.md
new file mode 100644
index 0000000000..fd076eda2d
--- /dev/null
+++ b/macros/latex/contrib/lt3rawobjects/README.md
@@ -0,0 +1,24 @@
+# lt3rawobjects
+Objects and proxies in LaTeX3
+
+## Manual installation
+
+If you need a version of this package that is not present in your TeXLive/MiKTeX distribution you can run one of the following commands in order to generate the `.sty` file
+
+ pdflatex lt3rawobjects.ins
+ xelatex lt3rawobjects.ins
+ lualatex lt3rawobjects.ins
+ uplatex lt3rawobjects.ins
+
+if your distribution is up to date all these options should be equivalent, I personally recommend to use `lualatex` but is only a personal preference. In order to work both the files `lt3rawobjects.ins` and `lt3rawobjects.dtx` should be present in your working directory.
+
+## License
+
+This file is part of lt3rawobjects.
+
+lt3rawobjects 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 3 of the License, or (at your option) any later version.
+
+lt3rawobjects 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 lt3rawobjects. If not, see <https://www.gnu.org/licenses/>.
+
diff --git a/macros/latex/contrib/lt3rawobjects/lt3rawobjects.dtx b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.dtx
new file mode 100644
index 0000000000..54559ca295
--- /dev/null
+++ b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.dtx
@@ -0,0 +1,793 @@
+% \iffalse meta-comment
+%
+% lt3rawobjects Objects and proxies in LaTeX3
+% Copyright (C) 2022 Paolo De Donato <dedonato95@hotmail.it>
+%
+% This file is part of lt3rawobjects.
+%
+% lt3rawobjects 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 3 of the License, or
+% (at your option) any later version.
+%
+% lt3rawobjects 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 lt3rawobjects. If not, see <https://www.gnu.org/licenses/>.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{lt3rawobjects.dtx}[2022/06/30 1.0.2 Objects and proxies in LaTeX3]
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\RequirePackage{expl3}[2022-04-10]
+%<package>\ProvidesExplPackage{lt3rawobjects}{2022/06/30}{ 1.0.2 }{Objects and proxies in LaTeX3}
+%<*driver>
+\documentclass[full]{l3doc}
+\usepackage{lt3rawobjects}
+\begin{document}
+\DocInput{lt3rawobjects.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%\newcommand{\thpkg}{\pkg{lt3rawobjects}}
+%
+%\title{The \pkg{lt3rawobjects} package}
+%\author{Paolo De Donato}
+% \date{Released 2022/06/30 Version 1.0.2}
+%
+%\maketitle
+%
+%\tableofcontents
+%
+%\begin{documentation}
+%
+%\section{Introduction}
+% First to all notice that \thpkg\ means ``raw object(s)'', indeed \thpkg\ introduces a new mechanism to create objects like the well known C structures. The functions exported by this package are quite low level, and many important mechanisms like member protection and name resolution aren't already defined and should be introduced by intermediate packages.
+%
+% \section{To do}
+% \begin{itemize}
+% \item Introduce member functions in objects and member function specifications in proxies;
+% \item Uniform declarations for templated proxies;
+% \item Introduce constant objects.
+% \end{itemize}
+%
+% \section{Objects and proxies}
+% Usually an object in programming languages can be seen as a collection of variables (organized in different ways depending on the chosen language) treated as part of a single entity. Also in \thpkg\ objects are collections of variables, called member variables, which can be retrieved from a string representing that object. Such string is the \emph{address} of the object and act like the address of a structure in C.
+%
+% An address is composed of two parts, the \emph{module} in which variables are created and an \emph{identifier} that identify uniquely the object inside its module. It's up to the caller that two different objects have different identifiers. The address of an object can be obtained with the \cs{object_address} function. Identifiers and module names should not contain numbers, \verb|#| and \verb|_| characters in order to avoid conflicts with automatically generated addresses.
+%
+% In C each object/structure has a \emph{type} that tells the compiler how each object should be organized and instantiated in the memory. So if you need to create objects with the same structure you should first create a new \verb|struct| entity and then create object with such type.
+%
+% In \thpkg\ objects are created from an existing object with a particular structure that holds all the needed informations to organize their variables. Such objects that can be used to instantiate new objects are calles \emph{proxies} and the proxy object used to instantiate an object is its \emph{generator}. In order to create new objects with a specified proxy you can use the \cs{object_create} functions.
+%
+% Since proxies are themself objects we need a proxy to instantiate user defined proxies, you can use the \verb|proxy| object in the \verb|lt3rawobjects| module to create you own proxy, which address is held by the \cs{c_proxy_address_str} variable. Proxies must be created from the \verb|proxy| object otherwise they won't be recognized as proxies. Instead of using \cs{object_create} to create proxies you can directly use the function \cs{proxy_create}.
+%
+% Once you've created you proxy object you should specify its member variables that will be created in each object initialized with such proxy. You can add a variable specification with the \cs{proxy_push_member} function. Once you've added all yor variables specifications you can use your proxy to create objects. You should never modify a proxy once you've used it to create at least one object, since these modifications won't be updated on already created objects, leading to hidden errors in subsequential code.
+%
+% When you create a new variable specification with the \cs{proxy_push_member} you can notice the presence of \meta{type} parameter. It represents the type of such variable and can be a standard type (like \verb|tl|, \verb|str|, \verb|int|, \verb|seq|, ...) or user defined types if the following functions are defined:
+%
+% \begin{description}
+% \item[] \cs{\meta{type}_new:N} and \verb|c| variant;
+% \item[] \cs{\meta{type}_set_eq:NN} and \verb|cN|, \verb|Nc|, \verb|cc| variants.
+% \end{description}
+%
+% Every object, and so proxies too, is characterized by the following parameters:
+% \begin{itemize}
+% \item the \emph{module} in which it has been created;
+% \item the address of the proxy generator;
+% \item a parameter saying if the object is \emph{local} or \emph{global};
+% \item a parameter saying if the object is \emph{public} or \emph{private};
+% \item zero or more member variables.
+% \end{itemize}
+% In a local/global/public/private object every member variable is declared local/global/public/private. Address of a member variable can be obtained with the \cs{object_member_adr} function, and you can instantiate new members that haven't been specified in its generator with the function \cs{object_new_member}. members created in this way aren't described by generator proxy, so its type can't be deduced and should be always specified in functions like \cs{object_member_adr} or \cs{object_member_use}.
+%
+%\section{Library functions}
+%
+% \begin{function}[EXP]{\object_address:nn}
+% \begin{syntax}
+% \cs{object_address:nn} \marg{module} \marg{id}
+% \end{syntax}
+% Expands to the object address.
+% \end{function}
+%
+% \begin{function}[pTF]{\object_if_exist:n, \object_if_exist:V}
+% \begin{syntax}
+% \cs{object_if_exist_p:n} \marg{address}
+% \cs{object_if_exist:nTF} \marg{address} \marg{true code} \marg{false code}
+% \end{syntax}
+% Tests if exists an object at the specified address.
+% \end{function}
+%
+% \begin{function}[EXP]{\object_get_module:n, \object_get_module:V, \object_get_proxy_adr:n, \object_get_proxy_adr:V}
+% \begin{syntax}
+% \cs{object_get_module:n} \marg{address}
+% \cs{object_get_proxy_adr:n} \marg{address}
+% \end{syntax}
+% Get the module and the generator proxy of specified object.
+% \end{function}
+%
+% \begin{function}[pTF]{\object_if_local:n, \object_if_global:n, \object_if_local:V, \object_if_global:V}
+% \begin{syntax}
+% \cs{object_if_local_p:n} \marg{address}
+% \cs{object_if_local:nTF} \marg{address} \marg{true code} \marg{false code}
+% \end{syntax}
+% Tests if the object is local or global.
+% \end{function}
+%
+% \begin{function}[pTF]{\object_if_public:n, \object_if_private:n, \object_if_public:V, \object_if_private:V}
+% \begin{syntax}
+% \cs{object_if_local_p:n} \marg{address}
+% \cs{object_if_local:nTF} \marg{address} \marg{true code} \marg{false code}
+% \end{syntax}
+% Tests if the object is public or private.
+% \end{function}
+%
+% \begin{function}[EXP]{\object_member_adr:nnn, \object_member_adr:Vnn, \object_member_adr:nnv, \object_member_adr:nn, \object_member_adr:Vn}
+% \begin{syntax}
+% \cs{object_member_adr:nnn} \marg{address} \marg{member name} \marg{member type}
+% \cs{object_member_adr:nn} \marg{address} \marg{member name}
+% \end{syntax}
+% Fully expands to the address of specified member variable. If type is not specified it'll be retrieved from the generator proxy, but only if member is specified in the generator.
+% \end{function}
+%
+% \begin{function}[EXP]{\object_member_type:nn, \object_member_type:Vn}
+% \begin{syntax}
+% \cs{object_member_type:nn} \marg{address} \marg{member name}
+% \end{syntax}
+% Fully expands to the type of member \meta{member name}. Use this function only with member variables specified in the generator proxy, not with other member variables.
+% \end{function}
+%
+% \begin{function}{\object_new_member:nnn, \object_new_member:Vnn, \object_new_member:nnv}
+% \begin{syntax}
+% \cs{object_new_member:nnn} \marg{address} \marg{member name} \marg{member type}
+% \end{syntax}
+% Creates a new member variable with specified name and type. You can't retrieve the type of these variables with \cs{object_member_type} functions.
+% \end{function}
+%
+% \begin{function}[EXP]{\object_member_use:nnn, \object_member_use:Vnn, \object_member_use:nnv, \object_member_use:nn, \object_member_use:Vn}
+% \begin{syntax}
+% \cs{object_member_use:nnn} \marg{address} \marg{member name} \marg{member type}
+% \cs{object_member_use:nn} \marg{address} \marg{member name}
+% \end{syntax}
+% Uses the specified member variable.
+% \end{function}
+%
+% \begin{function}[EXP]{\object_member_set_eq:nnnN, \object_member_set_eq:nnvN, \object_member_set_eq:VnnN, \object_member_set_eq:nnnc, \object_member_set_eq:Vnnc, \object_member_set_eq:nnN, \object_member_set_eq:VnN, \object_member_set_eq:nnc, \object_member_set_eq:Vnc}
+% \begin{syntax}
+% \cs{object_member_set_eq:nnnN} \marg{address} \marg{member name} \marg{member type} \meta{variable}
+% \cs{object_member_set_eq:nnN} \marg{address} \marg{member name} \meta{variable}
+% \end{syntax}
+% Sets the value of specified member equal to the value of \meta{variable}.
+% \end{function}
+%
+% \begin{function}[pTF]{\object_if_proxy:n, \object_if_proxy:V}
+% \begin{syntax}
+% \cs{object_if_proxy_p:n} \marg{address}
+% \cs{object_if_proxy:nTF} \marg{address} \marg{true code} \marg{false code}
+% \end{syntax}
+% Test if the specified object is a proxy object.
+% \end{function}
+%
+% \begin{variable}{\c_proxy_address_str}
+% The address of the \verb|proxy| object in the \verb|lt3rawobjects| module.
+% \end{variable}
+%
+% \begin{function}{\object_create:nnnNN, \object_create:VnnNN}
+% \begin{syntax}
+% \cs{object_create:nnnNN} \marg{proxy address} \marg{module} \marg{id} \meta{scope} \meta{visibility}
+% \end{syntax}
+% Creates an object by using the proxy at \meta{proxy address} and the specified parameters.
+% \end{function}
+%
+% \begin{variable}{\c_object_local_str, \c_object_global_str}
+% Possible values for \meta{scope} parameter.
+% \end{variable}
+%
+% \begin{variable}{\c_object_public_str, \c_object_private_str}
+% Possible values for \meta{visibility} parameter.
+% \end{variable}
+%
+% \begin{function}{\object_create_set:NnnnNN, \object_create_set:NVnnNN, \object_create_gset:NnnnNN, \object_create_gset:NVnnNN}
+% \begin{syntax}
+% \cs{object_create_set:NnnnNN} \meta{str var} \marg{proxy address} \marg{module} \marg{id} \meta{scope} \meta{visibility}
+% \end{syntax}
+% Creates an object and sets its fully expanded address inside \meta{str var}.
+% \end{function}
+%
+% \begin{function}{\proxy_create:nnN, \proxy_create_set:NnnN, \proxy_create_gset:NnnN}
+% \begin{syntax}
+% \cs{proxy_create:nnN} \marg{module} \marg{id} \meta{visibility}
+% \cs{proxy_create_set:NnnN} \meta{str var} \marg{module} \marg{id} \meta{visibility}
+% \end{syntax}
+% Creates a global proxy object.
+% \end{function}
+%
+% \begin{function}{\proxy_push_member:nnn, \proxy_push_member:Vnn}
+% \begin{syntax}
+% \cs{proxy_push_member:nnn} \marg{proxy address} \marg{ member name } \marg{ member type }
+% \end{syntax}
+% Updates a proxy object with a new member specification, so that every subsequential object created with this proxy will have a member variable with the specified name and type that can be retrieved with \cs{object_member_type} functions.
+% \end{function}
+%
+% \begin{function}{\object_assign:nn, \object_assign:Vn, \object_assign:nV, \object_assign:VV}
+% \begin{syntax}
+% \cs{object_assign:nn} \marg{to address} \marg{from address}
+% \end{syntax}
+% Assigns the content of each variable of object at \meta{from address} to each correspective variable in \meta{to address}. Both the objects should be created with the same proxy object and only variables listed in the proxy are assigned.
+% \end{function}
+%
+% \section{Examples}
+% \subsection*{Example 1}
+% Create a public proxy with id \verb|myproxy| with the specification of a single member variable with name \verb|myvar| and type \verb|tl|, then set its address inside \cs{l_myproxy_str}.
+%
+% \begin{verbatim}
+% \str_new:N \l_myproxy_str
+% \proxy_create_set:NnnN \l_myproxy_str { example }{ myproxy }
+% \c_object_public_str
+% \proxy_push_member:Vnn \l_myproxy_str { myvar }{ tl }
+% \end{verbatim}
+%
+% Then create a new object with name \verb|myobj| with that proxy, assign then token list \verb|\c_dollar_str{} ~ dollar ~ \c_dollar_str{}| to \verb|myvar| and then print it.
+%
+% \begin{verbatim}
+% \str_new:N \l_myobj_str
+% \object_create_set:NVnnNN \l_myobj_str \l_myproxy_str
+% { example }{ myobj } \c_object_local_str \c_object_public_str
+% \tl_set:cn
+% {
+% \object_member_adr:Vn \l_myobj_str { myvar }
+% }
+% { \c_dollar_str{} ~ dollar ~ \c_dollar_str{} }
+% \object_member_use:Vn \l_myobj_str { myvar }
+% \end{verbatim}
+%
+% Output:
+%
+% \ExplSyntaxOn
+% \str_new:N \l_myproxy_str
+% \proxy_create_set:NnnN \l_myproxy_str { example }{ myproxy }
+% \c_object_public_str
+% \proxy_push_member:Vnn \l_myproxy_str { myvar }{ tl }
+% \str_new:N \l_myobj_str
+% \object_create_set:NVnnNN \l_myobj_str \l_myproxy_str
+% { example }{ myobj } \c_object_local_str \c_object_public_str
+% \tl_set:cn
+% {
+% \object_member_adr:Vn \l_myobj_str { myvar }
+% }
+% { \c_dollar_str{} ~ dollar ~ \c_dollar_str{} }
+% \object_member_use:Vn \l_myobj_str { myvar }
+% \ExplSyntaxOff
+%
+%
+%
+%\end{documentation}
+%
+%\begin{implementation}
+%
+%\section{Implementation}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=objpriv>
+% \end{macrocode}
+%
+%
+%
+%\begin{variable}{\c_object_local_str, \c_object_global_str, \c_object_public_str, \c_object_private_str}
+% \begin{macrocode}
+\str_const:Nn \c_object_local_str {loc}
+\str_const:Nn \c_object_global_str {glo}
+\str_const:Nn \c_object_public_str {pub}
+\str_const:Nn \c_object_private_str {pri}
+
+\str_const:Nn \c_@@_const_str {con}
+% \end{macrocode}
+%\end{variable}
+%
+%\begin{macro}{\object_address:nn}
+%Get address of an object
+% \begin{macrocode}
+\cs_new:Nn \object_address:nn {
+ \tl_to_str:n { #1 _ #2 }
+}
+% \end{macrocode}
+%\end{macro}
+%
+% \begin{macrocode}
+\cs_new:Nn \@@_object_modvar:n{
+ c __ #1 _ MODULE _ str
+}
+
+\cs_new:Nn \@@_object_pxyvar:n{
+ c __ #1 _ PROXY _ str
+}
+
+\cs_new:Nn \@@_object_scovar:n{
+ c __ #1 _ SCOPE _ str
+}
+
+\cs_new:Nn \@@_object_visvar:n{
+ c __ #1 _ VISIB _ str
+}
+
+\cs_generate_variant:Nn \@@_object_modvar:n { V }
+\cs_generate_variant:Nn \@@_object_pxyvar:n { V }
+\cs_generate_variant:Nn \@@_object_scovar:n { V }
+\cs_generate_variant:Nn \@@_object_visvar:n { V }
+% \end{macrocode}
+%
+
+%
+%\begin{macro}[pTF]{\object_if_exist:n}
+%Tests if object exists.
+% \begin{macrocode}
+
+\prg_new_conditional:Nnn \object_if_exist:n { p, T, F, TF }
+ {
+ \cs_if_exist:cTF
+ {
+ \@@_object_modvar:n { #1 }
+ }
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+
+\prg_generate_conditional_variant:Nnn \object_if_exist:n { V }
+ { p, T, F, TF }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_get_module:n, \object_get_proxy_adr:n}
+%Retrieve the name, module and generating proxy of an object
+% \begin{macrocode}
+\cs_new:Nn \object_get_module:n {
+ \str_use:c { \@@_object_modvar:n { #1 } }
+}
+\cs_new:Nn \object_get_proxy_adr:n {
+ \str_use:c { \@@_object_pxyvar:n { #1 } }
+}
+
+\cs_generate_variant:Nn \object_get_module:n { V }
+\cs_generate_variant:Nn \object_get_proxy_adr:n { V }
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}[pTF]{\object_if_local:n, \object_if_global:n, \object_if_public:n, \object_if_private:n}
+%Test the specified parameters.
+% \begin{macrocode}
+\prg_new_conditional:Nnn \object_if_local:n {p, T, F, TF}
+{
+ \str_if_eq:cNTF { \@@_object_scovar:n {#1} } \c_object_local_str
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\prg_new_conditional:Nnn \object_if_global:n {p, T, F, TF}
+{
+ \str_if_eq:cNTF { \@@_object_scovar:n {#1} } \c_object_global_str
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\prg_new_conditional:Nnn \object_if_public:n {p, T, F, TF}
+{
+ \str_if_eq:cNTF { \@@_object_visvar:n { #1 } } \c_object_public_str
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\prg_new_conditional:Nnn \object_if_private:n {p, T, F, TF}
+{
+ \str_if_eq:cNTF { \@@_object_visvar:n {#1} } \c_object_private_str
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+}
+
+\prg_generate_conditional_variant:Nnn \object_if_local:n { V }
+ { p, T, F, TF }
+\prg_generate_conditional_variant:Nnn \object_if_global:n { V }
+ { p, T, F, TF }
+\prg_generate_conditional_variant:Nnn \object_if_public:n { V }
+ { p, T, F, TF }
+\prg_generate_conditional_variant:Nnn \object_if_private:n { V }
+ { p, T, F, TF }
+% \end{macrocode}
+%\end{macro}
+%
+%You can retrieve the address of a member variable with the following function:
+%\begin{macro}{\object_member_adr:nnn, \object_member_adr:nn}
+%Get the address of a member variable
+% \begin{macrocode}
+
+\cs_new:Nn \@@_scope:n
+ {
+ \object_if_global:nTF { #1 }
+ {
+ g
+ }
+ {
+ \str_if_eq:cNTF { \@@_object_scovar:n { #1 } }
+ \c_@@_const_str
+ {
+ c
+ }
+ {
+ l
+ }
+ }
+ }
+
+\cs_new:Nn \object_member_adr:nnn
+ {
+ \@@_scope:n { #1 }
+ \object_if_private:nTF { #1 }
+ {
+ __
+ }
+ {
+ _
+ }
+ #1 \tl_to_str:n { _ MEMBER _ #2 _ #3 }
+ }
+
+\cs_generate_variant:Nn \object_member_adr:nnn { Vnn, vnn, nnv }
+
+\cs_new:Nn \object_member_adr:nn
+ {
+ \object_member_adr:nnv { #1 }{ #2 }
+ {
+ \object_member_adr:vnn { \@@_object_pxyvar:n { #1 } }
+ { #2 _ type }{ str }
+ }
+ }
+
+\cs_generate_variant:Nn \object_member_adr:nn { Vn }
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_member_type:nn}
+%Deduce the member type from the generating proxy.
+% \begin{macrocode}
+
+\cs_new:Nn \object_member_type:nn
+ {
+ \object_member_use:vnn { \@@_object_pxyvar:n { #1 } }
+ { #2 _ type }{ str }
+ }
+
+% \end{macrocode}
+%\end{macro}
+%
+% \begin{macrocode}
+
+\msg_new:nnnn { lt3rawobjects }{ scoperr }{ Nonstandard ~ scope }
+ {
+ Operation ~ not ~ permitted ~ on ~ object ~ #1 ~
+ ~ since ~ it ~ wasn't ~ declared ~ local ~ or ~ global
+ }
+
+\cs_new_protected:Nn \@@_force_scope:n
+ {
+ \bool_if:nF
+ {
+ \object_if_local_p:n { #1 } || \object_if_global_p:n { #1 }
+ }
+ {
+ \msg_error:nnx { lt3rawobjects }{ scoperr }{ #1 }
+ }
+ }
+
+% \end{macrocode}
+%
+%\begin{macro}{\object_new_member:nnn}
+%Creates a new member variable
+% \begin{macrocode}
+
+\cs_new_protected:Nn \object_new_member:nnn
+ {
+ \@@_force_scope:n { #1 }
+ \cs_if_exist_use:cT { #3 _ new:c }
+ {
+ { \object_member_adr:nnn { #1 }{ #2 }{ #3 } }
+ }
+ }
+
+\cs_generate_variant:Nn \object_new_member:nnn { Vnn, nnv }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_member_use:nnn, \object_member_use:nn}
+%Uses a member variable
+% \begin{macrocode}
+
+\cs_new:Nn \object_member_use:nnn
+ {
+ \cs_if_exist_use:cT { #3 _ use:c }
+ {
+ { \object_member_adr:nnn { #1 }{ #2 }{ #3 } }
+ }
+ }
+
+\cs_new:Nn \object_member_use:nn
+ {
+ \object_member_use:nnv { #1 }{ #2 }
+ {
+ \object_member_adr:vnn { \@@_object_pxyvar:n { #1 } }
+ { #2 _ type }{ str }
+ }
+ }
+
+\cs_generate_variant:Nn \object_member_use:nnn { Vnn, vnn, nnv }
+\cs_generate_variant:Nn \object_member_use:nn { Vn }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_member_set_eq:nnnN, \object_member_set_eq:nnN}
+% Set the value of a variable to a member.
+% \begin{macrocode}
+
+\cs_new_protected:Nn \object_member_set_eq:nnnN
+ {
+ \@@_force_scope:n { #1 }
+ \cs_if_exist_use:cT
+ {
+ #3 _ \object_if_global:nT { #1 }{ g } set _ eq:cN
+ }
+ {
+ { \object_member_adr:nnn { #1 }{ #2 }{ #3 } } #4
+ }
+ }
+
+\cs_generate_variant:Nn \object_member_set_eq:nnnN { VnnN, nnnc, Vnnc, nnvN }
+
+\cs_new_protected:Nn \object_member_set_eq:nnN
+ {
+ \object_member_set_eq:nnvN { #1 }{ #2 }
+ {
+ \object_member_adr:vnn { \@@_object_pxyvar:n { #1 } }
+ { #2 _ type }{ str }
+ } #3
+ }
+
+\cs_generate_variant:Nn \object_member_set_eq:nnN { VnN, nnc, Vnc }
+
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{variable}{\c_proxy_address_str}
+%The address of the \verb|proxy| object.
+% \begin{macrocode}
+\str_const:Nx \c_proxy_address_str
+ { \object_address:nn { lt3rawobjects }{ proxy } }
+% \end{macrocode}
+%\end{variable}
+%
+%
+% Source of \verb|proxy| object
+% \begin{macrocode}
+\str_const:cn { \@@_object_modvar:V \c_proxy_address_str }
+ { lt3rawobjects }
+\str_const:cV { \@@_object_pxyvar:V \c_proxy_address_str }
+ \c_proxy_address_str
+\str_const:cV { \@@_object_scovar:V \c_proxy_address_str }
+ \c_@@_const_str
+\str_const:cV { \@@_object_visvar:V \c_proxy_address_str }
+ \c_object_public_str
+
+\cs_generate_variant:Nn \seq_const_from_clist:Nn { cx }
+
+\seq_const_from_clist:cn
+ {
+ \object_member_adr:Vnn \c_proxy_address_str { varlist }{ seq }
+ }
+ { varlist }
+
+\str_const:cn
+ {
+ \object_member_adr:Vnn \c_proxy_address_str { varlist_type }{ str }
+ }
+ { seq }
+% \end{macrocode}
+%
+%\begin{macro}[pTF]{\object_if_proxy:n}
+%Test if an object is a proxy.
+% \begin{macrocode}
+
+\prg_new_conditional:Nnn \object_if_proxy:n {p, T, F, TF}
+ {
+ \str_if_eq:cNTF { \@@_object_pxyvar:n { #1 } } \c_proxy_address_str
+ {
+ \prg_return_true:
+ }
+ {
+ \prg_return_false:
+ }
+ }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_create:nnnNN, \object_create_set:NnnnNN, \object_create_gset:NnnnNN}
+%Creates an object from a proxy
+% \begin{macrocode}
+
+\msg_new:nnn { aa }{ mess }{ #1 }
+
+\msg_new:nnnn { lt3rawobjects }{ notproxy }{ Fake ~ proxy }
+ {
+ Object ~ #1 ~ is ~ not ~ a ~ proxy.
+ }
+
+\cs_new_protected:Nn \@@_force_proxy:n
+ {
+ \object_if_proxy:nF { #1 }
+ {
+ \msg_error:nnn { lt3rawobjects }{ notproxy }{ #1 }
+ }
+ }
+
+\cs_new_protected:Nn \@@_create_anon:nnnNN
+ {
+
+ \@@_force_proxy:n { #1 }
+
+ \str_const:cn { \@@_object_modvar:n { #2 } }{ #3 }
+ \str_const:cx { \@@_object_pxyvar:n { #2 } }{ #1 }
+ \str_const:cV { \@@_object_scovar:n { #2 } } #4
+ \str_const:cV { \@@_object_visvar:n { #2 } } #5
+
+ \seq_map_inline:cn
+ {
+ \object_member_adr:nnn { #1 }{ varlist }{ seq }
+ }
+ {
+ \object_new_member:nnv { #2 }{ ##1 }
+ {
+ \object_member_adr:nnn { #1 }{ ##1 _ type }{ str }
+ }
+ }
+ }
+
+\cs_new_protected:Nn \object_create:nnnNN
+ {
+ \@@_create_anon:nnnNN { #1 }{ \object_address:nn { #2 }{ #3 } }
+ { #2 } #4 #5
+ }
+
+\cs_new_protected:Nn \object_create_set:NnnnNN
+ {
+ \object_create:nnnNN { #2 }{ #3 }{ #4 } #5 #6
+ \str_set:Nx #1 { \object_address:nn { #3 }{ #4 } }
+ }
+
+\cs_new_protected:Nn \object_create_gset:NnnnNN
+ {
+ \object_create:nnnNN { #2 }{ #3 }{ #4 } #5 #6
+ \str_gset:Nx #1 { \object_address:nn { #3 }{ #4 } }
+ }
+
+\cs_generate_variant:Nn \object_create:nnnNN { VnnNN }
+\cs_generate_variant:Nn \object_create_set:NnnnNN { NVnnNN }
+\cs_generate_variant:Nn \object_create_gset:NnnnNN { NVnnNN }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\proxy_create:nnN, \proxy_create_set:NnnN, \proxy_create_gset:NnnN}
+%Creates a new proxy object
+% \begin{macrocode}
+
+\cs_new_protected:Nn \proxy_create:nnN
+ {
+ \object_create:VnnNN \c_proxy_address_str { #1 }{ #2 }
+ \c_object_global_str #3
+ }
+
+\cs_new_protected:Nn \proxy_create_set:NnnN
+ {
+ \object_create_set:NVnnNN #1 \c_proxy_address_str { #2 }{ #3 }
+ \c_object_global_str #4
+ }
+
+\cs_new_protected:Nn \proxy_create_gset:NnnN
+ {
+ \object_create_gset:NVnnNN #1 \c_proxy_address_str { #2 }{ #3 }
+ \c_object_global_str #4
+ }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\proxy_push_member:nnn}
+% Push a new member inside a proxy.
+% \begin{macrocode}
+\cs_new_protected:Nn \proxy_push_member:nnn
+ {
+ \@@_force_scope:n { #1 }
+ \object_new_member:nnn { #1 }{ #2 _ type }{ str }
+ \str_set:cn
+ {
+ \object_member_adr:nnn { #1 }{ #2 _ type }{ str }
+ }
+ { #3 }
+ \seq_gput_left:cn
+ {
+ \object_member_adr:nnn { #1 }{ varlist }{ seq }
+ }
+ { #2 }
+ }
+
+\cs_generate_variant:Nn \proxy_push_member:nnn { Vnn }
+
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\object_assign:nn}
+%Copy an object to another one.
+% \begin{macrocode}
+\cs_new_protected:Nn \object_assign:nn
+ {
+ \seq_map_inline:cn
+ {
+ \object_member_adr:vnn
+ {
+ \@@_object_pxyvar:n { #1 }
+ }
+ { varlist }{ seq }
+ }
+ {
+ \object_member_set_eq:nnc { #1 }{ ##1 }
+ {
+ \object_member_adr:nn{ #2 }{ ##1 }
+ }
+ }
+ }
+
+\cs_generate_variant:Nn \object_assign:nn { nV, Vn, VV }
+% \end{macrocode}
+%\end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%\end{implementation}
+%
+%\PrintIndex
+
+
+
diff --git a/macros/latex/contrib/lt3rawobjects/lt3rawobjects.ins b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.ins
new file mode 100644
index 0000000000..ced12eeaf0
--- /dev/null
+++ b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.ins
@@ -0,0 +1,64 @@
+%%
+%% lt3rawobjects Objects and proxies in LaTeX3
+%% Copyright (C) 2022 Paolo De Donato <dedonato95@hotmail.it>
+%%
+%% This file is part of lt3rawobjects.
+%%
+%% lt3rawobjects 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 3 of the License, or
+%% (at your option) any later version.
+%%
+%% lt3rawobjects 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 lt3rawobjects. If not, see <https://www.gnu.org/licenses/>.
+%%
+
+\input l3docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/lt3rawobjects}
+
+\preamble
+
+This is a generated file.
+
+lt3rawobjects Object oriented programming in LaTeX3
+Copyright (C) 2022 Paolo De Donato <dedonato95@hotmail.it>
+
+lt3rawobjects 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 3 of the License, or
+(at your option) any later version.
+
+lt3rawobjects 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 lt3rawobjects. If not, see <https://www.gnu.org/licenses/>.
+
+\endpreamble
+
+\generate{\file{lt3rawobjects.sty}{\from{lt3rawobjects.dtx}{package}}}
+
+\obeyspaces
+\Msg{:^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^)}
+\Msg{(*^.^*)}
+\Msg{*-* Hey dude, remember you have to move the following file *-*}
+\Msg{(*^.^*)}
+\Msg{lt3rawobjects.sty}
+\Msg{(*^.^*)}
+\Msg{*-* into a directory searched by TeX!! *-*}
+\Msg{*-* To produce the documentation look it up on the Internet. *-*}
+\Msg{(*^.^*)}
+\Msg{*-* See ya! *-*}
+\Msg{(*^.^*)}
+\Msg{:^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^) :^)}
+
+\endbatchfile
diff --git a/macros/latex/contrib/lt3rawobjects/lt3rawobjects.pdf b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.pdf
new file mode 100644
index 0000000000..32d278124c
--- /dev/null
+++ b/macros/latex/contrib/lt3rawobjects/lt3rawobjects.pdf
Binary files differ
diff --git a/macros/latex/contrib/mathtools/empheq.pdf b/macros/latex/contrib/mathtools/empheq.pdf
index 47acd17426..d7f91d3071 100644
--- a/macros/latex/contrib/mathtools/empheq.pdf
+++ b/macros/latex/contrib/mathtools/empheq.pdf
Binary files differ
diff --git a/macros/latex/contrib/mathtools/mathtools.dtx b/macros/latex/contrib/mathtools/mathtools.dtx
index eb20187e89..28526b0a88 100644
--- a/macros/latex/contrib/mathtools/mathtools.dtx
+++ b/macros/latex/contrib/mathtools/mathtools.dtx
@@ -69,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: mathtools 2021/04/12 v1.27}
+\Msg{* Package: mathtools 2022/06/29 v1.29}
\Msg{************************************************************************}
\keepsilent
@@ -133,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{mathtools.drv}%
- [2022/02/07 v1.28a mathematical typesetting tools]
+ [2022/06/29 v1.29 mathematical typesetting tools]
\documentclass{ltxdoc}
\IfFileExists{fourier.sty}{\usepackage{fourier}}{}
@@ -333,7 +333,7 @@ colorlinks,
%
% \GetFileInfo{mathtools.drv}
%
-% \CheckSum{3581}
+% \CheckSum{3740}
%
% \title{The \pkg{mathtools} package\thanks{This file has version number
% \fileversion, last revised \filedate.}}
@@ -427,7 +427,7 @@ colorlinks,
% \begin{verbatim}
% \[
% \begin{gathered}
-% [p] = 100 \\
+% [t] = 100 \\
% [v] = 200
% \end{gathered}
% \]
@@ -439,15 +439,16 @@ colorlinks,
% [v] = 200
% \end{gathered}
% \]
-% Yes, the \texttt{[p]} has been gobbled without any warning
-% whatsoever.\footnote{\pkg{amsmath} thought the \texttt[p] was an
-% optional argument, checked if it was \texttt{t} or \texttt{b} and
-% when both tests failed, assumed it was a \texttt{c}.} This is
-% hardly what you'd expect as an end user, as the desired output was
-% probably something like this instead:
+% Yes, the \texttt{[t]} has been gobbled without warning! Note, with
+% modern \pkg{amsmath} \verb|\begin{gathered}[x]| will eat \verb|[x]|
+% and \emph{issue a warning unless} \texttt{x} is \texttt{t},
+% \texttt{b} or \texttt{c}.\footnote{Older \pkg{amsmath} will
+% silently gobble the argument.} This is hardly what you'd expect
+% as an end user, as the desired output was probably something like
+% this instead:
% \[
% \begin{gathered}[c]
-% [p] = 100 \\
+% [t] = 100 \\
% [v] = 200
% \end{gathered}
% \]
@@ -461,6 +462,15 @@ colorlinks,
% If you however want to preserve the more dangerous standard
% optional spaces, simply choose the option \opt{allowspaces}.
%
+% \begin{codesyntax}
+% \SpecialOptIndex{legacycolonsymbols}\opt{legacycolonsymbols}
+% \end{codesyntax}
+% As of Summer 2022, we've had to rename several \cs{...colon...}
+% symbol macros in order to have a consistent naming scheme across
+% different packages.\footnote{For example with \pkg{unicode-math}.}
+% If needed, this package option brings back the original
+% \cs{...colon...} definitions. See page~\pageref{colonsymbols} for
+% more information.
%
% \section{Tools for mathematical typesetting}
%
@@ -478,7 +488,8 @@ colorlinks,
% \end{verbatim}
% More information on the keys later on.
%
-% \subsection{Fine-tuning mathematical layout}
+%
+% \subsection{Fine-tuning mathematical layout}
%
% Sometimes you need to tweak the layout of formulas a little to get
% the best result and this part of the manual describes the various
@@ -1348,7 +1359,7 @@ colorlinks,
% \]
% Inside the \verb?Xsmallmatrix? construction a small space is
% inserted between the fences and the contents, the size of it can be
-% changed using \key{smallmatrix-align}=\meta{some spacing command},
+% changed using \key{smallmatrix-inner-space}=\meta{some spacing command},
% the default is \cs{,}.
%
% As an extra trick the fences will behave as open and closing fences
@@ -2209,6 +2220,15 @@ colorlinks,
% \cs{abs[\cs{big}]}\marg{arg}, we actually use \cs{bigl} and
% \cs{bigr}.
%
+% \medskip\noindent\textbf{Note 3:} In the unlikely event that you
+% choose to use, say, \verb+\section{Foo $\norm[\big]{bar}$}+ you will
+% get an error because \cs{big} is getting expanded too early. Sadly,
+% due to how \cs{DeclarePairedDelimiter} is implemented one cannot use
+% \verb|[\protect\big]|. At present (until \pkg{amsmath} makes
+% \cs{big} and friends robust), the best
+% solution\footnote{\protect\url{https://tex.stackexchange.com/a/639238/3929}}
+% is to load the \pkg{etoolbox} package and add \verb|\robustify\big|
+% and similar to your preamble.
%
% \subsubsection{Expert use}
%
@@ -2388,43 +2408,71 @@ colorlinks,
% it provide any hooks to deal with math. So currently no general
% solution exists for this problem.
%
-% \begin{codesyntax}
-% \SpecialUsageIndex{\coloneqq}\cs{coloneqq}\texttt{~~~~~}
-% \SpecialUsageIndex{\Coloneqq}\cs{Coloneqq}\texttt{~~~~~}
-% \SpecialUsageIndex{\coloneq}\cs{coloneq}\texttt{~~~}
-% \SpecialUsageIndex{\Coloneq}\cs{Coloneq}\\
-% \SpecialUsageIndex{\eqqcolon}\cs{eqqcolon}\texttt{~~~~~}
-% \SpecialUsageIndex{\Eqqcolon}\cs{Eqqcolon}\texttt{~~~~~}
-% \SpecialUsageIndex{\eqcolon}\cs{eqcolon}\texttt{~~~}
-% \SpecialUsageIndex{\Eqcolon}\cs{Eqcolon}\\
-% \SpecialUsageIndex{\colonapprox}\cs{colonapprox}\texttt{~~}
-% \SpecialUsageIndex{\Colonapprox}\cs{Colonapprox}\texttt{~~}
-% \SpecialUsageIndex{\colonsim}\cs{colonsim}\texttt{~~}
-% \SpecialUsageIndex{\Colonsim}\cs{Colonsim}\\
-% \SpecialUsageIndex{\dblcolon}\cs{dblcolon}
-% \end{codesyntax}
-% The font packages \pkg{txfonts} and \pkg{pxfonts} provide various
-% symbols that include a vertically centered colon but with tighter
-% spacing. For example, the combination |:=| exists as the symbol
-% \cs{coloneqq} which typesets as $\coloneqq$ instead of
-% $\vcentcolon=$. The primary disadvantage of using these fonts is
-% the support packages' lack of support for \pkg{amsmath} (and thus
-% \pkg{mathtools}) and worse yet, the side-bearings are way too
-% tight; see~\cite{A-W:MG04} for examples. If you're not using these
-% fonts, \pkg{mathtools} provides the symbols for you. Here are a few
-% examples:
-% \begin{verbatim}
-% \[
-% a \coloneqq b \quad c \Colonapprox d \quad e \dblcolon f
-% \]
-% \end{verbatim}
-% \[
-% a \coloneqq b \quad c \Colonapprox d \quad e \dblcolon f
-% \]
+% \subsubsection{Some extra symbols involving vertically centered colon}
%
+% Inspired by the \pkg{txfonts} and \pkg{pxfonts} we provide some colon+symbol combinations such that they will be
+% available even when current font does not provide the combined symbol.
%
+% \medskip\noindent \textbf{Breaking change Summer 2022:} As is listed in the manual for
+% \pkg{newtxmath}/\pkg{newpxmath}\footnote{These superceeds \pkg{txfonts} and \pkg{pxfonts}.}, the symbols
+% \cmd{\coloneq}/\cmd{\Coloneq} and \cmd{\eqcolon}/\cmd{\Eqcolon} in \pkg{txfonts}/\pkg{pxfonts} generated the wrong
+% symbols, or at least was not consistent with the naming converntion by other packages. This has now also been
+% fixed in \pkg{mathtools}, giving us the following colon symbol list:
%
-% \subsubsection{A few missing symbols}
+% \begin{center}
+% \small\label{colonsymbols}
+% \newcommand\SSS[1]{\SpecialUsageIndex{#1}\texttt{\detokenize{#1}}&$#1$}
+% \fbox{\begin{tabular}{*{8}{l} }
+% \SSS{\dblcolon} \\
+% \SSS{\coloneq} & \SSS{\Coloneq} & \SSS{\eqcolon} & \SSS{\Eqcolon}
+% \\
+% \SSS{\colonapprox} & \SSS{\Colonapprox} & \SSS{\colonsim} & \SSS{\Colonsim}
+% \\
+% \noalign{\smallskip}
+% \multicolumn{8}{l}{\itshape Legacy duplicate names:} \\
+% \noalign{\smallskip}
+% \SSS{\coloneqq} & \SSS{\eqqcolon} & \SSS{\Coloneqq} & \SSS{\Eqqcolon} \\
+% \noalign{\smallskip}
+% \multicolumn{8}{l}{\itshape Extra symbols added Summer 2022:} \\
+% \noalign{\smallskip}
+% \SSS{\approxcolon} & \SSS{\Approxcolon} & \SSS{\simcolon} & \SSS{\Simcolon} \\
+% \SSS{\colondash} & \SSS{\Colondash} & \SSS{\dashcolon} & \SSS{\Dashcolon} \\
+% \end{tabular}}
+% \end{center}
+%
+% \medskip\noindent If for some reason you need to revert to original (pre summer 2022) colon symbol names, use the
+% \opt{legacycolonsymbols} package option. In which case the macro names maps to:
+%
+% \begin{center}
+% \small\label{colonsymbols-legacy}
+% \makeatletter
+% \newcommand\SSS[2]{\SpecialUsageIndex{#1}\texttt{\detokenize{#1}}&$\@nameuse{#2}$}
+% \makeatother
+% \fbox{\begin{tabular}{*{8}{l}}
+% \SSS{\coloneqq}{MATHT@coloneq} & \SSS{\Coloneqq}{MATHT@dblcoloneq}
+% & \SSS{\coloneq}{MATHT@colondash} & \SSS{Coloneq}{MATHT@dblcolondash} \\
+% \SSS{\eqqcolon}{MATHT@eqcolon} & \SSS{\Eqqcolon}{MATHT@eqdblcolon}
+% & \SSS{\eqcolon}{MATHT@dashcolon} & \SSS{\Eqcolon}{MATHT@dashdblcolon} \\
+% \SSS{\colonapprox}{MATHT@colonapprox} & \SSS{\Colonapprox}{MATHT@dblcolonapprox}
+% & \SSS{\colonsim}{MATHT@colonsim} & \SSS{\Colonsim}{MATHT@dblcolonsim} \\
+% \SSS{\dblcolon}{MATHT@dblcolon}\\
+% \noalign{\smallskip}
+% \multicolumn{8}{l}{\itshape Extra symbols added Summer 2022:} \\
+% \noalign{\smallskip}
+% \SSS{\approxcolon}{MATHT@approxcolon} & \SSS{\Approxcolon}{MATHT@approxdblcolon}
+% & \SSS{\simcolon}{MATHT@simcolon} & \SSS{\Simcolon}{MATHT@simdblcolon} \\
+% \SSS{\colondash}{MATHT@colondash} & \SSS{\Colondash}{MATHT@dblcolondash}
+% & \SSS{\dashcolon}{MATHT@dashcolon} & \SSS{\Dashcolon}{MATHT@dashdblcolon}
+% \end{tabular}}\par\smallskip
+% Colon symbol names with \opt{legacycolonsymbols} package option.
+% \end{center}
+%
+% \medskip\noindent Note that the symbol names are added at the start of the document via the \cs{provide...} mechanism,
+% thus if some font package provide a symbol of the same macro name, we do nothing.
+%
+%
+%
+% \subsubsection{A few additional symbols}
%
% Most provided math font sets are missing the symbols \cs{nuparrow}
% and \cs{ndownarrow} (i.e.\ negated up- and downarrow) plus a `big'
@@ -3046,7 +3094,7 @@ colorlinks,
% \begin{macrocode}
%<*package>
\ProvidesPackage{mathtools}%
- [2022/02/07 v1.28a mathematical typesetting tools]
+ [2022/06/29 v1.29 mathematical typesetting tools]
% \end{macrocode}
% \changes{v1.10}{2011/02/12}{Might as well make sure that we need the
% latest version of \texttt{mhsetup}}
@@ -3167,6 +3215,17 @@ colorlinks,
\MH_set_boolean_F:n {robustify}
}
% \end{macrocode}
+% \changes{v1.29}{2022/06/24}{Added package option to bring back old
+% colon symbols}
+% As of juni/july 2022 we've had to rename several of the provided
+% \cs{...colon...} macros. If needed this package option brings them back.
+% \begin{macrocode}
+\MH_new_boolean:n {legacycolonsymbols}
+\MH_set_boolean_F:n {legacycolonsymbols}
+\DeclareOption{legacycolonsymbols}{
+ \MH_set_boolean_T:n {legacycolonsymbols}
+}
+% \end{macrocode}
% Pass all other options directly to \pkg{amsmath}.
% \begin{macrocode}
\DeclareOption*{
@@ -3182,6 +3241,15 @@ colorlinks,
% \begin{macrocode}
\MHInternalSyntaxOff
\RequirePackage{amsmath}[2016/11/05]
+% \end{macrocode}
+% \changes{v1.29}{2022/06/27}{Added \pkg{unicode-math} warning}
+% \begin{macrocode}
+\@ifpackageloaded{unicode-math}{
+ \PackageWarning{mathtools}{For best results, please load mathtools
+ *before* \MessageBreak unicode-math}
+}{}
+% \end{macrocode}
+% \begin{macrocode}
\MHInternalSyntaxOn
\AtEndOfPackage{\MHInternalSyntaxOff}
% \end{macrocode}
@@ -3916,8 +3984,73 @@ colorlinks,
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \begin{macro}{\MATHT@dblcolon}
+% \begin{macro}{\MATHT@coloneq}
+% \begin{macro}{\MATHT@dblcoloneq}
+% \begin{macro}{\MATHT@colondash}
+% \begin{macro}{\MATHT@dblcolondash}
+% \begin{macro}{\MATHT@eqcolon}
+% \begin{macro}{\MATHT@eqdblcolon}
+% \begin{macro}{\MATHT@dashcolon}
+% \begin{macro}{\MATHT@dashdblcolon}
+% \begin{macro}{\MATHT@colonapprox}
+% \begin{macro}{\MATHT@dblcolonapprox}
+% \begin{macro}{\MATHT@approxcolon}
+% \begin{macro}{\MATHT@approxdblcolon}
+% \begin{macro}{\MATHT@colonsim}
+% \begin{macro}{\MATHT@dblcolonsim}
+% \begin{macro}{\MATHT@simcolon}
+% \begin{macro}{\MATHT@simdblcolon}
+% We can now use \cs{vcentcolon} to define some colon related
+% symbols. Orinally the names of these macro names came from
+% \pkg{txfonts} and \pkg{pxfonts}. Though it turned out that some of
+% them we named inconsistently. Instead we now first name the macros
+% using an internal name and then later map these onto names similar
+% to those coming from \pkg{newtxmath} and \pkg{newpxmath}.
+% \changes{v1.08c}{2010/11/17}{Enclosed all in \cs{mathrel}}
+% \changes{v1.18}{2015/11/12}{Moved the enclosing \cs{mathrel} to
+% \cs{mkern}. This is a result of
+% \url{http://chat.stackexchange.com/transcript/message/23630342#23630342} and \url{http://chat.stackexchange.com/transcript/message/25348032#25348032}}
+% \changes{v1.29}{2022/06/27}{Moved symbol defs into separate MATHT named
+% macros}
+% \begin{macrocode}
+\newcommand*\MATHT@dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon}
+\newcommand*\MATHT@coloneq{\vcentcolon\mathrel{\mkern-1.2mu}=}
+\newcommand*\MATHT@dblcoloneq{\dblcolon\mathrel{\mkern-1.2mu}=}
+\newcommand*\MATHT@colondash{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
+\newcommand*\MATHT@dblcolondash{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
+\newcommand*\MATHT@eqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon}
+\newcommand*\MATHT@eqdblcolon{=\mathrel{\mkern-1.2mu}\dblcolon}
+\newcommand*\MATHT@dashcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon}
+\newcommand*\MATHT@dashdblcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon}
+\newcommand*\MATHT@colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx}
+\newcommand*\MATHT@dblcolonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx}
+\newcommand*\MATHT@approxcolon{\approx\mathrel{\mkern-1.2mu}\vcentcolon}
+\newcommand*\MATHT@approxdblcolon{\approx\mathrel{\mkern-1.2mu}\dblcolon}
+\newcommand*\MATHT@colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim}
+\newcommand*\MATHT@dblcolonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim}
+\newcommand*\MATHT@simcolon{\sim\mathrel{\mkern-1.2mu}\vcentcolon}
+\newcommand*\MATHT@simdblcolon{\sim\mathrel{\mkern-1.2mu}\dblcolon}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
-% \begin{macro}{\dblcolon}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\dblcolon}
% \begin{macro}{\coloneqq}
% \begin{macro}{\Coloneqq}
% \begin{macro}{\coloneq}
@@ -3931,26 +4064,62 @@ colorlinks,
% \begin{macro}{\colonsim}
% \begin{macro}{\Colonsim}
% This is just to simulate all the \cs{..colon..} symbols from
-% \pkg{txfonts} and \pkg{pxfonts}.
-% \changes{v1.08c}{2010/11/17}{Enclosed all in \cs{mathrel}}
-% \changes{v1.18}{2015/11/12}{Moved the enclosing \cs{mathrel} to
-% \cs{mkern}. This is a result of
-% \url{http://chat.stackexchange.com/transcript/message/23630342#23630342} and \url{http://chat.stackexchange.com/transcript/message/25348032#25348032}}
-% \begin{macrocode}
-\AtBeginDocument{
- \providecommand*\dblcolon{\vcentcolon\mathrel{\mkern-.9mu}\vcentcolon}
- \providecommand*\coloneqq{\vcentcolon\mathrel{\mkern-1.2mu}=}
- \providecommand*\Coloneqq{\dblcolon\mathrel{\mkern-1.2mu}=}
- \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
- \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}}
- \providecommand*\eqqcolon{=\mathrel{\mkern-1.2mu}\vcentcolon}
- \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon}
- \providecommand*\eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\vcentcolon}
- \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon}
- \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx}
- \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx}
- \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim}
- \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim}
+% % \pkg{txfonts} and \pkg{pxfonts}.
+% \noindent
+% \textbf{2022/06/24:} Actually these were inconsistenly named in \pkg{txfonts}
+% and \pkg{pxfonts}. Some was properly renamed in \pkg{newtxmath} and
+% \pkg{newpxmath}, but not all.
+% \begin{macrocode}
+\MH_if_boolean:nTF {legacycolonsymbols}{
+ \AtBeginDocument{
+ \providecommand*\dblcolon{\MATHT@dblcolon}
+ \providecommand*\coloneqq{\MATHT@coloneq}
+ \providecommand*\Coloneqq{\MATHT@dblcoloneq}
+ \providecommand*\coloneq{\MATHT@colondash}
+ \providecommand*\Coloneq{\MATHT@dblcolondash}
+ \providecommand*\eqqcolon{\MATHT@eqcolon}
+ \providecommand*\Eqqcolon{\MATHT@eqdblcolon}
+ \providecommand*\eqcolon{\MATHT@dashcolon}
+ \providecommand*\Eqcolon{\MATHT@dashdblcolon}
+ \providecommand*\colonapprox{\MATHT@colonapprox}
+ \providecommand*\Colonapprox{\MATHT@dblcolonapprox}
+ \providecommand*\colonsim{\MATHT@colonsim}
+ \providecommand*\Colonsim{\MATHT@dblcolonsim}
+ % new
+ \providecommand*\approxcolon{\MATHT@approxcolon}
+ \providecommand*\Approxcolon{\MATHT@approxdblcolon}
+ \providecommand*\simcolon{\MATHT@simcolon}
+ \providecommand*\Simcolon{\MATHT@simdblcolon}
+ \providecommand*\colondash{\MATHT@colondash}
+ \providecommand*\Colondash{\MATHT@dblcolondash}
+ \providecommand*\dashcolon{\MATHT@dashcolon}
+ \providecommand*\Dashcolon{\MATHT@dashdblcolon}
+ }
+}{
+ \AtBeginDocument{
+ \providecommand*\dblcolon{\MATHT@dblcolon}
+ \providecommand*\coloneqq{\MATHT@coloneq} % duplet
+ \providecommand*\Coloneqq{\MATHT@dblcoloneq}% duplet
+ \providecommand*\coloneq{\MATHT@coloneq} % changed
+ \providecommand*\Coloneq{\MATHT@dblcoloneq} % changed
+ \providecommand*\eqqcolon{\MATHT@eqcolon} % duplet
+ \providecommand*\Eqqcolon{\MATHT@eqdblcolon}% duplet
+ \providecommand*\eqcolon{\MATHT@eqcolon} % changed
+ \providecommand*\Eqcolon{\MATHT@eqdblcolon} % changed
+ \providecommand*\colonapprox{\MATHT@colonapprox}
+ \providecommand*\Colonapprox{\MATHT@dblcolonapprox}
+ \providecommand*\colonsim{\MATHT@colonsim}
+ \providecommand*\Colonsim{\MATHT@dblcolonsim}
+ % new
+ \providecommand*\approxcolon{\MATHT@approxcolon}
+ \providecommand*\Approxcolon{\MATHT@approxdblcolon}
+ \providecommand*\simcolon{\MATHT@simcolon}
+ \providecommand*\Simcolon{\MATHT@simdblcolon}
+ \providecommand*\colondash{\MATHT@colondash}
+ \providecommand*\Colondash{\MATHT@dblcolondash}
+ \providecommand*\dashcolon{\MATHT@dashcolon}
+ \providecommand*\Dashcolon{\MATHT@dashdblcolon}
+ }
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/mathtools/mathtools.ins b/macros/latex/contrib/mathtools/mathtools.ins
index 81a5ef50c2..f13c6c01a5 100644
--- a/macros/latex/contrib/mathtools/mathtools.ins
+++ b/macros/latex/contrib/mathtools/mathtools.ins
@@ -12,7 +12,6 @@
%% Copyright (C) 2012-2019 by Lars Madsen
%% Copyright (C) 2020- by Lars Madsen, the LaTeX3 project
%%
-%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3c of this license or (at your option) any later
@@ -33,7 +32,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: mathtools 2021/04/12 v1.27}
+\Msg{* Package: mathtools 2022/02/07 v1.28a}
\Msg{************************************************************************}
\keepsilent
diff --git a/macros/latex/contrib/mathtools/mathtools.pdf b/macros/latex/contrib/mathtools/mathtools.pdf
index 67a7e32db0..b47de74277 100644
--- a/macros/latex/contrib/mathtools/mathtools.pdf
+++ b/macros/latex/contrib/mathtools/mathtools.pdf
Binary files differ
diff --git a/macros/latex/contrib/mathtools/mhsetup.ins b/macros/latex/contrib/mathtools/mhsetup.ins
index edf6baa824..4ba3ce8d64 100644
--- a/macros/latex/contrib/mathtools/mhsetup.ins
+++ b/macros/latex/contrib/mathtools/mhsetup.ins
@@ -32,7 +32,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: mhsetup 2017/03/31 v1.3 mhsetup}
+\Msg{* Package: mhsetup 2021/03/18 v1.4 mhsetup}
\Msg{************************************************************************}
\keepsilent
@@ -48,11 +48,11 @@ Copyright (C) 2020- by Lars Madsen, The LaTeX3 team
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
-version 1.3 of this license or (at your option) any later
+version 1.3c of this license or (at your option) any later
version. The latest version of this license is in
http://www.latex-project.org/lppl.txt
-and version 1.3 or later is part of all distributions of
-LaTeX version 2005/12/01 or later.
+and version 1.3c or later is part of all distributions of
+LaTeX version 2008/05/04 or later.
This work has the LPPL maintenance status "maintained".
diff --git a/macros/latex/contrib/mathtools/mhsetup.pdf b/macros/latex/contrib/mathtools/mhsetup.pdf
index 14008f4ebd..a3a4faccf9 100644
--- a/macros/latex/contrib/mathtools/mhsetup.pdf
+++ b/macros/latex/contrib/mathtools/mhsetup.pdf
Binary files differ
diff --git a/macros/latex/contrib/mathtools/test.pdf b/macros/latex/contrib/mathtools/test.pdf
new file mode 100644
index 0000000000..a82f6e29ba
--- /dev/null
+++ b/macros/latex/contrib/mathtools/test.pdf
Binary files differ
diff --git a/macros/latex/contrib/msu-thesis/README.md b/macros/latex/contrib/msu-thesis/README.md
index 029716d82d..ca01a2226f 100644
--- a/macros/latex/contrib/msu-thesis/README.md
+++ b/macros/latex/contrib/msu-thesis/README.md
@@ -1,4 +1,4 @@
-# MSU Thesis Class Version 3.3b 2022/06/24
+# MSU Thesis Class Version 3.4 2022/06/30
Copyright 2011-2022 by Alan Munn <amunn@msu.edu>
diff --git a/macros/latex/contrib/msu-thesis/msu-thesis.cls b/macros/latex/contrib/msu-thesis/msu-thesis.cls
index d925844068..b7d90a5fc7 100644
--- a/macros/latex/contrib/msu-thesis/msu-thesis.cls
+++ b/macros/latex/contrib/msu-thesis/msu-thesis.cls
@@ -165,11 +165,14 @@
% Version 3.3b 2022/06/24 Fixed secnumdepth problem when appendices are used;
% Fixed numbering issue of subsequent chapters;
% made TOC leaders all identical.
+% Version 3.4 2022/06/30 Added a starred version of \makecopyrightpage;
+% removed colons from captions;
+% updated documentation on algorithms and captions
%
% Report bugs/problems/questions to <amunn@msu.edu>
%
-\def\msu@version{3.3b}
-\def\msu@date{2022/06/24}
+\def\msu@version{3.4}
+\def\msu@date{2022/06/30}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{msu-thesis}[\msu@date\space Michigan State University Thesis Class version \msu@version]
\newif\ifmsu@dissertation\msu@dissertationtrue % added v2.7 boolean for \msu@thesistype
@@ -324,8 +327,8 @@
\renewcommand*{\cftchaptername}{Chapter\space}
\renewcommand*{\cftappendixname}{Appendix\space}
\renewcommand*{\cftchapterdotsep}{\cftdotsep}
-\renewcommand*{\cftfigureaftersnum}{\@contdelim} % This uses the same delimiter as in the captions
-\renewcommand*{\cfttableaftersnum}{\@contdelim} % per thesis office punctuation idiocy
+\renewcommand*{\cftfigureaftersnum}{\msucaptiondelim} % This uses the same delimiter as in the captions
+\renewcommand*{\cfttableaftersnum}{\msucaptiondelim} % per thesis office punctuation idiocy
\renewcommand*{\cftfigurename}{Figure\space}
\renewcommand*{\cfttablename}{Table\space}
%\setlength{\cftbeforetableskip}{0pt}
@@ -368,7 +371,6 @@
\newlistentry{algorithm}{loa}{0}
\renewcommand*{\cftalgorithmname}{Algorithm\space}
\renewcommand*{\cftalgorithmaftersnum}{\msucaptiondelim}
-
%
% This code technique from http://tex.stackexchange.com/q/232121/
% Makes appendices formatted as sections not chapters in the TOC
@@ -525,6 +527,7 @@
\newcounter{msu@pubabspages}
\newcommand{\publicabstractname}{\abstractname}
\newenvironment{publicabstract}{%
+ \phantomsection% added 6/30/2022 to remove spurious warning
\ClassWarningNoLine{msu-thesis}{You have provided a public abstract. Please make sure you ALSO have a regular abstract!}
\setcounter{msu@pubabspages}{\value{page}}
\setlength{\afterchapskip}{\onelineskip} % changed 2020/12/14 again removed manual spacing from 2016
@@ -543,7 +546,8 @@
\captionstyle[\centering]{\raggedright}
% Make the caption delimiter a space instead of colon space so that the
% contents lists don't look so stupid. Can be changed if necessary.
-%\captiondelim{\space}
+\newcommand*\msucaptiondelim{\space}
+\captiondelim{\msucaptiondelim}
\pagestyle{plain}
@@ -557,12 +561,17 @@
\addtocounter{page}{1}}
% make the copyright page
+% added * version because a new grad school minion has decided to interpret the formatting guide
+% as requiring left aligned copyright mark, even though the guide says it can be
+% anywhere on the page as long as the text itself is left aligned.
+% * version will make things left aligned. Added v3.4 6/20/2022
\newcommand*{\makecopyrightpage}{%
+ \@ifstar{\def\msu@copyrightalign{}}{\def\msu@copyrightalign{\raggedleft}}
\pagestyle{plain}
\clearpage
\thispagestyle{empty}
\vspace*{7in}
- {\raggedleft Copyright by\\\MakeUppercase{\theauthor}\\\thedate\\}% Author now uppercase 6/5/12
+ {\noindent\msu@copyrightalign Copyright by\\\MakeUppercase{\theauthor}\\\thedate\\}% Author now uppercase 6/5/12
\clearpage}
% make the dedication page
@@ -709,7 +718,6 @@
}
% Do some stuff at begin document:
\AtBeginDocument{%
-\let\msucaptiondelim\@contdelim
% Moved to AtBeginDocument to override apacite
\@ifpackageloaded{apacite}{\@tocbibfalse}{} % added 6/22/17
\@ifpackageloaded{algorithm2e}{\let\@chapter=\algocf@original@chapter}{}% undoes algorithm2e redefinition of chapter added v3.1
diff --git a/macros/latex/contrib/msu-thesis/msu-thesis.pdf b/macros/latex/contrib/msu-thesis/msu-thesis.pdf
index 7a812b78a0..c9487ce6ca 100644
--- a/macros/latex/contrib/msu-thesis/msu-thesis.pdf
+++ b/macros/latex/contrib/msu-thesis/msu-thesis.pdf
Binary files differ
diff --git a/macros/latex/contrib/msu-thesis/msu-thesis.tex b/macros/latex/contrib/msu-thesis/msu-thesis.tex
index 1f31bc87b0..6ee63661cd 100644
--- a/macros/latex/contrib/msu-thesis/msu-thesis.tex
+++ b/macros/latex/contrib/msu-thesis/msu-thesis.tex
@@ -2,8 +2,8 @@
\documentclass[11pt]{article}
-\def\msuversion{3.3b}
-\def\msudate{2022/06/24}
+\def\msuversion{3.4}
+\def\msudate{2022/06/30}
\title{\textbf{Using the MSU Thesis Class}}
\author{\textbf{Alan Munn}\\Department of Linguistics, Languages, and Cultures\\Michigan State University\\\texttt{\href{mailto:amunn@msu.edu}{amunn@msu.edu}}}
\date{Version \msuversion\\\msudate}
@@ -125,7 +125,7 @@ In addition to all the user functionality defined by \pkg{memoir}, the \pkg{msu-
\item[\texttt{\bs fieldofstudy\{\}}] Takes one argument corresponding to your field of study.
\item[\texttt{\bs dedication\{\}}] Takes one argument (should be short), your dedication.
\item[\texttt{\{publicabstract\}}] Environment for the public abstract (unnumbered, uncounted).
-\item[\texttt{\bs makecopyrightpage}] Creates the copyright page.
+\item[\texttt{\bs makecopyrightpage}] Creates the copyright page (use |\makecopyrightpage*| to align the text on the left.)
\item[\texttt{\bs makededicationpage}] Creates the dedication page.
\item[\texttt{\bs makebibliographypage}] Creates the bibliography cover page.
\end{description}
@@ -179,11 +179,11 @@ The \pkg{memoir} class provides commands for single and double spacing (|\Single
\sloppy The \pkg{memoir} class enforces the so-called ``new'' font changing commands (although they have now been in use for many years.) This means that it does not allow you to use the commands |\bf|, |\it|, |\rm|, etc. Unfortunately there are some old packages that still use these commands, and there is also some outdated information on the web that might have examples using these commands. You should generally not use these commands (see \href{http://www.tex.ac.uk/cgi-bin/texfaq2html?label=2letterfontcmd}{Two Letter Font Commands}); if you do encounter problems, you can pass the option |[oldfontcommands]| to the class.
\subsection{Extra Packages}
The \pkg{memoir} class replicates the functionality of many independent packages, so if you are transferring \LaTeX\ source from other documents using the \pkg{article} class, you may encounter some warnings or errors. The \pkg{memoir} documentation has substantial information about the packages it emulates, and the packages for which it provides equivalent functionality. See Chap. 18 Sec. 24 of the \pkg{memoir} manual for details. Quoting from the manual:
-\begin{quote} At the time of writing the emulated packages are: {\sffamily abstract, appendix, booktabs, ccaption, chngcntr, crop, enu- merate, epigraph, ifmtarg, ifpdf, index, makeidx, moreverb, needspace, newfile, nextpage, pagenote, patchcmd, parskip, setspace, shortvrb, showidx, titleref, tocbibind, tocloft, verbatim, and verse.} As well as the emulated packages memoir provides functions equivalent to those in the following packages, although the class does not prevent you from using them: {\sffamily fancyhdr, framed, geometry, sidecap, subfigure, and titlesec.}\\\hfill{\normalfont\emph{The Memoir Class} 10th impression, 2015, p.345}
+\begin{quote} At the time of writing the emulated packages are: {\sffamily abstract, appendix, booktabs, ccaption, chngcntr, crop, enumerate, epigraph, ifmtarg, ifpdf, index, makeidx, moreverb, needspace, newfile, nextpage, pagenote, patchcmd, parskip, setspace, shortvrb, showidx, titleref, tocbibind, tocloft, verbatim, and verse.} As well as the emulated packages memoir provides functions equivalent to those in the following packages, although the class does not prevent you from using them: {\sffamily fancyhdr, framed, geometry, sidecap, subfigure, and titlesec.}\\\hfill{\normalfont\emph{The Memoir Class} 10th impression, 2015, p.345}
\end{quote}
\subsection{Captions}
-\subsubsection{Caption delimiter}
-Because the thesis office doesn't understand anything about punctuation it requires the colon that would appear in a caption to also appear in the contents lists. Since they don't care about the colon itself, but just consistency I've removed colons from the captions entirely, since leaving it in makes the contents lists look really stupid. But in case you or your advisor want the colon in captions, you can add the colon back in by using the Memoir command |\captiondelim{:\space}| and the class will make sure the Lists of Tables and Figures match in formatting.
+\subsubsection{Caption delimiter}\label{captiondelim}
+Because the thesis office doesn't understand anything about punctuation, it requires the colon that would appear in a caption to also appear in the contents lists. Since they don't care about the colon itself, but just consistency I've removed colons from the captions entirely, since leaving it in makes the contents lists look really stupid. But in case you or your advisor want the colon in captions, you can add the colon back in by adding |\renewcommand{\msucaptiondelim}{:\space}| to your preamble, and the class will make sure the Lists of Tables and Figures match in formatting. If you have other floating objects with captions (e.g., algorithms, listings) you may need to change their delimiter too (see below). How you do this may depend on the particular packages you are using.
\subsubsection{New lists}
If you are using other kinds of floats such as listings, you should use the Memoir |\newlistof| command to make the relevant list. The class provides a macro |\msucaptiondelim| which can be used to make sure the formatting of the captions in the list-of-X match the setting you have for Figures and Tables. Here is an example of how you would add a listings list. For lists of algorithms, see section \ref{algorithms} below. The following code goes in your preamble:
\begin{quote}
@@ -235,6 +235,31 @@ If you would normally load the \pkg{algorithm} package to create floating algori
\restylefloat{algorithm}
\end{lstlisting}
\end{quote}
+\subsubsection{Algorithm caption delimiter}
+If you have changed the |\msucaptiondelimeter| to use a colon (see \ref{captiondelim}) then depending on the particular algorithm package you are using, there may be a mismatch between the format of the caption in the algorithm itself and in the List of Algorithms. The Graduate School thinks the presence or absence of a colon in captions and lists is of vital importance, and they may complain about this. Here are two options to use if they complain:
+
+The first method removes the colon from the word Algorithm in the List of Algorithms:
+\begin{quote}
+\begin{lstlisting}
+% Use this code after loading any algorithm package and the float package
+% This removes the colon after the word Algorithm in the List of Algorithms
+\renewcommand*{\cftalgorithmaftersnum}{}
+\end{lstlisting}
+\end{quote}
+
+The second method adds a colon to the word Algorithm in the captions of the algorithms
+
+\begin{quote}
+\begin{lstlisting}
+% Use this code after loading any algorithm package and the float package
+% This removes the colon after the word Algorithm in the List of Algorithms
+% Change the [ruled] specification to the algorithm style you are using.
+\usepackage{caption}
+\captionsetup[ruled]{labelsep=colon}
+\end{lstlisting}
+\end{quote}
+
+
\subsection{The \pkg{microtype} package and contents lists}
If you use the \pkg{microtype} package with |protrusion| set, it’s best to turn it off before your contents lists. You can do this by using |\microtypesetup{protrusion=false}|
@@ -332,12 +357,12 @@ Master’s theses are sometimes relatively short, and you may think that you can
\section{Bugs and redistribution}
\subsection{Current version}
-The latest copy of \pkg{msu-thesis} will always be available on \href{https://ctan.org/pkg/msu-thesis?lang=en}{CTAN}. If you use MiKTeX, or a current year TeX Live then their respective package managers will update or install the latest version. If you are using Overleaf, you may or may not have the most recent version, since Overleaf is usually about one year behind in its TeX distribution. If you are using a Linux-based distribution, or your TeXLive distribution is not the most recent year, you may need to install the latest copy in your local |texmf| directory. If you want others to use the class, \textsc{please} point them to CTAN, or tell them to use an up-to-date TeX distribution so that they can use an up-to-date version with all accompanying documentation and examples rather than passing along your copy. Please report \textsc{any} problems you have with the class to me \href{mailto:amunn@msu.edu}{amunn@msu.edu}, as this will aid in making things easier for those who follow you. If you prefer, you may also report issues using GitHub: \href{https://github.com/amunn/msu-thesis}{github.com/amunn/msu-thesis}. The Graduate School rarely announces changes it makes to the formatting requirements, so your problem reports are extremely helpful for keeping the class in compliance with the latest standards.
+The latest copy of \pkg{msu-thesis} will always be available on \href{https://ctan.org/pkg/msu-thesis?lang=en}{CTAN} and on \href{https://github.com/amunn/msu-thesis}{GitHub}. If you use MiKTeX, or a current year TeX Live then their respective package managers can update or install the latest version. If you are using Overleaf, you may not have the most recent version, since Overleaf is usually about one year behind in its TeX distribution. If you are using a Linux-based distribution, or your TeXLive distribution is not the most recent year, you may need to install the latest copy in your local |texmf| directory or simply in the same directory as your main source file. If you want others to use the class, \textsc{please} point them to CTAN, or tell them to use an up-to-date TeX distribution so that they can use an up-to-date version with all accompanying documentation and examples rather than passing along your copy. Please report \textsc{any} problems you have with the class to me \href{mailto:amunn@msu.edu}{amunn@msu.edu}, as this will aid in making things easier for those who follow you. You may also report actual bugs or class-caused formatting issues using GitHub: \href{https://github.com/amunn/msu-thesis}{github.com/amunn/msu-thesis}, but in my experience, most issues are more easily dealt with using email. The Graduate School rarely announces changes it makes to the formatting requirements, and it is often very inconsistent in what kinds of things it chooses to get annoyed about, so your problem reports are extremely helpful for keeping the class in compliance with the latest standards.
\subsection{Asking me for help}
I'm happy to answer emails about formatting issues with the class, especially when you are in the final stages of formatting your dissertation or thesis, but please keep in mind the following:
\begin{itemize}
\item If you have general LaTeX questions that are not specifically related to the class, please try to find answers elsewhere. \href{https://tex.stackexchange.com/}{tex.stackexchange.com} is an excellent resource for LaTeX help.
-\item Please make sure you have the latest version of the class (check the log file).
+\item Please make sure you have the latest version of the class (check the log file and compare it with \href{https://ctan.org/pkg/msu-thesis?lang=en}{CTAN} or \href{https://github.com/amunn/msu-thesis}{GitHub}).
\item Please make sure you've checked all the issues listed in section \ref{watchout}.
\item Please send me an error-free, compilable sample document for me to test. The best option is for this to be a small sample document using the class that you create that recreates the problem you're having. (Of course if the class actually causes the error, your sample doesn't need to be error free; but it should be free of errors unrelated to the class itself.).
\item If you feel the need to send me your thesis, please send a zip of all the files, otherwise it becomes impossible to test otherwise.
@@ -346,10 +371,10 @@ I'm happy to answer emails about formatting issues with the class, especially wh
\subsection{Archiving your thesis for the future}
Since the current version of the \pkg{msu-thesis} class satisfies the Graduate School requirements at any one time, as these requirements change, you may find that if you need to recompile your thesis after you have graduated that the formatting changes. To avoid this, I would recommend saving an archived version of the \pkg{msu-thesis.cls} file in the same folder as your thesis file. You only need to do this once you have completely finished your thesis however; there's no need to do it during the writing process.
\subsection{Major Version history}
-Previous versions of \pkg{msu-thesis} (versions 1.0--1.4b) were created for non-electronic submission and should not be used. Versions 1.5--1.6 (the first electronic submission versions) contained a |\makeabstract| command and a separate |msuabstract| environment. These have been removed as of version 1.7. Users who are upgrading from earlier versions to version 1.7 do not need to change these commands however but their use will trigger a warning.) Version 2.0 implemented landscape pages; version 2.1 added support for \pkg{hyperref}. Versions 2.2--2.5 mainly accommodated to the ever changing whims of the MSU Graduate School. Version 2.6 fixed some appendix bugs introduced by the previous whim accommodation. Version 2.7 fixed various small spacing issues, fixed a bug which prevented a new chapter page to be a landscape page, added support for the \pkg{apacite} package, and updated degree options. Version 2.8 fixed some spacing and capitalization issues and added support for the public abstract. Version 2.9 removed subscript/superscript size restrictions, added font size options and made small spacing changes to appease the thesis office. Version 3.0 added full support for per-chapter bibliographies and appendices, and automated bibliography spacing for |natbib| and |biblatex| produced bibliographies. Version 3.1 added support for an |{algorithm}| environment and a list of algorithms to combat incompatibilities with the \pkg{algorithm} and \pkg{algorithm2e} packages. Version 3.2 fixed some lingering problems with per-chapter appendices. Version 3.3 added code to accommodate the insane inconsistencies in formatting requirements that the thesis office requires, including a new contents option which hopefully should never be used.
+Previous versions of \pkg{msu-thesis} (versions 1.0--1.4b) were created for non-electronic submission and should not be used. Versions 1.5--1.6 (the first electronic submission versions) contained a |\makeabstract| command and a separate |msuabstract| environment. These have been removed as of version 1.7. Users who are upgrading from earlier versions to version 1.7 do not need to change these commands however but their use will trigger a warning.) Version 2.0 implemented landscape pages; version 2.1 added support for \pkg{hyperref}. Versions 2.2--2.5 mainly accommodated to the ever changing whims of the MSU Graduate School. Version 2.6 fixed some appendix bugs introduced by the previous whim accommodation. Version 2.7 fixed various small spacing issues, fixed a bug which prevented a new chapter page to be a landscape page, added support for the \pkg{apacite} package, and updated degree options. Version 2.8 fixed some spacing and capitalization issues and added support for the public abstract. Version 2.9 removed subscript/superscript size restrictions, added font size options and made small spacing changes to appease the thesis office. Version 3.0 added full support for per-chapter bibliographies and appendices, and automated bibliography spacing for |natbib| and |biblatex| produced bibliographies. Version 3.1 added support for an |{algorithm}| environment and a list of algorithms to combat incompatibilities with the \pkg{algorithm} and \pkg{algorithm2e} packages. Version 3.2 fixed some lingering problems with per-chapter appendices. Version 3.3 added code to accommodate the insane inconsistencies in formatting requirements that the thesis office requires, including a new contents option which hopefully should never be used, and fixed some numbering problems with per-chapter appendices. Version 3.4 added a starred option to the |\makecopyrightpage| command after complaints about placement. The documentation has also been updated to include more information about caption formatting and removed colons from the default caption format.
\section{Acknowledgements}
-Thanks to Lars Madsen, Ulrike Fischer and Peter Wilson for help with setting up parts of the memoir code for versions 1.0--1.4 (now eliminated due to changed requirements). Thanks to Wolfgang Sternefeld for supplying the \pkg{linguex} spacing fix code, Leo Liu for the landscape page numbering code, which greatly simplified my original version, and Florent Chervet for the \pkg{hyperref} code. Thanks also to the following students who have reported problems over the years: Irina Agafonova, Ali Al-jiboory, Julian Blank, Dmitriy Bryndin, Greg Christian, Kyle Crayne, Ciaron Hamilton, Matt Husband, Changkuk Jung, Adam Liter, Vanessa Maldonado, William Muir, Alicia Parrish, Neil ver Planck, Giacomo Romanini, William Sands, Adam Soliman, Erik Stitt, Eremey Valetov, Matthew Vincent, Michael Wojcik, Stephen Yowono, and Yisu Zhou. A special thank you to Non Thongprong who graciously provided a copy of his entire thesis which allowed me to debug some especially subtle spacing inconsistencies.
+Thanks to Lars Madsen, Ulrike Fischer and Peter Wilson for help with setting up parts of the memoir code for versions 1.0--1.4 (now eliminated due to changed requirements). Thanks to Wolfgang Sternefeld for supplying the \pkg{linguex} spacing fix code, Leo Liu for the landscape page numbering code, which greatly simplified my original version, and Florent Chervet for the \pkg{hyperref} code. Thanks also to the following students who have reported problems over the years: Irina Agafonova, Ali Al-jiboory, Julian Blank, Dmitriy Bryndin, Greg Christian, Kyle Crayne, Ciaron Hamilton, Matt Husband, Changkuk Jung, Adam Liter, Vanessa Maldonado, William Muir, Alicia Parrish, Neil ver Planck, Giacomo Romanini, William Sands, Adam Soliman, Erik Stitt, Eremey Valetov, Matthew Vincent, Michael Wojcik, Stephen Yowono, Ali Zare, and Yisu Zhou. A special thank you to Non Thongprong who graciously provided a copy of his entire thesis which allowed me to debug some especially subtle spacing inconsistencies.
\appendix
\renewcommand{\thesection}{Appendix \Alph{section}}
diff --git a/macros/latex/contrib/msu-thesis/samples/MSU-thesis-template.tex b/macros/latex/contrib/msu-thesis/samples/MSU-thesis-template.tex
index 4527ef5ae8..268a3df64e 100644
--- a/macros/latex/contrib/msu-thesis/samples/MSU-thesis-template.tex
+++ b/macros/latex/contrib/msu-thesis/samples/MSU-thesis-template.tex
@@ -1,5 +1,5 @@
% This is a template for use with the MSU Thesis class
-% Version 3.1 2022/03/03
+% Version 3.4 2022/06/30
%
% Class options:
%[PhD] Doctor of Philosophy (default)
@@ -83,9 +83,12 @@
% Make the copyright page. The Graduate School ridiculously claims that you
% can't have a copyright page unless you pay ProQuest to register the copyright.
% This is simply not the case, so put in your copyright page whether or not you
-% intend to pay Proquest to register the copyright.
+% intend to pay Proquest to register the copyright.
+% Furthermore, they have occasionally complained that the copyright mark is aligned
+% to the right, even though that has been the format for more than a decade.
+% If they want the copyright mark aligned to the left, use \makecopyrightpage* instead.
-\makecopyrightpage
+\makecopyrightpage % use starred option to align on the left of the page
% If you have a dedication page, uncomment the next command to print the dedication page
%
diff --git a/macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.pdf b/macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.pdf
index 82ab9f34a7..0845300e57 100644
--- a/macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.pdf
+++ b/macros/latex/contrib/msu-thesis/samples/MSU-thesis-testfile.pdf
Binary files differ
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
index 30af5a6176..2d5662a655 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
index 40588e3c7c..4d6357e042 100644
--- a/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
+++ b/macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
@@ -42,8 +42,8 @@
\setlength{\parindent}{0pt}
\definecolor{LightGray}{gray}{0.9}
-\def\PLversion{1.1.6}
-\def\PLdate{28 Juin 2022}
+\def\PLversion{1.1.7}
+\def\PLdate{30 Juin 2022}
\tcbset{vignettes/.style={%
nobeforeafter,box align=base,boxsep=0pt,enhanced,sharp corners=all,rounded corners=southeast,%
@@ -206,6 +206,8 @@ Deux commandes pour, en \TikZ, créer des petits schémas \og de signe \fg.
Une commande pour déterminer des paramètres ($a$, $b$, $r$ et $r^2$) d'une régression linéaire par moindres carrés.
+Quelques commandes pour convertir bin/dec/hex avec certains détails.
+
\vspace{1.5cm}
\hfill{}\textit{Merci à Anne pour ses retours et sa relecture !}
@@ -2630,7 +2632,216 @@ Quelques \Cle{Clés} sont disponibles pour cette commande, essentiellement pour
\newpage
-\section{Historique}
+\section{Conversions binaire/hexadécimal/décimal}
+
+\subsection{Idée}
+
+\begin{codeidee}
+L'idée est de \textit{compléter} les possibilités offertes par le package \ctex{xintbinhex}, en mettant en forme quelques conversions :
+
+\begin{itemize}
+ \item décimal en binaire avec blocs de 4 chiffres en sortie ;
+ \item conversion binaire ou hexédacimal en décimal avec écriture polynomiale.
+\end{itemize}
+\end{codeidee}
+
+\begin{codeinfo}
+Le package \ctex{xintbinhex} est la base de ces macros, puisqu'il permet de faire des conversions directes !
+
+\smallskip
+
+Les macros présentées ici ne font que les intégrer dans un environnement adapté à une correction ou une présentation !
+\end{codeinfo}
+
+\begin{codetex}[listing only]
+\xintDecToHex{100}
+\xintDecToBin{51}
+\xintHexToDec{A4C}
+\xintBinToDec{110011}
+\xintBinToHex{11111111}
+\xintHexToBin{ACDC}
+\xintCHexToBin{3F}
+\end{codetex}
+
+\begin{codesortie}
+\xintDecToHex{100}
+
+\xintDecToBin{51}
+
+\xintHexToDec{A4C}
+
+\xintBinToDec{110011}
+
+\xintBinToHex{11111111}
+
+\xintHexToBin{ACDC}
+
+\xintCHexToBin{3F}
+\end{codesortie}
+
+\subsection{Conversion décimal vers binaire}
+
+\begin{codetex}[listing only]
+\PLconvdecbin(*)[<clés>]{<nombre>}
+\end{codetex}
+
+\begin{codecles}
+Concernant la commande en elle même, peu de paramétrage :
+
+\begin{itemize}
+ \item la version \textit{étoilée} qui permet de ne pas afficher de zéros avant pour \og compléter \fg{} ;
+ \item le booléen \Cle{affbase} qui permet d'afficher ou non la base des nombres ; \hfill{}défaut \Cle{true}
+ \item l'argument, mandataire, est le nombre entier à convertir.
+\end{itemize}
+
+Le formatage est géré par \ctex{sinuitx}, le mieux est donc de positionner la commande dans un environnement mathématique.
+
+\smallskip
+
+Les nombres écrits en binaire sont, par défaut, présenter en bloc de 4 chiffres.
+\end{codecles}
+
+\begin{codetex}[listing only]
+% Conversion avec affichage de la base et par bloc de 4
+$\PLconvdecbin{415}$
+% Conversion avec affichage de la base et sans forcément des blocs de 4
+$\PLconvdecbin*{415}$
+% Conversion sans affichage de la base et par bloc de 4
+$\PLconvdecbin[affbase=false]{415}$
+% Conversion sans affichage de la base et sans forcément des blocs de 4
+$\PLconvdecbin*[affbase=false]{415}$
+\end{codetex}
+
+\begin{codesortie}
+$\PLconvdecbin{415}$
+
+\smallskip
+
+$\PLconvdecbin*{415}$
+
+\smallskip
+
+$\PLconvdecbin[affbase=false]{415}$
+
+\smallskip
+
+$\PLconvdecbin*[affbase=false]{415}$
+\end{codesortie}
+
+\subsection{Conversion hexadécimal vers binaire}
+
+\begin{codeinfo}
+L'idée est ici de présenter la conversion, grâce à la conversion \og directe \fg{} par blocs de 4 chiffres :
+
+\begin{itemize}
+ \item la macro rajoute éventuellement les zéros pour compléter ;
+ \item elle découpe par blocs de 4 chiffres binaires ;
+ \item elle présente la conversion de chacun des blocs de 4 chiffres binaires ;
+ \item elle affiche la conversion en binaire.
+\end{itemize}
+\end{codeinfo}
+
+\begin{codetex}[listing only]
+\PLconvbinhex[<clés>]{<nombre>}
+\end{codetex}
+
+\begin{codecles}
+Quelques \Cle{clés} sont disponibles pour cette commande :
+
+\begin{itemize}
+ \item le booléen \Cle{affbase} qui permet d'afficher ou non la base des nombres ; \hfill{}défaut \Cle{true}
+ \item le booléen \Cle{details} qui permet d'afficher ou le détail par bloc de 4 ; \hfill{}défaut \Cle{true}
+ \item la clé \Cle{trait} qui permet de modifier l'épaisseur du crochet. \hfill{}défaut \Cle{0.
+ 5pt}
+\end{itemize}
+
+Le formatage est géré par le package \ctex{sinuitx}, le mieux est de positionner la commande dans un environnement mathématique.
+\end{codecles}
+
+\begin{codetex}[listing only]
+%conversion avec détails et affichage de la base
+$\PLconvbinhex{110011111}$
+%conversion avec détails et affichage, et modif taille crochet
+$\PLconvbinhex[trait=1.5pt]{110011111}$
+%conversion sans détails et affichage de la base
+$\PLconvbinhex[details=false]{110011111}$
+%conversion sans détails et sans affichage de la base
+$\PLconvbinhex[affbase=false,details=false]{110011111}$
+%conversion avec détails et sans affichage
+$\PLconvbinhex[affbase=false]{110011111}$
+\end{codetex}
+
+\begin{codesortie}
+$\PLconvbinhex{110011111}$
+
+$\PLconvbinhex[trait=1.5pt]{110011111}$
+
+$\PLconvbinhex[details=false]{110011111}$
+
+$\PLconvbinhex[affbase=false,details=false]{110011111}$
+
+$\PLconvbinhex[details=false]{110011111}$
+\end{codesortie}
+
+\pagebreak
+
+\subsection{Conversion binaire ou hexadécimal en décimal}
+
+\begin{codeinfo}
+L'idée est ici de présenter la conversion, grâce à l'écriture polynômiale :
+
+\begin{itemize}
+ \item écrit la somme des puissances ;
+ \item convertir si besoin les \textit{chiffres} hexadécimal ;
+ \item peut ne pas afficher les monômes de coefficient 0.
+\end{itemize}
+\end{codeinfo}
+
+\begin{codetex}[listing only]
+\PLconvtodec[<clés>]{<nombre>}
+\end{codetex}
+
+\begin{codecles}
+Quelques \Cle{clés} sont disponibles pour cette commande :
+
+\begin{itemize}
+ \item la clé \Cle{basedep} qi est la base de départ (2 ou 16 !) ; \hfill{}défaut \Cle{2}
+ \item le booléen \Cle{affbase} qui permet d'afficher ou non la base des nombres ; \hfill{}défaut \Cle{true}
+ \item le booléen \Cle{details} qui permet d'afficher ou le détail par bloc de 4 ; \hfill{}défaut \Cle{true}
+ \item le booléen \Cle{zeros} qui affiche les chiffres 0 dans la somme. \hfill{}défaut \Cle{true}
+\end{itemize}
+
+Le formatage est toujours géré par le package \ctex{sinuitx}, le mieux est de positionner la commande dans un environnement mathématique.
+\end{codecles}
+
+\begin{codetex}[listing only]
+%conversion 16->10 avec détails et affichage de la base et zéros
+$\PLconvtodec[basedep=16]{19F}$
+%conversion 2->10 avec détails et affichage de la base et zéros
+$\PLconvtodec{110011}$
+%conversion 2->10 avec détails et affichage de la base et sans zéros
+$\PLconvtodec[zeros=false]{110011}$
+%conversion 16->10 sans détails et affichage de la base et avec zéros
+$\PLconvtodec[basedep=16,details=false]{AC0DC}$
+%conversion 16->10 avec détails et sans affichage de la base et sans zéros
+$\PLconvtodec[zeros=false,basedep=16]{AC0DC}$
+\end{codetex}
+
+\begin{codesortie}
+$\PLconvtodec[basedep=16]{19F}$
+
+$\PLconvtodec{110011}$
+
+$\PLconvtodec[zeros=false]{110011}$
+
+$\PLconvtodec[basedep=16,details=false]{AC0DC}$
+
+$\PLconvtodec[zeros=false,basedep=16,details=false]{AC0DC}$
+\end{codesortie}
+
+\newpage
+
+{\small \bverb|v1.1.7|~:~~~~Conversions bin/hex/dec (basées sur \ctex{xintbinhex}) avec quelques détails
{\small \bverb|v1.1.6|~:~~~~Ajout d'une commande \textsf{PLregln} pour déterminer les paramètres d'une régression linéaire par moindres carrés
diff --git a/macros/latex/contrib/proflycee/tex/ProfLycee.sty b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
index 98f5b192c6..d1902bc2ac 100644
--- a/macros/latex/contrib/proflycee/tex/ProfLycee.sty
+++ b/macros/latex/contrib/proflycee/tex/ProfLycee.sty
@@ -3,7 +3,8 @@
% or later, see http://www.latex-project.org/lppl.txtf
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{ProfLycee}[2022/06/28 - v1.1.6 - Aide pour l'utilisation de LaTeX en lycée]
+\ProvidesPackage{ProfLycee}[2022/06/30 - v1.1.7 - Aide pour l'utilisation de LaTeX en lycée]
+% 1.1.7 Ajout de commandes pour des conversions bin/dec/hex
% 1.1.6 Ajout d'une commande pour déterminer les paramètres d'un régression linéaire par moindres carrés
% 1.1.5 Ajout de commandes pour "visualiser" le signe de ax+b ou de ax2+bx+c (cf tnsana !)
% 1.1.4 Ajout d'une commande cercletrigoPL pour, en \TikZ, créer facilement un cercle trigo avec options
@@ -42,6 +43,7 @@
\RequirePackage{xfp}
\RequirePackage{xstring}
\RequirePackage{xintexpr}
+\RequirePackage{xintbinhex}
\RequirePackage{simplekv}
\RequirePackage{listofitems}
\RequirePackage{tabularray}
@@ -1285,4 +1287,153 @@
\foreach \i in {1,2,...,\LNB} {\filldraw[\RegLinNuageCouleur] ({\LX[\i]-\RegLinNuageOx},{\LY[\i]-\RegLinNuageOy}) circle[radius=\RegLinNuageTaille] ;}
}
+%=============ConversionsBases========= OK !!
+%dec->bin avec blocs de 4 chiffres
+\setKVdefault[CONVDECBIN]{%
+ affbase=true
+}
+\NewDocumentCommand\PLconvdecbin{ s O{} m }{%
+ \useKVdefault[CONVDECBIN]
+ \setKV[CONVDECBIN]{#2}% on paramètres les nouvelles clés et on les simplifie
+ \def\resbrut{\xintDecToBin{#3}}
+ \StrLen{\resbrut}[\nbchiffres]
+ \def\nbgrp{\fpeval{4*ceil(\nbchiffres/4,0)}}
+ \IfBooleanTF{#1}
+ {\num{#3}\ifboolKV[CONVDECBIN]{affbase}{_{10}}{}=\num[digit-group-size=4]{\resbrut}\ifboolKV[CONVDECBIN]{affbase}{_{2}}{}}
+ {\num{#3}\ifboolKV[CONVDECBIN]{affbase}{_{10}}{}=\num[digit-group-size=4,minimum-integer-digits=\nbgrp]{\resbrut}\ifboolKV[CONVDECBIN]{affbase}{_{2}}{}}
+}
+
+%bin->hexa avec blocs de 4 chiffres
+\defKV[CONVBINHEX]{%
+ trait=\def\epcrochet{#1}
+}
+\setKVdefault[CONVBINHEX]{%
+ trait=0.5pt,%
+ affbase=true,%
+ details=true
+}
+
+%bourrage de 0 avant
+\ExplSyntaxOn
+\NewExpandableDocumentCommand{\PLstrzeros}{m}
+{
+ \int_compare:nT { #1 > 0 }
+ {
+ 0 \prg_replicate:nn { #1 - 1 } { 0 }
+ }
+}
+\ExplSyntaxOff
+
+%conversion (visuelle) d'un bloc de 4 chiffres binaires
+\newcommand\PLconvblocbinhex[2][0.5pt]{%
+ \underbracket[#1]{#2}_{\xintBinToHex{#2}}
+}
+
+%la conversion complète
+\newcommand\PLconvbinhex[2][]{%
+ \useKVdefault[CONVBINHEX]
+ \setKV[CONVBINHEX]{#1}% on paramètres les nouvelles clés et on les simplifie
+ \def\chbrut{#2}
+ \StrLen{\chbrut}[\nbchiffres] %nb de chiffres du binaire
+ \xdef\nbgrp{\fpeval{4*ceil(\nbchiffres/4,0)}} %nb de chiffres avec blocs de 4
+ \xdef\nbblocs{\fpeval{\nbgrp/4}} %nb de blocs
+ %on rajoute des zeros si besoin := OK
+ \xdef\resinter{\chbrut}
+ \num[digit-group-size=4]{\chbrut}\ifboolKV[CONVBINHEX]{affbase}{_{2}}{}=
+ \ifboolKV[CONVBINHEX]{details}{%
+ \ifnum\nbchiffres<\nbgrp
+ \xdef\nbz{\inteval{\nbgrp-\nbchiffres}}
+ \xdef\resinter{\PLstrzeros{\nbz}\chbrut}
+ \num[digit-group-size=4,minimum-integer-digits=\nbgrp]{\resinter}=
+ \fi
+ %découpage par blocs et conversion en hexa := OK
+ \newcount\cpt
+ \cpt0
+ \loop\ifnum \cpt<\nbblocs
+ \def\iinit{\fpeval{4*\cpt+1}}
+ \def\ifinal{\fpeval{4*(\cpt+1)}}
+ \StrMid{\resinter}{\iinit}{\ifinal}[\blocinter]
+ \PLconvblocbinhex[\epcrochet]{\blocinter}
+ \advance\cpt by 1
+ \repeat
+ =
+ }%
+ {}
+ \xintBinToHex{\chbrut}\ifboolKV[CONVBINHEX]{affbase}{_{16}}{}
+}
+
+%bin/hexa->dec avec écriture polynomiale
+\defKV[CONVTODEC]{%
+ basedep=\def\basedepart{#1}
+}
+\setKVdefault[CONVTODEC]{%
+ basedep=2,%
+ affbase=true,%
+ details=true,%
+ zeros=true
+}
+
+\newcommand\PLconvtodec[2][]{%
+ \useKVdefault[CONVTODEC]
+ \setKV[CONVTODEC]{#1}% on paramètres les nouvelles clés et on les simplifie
+ \def\nbdepart{#2}
+ \StrLen{\nbdepart}[\nbchiffres]
+ \StrChar{\nbdepart}{1}[\chiffre]
+ %si on est en base 16
+ \xintifboolexpr{\basedepart == 16}%
+ {%
+ \nbdepart\ifboolKV[CONVTODEC]{affbase}{_{\basedepart}}{} =
+ \ifboolKV[CONVTODEC]{details}{%
+ \xintHexToDec{\chiffre}\times\basedepart^{\inteval{\nbchiffres-1}}%
+ \newcount\cpt
+ \cpt2
+ \loop\ifnum \cpt<\inteval{\nbchiffres+1}
+ \def\puiss{\inteval{\nbchiffres-\cpt}}
+ \StrChar{\nbdepart}{\cpt}[\chiffre]
+ \ifboolKV[CONVTODEC]{zeros}%
+ {%
+ +\xintHexToDec{\chiffre}\times\basedepart^{\puiss}%
+ }
+ {
+ \ifnum\xintHexToDec{\chiffre} > 0
+ +\xintHexToDec{\chiffre}\times\basedepart^{\puiss}%
+ \fi
+ }
+ \advance\cpt by 1
+ \repeat
+ =
+ }
+ {}
+ \num{\xintHexToDec{\nbdepart}}\ifboolKV[CONVTODEC]{affbase}{_{10}}{}
+ }%
+ {}
+ \xintifboolexpr{\basedepart == 2}%
+ {%
+ \num[digit-group-size=4]{\nbdepart}\ifboolKV[CONVTODEC]{affbase}{_{\basedepart}}{} =
+ \ifboolKV[CONVTODEC]{details}{%
+ \chiffre\times\basedepart^{\inteval{\nbchiffres-1}}%
+ \newcount\cpt
+ \cpt2
+ \loop\ifnum \cpt<\inteval{\nbchiffres+1}
+ \def\puiss{\inteval{\nbchiffres-\cpt}}
+ \StrChar{\nbdepart}{\cpt}[\chiffre]
+ \ifboolKV[CONVTODEC]{zeros}%
+ {%
+ +\chiffre\times\basedepart^{\puiss}%
+ }
+ {
+ \ifnum\chiffre > 0
+ +\chiffre\times\basedepart^{\puiss}%
+ \fi
+ }
+ \advance\cpt by 1
+ \repeat
+ =
+ }
+ {}
+ \num{\xintBinToDec{\nbdepart}}\ifboolKV[CONVTODEC]{affbase}{_{10}}{}
+ }%
+ {}
+}
+
\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/sanitize-umlaut/CHANGES b/macros/latex/contrib/sanitize-umlaut/CHANGES
deleted file mode 100644
index 2c22512ce1..0000000000
--- a/macros/latex/contrib/sanitize-umlaut/CHANGES
+++ /dev/null
@@ -1,27 +0,0 @@
-%% The LaTeX package sanitize-umlaut - version 1.10 (2020/01/01)
-%%
-%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2016-2020 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
-%% -------------------------------------------------------------------------------------------
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This work has the LPPL maintenance status `author-maintained'.
-%%
-%% This work consists of all files listed in README
-%%
-
-version 1.00 (2016/05/27): initial public release
-
-version 1.10 (2020/01/01):
-- implementation changed to adapt for LaTeX/inputenc UTF-8 changes
- (see documentation):
- version 1.00 is only compatible to older LaTeX/inputenc UTF-8
- version 1.10 is only compatible to recent LaTeX/inputenc UTF-8
-- utf8-2018 is a new supported encoding
diff --git a/macros/latex/contrib/sanitize-umlaut/CHANGES.md b/macros/latex/contrib/sanitize-umlaut/CHANGES.md
new file mode 100644
index 0000000000..017517874a
--- /dev/null
+++ b/macros/latex/contrib/sanitize-umlaut/CHANGES.md
@@ -0,0 +1,60 @@
+# Changelog
+All notable changes to this project will be documented in this file.
+
+The format is based on
+[Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to
+[Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+### Added
+### Changed
+### Deprecated
+### Removed
+### Fixed
+### Security
+
+
+
+## [1.2.1] - 2022-06-29
+
+### Fixed
+- The implementation of 1.2.0 changed UTF8 characters globally, not locally
+ inside `\index`. The fix works locally as intended and only affects
+ characters with UTF8-encoding C3..
+
+
+
+## [1.2.0] - 2022-06-29
+
+### Changed
+- Changelog moved from CHANGES to CHANGES.md and adapted to
+ [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
+- From now on version numbers adhere to
+ [Semantic Versioning](http://semver.org/spec/v2.0.0.html)
+
+### Fixed
+- The 2022 June release of LaTeX breaks sanitize-umlaut (issue #1)
+ A patch to `utf8.def` is added to circumvent `\protected` for
+ two-octets UTF8 characters (including umlauts) inside `\index`
+
+
+
+## [1.10] - 2020-01-01
+
+### Added
+- `utf8-2018` is a new supported encoding
+
+### Changed
+- implementation changed to adapt for LaTeX/inputenc UTF-8 changes
+ (see documentation):
+ version 1.00 is only compatible to older LaTeX/inputenc UTF-8
+ version 1.10 is only compatible to recent LaTeX/inputenc UTF-8
+
+
+
+## [1.00] - 2016-05-27
+
+### Added
+- Initial public release
diff --git a/macros/latex/contrib/sanitize-umlaut/README b/macros/latex/contrib/sanitize-umlaut/README
deleted file mode 100644
index 2285acf34d..0000000000
--- a/macros/latex/contrib/sanitize-umlaut/README
+++ /dev/null
@@ -1,41 +0,0 @@
-%% The LaTeX package sanitize-umlaut - version 1.10 (2020/01/01)
-%%
-%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2016-2020 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
-%% -------------------------------------------------------------------------------------------
-%%
-%% This work may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3
-%% of this license or (at your option) any later version.
-%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
-%%
-%% This work has the LPPL maintenance status `author-maintained'.
-%%
-%% This work consists of all files listed in README
-%%
-
-The package sanitizes umlauts to be used directly in index entries for
-MakeIndex and friends with pdflatex. This means, that inside '\index' an umlaut
-can be used as "U or directly. In both cases, the letter is written as "U into
-the raw index file for correct processing with MakeIndex and pdflatex.
-
-Contents of the package
-=======================
- 'README' this file
- 'sanitize-umlaut.sty' LaTeX package file (style file)
- 'sanitize-umlaut.pdf' Documentation
- 'sanitize-umlaut.tex' Source code of the documentation (main file)
- '*.doc.*' Source code of the documentation (include files)
- 'german.ist' MakeIndex style
-
-Installation
-============
-Copy the contents of the 'sanitize-umlaut.tds.zip' from CTAN to your local TeX file tree.
-
-Alternatively, put the files to their respective locations within the TeX installation:
- 'sanitize-umlaut.sty' -> /tex/latex/sanitize-umlaut
-
- all other files -> /doc/latex/sanitize-umlaut
diff --git a/macros/latex/contrib/sanitize-umlaut/README.md b/macros/latex/contrib/sanitize-umlaut/README.md
new file mode 100644
index 0000000000..9d7da8de81
--- /dev/null
+++ b/macros/latex/contrib/sanitize-umlaut/README.md
@@ -0,0 +1,43 @@
+# The LaTeX package sanitize-umlaut - version 1.2.1 (2022/06/29)
+
+
+> Copyright (c) 2016-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+
+> This work may be distributed and/or modified under the
+> conditions of the LaTeX Project Public License, either version 1.3
+> of this license or (at your option) any later version.
+> The latest version of this license is in
+> http://www.latex-project.org/lppl.txt
+> and version 1.3 or later is part of all distributions of LaTeX
+> version 2005/12/01 or later.
+
+> This work has the LPPL maintenance status `author-maintained`.
+
+> This work consists of all files listed in README.md
+
+
+`sanitize-umlaut` sanitizes umlauts to be used directly in index entries for
+MakeIndex and friends with pdflatex. This means, that inside `\index` an umlaut
+can be used as `"U` or directly. In both cases, the letter is written as `"U` into
+the raw index file for correct processing with MakeIndex and pdflatex.
+
+
+## Contents of the package
+
+- `README.md` this file
+- `CHANGES.md` log of changes (history)
+- `sanitize-umlaut.sty` LaTeX package file (style file)
+- `sanitize-umlaut.pdf` Documentation
+- `sanitize-umlaut.tex` Source code of the documentation (main file)
+- `*.doc.*` Source code of the documentation (include files)
+- `german.ist` MakeIndex style
+
+
+## Installation
+
+Copy the contents of the `sanitize-umlaut.tds.zip` from CTAN to your local TeX file tree.
+
+Alternatively, put the files to their respective locations within the TeX installation:
+
+- `sanitize-umlaut.sty` -> /tex/latex/sanitize-umlaut
+- all other files -> /doc/latex/sanitize-umlaut
diff --git a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.pdf b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.pdf
index 0d9216b6d9..abb30adb4a 100644
--- a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.pdf
+++ b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.pdf
Binary files differ
diff --git a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.sty b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.sty
index 86918c3baa..65041d2112 100644
--- a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.sty
+++ b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.sty
@@ -1,16 +1,16 @@
-%% The LaTeX package sanitize-umlaut - version 1.10 (2020/01/01)
+%% The LaTeX package sanitize-umlaut - version 1.2.1 (2022/06/29)
%% sanitize-umlaut.sty: Sanitize umlauts for makeindex
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2016-2020 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2016-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `author-maintained'.
@@ -18,25 +18,38 @@
%% This work consists of all files listed in README
%%
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{sanitize-umlaut}[2020/01/01 version 1.10 sanitize umlauts]
+\ProvidesPackage{sanitize-umlaut}[2022/06/29 version 1.2.1 sanitize umlauts]
\def\sanitize@unicode@char#1#2{%
\@namedef{u8:\detokenize{#1}}{#2}%
}
-\long\def\sanitize@umlaut@UTFviii@two@octets{% patch for 'utf8.def'
+
+% BEGIN: patch for 'utf8.def'
+\long\def\sanitize@umlaut@UTFviii@two@octets{%
\ifincsname
\expandafter \UTF@two@octets@string
- \else
\fi
\UTFviii@two@octets@combine
}
\begingroup
+\catcode`\~13
+\catcode`\"12
+\gdef\sanitize@umlaut@local@UTFviii@redefinition{%
+ \def\UTFviii@tmp{\edef~{\noexpand\sanitize@umlaut@UTFviii@two@octets\noexpand~}}%
+ \uccode`\~"C3%
+ \uppercase\expandafter{\UTFviii@tmp}%
+}
+\endgroup
+% END: patch for 'utf8.def'
+
+
+\begingroup
\catcode`\"=12
\gdef\sanitize@umlaut@utfviii{%
- \let\UTFviii@two@octets\sanitize@umlaut@UTFviii@two@octets%
+ \sanitize@umlaut@local@UTFviii@redefinition%
\sanitize@unicode@char{^^c3^^a4}{"a}%
\sanitize@unicode@char{^^c3^^b6}{"o}%
\sanitize@unicode@char{^^c3^^bc}{"u}%
diff --git a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.tex b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.tex
index cdeac7add0..25e9284e1d 100644
--- a/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.tex
+++ b/macros/latex/contrib/sanitize-umlaut/sanitize-umlaut.tex
@@ -2,19 +2,19 @@
% !TeX encoding=UTF-8
% !TeX spellcheck=en_US
%%
-%% The LaTeX package sanitize-umlaut - version 1.10 (2020/01/01)
+%% The LaTeX package sanitize-umlaut - version 1.2.1 (2022/06/29)
%% sanitize-umlaut.tex: Manual
%%
%% -------------------------------------------------------------------------------------------
-%% Copyright (c) 2016-2020 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
+%% Copyright (c) 2016-2022 by Prof. Dr. Dr. Thomas F. Sturm <thomas dot sturm at unibw dot de>
%% -------------------------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3
%% of this license or (at your option) any later version.
%% The latest version of this license is in
-%% http://www.latex-project.org/lppl.txt
-%% and version 1.3 or later is part of all distributions of LaTeX
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `author-maintained'.
@@ -27,8 +27,8 @@
\usepackage{%
sanitize-umlaut}
-\def\version{1.10}%
-\def\datum{2020/01/01}%
+\def\version{1.2.1}%
+\def\datum{2022/06/29}%
\hypersetup{
pdftitle={Manual for the sanitize-umlaut package},
@@ -52,7 +52,7 @@
\footnote{Prof.~Dr.~Dr.~Thomas F.~Sturm, Institut f\"{u}r Mathematik und Informatik,
Universit\"{a}t der Bundeswehr M\"{u}nchen, D-85577 Neubiberg, Germany;
email: \href{mailto:thomas.sturm@unibw.de}{thomas.sturm@unibw.de}}\par\medskip
-\normalsize\url{http://www.ctan.org/pkg/sanitize-umlaut}\par
+\normalsize\url{https://www.ctan.org/pkg/sanitize-umlaut}\par
\url{https://github.com/T-F-S/sanitize-umlaut}
}
\end{center}
@@ -112,7 +112,7 @@ An alternative would be to filter the resulting raw \myverb{.idx} index
Another alternative is to replace MakeIndex by Xindy or another index
processor.
-
+\clearpage
\section{Important Compatibility Informations}%
\subsection{Past}
@@ -139,6 +139,12 @@ This patch \textbf{is not compatible} to older versions of \LaTeX/|inputenc| (be
Therefore, if your \LaTeX\ distribution is not reasonable up to date, you
should stay at version 1.00 of |sanitize-umlaut|.
+With the 2022 June release of \LaTeX, characters defined via |utf8.def| are now
+defined as |\protected| macros. Therefore, |sanitize-umlaut| version 1.2.0 (or newer)
+patches some relevant parts of two-octets characters during |\index| back to
+pre 2022 June behaviour. Obviously, you loose |\protected| here, if you
+load |sanitize-umlaut|.
+
\subsection{Future}
As always, the future is dark and difficult to see. Further changes of
|inputenc| implementation may force further changes of |sanitize-umlaut|.
@@ -147,6 +153,7 @@ Also, if some miracle happens, MakeIndex may be updated one day to
recognize UTF-8 properly to make |sanitize-umlaut| superfluous.
+\clearpage
\section{Package Usage}%
\subsection{Prerequisites}