我想在使用 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}