我正在尝试调整提供的解决方案带有和不带有可选参数的不同命令定义来改变我的新命令的行为。我想使用基本命令来避免一些非基本包。
我正在定义一个命令\mysign
,用于在文档末尾生成我的签名。但有时我需要上面的日期,有时不需要。所以我想有一个可选参数来插入它(例如\mysign[date]
)。
另外,有时我需要插入一些个人身份证明,并且我希望有第二个可选参数,但与第一个参数无关。
因此,结果将是这样的:
\mysign
仅签名\mysign[date]
带日期的签名\mysign[id]
带ID的签名\mysign[date, id]
完整签名
问题是它只\@ifnextchar[
适用于一个选项。我无法调整为只适用于第二个选项。
任何想法?
答案1
一种key=value
方法
\documentclass{article}
\usepackage{graphicx}
\usepackage{xkeyval}
\makeatletter
\def\SigurId{}
\define@key{sigur}{date}{\def\SigurDate{#1}}
\define@boolkey{sigur}{id}{
\ifKV@sigur@id
\def\SigurId{\includegraphics[height=1.2ex,width=2cm]{example-image-a}}%
\else
\fi%
}
\makeatother
\newcommand\mysig[1][]{%
\begingroup
\setkeys{sigur}{date={},id=false}
\setkeys{sigur}{#1}
Sigur~\SigurDate\unskip~\SigurId\unskip
\endgroup
}
\begin{document}
\mysig
\mysig[date={\today}]
\mysig[id=true]
\mysig[date=\today,id=true]
\end{document}
答案2
从评论到贡萨洛·梅迪纳的回答我得出结论,可选参数 ID 是常量,而是一个标志。然后 LaTeX 还知道可选的星号作为语法元素。以下示例\mysign
无需进一步的包即可按以下方式定义:
- 如果后面有星号,则表明签名 ID 已设置。
- 如果后面跟着一个可选参数,那么日期就设置了。
- 如果可选参数为空,则
\today
用作日期。
示例文件:
\documentclass{article}
\usepackage{graphicx}
\makeatletter
\newcommand*{\SetId}{%
% tabular is only used for vertical centering
% and ghostscript's example tiger.eps is the dummy
% for the real scanned signature
\begin{tabular}{@{}c@{}}%
\includegraphics[height=2em,trim=0 50mm 0 0,clip]{tiger}%
\end{tabular}%
}
\newcommand*{\mysign}{%
\@ifstar{%
\let\@DoId=\SetId
\@mysign
}{%
\let\@DoId=\relax
\@mysign
}%
}
\newcommand*{\@mysign}[1][\relax]{%
Signature%
\def\@mysign@relax{\relax}%
\def\@mysign@date{#1}%
\ifx\@mysign@date\@mysign@relax
\else
, %
\ifx\@mysign@date\@empty
\today
\else
#1%
\fi
\fi
\ifx\@DoId\relax
\else
, %
\@DoId
\fi
}
\makeatother
\begin{document}
\renewcommand*{\arraystretch}{2}
\begin{tabular}{ll}
\verb|\mysign| & \mysign \\
\verb|\mysign*| & \mysign* \\
\verb|\mysign[]| & \mysign[] \\
\verb|\mysign[2001-02-03]| & \mysign[2001-02-03] \\
\verb|\mysign*[]| & \mysign*[] \\
\verb|\mysign*[2001-02-03]| & \mysign*[2001-02-03] \\
\end{tabular}
\end{document}
答案3
另一个解决方案再次基于基于密钥的接口:它利用pgfkeys
。
代码:
\documentclass[a4paper,11pt]{article}
\usepackage{tikz}
\usepackage{mwe}
% key definition
\newif\ifbaseline
\pgfkeys{/signature/.cd, baseline/.is if=baseline}
\pgfkeys{/signature/.cd,
date/.initial={},
date/.get=\signdate,
date/.store in=\signdate,
id/.initial={},
id/.get=\id,
id/.store in=\id,
}
% Basic command
\newcommand{\signature}[2][]{
\pgfkeys{signature/.cd,
date={},
id={},
baseline=false,
#1}
#2\space\signdate\space%
\ifbaseline
\tikz[baseline=-0.5ex]\node[inner sep=0pt]{\id};
\else
\id
\fi%
}
\begin{document}
\signature{Sigur}
\signature[date=\today]{Sigur}
\signature[id={\includegraphics[width=2em,height=2em]{example-image}}]{Sigur}
\signature[baseline,id={\includegraphics[width=2em,height=2em]{example-image}}]{Sigur}
\signature[baseline,
id={\includegraphics[width=2em,height=2em]{example-image}},
date={June 28, 2013}]{Sigur}
\signature[id={\includegraphics[width=2em,height=2em]{example-image}},
date={June 28, 2013}]{Sigur}
\end{document}
TikZ 并不是真正需要的,实际上它可以被加载pgfkeys
到它的位置,但我喜欢将图片与基线对齐的可能性。
结果:
答案4
那么做这样的事情怎么样:
\usepackage{ifthen}
\newcommand{\mysign}[2]{%
\ifthenelse{\equal{#1}{}}{}{#1\\}%
SIGNATURE CODE%
\ifthenelse{\equal{#2}{}}{}{\\#2}}
然后只需将您不想使用的字段留空即可
即\mysign{date}{}
仅约会等等...