
Zum Formatieren von E-Mail-Adressen in einem E-Mail-Header habe ich folgende Makros vorbereitet.
\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
}
Die Makros können wie in den folgenden Beispielen gezeigt verwendet werden. Bitte beachten Sie, dass []
für optionale Argumente anstelle von verwendet wird {}
.
\email[Doe, John]{[email protected]}
\emailFrom[Doe, John]{[email protected]}
\emailFrom{[email protected]}
\emailTo[Doe, John]{[email protected]}
\emailTo{[email protected]}
Die formatierte Ausgabe sieht folgendermaßen aus:
"Doe, John" <[email geschützt]>
Aus:"Doe, John" <[email geschützt]>
Aus:<[email geschützt]>
Zu:"Doe, John" <[email geschützt]>
Zu:<[email geschützt]>
Wie kann ich das Makro erweitern, damit ich es mit mehreren E-Mail-Adressen verwenden kann? Das folgende Beispiel soll die Problematik verdeutlichen. Wie man am dritten Beispiel sieht, ist das Vorkommen des Alias für jeden E-Mail-Eintrag individuell.
Zu:"Doe, John" <[email geschützt]>, "Doe, Jane" <[email geschützt]>
Zu:<[email geschützt]>, <[email geschützt]>
Zu:<[email geschützt]>, "Doe, Jane" <[email geschützt]>
Da ich neu in der Verwendung von Makros in Latex bin, können Sie meine Befehle auch gerne allgemein verbessern oder dazu Kommentare hinterlassen.
Aktualisieren:
Beim Bearbeiten mehrerer E-Mails ist mir aufgefallen, dass es auch vorkommen kann, dassNEINE-Mail-Adressegegeben, nur derE-Mail-Alias. Dies geschieht, wenn jemand E-Mails weiterleitet, z. B. als interne Konversation in einem Unternehmen. Trotzdem akzeptiere ich dieses Format als gültigen E-Mail-Header. Sehen Sie eine Möglichkeit, dieses Schema in die Makros aufzunehmen? Hier ist ein Beispiel.
From: John Doe
Subject: Re: E-Mail headers
Date: Wed, 22 Aug 2012 23:42:00 +0200
To: Jane Doe
Antwort1
Ich würde für die Fälle mit einer Adresse und mehreren Adressen eine andere Syntax verwenden:
\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}
Antwort2
Diese Lösung nutzt foreach
vonTikZ / PGF. Du gibst die Namen und Mails als Liste des Formulars name/mail,name/mail
an usw.:
Der Code
\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}
Das Ergebnis
Bearbeitung 1:Eine kleine Verallgemeinerung: Jetzt können Sie \email
es für andere Definitionen wiederverwenden. Ich habe keine Ahnung, wie das mit optionalen Parametern geht, da deren Anzahl nicht der Anzahl der Parameter entspricht.
Der Code
\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
}
Das Ergebnis
\emailto{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
\emailfrom{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
Bearbeitung 2: Und jetzt etwas ganz anderes:
Diese Lösung verwendet xstring
, das Listenformat ist (name)email;
.
Bitte beachten Sie, dass Sie auchmuss die Liste mit einem Semikolon beenden;
Der Code
\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}