% File:      telprint.sty
% Version:   2006/02/12 v1.6
% Author:    Heiko Oberdiek
% Email:     <oberdiek@uni-freiburg.de>
%
% Copyright: Copyright (C) 2006 Heiko Oberdiek.
%
%            This work may be distributed and/or modified under
%            the conditions of the LaTeX Project Public License,
%            either version 1.3 of this license or (at your option)
%            any later version. The latest version of this license
%            is in
%              http://www.latex-project.org/lppl.txt
%            and version 1.3 or later is part of all distributions
%            of LaTeX version 2003/12/01 or later.
%
%            This work has the LPPL maintenance status "maintained".
%
%            This Current Maintainer of this work is Heiko Oberdiek.
%
% Function:  This is a very old package that I have written
%            to format phone numbers. It follows German
%            conventions and the documentation is in German
%            at the end of this file. :-(
%            It follows a short overview in English:
%
% Use:       LaTeX:
%              \usepackage{telprint}
%              \telprint{123/456-789}
%            plain:
%              \input telprint.sty
%              \telprint{123/456-789}
%
% \telprint{...} formats the explicitly given number.
%     Digits, spaces and some special characters
%     ('+', '/', '-', '(', ')', '~', ' ') are supported.
%     Numbers are divided into groups of two digits from the right.
% Examples:
%     \telprint{0761/12345}     ==> 07\,61/1\,23\,45
%     \telprint{01234/567-89}   ==> 0\,12\,34/5\,67\leavevmode\hbox{-}89
%     \telprint{+49 (6221) 297} ==> +49~(62\,21)~2\,97
%
% The output of the configured by
% \telhyphen, \telslash, \telleftparen, \telrightparen, \telplus,
% \teltilde.
% Example:
%   \telslash{\,/\,}
%   \telprint{12/34} ==> 12\,/\,34
%
% \telspace configures the space between digit groups.
%
% \telnumber only formats a number in digit groups; special
%    characters are not recognized.
%
%
\ifx\telprint\UnDeFiNeD
% \fi in derselben Zeile wie \endinput oder \expandafter verwenden!
\else\endinput\fi

\message{Package `telprint' 1.6, 12.02.2006 %
  Copyright (c) 1996, 1997, 2004, 2005, 2006 by Heiko Oberdiek.}

\ifx\DeclareRobustCommand\UnDeFiNeD
  \def\DeclareRobustCommand*#1[1]{\def#1##1}
  \def\TELreset{\let\DeclareRobustCommand=\UnDeFiNeD}
  \immediate\write-1{Package `telprint' warning: %
  Macros are not robust!}
\else
  \let\TELreset=\relax
\fi

\DeclareRobustCommand*{\telspace}[1]{\def\TELspace{#1}}
\telspace{{}$\,${}}

\DeclareRobustCommand*{\telhyphen}[1]{\def\TELhyphen{#1}}
\telhyphen{\leavevmode\hbox{-}}% \hbox zur Verhinderung der Trennung

\DeclareRobustCommand*{\telslash}[1]{\def\TELslash{#1}}
\telslash{/}%

\DeclareRobustCommand*{\telleftparen}[1]{\def\TELleftparen{#1}}
\telleftparen{(}%

\DeclareRobustCommand*{\telrightparen}[1]{\def\TELrightparen{#1}}
\telrightparen{)}%

\DeclareRobustCommand*{\telplus}[1]{\def\TELplus{#1}}
\telplus{+}%

\DeclareRobustCommand*{\teltilde}[1]{\def\TELtilde{#1}}
\teltilde{~}%

\newtoks\TELtoks

\def\TELnumber#1#2\TELnumberEND{%
  \begingroup
  \def\0{#2}%
  \expandafter\endgroup
  \ifx\0\empty
    \TELtoks=\expandafter{\the\TELtoks#1}%
    \ifnum\TELswitch=0
      \def\TELx{\TELspace}\def\TELy{}%
    \else
      \def\TELx{}\def\TELy{\TELspace}%
    \fi
    \the\TELtoks
  \else
    \ifnum\TELswitch=0
      \TELtoks=\expandafter{\the\TELtoks#1\TELx}%
      \def\TELswitch{1}%
    \else
      \TELtoks=\expandafter{\the\TELtoks#1\TELy}%
      \def\TELswitch{0}%
    \fi
    \TELnumber#2\TELnumberEND
  \fi
}

\DeclareRobustCommand*{\telnumber}[1]{%
  \TELtoks={}%
  \def\TELswitch{0}%
  \TELnumber#1{}\TELnumberEND
}


\def\TELsplit{\futurelet\TELfuture\TELdosplit}

\def\TELdosplit#1#2\TELsplitEND
{%
  \def\TELsp{ }%
  \expandafter\ifx\TELsp\TELfuture
    \let\TELfuture=\relax
    \expandafter\telnumber\expandafter{\the\TELtoks}~%
    \telprint{#1#2}% Das Leerzeichen kann nicht #1 sein!
  \else
    \def\TELfirst{#1}%
    \ifx\TELfirst\empty
      \expandafter\telnumber\expandafter{\the\TELtoks}%
      \TELtoks={}%
    \else\if-\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELhyphen
      \telprint{#2}%
    \else\if/\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELslash
      \telprint{#2}%
    \else\if(\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELleftparen
      \telprint{#2}%
    \else\if)\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELrightparen
      \telprint{#2}%
    \else\if+\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELplus
      \telprint{#2}%
    \else\def\TELtemp{~}\ifx\TELtemp\TELfirst
      \expandafter\telnumber\expandafter{\the\TELtoks}\TELtilde
      \telprint{#2}%
    \else
      \TELtoks=\expandafter{\the\TELtoks#1}%
      \TELsplit#2{}\TELsplitEND
    \fi\fi\fi\fi\fi\fi\fi
  \fi
}

\DeclareRobustCommand*{\telprint}[1]{%
  \TELtoks={}%
  \TELsplit#1{}\TELsplitEND
}

\TELreset\let\TELreset=\UnDeFiNeD

\endinput

% _History_
% * Version 1.0 vom 28.11.1996
%   - Erste lauffaehige Version.
%   - Nur '-' und '/' als zulaessige Sonderzeichen.
% * Version 1.1 vom 16.09.1997
%   - Dokumentation und Kommentare (Posting in de.comp.text.tex).
%   - Erweiterung um Sonderzeichen '(', ')', '+', '~' und ' '.
%   - Trennungsverhinderung am "hyphen".
% * Version 1.2 vom 16.10.1997
%   - Schutz vor wiederholtem Einlesen.
%   - Unter LaTeX2e Nutzung des \DeclareRobustCommand-Features.
% * Version 1.3 vom 09.12.1997
%   - Temporaere Variable eingespart.
% * Version 1.4 vom 02.11.2004
%   - Fehler in der Dokumentation korrigiert.
% * Version 1.5 vom 30.09.2005
%   - Konfigurierbare Symbolde: '/', '(', ')', '+' und '~'.
% * Version 1.6 vom 12.02.2006
%   - LPPL 1.3.
%   - Kurze Uebersicht in Englisch.
%   - CTAN.
%
% _Dokumentation_
% * \telprint#1
%   Der eigentliche Anwenderbefehl zur formatierten Ausgabe von
%   Telefonnummern. Diese duerfen dabei nur als Zahlen angegeben
%   werden(, da sie tokenweise analysiert werden).
%   Als Trenn- oder Sonderzeichen werden unterstuetzt:
%   '+', '/', '-', '(', ')', '~', ' '
%   Einfache Leerzeichen werden erkannt und durch Tilden ersetzt, um
%   Trennungen in der Telefonnummer zu verhindern. (Man beachte aus
%   gleichem Grunde die \hbox bei '-'.)
%   Beispiele:
%     \telprint{0761/12345}     ==> 07\,61/1\,23\,45
%     \telprint{01234/567-89}   ==> 0\,12\,34/5\,67\leavevmode\hbox{-}89
%     \telprint{+49 (6221) 297} ==> +49~(62\,21)~2\,97
%
% Der Rest enthaelt eher Technisches:
% * \telspace#1
%   Mit diesem Befehl wird der Abstand zwischen den Zifferngruppen
%   angegeben (Default: \,).
%   (Durch \telspace{} kann dieser zusaetzliche Abstand abgestellt
%   werden.)
% * \telhyphen#1
%   Dieser Befehl gibt die Art des Bindestriches, wie er ausgegeben
%   werden soll. In der Eingabe darf jedoch nur der einfache
%   Bindestrich stehen:
%   \telprint{123-45}, jedoch NIE \telprint{123--45}!
%   Kopka-Bindestrich-Fans geben an:
%   \telhyphen{\leavevmode\hbox{--}}
% * \telslash#1, \telleftparen#1, \telrightparen#1, \telplus#1,
%   \teltilde
%   Diese Befehle konfigurieren die Zeichen '/', '(', ')', '+'
%   und '~'. Sie funktionieren analog zu \telhyphen.
% * \telnumber#1
%   Richtung interner Befehl: Er dient dazu, eine Zifferngruppe
%   in Zweiergruppen auszugeben.
%   Die einzelnen Zahlen werden im Tokenregister \TELtoks
%   gespeichert. Abwechselnd werden dabei zwischen zwei Token
%   (Zahlen) \TELx bzw. \TELy eingefuegt, abhaengig von dem
%   wechselnden Wert von \TELswitch. Zum Schluss kann dann einfach
%   festgestellt werden ob die Nummer nun eine geradzahlige oder
%   ungeradzahlige Zahl von Ziffern aufwies. Dem entsprechend wird
%   \TELx mit dem Zusatzabstand belegt und \TELy leer definiert
%   oder umgekehrt. )
% * \TEL... interne Befehle, Technisches:
%   \TELsplit dient zur Aufteilung einer zusammengesetzten
%   Telefonnummer (Vorwahl, Hauptnummer, Nebenstelle). In dieser
%   Implementation werden als Trennzeichen nur '/' und '-' erkannt.
%   Die einzelnen Bestandteile wie Vorwahl werden dann dem Befehl
%   \telnumber zur Formatierung uebergeben.
% * Die Erkennung von einfachen Leerzeichen ist um einiges
%   schwieriger: Die Tokentrennung ueber Parameter #1#2 funktioniert
%   nicht fuer einfache Leerzeichen, da TeX sie _niemals_ als
%   eigenstaendige Argumente behandelt!!! (The TeXbook, Chapter 20,
%   p. 201)
%   (Anmerkung am Rande: Deshalb funktionieren die entsprechenden
%   Tokenmakros auf S. 149 des Buches "Einfuehrung in TeX" von
%   N. Schwarz (3. Aufl.) nicht, wenn im Tokenregister als erstes
%   ein einfaches Leerzeichen steht!)
%
