
Preparei as seguintes macros para formatar endereços de e-mail em um cabeçalho de e-mail.
\usepackage{xifthen}% Provides \ifthenelse and \isempty
% E-Mail header strings with format.
\newcommand{\fromString}{\textbf{From:} }
\newcommand{\toString}{\textbf{To:} }
% E-Mail with or without alias.
\newcommand{\email}[2][]{%
\ifthenelse{\isempty{#1}}%
{<#2>}% E-Mail only
{"#1" <#2>}% Alias and E-Mail
}
% E-Mail header From:
\newcommand{\emailFrom}[2][]{%
\ifthenelse{\isempty{#1}}%
{\fromString \email{#2}\\}% E-Mail only
{\fromString \email[#1]{#2}\\}% Alias and E-Mail
}
% E-Mail header To:
\newcommand{\emailTo}[2][]{%
\ifthenelse{\isempty{#1}}%
{\toString \email{#2}\\}% E-Mail only
{\toString \email[#1]{#2}\\}% Alias and E-Mail
}
As macros podem ser usadas conforme ilustrado pelos exemplos a seguir. Lembre-se de que []
são usados para argumentos opcionais em vez de {}
.
\email[Doe, John]{[email protected]}
\emailFrom[Doe, John]{[email protected]}
\emailFrom{[email protected]}
\emailTo[Doe, John]{[email protected]}
\emailTo{[email protected]}
A saída formatada fica assim:
"Sim, John" <[e-mail protegido]>
De:"Sim, John" <[e-mail protegido]>
De:<[e-mail protegido]>
Para:"Sim, John" <[e-mail protegido]>
Para:<[e-mail protegido]>
Como eu poderia estender a macro para poder usá-la com vários endereços de email? O exemplo a seguir deve explicar o problema. Como você pode ver no terceiro exemplo, a ocorrência do alias é individual para cada entrada de e-mail.
Para:"Sim, John" <[e-mail protegido]>, "Doe, Jane" <[e-mail protegido]>
Para:<[e-mail protegido]>, <[e-mail protegido]>
Para:<[e-mail protegido]>, "Doe, Jane" <[e-mail protegido]>
Como sou novo no uso de macros em látex, você também pode melhorar meus comandos de maneira geral ou deixar comentários sobre isso.
Atualizar:
Ao trabalhar com vários emails percebi que isso também pode acontecer, que existenãoendereço de emaildado, apenas oalias de e-mail. Isso acontece quando alguém encaminha e-mails, por exemplo, como uma conversa interna em uma empresa. No entanto, aceito este formato como cabeçalho de email válido. Você vê alguma chance de incluir esse esquema nas macros? Aqui está um exemplo.
From: John Doe
Subject: Re: E-Mail headers
Date: Wed, 22 Aug 2012 23:42:00 +0200
To: Jane Doe
Responder1
Eu usaria uma sintaxe diferente para os casos de um endereço e vários endereços:
\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter
\newif\if@emailenv
\newenvironment{emails}[1][\ignorespaces]
{\set@email@separator{#1}\@emailenvtrue\begin{flushleft}}
{\end{flushleft}}
\def\set@email@separator#1{%
\def\email@separator{#1\def\email@separator{,}}}
\newcommand{\@email}[2][]{%
\if@emailenv\else\begin{flushleft}\fi
\email@separator\space
\if\relax\detokenize{#1}\relax\else"#1" \fi
\texttt{<#2>}%
\if@emailenv\ignorespaces\else\end{flushleft}\fi
}
\newcommand{\email}{%
\if@emailenv\else\set@email@separator{\ignorespaces}\fi\@email}
\newcommand{\emailTo}{%
\if@emailenv\else\set@email@separator{\textbf{To:}}\fi\@email}
\newcommand{\emailFrom}{%
\if@emailenv\else\set@email@separator{\textbf{From:}}\fi\@email}
\newcommand{\emailsFrom}{\emails[\textbf{From:}]}
\newcommand{\emailsTo}{\emails[\textbf{To:}]}
\let\endemailsFrom\endemails
\let\endemailsTo\endemails
\makeatother
\begin{document}
\email{[email protected]}
\email[Doe, John]{[email protected]}
\emailTo{[email protected]}
\emailTo[Doe, John]{[email protected]}
\emailFrom{[email protected]}
\emailFrom[Doe, John]{[email protected]}
\begin{emails}
\email{[email protected]}
\email[Doe, John]{[email protected]}
\email[Doe, Jane]{[email protected]}
\end{emails}
\begin{emailsTo}
\email{[email protected]}
\email[Doe, John]{[email protected]}
\email[Doe, Jane]{[email protected]}
\end{emailsTo}
\begin{emailsFrom}
\email{[email protected]}
\email[Doe, John]{[email protected]}
\email[Doe, Jane]{[email protected]}
\end{emailsFrom}
\end{document}
Responder2
Esta solução utiliza foreach
desdeTaxa de câmbio TikZ. Você especifica os nomes e e-mails como uma lista do formulário name/mail,name/mail
e assim por diante:
O código
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usepackage{xifthen}
\newcommand{\toString}{\textbf{To:} }
\newcommand{\emailto}[1]% list ; "/" separates mail and name, "," separates people
{ \xdef\maillist{}% empty maillist
\foreach \x/\y [count=\c] in {#1}% for each iteration over the name/mail list, increase \c by one
{ \ifthenelse{\c=1}% if first iteration...
{\xdef\addcomma{}}% leave out comma
{\xdef\addcomma{,}}% else put one
\ifthenelse{\equal{\x}{}}% if no name given
{\xdef\maillist{\maillist\addcomma$<$\y$>$}}% put just <mail>
{\xdef\maillist{\maillist\addcomma"\x"$<$\y$>$}}% else put "name"<mail>
}
\toString\maillist% output of the final list
}
\begin{document}
\emailto{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
\end{document}
O resultado
Editar 1:Uma pequena generalização: agora você pode reutilizar \email
para outras definições. Não tenho ideia de como fazer isso com parâmetros opcionais, pois o número deles não é igual aos parâmetros.
O código
\newcommand{\email}[1]% list ; "/" separates mail and name, "," separates people
{ \xdef\maillist{}% empty maillist
\foreach \x/\y [count=\c] in {#1}% for each iteration over the name/mail list, increase \c by one
{ \ifthenelse{\c=1}% if first iteration...
{\xdef\addcomma{}}% leave out comma
{\xdef\addcomma{,}}% else put one
\ifthenelse{\equal{\x}{}}% if no name given
{\xdef\maillist{\maillist\addcomma$<$\y$>$}}% put just <mail>
{\xdef\maillist{\maillist\addcomma"\x"$<$\y$>$}}% else put "name"<mail>
}
}
\newcommand{\emailto}[1]
{ \email{#1}
\textbf{To: }\maillist
}
\newcommand{\emailfrom}[1]
{ \email{#1}
\textbf{From: }\maillist
}
O resultado
\emailto{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
\emailfrom{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
Editar 2: E agora para algo completamente diferente:
Esta solução usa xstring
, o formato da lista é (name)email;
.
Observe que você tambémtem que encerrar a lista com ponto e vírgula;
O código
\documentclass[parskip]{scrartcl}
\usepackage[margin=10mm]{geometry}
\usepackage{xifthen}
\usepackage{xstring}
\usepackage{xcolor}
\newcommand{\email}[1]% (<name>)<email>;(<name>)<email>
{ \xdef\mylist{#1} % set mylist to the input
\xdef\myentry{} % empty myentry
\xdef\myname{} % empty myname
\xdef\myemail{} % empty myemail
\xdef\myoutput{} % empty myoutput
\xdef\mynumber{} % empty mynumber
\StrBefore{\mylist}{;}[\myentry] % get everything in mylist before ; and save it to myentry, so this should be the first person, e.g (name)mail
\StrLen{\myentry}[\mynumber] % save length of myentry to mynumber
\whiledo{\mynumber>0} % while myentry is not empty (e.g. length > 0)
{ \StrBetween{\myentry}{(}{)}[\myname] % extract what is between ( and ) in myentry and save it to myname
\StrPosition{\myentry}{)}[\mynumber] % save position of ) to mynumber
\ifthenelse{\mynumber>0} % if the character ) is found in myentry
{ \StrBehind{\myentry}{)}[\myemail]} % then get everything behind ), e.g the email
{ \xdef\myemail{\myentry}}% otherwise (e.g. no name present) set myemail to myentry
\StrLen{\myname}[\mynumber] % set mynumber to the length of mynem
\ifthenelse{\mynumber>0} % if length of myname is non-zero (e.g one was provided)
{ \xdef\myoutput{\myoutput"\myname"$<$\myemail$>$}} % then print "name"<mail>
{ \xdef\myoutput{\myoutput$<$\myemail$>$}} % else print <mail>
\StrBehind{\mylist}{;}[\mylist] % delete everything up to the first ; e.g the entry that was just worked with
\StrBefore{\mylist}{;}[\myentry] % new myentry is everything before the next ;
\StrLen{\myentry}[\mynumber] % determine length of myentry and save that number to mynumber
\ifthenelse{\mynumber>0} % if a new myentry is present (e.g not end of list)
{ \xdef\myoutput{\myoutput,}} % then add a comma
{} % else do nothing
}
%\myoutput % after all entrys were processed, output the result
}
\newcommand{\eMailTo}[1]%
{ \email{#1}
\textbf{To: }\myoutput
}
\newcommand{\eMailFromColor}[2][green!50!gray]%
{ \email{#2}
\textcolor{#1}{\textbf{From: }\myoutput}
}
\begin{document}
\eMailTo{(Doe, John)[email protected];(Dane, J. A. N. E)[email protected];[email protected];}
\eMailFromColor{(Doe, John)[email protected];(Dane, J. A. N. E)[email protected];[email protected];}
\eMailFromColor[red!80!black]{(Doe, John)[email protected];(Dane, J. A. N. E)[email protected];[email protected];}
\end{document}