Проблема
Я пытаюсь разделить некоторые числа на основе некоторых очень простых критериев. Числа с8
цифрами, начинающимися с4,8или9следует разбить на группы цифр длиной 3 2 3
.
Любую другую цифру длиной 8 следует разбить на группы по две.
Числа, содержащие менее 8 цифр, не следует разбивать на группы.
Примеры
- 23 27 60 11 (жесткие пробелы)
- 404 43 033 (жесткие пробелы, 3 2 3)
- 820 43 033 (жесткие пробелы, 3 2 3)
- 909 64 159 (с жесткими пробелами)
- 07979 (без пробелов)
- 110 (без пробелов), 112 (без пробелов), 113 (без пробелов)
Извините за отсутствие MWE, но я не совсем уверен, с чего начать.
решение1
Это можно сделать с помощью xstring
пакета, который предоставляет команды для извлечения и сравнения подстрок.
Можно выполнить некоторую предварительную обработку строки перед применением форматирования, например, удалить пробелы. Команды xstring
для извлечения подстрок, модификаций и подсчетов имеют общий синтаксис \Command{arg1}{...}[\result]
, где необязательный \result
аргумент сохраняет результат для дальнейшей обработки (если этот аргумент не указан, результат просто выводится напрямую). Это можно использовать для предварительной обработки, чтобы сохранить предварительно обработанную строку и выполнить остальную обработку строки результата.
МВЭ:
\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}
Результат:
решение2
Разветвление в соответствии с длиной аргумента: если он состоит из восьми цифр, разветвление выполняется относительно первой цифры; в противном случае выводится аргумент.
\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}
Если вы хотите удалить пробелы из входных данных, вам придется отказаться от расширяемости:
\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}
Результат тот же.