Problem
Ich versuche, einige Zahlen nach einigen sehr einfachen Kriterien aufzuteilen. Zahlen mit 8
Ziffern, die mit beginnen4,8oder9sollte in Zifferngruppen der Länge aufgeteilt werden 3 2 3
.
Alle anderen Ziffern der Länge 8 sollten in Zweiergruppen aufgeteilt werden.
Zahlen mit weniger als 8 Ziffern sollten nicht in Gruppen aufgeteilt werden.
Beispiele
- 23 27 60 11 (harte Leerzeichen)
- 404 43 033 (harte Leerzeichen, 3 2 3)
- 820 43 033 (harte Leerzeichen, 3 2 3)
- 909 64 159 (harte Leerzeichen)
- 07979 (keine Leerzeichen)
- 110 (keine Leerzeichen), 112 (keine Leerzeichen), 113 (keine Leerzeichen)
Entschuldigen Sie das Fehlen von MWE, aber ich bin nicht ganz sicher, wo ich anfangen soll.
Antwort1
Dies kann mit dem Paket erfolgen xstring
, das Befehle zum Extrahieren und Vergleichen von Teilzeichenfolgen bereitstellt.
Es ist möglich, vor der Formatierung eine Vorverarbeitung der Zeichenfolge durchzuführen, beispielsweise um Leerzeichen zu entfernen. Die xstring
Befehle zum Extrahieren von Teilzeichenfolgen, Änderungen und Zählungen haben die allgemeine Syntax, \Command{arg1}{...}[\result]
bei der das optionale \result
Argument das Ergebnis zur weiteren Verarbeitung speichert (wenn dieses Argument nicht angegeben wird, wird das Ergebnis einfach direkt gedruckt). Dies kann zur Vorverarbeitung verwendet werden, um die vorverarbeitete Zeichenfolge zu speichern und die restliche Verarbeitung an der Ergebniszeichenfolge vorzunehmen.
MWE:
\documentclass{article}
\newif\ifstartnum
\usepackage{xstring}
\newcommand{\splitdigits}[1]{%
\StrDel{#1}{ }[\newstring]%
\StrLen{\newstring}[\mylen]%
\ifnum \mylen=8 %
\startnumfalse%
\IfBeginWith{\newstring}{4}{\startnumtrue}{}%
\IfBeginWith{\newstring}{8}{\startnumtrue}{}%
\IfBeginWith{\newstring}{9}{\startnumtrue}{}%
\ifstartnum%
\StrLeft{\newstring}{3}\ \StrMid{\newstring}{4}{5}\ \StrRight{\newstring}{3}%
\else%
\StrLeft{\newstring}{2}\ \StrMid{\newstring}{3}{4}\ \StrMid{\newstring}{5}{6}\ \StrRight{\newstring}{2}%
\fi%
\else%
#1%
\fi%
}
\begin{document}
\noindent\splitdigits{23276011}\\
\splitdigits{40443033}\\
\splitdigits{82043033}\\
\splitdigits{90964159}\\
\splitdigits{07979}\\
\splitdigits{110} \splitdigits{112} \splitdigits{113}\\
\splitdigits{9 09 6415 9}\\
\splitdigits{90 96 41 59}\\
\splitdigits{232 76 011}
\end{document}
Ergebnis:
Antwort2
Verzweigen Sie entsprechend der Länge des Arguments: Wenn es acht Ziffern lang ist, verzweigen Sie in Bezug auf die erste Ziffer, andernfalls drucken Sie das Argument.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\phone}{m}
{
\nebu_phone:n { #1 }
}
\cs_new:Nn \nebu_phone:n
{
\int_compare:nTF { \tl_count:n { #1 } = 8 }
{
\__nebu_phone_eight:n { #1 }
}
{
#1
}
}
\cs_new:Nn \__nebu_phone_eight:n
{
\str_case_e:nnF { \tl_head:n { #1 } }
{
{4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
}
{
\__nebu_phone_ii:nnnnnnnn #1
}
}
\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\nobreakspace#4#5\nobreakspace#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\nobreakspace#3#4\nobreakspace#5#6\nobreakspace#7#8 }
\ExplSyntaxOff
\begin{document}
\phone{23276011}
\phone{40443033}
\phone{82043033}
\phone{90964159}
\phone{07979}
\phone{110}, \phone{112}, \phone{113}
\end{document}
Möchte man Leerzeichen aus der Eingabe entfernen, muss man auf die Erweiterbarkeit verzichten:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\phone}{m}
{
\nebu_phone:n { #1 }
}
\tl_new:N \l__nebu_phone_tl
\cs_new_protected:Nn \nebu_phone:n
{
\tl_set:Nn \l__nebu_phone_tl { #1 }
\tl_remove_all:Nn \l__nebu_phone_tl { ~ }
\int_compare:nTF { \tl_count:N \l__nebu_phone_tl = 8 }
{
\__nebu_phone_eight:V \l__nebu_phone_tl
}
{
\tl_use:N \l__nebu_phone_tl
}
}
\cs_new:Nn \__nebu_phone_eight:n
{
\str_case_e:nnF { \tl_head:n { #1 } }
{
{4}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{8}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
{9}{ \__nebu_phone_iii_ii_iii:nnnnnnnn #1 }
}
{
\__nebu_phone_ii:nnnnnnnn #1
}
}
\cs_generate_variant:Nn \__nebu_phone_eight:n { V }
\cs_new:Nn \__nebu_phone_iii_ii_iii:nnnnnnnn { #1#2#3\nobreakspace#4#5\nobreakspace#6#7#8 }
\cs_new:Nn \__nebu_phone_ii:nnnnnnnn { #1#2\nobreakspace#3#4\nobreakspace#5#6\nobreakspace#7#8 }
\ExplSyntaxOff
\begin{document}
\phone{232 76 011}
\phone{40 44 30 33}
\phone{820 430 33}
\phone{90964159}
\phone{079 79}
\phone{110}, \phone{112}, \phone{113}
\end{document}
Die Ausgabe ist die gleiche.