我想定义一个执行以下操作的电子邮件宏:
输入:\domainemail{Jack Johnson}
输出:杰克·约翰逊
输出应该是一个突出显示的超链接,上面写着“mailto:[电子邮件保护]“。
我所拥有的是
\usepackage[colorlinks=true,allcolors=DarkBlue]{hyperref}
\newcommand{\domainemail}[1]{\href{mailto:#[email protected]}{#1}}
生成链接“mailto:Jack[电子邮件保护]“
我怎样才能用句号代替空格,用小写字母代替大写字母?我尝试用 括起来,#1
但这\lowercase
似乎破坏了超链接。
奖金
\domainemail
如果可以处理变音符号(包括 ß)以及多个名字和姓氏,则可以获得加分,例如
输入:\domainemail{Johnson-Löffler, Jack Björn}
输出:Johnson-Löffler,Jack Björn 带有超链接“mailto:[电子邮件保护]“
答案1
代码的某些部分基于我的另一个答案。\addtranslations
您可以为所需的 Unicode 字符设置所需的“翻译”。无论如何,对于非常奇怪的名称,您可以使用可选参数\domainemail
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\usepackage{hyperref}
\ExplSyntaxOn
\NewDocumentCommand{\addtranslations}{m}
{
\clist_map_inline:nn { #1 }
{
\seq_gput_right:Nn \g_casimir_search_replace_seq { ##1 }
}
}
\NewDocumentCommand{\domainemail}{om}
{
\IfNoValueTF { #1 }
{
\casimir_domainemail:n { #2 }
}
{
\casimir_href:nn { #1 } { #2 }
}
}
\seq_new:N \g_casimir_search_replace_seq
\tl_new:N \l_casimir_input_tl
\cs_generate_variant:Nn \tl_lower_case:n { V }
\cs_new_protected:Nn \casimir_href:nn { \href{mailto:#[email protected]}{#2} }
\cs_generate_variant:Nn \casimir_href:nn { V }
\cs_new_protected:Nn \casimir_domainemail:n
{
\seq_set_from_clist:Nn \l__casimir_domainemail_temp_seq { #1 }
\int_compare:nTF { \seq_count:N \l__casimir_domainemail_temp_seq > 1 }
{
\tl_set:Nx \l_casimir_input_tl
{
\seq_item:Nn \l__casimir_domainemail_temp_seq { 2 }
.
\seq_item:Nn \l__casimir_domainemail_temp_seq { 1 }
}
\tl_remove_all:Nn \l_casimir_input_tl { ~ }
}
{
\seq_set_split:Nnn \l__casimir_domainemail_temp_seq { ~ } { #1 }
\tl_set:Nx \l_casimir_input_tl
{
\seq_use:Nn \l__casimir_domainemail_temp_seq { . }
}
}
\tl_set:Nx \l_casimir_input_tl { \tl_lower_case:V \l_casimir_input_tl }
\seq_map_inline:Nn \g_casimir_search_replace_seq
{
\tl_replace_all:Nnn \l_casimir_input_tl ##1
}
\casimir_href:Vn \l_casimir_input_tl { #1 }
}
\ExplSyntaxOff
% set up the translations
\addtranslations{
{æ}{ae},
{ä}{ae},
{ö}{oe},
{ü}{ue},
{ß}{ss},
{ñ}{n},
{é}{e},
}
\begin{document}
\domainemail{Jack Johnson}
\domainemail{Johnson-Löffler, Jack Björn}
\domainemail{Äöß, Reñé Joseph}
\domainemail[strange]{Some strange name}
\end{document}
答案2
添加句点很简单,\add@period#1 #2{#1.#2}
使用空格作为第一个名字和第二个名字的分隔符,然后用 then 输入.
。
在我看来,将名字转换为小写更加困难,但我使用了\text_lowercase:n
提供expl3
此功能的功能。
\documentclass{article}
\usepackage[svgnames,dvipsnames,x11names]{xcolor}
\usepackage[colorlinks=true,allcolors=DarkBlue]{hyperref}
\usepackage{expl3}
\makeatletter
\def\add@period#1 #2{#1.#2}%
\ExplSyntaxOn
\newcommand{\addperiod}[1]{%
\text_lowercase:n{\add@period#1}% Expandable lower case
}
\ExplSyntaxOff
\makeatother
\newcommand{\domainemail}[1]{%
\href{mailto:\addperiod{#1}@domain.org}{#1}%
}
\begin{document}
\domainemail{Jack Johnson}
\end{document}