summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-12-14 03:01:43 +0000
committerNorbert Preining <norbert@preining.info>2019-12-14 03:01:43 +0000
commit2c20697e8a5301b61c59d752fd1cfa7499724eec (patch)
treed2475f5c56c14a7c38d26cfd2c5b71d4e0d824e0 /macros
parentfdd3c58e8e5b37dcf9affd49326899988992c074 (diff)
CTAN sync 201912140301
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/README.md15
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-AT.dtx355
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-CH.dtx356
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-DE.dtx354
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-ascii.dtx217
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-utf8.dtx214
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base.dtx124
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.dtx307
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.pdfbin0 -> 136566 bytes
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.dtx1938
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.ins42
-rw-r--r--macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.pdfbin323394 -> 0 bytes
-rw-r--r--macros/latex/contrib/erw-l3/README.md (renamed from macros/latex/contrib/erw-l3/README.txt)3
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.dtx679
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.ins68
-rw-r--r--macros/latex/contrib/erw-l3/erw-l3.pdfbin531652 -> 534931 bytes
-rw-r--r--macros/xetex/latex/parsa/IntLogo.pngbin0 -> 7519 bytes
-rw-r--r--macros/xetex/latex/parsa/IranLogo.pngbin0 -> 9041 bytes
-rw-r--r--macros/xetex/latex/parsa/README.txt27
-rw-r--r--macros/xetex/latex/parsa/parsa-doc.pdfbin0 -> 178337 bytes
-rw-r--r--macros/xetex/latex/parsa/parsa-doc.tex496
-rw-r--r--macros/xetex/latex/parsa/parsa.sty712
-rw-r--r--macros/xetex/latex/parsa/picture.jpgbin0 -> 38645 bytes
23 files changed, 3683 insertions, 2224 deletions
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/README.md b/macros/latex/contrib/datetime2-contrib/datetime2-german/README.md
index 354d3adc4b..2c803abeb7 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-german/README.md
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/README.md
@@ -10,7 +10,6 @@ Required Packages: `datetime2`, `tracklang`
This module is maintained.
Current maintainer is Sebastian Friedl.
-Thanks to Jürgen Spitzmüller for his valuable advice while developing Version 2.0 of this module.
## Installation
@@ -20,12 +19,12 @@ Move all `*.ldf` files to `TEXMF/tex/latex/datetime2-contrib/datetime2-german/`
Documentation:
- pdflatex datetime2-german.dtx
- makeindex -s gind.ist datetime2-german.idx
- makeindex -s gglo.ist -o datetime2-german.gls datetime2-german.glo
- pdflatex datetime2-german.dtx
- pdflatex datetime2-german.dtx
+ lualatex datetime2-german-doc.dtx
+ makeindex -s gind.ist datetime2-german-doc.idx
+ makeindex -s gglo.ist -o datetime2-german-doc.gls datetime2-german-doc.glo
+ lualatex datetime2-german-doc.dtx
+ lualatex datetime2-german-doc.dtx
-Move `datetime2-german.pdf` and `README` to `TEXMF/doc/latex/datetime2-contrib/datetime2-german/`
+Move `datetime2-german-doc.pdf` and `README.md` to `TEXMF/doc/latex/datetime2-contrib/datetime2-german/`
-This material is subject to the LaTeX Project Public License. See [http://www.latex-project.org/lppl.txt](http://www.latex-project.org/lppl.txt "Show the current version of the LPPL") for the details of that license.
+This material is subject to the LaTeX Project Public License. See [http://www.latex-project.org/lppl.txt](http://www.latex-project.org/lppl.txt "Show the current version of the LPPL") or `LICENSE.txt` for the details of that license.
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-AT.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-AT.dtx
new file mode 100644
index 0000000000..434363708d
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-AT.dtx
@@ -0,0 +1,355 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{Austrian German (de-AT): \texttt{datetime2-de-AT.ldf}}
+% \changes{2.0}{2017-10-03}{Added regional variant: Austrian German (de-AT)}
+%
+% Identify Module.
+% \begin{macrocode}
+\ProvidesDateTimeModule{de-AT}[2019/12/13 v3.0]
+% \end{macrocode}
+% Require the base German module.
+% \begin{macrocode}
+\RequireDateTimeModule{german-base}
+% \end{macrocode}
+%
+%
+% Allow the to configure the "de-AT" and "de-AT-numeric" styles.
+% The package wide separators such as \cs{dtm@datetimesep} are not used
+% in case other date formats are also required.
+%
+%\begin{macro}{\DTMdeATdowdaysep}
+% The separator between weekday and day
+% \begin{macrocode}
+\newcommand*{\DTMdeATdowdaysep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATdaymonthsep}
+% The separator between the day and month for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeATdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATmonthyearsep}
+% The separator between the month and year for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeATmonthyearsep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATdatetimesep}
+% The separator between the date and time blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeATdatetimesep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATtimezonesep}
+% The separator between the time and zone blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeATtimezonesep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATdatesep}
+% The separator for the numeric date format.
+% \begin{macrocode}
+\newcommand*{\DTMdeATdatesep}{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATtimesep}
+% The separator for the numeric time format.
+% \begin{macrocode}
+\newcommand*{\DTMdeATtimesep}{:}
+% \end{macrocode}
+%\end{macro}
+%
+% Provide keys that can be used in \cs{DTMlangsetup} to set these
+% separators.
+% \begin{macrocode}
+\DTMdefkey{de-AT}{dowdaysep}{\renewcommand*{\DTMdeATdowdaysep}{#1}}
+\DTMdefkey{de-AT}{daymonthsep}{\renewcommand*{\DTMdeATdaymonthsep}{#1}}
+\DTMdefkey{de-AT}{monthyearsep}{\renewcommand*{\DTMdeATmonthyearsep}{#1}}
+\DTMdefkey{de-AT}{datetimesep}{\renewcommand*{\DTMdeATdatetimesep}{#1}}
+\DTMdefkey{de-AT}{timezonesep}{\renewcommand*{\DTMdeATtimezonesep}{#1}}
+\DTMdefkey{de-AT}{datesep}{\renewcommand*{\DTMdeATdatesep}{#1}}
+\DTMdefkey{de-AT}{timesep}{\renewcommand*{\DTMdeATtimesep}{#1}}
+% \end{macrocode}
+%
+%
+% Define a boolean key that can switch between full and abbreviated formats for
+% the month and day of week names.
+% \begin{macrocode}
+\DTMdefboolkey{de-AT}{abbr}[true]{}
+% \end{macrocode}
+%
+% The default is to show the full names.
+% \begin{macrocode}
+\DTMsetbool{de-AT}{abbr}{false}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the time zone mappings
+% should be used.
+% \begin{macrocode}
+\DTMdefboolkey{de-AT}{mapzone}[true]{}
+% \end{macrocode}
+% The default is to use mappings.
+% \begin{macrocode}
+\DTMsetbool{de-AT}{mapzone}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the day of month should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-AT}{showdayofmonth}[true]{}
+% \end{macrocode}
+% The default is to show the day of month.
+% \begin{macrocode}
+\DTMsetbool{de-AT}{showdayofmonth}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the year should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-AT}{showyear}[true]{}
+% \end{macrocode}
+% The default is to show the year.
+% \begin{macrocode}
+\DTMsetbool{de-AT}{showyear}{true}
+% \end{macrocode}
+%
+%
+% Define the "de-AT" style.
+% \begin{macrocode}
+\DTMnewstyle
+{de-AT}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeATdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-AT}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeATdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMdeATshortmonthname{##2}}%
+ {\DTMdeATmonthname{##2}}%
+ %
+ \DTMifbool{de-AT}{showyear}%
+ {%
+ \DTMdeATmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }%
+ \renewcommand*\DTMDisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeATdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-AT}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeATdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMdeATshortmonthname{##2}}%
+ {\DTMdeATmonthname{##2}}%
+ %
+ \DTMifbool{de-AT}{showyear}%
+ {%
+ \DTMdeATmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }%
+}%
+{% time style (use default)
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeATtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeATtimesep\DTMtwodigits{##3}\fi
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-AT}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMdeATtimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeATdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeATtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}[9]{%
+ \ifDTMshowdate
+ \DTMDisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeATdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeATtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+}%
+% \end{macrocode}
+%
+% Define the corresponding numeric style.
+% \changes{3.0}{2019-12-13}{Change Austrian numeric style}
+% \begin{macrocode}
+\DTMnewstyle
+{de-AT-numeric}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeATdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-AT}{showdayofmonth}%
+ {%
+ \DTMtwodigits{##3}%
+ \DTMdeATdatesep
+ }%
+ {}%
+ \DTMtwodigits{##2}%
+ \DTMdeATdatesep%
+ \DTMifbool{de-AT}{showyear}%
+ {%
+ \DTMifbool{de-AT}{abbr}%
+ {\DTMtwodigits{##1}}%
+ {\number##1 }% space intended
+ }%
+ {}%
+ }%
+ \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
+}%
+{% time style
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeATtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeATtimesep\DTMtwodigits{##3}\fi
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-AT}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeATdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeATtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}{\DTMdisplay}%
+}
+% \end{macrocode}
+%
+% Switch the style according to the \opt{useregional} setting.
+% \begin{macrocode}
+\DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-AT}}%
+ {\DTMsetstyle{de-AT-numeric}}%
+% \end{macrocode}
+%
+% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
+% \sty{babel} from resetting \cs{today}. (For this to work,
+% \sty{babel} must already have been loaded if it's required.)
+% \begin{macrocode}
+\ifcsundef{date\CurrentTrackedDialect}
+{%
+ \ifundef\dategerman
+ {}% do nothing
+ {%
+ \def\dategerman{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-AT}}%
+ {\DTMsetstyle{de-AT-numeric}}%
+ }%
+ }%
+}%
+{%
+ \csdef{date\CurrentTrackedDialect}{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-AT}}%
+ {\DTMsetstyle{de-AT-numeric}}%
+ }%
+}%
+% \end{macrocode}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-CH.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-CH.dtx
new file mode 100644
index 0000000000..89b04ca3e7
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-CH.dtx
@@ -0,0 +1,356 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{Swiss German (de-CH): \texttt{datetime2-de-CH.ldf}}
+% \changes{2.0}{2017-10-03}{Added regional variant: Swiss German (de-CH)}
+%
+% Identify Module.
+% \begin{macrocode}
+\ProvidesDateTimeModule{de-CH}[2019/12/13 v3.0]
+% \end{macrocode}
+% Require the base German module
+% \begin{macrocode}
+\RequireDateTimeModule{german-base}
+% \end{macrocode}
+%
+%
+% Allow the user to configure the "de-CH" and "de-CH-numeric" styles.
+% The package wide separators such as \cs{dtm@datetimesep} are not used
+% in case other date formats are also required.
+%
+%\begin{macro}{\DTMdeCHdowdaysep}
+% The separator between weekday and day
+% \begin{macrocode}
+\newcommand*{\DTMdeCHdowdaysep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHdaymonthsep}
+% The separator between the day and month for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeCHdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHmonthyearsep}
+% The separator between the month and year for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeCHmonthyearsep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHdatetimesep}
+% The separator between the date and time blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeCHdatetimesep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHtimezonesep}
+% The separator between the time and zone blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeCHtimezonesep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHdatesep}
+% The separator for the numeric date format.
+% \begin{macrocode}
+\newcommand*{\DTMdeCHdatesep}{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHtimesep}
+% The separator for the numeric time format.
+% \begin{macrocode}
+\newcommand*{\DTMdeCHtimesep}{.}
+% \end{macrocode}
+%\end{macro}
+%
+% Provide keys that can be used in \cs{DTMlangsetup} to set these
+% separators.
+% \begin{macrocode}
+\DTMdefkey{de-CH}{dowdaysep}{\renewcommand*{\DTMdeCHdowdaysep}{#1}}
+\DTMdefkey{de-CH}{daymonthsep}{\renewcommand*{\DTMdeCHdaymonthsep}{#1}}
+\DTMdefkey{de-CH}{monthyearsep}{\renewcommand*{\DTMdeCHmonthyearsep}{#1}}
+\DTMdefkey{de-CH}{datetimesep}{\renewcommand*{\DTMdeCHdatetimesep}{#1}}
+\DTMdefkey{de-CH}{timezonesep}{\renewcommand*{\DTMdeCHtimezonesep}{#1}}
+\DTMdefkey{de-CH}{datesep}{\renewcommand*{\DTMdeCHdatesep}{#1}}
+\DTMdefkey{de-CH}{timesep}{\renewcommand*{\DTMdeCHtimesep}{#1}}
+% \end{macrocode}
+%
+%
+% Define a boolean key that can switch between full and abbreviated formats for
+% the month and day of week names.
+% \begin{macrocode}
+\DTMdefboolkey{de-CH}{abbr}[true]{}
+% \end{macrocode}
+%
+% The default is to show the full name.
+% \begin{macrocode}
+\DTMsetbool{de-CH}{abbr}{false}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the time zone mappings
+% should be used.
+% \begin{macrocode}
+\DTMdefboolkey{de-CH}{mapzone}[true]{}
+% \end{macrocode}
+% The default is to use mappings.
+% \begin{macrocode}
+\DTMsetbool{de-CH}{mapzone}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the day of month should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-CH}{showdayofmonth}[true]{}
+% \end{macrocode}
+% The default is to show the day of month.
+% \begin{macrocode}
+\DTMsetbool{de-CH}{showdayofmonth}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the year should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-CH}{showyear}[true]{}
+% \end{macrocode}
+% The default is to show the year.
+% \begin{macrocode}
+\DTMsetbool{de-CH}{showyear}{true}
+% \end{macrocode}
+%
+%
+% Define the "de-CH" style.
+% \begin{macrocode}
+\DTMnewstyle
+{de-CH}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeCHdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-CH}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeCHdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMdeCHshortmonthname{##2}}%
+ {\DTMgermanmonthname{##2}}%
+ %
+ \DTMifbool{de-CH}{showyear}%
+ {%
+ \DTMdeCHmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }%
+ \renewcommand*\DTMDisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeCHdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-CH}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeCHdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMdeCHshortmonthname{##2}}%
+ {\DTMgermanmonthname{##2}}%
+ %
+ \DTMifbool{de-CH}{showyear}%
+ {%
+ \DTMdeCHmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }
+}%
+{% time style (use default)
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeCHtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeCHtimesep\DTMtwodigits{##3}\fi\space%
+ Uhr%
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-CH}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMdeCHtimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeCHdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeCHtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}[9]{%
+ \ifDTMshowdate
+ \DTMDisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeCHdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeCHtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+}%
+% \end{macrocode}
+%
+% Define the corresponding numeric style.
+% \begin{macrocode}
+\DTMnewstyle
+{de-CH-numeric}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeCHdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-CH}{showdayofmonth}%
+ {%
+ \DTMtwodigits{##3}%
+ \DTMdeCHdatesep
+ }%
+ {}%
+ \DTMtwodigits{##2}%
+ \DTMdeCHdatesep%
+ \DTMifbool{de-CH}{showyear}%
+ {%
+ \DTMifbool{de-CH}{abbr}%
+ {\DTMtwodigits{##1}}%
+ {\number##1 }% space intended
+ }%
+ {}%
+ }%
+ \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
+}%
+{% time style
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeCHtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeCHtimesep\DTMtwodigits{##3}\fi\space%
+ Uhr%
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-CH}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeCHdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeCHtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}{\DTMdisplay}%
+}
+% \end{macrocode}
+%
+% Switch the style according to the \opt{useregional} setting.
+% \begin{macrocode}
+\DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-CH}}%
+ {\DTMsetstyle{de-CH-numeric}}%
+% \end{macrocode}
+%
+% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
+% \sty{babel} from resetting \cs{today}. (For this to work,
+% \sty{babel} must already have been loaded if it's required.)
+% \begin{macrocode}
+\ifcsundef{date\CurrentTrackedDialect}
+{%
+ \ifundef\dategerman
+ {}% do nothing
+ {%
+ \def\dategerman{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-CH}}%
+ {\DTMsetstyle{de-CH-numeric}}%
+ }%
+ }%
+}%
+{%
+ \csdef{date\CurrentTrackedDialect}{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-CH}}%
+ {\DTMsetstyle{de-CH-numeric}}%
+ }%
+}%
+% \end{macrocode}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-DE.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-DE.dtx
new file mode 100644
index 0000000000..e1c29938b6
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-de-DE.dtx
@@ -0,0 +1,354 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{German (de-DE): \texttt{datetime2-de-DE.ldf}}
+% \changes{2.0}{2017-10-03}{Added regional variant: German (de-DE)}
+%
+% Identify Module.
+% \begin{macrocode}
+\ProvidesDateTimeModule{de-DE}[2019/12/13 v3.0]
+% \end{macrocode}
+% Require the base German module.
+% \begin{macrocode}
+\RequireDateTimeModule{german-base}
+% \end{macrocode}
+%
+%
+% Allow the user to configure the "de-DE" and "de-DE-numeric" styles.
+% The package wide separators such as \cs{dtm@datetimesep} are not used
+% in case other date formats are also required.
+%
+%\begin{macro}{\DTMdeDEdowdaysep}
+% The separator between weekday and day.
+% \begin{macrocode}
+\newcommand*{\DTMdeDEdowdaysep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEdaymonthsep}
+% The separator between the day and month for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeDEdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEmonthyearsep}
+% The separator between the month and year for the text format.
+% \begin{macrocode}
+\newcommand*{\DTMdeDEmonthyearsep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEdatetimesep}
+% The separator between the date and time blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeDEdatetimesep}{,\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEtimezonesep}
+% The separator between the time and zone blocks in the full format
+% (either text or numeric).
+% \begin{macrocode}
+\newcommand*{\DTMdeDEtimezonesep}{\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEdatesep}
+% The separator for the numeric date format.
+% \begin{macrocode}
+\newcommand*{\DTMdeDEdatesep}{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeDEtimesep}
+% The separator for the numeric time format.
+% \begin{macrocode}
+\newcommand*{\DTMdeDEtimesep}{:}
+% \end{macrocode}
+%\end{macro}
+%
+% Provide keys that can be used in \cs{DTMlangsetup} to set these
+% separators.
+% \begin{macrocode}
+\DTMdefkey{de-DE}{dowdaysep}{\renewcommand*{\DTMdeDEdowdaysep}{#1}}
+\DTMdefkey{de-DE}{daymonthsep}{\renewcommand*{\DTMdeDEdaymonthsep}{#1}}
+\DTMdefkey{de-DE}{monthyearsep}{\renewcommand*{\DTMdeDEmonthyearsep}{#1}}
+\DTMdefkey{de-DE}{datetimesep}{\renewcommand*{\DTMdeDEdatetimesep}{#1}}
+\DTMdefkey{de-DE}{timezonesep}{\renewcommand*{\DTMdeDEtimezonesep}{#1}}
+\DTMdefkey{de-DE}{datesep}{\renewcommand*{\DTMdeDEdatesep}{#1}}
+\DTMdefkey{de-DE}{timesep}{\renewcommand*{\DTMdeDEtimesep}{#1}}
+% \end{macrocode}
+%
+%
+% Define a boolean key that can switch between full and abbreviated formats for
+% the month and day of week names.
+% \begin{macrocode}
+\DTMdefboolkey{de-DE}{abbr}[true]{}
+% \end{macrocode}
+%
+% The default is to show the full names.
+% \begin{macrocode}
+\DTMsetbool{de-DE}{abbr}{false}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the time zone mappings
+% should be used.
+% \begin{macrocode}
+\DTMdefboolkey{de-DE}{mapzone}[true]{}
+% \end{macrocode}
+% The default is to use mappings.
+% \begin{macrocode}
+\DTMsetbool{de-DE}{mapzone}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the day of month should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-DE}{showdayofmonth}[true]{}
+% \end{macrocode}
+% The default is to show the day of month.
+% \begin{macrocode}
+\DTMsetbool{de-DE}{showdayofmonth}{true}
+% \end{macrocode}
+%
+% Define a boolean key that determines if the year should be
+% displayed.
+% \begin{macrocode}
+\DTMdefboolkey{de-DE}{showyear}[true]{}
+% \end{macrocode}
+% The default is to show the year.
+% \begin{macrocode}
+\DTMsetbool{de-DE}{showyear}{true}
+% \end{macrocode}
+%
+%
+% Define the "de-DE" style.
+% \begin{macrocode}
+\DTMnewstyle
+{de-DE}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeDEdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-DE}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeDEdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMgermanshortmonthname{##2}}%
+ {\DTMgermanmonthname{##2}}%
+ %
+ \DTMifbool{de-DE}{showyear}%
+ {%
+ \DTMdeDEmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }%
+ \renewcommand*\DTMDisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeDEdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-DE}{showdayofmonth}%
+ {\DTMgermanordinal{##3}\DTMdeDEdaymonthsep}%
+ {}%
+ %
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMgermanshortmonthname{##2}}%
+ {\DTMgermanmonthname{##2}}%
+ %
+ \DTMifbool{de-DE}{showyear}%
+ {%
+ \DTMdeDEmonthyearsep%
+ \number##1 % space intended
+ }%
+ {}%
+ }
+}%
+{% time style (use default)
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeDEtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeDEtimesep\DTMtwodigits{##3}\fi
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-DE}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMdeDEtimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeDEdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeDEtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}[9]{%
+ \ifDTMshowdate
+ \DTMDisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeDEdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeDEtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+}%
+% \end{macrocode}
+%
+% Define the corresponding numeric style.
+% \begin{macrocode}
+\DTMnewstyle
+{de-DE-numeric}% label
+{% date style
+ \renewcommand*\DTMdisplaydate[4]{%
+ \ifDTMshowdow
+ \ifnum##4>-1
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMgermanshortweekdayname{##4}}%
+ {\DTMgermanweekdayname{##4}}%
+ \DTMdeDEdowdaysep
+ \fi
+ \fi
+ %
+ \DTMifbool{de-DE}{showdayofmonth}%
+ {%
+ \DTMtwodigits{##3}%
+ \DTMdeDEdatesep
+ }%
+ {}%
+ \DTMtwodigits{##2}%
+ \DTMdeDEdatesep%
+ \DTMifbool{de-DE}{showyear}%
+ {%
+ \DTMifbool{de-DE}{abbr}%
+ {\DTMtwodigits{##1}}%
+ {\number##1 }% space intended
+ }%
+ {}%
+ }%
+ \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
+}%
+{% time style
+ \renewcommand*\DTMdisplaytime[3]{%
+ \DTMtwodigits{##1}%
+ \DTMdeDEtimesep\DTMtwodigits{##2}%
+ \ifDTMshowseconds\DTMdeDEtimesep\DTMtwodigits{##3}\fi
+ }%
+}%
+{% zone style
+ \DTMresetzones
+ \DTMgermanzonemaps
+ \renewcommand*{\DTMdisplayzone}[2]{%
+ \DTMifbool{de-DE}{mapzone}%
+ {\DTMusezonemapordefault{##1}{##2}}%
+ {%
+ \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
+ \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
+ }%
+ }%
+}%
+{% full style
+ \renewcommand*{\DTMdisplay}[9]{%
+ \ifDTMshowdate
+ \DTMdisplaydate{##1}{##2}{##3}{##4}%
+ \DTMdeDEdatetimesep
+ \fi
+ \DTMdisplaytime{##5}{##6}{##7}%
+ \ifDTMshowzone
+ \DTMdeDEtimezonesep
+ \DTMdisplayzone{##8}{##9}%
+ \fi
+ }%
+ \renewcommand*{\DTMDisplay}{\DTMdisplay}%
+}
+% \end{macrocode}
+%
+% Switch the style according to the \opt{useregional} setting.
+% \begin{macrocode}
+\DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-DE}}%
+ {\DTMsetstyle{de-DE-numeric}}%
+% \end{macrocode}
+%
+% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
+% \sty{babel} from resetting \cs{today}. (For this to work,
+% \sty{babel} must already have been loaded if it's required.)
+% \begin{macrocode}
+\ifcsundef{date\CurrentTrackedDialect}
+{%
+ \ifundef\dategerman
+ {}% do nothing
+ {%
+ \def\dategerman{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-DE}}%
+ {\DTMsetstyle{de-DE-numeric}}%
+ }%
+ }%
+}%
+{%
+ \csdef{date\CurrentTrackedDialect}{%
+ \DTMifcaseregional
+ {}% do nothing
+ {\DTMsetstyle{de-DE}}%
+ {\DTMsetstyle{de-DE-numeric}}
+ }%
+}%
+% \end{macrocode}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-ascii.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-ascii.dtx
new file mode 100644
index 0000000000..1a6842849a
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-ascii.dtx
@@ -0,0 +1,217 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{ASCII-code: \texttt{datetime2-german-base-ascii.ldf}}
+% The definitions in this file use \LaTeX\ commands for non-ASCII characters.
+% It should be used if neither \hologo{XeLaTeX} nor \hologo{LuaLaTeX} are used.
+% Even if the user has loaded \sty{inputenc} with "utf8", this file should still
+% be used instead of \texttt{datetime2-german-base-utf8.ldf} as the non-ASCII
+% characters are made active in that situation and would need protecting
+% against expansion.
+% \changes{1.0}{2015-03-27}{Initial release}
+%
+% \medskip
+% Identify module.
+% \begin{macrocode}
+\ProvidesDateTimeModule{german-base-ascii}[2019/12/13 v3.0]
+% \end{macrocode}
+%
+%\begin{macro}{\DTMgermanmonthname}
+% German month names.
+% \begin{macrocode}
+\newcommand*{\DTMgermanmonthname}[1]{%
+ \ifcase#1
+ \or
+ Januar%
+ \or
+ Februar%
+ \or
+ M\protect\"arz%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ August%
+ \or
+ September%
+ \or
+ Oktober%
+ \or
+ November%
+ \or
+ Dezember%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATmonthname}
+%\changes{2.0}{2017-10-03}{Implemented Austrian month names}
+% Austrian German month names.
+% \begin{macrocode}
+\newcommand*{\DTMdeATmonthname}[1]{%
+ \ifcase#1
+ \or
+ J\protect\"anner%
+ \or
+ Februar%
+ \or
+ M\protect\"arz%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ August%
+ \or
+ September%
+ \or
+ Oktober%
+ \or
+ November%
+ \or
+ Dezember%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMgermanshortmonthname}
+% Abbreviated German month names.
+%\changes{1.2}{2017-09-10}{Implemented short month names}
+%\changes{2.0}{2017-10-03}{Fixed German short month names}
+% \begin{macrocode}
+\newcommand*{\DTMgermanshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jan.%
+ \or
+ Feb.%
+ \or
+ M\protect\"arz%
+ \or
+ Apr.%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATshortmonthname}
+%\changes{2.0}{2017-10-03}{Implemented Austrian short month names}
+% Abbreviated Austrian German month names.
+% \begin{macrocode}
+\newcommand*{\DTMdeATshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ J\protect\"an.%
+ \or
+ Feb.%
+ \or
+ M\protect\"arz%
+ \or
+ Apr.%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHshortmonthname}
+% Abbreviated Swiss German month names.
+%\changes{2.0}{2017-10-03}{Implemented Swiss short month names}
+% \begin{macrocode}
+\newcommand*{\DTMdeCHshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jan.%
+ \or
+ Febr.%
+ \or
+ M\protect\"arz%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-utf8.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-utf8.dtx
new file mode 100644
index 0000000000..ae6b248c22
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base-utf8.dtx
@@ -0,0 +1,214 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{UTF-8 code: \texttt{datetime2-german-base-utf8.dtx}}
+% The definitions in this file use UTF-8 characters. It is loaded if
+% \hologo{XeLaTeX} or \hologo{LuaLaTeX} are used. Please make sure that
+% your text editor's encoding is set to UTF-8 if you want to view this code.
+% \changes{1.0}{2015-03-27}{Initial release}
+%
+% \medskip
+% Identify module.
+% \begin{macrocode}
+\ProvidesDateTimeModule{german-base-utf8}[2019/12/13 v3.0]
+% \end{macrocode}
+%
+%\begin{macro}{\DTMgermanmonthname}
+% German month names.
+% \begin{macrocode}
+\newcommand*{\DTMgermanmonthname}[1]{%
+ \ifcase#1
+ \or
+ Januar%
+ \or
+ Februar%
+ \or
+ März%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ August%
+ \or
+ September%
+ \or
+ Oktober%
+ \or
+ November%
+ \or
+ Dezember%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATmonthname}
+%\changes{2.0}{2017-10-03}{Implemented Austrian month names}
+% Austrian German month names.
+% \begin{macrocode}
+\newcommand*{\DTMdeATmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jänner%
+ \or
+ Februar%
+ \or
+ März%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ August%
+ \or
+ September%
+ \or
+ Oktober%
+ \or
+ November%
+ \or
+ Dezember%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMgermanshortmonthname}
+% Abbreviated German month names.
+%\changes{1.2}{2017-09-10}{Implemented short month names}
+%\changes{2.0}{2017-10-03}{Fixed German short month names}
+% \begin{macrocode}
+\newcommand*{\DTMgermanshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jan.%
+ \or
+ Feb.%
+ \or
+ März%
+ \or
+ Apr.%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeATshortmonthname}
+%\changes{2.0}{2017-10-03}{Implemented Austrian short month names}
+% Abbreviated Austrian German month names.
+% \begin{macrocode}
+\newcommand*{\DTMdeATshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jän.%
+ \or
+ Feb.%
+ \or
+ März%
+ \or
+ Apr.%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMdeCHshortmonthname}
+% Abbreviated Swiss German month names.
+%\changes{2.0}{2017-10-03}{Implemented Swiss short month names}
+% \begin{macrocode}
+\newcommand*{\DTMdeCHshortmonthname}[1]{%
+ \ifcase#1
+ \or
+ Jan.%
+ \or
+ Febr.%
+ \or
+ März%
+ \or
+ April%
+ \or
+ Mai%
+ \or
+ Juni%
+ \or
+ Juli%
+ \or
+ Aug.%
+ \or
+ Sept.%
+ \or
+ Okt.%
+ \or
+ Nov.%
+ \or
+ Dez.%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base.dtx
new file mode 100644
index 0000000000..7651fe0ada
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-base.dtx
@@ -0,0 +1,124 @@
+%\iffalse
+%<*package>
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%</package>
+%
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+% \fi
+%
+%
+%
+% \subsection{Engine-independent code: \texttt{datetime2-german-base.ldf}}
+%
+% \changes{1.0}{2015-03-27}{Initial release}
+%
+% \medskip
+% Identify module
+% \begin{macrocode}
+\ProvidesDateTimeModule{german-base}[2019/12/13 v3.0]
+% \end{macrocode}
+%
+%\begin{macro}{\DTMgermanordinal}
+% Ordinals used for printing the day of month.
+% \begin{macrocode}
+\newcommand*{\DTMgermanordinal}[1]{%
+ \number#1
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMgermanweekdayname}
+% Weekday names.
+% \begin{macrocode}
+\newcommand*{\DTMgermanweekdayname}[1]{%
+ \ifcase#1
+ Montag%
+ \or
+ Dienstag%
+ \or
+ Mittwoch%
+ \or
+ Donnerstag%
+ \or
+ Freitag%
+ \or
+ Samstag%
+ \or
+ Sonntag%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMgermanshortweekdayname}
+% Abbreviated weekday names.
+%\changes{1.2}{2017-09-10}{Implemented short weekday names}
+%\changes{2.0}{2017-10-03}{Fixed short weekday names}
+% \begin{macrocode}
+\newcommand*{\DTMgermanshortweekdayname}[1]{%
+ \ifcase#1
+ Mo%
+ \or
+ Di%
+ \or
+ Mi%
+ \or
+ Do%
+ \or
+ Fr%
+ \or
+ Sa%
+ \or
+ So%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\DTMgermanzonemaps}
+% The time zone mappings are set through this command, which can be
+% redefined if extra mappings are required or mappings need to be
+% removed.
+%\changes{1.2}{2017-09-10}{Use German time zone names (ME[S]Z)}
+% \begin{macrocode}
+\newcommand*{\DTMgermanzonemaps}{%
+ \DTMdefzonemap{01}{00}{MEZ}%
+ \DTMdefzonemap{02}{00}{MESZ}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+% Load engine-dependent code. \\
+% \hologo{XeTeX} and \hologo{LuaTeX} natively support UTF-8, so the "german-base-utf8"
+% module is loaded if either of those engines are used. \\
+% Otherwise, the "german-base-ascii" module is loaded.
+% \begin{macrocode}
+\RequirePackage{ifxetex, ifluatex}
+\ifxetex
+ \RequireDateTimeModule{german-base-utf8}
+\else
+ \ifluatex
+ \RequireDateTimeModule{german-base-utf8}
+ \else
+ \RequireDateTimeModule{german-base-ascii}
+ \fi
+\fi
+% \end{macrocode}
+%
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.dtx
new file mode 100644
index 0000000000..ed3a95d843
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.dtx
@@ -0,0 +1,307 @@
+% \iffalse
+%% Doc-Source file to use with LaTeX2e
+%% Copyright (C) 2015 Nicola Talbot, all rights reserved.
+%% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
+%%
+%% This work is subject to the LaTeX Project Public License, Version 1.3c or -- at
+%% your option -- any later version of this license.
+%%
+%%
+%% This work has the LPPL maintenance status 'maintained'.
+%% Current maintainer of the work is Sebastian Friedl.
+% \fi
+
+% !TeX spellcheck=en_US
+
+\documentclass[11pt]{ltxdoc}
+
+\RequirePackage{iftex}
+\RequireLuaTeX
+
+
+\usepackage[no-math]{fontspec}
+\usepackage{polyglossia}
+\setdefaultlanguage{english}
+\usepackage[english]{selnolig}
+
+\usepackage{alltt}
+\usepackage{csquotes}
+\usepackage{graphicx}
+\usepackage{hologo}
+\usepackage{multicol}
+
+\usepackage{array}
+\usepackage{booktabs}
+\usepackage{tabularx}
+
+\usepackage[unicode, pdfborder={0 0 0}, linktoc=all, hyperindex=false]{hyperref}
+\usepackage{verbatim}
+
+\usepackage[erewhon]{newtxmath}
+\setmainfont{Source Serif Pro}
+\setsansfont{Source Sans Pro}
+\setmonofont[Scale=MatchLowercase]{Hack}
+
+\usepackage[a4paper, left=4.50cm,right=2.75cm,top=3.25cm,bottom=2.75cm,nohead]{geometry}
+
+\parindent 0pt
+
+\CheckSum{1068}
+
+\renewcommand*{\usage}[1]{\hyperpage{#1}}
+\renewcommand*{\main}[1]{\hyperpage{#1}}
+\IndexPrologue{\section*{\indexname}\markboth{\indexname}{\indexname}}
+\setcounter{IndexColumns}{2}
+
+\newcommand*{\sty}[1]{\textsf{#1}}
+\newcommand*{\opt}[1]{\texttt{#1}\index{#1=\texttt{#1}|main}}
+
+\RecordChanges
+\PageIndex
+\CodelineNumbered
+
+
+\MakeShortVerb{"}
+
+\title{German Module for the \sty{datetime2} Package \\ {\large\url{https://gitlab.com/SFr682k/datetime2-german}}}
+\author{%
+ \begin{tabularx}{.8\textwidth}{*{2}{>{\centering\arraybackslash}X}}
+ Nicola L. C. Talbot & Sebastian Friedl \\
+ (inactive) & {\normalsize\href{mailto:sfr682k@t-online.de}{\texttt{sfr682k@t-online.de}}} \\
+ \end{tabularx}%
+}
+\date{2019/12/13 (v3.0)}
+
+\hypersetup{pdftitle={datetime2.sty German Module}, pdfauthor={Nicola L.C. Talbot, Sebastian Friedl}}
+
+
+\begin{document}
+ \maketitle
+
+
+ \begin{abstract}
+ This is the German language module for the \sty{datetime2} package. It defines a regionless style as well as variant styles ("de-DE", "de-AT" and "de-CH").
+
+ If you want to use the settings in this module you must install it in addition to installing \sty{datetime2}.
+ If you use \sty{babel} or \sty{polyglossia}, you will need this module to prevent them from redefining \cs{today}.
+
+ The \sty{datetime2} \opt{useregional} setting must be set to "text" or "numeric" for the language styles to be set.
+ Alternatively, you can set the style in the document using \cs{DTMsetstyle}, but this may be changed by \cs{date}\meta{language} depending on the value of the \opt{useregional} setting.
+ \end{abstract}
+
+
+
+
+ \clearpage
+ \tableofcontents
+ \clearpage
+
+
+
+ \subsection*{Installation}
+ \addcontentsline{toc}{subsection}{Installation}
+ Extract the language definition files first:
+ \begin{enumerate}
+ \item Run \LaTeX\ over the file "datetime2-german.ins": \\
+ "latex datetime2-german.ins"
+
+ \item Move all "*.ldf" files to "TEXMF/tex/latex/datetime2-contrib/datetime2-german/"
+ \end{enumerate}
+ Then, you can compile the documentation yourself by executing \\[\smallskipamount]
+ "lualatex datetime2-german-doc.dtx" \\
+ "makeindex -s gind.ist datetime2-german-doc.idx" \\
+ "makeindex -s gglo.ist -o datetime2-german-doc.gls datetime2-german-doc.glo" \\
+ "lualatex datetime2-german-doc.dtx" \\
+ "lualatex datetime2-german-doc.dtx" \\[\medskipamount]
+ or just use the precompiled documentation shipped with the source files. \\
+ In both cases, copy the files "datetime2-german-doc.pdf" and "README.md" to \\
+ "TEXMF/doc/latex/datetime2-contrib/datetime2-german/"
+
+
+ \subsection*{License}
+ \addcontentsline{toc}{subsection}{License}
+ This material is subject to the \LaTeX\ Project Public License, Version 1.3c or later. \\
+ Details may be found in the respective language definition file's copyright header.
+
+
+ \subsection*{Acknowledgments}
+ \addcontentsline{toc}{subsection}{Acknowledgments}
+ Thanks to \dots
+ \begin{itemize}
+ \item Jürgen Spitzmüller for his valuable advice while preparing version 2.0 of this module.
+
+ \item Bernhard Waldbrunner for his merge request, which resulted in the adoption of the DD.MM.YYYY numeric date format with the Austrian numeric style in version 3.0.
+ Previous versions used the ISO format (YYYY-MM-DD) as recommended by ÖNORM~1080, which was withdrawn in May~2018.
+ \end{itemize}
+
+
+
+ \clearpage
+ \part{The Documentation}
+ \section{Usage}
+
+
+ \subsection{Setting up \sty{datetime2} with a language module}
+ \textit{There are several methods of loading a language module. \\ Please refer to \sty{datetime2}'s documentation for details.}
+
+ \bigskip
+ \textbf{Variant 1:} \\
+ Set the date style explicitly by passing "german", "de-DE", "de-AT" or "de-CH" to \sty{datetime2}: \\[\smallskipamount]
+ "\documentclass{article}" \\
+ "\usepackage[german]{datetime2}" \\
+ "\begin{document}" \\
+ "\today" \\
+ "\end{document}"
+
+ \medskip
+ \textbf{Variant 2: Pick up the desired style from \sty{babel} or document class options)} \\
+ Pass the language (e.g. "german", "ngerman", "austrian", "naustrian", \dots) as an option to the \cs{documentclass} command (or \sty{babel} itself). As soon as the \opt{useregional} option is passed to \sty{datetime2}, the suitable language module is loaded: \\[\smallskipamount]
+ "\documentclass[german]{article}" \\
+ "\usepackage{babel}" \\
+ "\usepackage[useregional]{datetime2}" \\
+ "\begin{document}" \\
+ "\today" \\
+ "\end{document}"
+
+
+
+
+
+ \subsection{Customization}
+ There are a number of settings provided that can be used in \cs{DTMlangsetup} to modify the date-time style. These are:
+ \begin{description}
+ \item["dowdaysep"]%
+ The separator between the day of week name and the day of month number.
+
+ \item["daymonthsep"]%
+ The separator between the day and the month name.
+
+ \item["monthyearsep"]%
+ The separator between the month name and year.
+
+ \item["datesep"]%
+ The separator between the date numbers in the "numeric" styles.
+
+ \item["timesep"]%
+ The separator between hours, minutes and seconds.
+
+ \item["datetimesep"]%
+ The separator between the date and time for the full date-time format.
+
+ \item["timezonesep"]%
+ The separator between the time and zone for the full date-time format.
+
+ \item["abbr"]%
+ This is a boolean key. If "true", the month (and weekday name, if shown) is abbreviated.
+
+ \item["mapzone"]%
+ This is a boolean key. If "true", the time zone mappings are applied.
+
+ \item["showdayofmonth"]%
+ A boolean key that determines whether or not to show the day of the month.
+
+ \item["showyear"]%
+ A boolean key that determines whether or not to show the year.
+ \end{description}
+
+ Although these keys are \textit{defined} for all variant styles, it depends on \sty{datetime2}'s configuration and the requested styles whether they're \textit{used}. More details about the \cs{DTMlangsetup} command can be found in \sty{datetime2}'s documentation.
+
+
+
+
+ % TODO: check styles
+ \section{The Modules}
+ \subsection{Regionless style (\texttt{german})}
+ \begin{tabularx}{\textwidth}{>{\itshape}rX}
+ \toprule
+ \upshape\textbf{Textual style} & 13. Dezember 2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13. Dezember 2019, 12:42:00 MEZ \\
+ abbr. & 13. Dez. 2019, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13. Dez. 2019, 12:42:00 MEZ \\ \midrule
+ \upshape\textbf{Numeric style} & 13.12.2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13.12.2019, 12:42:00 MEZ \\
+ abbr. & 13.12.19, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13.12.19, 12:42:00 MEZ \\ \bottomrule
+ \end{tabularx}
+
+
+ \subsection{German style (\texttt{de-DE})}
+ \begin{tabularx}{\textwidth}{>{\itshape}rX}
+ \toprule
+ \upshape\textbf{Textual style} & 13. Dezember 2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13. Dezember 2019, 12:42:00 MEZ \\
+ abbr. & 13. Dez. 2019, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13. Dez. 2019, 12:42:00 MEZ \\ \midrule
+ \upshape\textbf{Numeric style} & 13.12.2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13.12.2019, 12:42:00 MEZ \\
+ abbr. & 13.12.19, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13.12.19, 12:42:00 MEZ \\ \bottomrule
+ \end{tabularx}
+
+
+ \subsection{Austrian style (\texttt{de-AT})}
+ \begin{tabularx}{\textwidth}{>{\itshape}rX}
+ \toprule
+ \upshape\textbf{Textual style} & 13. Dezember 2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13. Dezember 2019, 12:42:00 MEZ \\
+ abbr. & 13. Dez. 2019, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13. Dez. 2019, 12:42:00 MEZ \\ \midrule
+ \upshape\textbf{Numeric style} & 13.12.2019, 12:42:00 MEZ \\
+ with \opt{showdow} option & Freitag, 13.12.2019, 12:42:00 MEZ \\
+ abbr. & 13.12.19, 12:42:00 MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13.12.19, 12:42:00 MEZ \\ \bottomrule
+ \end{tabularx}
+
+
+ \subsection{Swiss style (\texttt{de-CH})}
+ \begin{tabularx}{\textwidth}{>{\itshape}rX}
+ \toprule
+ \upshape\textbf{Textual style} & 13. Dezember 2019, 12.42.00 Uhr MEZ \\
+ with \opt{showdow} option & Freitag, 13. Dezember 2019, 12.42.00 Uhr MEZ \\
+ abbr. & 13. Dez. 2019, 12.42.00 Uhr MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13. Dez. 2019, 12.42.00 Uhr MEZ \\ \midrule
+ \upshape\textbf{Numeric style} & 13.12.2019, 12.42.00 Uhr MEZ \\
+ with \opt{showdow} option & Freitag, 13.12.2019, 12.42.00 Uhr MEZ \\
+ abbr. & 13.12.19, 12.42.00 Uhr MEZ \\
+ abbr., with \opt{showdow} option & Fr, 13.12.19, 12.42.00 Uhr MEZ \\ \bottomrule
+ \end{tabularx}
+
+
+
+
+
+ \StopEventually{%
+ \clearpage
+ \phantomsection
+ \addcontentsline{toc}{section}{Change History}%
+ \PrintChanges%
+ \addcontentsline{toc}{section}{\indexname}%
+ \PrintIndex%
+ }
+
+
+
+
+
+ \clearpage
+ \part{The Code}
+ % TODO: Load code modules
+
+ \section{The Base Module}
+ The "german-base" module provides code common to all regional variations and engine-dependent code, e.\,g. commands printing weekday and month names.
+
+ \DocInput{datetime2-german-base.dtx}
+ \DocInput{datetime2-german-base-ascii.dtx}
+ \DocInput{datetime2-german-base-utf8.dtx}
+
+
+ \section{Regionless Style: \texttt{datetime2-german.ldf}}
+ \DocInput{datetime2-german.dtx}
+
+ \section{Regional Variations}
+ \DocInput{datetime2-de-DE.dtx}
+ \DocInput{datetime2-de-AT.dtx}
+ \DocInput{datetime2-de-CH.dtx}
+
+ \Finale
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.pdf b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.pdf
new file mode 100644
index 0000000000..2f0c7a9b55
--- /dev/null
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german-doc.pdf
Binary files differ
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.dtx b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.dtx
index f992035f59..886cbb60c6 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.dtx
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.dtx
@@ -16,842 +16,35 @@
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
%</package>
-%\fi
-% \iffalse
+%
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2015 Nicola Talbot, all rights reserved.
-% Copyright (C) 2017 Sebastian Friedl, all rights reserved.
+% Copyright (C) 2017-19 Sebastian Friedl, all rights reserved.
% \fi
-% \iffalse
-%<*driver>
-\documentclass{ltxdoc}
-
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-
-\usepackage{alltt}
-\usepackage{csquotes}
-\usepackage{graphicx}
-\usepackage{hologo}
-\usepackage{multicol}
-\usepackage[bookmarks,
- hyperindex=false,
- pdfauthor={Nicola L.C. Talbot, Sebastian Friedl},
- pdftitle={datetime2.sty German Module}]{hyperref}
-\usepackage{verbatim}
-
-\usepackage[p,space]{erewhon}
-\usepackage{sourcesanspro}
-\usepackage{inconsolata}
-\usepackage[utopia,vvarbb]{newtxmath}
-
-\usepackage[left=4.50cm,right=2.75cm,top=3.25cm,bottom=2.75cm,nohead]{geometry}
-
-\parindent0pt
-
-\CheckSum{1085}
-
-\renewcommand*{\usage}[1]{\hyperpage{#1}}
-\renewcommand*{\main}[1]{\hyperpage{#1}}
-\IndexPrologue{\section*{\indexname}\markboth{\indexname}{\indexname}}
-\setcounter{IndexColumns}{2}
-
-\newcommand*{\sty}[1]{\textsf{#1}}
-\newcommand*{\opt}[1]{\texttt{#1}\index{#1=\texttt{#1}|main}}
-
-\RecordChanges
-\PageIndex
-\CodelineNumbered
-
-\begin{document}
-\DocInput{datetime2-german.dtx}
-\end{document}
-%</driver>
-%\fi
-%
-%\MakeShortVerb{"}
-%
-%\title{German Module for the \sty{datetime2} Package \\ {\large\url{https://github.com/SFr682k/datetime2-german}}}
-%\author{\begin{tabular}{cp{.05\textwidth}c} Nicola L. C. Talbot && Sebastian Friedl \\ (inactive) && {\normalsize\href{mailto:sfr682k@t-online.de}{\texttt{sfr682k@t-online.de}}} \end{tabular}}
-%\date{2017-11-13 (v2.1)}
-%\maketitle
-%
-%
-%\begin{abstract}
-% This is the German language module for the \sty{datetime2}
-% package. If you want to use the settings in this module you must
-% install it in addition to installing \sty{datetime2}. If you use
-% \sty{babel} or \sty{polyglossia}, you will need this module to
-% prevent them from redefining \cs{today}. The \sty{datetime2}
-% \opt{useregional} setting must be set to "text" or "numeric"
-% for the language styles to be set.
-% Alternatively, you can set the style in the document using
-% \cs{DTMsetstyle}, but this may be changed by \cs{date}\meta{language}
-% depending on the value of the \opt{useregional} setting.
-%\end{abstract}
-%
-%
-%
-% Currently there is a regionless style as well as variant styles ("de-DE", "de-AT" and "de-CH"). \\[\smallskipamount]
-% I'm only capable of German standard German. If I messed up anything in regards to format and/or spelling, or even a variant style with differences to the existing ones is missing, please create a feature request on GitHub or send me an e--mail. \\
-% I would be very grateful, if some examples and/or a list of the weekdays' and months' spelling is/are also provided.
-%
-% \bigskip
-% Thanks to Jürgen Spitzmüller for his valuable advice while developing Version 2.0 of this module.
-%
-%
-% \clearpage
-% \tableofcontents
-% \clearpage
%
%
%
-% \section{Installation}
-% Extract the language definition files first:
-% \begin{enumerate}
-% \item
-% Run \LaTeX\ over the file \texttt{datetime2-german.ins}: \\
-% \verb|latex datetime2-german.ins|
-% %
-% \item
-% Move all \texttt{*.ldf} files to \texttt{TEXMF/tex/latex/datetime2-contrib/datetime2-german/}
-% \end{enumerate}
-% Then, you can compile the documentation yourself by executing \\[\smallskipamount]
-%\verb|pdflatex datetime2-german.dtx| \\
-%\verb|makeindex -s gind.ist datetime2-german.idx| \\
-%\verb|makeindex -s gglo.ist -o datetime2-german.gls datetime2-german.glo| \\
-%\verb|pdflatex datetime2-german.dtx| \\
-%\verb|pdflatex datetime2-german.dtx| \\[\medskipamount]
-% or just use the precompiled documentation shipped with the sorce files. \\
-% In both cases, copy the files \texttt{datetime2-german.pdf} and \texttt{README.md} to \\
-% \texttt{TEXMF/doc/latex/datetime2-contrib/datetime2-german/}
+% \changes{1.0}{2015-03-27}{Initial release}
+% \changes{3.0}{2019-12-13}{Load regionless style only when no regional variant is stated}
%
-%
-%
-% \clearpage
-% \part{The Documentation}
-% \section{Setting up \sty{datetime2} with a language module}
-% \subsection{Loading a language module}
-% \textit{There are three different ways to load the required language module. See the \sty{datetime2} documentation for further details}
+% This file contains the style used when German is requested without a known region.
%
% \medskip
-%
-% \textbf{Variant 1:} \\
-% Request the desired language module explicitly by passing the "german", "de-DE", "de-AT" or "de-CH" option to the \sty{datetime2} package: \\[\smallskipamount]
-%\verb|\documentclass{article}| \\
-%\verb|\usepackage[german]{datetime2}| \\
-%\verb|\begin{document}| \\
-%\verb|\today| \\
-%\verb|\end{document}| \\[\medskipamount]
-%
-% \textbf{Variant 2:} \\
-% Load \sty{babel} and pass the "german", "austrian" or "swissgerman" option to the \verb|\documentclass| command (or to \sty{babel} directly). If you now pass the \opt{useregional} option to \sty{datetime2}, the language module suitable to the one specified with \sty{babel} is loaded: \\[\smallskipamount]
-%\verb|\documentclass[german]{article}| \\
-%\verb|\usepackage{babel}| \\
-%\verb|\usepackage[useregional]{datetime2}| \\
-%\verb|\begin{document}| \\
-%\verb|\today| \\
-%\verb|\end{document}| \\[\medskipamount]
-%
-% \textbf{Variant 3:} \\
-% When using \sty{polyglossia}, you should request the desired language module by passing the "german", "de-DE", "de-AT" or "de-CH" option to the \sty{datetime2} package: \\[\smallskipamount]
-%\verb|\documentclass{article}| \\
-%\verb|\usepackage{polyglossia}| \\
-%\verb|\setmainlanguage{german}| \\
-%\verb|\usepackage[german]{datetime2}| \\
-%\verb|\begin{document}| \\
-%\verb|\today| \\
-%\verb|\end{document}|
-%
-%
-% \subsection{Other features}
-% \subsubsection{Showing the weekday}
-% All language modules shipped with \sty{datetime2-german} support showing the weekday. \\
-% To enable this feature, pass the \opt{showdow} option to the \sty{datetime2} package. \\
-% Please note, that this has no effect when using the "numeric" style of the "de-AT" variant.
-%
-% \subsubsection{Using abbreviated weekday and month names}
-% To enable abbreviated weekday and month names, use \verb|\DTMlangsetup[german]{abbr}|. \\
-% To disable them, use \verb|\DTMlangsetup[german]{abbr=false}|.
-%
-% \medskip
-% In both cases, replace "german" with the used variant style ("de-DE", "de-AT" or "de-CH"). \\
-% Please note, that this has no effect when using the "numeric" style of the "de-AT" variant.
-%
-%
-% \section{Style examples}
-% \subsection{Regionless style}
-% \begin{itemize}
-% \item Non--numeric style: \\
-% 3. Oktober 2017, 12:51:04 MESZ \\
-% 3. Okt. '17, 12:51:04 MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 3. Oktober 2017, 12:51:04 MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 3. Okt. '17, 12:51:04 MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% %
-% \item Numeric style: \\
-% 03.10.2017, 12:51:04 MESZ \\
-% 03.10.17, 12:51:04 MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 03.10.2017, 12:51:04 MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 03.10.17, 12:51:04 MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% \end{itemize}
-%
-%
-% \subsection{German style (\texttt{de-DE})}
-% \begin{itemize}
-% \item Non--numeric style: \\
-% 3. Oktober 2017, 12:51:04 MESZ \\
-% 3. Okt. '17, 12:51:04 MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 3. Oktober 2017, 12:51:04 MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 3. Okt. '17, 12:51:04 MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% %
-% \item Numeric style: \\
-% 03.10.2017, 12:51:04 MESZ \\
-% 03.10.17, 12:51:04 MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 03.10.2017, 12:51:04 MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 03.10.17, 12:51:04 MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% \end{itemize}
-%
-%
-% \subsection{Austrian style (\texttt{de-AT})}
-% \begin{itemize}
-% \item Non--numeric style: \\
-% 3. Oktober 2017, 12:51:04 MESZ \\
-% 3. Okt. 2017, 12:51:04 MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 3. Oktober 2017, 12:51:04 MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 3. Okt. 2017, 12:51:04 MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% %
-% \item Numeric style: \\
-% 2017-10-03, 12:51:04 MESZ
-% \end{itemize}
-%
-%
-% \subsection{Swiss style (\texttt{de-CH})}
-% \begin{itemize}
-% \item Non--numeric style: \\
-% 3. Oktober 2017, 12.51.04 Uhr MESZ \\
-% 3. Okt. 2017, 12.51.04 Uhr MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 3. Oktober 2017, 12.51.04 Uhr MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 3. Okt. 2017, 12.51.04 Uhr MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% %
-% \item Numeric style: \\
-% 03.10.2017, 12.51.04 Uhr MESZ \\
-% 03.10.17, 12.51.04 Uhr MESZ \hfill \textit{abbreviated version} \\
-% Dienstag, 03.10.2017, 12.51.04 Uhr MESZ \hfill \textit{with \opt{showdow} option} \\
-% Di, 03.10.17, 12.51.04 Uhr MESZ \hfill \textit{abbreviated version with \opt{showdow} option}
-% \end{itemize}
-%
-%
-%
-% \section{Further customization of styles}
-% There are a number of settings provided that can be used in \verb|\DTMlangsetup| to modify the date-time style. These are:
-% \begin{description}
-% \item["dowdaysep"]%
-% The separator between the day of week name and the day of month number.
-%
-% \item["daymonthsep"]%
-% The separator between the day and the month name
-%
-% \item["monthyearsep"]%
-% The separator between the month name and year
-%
-% \item["datesep"]%
-% The separator between the date numbers in the "numeric style"s
-%
-% \item["timesep"]%
-% The separator between hours, minutes and seconds
-%
-% \item["datetimesep"]%
-% The separator between the date and time for the full date-time format
-%
-% \item["timezonesep"]%
-% The separator between the time and zone for the full date-time format
-%
-% \item["abbr"]%
-% This is a boolean key. If "true", the month (and weekday name, if shown) is abbreviated.
-%
-% \item["mapzone"]%
-% This is a boolean key. If "true", the time zone mappings are applied.
-%
-% \item["showdayofmonth"]%
-% A boolean key that determines whether or not to show the day of the month
-%
-% \item["showyear"]%
-% A boolean key that determines whether or not to show the year
-%\end{description}
-%
-%
-% Although the keys listed here are \textit{defined} for all variant styles, it depends on \sty{datetime2}'s setup and the requested styles whether they're \textit{used}. \\
-% For more information about the \verb|\DTMlangsetup| command see the documentation of the main \sty{datetime2} package.
-%
-%
-% \section{License}
-% This material is subject to the \LaTeX\ Project Public License, Version 1.3c or later. \\
-% See the copyright headers of the single files for further details.
-%
-%
-%
-%\StopEventually{%
-%\clearpage
-%\phantomsection
-%\addcontentsline{toc}{section}{Change History}%
-%\PrintChanges
-%\addcontentsline{toc}{section}{\indexname}%
-%\PrintIndex}
-%\clearpage
-%\part{The Code}
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-german-utf8.ldf>
-% \end{macrocode}
-%\fi
-%\section{Basic German module}
-% This module defines the \enquote{basic} German style, which contains the necessary vocab for all German localizations. \\
-% The date and time format is based on the "de-DE" variant.
-%
-%\subsection{Weekday and month names (UTF-8)}
-%This file contains the settings that use UTF-8 characters. This
-%file is loaded if \hologo{XeLaTeX} or \hologo{LuaLaTeX} are used. Please make sure
-%your text editor is set to UTF-8 if you want to view this code.
-%\changes{1.0}{2015-03-27}{Initial release}
-%
-% Identify module
-% \begin{macrocode}
-\ProvidesDateTimeModule{german-utf8}[2017/11/13 v2.1]
-% \end{macrocode}
-%\begin{macro}{\DTMgermanordinal}
-% \begin{macrocode}
-\newcommand*{\DTMgermanordinal}[1]{%
- \number#1
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanmonthname}
-% German month names.
-% \begin{macrocode}
-\newcommand*{\DTMgermanmonthname}[1]{%
- \ifcase#1
- \or
- Januar%
- \or
- Februar%
- \or
- März%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- August%
- \or
- September%
- \or
- Oktober%
- \or
- November%
- \or
- Dezember%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATmonthname}
-%\changes{2.0}{2017-10-03}{Austrian month names implemented}
-% Austrian German month names. Spot the difference :D
-% \begin{macrocode}
-\newcommand*{\DTMdeATmonthname}[1]{%
- \ifcase#1
- \or
- Jänner%
- \or
- Februar%
- \or
- März%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- August%
- \or
- September%
- \or
- Oktober%
- \or
- November%
- \or
- Dezember%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanshortmonthname}
-% Abbreviated German month names.
-%\changes{1.2}{2017-09-10}{Short month names implemented}
-%\changes{2.0}{2017-10-03}{Short month names fixed}
-% \begin{macrocode}
-\newcommand*{\DTMgermanshortmonthname}[1]{%
- \ifcase#1
- \or
- Jan.%
- \or
- Feb.%
- \or
- März%
- \or
- Apr.%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATshortmonthname}
-%\changes{2.0}{2017-10-03}{Austrian short month names implemented}
-% Abbreviated Austrian German month names.
-% \begin{macrocode}
-\newcommand*{\DTMdeATshortmonthname}[1]{%
- \ifcase#1
- \or
- Jän.%
- \or
- Feb.%
- \or
- März%
- \or
- Apr.%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHshortmonthname}
-% Abbreviated Swiss German month names.
-%\changes{2.0}{2017-10-03}{Swiss German short month names implemented}
-% \begin{macrocode}
-\newcommand*{\DTMdeCHshortmonthname}[1]{%
- \ifcase#1
- \or
- Jan.%
- \or
- Febr.%
- \or
- März%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanweekdayname}
-% Provides weekday names
-% \begin{macrocode}
-\newcommand*{\DTMgermanweekdayname}[1]{%
- \ifcase#1
- Montag%
- \or
- Dienstag%
- \or
- Mittwoch%
- \or
- Donnerstag%
- \or
- Freitag%
- \or
- Samstag%
- \or
- Sonntag%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanshortweekdayname}
-%Provides abbreviated weekday names
-%\changes{1.2}{2017-09-10}{Short weekday names implemented}
-%\changes{2.0}{2017-10-03}{Short weekday names fixed}
-% \begin{macrocode}
-\newcommand*{\DTMgermanshortweekdayname}[1]{%
- \ifcase#1
- Mo%
- \or
- Di%
- \or
- Mi%
- \or
- Do%
- \or
- Fr%
- \or
- Sa%
- \or
- So%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\iffalse
-% \begin{macrocode}
-%</datetime2-german-utf8.ldf>
-% \end{macrocode}
-%\fi
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-german-ascii.ldf>
-% \end{macrocode}
-%\fi
-%\subsection{Weekday and month names (ASCII)}
-%This file contains the settings that use \LaTeX\ commands for
-%non-ASCII characters. This should be input if neither \hologo{XeLaTeX} nor
-%\hologo{LuaLaTeX} are used. Even if the user has loaded \sty{inputenc} with
-%"utf8", this file should still be used not the
-%\texttt{datetime2-german-utf8.ldf} file as the non-ASCII
-%characters are made active in that situation and would need
-%protecting against expansion.
-%\changes{1.0}{2015-03-27}{Initial release}
-%
-% Identify module
-% \begin{macrocode}
-\ProvidesDateTimeModule{german-ascii}[2017/11/13 v2.1]
-% \end{macrocode}
-%
-%\begin{macro}{\DTMgermanordinal}
-% \begin{macrocode}
-\newcommand*{\DTMgermanordinal}[1]{%
- \number#1
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanmonthname}
-% German month names.
-% \begin{macrocode}
-\newcommand*{\DTMgermanmonthname}[1]{%
- \ifcase#1
- \or
- Januar%
- \or
- Februar%
- \or
- M\protect\"arz%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- August%
- \or
- September%
- \or
- Oktober%
- \or
- November%
- \or
- Dezember%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATmonthname}
-%\changes{2.0}{2017-10-03}{Austrian month names implemented}
-% Austrian German month names.
-% \begin{macrocode}
-\newcommand*{\DTMdeATmonthname}[1]{%
- \ifcase#1
- \or
- J\protect\"anner%
- \or
- Februar%
- \or
- M\protect\"arz%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- August%
- \or
- September%
- \or
- Oktober%
- \or
- November%
- \or
- Dezember%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanshortmonthname}
-% Abbreviated German month names.
-%\changes{1.2}{2017-09-10}{Short month names implemented}
-%\changes{2.0}{2017-10-03}{Short month names fixed}
-% \begin{macrocode}
-\newcommand*{\DTMgermanshortmonthname}[1]{%
- \ifcase#1
- \or
- Jan.%
- \or
- Feb.%
- \or
- M\protect\"arz%
- \or
- Apr.%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATshortmonthname}
-%\changes{2.0}{2017-10-03}{Austrian short month names implemented}
-% Abbreviated Austrian German month names.
-% \begin{macrocode}
-\newcommand*{\DTMdeATshortmonthname}[1]{%
- \ifcase#1
- \or
- J\protect\"an.%
- \or
- Feb.%
- \or
- M\protect\"arz%
- \or
- Apr.%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHshortmonthname}
-% Abbreviated Swiss German month names.
-%\changes{2.0}{2017-10-03}{Swiss German short month names implemented}
-% \begin{macrocode}
-\newcommand*{\DTMdeCHshortmonthname}[1]{%
- \ifcase#1
- \or
- Jan.%
- \or
- Febr.%
- \or
- M\protect\"arz%
- \or
- April%
- \or
- Mai%
- \or
- Juni%
- \or
- Juli%
- \or
- Aug.%
- \or
- Sept.%
- \or
- Okt.%
- \or
- Nov.%
- \or
- Dez.%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanweekdayname}
-%Provides weekday names
-% \begin{macrocode}
-\newcommand*{\DTMgermanweekdayname}[1]{%
- \ifcase#1
- Montag%
- \or
- Dienstag%
- \or
- Mittwoch%
- \or
- Donnerstag%
- \or
- Freitag%
- \or
- Samstag%
- \or
- Sonntag%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMgermanshortweekdayname}
-%Provides abbreviated weekday names
-%\changes{1.2}{2017-09-10}{Short weekday names implemented}
-%\changes{2.0}{2017-10-03}{Short weekday names fixed}
-% \begin{macrocode}
-\newcommand*{\DTMgermanshortweekdayname}[1]{%
- \ifcase#1
- Mo%
- \or
- Di%
- \or
- Mi%
- \or
- Do%
- \or
- Fr%
- \or
- Sa%
- \or
- So%
- \fi
-}
-% \end{macrocode}
-%\end{macro}
-%
-%\iffalse
-% \begin{macrocode}
-%</datetime2-german-ascii.ldf>
-% \end{macrocode}
-%\fi
-%
-%\subsection{Basic German Module (\texttt{datetime2-german.ldf})}
-%\changes{1.0}{2015-03-27}{Initial release}
-%
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-german.ldf>
-% \end{macrocode}
-%\fi
-%
-% Identify Module
-% \begin{macrocode}
-\ProvidesDateTimeModule{german}[2017/11/13 v2.1]
-% \end{macrocode}
-% Need to find out if \hologo{XeTeX} or \hologo{LuaTeX} are being used.
+% Identify Module.
% \begin{macrocode}
-\RequirePackage{ifxetex,ifluatex}
+\ProvidesDateTimeModule{german}[2019/12/13 v3.0]
% \end{macrocode}
-% \hologo{XeTeX} and \hologo{LuaTeX} natively support UTF-8, so load
-% \texttt{german-utf8} if either of those engines are used
-% otherwise load \texttt{german-ascii}.
+% Require the base German module
% \begin{macrocode}
-\ifxetex
- \RequireDateTimeModule{german-utf8}
-\else
- \ifluatex
- \RequireDateTimeModule{german-utf8}
- \else
- \RequireDateTimeModule{german-ascii}
- \fi
-\fi
+\RequireDateTimeModule{german-base}
% \end{macrocode}
%
-% Define the \texttt{german} style.
-%
-% Allow the user a way of configuring the "german" and
-% "german-numeric" styles. This doesn't use the package wide
-% separators such as
-% \cs{dtm@datetimesep} in case other date formats are also required.
+% Allow the user to configure the "german" and "german-numeric" styles.
+% The package wide separators such as \cs{dtm@datetimesep} are not used
+% in case other date formats are also required.
%
%\begin{macro}{\DTMgermandowdaysep}
-% The separator between weekday and day
+% The separator between weekday and day.
% \begin{macrocode}
\newcommand*{\DTMgermandowdaysep}{,\space}
% \end{macrocode}
@@ -901,8 +94,7 @@
% \end{macrocode}
%\end{macro}
%
-%Provide keys that can be used in \cs{DTMlangsetup} to set these
-%separators.
+% Provide keys that can be used in \cs{DTMlangsetup} to set these separators.
% \begin{macrocode}
\DTMdefkey{german}{dowdaysep}{\renewcommand*{\DTMgermandowdaysep}{#1}}
\DTMdefkey{german}{daymonthsep}{\renewcommand*{\DTMgermandaymonthsep}{#1}}
@@ -915,12 +107,12 @@
%
%
% Define a boolean key that can switch between full and abbreviated formats for
-% the month and day of week names in the text format.
+% the month and day of week names.
% \begin{macrocode}
\DTMdefboolkey{german}{abbr}[true]{}
% \end{macrocode}
%
-% The default is full name
+% The default is to show the full names.
% \begin{macrocode}
\DTMsetbool{german}{abbr}{false}
% \end{macrocode}
@@ -955,12 +147,12 @@
\DTMsetbool{german}{showyear}{true}
% \end{macrocode}
%
-% Define the "german" style.
-%\changes{1.1}{2017-03-09}{fixed bug in \cs{DTMDisplaydate}}
-%\changes{1.2}{2017-09-10}{Short month names implemented}
-%\changes{1.2}{2017-09-10}{Short weekday names implemented}
-%\changes{1.2}{2017-09-10}{Day of week implemented}
-%\changes{2.1}{2017-11-13}{Fixed strange spacing when switching languages}
+% Define the (regionless) "german" style.
+%\changes{1.1}{2017-03-09}{Fixed bug in \cs{DTMDisplaydate}}
+%\changes{1.2}{2017-09-10}{Implemented short month names}
+%\changes{1.2}{2017-09-10}{Implemented short weekday names}
+%\changes{1.2}{2017-09-10}{Implemented day of week}
+%\changes{2.1}{2017-11-13}{Fixed spurious space when switching languages}
% \begin{macrocode}
\DTMnewstyle
{german}% label
@@ -986,9 +178,7 @@
\DTMifbool{german}{showyear}%
{%
\DTMgermanmonthyearsep%
- \DTMifbool{german}{abbr}%
- {'\DTMtwodigits{##1}}%
- {\number##1 }% space intended
+ \number##1 % space intended
}%
{}%
}%
@@ -1013,9 +203,7 @@
\DTMifbool{german}{showyear}%
{%
\DTMgermanmonthyearsep%
- \DTMifbool{german}{abbr}%
- {'\DTMtwodigits{##1}}%
- {\number##1 }% space intended
+ \number##1 % space intended
}%
{}%
}%
@@ -1065,9 +253,9 @@
}%
% \end{macrocode}
%
-% Define numeric style.
-%\changes{1.2}{2017-09-10}{Day of week implemented}
-%\changes{2.0}{2017-10-03}{Bugfix: month-year-separator}
+% Define the corresponding numeric style.
+%\changes{1.2}{2017-09-10}{Implemented day of week}
+%\changes{2.0}{2017-10-03}{Fixed month-year-separator}
% \begin{macrocode}
\DTMnewstyle
{german-numeric}% label
@@ -1135,20 +323,7 @@
}
% \end{macrocode}
%
-%\begin{macro}{\DTMgermanzonemaps}
-% The time zone mappings are set through this command, which can be
-% redefined if extra mappings are required or mappings need to be
-% removed.
-%\changes{1.2}{2017-09-10}{German time zone names (ME[S]Z)}
-% \begin{macrocode}
-\newcommand*{\DTMgermanzonemaps}{%
- \DTMdefzonemap{01}{00}{MEZ}%
- \DTMdefzonemap{02}{00}{MESZ}%
-}
-% \end{macrocode}
-%\end{macro}
-
-% Switch style according to the \opt{useregional} setting.
+% Switch the style according to the \opt{useregional} setting.
% \begin{macrocode}
\DTMifcaseregional
{}% do nothing
@@ -1183,1060 +358,5 @@
}%
}%
% \end{macrocode}
-%\iffalse
-% \begin{macrocode}
-%</datetime2-german.ldf>
-% \end{macrocode}
-%\fi
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{German localization (\texttt{de-DE}, \texttt{datetime2-de-DE.ldf})}
-%\changes{2.0}{2017-10-03}{German localization added}
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-de-DE.ldf>
-% \end{macrocode}
-%\fi
-% Identify Module
-% \begin{macrocode}
-\ProvidesDateTimeModule{de-DE}[2017/11/13 v2.1]
-% \end{macrocode}
-% Require the basic German module
-% \begin{macrocode}
-\RequireDateTimeModule{german}
-% \end{macrocode}
-%
-%
-% Allow the user a way of configuring the "de-DE" and
-% "de-DE-numeric" styles. This doesn't use the package wide
-% separators such as
-% \cs{dtm@datetimesep} in case other date formats are also required.
-%
-%\begin{macro}{\DTMdeDEdowdaysep}
-% The separator between weekday and day
-% \begin{macrocode}
-\newcommand*{\DTMdeDEdowdaysep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEdaymonthsep}
-% The separator between the day and month for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeDEdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEmonthyearsep}
-% The separator between the month and year for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeDEmonthyearsep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEdatetimesep}
-% The separator between the date and time blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeDEdatetimesep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEtimezonesep}
-% The separator between the time and zone blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeDEtimezonesep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEdatesep}
-% The separator for the numeric date format.
-% \begin{macrocode}
-\newcommand*{\DTMdeDEdatesep}{.}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeDEtimesep}
-% The separator for the numeric time format.
-% \begin{macrocode}
-\newcommand*{\DTMdeDEtimesep}{:}
-% \end{macrocode}
-%\end{macro}
-%
-% Provide keys that can be used in \cs{DTMlangsetup} to set these
-% separators.
-% \begin{macrocode}
-\DTMdefkey{de-DE}{dowdaysep}{\renewcommand*{\DTMdeDEdowdaysep}{#1}}
-\DTMdefkey{de-DE}{daymonthsep}{\renewcommand*{\DTMdeDEdaymonthsep}{#1}}
-\DTMdefkey{de-DE}{monthyearsep}{\renewcommand*{\DTMdeDEmonthyearsep}{#1}}
-\DTMdefkey{de-DE}{datetimesep}{\renewcommand*{\DTMdeDEdatetimesep}{#1}}
-\DTMdefkey{de-DE}{timezonesep}{\renewcommand*{\DTMdeDEtimezonesep}{#1}}
-\DTMdefkey{de-DE}{datesep}{\renewcommand*{\DTMdeDEdatesep}{#1}}
-\DTMdefkey{de-DE}{timesep}{\renewcommand*{\DTMdeDEtimesep}{#1}}
-% \end{macrocode}
-%
-%
-% Define a boolean key that can switch between full and abbreviated formats for
-% the month and day of week names in the text format.
-% \begin{macrocode}
-\DTMdefboolkey{de-DE}{abbr}[true]{}
-% \end{macrocode}
-%
-% The default is full name
-% \begin{macrocode}
-\DTMsetbool{de-DE}{abbr}{false}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the time zone mappings
-% should be used.
-% \begin{macrocode}
-\DTMdefboolkey{de-DE}{mapzone}[true]{}
-% \end{macrocode}
-% The default is to use mappings.
-% \begin{macrocode}
-\DTMsetbool{de-DE}{mapzone}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the day of month should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-DE}{showdayofmonth}[true]{}
-% \end{macrocode}
-% The default is to show the day of month.
-% \begin{macrocode}
-\DTMsetbool{de-DE}{showdayofmonth}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the year should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-DE}{showyear}[true]{}
-% \end{macrocode}
-% The default is to show the year.
-% \begin{macrocode}
-\DTMsetbool{de-DE}{showyear}{true}
-% \end{macrocode}
-%
-%
-% Define the "de-DE" style
-% \begin{macrocode}
-\DTMnewstyle
-{de-DE}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-DE}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeDEdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-DE}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeDEdaymonthsep}%
- {}%
- %
- \DTMifbool{de-DE}{abbr}%
- {\DTMgermanshortmonthname{##2}}%
- {\DTMgermanmonthname{##2}}%
- %
- \DTMifbool{de-DE}{showyear}%
- {%
- \DTMdeDEmonthyearsep%
- \DTMifbool{de-DE}{abbr}%
- {'\DTMtwodigits{##1}}%
- {\number##1 }% space intended
- }%
- {}%
- }%
- \renewcommand*\DTMDisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-DE}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeDEdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-DE}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeDEdaymonthsep}%
- {}%
- %
- \DTMifbool{de-DE}{abbr}%
- {\DTMgermanshortmonthname{##2}}%
- {\DTMgermanmonthname{##2}}%
- %
- \DTMifbool{de-DE}{showyear}%
- {%
- \DTMdeDEmonthyearsep%
- \DTMifbool{de-DE}{abbr}%
- {'\DTMtwodigits{##1}}%
- {\number##1 }% space intended
- }%
- {}%
- }
-}%
-{% time style (use default)
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeDEtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeDEtimesep\DTMtwodigits{##3}\fi
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-DE}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMdeDEtimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeDEdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeDEtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}[9]{%
- \ifDTMshowdate
- \DTMDisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeDEdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeDEtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
-}%
-% \end{macrocode}
-%
-% Define numeric style.
-% \begin{macrocode}
-\DTMnewstyle
-{de-DE-numeric}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-DE}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeDEdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-DE}{showdayofmonth}%
- {%
- \DTMtwodigits{##3}%
- \DTMdeDEdatesep
- }%
- {}%
- \DTMtwodigits{##2}%
- \DTMdeDEdatesep%
- \DTMifbool{de-DE}{showyear}%
- {%
- \DTMifbool{de-DE}{abbr}%
- {\DTMtwodigits{##1}}%
- {\number##1 }% space intended
- }%
- {}%
- }%
- \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
-}%
-{% time style
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeDEtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeDEtimesep\DTMtwodigits{##3}\fi
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-DE}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeDEdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeDEtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}{\DTMdisplay}%
-}
-% \end{macrocode}
-%
-% Switch style according to the \opt{useregional} setting.
-% \begin{macrocode}
-\DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{de-DE}}
- {\DTMsetstyle{de-DE-numeric}}
-% \end{macrocode}
-%
-% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
-% \sty{babel} from resetting \cs{today}. (For this to work,
-% \sty{babel} must already have been loaded if it's required.)
-% \begin{macrocode}
-\ifcsundef{date\CurrentTrackedDialect}
-{%
- \ifundef\dategerman
- {% do nothing
- }%
- {%
- \def\dategerman{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{german}}%
- {\DTMsetstyle{german-numeric}}%
- }%
- }%
-}%
-{%
- \csdef{date\CurrentTrackedDialect}{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{de-DE}}%
- {\DTMsetstyle{de-DE-numeric}}
- }%
-}%
-% \end{macrocode}
-%
-%\iffalse
-% \begin{macrocode}
-%</datetime2-de-DE.ldf>
-% \end{macrocode}
-%\fi
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Austrian German localization (\texttt{de-AT}, \texttt{datetime2-de-AT.ldf})}
-%\changes{2.0}{2017-10-03}{Austrian German localization added}
-%
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-de-AT.ldf>
-% \end{macrocode}
-%\fi
-% Identify Module
-% \begin{macrocode}
-\ProvidesDateTimeModule{de-AT}[2017/11/13 v2.1]
-% \end{macrocode}
-% Require the basic German module
-% \begin{macrocode}
-\RequireDateTimeModule{german}
-% \end{macrocode}
-%
-%
-% Allow the user a way of configuring the "de-AT" and
-% "de-AT-numeric" styles. This doesn't use the package wide
-% separators such as
-% \cs{dtm@datetimesep} in case other date formats are also required.
-%
-%\begin{macro}{\DTMdeATdowdaysep}
-% The separator between weekday and day
-% \begin{macrocode}
-\newcommand*{\DTMdeATdowdaysep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATdaymonthsep}
-% The separator between the day and month for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeATdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATmonthyearsep}
-% The separator between the month and year for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeATmonthyearsep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATdatetimesep}
-% The separator between the date and time blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeATdatetimesep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATtimezonesep}
-% The separator between the time and zone blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeATtimezonesep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATdatesep}
-% The separator for the numeric date format.
-% \begin{macrocode}
-\newcommand*{\DTMdeATdatesep}{-}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeATtimesep}
-% The separator for the numeric time format.
-% \begin{macrocode}
-\newcommand*{\DTMdeATtimesep}{:}
-% \end{macrocode}
-%\end{macro}
-%
-% Provide keys that can be used in \cs{DTMlangsetup} to set these
-% separators.
-% \begin{macrocode}
-\DTMdefkey{de-AT}{dowdaysep}{\renewcommand*{\DTMdeATdowdaysep}{#1}}
-\DTMdefkey{de-AT}{daymonthsep}{\renewcommand*{\DTMdeATdaymonthsep}{#1}}
-\DTMdefkey{de-AT}{monthyearsep}{\renewcommand*{\DTMdeATmonthyearsep}{#1}}
-\DTMdefkey{de-AT}{datetimesep}{\renewcommand*{\DTMdeATdatetimesep}{#1}}
-\DTMdefkey{de-AT}{timezonesep}{\renewcommand*{\DTMdeATtimezonesep}{#1}}
-\DTMdefkey{de-AT}{datesep}{\renewcommand*{\DTMdeATdatesep}{#1}}
-\DTMdefkey{de-AT}{timesep}{\renewcommand*{\DTMdeATtimesep}{#1}}
-% \end{macrocode}
-%
-%
-% Define a boolean key that can switch between full and abbreviated formats for
-% the month and day of week names in the text format.
-% \begin{macrocode}
-\DTMdefboolkey{de-AT}{abbr}[true]{}
-% \end{macrocode}
-%
-% The default is full name
-% \begin{macrocode}
-\DTMsetbool{de-AT}{abbr}{false}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the time zone mappings
-% should be used.
-% \begin{macrocode}
-\DTMdefboolkey{de-AT}{mapzone}[true]{}
-% \end{macrocode}
-% The default is to use mappings.
-% \begin{macrocode}
-\DTMsetbool{de-AT}{mapzone}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the day of month should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-AT}{showdayofmonth}[true]{}
-% \end{macrocode}
-% The default is to show the day of month.
-% \begin{macrocode}
-\DTMsetbool{de-AT}{showdayofmonth}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the year should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-AT}{showyear}[true]{}
-% \end{macrocode}
-% The default is to show the year.
-% \begin{macrocode}
-\DTMsetbool{de-AT}{showyear}{true}
-% \end{macrocode}
-%
-%
-% Define the "de-AT" style
-% \begin{macrocode}
-\DTMnewstyle
-{de-AT}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-AT}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeATdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-AT}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeATdaymonthsep}%
- {}%
- %
- \DTMifbool{de-AT}{abbr}%
- {\DTMdeATshortmonthname{##2}}%
- {\DTMdeATmonthname{##2}}%
- %
- \DTMifbool{de-AT}{showyear}%
- {%
- \DTMdeATmonthyearsep%
- \number##1 % space intended
- }%
- {}%
- }%
- \renewcommand*\DTMDisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-AT}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeATdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-AT}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeATdaymonthsep}%
- {}%
- %
- \DTMifbool{de-AT}{abbr}%
- {\DTMdeATshortmonthname{##2}}%
- {\DTMdeATmonthname{##2}}%
- %
- \DTMifbool{de-AT}{showyear}%
- {%
- \DTMdeATmonthyearsep%
- \number##1 % space intended
- }%
- {}%
- }%
-}%
-{% time style (use default)
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeATtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeATtimesep\DTMtwodigits{##3}\fi
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-AT}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMdeATtimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeATdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeATtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}[9]{%
- \ifDTMshowdate
- \DTMDisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeATdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeATtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
-}%
-% \end{macrocode}
-%
-% Define numeric style.
-% \begin{macrocode}
-\DTMnewstyle
-{de-AT-numeric}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \DTMifbool{de-AT}{showyear}%
- {%
- \number##1 % space intended
- \DTMdeATdatesep%
- }%
- {}%
- %
- \DTMtwodigits{##2}%
- %
- \DTMifbool{de-AT}{showdayofmonth}%
- {%
- \DTMdeATdatesep%
- \DTMtwodigits{##3}%
- }%
- {}%
- }%
- \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
-}%
-{% time style
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeATtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeATtimesep\DTMtwodigits{##3}\fi
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-AT}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeATdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeATtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}{\DTMdisplay}%
-}
-% \end{macrocode}
-%
-% Switch style according to the \opt{useregional} setting.
-% \begin{macrocode}
-\DTMifcaseregional
-{}% do nothing
-{\DTMsetstyle{de-AT}}%
-{\DTMsetstyle{de-AT-numeric}}%
-% \end{macrocode}
-%
-% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
-% \sty{babel} from resetting \cs{today}. (For this to work,
-% \sty{babel} must already have been loaded if it's required.)
-% \begin{macrocode}
-\ifcsundef{date\CurrentTrackedDialect}
-{%
- \ifundef\dategerman
- {% do nothing
- }%
- {%
- \def\dategerman{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{german}}%
- {\DTMsetstyle{german-numeric}}%
- }%
- }%
-}%
-{%
- \csdef{date\CurrentTrackedDialect}{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{de-AT}}%
- {\DTMsetstyle{de-AT-numeric}}%
- }%
-}%
-% \end{macrocode}
-%
-%\iffalse
-% \begin{macrocode}
-%</datetime2-de-AT.ldf>
-% \end{macrocode}
-%\fi
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Swiss German localization (\texttt{de-CH}, \texttt{datetime2-de-CH.ldf})}
-%\changes{2.0}{2017-10-03}{Swiss German localization added}
-%\iffalse
-% \begin{macrocode}
-%<*datetime2-de-CH.ldf>
-% \end{macrocode}
-%\fi
-% Identify Module
-% \begin{macrocode}
-\ProvidesDateTimeModule{de-CH}[2017/11/13 v2.1]
-% \end{macrocode}
-% Require the basic German module
-% \begin{macrocode}
-\RequireDateTimeModule{german}
-% \end{macrocode}
-%
-%
-% Allow the user a way of configuring the "de-CH" and
-% "de-CH-numeric" styles. This doesn't use the package wide
-% separators such as
-% \cs{dtm@datetimesep} in case other date formats are also required.
-%
-%\begin{macro}{\DTMdeCHdowdaysep}
-% The separator between weekday and day
-% \begin{macrocode}
-\newcommand*{\DTMdeCHdowdaysep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHdaymonthsep}
-% The separator between the day and month for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeCHdaymonthsep}{.\DTMtexorpdfstring{\protect~}{\space}}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHmonthyearsep}
-% The separator between the month and year for the text format.
-% \begin{macrocode}
-\newcommand*{\DTMdeCHmonthyearsep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHdatetimesep}
-% The separator between the date and time blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeCHdatetimesep}{,\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHtimezonesep}
-% The separator between the time and zone blocks in the full format
-% (either text or numeric).
-% \begin{macrocode}
-\newcommand*{\DTMdeCHtimezonesep}{\space}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHdatesep}
-% The separator for the numeric date format.
-% \begin{macrocode}
-\newcommand*{\DTMdeCHdatesep}{.}
-% \end{macrocode}
-%\end{macro}
-%
-%\begin{macro}{\DTMdeCHtimesep}
-% The separator for the numeric time format.
-% \begin{macrocode}
-\newcommand*{\DTMdeCHtimesep}{.}
-% \end{macrocode}
-%\end{macro}
-%
-% Provide keys that can be used in \cs{DTMlangsetup} to set these
-% separators.
-% \begin{macrocode}
-\DTMdefkey{de-CH}{dowdaysep}{\renewcommand*{\DTMdeCHdowdaysep}{#1}}
-\DTMdefkey{de-CH}{daymonthsep}{\renewcommand*{\DTMdeCHdaymonthsep}{#1}}
-\DTMdefkey{de-CH}{monthyearsep}{\renewcommand*{\DTMdeCHmonthyearsep}{#1}}
-\DTMdefkey{de-CH}{datetimesep}{\renewcommand*{\DTMdeCHdatetimesep}{#1}}
-\DTMdefkey{de-CH}{timezonesep}{\renewcommand*{\DTMdeCHtimezonesep}{#1}}
-\DTMdefkey{de-CH}{datesep}{\renewcommand*{\DTMdeCHdatesep}{#1}}
-\DTMdefkey{de-CH}{timesep}{\renewcommand*{\DTMdeCHtimesep}{#1}}
-% \end{macrocode}
-%
-%
-% Define a boolean key that can switch between full and abbreviated formats for
-% the month and day of week names in the text format.
-% \begin{macrocode}
-\DTMdefboolkey{de-CH}{abbr}[true]{}
-% \end{macrocode}
-%
-% The default is full name
-% \begin{macrocode}
-\DTMsetbool{de-CH}{abbr}{false}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the time zone mappings
-% should be used.
-% \begin{macrocode}
-\DTMdefboolkey{de-CH}{mapzone}[true]{}
-% \end{macrocode}
-% The default is to use mappings.
-% \begin{macrocode}
-\DTMsetbool{de-CH}{mapzone}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the day of month should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-CH}{showdayofmonth}[true]{}
-% \end{macrocode}
-% The default is to show the day of month.
-% \begin{macrocode}
-\DTMsetbool{de-CH}{showdayofmonth}{true}
-% \end{macrocode}
-%
-% Define a boolean key that determines if the year should be
-% displayed.
-% \begin{macrocode}
-\DTMdefboolkey{de-CH}{showyear}[true]{}
-% \end{macrocode}
-% The default is to show the year.
-% \begin{macrocode}
-\DTMsetbool{de-CH}{showyear}{true}
-% \end{macrocode}
-%
-%
-% Define the "de-CH" style
-% \begin{macrocode}
-\DTMnewstyle
-{de-CH}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-CH}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeCHdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-CH}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeCHdaymonthsep}%
- {}%
- %
- \DTMifbool{de-CH}{abbr}%
- {\DTMdeCHshortmonthname{##2}}%
- {\DTMgermanmonthname{##2}}%
- %
- \DTMifbool{de-CH}{showyear}%
- {%
- \DTMdeCHmonthyearsep%
- \number##1 % space intended
- }%
- {}%
- }%
- \renewcommand*\DTMDisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-CH}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeCHdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-CH}{showdayofmonth}%
- {\DTMgermanordinal{##3}\DTMdeCHdaymonthsep}%
- {}%
- %
- \DTMifbool{de-CH}{abbr}%
- {\DTMdeCHshortmonthname{##2}}%
- {\DTMgermanmonthname{##2}}%
- %
- \DTMifbool{de-CH}{showyear}%
- {%
- \DTMdeCHmonthyearsep%
- \number##1 % space intended
- }%
- {}%
- }
-}%
-{% time style (use default)
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeCHtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeCHtimesep\DTMtwodigits{##3}\fi\space%
- Uhr%
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-CH}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMdeCHtimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeCHdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeCHtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}[9]{%
- \ifDTMshowdate
- \DTMDisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeCHdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeCHtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
-}%
-% \end{macrocode}
-%
-% Define numeric style.
-% \begin{macrocode}
-\DTMnewstyle
-{de-CH-numeric}% label
-{% date style
- \renewcommand*\DTMdisplaydate[4]{%
- \ifDTMshowdow
- \ifnum##4>-1
- \DTMifbool{de-CH}{abbr}%
- {\DTMgermanshortweekdayname{##4}}%
- {\DTMgermanweekdayname{##4}}%
- \DTMdeCHdowdaysep
- \fi
- \fi
- %
- \DTMifbool{de-CH}{showdayofmonth}%
- {%
- \DTMtwodigits{##3}%
- \DTMdeCHdatesep
- }%
- {}%
- \DTMtwodigits{##2}%
- \DTMdeCHdatesep%
- \DTMifbool{de-CH}{showyear}%
- {%
- \number##1 % space intended
- }%
- {}%
- }%
- \renewcommand*{\DTMDisplaydate}[4]{\DTMdisplaydate{##1}{##2}{##3}{##4}}%
-}%
-{% time style
- \renewcommand*\DTMdisplaytime[3]{%
- \DTMtwodigits{##1}%
- \DTMdeCHtimesep\DTMtwodigits{##2}%
- \ifDTMshowseconds\DTMdeCHtimesep\DTMtwodigits{##3}\fi\space%
- Uhr%
- }%
-}%
-{% zone style
- \DTMresetzones
- \DTMgermanzonemaps
- \renewcommand*{\DTMdisplayzone}[2]{%
- \DTMifbool{de-CH}{mapzone}%
- {\DTMusezonemapordefault{##1}{##2}}%
- {%
- \ifnum##1<0\else+\fi\DTMtwodigits{##1}%
- \ifDTMshowzoneminutes\DTMgermantimesep\DTMtwodigits{##2}\fi
- }%
- }%
-}%
-{% full style
- \renewcommand*{\DTMdisplay}[9]{%
- \ifDTMshowdate
- \DTMdisplaydate{##1}{##2}{##3}{##4}%
- \DTMdeCHdatetimesep
- \fi
- \DTMdisplaytime{##5}{##6}{##7}%
- \ifDTMshowzone
- \DTMdeCHtimezonesep
- \DTMdisplayzone{##8}{##9}%
- \fi
- }%
- \renewcommand*{\DTMDisplay}{\DTMdisplay}%
-}
-% \end{macrocode}
-%
-% Switch style according to the \opt{useregional} setting.
-% \begin{macrocode}
-\DTMifcaseregional
-{}% do nothing
-{\DTMsetstyle{de-CH}}%
-{\DTMsetstyle{de-CH-numeric}}%
-% \end{macrocode}
-%
-% Redefine \cs{dategerman} (or \cs{date}\meta{dialect}) to prevent
-% \sty{babel} from resetting \cs{today}. (For this to work,
-% \sty{babel} must already have been loaded if it's required.)
-% \begin{macrocode}
-\ifcsundef{date\CurrentTrackedDialect}
-{%
- \ifundef\dategerman
- {% do nothing
- }%
- {%
- \def\dategerman{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{german}}%
- {\DTMsetstyle{german-numeric}}%
- }%
- }%
-}%
-{%
- \csdef{date\CurrentTrackedDialect}{%
- \DTMifcaseregional
- {}% do nothing
- {\DTMsetstyle{de-CH}}%
- {\DTMsetstyle{de-CH-numeric}}%
- }%
-}%
-% \end{macrocode}
-%
-%\iffalse
-% \begin{macrocode}
-%</datetime2-de-CH.ldf>
-% \end{macrocode}
-%\fi
-%
-%
-%
-%
-%
-%
-%
-%
-%
%
-%\Finale
-\endinput \ No newline at end of file
+\endinput
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.ins b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.ins
index 585dc37c7c..13b7a31769 100644
--- a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.ins
+++ b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.ins
@@ -4,7 +4,7 @@
datetime2-german.dtx
Copyright 2015 Nicola Talbot
- Copyright 2017 Sebastian Friedl
+ Copyright 2017-19 Sebastian Friedl
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either version 1.3c
@@ -17,38 +17,52 @@
This work has the LPPL maintenance status `maintained'.
Current maintainer of the work is Sebastian Friedl
- This work consists of the files datetime2-german.dtx and
- datetime2-german.ins and the derived files
- datetime2-german-utf8.ldf, datetime2-german-ascii.ldf,
- datetime2-german.ldf, datetime2-de-DE.ldf,
- datetime2-de-AT.ldf and datetime2-de-CH.ldf
-
+ This work consists of the files and the derived files:
+ - datetime2-german.ins, - datetime2-german-base.ldf,
+ - datetime2-german-base.dtx, - datetime2-german-base-ascii.ldf,
+ - datetime2-german-base-ascii.dtx, - datetime2-german-base-utf8.ldf,
+ - datetime2-german-base-utf8.dtx, - datetime2-german.ldf,
+ - datetime2-german.ldf, - datetime2-de-DE.ldf,
+ - datetime2-de-DE.ldf, - datetime2-de-AT.ldf and
+ - datetime2-de-AT.ldf, - datetime2-de-CH.ldf
+ - datetime2-de-CH.ldf and
+ - datetime2-german-doc.dtx
\endpreamble
\askforoverwritefalse
+\generate
+{%
+ \file
+ {datetime2-german-base.ldf}%
+ {%
+ \usepreamble\defaultpreamble
+ \usepostamble\defaultpostamble
+ \from{datetime2-german-base.dtx}{datetime2-german-base.ldf,package}%
+ }%
+}
\generate
{%
\file
- {datetime2-german-utf8.ldf}%
+ {datetime2-german-base-utf8.ldf}%
{%
\usepreamble\defaultpreamble
\usepostamble\defaultpostamble
- \from{datetime2-german.dtx}{datetime2-german-utf8.ldf,package}%
+ \from{datetime2-german-base-utf8.dtx}{datetime2-german-base-utf8.ldf,package}%
}%
}
\generate
{%
\file
- {datetime2-german-ascii.ldf}%
+ {datetime2-german-base-ascii.ldf}%
{%
\usepreamble\defaultpreamble
\usepostamble\defaultpostamble
- \from{datetime2-german.dtx}{datetime2-german-ascii.ldf,package}%
+ \from{datetime2-german-base-ascii.dtx}{datetime2-german-base-ascii.ldf,package}%
}%
}
@@ -73,7 +87,7 @@
{%
\usepreamble\defaultpreamble
\usepostamble\defaultpostamble
- \from{datetime2-german.dtx}{datetime2-de-DE.ldf,package}%
+ \from{datetime2-de-DE.dtx}{datetime2-de-DE.ldf,package}%
}%
}
@@ -86,7 +100,7 @@
{%
\usepreamble\defaultpreamble
\usepostamble\defaultpostamble
- \from{datetime2-german.dtx}{datetime2-de-AT.ldf,package}%
+ \from{datetime2-de-AT.dtx}{datetime2-de-AT.ldf,package}%
}%
}
@@ -99,7 +113,7 @@
{%
\usepreamble\defaultpreamble
\usepostamble\defaultpostamble
- \from{datetime2-german.dtx}{datetime2-de-CH.ldf,package}%
+ \from{datetime2-de-CH.dtx}{datetime2-de-CH.ldf,package}%
}%
}
diff --git a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.pdf b/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.pdf
deleted file mode 100644
index 7bb0d2b49e..0000000000
--- a/macros/latex/contrib/datetime2-contrib/datetime2-german/datetime2-german.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/erw-l3/README.txt b/macros/latex/contrib/erw-l3/README.md
index 6d9e79fad5..e5b41e28d7 100644
--- a/macros/latex/contrib/erw-l3/README.txt
+++ b/macros/latex/contrib/erw-l3/README.md
@@ -1,7 +1,8 @@
----------------------------------------------------------------
erw-l3 --- Utilities built around expl3
-Source repository: https://github.com/er-cpp/erw-l3
+Source repository: https://github.com/rogard/erw-l3
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
+
----------------------------------------------------------------
diff --git a/macros/latex/contrib/erw-l3/erw-l3.dtx b/macros/latex/contrib/erw-l3/erw-l3.dtx
index 9c66237579..6fcffe4ca4 100644
--- a/macros/latex/contrib/erw-l3/erw-l3.dtx
+++ b/macros/latex/contrib/erw-l3/erw-l3.dtx
@@ -6,7 +6,7 @@
%<*readme>
----------------------------------------------------------------
erw-l3 --- Utilities built around expl3
-Source repository: https://github.com/er-cpp/erw-l3
+Source repository: https://github.com/rogard/erw-l3
Released under the LaTeX Project Public License v1.3c or later
See http://www.latex-project.org/lppl.txt
----------------------------------------------------------------
@@ -72,8 +72,8 @@ and the derived files erw-l3.ins,
%</internal>
%<package>\ProvidesExplPackage
%<package> {erw-l3} % Package name
-%<package> {2018/6/21} % Release date
-%<package> {0.1.3} % Release version
+%<package> {2019/10/12} % Release date
+%<package> {0.1.5} % Release version
%<package> {Utilities built around expl3} % Description
%
%<*driver>
@@ -116,29 +116,25 @@ and the derived files erw-l3.ins,
%
% \tableofcontents
%
-% \section{Preliminaries}
+% \section*{Conventions}
%
-% See \autoref{part:other}~\autoref{support} on how to get this package.
-% To use it, make sure the file \file{erw-l3.sty} is in the path of the \LaTeX~engine.
-% In the preamble of your \LaTeX document, put:
-% \begin{center}
-% \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak
-% \end{center}
+% The naming conventions are (loosely) those of \LaTeX3.
+% For example, \meta{cs} stands for \emph{control sequence}, which is described in \cite[Part~\pkg{l3basics}]{interface3}.
%
-% \floatstyle{ruled}
-% \newfloat{Listing}{H}{lop}
-% \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}}
+% \section*{Requirement}
%
-% \part{Usage}\label{part:usage}
+% Have \file{erw-l3.sty} is in the path of the \LaTeX~engine.
%
-% The naming conventions are (loosely) those of \LaTeX3.
-% For example, \meta{cs} stands for \emph{control sequence}, which is described in \cite[Part~\pkg{l3basics}]{interface3}.
+% \part{Usage}\label{part:usage}
%
-% \section{backend}
+% In the preamble of \cs{documentclass}, put:
+% \begin{center}
+% \cs{usepackage}\oarg{options}|{|\pkg{erw-l3}|}|\linebreak
+% \end{center}
%
-% We call `backend' commands that are \pkg{expl3}-like.
+% \section{\textsf{compose}}
%
-% \subsection{\textsf{compose}}
+% \subsection{\textsf{backend}}
%
% \begin{function}{\erw_compose:nV,\erw_compose:nn}
% \begin{syntax}
@@ -180,45 +176,57 @@ and the derived files erw-l3.ins,
% \begin{syntax}
% \cs{erw_compose_seq_vers:nV}\marg{list of cs or code}\meta{seq}
% \end{syntax}
-% Not implemented.
+% {\color{red}Not implemented}
% \end{function}
%
-% \subsection{\textsf{csutil}}
+% \section{\textsf{csutil}}
%
-% \begin{function}{\erw_apply:Nn, \erw_apply:cn}
+% \subsection{\textsf{backend}}
+%
+% \begin{function}{\erw_accum:nn}
+% \begin{syntax}{\cs{erw_accum:nn}}\marg{token list}\marg{item}
+% \end{syntax}Expands to a token list comprising the items of \meta{token list} and \meta{item}
+% \end{function}
+%
+% \begin{function}{\erw_apply:Nn, \erw_apply:cn, \erw_apply:Nnn, \erw_apply:Nnnn, \erw_apply:Nnnnn}
% \begin{syntax}{\cs{erw_apply:Nn}}\meta{cs}\marg{arg}
% \end{syntax}Expands to \meta{cs}\marg{arg}
% \end{function}
%
-% \begin{function}{\erw_cs_set_eq:NN, \erw_cs_set_eq:cN}
+% \begin{function}{\erw_cs_set_eq:NN, \erw_cs_set_eq:cN,\erw_cs_gset_eq:NN, \erw_cs_gset_eq:cN}
% \begin{syntax}{\cs{erw_cs_set_eq:NN}}\meta{cs1}\meta{cs2}
% \end{syntax}\meta{cs1}\textleftarrow\meta{cs2}
% \end{function}
%
-% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn}
+% \begin{function}{\erw_cs_set_inline:Nn, \erw_cs_set_inline:cn,\erw_cs_gset_inline:Nn, \erw_cs_gset_inline:cn}
% \begin{syntax}{\cs{erw_cs_set_inline:Nn}}\meta{cs}\marg{code}
% \end{syntax}
% \end{function}
%
-% \begin{function}{\erw_identity:N,\erw_identity:c}
-% \begin{syntax}{\cs{erw_identity:N}}\marg{arg}
+% \begin{function}{\erw_identity:n}
+% \begin{syntax}{\cs{erw_identity:n}}\marg{arg}
% \end{syntax} Expands to \meta{arg}
% \end{function}
%
+% \begin{function}{\erw_is_matrix_p:n,\erw_is_matrix:nTF}
+% \begin{syntax}{\cs{erw_is_matrix_p:n}}\marg{token list}
+% \end{syntax} Checks if \meta{token list} is a (square) matrix.
+% \end{function}
+%
% \begin{function}{\erw_fold:NV, \erw_fold:cV}
% \begin{syntax}{\cs{erw_fold:NV}}\meta{cs}\meta{var}
% \end{syntax}\meta{var}\textleftarrow \cs{erw_apply:NV}\meta{cs}\meta{var}.
% See Listing~\autoref{listng:fold}.
% \end{function}
%
-% \begin{function}{\erw_items_to:nn}
-% \begin{syntax}{\cs{erw_items_to:nn}}\marg{int}\marg{token list}
-% \end{syntax} See Listing~\autoref{listng:items}
-% \end{function}
-%
% \begin{function}{\erw_last_item:nn}
% \begin{syntax}{\cs{erw_last_item:nn}}\marg{int}\marg{token list}
-% \end{syntax} See Listing~\autoref{listng:items}
+% \end{syntax} ^^ASee Listing~\autoref{listng:items}
+% \end{function}
+%
+% \begin{function}{\erw_merge:nn}
+% \begin{syntax}{\cs{erw_merge:nn}}\marg{tl 1}\marg{tl 2}
+% \end{syntax}Merges \meta{tl 1}\meta{tl 2}
% \end{function}
%
% \begin{function}{\erw_repeat:nn}
@@ -232,10 +240,41 @@ and the derived files erw-l3.ins,
% \end{syntax} See Listing~\autoref{listng:split}
% \end{function}
%
-% \subsection{\textsf{map}}
+% \section{\textsf{int}}
+%
+% \subsection{\textsf{backend}}
+%
+% \begin{function}{\erw_int_range:nn}
+% \begin{syntax}{\cs{erw_int_range:nn}}\marg{first}{last}
+% \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}
+% \end{function}
+%
+% \begin{function}{\erw_int_range:n}
+% \begin{syntax}{\cs{erw_int_range:n}}\marg{count}
+% \end{syntax} Returns a range of integers. Implementation different than \cs{int_step_inline}. See Listing~\autoref{listng:int:range}
+% \end{function}
+%
+% \section{\textsf{map}}
+%
+% \subsection{\textsf{backend}}
+%
+% \begin{function}{\erw_set_map:N,\erw_gset_map:N}
+% \begin{syntax}{\cs{erw_set_map:N}}\meta{cs}
+% \end{syntax} Sets the function used by \cs{erw_map:n}.
+% \end{function}
+%
+% \begin{function}{\erw_set_map_inline:n,\erw_gset_map_inline:n}
+% \begin{syntax}{\cs{erw_set_map_inline:n}}\marg{code}
+% \end{syntax} Sets the function used by \cs{erw_map:n}.
+% \end{function}
+%
+% \begin{function}{\erw_map:n}
+% \begin{syntax}{\cs{erw_map:n}}\marg{token list}
+% \end{syntax} Applies the stored \meta{cs} to each item in \meta{token list}. An application is \cs{erw_is_matrix}
+% \end{function}
%
% \begin{function}{\erw_map:Nn}
-% \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{args}
+% \begin{syntax}{\cs{erw_map:Nn}}\meta{cs}\marg{token list}
% \end{syntax}
% See Listing~\autoref{listng:map}.
% Redundant with \cs{tl_map_function:nN}
@@ -247,9 +286,14 @@ and the derived files erw-l3.ins,
% See Listing~\autoref{listng:mapinl}
% \end{function}
%
+% \begin{function}{\erw_map_indexed:Nnn}
+% \begin{syntax}{\cs{erw_map_indexed:Nnn}}\meta{cs}\marg{int}\marg{matrix of tokens}
+% \end{syntax} {\color{red} Not implemented}. See Listing~\autoref{listng:mapindexed}.
+% \end{function}
+%
% \begin{function}{\erw_map_thread:Nn}
% \begin{syntax}{\cs{erw_map_thread:Nn}}\meta{cs}\marg{matrix of tokens}
-% \end{syntax} Threads \meta{cs} over the columns, where the arity of \meta{cs} is equal to the number of rows.
+% \end{syntax} Threads \meta{cs} over the columns, where the arity of \meta{cs} must be equal to the number of rows.
% See Listing~\autoref{listng:thread}
% \end{function}
%
@@ -258,9 +302,9 @@ and the derived files erw-l3.ins,
% \end{syntax}
% \end{function}
%
-% \subsection{\textsf{numbrdcs}}
+% \section{\textsf{numbrdcs}}
%
-% Part of these commands have a frontend counterpart, see \autoref{usage:frontend:numbrdcs}.
+% \subsection{backend}
%
% \begin{function}{\erw_numbrd_cs_reset:}
% \begin{syntax}\cs{erw_numbrd_cs_reset:}|{}|
@@ -282,33 +326,7 @@ and the derived files erw-l3.ins,
% \end{syntax}See Listing~\ref{listng:numbrdcs:names}
% \end{function}
%
-% \section{frontend}\label{part:frontend}
-%
-% We call frontend commands created with pkg{xparse}'s\cs{NewDocumentCommand}\cite{xparse}
-%
-% \subsection{\textsf{disambig}}
-%
-% \begin{function}{\disambignewcmd,\disambignewcmd*}
-% \begin{syntax}{\cs{disambignewcmd}}\marg{token}\marg{pars}\marg{code}
-% \end{syntax}Analogues of \cs{NewDocumentCommand} and \cs{RenewDocumentCommand}. See~Listing~\ref{listng:disambig:cmd}
-% \end{function}
-%
-% \begin{function}{\disambignewenv,\disambignewenv*}
-% \begin{syntax}{\cs{disambignewenv}}\marg{token}\marg{pars}\marg{code1}\marg{code2}
-% \end{syntax}Analogues of \cs{NewDocumentEnvironment} and \cs{RenewDocumentEnvironment}. See~Listing~\ref{listng:disambig:env}
-% \end{function}
-%
-% \begin{function}{\disambigset}
-% \begin{syntax}{\cs{disambigset}}\marg{prefix}
-% \end{syntax}
-% \end{function}
-%
-% \begin{function}{\disambigunset}
-% \begin{syntax}{\cs{disambigunset}}|{}|
-% \end{syntax}
-% \end{function}
-%
-% \subsection{\textsf{numbrdcs}}\label{usage:frontend:numbrdcs}
+% \subsection{frontend}
%
% \begin{function}{\numbrdcsnew,\numbrdcsnew*}
% \begin{syntax}\cs{numbrdcsnew}\marg{list of cs or code}
@@ -324,14 +342,18 @@ and the derived files erw-l3.ins,
%
% \part{Listings}\label{part:listng}
%
-% \section{Backend}
+% \floatstyle{ruled}
+% \newfloat{Listing}{H}{lop}
+% \NewDocumentCommand{\erwtab}{O{0.5}}{\tabto{#1\linewidth}}
%
-% \subsection{compose}
+% \section{compose}
+%
+% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\erwtab\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\erwtab\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
@@ -343,14 +365,14 @@ and the derived files erw-l3.ins,
% \\\verb|\erw_compose:nn{|
% \\\verb| {\__baz}{\__bar}{\__foo}}|
% \\\verb| {X}|\erwtab\erw_compose:nn{{\__baz}{\__bar}{\__foo}}{X}
-% \ExplSyntaxOff
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:compose}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\tl_set:Nn \l_tmpa_tl{X}
@@ -361,14 +383,14 @@ and the derived files erw-l3.ins,
% \\\verb|\erw_compose_c:nn{|
% \\\verb| {__baz}{__bar}{__foo}}|
% \\\verb| {X}|\erwtab\erw_compose_c:nn{{__baz}{__bar}{__foo}}{X}
-% \ExplSyntaxOff
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:compose:c}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\seq_new:N\l_tmp_seq|\erwtab\seq_new:N \l_tmp_seq
@@ -380,14 +402,14 @@ and the derived files erw-l3.ins,
% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
-% \ExplSyntaxOff
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:seq}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\seq_new:N\l_tmp_seq|
@@ -399,38 +421,40 @@ and the derived files erw-l3.ins,
% \\\verb|\seq_item:Nn\l_tmp_seq{2}|\erwtab \seq_item:Nn \l_tmp_seq{2}
% \\\verb|\seq_item:Nn\l_tmp_seq{3}|\erwtab \seq_item:Nn \l_tmp_seq{3}
% \\\verb|\seq_item:Nn\l_tmp_seq{4}|\erwtab \seq_item:Nn \l_tmp_seq{4}
-% \ExplSyntaxOff
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:seq:c}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\cs_set:Npn \__bar #1 {g[#1]}|\cs_set:Npn \__bar #1 {g[#1]}
% \\\verb|\cs_set:Npn \__baz #1 {h\{#1\}}|\cs_set:Npn \__baz #1 {h\{#1\}}
% \\\verb|\erw_compose_vers:nn{|
% \\\verb| {\__baz}{g[#1]}{\__foo}}|
% \\\verb| {X}|\erwtab\erw_compose_vers:nn{{\__baz}{g[#1]}{\__foo}}{X}
-% \ExplSyntaxOff
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{}\label{listng:compose:vers}
% \end{Listing}
%
-% \subsection{csutil}
+% \section{csutil}
+%
+% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\erwtab\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\erw_apply:Nn\__foo{X}|\erwtab\erw_apply:Nn\__foo{X}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:apply}
% \end{Listing}
-%
+%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
+% \\\verb|\cs_set:Npn \__foo #1 {f(#1)}|\cs_set:Npn \__foo #1 {f(#1)}
% \\\verb|\tl_set:Nn \l_tmpa_tl{X}|\erwtab\tl_set:Nn \l_tmpa_tl{X}
% \\\verb|\erw_fold_set_par:n{Nf}|\erw_fold_set_par:n{Nf}
% \\\verb|\erw_fold_apply_par:n{Nf}|\erw_fold_apply_par:n{Nf}
@@ -446,20 +470,38 @@ and the derived files erw-l3.ins,
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \verb|\erw_last_item:n{{a}{b}{c}}|\erwtab \erw_last_item:n {{a}{b}{c}}
-% \\\verb|\\\erw_items_to:nn{1}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{1}{{a}{b}{c}{d}}
-% \\\verb|\\\erw_items_to:nn{2}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{2}{{a}{b}{c}{d}}
-% \\\verb|\\\erw_items_to:nn{3}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{3}{{a}{b}{c}{d}}
-% \\\verb|\\\erw_items_to:nn{4}{{a}{b}{c}{d}}|\erwtab \erw_items_to:nn{4}{{a}{b}{c}{d}}
-% \\\verb|\ExplSyntaxOff| \ExplSyntaxOff
-% \caption{ }\label{listng:items}
+% \\\verb|\erw_is_matrix:nTF|
+% \\\verb|{|
+% \\\verb| { {a}{b}{c} }|
+% \\\verb| { {k}{l}{m} }|
+% \\\verb| { {x}{y}{z} }|
+% \\\verb|}{T}{F}|\erwtab\erw_is_matrix:nTF
+% {
+% { {a}{b}{c} }
+% { {k}{l}{m} }
+% { {x}{y}{z} }
+% }{T}{F}
+% \\\verb|\erw_is_matrix:nTF|
+% \\\verb|{|
+% \\\verb| { {a}{c} }|
+% \\\verb| { {k} }|
+% \\\verb| { {x}{y}{z} }|
+% \\\verb|}{T}{F}|\erwtab
+% \erw_is_matrix:nTF
+% {
+% { {a}{c} }
+% { {k} }
+% { {x}{y}{z} }
+% }{T}{F}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:ismatrix}
% \end{Listing}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\erw_repeat:nn{|
-% \\\verb| {3}{abracad}}abra| \erwtab \erw_repeat:nn{3}{abracad}abra
+% \\\verb|\erw_repeat:nn|
+% \\\verb| {3}{abracad}abra| \erwtab \erw_repeat:nn{3}{abracad}abra
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:repeat}
% \end{Listing}
@@ -467,18 +509,32 @@ and the derived files erw-l3.ins,
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \\\verb|\erw_split:nn{|
-% \\\verb| {{a}{b}{c}}{==}}| \erwtab \erw_split:nn{{a}{b}{c}}{==}
+% \\\verb|\erw_split:nn|
+% \\\verb| {{a}{b}{c}}{==}| \erwtab \erw_split:nn{{a}{b}{c}}{==}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:split}
% \end{Listing}
%
-% \subsection{\textsf{map}}
+% \section{\textsf{int}}
+%
+% \subsection{\textsf{backend}}
+%
+% \begin{Listing}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\erw_int_range:nn{2}{5}|\erwtab\erw_int_range:nn{2}{5}
+% \\\verb|\erw_int_range:n{5}|\erwtab\erw_int_range:n{5}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{ }\label{listng:int:range}
+% \end{Listing}
+%
+% \section{\textsf{map}}
+%
+% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-%\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
+% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
% \\\verb|\erw_map:Nn \__foo{{a}{b}{c}}|\erwtab\erw_map:Nn \__foo{{a}{b}{c}}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:map}
@@ -487,7 +543,7 @@ and the derived files erw-l3.ins,
% \vspace*{\fill}
% \begin{Listing}
% \verb|\ExplSyntaxOn| \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
+% \\\verb|\cs_set:Npn \__foo #1 {(#1)}|\cs_set:Npn \__foo #1 {(#1)}
% \\\verb|\erw_map_inline:nn{|
% \\\verb| (#1)}{{a}{b}{c}}| \erwtab\erw_map_inline:nn{(#1)}{{a}{b}{c}}
% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
@@ -496,8 +552,8 @@ and the derived files erw-l3.ins,
%
% \vspace*{\fill}
% \begin{Listing}
-% \ExplSyntaxOn
-% \verb|\cs_set:Npn \__foo:n #1 {(#1)}|\cs_set:Npn \__foo:n #1 {(#1)}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set:Npn \__foo:n #1 {(#1)}|\cs_set:Npn \__foo:n #1 {(#1)}
% \\\verb|\erw_map_thread:Nn \__foo:n|
% \\\verb|{|
% \\\verb| {{a}{b}{c}{d}{e}{f}}|
@@ -546,11 +602,60 @@ and the derived files erw-l3.ins,
% {{k}{l}{m}{n}{o}{p}}
% {{K}{L}{M}{N}{O}{P}}
% }
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
% \caption{ }\label{listng:thread}
-% \ExplSyntaxOff
% \end{Listing}
%
-% \subsection{\textsf{numbrdcs}}
+% \begin{Listing}
+% \verb|\ExplSyntaxOn|\ExplSyntaxOn
+% \\\verb|\cs_set_protected:Npn \__foo:nn #1 #2|
+% \\\verb| {(#1+#2)}| \cs_set_protected:Npn \__foo:nn #1 #2 {(#1+#2)}
+% \\\verb|\erw_map_thread:Nn|
+% \\\verb| \__foo:nn |
+% \\\verb| { |
+% \\\verb| {{1}{2}{3}} |
+% \\\verb| {{a}{b}{c}}|
+% \\\verb| }|\erwtab\erw_map_thread:Nn
+% \__foo:nn
+% {
+% {{1}{2}{3}}
+% {{a}{b}{c}}
+% }
+% \\\verb|\exp_last_unbraced:Nx|
+% \\\verb|\erw_map_thread:Nn|
+% \\\verb|{|
+% \\\verb| \__foo:nn |
+% \\\verb| { |
+% \\\verb| {\erw_int_range:n{3}} |
+% \\\verb| {{a}{b}{c}}|
+% \\\verb| }|
+% \\\verb|}| \erwtab
+% \exp_last_unbraced:Nx
+% \erw_map_thread:Nn
+% {
+% \__foo:nn
+% {
+% {\erw_int_range:n{3}}
+% {{a}{b}{c}}
+% }
+% }\erwtab[0.7]{\color{red} (does~not~thread!)}
+% \\\verb|\exp_last_unbraced:Nx|
+% \\\verb|\erw_map_thread:Nn|
+% \\\verb|{|
+% \\\verb| \__foo:nn |
+% \\\verb| { |
+% \\\verb| {\int_step_inline:nn{3}{#1}} |
+% \\\verb| {{a}{b}{c}}|
+% \\\verb| }|
+% \\\verb|}|
+% \erwtab[0.2]{\color{red} \verb|Illegal parameter number in definition of \l__exp_internal_tl!|}
+% \\\verb|\ExplSyntaxOff|\ExplSyntaxOff
+% \caption{Debugging~for~\cs{erw_map_indexed}}\label{listng:mapindexed}
+% \end{Listing}
+%
+% \section{\textsf{numbrdcs}}
+%
+% \subsection{\textsf{backend}}
%
% \vspace*{\fill}
% \begin{Listing}
@@ -562,8 +667,8 @@ and the derived files erw-l3.ins,
% \\\verb|\exp_last_unbraced:Nx|
% \\\verb| \erw_compose_c:nn|
% \\\verb| {|
-% \\\verb| {\erw_numbrd_cs_names|
-% \\\verb| _braced:nnn{1}{1}{3}}|
+% \\\verb| {\erw_numbrd_cs_names_braced:|
+% \\\verb| nnn{1}{1}{3}}|
% \\\verb| {X}|
% \\\verb| }|
% \\\verb|\ExplSyntaxOff|\erwtab
@@ -576,61 +681,7 @@ and the derived files erw-l3.ins,
% \caption{ }\label{listng:numbrdcs:names}
% \end{Listing}
%
-% \section{Frontend}
-%
-% ^^A\vspace*{\fill}
-% ^^A\begin{Listing}
-% ^^A\verb|\NewDocumentCommand{\thefoo}{m}{f(#1)}|
-% ^^A\\\verb|\NewDocumentCommand{\thebar}{m}{g[#1]}|
-% ^^A\\\verb|\NewDocumentCommand{\thebaz}{m}{h\{#1\}}|
-% ^^A\caption{Initialization}\label{listng:init:front}
-% ^^A\end{Listing}
-%
-% \subsection{disambig}
-%
-% \begin{Listing}
-% \textbf{Input}
-% \begin{verbatim}
-% \disambigset{my}
-% \disambignewcmd{\foo}{m}{#1~world!}
-% \noindent\myfoo{Hello}
-% \disambignewcmd*{\foo}{m}{#1~universe!}
-% \\\myfoo{Hello}
-% \disambigunset
-% \disambignewcmd{\foo}{m}{#1~world!}
-% \\\foo{Hello}
-% \end{verbatim}
-% \textbf{Output}
-% \\\disambigset{my}
-% \disambignewcmd{\foo}{m}{#1~world!}
-% \noindent\myfoo{Hello}
-% \disambignewcmd*{\foo}{m}{#1~universe!}
-% \\\myfoo{Hello}
-% \disambigunset
-% \disambignewcmd{\foo}{m}{#1~world!}
-% \\\foo{Hello}
-% \caption{}\label{listng:disambig:cmd}
-% \end{Listing}
-%
-% \begin{Listing}
-% \textbf{Input}
-% \begin{verbatim}
-% \disambigset{my}
-% \disambignewenv{bar}{}{H}{!}
-% \\\begin{mybar}ello~world\end{mybar}
-% \disambignewenv*{bar}{}{J}{!}
-% \\\begin{mybar}ello~world\end{mybar}
-% \end{verbatim}
-% \textbf{Output}
-% \disambigset{my}
-% \disambignewenv{bar}{}{H}{!}
-% \\\begin{mybar}ello~world\end{mybar}
-% \disambignewenv*{bar}{}{J}{!}
-% \\\begin{mybar}ello~world\end{mybar}
-% \caption{}\label{listng:disambig:env}
-% \end{Listing}
-%
-% \subsection{\textsf{numbrdcs}}
+% \subsection{frontend}
%
% \vspace*{\fill}
% \begin{Listing}
@@ -654,59 +705,6 @@ and the derived files erw-l3.ins,
% \caption{ }\label{listng:numbrdcs}
% \end{Listing}
%
-% \part{Other}\label{part:other}
-%
-% \section{Support}\label{support}
-%
-% This package is available from \url{https://www.ctan.org/pkg/erw-l3} (release) or \url{https://github.com/er-cpp/erw-l3} (development) where you can report issues.
-%
-% \section{Acknowledgment}
-% I thank those that have answered my questions on forums pertaining to \LaTeX3. See here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
-% and here: \url{https://latex.org/forum/memberlist.php?mode=viewprofile&u=61329}
-%
-% ^^A \section{Change history}
-% ^^A TODO Bring the change history under this section
-% ^^A The versions showns are of those of the development stage, some may have been skipped in the release.
-% ^^A \iffalse
-% ^^A : changes
-% ^^A \fi
-%
-% \changes{0.1}{2018/05/20}{Initial version}
-% \changes{0.1.1}{2018/05/23}{}
-% \changes{0.1.1}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
-% \changes{0.1.1}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
-% \changes{0.1.1}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
-% \changes{0.1.2}{2018/06/21}{}
-% \changes{0.1.2}{2018/06/21}{\cs{erw_compose} reversed order in which the functions are composed, such that it now conforms to
-% the mathematical convention ($g\circ f$ means $f$ comes before $g$)}
-%\changes{0.1.2}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
-%\changes{0.1.2}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};\cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_repeat}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_split}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_last_item}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{erw_items_to}}
-%\changes{0.1.2}{2018/06/21}{Added \cs{map_thread}}
-%\changes{0.1.2}{2018/06/21}{Re-arranged the doc to clearly separate frontend from backend}
-%
-% % \begin{thebibliography}{1}
-%
-% ^^A\bibitem{expl3} The \LaTeX3 Project Team {\em The \pkg{expl3} package and \LaTeX3 programming}
-% ^^A\url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/expl3.pdf}
-%
-% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
-%
-% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}
-% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
-%
-% ^^A \bibitem{l3pckg} The \LaTeX3 Project Team {\em l3packages} \url{http://mirror.ctan.org/macros/latex/contrib/l3packages/}
-%
-% ^^A \bibitem{tex.stack:431046} \url{https://tex.stackexchange.com/questions/431046/calling-expl3s-usec-on-an-expression-expanding-to-a-cs-name-causes-error}
-%
-% ^^A \bibitem{tex.stack:432171} \url{https://tex.stackexchange.com/questions/432171/expl3-making-arguments-from-a-loop}
-%
-% \end{thebibliography}
-%
%
%\StopEventually{^^A
% \PrintChanges
@@ -726,8 +724,8 @@ and the derived files erw-l3.ins,
\ExplSyntaxOn
\msg_new:nnn{erw}{generic}{#1}
% \end{macrocode}
-% \section{Back end}
-% \subsection{\textsf{compose}}
+% \section{\textsf{compose}}
+% \subsection{backend}
% \begin{macrocode}
\cs_set:Npn \erw_compose:NnV
#1 % method
@@ -794,8 +792,13 @@ and the derived files erw-l3.ins,
{#2}
}
% \end{macrocode}
-% \subsection{\textsf{csutil}}
+% \section{\textsf{csutil}}
+% \subsection{\textsf{backend}}
% \begin{macrocode}
+\cs_set:Npn \erw_accum:nn #1 #2
+{
+ {#1{#2}}
+}
\cs_set:Npn \__erw_cs_name:N #1
{
\exp_last_unbraced:Nf \use_i:nnn {\cs_split_function:N #1}
@@ -812,11 +815,21 @@ and the derived files erw-l3.ins,
\cs_set:Npn #1 ##1{#2{##1}}
}
\cs_generate_variant:Nn \erw_cs_set_eq:NN {cN}
+\cs_set:Npn \erw_cs_gset_eq:NN #1 #2
+{
+ \cs_gset:Npn #1 ##1{#2{##1}}
+}
+\cs_generate_variant:Nn \erw_cs_gset_eq:NN {cN}
\cs_set:Npn \erw_cs_set_inline:Nn #1 #2
{
\cs_set:Npn #1 ##1{#2}
}
\cs_generate_variant:Nn \erw_cs_set_inline:Nn {cn}
+\cs_set:Npn \erw_cs_gset_inline:Nn #1 #2
+{
+ \cs_gset:Npn #1 ##1{#2}
+}
+\cs_generate_variant:Nn \erw_cs_gset_inline:Nn {cn}
\tl_set:Nn \__erw_fold_set_par_tl{\c_novalue_tl}
\tl_set:Nn \__erw_fold_apply_par_tl{\c_novalue_tl}
\cs_set:Npn \erw_fold_set_par:n #1
@@ -847,28 +860,43 @@ and the derived files erw-l3.ins,
}
\cs_generate_variant:Nn \erw_fold_seq:NV {cV}
\cs_set:Npn \erw_identity:n #1{#1}
-\cs_set:Npn\__erw_items_to:nnn #1 #2 #3
+\prg_set_conditional:Npnn \erw_is_matrix:n #1 { p, TF }
{
- \int_compare:nNnTF
- {#1}>{#2}
- {
- \exp_args:Nf \tl_head:n{#3}
- \__erw_items_to:nnn
- {#1}
- {\int_eval:n{#2+1}}
- {\exp_args:Nf \tl_tail:n{#3}}
- }
+ \erw_gset_map_inline:n{==\tl_count:n{##1}}
+ \int_compare:nTF
{
- \exp_args:Nf \tl_head:n{#3}
+ \exp_args:Nf\tl_count:n{\tl_head:n{#1}}
+ \exp_args:Nf \erw_map:n
+ {
+ \tl_tail:n{#1}
+ }
}
+ {\prg_return_true:}
+ {\prg_return_false:}
}
-\cs_set:Npn \erw_items_to:nn #1 #2
-{
- \__erw_items_to:nnn
- {#1}
- {1}
- {#2}
-}
+% Deprecated in v0.1.4 after realizing \cs{tl_range:n} does the job
+%\cs_set:Npn\__erw_items_to:nnn #1 #2 #3
+%{
+% \int_compare:nNnTF
+% {#1}>{#2}
+% {
+% \exp_args:Nf \tl_head:n{#3}
+% \__erw_items_to:nnn
+% {#1}
+% {\int_eval:n{#2+1}}
+% {\exp_args:Nf \tl_tail:n{#3}}
+% }
+% {
+% \exp_args:Nf \tl_head:n{#3}
+% }
+%}
+%\cs_set:Npn \erw_items_to:nn #1 #2
+%{
+% \__erw_items_to:nnn
+% {#1}
+% {1}
+% {#2}
+%}
\cs_set:Npn \erw_last_item:n #1
{
\exp_args:Nof \tl_item:nn
@@ -877,6 +905,10 @@ and the derived files erw-l3.ins,
\tl_count:n{#1}
}
}
+\cs_set:Npn \erw_merge:nn #1 #2
+{
+ {#1#2}
+}
\cs_set:Npn \erw_repeat:nn #1 #2
{
\int_step_inline:nnnn{1}{1}{#1}{#2}
@@ -897,8 +929,52 @@ and the derived files erw-l3.ins,
\erw_split:nnn{#1}{#2}{Nf}
}
% \end{macrocode}
-% \subsection{\textsf{map}}
+% \section{\textsf{map}}
+% \subsection{\textsf{backend}}
% \begin{macrocode}
+\cs_set:Npn \__erw_int_range:nnn #1 #2 #3
+{
+ \int_compare:nNnTF
+ {
+ \int_eval:n{#2+1}
+ }>{#3}
+ {
+ {#1}
+ }
+ {
+ \__erw_int_range:nnn
+ {
+ \exp_args:Nx\erw_accum:nn{#1}
+ {
+ \int_eval:n{#2+1}
+ }
+ }
+ {\int_eval:n{#2+1}}
+ {#3}
+ }
+}
+\cs_set:Npn \erw_int_range:nn #1 #2
+{
+ \__erw_int_range:nnn {{#1}}{#1}{#2}
+}
+\cs_set:Npn \erw_int_range:n #1
+{
+ \__erw_int_range:nnn {}{0}{#1}
+% Alt to:
+% \int_step_inline:nn {#1}{##1}
+}
+% \end{macrocode}
+% \section{\textsf{map}}
+% \subsection{\textsf{backend}}
+% \begin{macrocode}
+\cs_set:Npn \erw_gset_map:N #1
+{
+ \erw_cs_gset_eq:NN \__erw_map:n #1
+}
+\cs_set:Npn \erw_gset_map_inline:n #1
+{
+ \erw_cs_gset_inline:Nn \__erw_map:n {#1}
+}
\cs_set:Npn \erw_map:n #1
{
\__erw_map:nn#1\q_recursion_tail\q_recursion_stop\q_recursion_tail\q_recursion_stop
@@ -941,7 +1017,6 @@ and the derived files erw-l3.ins,
{
#1{#2}{#3}{#4}{#5}
}
-
\cs_set:Npn \__erw_map_thread_at:Nnn #1 #2 #3
{
\erw_apply:Nn #1
@@ -989,7 +1064,6 @@ and the derived files erw-l3.ins,
{erw_map_thread_at:~count~of~#3~not~withing~1~to~4}
}
}
-
\cs_set:Npn \erw_map_thread:Nn #1 #2
{
% TODO check that #2 is a matrix
@@ -1002,7 +1076,8 @@ and the derived files erw-l3.ins,
}
}
% \end{macrocode}
-% \subsection{\textsf{numbrdcs}}
+% \section{\textsf{numbrdcs}}
+% \subsection{\textsf{backend}}
% \begin{macrocode}
\int_new:N \__erw_numbrd_cs_int
\cs_set:Npn \erw_numbrd_cs_name:n #1{__erw_numbrd_cs_\int_to_alph:n{#1}:n}
@@ -1042,58 +1117,7 @@ and the derived files erw-l3.ins,
\erw_numbrd_cs_names_braced:nnn{1}{1}{\__erw_numbrd_cs_int}
}
% \end{macrocode}
-% \section{frontend}
-% \subsection{\textsf{disambig}}
-% \begin{macrocode}
-\cs_set:Npn \__erw_disambig:NN #1 #2 {#1{#2}}
-\cs_generate_variant:Nn \__erw_disambig:NN { Nc }
-\NewDocumentCommand{\disambignewcmd}{ s m m m }
-{
- \msg_error:nnn{erw}{generic}{disambignewcmd~undefined}
-}
-\NewDocumentCommand{\disambignewenv}{ s m m m m }
-{
- \msg_error:nnn{erw}{generic}{disambignewenv~undefined}
-}
-\keys_define:nn { erw }
-{
- disambig .code:n =
- {
- \RenewDocumentCommand{\disambignewcmd}{ s m m m }
- {
- \IfBooleanTF{##1}
- {\__erw_disambig:Nc{\RenewDocumentCommand}}
- {\__erw_disambig:Nc{\NewDocumentCommand}}
- {#1 \__erw_cs_name:N ##2}
- {##3}
- {##4}
- }
- \RenewDocumentCommand{\disambignewenv}{ s m m m m }
- {
- \IfBooleanTF{##1}
- {\RenewDocumentEnvironment}
- {\NewDocumentEnvironment}
- {#1##2}
- {##3}
- {##4}
- {##5}
- }
- },
- disambig .initial:n = \c_empty_tl
-}
-\NewDocumentCommand{\disambigset}{ m }
-{
- \keys_set:nn { erw }
- {
- disambig={#1}
- }
-}
-\NewDocumentCommand{\disambigunset}{}
-{
- \disambigset{\c_empty_tl}
-}
-% \end{macrocode}
-% \subsection{\textsf{numbrdcs}}
+% \subsection{\textsf{frontend}}
% \begin{macrocode}
\NewDocumentCommand{\numbrdcsnew}{ s m }
{
@@ -1106,11 +1130,82 @@ and the derived files erw-l3.ins,
{
\erw_numbrd_cs:nn{#1}{#2}
}
-% \end{macrocode}
-% \begin{macrocode}
% \ProcessKeysPackageOptions{ erw }
\ExplSyntaxOff
% \end{macrocode}
+% \part{Other}\label{part:other}
+%
+% \section{Support}\label{support}
+%
+% This package is available from \url{https://www.ctan.org/pkg/erw-l3} (release) or \url{https://github.com/rogard/erw-l3} (development) where you can report issues.
+%
+% \section{To do}\label{todo}
+%
+% \begin{itemize}
+% \item Missing variants of \cs{erw_compose}
+% \item \cs{erw_map_indexed}. See Listing~\autoref{listng:mapindexed}
+% \item Need to give some thought to `protected'
+% \end{itemize}
+%
+% \section{Acknowledgment}
+% I thank those that have answered my questions on forums pertaining to \LaTeX3. See here: \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
+% and here: \url{https://latex.org/forum/memberlist.php?mode=viewprofile&u=61329}
+%
+% ^^A \section{Change history}
+% ^^A TODO Bring the change history under this section
+% ^^A The versions showns are of those of the development stage, some may have been skipped in the release.
+% ^^A \iffalse
+% ^^A : changes
+% ^^A \fi
+%
+% \changes{0.1}{2018/05/20}{Initial version}
+% \changes{0.1.1}{2018/05/23}{}
+% \changes{0.1.1}{2018/05/23}{Brought all the modules under one file; renamed \pkg{l3erw} to \pkg{erw-l3};}
+% \changes{0.1.1}{2018/05/23}{\pkg{disambig}/backend: changes to the key, added \cs{ProcessPackageKeysOption};}
+% \changes{0.1.1}{2018/05/23}{\cs{numbrdcsnew} changed to \cs{newnumbrdcs} and made 'disambiguable'}
+% \changes{0.1.2}{2018/06/21}{}
+% \changes{0.1.2}{2018/06/21}{\cs{erw_compose} reversed order in which the functions are composed, such that it now conforms to
+% the mathematical convention ($g\circ f$ means $f$ comes before $g$)}
+%\changes{0.1.2}{2018/06/21}{Front end cmds no longer generated with module \pkg{disambig}; Option of the same name deleted;}
+%\changes{0.1.2}{2018/06/21}{\pkg{disambig}: pushed the code inside \cs{keys_define};\cs{disambignewcmd} no longer takes a token name as arg, rather a token.}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_repeat}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_split}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_last_item}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{erw_items_to}}
+%\changes{0.1.2}{2018/06/21}{Added \cs{map_thread}}
+%\changes{0.1.2}{2018/06/21}{Re-arranged the doc to clearly separate frontend from backend}
+%\changes{0.1.3}{2018/06/22}{Wrong versioning, should have been 0.1.2}
+%\changes{0.1.4}{2018/06/22}{}
+%\changes{0.1.4}{2018/06/22}{Removed \cs{erw_items_to} (redundant with \cs{tl_range:nnn})}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_accum}}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_merge}}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_int_range}}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map}}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_set_map_inline}}
+%\changes{0.1.4}{2018/06/22}{Added \cs{erw_is_matrix}}
+%\changes{0.1.5}{2019/12/12}{Modified source repository}
+%\changes{0.1.5}{2019/12/12}{Rearranged frontend/backend sections}
+%\changes{0.1.5}{2019/12/12}{Split Section Preliminaries into Conventions and Requirement.}
+%\changes{0.1.5}{2019/12/12}{Removed \pkg{disambig}}
+%
+% % \begin{thebibliography}{1}
+%
+% ^^A\bibitem{expl3} The \LaTeX3 Project Team {\em The \pkg{expl3} package and \LaTeX3 programming}
+% ^^A\url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/expl3.pdf}
+%
+% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
+%
+% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
+%
+% ^^A \bibitem{l3pckg} The \LaTeX3 Project Team {\em l3packages} \url{http://mirror.ctan.org/macros/latex/contrib/l3packages/}
+%
+% ^^A \bibitem{tex.stack:431046} \url{https://tex.stackexchange.com/questions/431046/calling-expl3s-usec-on-an-expression-expanding-to-a-cs-name-causes-error}
+%
+% ^^A \bibitem{tex.stack:432171} \url{https://tex.stackexchange.com/questions/432171/expl3-making-arguments-from-a-loop}
+%
+% \end{thebibliography}
%
%
% \iffalse
diff --git a/macros/latex/contrib/erw-l3/erw-l3.ins b/macros/latex/contrib/erw-l3/erw-l3.ins
new file mode 100644
index 0000000000..9ce820375b
--- /dev/null
+++ b/macros/latex/contrib/erw-l3/erw-l3.ins
@@ -0,0 +1,68 @@
+%%
+%% This is file `erw-l3.ins',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% erw-l3.dtx (with options: `install')
+%% ----------------------------------------------------------------
+%% erw-l3 Utilities built around expl3
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%%
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------
+erw-l3 Utilities built around expl3
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2018 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file erw-l3.dtx
+and the derived files erw-l3.ins,
+ erw-l3.pdf and
+ erw-l3.sty.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+\endbatchfile
+%%
+%% Copyright (C) 2018 by Erwann Rogard
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Erwann Rogard.
+%%
+%% This work consists of the file erw-l3.dtx
+%% and the derived files erw-l3.ins,
+%% erw-l3.pdf and
+%% erw-l3.sty.
+%%
+%%
+%% End of file `erw-l3.ins'.
diff --git a/macros/latex/contrib/erw-l3/erw-l3.pdf b/macros/latex/contrib/erw-l3/erw-l3.pdf
index ef0725e710..c9c9dc788d 100644
--- a/macros/latex/contrib/erw-l3/erw-l3.pdf
+++ b/macros/latex/contrib/erw-l3/erw-l3.pdf
Binary files differ
diff --git a/macros/xetex/latex/parsa/IntLogo.png b/macros/xetex/latex/parsa/IntLogo.png
new file mode 100644
index 0000000000..8061fac985
--- /dev/null
+++ b/macros/xetex/latex/parsa/IntLogo.png
Binary files differ
diff --git a/macros/xetex/latex/parsa/IranLogo.png b/macros/xetex/latex/parsa/IranLogo.png
new file mode 100644
index 0000000000..9cb939712d
--- /dev/null
+++ b/macros/xetex/latex/parsa/IranLogo.png
Binary files differ
diff --git a/macros/xetex/latex/parsa/README.txt b/macros/xetex/latex/parsa/README.txt
new file mode 100644
index 0000000000..3eb021157e
--- /dev/null
+++ b/macros/xetex/latex/parsa/README.txt
@@ -0,0 +1,27 @@
+____________________
+The Parsa package
+v1
+
+While time is limited, preparing thesis and dissertations take a lot of time for editing required forms.
+This package will help you to prepare the forms you need most easily and as soon as possible
+
+If you want to report any bugs or typos and corrections in the
+documentation, please use the issue tracker:
+
+ <https://github.com/farshadrasuli/parsa>
+
+In doing so, please always explain your issue well enough, and always
+include a minimal working example showing the issue.
+
+Current version release date: 2019/12/12
+______________
+Farshad Rasuli
+
+Copyright (c) 2019
+Distributed under the LaTeX Project Public License
+It may be distributed and/or modified under the LaTeX Project Public License,
+version 1.3c or higher (your choice). The latest version of
+this license is at: http://www.latex-project.org/lppl.txt
+
+This work is “author-maintained” (as per LPPL maintenance status)
+by Farshad Rasuli. \ No newline at end of file
diff --git a/macros/xetex/latex/parsa/parsa-doc.pdf b/macros/xetex/latex/parsa/parsa-doc.pdf
new file mode 100644
index 0000000000..a990bb173e
--- /dev/null
+++ b/macros/xetex/latex/parsa/parsa-doc.pdf
Binary files differ
diff --git a/macros/xetex/latex/parsa/parsa-doc.tex b/macros/xetex/latex/parsa/parsa-doc.tex
new file mode 100644
index 0000000000..8c01b00ce9
--- /dev/null
+++ b/macros/xetex/latex/parsa/parsa-doc.tex
@@ -0,0 +1,496 @@
+\documentclass[12pt,a4paper,twoside,fleqn,notitlepage,openany]{extbook}
+
+\usepackage[
+papersize={210mm,297mm},% Specify the paper dimensions
+layoutsize={210mm,297mm}, layouthoffset=0cm, layoutvoffset=0cm, % Specify the dimensions of the layout and it's horizontal and vertical distance from the beginning of the paper.
+%showcrop, % Uncomment to see the layout boundaries
+top=2.4cm, includehead, % Margin from top to top of the header
+bottom=3.2cm, heightrounded, % Margin from Bottom
+bindingoffset=10mm, % Binding margin
+inner=21mm, outer=31mm, % The inner/outer edge of the layout (inner:outer ratio in two-side is 1:1.5)
+marginparwidth=0cm, marginparsep=3mm, % Specify the border width and distance from the bottom of the body of the text. (These marginal notes are placed inside the outer margin of the layout.)
+%columnsep=1cm % Adjust separation between columns in two column mode.
+%showframe, % This option is for drawing a border around the textbody.
+]{geometry}
+
+\usepackage{hyperref}
+\usepackage{fancyhdr}
+\usepackage[perpage]{footmisc}
+\usepackage{float}
+\usepackage{adjustbox}
+\usepackage{pdfpages}
+\usepackage{parsa}
+\usepackage[localise,fontsloadable]{xepersian}
+\settextfont{IRZar}
+\setlatintextfont{Linux Libertine}
+\defpersianfont\ParsaHeaderFont{IRNazanin}
+
+\fancypagestyle{plain}{\fancyhf{}\fancyfoot[OL,ER]{\thepage}\renewcommand{\headrulewidth}{0pt}}
+
+\SepMark{-}
+
+
+%----------------------------------------------------------------------------------------
+% THESIS/DISSERTATION INFORMATION STARTS FROM HERE:
+%
+
+% --- Institute's Information
+\InstituteLogo{IranLogo}{IntLogo}[30mm][30mm] % {<Iranian logo>}{<International logo>}[<width>][<height>}
+\Institute{(نام مؤسسه)}{(Institute's Name)} % {<persian>}{<latin>}
+\Faculty{(نام دانش‌کده)}{(faculty of ...)} % {<persian>}{<latin>}
+\Department{(نام گروه)}{(Department of ...)} % {<persian>}{<latin>}
+
+% --- Student's Information
+\StudentName{(نام دانشجو)}{(Student's Name)} % {<persian>}{<latin>}
+\StudentMajor{(رشته)}{(Major Discipline)} % {<persian>}{<latin>}
+\StudentMinor{(گرایش)}{(Minor Discipline)} % {<persian>}{<latin>}
+\StudentDegree{کارشناسی‌ارشد}{(Master)} % {<persian>}{<latin>}
+\StudentID{(9876543210)} % {<national ID>}
+\StudentNumber{(0123456789)}
+\StudentEMAIL{(sample@site.com)}
+
+% --- Thesis/Dissertation's Information
+\ParsaTitle{(عنوان): (زیرعنوان)}{(Title): (Subtitle)} % {<persian>}{<latin>}
+\ParsaCompilationDate{(آذر ۱۳۹۸)}{(December, 2019)} % {<persian date>}{<latin date>}
+\ParsaExamDate{(1398/09/21)}{(2019/12/12)} % {<persian date>}{<latin date>}
+
+% --- Members of Committee's Informtion
+\SupervisorName{(نام استاد راهنما)}{(Supervisor's Name)} % {<persian>}{<latin>}
+\SupervisorTitle{(استاد)}{(Professor)} % {<persian>}{<latin>}
+\SupervisorAffiliation{(نام مؤسسه)}{(Institute's Name)} % {<persian>}{<latin>}
+\SupervisorID{(9876543210)} %{<national ID>}
+\SupervisorEMAIL{(example@institute.edu)}
+
+\SecondSupervisorName{(نام استاد راهنمای دوم)}{(Second Supervisor's Name)} % {<persian>}{<latin>}
+\SecondSupervisorTitle{(دانشیار)}{(Associated Professor)} % {<persian>}{<latin>}
+%\SecondSupervisorAffiliation{}{} % {<persian>}{<latin>}
+%\SecondSupervisorID{} % {<national ID>}
+%\SecondSupervisorEMAIL{}
+
+\CosupervisorName{(نام استاد مشاور اول)}{(First Co-superviser's Name)} % {<persian>}{<latin>}
+\CosupervisorTitle{(استادیار)}{(Assistant Prosessor)} % {<persian>}{<latin>}
+%\CosupervisorAffiliation{}{} % {<persian>}{<latin>}
+%\CosupervisorID{} % {<national ID>}
+%\CosupervisorEMAIL{}
+
+\SecondCosupervisorName{(نام استاد مشاور دوم)}{(Second Co-supervisor's Name)} % {<persian>}{<latin>}
+%\SecondCosupervisorTitle{}{} % {<persian>}{<latin>}
+%\SecondCosupervisorAffiliation{}{} % {<persian>}{<latin>}
+%\SecondCosupervisorID{} % {<national ID>}
+%\SecondCosupervisorEMAIL{}
+
+\FirstExaminerName{(نام استاد داور)}{~} % {<persian>}{<latin>}
+%\FirstExaminerTitle{}{} % {<persian>}{<latin>}
+%\FirstExaminerAffiliation{}{} % {<persian>}{<latin>}
+%\FirstExaminerID{} % {<national ID>}
+%\FirstExaminerEMAIL{}
+
+\SecondExaminerName{(نام استاد داور)}{~} % {<persian>}{<latin>}
+%\SecondExaminerTitle{}{} % {<persian>}{<latin>}
+%\SecondExaminerAffiliation{}{} % {<persian>}{<latin>}
+%\SecondExaminerID{} % {<national ID>}
+%\SecondExaminerEMAIL{}
+
+\ThirdExaminerName{(نام استاد داور)}{} % {<persian>}{<latin>}
+%\ThirdExaminerTitle{}{} % {<persian>}{<latin>}
+%\ThirdExaminerAffiliation{}{} % {<persian>}{<latin>}
+%\ThirdExaminerID{} % {<national ID>}
+%\ThirdExaminerEMAIL{}
+
+\RepresentativeName{(نام نماینده تحصیلات تکمیلی)}{(The representative's name)} % {<persian>}{<latin>}
+%\RepresentativeID{} % {<national ID>}
+%\RepresentativeEMAIL{}
+
+%
+% THESIS/DISSERTATION INFORMATION ENDED.
+%----------------------------------------------------------------------------------------
+
+
+
+\begin{document}
+\pagestyle{plain}
+\عنوان{بسته‌ی پارسا}
+\نویسنده{فرشاد رسولی \thanks{\href{https://github.com/farshadrasuli/parsa}{\lr{github.com/farshadrasuli/parsa}}}}
+\تاریخ{1398/09/21 - \lr{December 12, 2019}}
+\عنوان‌ساز
+\begin{center}
+\begin{minipage}{0.67\textwidth}
+تألیف پایان‌نامه و رساله، چهارچوب از پیش تعیین شده‌ای مانند چگونگی درج سربرگ، ساخت و تکمیل فرم‌های مربوطه و تدوین عناصر مختلف دارد\@. این بسته با هدف تولید فرم‌های مورد نیاز، به منطور تسریع فرآیند تألیف پایان‌نامه و رساله، توسط دانشجو-پژوهش‌گر تهیه شده‌است\@. \\
+امیدوارم با استفاده از این بسته، در مدت زمان تهیه‌ی پایان‌نامه و رساله، صرفه‌جویی کافی حاصل شود و به جای صرف وقت به ویرایش پایان‌نامه، زمان بیشتری به مسائل پژوهشی اختصاص یابد\@.
+\end{minipage}
+\end{center}
+%\tableofcontents
+\section*{سپاس‌گزاری}
+\addcontentsline{toc}{section}{سپاس‌گزاری}
+از جناب آقای \موکد{وفا کارن‌پهلو} بابت تهیه و توسعه‌ی بسته‌ی \موکد{زی‌پرشین} سپاس‌گزاری می‌کنم و برای ایشان آرزوی سلامتی و سعادت دارم\@. کار بی‌نظیر ایشان در تهیه‌ی بسته‌ی زی‌پرشین، الهام بخش تهیه‌ی بسته‌ی \موکد{پارسا} بوده‌است.
+
+\section{شروع کار}
+با استفاده از فرمان
+\[\textrm{\lr{\texttt{$\backslash$usepackage[\textrm{<options>}]\{parsa\}}}}\]
+بسته‌ی پارسا فعال می‌شود\@. برای گزینه‌های این بسته، \متن‌لاتین{[\emph{<options>}]}، قسمت (\رجوع{ParsaInf}) را ببینید.\\
+سپس بسته‌ی \XePersian ~را فعال کنید\@.
+\[ \textrm{ \lr{ \texttt{$\backslash$usepackage\{xepersian\}} } } \]
+قلم اصلی متن را با فرمان
+\[ \textrm{ \lr{ \texttt{$\backslash$settextfont\{\textrm{<font>}\} } } } \]
+و قلم سربرگ را با فرمان
+\[ \textrm{ \lr{ \texttt{$\backslash$defpersianfont$\backslash$ParsaHeaderFont\{\textrm{<font>}\} } } } \]
+تعیین کنید\@. توصیه می‌شود برای قلم اصلی، از قلم زر \زیرنویس{توسعه‌دهندگان مختلف، نسخه‌های متفاوتی از قلم زر با نام‌های \متن‌لاتین{B Zar}،\متن‌لاتین{XB Zar} و \متن‌لاتین{IRZar} ~منتشر کرده‌اند که استفاده از \متن‌لاتین{IRZar} ~توصیه می‌شود.} و برای قلم سربرگ، از قلم نازنین \زیرنویس{از بین نسخه‌های متفاوت قلم نازنین با نام‌های \متن‌لاتین{B Nazanin}، \متن‌لاتین{XB Nazanin} و \متن‌لاتین{IRNazanin} ~استفاده از \متن‌لاتین{IRNazanin} ~توصیه می‌شود.} استفاده کنید\@.
+
+\section{ورود اطلاعات}
+برای وارد کردن اطلاعات پایان‌نامه (یا رساله)، فرمان مد نظر خود را، مطابق دستورات شرح داده‌شده، در قسمت سرآغاز \زیرنویس{\متن‌لاتین{preamble}}~وارد کنید.
+\زیرقسمت{اطلاعات مؤسسه}
+نام مؤسسه‌ی محل تحصیل خود را با فرمان
+\[ \textrm{ \lr{ \texttt{$\backslash$Institute\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وارد کنید. دقت شود که آرگومان اول، \{\emph{<persian>}\}، برای ورود اطلاعات به زبان پارسی و آرگومان دوم، \{\emph{<persian>}\}، برای ورود اطلاعات به لاتین درنظر گرفته شده است. این اصل برای تمام فرمان‌های این بسته که دو آرگومان دارند رعایت شده است\@. به همین صورت، برای سایر اطلاعات از فرمان‌ها به شرح زیر استفاده کنید\@. \\
+نشان مؤسسه:
+\[ \textrm{ \lr{ \texttt{$\backslash$InstituteLogo\{\textrm{<Iranian logo>}\}\{\textrm{<International logo>}\}[\textrm{<width>}][\textrm{<height>}]} } } \]
+با آرگومان‌های اختیاری، پهنا و بلندای نشان مؤسسه را در صفحه‌ی عنوان تنظیم کنید. مقدار پیش‌فرض ۳۰×۳۰ میلی‌متر است\@. \\
+نام دانش‌کده یا پژوهش‌کده:
+\[ \textrm{ \lr{ \texttt{$\backslash$Faculty\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+نام گروه:
+\[ \textrm{ \lr{ \texttt{$\backslash$Department\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+\subsection{اطلاعات نگارنده}
+برای وارد کردن اطلاعات نگارنده، از فرمان‌های زیر استفاده کنید\@. چنان‌چه قصد دارید که یکی از دو آرگومان فرمانی را خالی بگذارید، کافی‌است از نشانه‌ی مد ($\sim$) استفاده کنید\@. \\
+نام کامل نگارنده‌ی اثر:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+رشته‌ی تحصیلی:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentMajor\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+گرایش تحصیلی:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentMinor\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+مقطع تحصیلی:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentDegree\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentID\{\textrm{<national ID number>}\}} } } \]
+شماره دانشجویی:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentNumber\{\textrm{<Student Number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$StudentEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات سند} \label{ParsaInf}
+باید نوع سندی که قصد تهیه‌‌ی آن را دارید، از آن جهت که پایان‌نامه است یا رساله، مشخص کنید\@. هنگام فراخوانی بسته‌ی پارسا، امکان استفاده از گزینه‌ی \متن‌لاتین{\متن‌تایپ{thesis}} ~یا \متن‌لاتین{\متن‌تایپ{dissertation}} ~وجود دارد که گزینه‌ی \متن‌لاتین{\متن‌تایپ{thesis}} ~نوع سند را پایان‌نامه و گزینه‌ی \متن‌لاتین{\متن‌تایپ{dissertation}} ~نوع سند را رساله تعیین می‌کند. چنان‌چه از این گزینه‌ها استفاده نکردید، می‌توانید با فرمان
+\[ \textrm{ \lr{ \texttt{$\backslash$ParsaTarget\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+نوع سند خود را مشخص کنید\@. برای سایر اطلاعات سند، از فرمان‌های زیر استفاده کنید\@. \\
+عنوان سند:
+\[ \textrm{ \lr{ \texttt{$\backslash$ParsaTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+تاریخ تدوین که در صفحه‌ی عنوان درج می‌شود (به صورت ماه و سال وارد شود):
+\[ \textrm{ \lr{ \texttt{$\backslash$ParsaCompilationDate\{\textrm{<persian date>}\}\{\textrm{<International date>}\}} } } \]
+تاریخ دقیق دفاع از پایان‌نامه یا رساله:
+\[ \textrm{ \lr{ \texttt{$\backslash$ParsaExamDate\{\textrm{<persian date>}\}\{\textrm{<International date>}\}} } } \]
+\subsection{اطلاعات استاد راهنما} \label{SupInf}
+اطلاعات استاد راهنما را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد راهنما:
+\[ \textrm{ \lr{ \texttt{$\backslash$SupervisorName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SupervisorTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SupervisorAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SupervisorID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$SupervisorEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد راهنمای دوم}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد راهنمای دوم -در صورت وجود- را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد راهنمای دوم:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondSupervisorName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondSupervisorTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondSupervisorAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondSupervisorID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondSupervisorEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد مشاور}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد مشاور -در صورت وجود- را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد مشاور:
+\[ \textrm{ \lr{ \texttt{$\backslash$CosupervisorName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$CosupervisorTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$CosupervisorAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$CosupervisorID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$CosupervisorEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد مشاور دوم}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد مشاور دوم -در صورت وجود- را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد مشاور دوم:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondCosupervisorName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondCosupervisorTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondCosupervisorAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondCosupervisorID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondCosupervisorEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد داور اول}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد داور اول را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد داور اول:
+\[ \textrm{ \lr{ \texttt{$\backslash$FirstExaminerName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$FirstExaminerTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$FirstExaminerAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$FirstExaminerID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$FirstExaminerEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد داور دوم}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد داور دوم -در صورت وجود- را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد داور دوم:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondExaminerName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondExaminerTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondExaminerAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondExaminerID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$SecondExaminerEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات استاد داور سوم}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات استاد داور سوم -در صورت وجود- را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل استاد داور سوم:
+\[ \textrm{ \lr{ \texttt{$\backslash$ThirdExaminerName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+سمت یا مرتبه‌ی علمی:
+\[ \textrm{ \lr{ \texttt{$\backslash$ThirdExaminerTitle\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+وابستگی سازمانی:
+\[ \textrm{ \lr{ \texttt{$\backslash$ThirdExaminerAffiliation\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$ThirdExaminerID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$ThirdExaminerEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\subsection{اطلاعات نماینده‌ی تحصیلات تکمیلی}
+مشابه استاد راهنما، قسمت (\رجوع{SupInf})، اطلاعات نماینده‌ی تحصیلات تکمیلی را با فرمان‌های زیر وارد کنید\@. \\
+نام کامل نماینده‌ی تحصیلات تکمیلی:
+\[ \textrm{ \lr{ \texttt{$\backslash$RepresentativeName\{\textrm{<persian>}\}\{\textrm{<latin>}\}} } } \]
+شماره ملی:
+\[ \textrm{ \lr{ \texttt{$\backslash$RepresentativeID\{\textrm{<national ID number>}\}} } } \]
+رایانامه:
+\[ \textrm{ \lr{ \texttt{$\backslash$RepresentativeEMAIL\{\textrm{<sample@site.com>}\}} } } \]
+\section{ساخت فرم‌ها}
+پس از تکمیل اطلاعت لازم، با استفاده از فرمان‌های گفته‌شده، کار اصلی بسته‌ی پارسا آغاز می‌گردد\@. برای ساخت فرم‌های مدنظر، از دستورات زیر استفاده کنید.\\
+
+\begin{table}[H] \adjustbox{pagecenter}{
+\begin{tabular}{lr}
+\lr{\texttt{$\backslash$titlepageParsi}} & صفحه‌ی عنوان به فارسی \\
+\lr{\texttt{$\backslash$ParsaPicture}} & عکس سرآغاز \\
+\lr{\texttt{$\backslash$ParsaCredit}} & اصالت و مالکیت اثر \\
+\lr{\texttt{$\backslash$ExaminationReportPa}} & صورت جلسه‌ی دفاع به فارسی \\
+\lr{\texttt{$\backslash$ParsaCopyleft}} & مجوز بهره‌برداری \\
+\lr{\texttt{$\backslash$ParsaDedicate\{\rl{تقدیم به...}\}}} & تقدیم \\
+\lr{\texttt{$\backslash$ExaminationReportLa}} & صورت جلسه‌ی دفاع به انگلیسی \\
+\lr{\texttt{$\backslash$titlepageLatin}} & صفحه عنوان به انگلیسی
+\end{tabular} }
+\end{table}
+
+توجه کنید که فقط فرمان تقدیم، \textrm{\lr{\texttt{$\backslash$ParsaDedicate}}}~، به آرگومان نیاز دارد\@. متن تقدیم خود را در آرگومان این فرمان بنویسید\@. \بند
+\پاراگراف{}برای نوشتن چکیده‌ی پایان‌نامه یا رساله، به زبان فارسی از محیط \متن‌لاتین{\متن‌تایپ{ParsaAbstractParsi}}~، و برای چکیده به لاتین از محیط \متن‌لاتین{\متن‌تایپ{ParsaAbstractLatin}} استفاده کنید\@. \\
+\begin{latin}
+\begin{minipage}{0.48\textwidth}
+\begin{verbatim}
+\begin{ParsaAbstractParsi}
+
+\end{ParsaAbstractParsi}
+\end{verbatim}
+\end{minipage}
+\begin{minipage}{0.48\textwidth}
+\begin{verbatim}
+\begin{ParsaAbstractParsi}
+
+\end{ParsaAbstractParsi}
+\end{verbatim}
+\end{minipage}
+\end{latin}
+
+\section{کدهای آماده}
+کدهای زیر برای استفاده در \LaTeX ~برای شما آماده شده‌است. برای استفاده از هر کد، کافی‌است علامت درصد ابتدای هرخط را حذف کنید.
+\begin{latin}
+\begin{verbatim}
+\documentclass[a4paper,12pt,twoside]{book}
+
+\usepackage{parsa}
+\usepackage[fontsloadable]{xepersian}
+\settextfont{}
+\defpersianfont\ParsaHeaderFont{}
+
+%
+% THESIS/DISSERTATION INFORMATION STARTS FROM HERE:
+%
+
+% --- Institute's Information
+%\InstituteLogo{}{}[][]
+%\Institute{}{}
+%\Faculty{}{}
+%\Department{}{}
+
+% --- Student's Information
+%\StudentName{}{}
+%\StudentMajor{}{}
+%\StudentMinor{}{}
+%\StudentDegree{}{}
+%\StudentID{}
+%\StudentNumber{}
+%StudentEMAIL{}
+
+% --- Thesis/Dissertation's Information
+%\ParsaTitle{}{} % {<persian>}{<latin>}
+%\ParsaCompilationDate{}{} % {<persian date>}{<latin date>}
+%\ParsaExamDate{}{} % {<persian date>}{<latin date>}
+
+% --- Members of The Committee's Informtion
+%\SupervisorName{}{}
+%\SupervisorTitle{}{}
+%\SupervisorAffiliation{}{}
+%\SupervisorID{}
+%\SupervisorEMAIL{}
+
+%\SecondSupervisorName{}{}
+%\SecondSupervisorTitle{}{}
+%\SecondSupervisorAffiliation{}{}
+%\SecondSupervisorID{}
+%\SecondSupervisorEMAIL{}
+
+%\CosupervisorName{}{}
+%\CosupervisorTitle{}{}
+%\CosupervisorAffiliation{}{}
+%\CosupervisorID{}
+%\CosupervisorEMAIL{}
+
+%\SecondCosupervisorName{}{}
+%\SecondCosupervisorTitle{}{}
+%\SecondCosupervisorAffiliation{}{} %
+%\SecondCosupervisorID{}
+%\SecondCosupervisorEMAIL{}
+
+%\FirstExaminerName{}{}
+%\FirstExaminerTitle{}{}
+%\FirstExaminerAffiliation{}{}
+%\FirstExaminerID{}
+%\FirstExaminerEMAIL{}
+
+%\SecondExaminerName{}{}
+%\SecondExaminerTitle{}{}
+%\SecondExaminerAffiliation{}{}
+%\SecondExaminerID{}
+%\SecondExaminerEMAIL{}
+
+%\ThirdExaminerName{}{}
+%\ThirdExaminerTitle{}{}
+%\ThirdExaminerAffiliation{}{}
+%\ThirdExaminerID{}
+%\ThirdExaminerEMAIL{}
+
+%\RepresentativeName{}{}
+%\RepresentativeID{}
+%\RepresentativeEMAIL{}
+
+
+\begin{document}
+
+\titlepageParsi
+\newpage
+
+%-----------------------------------------------
+% PERSIAN ABSTRACT STARTS FROME HERE:
+%
+\begin{ParsaAbstractParsi}
+
+\end{ParsaAbstractParsi}
+%
+% PERSIAN ABSTRACT ENDED.
+%-----------------------------------------------
+
+\ParsaPicture{}
+
+\ParsaCredit
+\newpage
+
+\ExaminationReportPa
+\newpage
+
+\ParsaCopyleft
+\newpage
+
+\ParsaDedicate{}
+
+\begin{ParsaAcknowledge}
+
+\end{ParsaAcknowledge}
+\newpage
+
+\begin{ParsaCV}
+
+\end{ParsaCV}
+
+\ExaminationReportLa
+\newpage
+
+%-----------------------------------------------
+% LATIN ABSTRACT STARTS FROME HERE:
+%
+\begin{ParsaAbstractLatin}
+
+\end{ParsaAbstractLatin}
+%
+% LATIN ABSTRACT ENDED.
+%-----------------------------------------------
+
+\titlepageLatin
+
+\end{document}
+\end{verbatim}
+\end{latin}
+
+\section{نمونه پایان‌نامه}
+در صفحات بعدی، نمونه‌ای از پایان نامه‌ی انجام‌شده به کمک بسته‌ی پارسا قرار گرفته‌است. \\
+\newpage
+
+\titlepageParsi
+\newpage
+%----------------------------------------------------------------------------------------
+% PERSIAN ABSTRACT STARTS FROME HERE:
+%
+\begin{ParsaAbstractParsi}
+چکیده شامل خلاصه‌ای از هدف یا مسأله‌ی پژوهش، روش‌شناسی، نتایج و تفسیر می‌باشد که خواننده با مطالعه‌ی آن از محتوای پژوهش آگاه می‌شود. در چکیده از اشاره به تاریخچه، تفصیل اقوال، توصیف تکنیک‌ها، فصل بندی، ذکر منابع و آوردن فرمول‌ها، نمودارها و جداول پرهیز شود. متن چکیده حداکثر دارای سی‌صد کلمه باشد و در یک صفحه و در یک پاراگراف نوشته شود. همچنین واژگان کلیدی در یک سطر جداگانه درج می‌شود و تعداد آن بین پنح تا هشت کلمه است. \بند \bigskip
+
+\متن‌سیاه{کلمات کلیدی:} پایان‌نامه، رساله، شیوه‌نامه، قالب آماده، زی‌پرشین، پارسا
+\end{ParsaAbstractParsi}
+%
+% PERSIAN ABSTRACT ENDED.
+%----------------------------------------------------------------------------------------
+\ParsaPicture{picture}
+
+\ParsaCredit
+\newpage
+
+\ExaminationReportPa
+\newpage
+
+\ParsaCopyleft
+\newpage
+
+\ParsaDedicate{تقدیم به ...}
+
+\begin{ParsaAcknowledge}
+متن سپاس‌گذاری...
+\end{ParsaAcknowledge}
+\newpage
+
+
+\chapter{فصل نمونه}
+محتوای اصلی نوشتار از اینجا آغاز می‌شود...
+
+\pagestyle{empty}
+
+\begin{ParsaCV}
+کارنامک، شمایی کوتاه از کارهای علمی و درجه‌های تحصیلی دانش‌آموخته را نشان می‌دهد و بهتر است به زبان سوم شخص (غایب) نوشته شود. این بخش برای دانش‌آموختگان کارشناسی ارشد، اختیاری و برای دانش‌آموختگان دکترا الزامی است. برای کسانی که پارسا را به زبانی به‌جز فارسی می‌نویسند این کارنامک نیز باید به همان زبان نوشته شود. نمونه‌ای از این کارنامک در ادامه نوشته شده است. \\
+
+رضا تهرانی دانش‌آموخته‌ی دکترای تخصصی رشته‌ی زبان و ادبیات فارسی از دانشگاه ایران در گرایش نگارش علمی در سال ۱۳۹۶ است. او در سال ۱۳۹۰ کارشناسی ارشد خود را از دانشگاه ایران در رشته‌ی تاریخ ادبیات گرایش نگارش در نوشتار علمی و کارشناسی خود را در سال ۱۳۸۷ از دانشگاه ایران در رشته‌ی تاریخ ادبیات دریافت کرد. زمینه‌های پژوهش او نوشتارهای علمی، تاریخ ادبیات و ویرایش تخصصی است. \\
+\end{ParsaCV}
+
+\ExaminationReportLa
+\newpage
+
+\titlepageLatin
+
+\end{document}
diff --git a/macros/xetex/latex/parsa/parsa.sty b/macros/xetex/latex/parsa/parsa.sty
new file mode 100644
index 0000000000..f1e7678b9e
--- /dev/null
+++ b/macros/xetex/latex/parsa/parsa.sty
@@ -0,0 +1,712 @@
+%%
+%% This is file `parsa.sty',
+%%
+%% __________________________________________________
+%% Copyright (c) 2019 Farshad Rasuli
+%%
+%% It may be distributed and/or modified under the LaTeX Project Public License,
+%% version 1.3c or higher (your choice). The latest version of
+%% this license is at: http://www.latex-project.org/lppl.txt
+%%
+%% This work is “author-maintained” (as per LPPL maintenance status)
+%% by Farshad Rasuli.
+%%
+%% Location on CTAN: /macros/xetex/latex/parsa
+%%
+%% Issue tracker: http://github.com/farshadrasuli/parsa
+%%
+%%
+
+
+
+% --- Package structure: Identification
+\NeedsTeXFormat{LaTeX2e}
+\def\parsa@version{1}
+\def\parsadate{2019/12/12}
+\ProvidesPackage{parsa}[\parsadate\space v\parsa@version\space
+A useful assistant for making your thesis and dissertation for Iranian Universities]
+\edef\@parsa@info{****************************************************^^J%
+* ^^J%
+* parsa package (A useful assistant for making your thesis and dissertation for Iranian universities)^^J%
+* ^^J%
+* Description: The package designed for^^J%
+* thesis/dissertation typography.^^J%
+* ^^J%
+* Copyright (c) 2019 Farshad Rasuli^^J%
+* ^^J%
+* v\parsa@version, \parsadate^^J%
+* ^^J%
+* License: LaTeX Project Public License, version^^J%
+* 1.3c or higher (your choice)^^J%
+* ^^J%
+* Location on CTAN: /macros/xetex/latex/parsa^^J%
+* ^^J%
+* Issue tracker: http://github.com/farshadrasuli/parsa^^J%
+* ^^J%
+****************************************************}
+
+% --- Package structure: Options
+\newcommand{\ParsaTargetPa}{~} \newcommand{\ParsaTargetLa}{~}
+\newcommand{\ParsaTypePa}{~} \newcommand{\ParsaTypeLa}{~}
+\DeclareOption{thesis}{%
+\renewcommand{\ParsaTargetPa}{پایان نامه \\ برای دریافت درجه‌ی کارشناسی‌ارشد}%
+\renewcommand{\ParsaTargetLa}{A Thesis \\ submitted in fulfillment of the requirements
+for Master's degree}%
+\renewcommand{\ParsaTypePa}{پایان‌نامه}\renewcommand{\ParsaTypeLa}{Thesis}}
+
+\DeclareOption{dissertation}{%
+\renewcommand{\ParsaTargetPa}{رساله \\ برای دریافت درجه‌ی دکتری}%
+\renewcommand{\ParsaTargetLa}{A Dissertation \\ submitted in fulfillment of the requirements
+for Doctoral degree}%
+\renewcommand{\ParsaTypePa}{رساله}\renewcommand{\ParsaTypeLa}{Dissertation}}
+
+\ProcessOptions\relax
+
+% --- Package structure: Preliminary declarations
+
+\RequirePackage{xparse}
+\RequirePackage{fancyhdr}
+\RequirePackage{graphicx}
+\RequirePackage{multirow}
+\RequirePackage{float}
+\RequirePackage{adjustbox}
+
+
+% --- Package structure: More declarations
+
+% PAGE STYLE
+\fancypagestyle{plain}{\fancyhf{}\fancyfoot[OL,ER]{\ParsaHeaderFont \thepage}\renewcommand{\headrulewidth}{0pt}}
+
+\fancypagestyle{headings}{\fancyhf{}\fancyhead[OL,ER]{\ParsaHeaderFont \thepage}\fancyhead[OR]{\ParsaHeaderFont \rightmark}\fancyhead[EL]{\ParsaHeaderFont \leftmark}\renewcommand{\headrulewidth}{0.3pt}}
+
+% Create [This Page Intentionally Left Blank] by \cleardoublepage
+\newcommand*{\blankpage}{%
+\vspace*{\fill}
+{\centering ~\par}
+\vspace{\fill}}
+\makeatletter
+\renewcommand*{\cleardoublepage}{\clearpage\if@twoside \ifodd\c@page\else
+\blankpage
+\thispagestyle{empty}
+\newpage
+\if@twocolumn\hbox{}\newpage\fi\fi\fi}
+\makeatother
+
+% Commands
+\newcommand{\InstituteLogoPa}{~} \newcommand{\InstituteLogoLa}{~} \newcommand{\InstituteLogoPaSmall}{~} \newcommand{\InstituteLogoLaSmall}{~}
+\NewDocumentCommand{\InstituteLogo}{m m O{3cm} O{3cm}}{\renewcommand{\InstituteLogoPa}{\includegraphics[width=#3,height=#4]{#1}}\renewcommand{\InstituteLogoLa}{\includegraphics[width=#3,height=#4]{#2}}\renewcommand{\InstituteLogoPaSmall}{\includegraphics[width=1.6cm,height=1.6cm]{#1}}\renewcommand{\InstituteLogoLaSmall}{\includegraphics[width=1.6cm,height=1.6cm]{#2}}}
+
+\newcommand{\InstitutePa}{~} \newcommand{\InstituteLa}{~}
+\NewDocumentCommand{\Institute}{m m}{\renewcommand{\InstitutePa}{#1} \renewcommand{\InstituteLa}{#2}}
+
+\newcommand{\FacultyPa}{~} \newcommand{\FacultyLa}{~}
+\NewDocumentCommand{\Faculty}{m m}{\renewcommand{\FacultyPa}{#1} \renewcommand{\FacultyLa}{#2}}
+
+\newcommand{\DepartmentPa}{~} \newcommand{\DepartmentLa}{~}
+\NewDocumentCommand{\Department}{m m}{\renewcommand{\DepartmentPa}{#1}\renewcommand{\DepartmentLa}{#2}}
+
+\newcommand{\captiononePa}{~} \newcommand{\captiononeLa}{~}
+\newcommand{\StudentNamePa}{~} \newcommand{\StudentNameLa}{~}
+\NewDocumentCommand{\StudentName}{m m}{\renewcommand{\StudentNamePa}{#1} \renewcommand{\StudentNameLa}{#2}\renewcommand{\captiononePa}{نگارنده}\renewcommand{\captiononeLa}{by}}
+
+\newcommand{\StudentMajorPa}{~} \newcommand{\StudentMajorLa}{~}
+\NewDocumentCommand{\StudentMajor}{m m}{\renewcommand{\StudentMajorPa}{#1} \renewcommand{\StudentMajorLa}{#2}}
+
+\newcommand{\StudentMinorPa}{~} \newcommand{\StudentMinorLa}{~}
+\NewDocumentCommand{\StudentMinor}{m m}{\renewcommand{\StudentMinorPa}{#1} \renewcommand{\StudentMinorLa}{#2}}
+
+\newcommand{\StudentDegreePa}{~} \newcommand{\StudentDegreeLa}{~}
+\NewDocumentCommand{\StudentDegree}{m m}{\renewcommand{\StudentDegreePa}{#1} \renewcommand{\StudentDegreeLa}{#2}}
+
+\newcommand{\Studentid}{~}
+\NewDocumentCommand{\StudentID}{m}{\renewcommand{\Studentid}{#1}}
+
+\newcommand{\Studentnumber}{~}
+\NewDocumentCommand{\StudentNumber}{m}{\renewcommand{\Studentnumber}{#1}}
+
+\newcommand{\Studentemail}{~}
+\NewDocumentCommand{\StudentEMAIL}{m}{\renewcommand{\Studentemail}{#1}}
+
+\newcommand{\ParsaTitlePa}{~} \newcommand{\ParsaTitleLa}{~}
+\NewDocumentCommand{\ParsaTitle}{m m}{\renewcommand{\ParsaTitlePa}{#1} \renewcommand{\ParsaTitleLa}{#2}}
+
+\NewDocumentCommand{\ParsaTarget}{m m}{\renewcommand{\ParsaTargetPa}{#1} \renewcommand{\ParsaTargetLa}{#2}}
+
+\newcommand{\ParsaCompilationDatePa}{~} \newcommand{\ParsaCompilationDateLa}{~}
+\NewDocumentCommand{\ParsaCompilationDate}{m m}{\renewcommand{\ParsaCompilationDatePa}{#1} \renewcommand{\ParsaCompilationDateLa}{#2}}
+
+\newcommand{\ParsaExamDatePa}{~} \newcommand{\ParsaExamDateLa}{~}
+\NewDocumentCommand{\ParsaExamDate}{m m}{\renewcommand{\ParsaExamDatePa}{#1} \renewcommand{\ParsaExamDateLa}{#2}}
+
+\newcommand{\SupervisorNamePa}{~} \newcommand{\SupervisorNameLa}{~}
+\newcommand{\SupervisorTitlePa}{~} \newcommand{\SupervisorTitleLa}{~}
+\newcommand{\SupervisorAffiliationPa}{~} \newcommand{\SupervisorAffiliationLa}{~}
+\newcommand{\Supervisorid}{~}
+\newcommand{\Supervisoremail}{~}
+\newcommand{\captiontwoPa}{~} \newcommand{\captiontwoLa}{~}
+\newcommand{\SupervisorReportPa}{~} \newcommand{\SupervisorReportLa}{~}
+\NewDocumentCommand{\SupervisorName}{m m}{\renewcommand{\SupervisorNamePa}{#1}\renewcommand{\SupervisorNameLa}{#2}\renewcommand{\captiontwoPa}{استاد راهنما}\renewcommand{\captiontwoLa}{Supervisor}}\renewcommand{\SupervisorReportPa}{\noindent نام کامل استاد راهنما: ~\textbf{\SupervisorNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\SupervisorTitlePa} \\
+\textit{وابستگی سازمانی} \> \SupervisorAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \Supervisorid \\
+\textit{رایانامه سازمانی} \> \Supervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\SupervisorReportLa}{\noindent Supervisor:~\textbf{\SupervisorNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\SupervisorTitleLa} \\
+\textit{Affiliation} \> \SupervisorAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \Supervisorid \\
+\textit{Official E-Mail} \> \Supervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}
+
+\NewDocumentCommand{\SupervisorTitle}{m m}{\renewcommand{\SupervisorTitlePa}{#1}\renewcommand{\SupervisorTitleLa}{#2}}
+
+\NewDocumentCommand{\SupervisorAffiliation}{m m}{\renewcommand{\SupervisorAffiliationPa}{#1}\renewcommand{\SupervisorAffiliationLa}{#2}}
+
+\NewDocumentCommand{\SupervisorID}{m}{\renewcommand{\Supervisorid}{#1}}
+
+\NewDocumentCommand{\SupervisorEMAIL}{m}{\renewcommand{\Supervisoremail}{#1}}
+
+\newcommand{\SecondSupervisorNamePa}{~} \newcommand{\SecondSupervisorNameLa}{~}
+\newcommand{\SecondSupervisorTitlePa}{~} \newcommand{\SecondSupervisorTitleLa}{~}
+\newcommand{\SecondSupervisorAffiliationPa}{~} \newcommand{\SecondSupervisorAffiliationLa}{~}
+\newcommand{\SecondSupervisorid}{~}
+\newcommand{\SecondSupervisoremail}{~}
+\newcommand{\SecondSupervisorReportPa}{~} \newcommand{\SecondSupervisorReportLa}{~}
+\NewDocumentCommand{\SecondSupervisorName}{m m}{\renewcommand{\SecondSupervisorNamePa}{#1}\renewcommand{\SecondSupervisorNameLa}{#2}\renewcommand{\captiontwoPa}{استادان راهنما}\renewcommand{\captiontwoLa}{Supervisors}\renewcommand{\SecondSupervisorReportPa}{\noindent نام کامل استاد راهنمای دوم: ~\textbf{\SecondSupervisorNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\SecondSupervisorTitlePa} \\
+\textit{وابستگی سازمانی} \> \SecondSupervisorAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \SecondSupervisorid \\
+\textit{رایانامه سازمانی} \> \SecondSupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\SecondSupervisorReportLa}{\noindent 2nd Supervisor:~\textbf{\SecondSupervisorNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\SecondSupervisorTitleLa} \\
+\textit{Affiliation} \> \SecondSupervisorAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \SecondSupervisorid \\
+\textit{Official E-Mail} \> \SecondSupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\SecondSupervisorTitle}{m m}{\renewcommand{\SecondSupervisorTitlePa}{#1}\renewcommand{\SecondSupervisorTitleLa}{#2}}
+
+\NewDocumentCommand{\SecondSupervisorAffiliation}{m m}{\renewcommand{\SecondSupervisorAffiliationPa}{#1}\renewcommand{\SecondSupervisorAffiliationLa}{#2}}
+
+\NewDocumentCommand{\SecondSupervisorID}{m}{\renewcommand{\SecondSupervisorid}{#1}}
+
+\NewDocumentCommand{\SecondSupervisorEMAIL}{m}{\renewcommand{\SecondSupervisoremail}{#1}}
+
+\newcommand{\CosupervisorNamePa}{~} \newcommand{\CosupervisorNameLa}{~}
+\newcommand{\CosupervisorTitlePa}{~} \newcommand{\CosupervisorTitleLa}{~}
+\newcommand{\CosupervisorAffiliationPa}{~} \newcommand{\CosupervisorAffiliationLa}{~}
+\newcommand{\Cosupervisorid}{~}
+\newcommand{\Cosupervisoremail}{~}
+\newcommand{\captionthreePa}{~} \newcommand{\captionthreeLa}{~}
+\newcommand{\CosupervisorReportPa}{~} \newcommand{\CosupervisorReportLa}{~}
+\NewDocumentCommand{\CosupervisorName}{m m}{\renewcommand{\CosupervisorNamePa}{#1}\renewcommand{\CosupervisorNameLa}{#2}\renewcommand{\captionthreePa}{استاد مشاور}\renewcommand{\captionthreeLa}{Co-supervisor}\renewcommand{\CosupervisorReportPa}{\noindent نام کامل استاد مشاور: ~\textbf{\CosupervisorNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\CosupervisorTitlePa} \\
+\textit{وابستگی سازمانی} \> \CosupervisorAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \Cosupervisorid \\
+\textit{رایانامه سازمانی} \> \Cosupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\CosupervisorReportLa}{\noindent Co-supervisor:~\textbf{\CosupervisorNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\CosupervisorTitleLa} \\
+\textit{Affiliation} \> \CosupervisorAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \Cosupervisorid \\
+\textit{Official E-Mail} \> \Cosupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\CosupervisorTitle}{m m}{\renewcommand{\CosupervisorTitlePa}{#1}\renewcommand{\CosupervisorTitleLa}{#2}}
+
+\NewDocumentCommand{\CosupervisorAffiliation}{m m}{\renewcommand{\CosupervisorAffiliationPa}{#1}\renewcommand{\CosupervisorAffiliationLa}{#2}}
+
+\NewDocumentCommand{\CosupervisorID}{m}{\renewcommand{\Cosupervisorid}{#1}}
+
+\NewDocumentCommand{\CosupervisorEMAIL}{m}{\renewcommand{\Cosupervisoremail}{#1}}
+
+\newcommand{\SecondCosupervisorNamePa}{~} \newcommand{\SecondCosupervisorNameLa}{~}
+\newcommand{\SecondCosupervisorTitlePa}{~} \newcommand{\SecondCosupervisorTitleLa}{~}
+\newcommand{\SecondCosupervisorAffiliationPa}{~} \newcommand{\SecondCosupervisorAffiliationLa}{~}
+\newcommand{\SecondCosupervisorid}{~}
+\newcommand{\SecondCosupervisoremail}{~}
+\newcommand{\SecondCosupervisorReportPa}{~} \newcommand{\SecondCosupervisorReportLa}{~}
+\NewDocumentCommand{\SecondCosupervisorName}{m m}{\renewcommand{\SecondCosupervisorNamePa}{#1}\renewcommand{\SecondCosupervisorNameLa}{#2}\renewcommand{\captionthreePa}{استادان مشاور}\renewcommand{\captionthreeLa}{Co-supervisors}\renewcommand{\SecondCosupervisorReportPa}{\noindent نام کامل استاد مشاور دوم: ~\textbf{\SecondCosupervisorNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\SecondCosupervisorTitlePa} \\
+\textit{وابستگی سازمانی} \> \SecondCosupervisorAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \SecondCosupervisorid \\
+\textit{رایانامه سازمانی} \> \SecondCosupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\SecondCosupervisorReportLa}{\noindent 2nd Co-supervisor:~\textbf{\SecondCosupervisorNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\SecondCosupervisorTitleLa} \\
+\textit{Affiliation} \> \SecondCosupervisorAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \SecondCosupervisorid \\
+\textit{Official E-Mail} \> \SecondCosupervisoremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\SecondCosupervisorTitle}{m m}{\renewcommand{\SecondCosupervisorTitlePa}{#1}\renewcommand{\SecondCosupervisorTitleLa}{#2}}
+
+\NewDocumentCommand{\SecondCosupervisorAffiliation}{m m}{\renewcommand{\SecondCosupervisorAffiliationPa}{#1}\renewcommand{\SecondCosupervisorAffiliationLa}{#2}}
+
+\NewDocumentCommand{\SecondCosupervisorID}{m}{\renewcommand{\SecondCosupervisorid}{#1}}
+
+\NewDocumentCommand{\SecondCosupervisorEMAIL}{m}{\renewcommand{\SecondCosupervisoremail}{#1}}
+
+\newcommand{\FirstExaminerNamePa}{~} \newcommand{\FirstExaminerNameLa}{~}
+\newcommand{\FirstExaminerTitlePa}{~} \newcommand{\FirstExaminerTitleLa}{~}
+\newcommand{\FirstExaminerAffiliationPa}{~} \newcommand{\FirstExaminerAffiliationLa}{~}
+\newcommand{\FirstExaminerid}{~}
+\newcommand{\FirstExamineremail}{~}
+\newcommand{\FirstExaminerReportPa}{~} \newcommand{\FirstExaminerReportLa}{~}
+\NewDocumentCommand{\FirstExaminerName}{m m}{\renewcommand{\FirstExaminerNamePa}{#1}\renewcommand{\FirstExaminerNameLa}{#2}\renewcommand{\FirstExaminerReportPa}{\noindent نام کامل استاد داور اول: ~\textbf{\FirstExaminerNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\FirstExaminerTitlePa} \\
+\textit{وابستگی سازمانی} \> \FirstExaminerAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \FirstExaminerid \\
+\textit{رایانامه سازمانی} \> \FirstExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\FirstExaminerReportLa}{\noindent 1st Examiner:~\textbf{\FirstExaminerNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\FirstExaminerTitleLa} \\
+\textit{Affiliation} \> \FirstExaminerAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \FirstExaminerid \\
+\textit{Official E-Mail} \> \FirstExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\FirstExaminerTitle}{m m}{\renewcommand{\FirstExaminerTitlePa}{#1}\renewcommand{\FirstExaminerTitleLa}{#2}}
+
+\NewDocumentCommand{\FirstExaminerAffiliation}{m m}{\renewcommand{\FirstExaminerAffiliationPa}{#1}\renewcommand{\FirstExaminerAffiliationLa}{#2}}
+
+\NewDocumentCommand{\FirstExaminerID}{m}{\renewcommand{\FirstExaminerid}{#1}}
+
+\NewDocumentCommand{\FirstExaminerEMAIL}{m}{\renewcommand{\FirstExamineremail}{#1}}
+
+\newcommand{\SecondExaminerNamePa}{~} \newcommand{\SecondExaminerNameLa}{~}
+\newcommand{\SecondExaminerTitlePa}{~} \newcommand{\SecondExaminerTitleLa}{~}
+\newcommand{\SecondExaminerAffiliationPa}{~} \newcommand{\SecondExaminerAffiliationLa}{~}
+\newcommand{\SecondExaminerid}{~}
+\newcommand{\SecondExamineremail}{~}
+\newcommand{\SecondExaminerReportPa}{~} \newcommand{\SecondExaminerReportLa}{~}
+\NewDocumentCommand{\SecondExaminerName}{m m}{\renewcommand{\SecondExaminerNamePa}{#1}\renewcommand{\SecondExaminerNameLa}{#2}\renewcommand{\SecondExaminerReportPa}{\noindent نام کامل استاد داور دوم: ~\textbf{\SecondExaminerNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\SecondExaminerTitlePa} \\
+\textit{وابستگی سازمانی} \> \SecondExaminerAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \SecondExaminerid \\
+\textit{رایانامه سازمانی} \> \SecondExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\SecondExaminerReportLa}{\noindent 2nd Examiner:~\textbf{\SecondExaminerNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\SecondExaminerTitleLa} \\
+\textit{Affiliation} \> \SecondExaminerAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \SecondExaminerid \\
+\textit{Official E-Mail} \> \SecondExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\SecondExaminerTitle}{m m}{\renewcommand{\SecondExaminerTitlePa}{#1}\renewcommand{\SecondExaminerTitleLa}{#2}}
+
+\NewDocumentCommand{\SecondExaminerAffiliation}{m m}{\renewcommand{\SecondExaminerAffiliationPa}{#1}\renewcommand{\SecondExaminerAffiliationLa}{#2}}
+
+\NewDocumentCommand{\SecondExaminerID}{m}{\renewcommand{\SecondExaminerid}{#1}}
+
+\NewDocumentCommand{\SecondExaminerEMAIL}{m}{\renewcommand{\SecondExamineremail}{#1}}
+
+\newcommand{\ThirdExaminerNamePa}{~} \newcommand{\ThirdExaminerNameLa}{~}
+\newcommand{\ThirdExaminerTitlePa}{~} \newcommand{\ThirdExaminerTitleLa}{~}
+\newcommand{\ThirdExaminerAffiliationPa}{~} \newcommand{\ThirdExaminerAffiliationLa}{~}
+\newcommand{\ThirdExaminerid}{~}
+\newcommand{\ThirdExamineremail}{~}
+\newcommand{\ThirdExaminerReportPa}{~} \newcommand{\ThirdExaminerReportLa}{~}
+\NewDocumentCommand{\ThirdExaminerName}{m m}{\renewcommand{\ThirdExaminerNamePa}{#1}\renewcommand{\ThirdExaminerNameLa}{#2}\renewcommand{\ThirdExaminerReportPa}{\noindent نام کامل استاد داور سوم: ~\textbf{\ThirdExaminerNamePa} \hrulefill \\
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{مرتبه‌ی علمی} \hspace{1cm} \= \textbf{\ThirdExaminerTitlePa} \\
+\textit{وابستگی سازمانی} \> \ThirdExaminerAffiliationPa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{شماره ملی} \hspace{0.5cm} \= \ThirdExaminerid \\
+\textit{رایانامه سازمانی} \> \ThirdExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\ThirdExaminerReportLa}{\noindent 3rd Examiner:~\textbf{\ThirdExaminerNameLa} \hrulefill \\
+\begin{minipage}{0.4\textwidth}
+\begin{tabbing}
+\textit{Title} \hspace{0.85cm} \= \textbf{\ThirdExaminerTitleLa} \\
+\textit{Affiliation} \> \ThirdExaminerAffiliationLa
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.45\textwidth}
+\begin{tabbing}
+\textit{National ID} \hspace{0.5cm} \= \ThirdExaminerid \\
+\textit{Official E-Mail} \> \ThirdExamineremail
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.1\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\ThirdExaminerTitle}{m m}{\renewcommand{\ThirdExaminerTitlePa}{#1}\renewcommand{\ThirdExaminerTitleLa}{#2}}
+
+\NewDocumentCommand{\ThirdExaminerAffiliation}{m m}{\renewcommand{\ThirdExaminerAffiliationPa}{#1}\renewcommand{\ThirdExaminerAffiliationLa}{#2}}
+
+\NewDocumentCommand{\ThirdExaminerID}{m}{\renewcommand{\ThirdExaminerid}{#1}}
+
+\NewDocumentCommand{\ThirdExaminerEMAIL}{m}{\renewcommand{\ThirdExamineremail}{#1}}
+
+\newcommand{\RepresentativeNamePa}{~} \newcommand{\RepresentativeNameLa}{~}
+\newcommand{\Representativeid}{~}
+\newcommand{\Representativeemail}{~}
+\newcommand{\RepresentativeReportPa}{~} \newcommand{\RepresentativeReportLa}{~}
+\NewDocumentCommand{\RepresentativeName}{m m}{\renewcommand{\RepresentativeNamePa}{#1}\renewcommand{\RepresentativeNameLa}{#2}\renewcommand{\RepresentativeReportPa}{\noindent نماینده‌ی تحصیلات تکمیلی \hrulefill \\[0.25cm]
+\begin{minipage}{0.8\textwidth}
+\begin{tabbing}
+\textit{نام کامل} \hspace{1.5cm} \= \textbf{\RepresentativeNamePa} \\
+\textit{رایانامه سازمانی} \> \Representativeemail \\
+\textit{شماره ملی} \> \Representativeid
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.2\textwidth}
+\begin{center}
+امضا
+\end{center}
+\end{minipage}
+}\renewcommand{\RepresentativeReportLa}{\noindent The Representative of Graduate and Professional Studies Office \hrulefill \\
+\begin{minipage}{0.8\textwidth}
+\begin{tabbing}
+\textit{Full Name} \hspace{1.5cm} \= \textbf{\RepresentativeNameLa} \\
+\textit{Official E-Mail} \> \Representativeemail \\
+\textit{National ID} \> \Representativeid
+\end{tabbing}
+\end{minipage}
+\begin{minipage}{0.2\textwidth}
+\begin{center}
+Signature
+\end{center}
+\end{minipage}}}
+
+\NewDocumentCommand{\RepresentativeTitle}{m m}{\renewcommand{\RepresentativeTitlePa}{#1}\renewcommand{\RepresentativeTitleLa}{#2}}
+
+\NewDocumentCommand{\RepresentativeAffiliation}{m m}{\renewcommand{\RepresentativeAffiliationPa}{#1}\renewcommand{\RepresentativeAffiliationLa}{#2}}
+
+\NewDocumentCommand{\RepresentativeID}{m}{\renewcommand{\Representativeid}{#1}}
+
+\NewDocumentCommand{\RepresentativeEMAIL}{m}{\renewcommand{\Representativeemail}{#1}}
+
+\NewDocumentCommand{\titlepageParsi}{}{\begin{center}
+\InstituteLogoPa ~\\[0.25cm]
+\InstitutePa ~\\
+\FacultyPa ~\\
+\DepartmentPa ~\\[0.5cm]
+
+\ParsaTargetPa ~\\
+\StudentMajorPa ~ \StudentMinorPa ~\\[1cm]
+
+{\Large \textbf \ParsaTitlePa} ~\\[0.25cm]
+
+\captiononePa ~\\
+\textbf{\StudentNamePa} ~\\[1cm]
+
+\captiontwoPa ~\\
+\textbf{\SupervisorNamePa \\ \SecondSupervisorNamePa} ~\\[1cm]
+
+\captionthreePa ~\\
+\textbf{\CosupervisorNamePa \\ \SecondCosupervisorNamePa} ~\\[1cm]
+\vfill
+\textbf{\ParsaCompilationDatePa}
+\end{center}}
+
+\NewDocumentCommand{\titlepageLatin}{}{\begin{latin} \begin{center}
+\InstituteLogoLa ~\\[0.25cm]
+\InstituteLa ~\\
+\FacultyLa ~\\
+\DepartmentLa ~\\[0.5cm]
+
+\emph{\ParsaTargetLa} ~\\
+\StudentMajorLa ~ \StudentMinorLa ~\\[1cm]
+
+{\Large \textbf \ParsaTitleLa} ~\\[0.25cm]
+
+\captiononeLa ~\\
+\textbf{\StudentNameLa} ~\\[1cm]
+
+\captiontwoLa ~\\
+\textbf{\SupervisorNameLa \\ \SecondSupervisorNameLa} ~\\[1cm]
+
+\captionthreeLa ~\\
+\textbf{\CosupervisorNameLa \\ \SecondCosupervisorNameLa} ~\\[1cm]
+\vfill
+\textbf{\ParsaCompilationDateLa}
+\end{center} \end{latin}}
+
+\NewDocumentEnvironment{ParsaAbstractParsi}{+b}{
+\section*{چکیده}
+#1
+\vspace*{\fill}}{}
+
+\NewDocumentEnvironment{ParsaAbstractLatin}{+b}{
+\begin{latin}
+\section*{Abstract}
+#1
+\end{latin}
+\vspace*{\fill}}{}
+
+\newcommand{\parsapicture}{~}
+\NewDocumentCommand{\ParsaPicture}{m}{~\newpage \vspace*{\fill} \includegraphics[width=\textwidth]{#1} ~ \vspace*{\fill} ~\newpage}
+
+
+\NewDocumentCommand{\ParsaCredit}{}{\begin{minipage}{1\textwidth}
+\section*{\centering اصالت و مالکیت اثر}
+\noindent این‌جانب ~\textbf{\StudentNamePa}~ دانش‌آموخته‌ی ~\textbf{\StudentDegreePa}~ \textbf{\StudentMajorPa}~ \textbf{\StudentMinorPa}~ \textbf{\FacultyPa}~ \textbf{\InstitutePa}~ به شماره دانشجویی ~\textbf{\Studentnumber}~ پدیدآورنده‌ی ~\textbf{\ParsaTypePa}~ با عنوان ~\textbf{\ParsaTitlePa}~ با راهنمایی ~\textbf{\SupervisorNamePa}، بر پایه‌ی قوانین و مقررات، از جمله «دستورالعمل نحوه‌ی بررسی تخلفات پژوهشی» و «مصادیق تخلفات پژوهشی» مصوب ۲۵ اسفند ۱۳۹۳ وزارت علوم، تحقیقات و فناوری، متعهد می‌شوم که:
+\begin{enumerate}
+\item این ~\ParsaTypePa ~ دستاورد پژوهش این‌جانب و محتوای آن از درستی و اصالت برخوردار است؛
+\item حقوق معنوی همه‌ی کسانی را که در به دست آمدن نتایج اصلی ~\ParsaTypePa ~ تأثیرگذار بوده‌اند، رعایت کرده‌ام و هنگام کاربرد دستاورد پژوهش‌های دیگران در آن، با دقت و به‌درستی به آن‌ها استناد کرده‌ام؛
+\item این ~\ParsaTypePa ~ و محتوای آن، تاکنون توسط این‌جانب یا فرد دیگری، برای دریافت هیچ‌گونه مدرک یا امتیازی در هیچ‌جا ارائه نشده‌است؛
+\item همه‌ی حقوق مادی این ~\ParsaTypePa ~ از آن ~\InstitutePa ~ است و آثار برگرفته از آن با وابستگی سازمانی ~\InstitutePa ~ منتشر خواهد شد؛
+\item در همه‌ی آثار برگرفته از این ~\ParsaTypePa ، نام استاد(ان) راهنما و اگر استاد راهنمای نخست تشخیص دهد، نام استاد(ان) مشاور و رایانامه‌ی سازمانی آنان را می‌آورم؛
+\item در همه‌ی گام‌های انجام این ~\ParsaTypePa ، هرگاه به اطلاعات شخصی افراد یا اطلاعات سازمان‌ها دسترسی داشته‌باشم یا آن‌ها را به کار برده‌ام، رازداری و اخلاق پژوهشی را رعایت کرده‌ام.
+\end{enumerate}
+\begin{center} تاریخ و امضا \end{center}
+\vspace{1.5cm}
+\section*{\centering حقوق \InstitutePa}
+این گزارش و همه‌ی حقوق مادی و محصولات آن (مقاله‌ها، کتاب‌ها، پروانه‌های اختراع، برنامه‌های رایانه‌ای، نرم‌افزارها، تجهیزات ساخته شده و مانند آن‌ها) بر پایه‌ی «قانون حمایت حقوق مولفان و مصنفان و هنرمندان» مصوب سال ۱۳۴۸ و اصلاحیه‌های بعدی آن و همچنین «آئین‌نامه‌ی اجرایی این قانون» از آن ~\InstitutePa ~ است و هرگونه استفاده از همه یا پاره‌ای از آن شامل نقل‌قول، تکثیر، انتشار، کاربرد نتایج، تکمیل و مانند آن‌ها به صورت چاپی، الکترونیکی یا وسایل دیگر، تنها با اجازه نوشتاری ~\InstitutePa ~ شدنی‌است. نقل‌قول محدود در انتشارات علمی مانند کتاب‌ها و مقاله‌ها یا پایان‌نامه‌ها و رساله‌های دیگر با نوشتن اطلاعات کامل کتاب‌شناختی، نیازی به مجوز ~\InstitutePa ~ ندارد.
+\end{minipage}}
+
+\NewDocumentCommand{\ExaminationReportPa}{}{
+\begin{table}[H] \adjustbox{pagecenter}{
+\begin{tabular}{ccc}
+\multirow{3}{*}{\InstituteLogoPaSmall} & به نام خدا & ~ \\
+ & \InstitutePa & تاریخ دفاع \\
+ & صورت جلسه‌ی دفاع از \ParsaTypePa ~\StudentDegreePa & \ParsaExamDatePa
+\end{tabular} }
+\end{table}
+\begin{minipage}{1\textwidth}
+\begin{flushright} \begin{tabular}{p{0.16\textwidth}p{0.79\textwidth}}
+\textit{نام کامل دانش‌آموخته} & \textbf{\StudentNamePa} \\
+\textit{رشته‌ی تحصیلی} & \StudentMajorPa ~\StudentMinorPa \\
+\textit{شماره ملی} & \Studentid \\
+\textit{رایانامه شخصی} & \Studentemail \\
+\textit{عنوان \ParsaTypePa :} & \textbf{\ParsaTitlePa}
+\end{tabular} \end{flushright}
+\begin{center} \textbf{
+هیئت داوران پس از شنیدن گزارش و دفاع دانشجو، \ParsaTypePa ‌ی وی را داوری کرده \\
+و با درجه‌ی عالی $\bigcirc$ بسیار خوب $\bigcirc$ خوب $\bigcirc$ پذیرفته‌نشده $\bigcirc$ ارزیابی کرد.
+} \end{center} \end{minipage} ~\\
+
+\SupervisorReportPa ~\\[0.2cm]
+\SecondSupervisorReportPa ~\\[0.2cm]
+\CosupervisorReportPa ~\\[0.2cm]
+\SecondCosupervisorReportPa ~\\[0.2cm]
+\FirstExaminerReportPa ~\\[0.2cm]
+\SecondExaminerReportPa ~\\[0.2cm]
+\ThirdExaminerReportPa ~\\[0.2cm]
+\RepresentativeReportPa}
+
+\NewDocumentCommand{\ExaminationReportLa}{}{\begin{latin}
+\begin{table}[H] \adjustbox{pagecenter}{
+\begin{tabular}{ccc}
+\multirow{3}{*}{\InstituteLogoLaSmall} & \textsc{In The Name of God} & ~ \\
+ & \InstituteLa & Date \\
+ & \emph{A \ParsaTypeLa ~Examination Report} & \ParsaExamDateLa
+\end{tabular} }
+\end{table}
+\begin{minipage}{1\textwidth}
+\begin{flushright} \begin{tabular}{p{0.2\textwidth}p{0.77\textwidth}}
+\textit{Full Name} & \textbf{\StudentNameLa} \\
+\textit{Discipline} & \StudentMajorLa ~\StudentMinorLa \\
+\textit{National ID} & \Studentid \\
+\textit{Personal E-Mail} & \Studentemail \\
+\textit{\ParsaTypeLa ~Title} & \textbf{\ParsaTitleLa} \\
+\end{tabular} \end{flushright}
+\begin{center} \textbf{
+Following the oral defence by the student, the examination committee evaluated the \ParsaTypeLa ~as:\\
+Excellent $\bigcirc$ Very Good $\bigcirc$ Good $\bigcirc$ Not Acceptable $\bigcirc$\@.
+} \end{center} \end{minipage} ~\\
+{\small
+\SupervisorReportLa ~\\[0.2cm]
+\SecondSupervisorReportLa ~\\[0.2cm]
+\CosupervisorReportLa ~\\[0.2cm]
+\SecondCosupervisorReportLa ~\\[0.2cm]
+\FirstExaminerReportLa ~\\[0.2cm]
+\SecondExaminerReportLa ~\\[0.2cm]
+\ThirdExaminerReportLa ~\\[0.2cm]
+\RepresentativeReportLa} \end{latin}}
+
+\NewDocumentCommand{\ParsaCopyleft}{}{\begin{center} \begin{minipage}{0.67\textwidth}
+\section*{\centering مجوز بهره‌برداری}
+بهره‌برداری از این \ParsaTypePa ~در چهارچوب مقررات کتاب‌خانه و با توجه به محدودیتی که توسط استاد راهنما به شرح زیر تعیین می‌گردد، بلامانع است:\\
+\begin{itemize}
+\item[$\bigcirc$] بهره‌برداری از این \ParsaTypePa ~برای همگان و با ذکر منبع، بلامانع است.
+\item[$\bigcirc$] بهره‌برداری از این \ParsaTypePa ~با اخذ مجوز از استاد راهنما و با ذکر منبع، بلامانع است.
+\item[$\bigcirc$] بهره‌برداری از این \ParsaTypePa ~تا تاریخ \hspace{4cm} ممنوع است.
+\end{itemize}
+\begin{center}
+استاد راهنما: \SupervisorNamePa \\
+امضا
+\end{center} \end{minipage} \end{center} }
+
+\NewDocumentCommand{\ParsaDedicate}{+m}{
+\vspace*{\fill}
+\begin{center}
+\begin{Large}
+#1
+\end{Large}
+\end{center}
+\vspace*{\fill}}
+
+\NewDocumentEnvironment{ParsaAcknowledge}{+b}{
+\chapter*{\centering سپاس‌گزاری}
+\addcontentsline{toc}{chapter}{سپاس‌گزاری} \thispagestyle{empty}
+#1}{}
+
+\NewDocumentEnvironment{ParsaCV}{+b}{\newpage
+\vspace*{\fill}
+\begin{center}
+\begin{minipage}{0.67\textwidth}
+#1
+\end{minipage}
+\end{center}
+\vspace*{\fill}\newpage}{} \ No newline at end of file
diff --git a/macros/xetex/latex/parsa/picture.jpg b/macros/xetex/latex/parsa/picture.jpg
new file mode 100644
index 0000000000..203a68fc7c
--- /dev/null
+++ b/macros/xetex/latex/parsa/picture.jpg
Binary files differ