
電子メール ヘッダー内の電子メール アドレスをフォーマットするための次のマクロを用意しました。
\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
}
マクロは、次の例に示すように使用できます。[]
の代わりに がオプションの引数として使用されることに注意してください{}
。
\email[Doe, John]{[email protected]}
\emailFrom[Doe, John]{[email protected]}
\emailFrom{[email protected]}
\emailTo[Doe, John]{[email protected]}
\emailTo{[email protected]}
フォーマットされた出力は次のようになります。
「ドゥー、ジョン」<[メールアドレス]>
から:「ドゥー、ジョン」<[メールアドレス]>
から:<[メールアドレス]>
に:「ドゥー、ジョン」<[メールアドレス]>
に:<[メールアドレス]>
マクロを拡張して、複数の電子メール アドレスで使用できるようにするにはどうすればよいでしょうか。次の例でこの問題について説明します。3 番目の例からわかるように、エイリアスは電子メール エントリごとに個別に発生します。
に:「ドゥー、ジョン」<[メールアドレス]>、「ドー、ジェーン」<[メールアドレス]>
に:<[メールアドレス]>、<[メールアドレス]>
に:<[メールアドレス]>、「ドー、ジェーン」<[メールアドレス]>
私は LaTeX でマクロを使用するのが初めてなので、私のコマンドを全体的に改善したり、コメントを残したりすることも歓迎します。
アップデート:
いくつかの電子メールを扱っているうちに、私はそれが起こり得ることに気づいた。いいえ電子メールアドレス与えられた、 だけメールエイリアスこれは、たとえば会社の内部会話として誰かがメールを転送するときに発生します。それでも、私はこの形式を有効なメール ヘッダーとして受け入れます。このスキーマをマクロに含める可能性はありますか? 以下に例を示します。
From: John Doe
Subject: Re: E-Mail headers
Date: Wed, 22 Aug 2012 23:42:00 +0200
To: Jane Doe
答え1
アドレスが 1 つの場合と複数の場合では、異なる構文を使用します。
\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}
答え2
このソリューションforeach
では、ティックZ / PGFフォームのリストとして名前とメールname/mail,name/mail
などを指定します。
コード
\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}
結果
編集1:少し一般化すると、\email
他の定義に再利用できるようになります。オプションのパラメータの数がパラメータの数と等しくないため、オプションのパラメータでこれを行う方法がわかりません。
コード
\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
}
結果
\emailto{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
\emailfrom{John Doe/[email protected],Jane Dane/[email protected],/[email protected]}
編集2: さて、今度は全く違う話です:
このソリューションでは を使用しますxstring
。リスト形式は です(name)email;
。
また、リストはセミコロンで終了する必要があります。
コード
\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}