在手机号码中添加连字符

在手机号码中添加连字符

我想在使用 LaTeX 生成的 PDF 行中添加我的手机号码

我希望它如何呈现:(+91) 7887-61x-xxx

用法:\mobile{91}{788761xxxx}

% Usage: \mobile{<countrycode><mobile number>}
\newcommand*{\mobile}[2]{\def\@countrycode{#1}\def\@mobileno{#2}}
\newcommand*{\countrycode}[1]{\def\@countrycode{#1}}
\newcommand*{\mobileno}[1]{\def\@mobileno{#1}}

分离国家代码的目的是因为我想要使用以下代码来使用 WhatsApp API:

href{https://wa.me/\@countrycode\@mobileno}{(+\@countrycode) \@mobileno}

如何使用 LaTeX 在上述情况下添加空格/连字符?

我希望网址是,https://wa.me/91788761xxxx但文本是(+91)7887-61x-xxx

答案1

您还可以更改连字符格式:

\documentclass{article}
\usepackage{hyperref}

\NewDocumentCommand{\mobile}{O{433}mm}
 {
  \href{https://wa.me/#2#3}{\printmobile[#1]{#2}{#3}}
 }

\ExplSyntaxOn
\NewDocumentCommand{\printmobile}{O{433}mm}
 {
  \saste_mobile:nnn { #1 } { #2 } { #3 }
 }

\int_new:N \l__saste_mobile_index_int

\cs_new_protected:Nn \saste_mobile:nnn
 {
  (+#2)\nobreakspace\__saste_mobile:nn { #1 } { #3 }
 }

\cs_new_protected:Nn \__saste_mobile:nn
 {
  \int_set:Nn \l__saste_mobile_index_int { \tl_item:nn { #1 } { 1 } }
  \tl_range:nnn { #2 } { 1 } { \l__saste_mobile_index_int } % first group
  \int_step_inline:nn { \tl_count:n { #1 } - 1 }
   {
    -
    \tl_range:nnn { #2 }
     { \l__saste_mobile_index_int + 1 } % start point
     { \l__saste_mobile_index_int + \tl_item:nn { #1 } { ##1+1 } } % end point
    \int_set:Nn \l__saste_mobile_index_int
     { \l__saste_mobile_index_int + \tl_item:nn { #1 } { ##1+1 } } % for next cycle
   }
 }

\ExplSyntaxOff

\begin{document}

\mobile{91}{1234567890} \mobile[342]{91}{123456789}

\end{document}

可选参数是数字序列,指定每个连字符分隔的组中有多少位来自后面的数字。这样可以适应不同的国家惯例。默认值为433

图中第一个数字对应的 URL 通过将鼠标悬停在它上面来显示。

在此处输入图片描述

基于以上代码,我们还可以进行更多定制。

使用\setmobile,它可以出现在任何地方,包括文档前言,您可以设置从该点开始使用的选项(但它遵循标准分组规则)。

\documentclass{article}
\usepackage{hyperref}

\NewDocumentCommand{\mobile}{O{}mm}
 {
  \href{https://wa.me/#2#3}{\printmobile[#1]{#2}{#3}}
 }

\ExplSyntaxOn
\NewDocumentCommand{\printmobile}{O{}mm}
 {
  \saste_mobile:nnn { #1 } { #2 } { #3 }
 }

\NewDocumentCommand{\setmobile}{m}
 {
  \keys_set:nn { saste/mobile } { #1 }
 }

\int_new:N \l__saste_mobile_index_int

\keys_define:nn { saste/mobile }
 {
  parens   .bool_set:N         = \l__saste_mobile_parens_bool,
  parens   .default:n          = true,
  parens   .initial:n          = true,
  noparens .bool_set_inverse:N = \l__saste_mobile_parens_bool,
  noparens .default:n          = true,
  presep   .tl_set:N           = \l__saste_mobile_presep_tl,
  presep   .initial:n          = \nobreakspace,
  sep      .tl_set:N           = \l__saste_mobile_sep_tl,
  sep      .initial:n          = -,
  format   .tl_set:N           = \l__saste_mobile_format_tl,
  format   .initial:n          = 433,
 }

\cs_new_protected:Nn \saste_mobile:nnn
 {
  \group_begin:
  \keys_set:nn { saste/mobile } { #1 }
  \bool_if:NT \l__saste_mobile_parens_bool { ( }
  +#2
  \bool_if:NT \l__saste_mobile_parens_bool { ) }
  \l__saste_mobile_presep_tl
  \__saste_mobile:n { #3 }
  \group_end:
 }

\cs_new_protected:Nn \__saste_mobile:n
 {
  \int_set:Nn \l__saste_mobile_index_int { \tl_item:Nn \l__saste_mobile_format_tl { 1 } }
  \tl_range:nnn { #1 } { 1 } { \l__saste_mobile_index_int } % first group
  \int_step_inline:nn { \tl_count:N \l__saste_mobile_format_tl - 1 }
   {
    \l__saste_mobile_sep_tl
    \tl_range:nnn { #1 }
     { \l__saste_mobile_index_int + 1 } % start point
     { \l__saste_mobile_index_int + \tl_item:Nn \l__saste_mobile_format_tl { ##1+1 } } % end point
    \int_set:Nn \l__saste_mobile_index_int
     { \l__saste_mobile_index_int + \tl_item:Nn \l__saste_mobile_format_tl { ##1+1 } } % for next cycle
   }
 }

\ExplSyntaxOff

\begin{document}

\mobile{91}{1234567890}

\bigskip\bigskip

\mobile[format=342]{91}{123456789}

\mobile[noparens,presep=\,,sep=\,,format=333]{91}{123456789}

\setmobile{noparens,presep=\,,sep=\,,format=433}

\mobile{91}{1234567890}

\end{document}

在此处输入图片描述

答案2

如果数字是固定的,你可以这样做

\newcommand*\countrycode{\gdef\@countrycode}
\newcommand*\mobileno{\gdef\@mobileno}

\newcommand*\mobile[2]{\countrycode{#1}\expandafter\mobileno\expandafter{\mobileA#2}}
\def\mobileA#1#2#3#4#5#6#7{#1#2#3#4-#5#6#7-}

然后运行之后\mobile{91}{788761xxxx}你就会进入7887-61x-xxx\@mobileno但不清楚这是否是你想要的。

答案3

如果您能够使用 LuaLaTeX 编译文档,以下解决方案可能会让您感兴趣。它定义了一个名为 的“包装器宏” \mobile,该宏将其参数传递给一个名为 的 Lua 函数mobile(多么不新颖……)。反过来,Lua 函数利用 Lua 的string.sub(“(字符串的)子集”)内置函数来完成工作。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\directlua{
  function mobile ( a , b )
    tex.sprint ( "(+"..a..") "..b:sub(1,4).."-"..b:sub(5,7).."-"..b:sub(8) )
  end
}
% define a LaTeX wrapper macro:
\newcommand\mobile[2]{\directlua{mobile ( "#1" , "#2" )}}

\begin{document}
output of \verb+\mobile{91}{788761xxxx}+:
\mobile{91}{788761xxxx}
\end{document}

相关内容