% \CheckSum{149}
% \iffalse meta-comment
%
%  TUD-Script -- Corporate Design of Technische Universität Dresden
% ----------------------------------------------------------------------------
%
%  Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2019
%
% ----------------------------------------------------------------------------
%
%  This work may be distributed and/or modified under the conditions of the
%  LaTeX Project Public License, version 1.3c of the license. The latest
%  version of this license is in http://www.latex-project.org/lppl.txt and
%  version 1.3c or later is part of all distributions of LaTeX 2005/12/01
%  or later and of this work. This work has the LPPL maintenance status
%  "author-maintained". The current maintainer and author of this work
%  is Falk Hanisch.
%
% ----------------------------------------------------------------------------
%
%  Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz
%  in der Version 1.3c, verteilt und/oder verändert werden. Die aktuelle
%  Version dieser Lizenz ist http://www.latex-project.org/lppl.txt und
%  Version 1.3c oder später ist Teil aller Verteilungen von LaTeX 2005/12/01
%  oder später und dieses Werks. Dieses Werk hat den LPPL-Verwaltungs-Status
%  "author-maintained", wird somit allein durch den Autor verwaltet. Der
%  aktuelle Verwalter und Autor dieses Werkes ist Falk Hanisch.
%
% ----------------------------------------------------------------------------
%
% \fi
%
% \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         \~}
%
% \iffalse
%%% From File: tudscr-mathswap.dtx
%<*dtx>
% \fi
%
\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
\ProvidesFile{tudscr-mathswap.dtx}[2019/06/28 v2.06 TUD-Script\space%
%
% \iffalse
%</dtx>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{mathswap}[%
%<*package>
%!TUD@Version
%</package>
%<package>  package
%<*dtx|package>
% \fi
%
  (swap mathematical separators)%
]
%
% \iffalse
%</dtx|package>
%<*dtx>
\documentclass[english,ngerman,xindy]{tudscrdoc}
\ifpdftex{
  \usepackage[T1]{fontenc}
  \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
}{
  \usepackage{fontspec}
}
\usepackage{babel}
\usepackage{tudscrfonts}
\KOMAoptions{parskip=half-}
\usepackage{bookmark}
\usepackage[babel]{microtype}

\CodelineIndex
\RecordChanges
\GetFileInfo{tudscr-mathswap.dtx}
\title{\file{\filename}}
\author{Falk Hanisch\qquad\expandafter\mailto\expandafter{\tudscrmail}}
\date{\fileversion\nobreakspace(\filedate)}

\begin{document}
  \maketitle
  \tableofcontents
  \DocInput{\filename}
\end{document}
%</dtx>
% \fi
%
% \selectlanguage{ngerman}
%
% \changes{v2.02}{2014/08/18}{\pkg{mathswap}: Schalter zum Aktivieren und
%   Deaktivieren der Funktionalität}^^A
%
% \section{Das Paket \pkg{mathswap} -- Aktive Trennzeichen im Mathematikmodus}
%
% Die Verwendung von Dezimal- und Tausendertrennzeichen im mathematischen Satz 
% sind regional sehr unterschiedlich. In den meisten englischsprachigen Ländern 
% wird der Punkt als Dezimaltrennzeichen und das Komma zur Zifferngruppierung 
% verwendet, im restlichen Europa wird dies genau entgegengesetzt praktiziert.
% Dieses Paket soll dazu dienen, beliebige formatierte Zahlen in ihrer Ausgabe 
% anzupassen. Dafür werden die Zeichen Punkt (~.~) und Komma (~,~) als aktive
% Zeichen im Mathematikmodus definiert.
%
% Ähnliche Funktionalitäten werden bereits durch die Pakete \pkg{icomma} und 
% \pkg{ziffer} bereitgestellt. Bei \pkg{icomma} muss jedoch beim
% Verfassen des Dokumentes durch den Autor beachtet werden, ob das verwendete
% Komma einem Dezimaltrennzeichen entspricht ($t=1,\!2$) oder aber einem
% normalen Komma im Mathematiksatz ($z=f(x,y)$), wo ein gewisser Abstand nach
% dem Komma durchaus gewünscht ist. Das Paket \pkg{ziffer} liefert dafür die
% gewünschte Funktionalität,\footnote{kein Leerraum nach Komma, wenn direkt
% danach eine Ziffer folgt} ist allerdings etwas unflexibel, was den Umgang mit
% den Trennzeichen anbelangt. Als Alternative zu diesem Paket kann außerdem 
% \pkg{ionumbers} verwendet werden.
%
% Das Paket \pkg{mathswap} sorgt dafür, dass Trennzeichen direkt vor einer 
% Ziffer erkannt und nach bestimmten Vorgaben ersetzt werden. Sollte sich 
% jedoch zwischen Trennzeichen und Ziffer Leerraum befinden, wird dieser als
% solcher auch gesetzt.
%
% \ToDo{Vergleich mit \pkg{ionumbers}, ist \pkg{mathswap} notwendig?}[v2.??]
% \ToDo{Als eingenständiges Paket herauslösen}[v2.??]
% \ToDo{Allgem. Bezeichnungen englisches/deutsches Format?}[v2.??]
% \ToDo{Sprachabhängige Einstellungen in Paket und aus Klassen raus}[v2.??]
% \ToDo{Makro(s)/Key-Value zum Festlegen von Eingabe- und Ausgabeformat}[v2.??]
% \ToDo{Inhalte von \file{mathswap.tex} hier rein}[v2.??]
%
% \StopEventually{\PrintIndex\PrintChanges\PrintToDos}
%
% \iffalse
%<*package>
% \fi
%
% \begin{macro}{\commaswap}
% \begin{macro}{\dotswap}
% \begin{macro}{\@commaswap}
% \begin{macro}{\@dotswap}
% Die beiden Befehle \cs{commaswap} und \cs{dotswap} sind die zentrale 
% Benutzerschnittstelle des Paketes. Das Makro \cs{commaswap} definiert das 
% Trennzeichen oder den Inhalt, wodurch ein Komma ersetzt werden soll, auf 
% welches direkt danach eine Ziffer folgt. Normalerweise setzt \LaTeX{}
% nach einem Komma im mathematischen Satz zusätzlich einen horizontalen Abstand.
% Bei der Ersetzung durch \cs{commaswap} entfällt dieser. Die Voreinstellung
% für \cs{commaswap} ist deshalb auf ein Komma (,) gesetzt.
%
% Mit dem Makro \cs{dotswap} kann definiert werden, wodurch der Punkt im 
% mathematischen Satz ersetzt werden soll, wenn auf diesen direkt anschließend 
% eine Ziffer folgt. Da der Punkt im deutschsprachigem Raum zur Gruppierung von
% Ziffern genutzt wird, ist hierfür standardmäßig ein halbes geschütztes
% Leerzeichen definiert (\cs{,}).
%
% Die mit \cs{commaswap}\marg{Trennzeichen} und \cs{dotswap}\marg{Trennzeichen}
% definierten Trennzeichen werden in \cs{@commaswap} und \cs{@dotswap} 
% gesichert.
%    \begin{macrocode}
\newcommand*\@commaswap{,}
\newcommand*\commaswap[1]{\gdef\@commaswap{#1}\ignorespaces}
\newcommand*\@dotswap{\,}
\newcommand*\dotswap[1]{\gdef\@dotswap{#1}\ignorespaces}
%    \end{macrocode}
% \end{macro}^^A \@dotswap
% \end{macro}^^A \@commaswap
% \end{macro}^^A \dotswap
% \end{macro}^^A \commaswap
% \begin{macro}{\ms@comma}
% \begin{macro}{\ms@commachar}
% \begin{macro}{\ms@dot}
% \begin{macro}{\ms@dotchar}
% In den Befehlen \cs{ms@commachar} und \cs{ms@dotchar} wird die originale 
% Definition von Komma und Punkt im Mathematikmodus gesichert, welche weiterhin 
% verwendet wird, falls nach diesen nicht direkt eine Ziffer folgt. Mit den 
% Makros \cs{ms@comma} und \cs{ms@dot} werden die Definitionen von Komma und 
% Punkt als normale Textzeichen für den mathematischen Satz bereitgehalten. 
% Anschließend werden beide als aktive Zeichen für den Mathematikmodus gesetzt.
%    \begin{macrocode}
\newcommand*\ms@commachar{}
\newcommand*\ms@dotchar{}
\AtBeginDocument{%
  \DeclareMathSymbol{\ms@comma}{\mathord}{letters}{"3B}%
  \mathchardef\ms@commachar\mathcode\expandafter`,%
  \mathcode\expandafter`,="8000%
  \DeclareMathSymbol{\ms@dot}{\mathord}{letters}{"3A}%
  \mathchardef\ms@dotchar\mathcode\expandafter`.%
  \mathcode\expandafter`.="8000%
  \mathswapon%
}
%    \end{macrocode}
% \end{macro}^^A \ms@dotchar
% \end{macro}^^A \ms@dot
% \end{macro}^^A \ms@commachar
% \end{macro}^^A \ms@comma
% \begin{macro}{\mathswapon}
% \changes{v2.02}{2014/08/18}{neu}^^A
% \begin{macro}{\mathswapoff}
% \changes{v2.02}{2014/08/18}{neu}^^A
% \begin{macro}{\ms@commaswap}
% \changes{v2.02}{2014/08/18}{neu}^^A
% \begin{macro}{\ms@dotswap}
% \changes{v2.02}{2014/08/18}{neu}^^A
% Mit den Befehlen \cs{mathswapon} und \cs{mathswapoff} kann die Funktionalität 
% des Paketes innerhalb des Dokumentes aktiviert und deaktiviert werden.
%    \begin{macrocode}
\newcommand*\ms@commaswap{}
\newcommand*\ms@dotswap{}
\newcommand*\mathswapon{%
  \def\ms@commaswap{\@commaswap}%
  \def\ms@dotswap{\@dotswap}%
}
\newcommand*\mathswapoff{%
  \def\ms@commaswap{\ms@commachar}%
  \def\ms@dotswap{\ms@dotchar}%
}
%    \end{macrocode}
% \end{macro}^^A \ms@dotswap
% \end{macro}^^A \ms@commaswap
% \end{macro}^^A \mathswapoff
% \end{macro}^^A \mathswapon
% \begin{macro}{\ms@ifnum}
% \begin{macro}{\ms@@ifnum}
% Der Befehl \cs{ms@ifnum} reicht das erste Argument an \cs{ms@@ifnum} weiter,
% falls der Inhalt von \cs{ms@token} zu einer Ziffer expandiert. Andernfalls
% wird das zweite Argument ausgeführt.
%    \begin{macrocode}
\newcommand*\ms@ifnum[2]{%
  \ifx\ms@token0\ms@@ifnum{#1}\else%
  \ifx\ms@token1\ms@@ifnum{#1}\else%
  \ifx\ms@token2\ms@@ifnum{#1}\else%
  \ifx\ms@token3\ms@@ifnum{#1}\else%
  \ifx\ms@token4\ms@@ifnum{#1}\else%
  \ifx\ms@token5\ms@@ifnum{#1}\else%
  \ifx\ms@token6\ms@@ifnum{#1}\else%
  \ifx\ms@token7\ms@@ifnum{#1}\else%
  \ifx\ms@token8\ms@@ifnum{#1}\else%
  \ifx\ms@token9\ms@@ifnum{#1}\else%
  #2%
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi%
}
%    \end{macrocode}
% Wurde eine nachfolgende Ziffer erkannt, so wird die Definition von Punkt und 
% Komma auf die eines normalen Textzeichens gesetzt und anschließend die mit 
% \cs{commaswap} bzw. \cs{dotswap} angegebene Ersetzung ausgegeben.
%    \begin{macrocode}
\newcommand*\ms@@ifnum[1]{%
  \begingroup%
    \mathcode\expandafter`,=\the\ms@comma%
    \mathcode\expandafter`.=\the\ms@dot%
    #1%
  \endgroup%
}
%    \end{macrocode}
% \end{macro}^^A \ms@@ifnum
% \end{macro}^^A \ms@ifnum
% \begin{macro}{\ms@token}
% \begin{macro}{\ms@smartcomma}
% \begin{macro}{\ms@smartdot}
% Mit \cs{futurelet} wird dem Makro \cs{ms@token} das nachfolgende Zeichen von 
% Komma bzw. Punkt zugewiesen. Anschließend wird mittels \cs{ms@smartcomma} bzw.
% \cs{ms@smartdot} geprüft, ob es sich beim Inhalt von \cs{ms@token} um eine 
% Ziffer handelt. Dazu wird der Befehl \cs{ms@ifnum} verwendet. Sollte dies der 
% Fall sein, so wird ein Komma innerhalb einer Zahl durch \cs{@commaswap} und
% ein Punkt entsprechend mit \cs{@dotswap} ersetzt. Sollte direkt nach dem
% Trennzeichen keine Ziffer folgen, wird für Punkt und Komma die originale 
% Definition aus \cs{ms@commachar} bzw. \cs{ms@dotchar} verwendet.
%    \begin{macrocode}
\newcommand*\ms@token{}
\begingroup
  \catcode`,=\active
  \gdef,{\futurelet\ms@token\ms@smartcomma}
  \catcode`.=\active
  \gdef.{\futurelet\ms@token\ms@smartdot}
\endgroup
\newcommand*\ms@smartcomma{\ms@ifnum{\ms@commaswap}{\ms@commachar}}
\newcommand*\ms@smartdot{\ms@ifnum{\ms@dotswap}{\ms@dotchar}}
%    \end{macrocode}
% \end{macro}^^A \ms@smartdot
% \end{macro}^^A \ms@smartcomma
% \end{macro}^^A \ms@token
%
% \iffalse
%</package>
% \fi
%
% \Finale
%
\endinput
