收件人和地址(在信件中)有一组公共字段,如名字、姓氏、街道、城镇、电话号码...我制作了一个模板,其中地址的所有元素都通过预定义字段给出,如\def\firstname(myname),...,\def\landlinephone{1234}。
目前我正在使用 \ifthenelse 语句来避免空字段的问题。
\firstname~\surname
\street
\town~\zipcode
\ifthenelse{\equal{\landlinephone}{}}{}%
{\landlinephsymbol~\landlinephone}
\ifthenelse{\equal{\mobilephone}{}}{\\}%
{ \mobilephsymbol~\landlinephone}
\ifthenelse{\equal{\email}{}}{\\}%
{\emailsymbol~\email\\}
等等。如果收件人没有任何固定电话号码,手机号码和电子邮件仍将占用两行。在这种情况下,我希望 latex 将两者安排在同一行。我接受每行最多两个电子联系信息。我可以用很多 \ifthenelse 来做到这一点,但代码会太大。
更新
下面我展示了总共给出 6 个联系电话/地址的情况。我用表格显示了这些联系信息。这里使用表格的方式只适用于给出列表中所有六个字段的情况。字段在 .tex 文件中定义的顺序没问题。
我需要的是 \contactdetails 按照给定的顺序填充此列表,表格从左到右,并根据需要添加行。只有当前两个字段已满时才应创建新行。如果只给出了一个手机号码和一个电子邮件,则只需创建一行。第一个字段将包含手机号码。接下来是电子邮件地址。
我不希望 \contactdetails 仅限于六个字段。我稍后可能会使用代码来用完全不同类型的数据填充更大的表格。无论匹配“.*phone\d”还是“.email\d',其中'。' 可以是随机字符串,并且 \d 是数字,应被视为电子联系方式。
\usepackage{marvosym}
\def\landlinephone{1023455669}
\def\mobilephone{9876543212}
\def\landlinephone2{1231234567}
\def\mobilephone2{8765423444}
\def\emailaddr{[email protected]}
\def\emailaddr2{[email protected]}
\newcommand{\contactdetails}{%
\begin{tabular}{ l l }
\Telefon~\landlinephone & \Telefon~\landlinephone2
\Mobilefone~\def\mobilephone & \def\mobilephone2
\Letter~\def\emailaddr & \def\emailaddr2
\end{tabular}
答案1
因此,如果我理解正确的话,如果电子内容只有两个项目,我们会将它们放在同一行,但如果有三个项目,则每个项目都放在一行中(我们称这种可能性为 A)。另一种可能性是,如果有三个,则前两个放在一起,第三个放在一行中。我们称这种可能性为 B。
可能性 B 比较简单。我们可以定义一个命令\separator
,
\def\separator{\quad\def\separator{\\}}
然后写入:
\ifthenelse{\equal{\landlinephone}{}}{}%
{\landlinephsymbol~\landlinephone\separator}%
\ifthenelse{\equal{\mobilephone}{}}{}%
{\mobilephsymbol~\landlinephone\separator}%
\ifthenelse{\equal{\email}{}}{}%
{\emailsymbol~\email}%
以获得预期的结果。
可能性 A 有点棘手。我们需要知道是否有两个以上的电子联系人项,然后进行\separator
适当的定义。实现此目的的方法是存储联系人项以供以后扩展。
\newcounter{electronicitems}
\setcounter{electronicitems}{0}
\ifthenelse{\equal{\landlinephone}{}}{\def\LANDLINE{}}%
{\def\LANDLINE{\landlinephsymbol~\landlinephone\separator}%
\stepcounter{electronicitems}}%
\ifthenelse{\equal{\mobilephone}{}}{}%
{\def\MOBILE{\mobilephsymbol~\landlinephone\separator}%
\stepcounter{electronicitems}}%
\ifthenelse{\equal{\email}{}}{\def\EMAIL{}}%
{\def\EMAIL{\emailsymbol~\email}%
\stepcounter{electronicitems}}%
\ifnum\value{electronicitems}>2\def\separator{\\}%
\else\def\separator{\quad}%
\fi
\LANDLINE\MOBILE\EMAIL
答案2
您可以设置电子信息存储以使用计数器。这样您就可以跟踪已定义的项目数。以下是可能的实现:
\documentclass{article}
\usepackage{fontawesome}
\newcommand{\setlandlinephone}[1]{%
\def\landlinephone{#1}% Store landline phone number
% Check if user supplied anything (could be empty)
\ifnum\pdfstrcmp{#1}{}=0\else% User did supply a non-empty landline phone number
\stepcounter{einfo}% Step einfo counter
\fi}
\newcommand{\setmobilephone}[1]{%
\def\mobilephone{#1}% Store mobile phone number
% Check if user supplied anything (could be empty)
\ifnum\pdfstrcmp{#1}{}=0\else% User did supply a non-empty mobile phone number
\stepcounter{einfo}% Step einfo counter
\fi}
\newcommand{\setemail}[1]{%
\def\email{#1}% Store email address
% Check if user supplied anything (could be empty)
\ifnum\pdfstrcmp{#1}{}=0\else% User did supply a non-empty email address
\stepcounter{einfo}% Step einfo counter
\fi}
\newcounter{einfo}
\newcommand{\seteinfo}{%
\ifnum\value{einfo}=3
% 3 elements provided; choose preference (mobile + email; ignore landline)
\faMobile~\mobilephone~~\faAt~\email
\else% einfo < 3
\ifnum\pdfstrcmp{\csname landlinephone\endcsname}{}=0\else
\faPhone~\csname landlinephone\endcsname~~% Landline supplied
\fi
\ifnum\pdfstrcmp{\csname mobilephone\endcsname}{}=0\else
\faMobile~\csname mobilephone\endcsname~~% Mobile phone supplied
\fi
\ifnum\pdfstrcmp{\csname email\endcsname}{}=0\else
\faAt~\csname email\endcsname% Email supplied
\fi
\fi
}
\begin{document}
\newcommand{\showeinfo}[3]{% Just for this example
\par\medskip
\setcounter{einfo}{0}% Reset electronic information counter
\setlandlinephone{#1}% Landline
\setmobilephone{#2}% Mobile
\setemail{#3}% Email
\seteinfo
}
\showeinfo{123-456-7890}{}{}% Only landline
\showeinfo{}{987-654-3210}{}% Only mobile
\showeinfo{}{}{[email protected]}% Only email
\showeinfo{123-456-7890}{987-654-3210}{}% Landline and mobile only
\showeinfo{123-456-7890}{}{[email protected]}% Landline and email only
\showeinfo{}{987-654-3210}{[email protected]}% Mobile and email only
\showeinfo{123-456-7890}{987-654-3210}{[email protected]}% Landline, mobile and email
\end{document}
在上面的代码中,元素之间的文本比较使用\pdfstrcmp{<stringA>}{<stringB>}
。这将以数字的形式返回结果。具体来说,-1
如果按字典顺序排列<stringA>
< <stringB>
、0
如果它们相等,或者1
如果按字典顺序排列<stringA>
> ,则返回结果<stringB>
。因此,由于此字符串比较的预期结果是一个数字,我们使用 来\ifnum<string comparison>=0
检查两个字符串是否相同。它专门用于检查用户是否提供了空白条目,这可能需要扩展参数 - 有些事情\pdfstrcmp
自然会发生。