
Я хочу сделать ярлык для
\href{tel:0123456789}{01\,23\,45\,67\,89}
Я могу использовать \StrSubstitute
из xstring
пакета как
\StrSubstitute{01 23 45 67 89}{ }{\,}
внутри второго аргумента href
. Но то же самое с
\StrSubstitute{01 23 45 67 89}{ }{}
в первом аргументе не сработает.
Я думаю, я понимаю, что это проблема с порядком раскрытия макроса. Но как мне заставить LaTeX сначала раскрыться \StrSubstitute
в строку, которую можно будет проанализировать \href
?
Вот минимальный пример того, чего я на самом деле хочу добиться:
\documentclass{minimal}
\usepackage{xstring}
\usepackage{hyperref}
\newcommand\phone[1]{\href{tel:\StrSubstitute{#1}{ }{}}{\StrSubstitute{#1}{ }{\,}}}
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\href{\StrSubstitute{01 23 45 67 89}{ }{}}{\StrSubstitute{01 23 45 67 89}{ }{\,}}
\phone{01 23 45 67 89}
\end{document}
Редактировать: Парный шаблон не важен, так как в разных странах разные соглашения о формате чисел. Я действительно хочу только заменить/удалить пробелы (и, возможно, другие вещи).
решение1
Развернуть замену строкипервыйсохранив его в аргументе, который затем можно использовать сhyperref
's \href
:
\documentclass{article}
\usepackage{xstring}
\usepackage{hyperref}
\newcommand\phone[1]{%
\StrSubstitute{#1}{ }{}[\firstarg]% Store first substitution in \firstarg
\StrSubstitute{#1}{ }{\,}[\secondarg]% Store second substitution in \secondarg
\href{tel:\firstarg}{\secondarg}% Use stored arguments in \href
}
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\phone{01 23 45 67 89}
\end{document}
решение2
Команды xstring
не расширяемы, поэтому их нельзя использовать в других командах. Здесь можно использовать простую расширяемую замену.
\documentclass{minimal}
\usepackage{hyperref}
\makeatletter
\def\zza#1 {#1\zza}
\def\zzb#1 {#1\,\zzb}
\newcommand\phone[1]{{\def\!##1{}\def\$##1##2{}\href{tel:\zza#1\! }{\zzb#1\$ }}}
\makeatother
\begin{document}
\href{tel:0123456789}{01\,23\,45\,67\,89}
\phone{01 23 45 67 89}
\end{document}
решение3
В таких местах использовать нельзя \StrSubstitute
, поскольку после подстановки создается не сама строка, а довольно сложный набор инструкций для ее создания.
Более сложное решение, которое позволяет избежать необходимости вводить пробелы между парами цифр, поэтому оно будет работать, даже если вы их забудете.
\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\phone}{m}
{
\dlichti_phone:n { #1 }
}
\tl_new:N \l_dlichti_phone_href_tl
\tl_new:N \l_dlichti_phone_print_tl
\cs_new_protected:Nn \dlichti_phone:n
{
\tl_set:Nx \l_dlichti_phone_href_tl { #1 }
% remove all spaces
\tl_replace_all:Nnn \l_dlichti_phone_href_tl { ~ } { }
% save a copy
\tl_set_eq:NN \l_dlichti_phone_print_tl \l_dlichti_phone_href_tl
% insert a thin space between any pair of digits
\regex_replace_all:nnN
{ ([0-9][0-9]) } % two digits followed by another digit
{ \1\c{,} } % the same with \, in between
\l_dlichti_phone_print_tl
% remove the trailing \,
\regex_replace_once:nnN { \c{,} \Z } { } \l_dlichti_phone_print_tl
\dlichti_phone_href:VVV
\c_colon_str
\l_dlichti_phone_href_tl
\l_dlichti_phone_print_tl
}
\cs_new_protected:Nn \dlichti_phone_href:nnn
{
\href{tel#1#2}{#3}
}
\cs_generate_variant:Nn \dlichti_phone_href:nnn { VVV }
\ExplSyntaxOff
\begin{document}
\phone{01 23 45 67 89}
\phone{0123456789}
\end{document}