\documentclass[a4paper,10pt]{article}
\usepackage{ifthen}
\begin{document}
\newcommand{\ABC}[4]{foo}
\renewcommand{\ABC}[4]{%
\textbf{#1:}\\
\ifthenelse{\equal{#2}{}}{}{A #2.\ }%
\ifthenelse{\equal{#3}{}}{}{B #3.\ }%
\ifthenelse{\equal{#4}{}}{}{C #4.\ }%
\\
}
\ABC{Foo}{x}{}{z}
\ABC{Foy}{x}{y}{}
\ABC{Bar}{}{y}{}
\ABC{Baz}{}{y}{z}
\ABC{Zoo}{x}{}{}
\end{document}
现在可选的“A”、“B”、“C”部分始终用“。”分隔:
Foo:
A x. C z.
Foy:
A x. B y.
Bar:
B y.
Baz:
B y. C z.
Zoo:
A x.
如果有下一部分,我希望这个宏能够“智能地”输入“;”而不是“。”:
Foo:
A x; C z.
Foy:
A x; B y.
Bar:
B y.
Baz:
B y; C z.
Zoo:
A x.
在 $\LaTeX$ 中表达这一点的最简洁的方式是什么?
这确实有一些条件吗:
\ifthenelse{\equal{#2}{}}{}{ \ifthenelse{\equal{#3}{ \ifthenelse{\equal{#4}{...
或者使用组合或“和”、“或”语句,
或者是否存在其他更简洁的方法,也许使用一些变量?
(我使用 pdflatex)
答案1
使用 很简单xparse
,先检查参数是否为空,然后将需要的位添加到序列中,再传递以“分号和空格”分隔的序列项,最后打印句点。
\documentclass[a4paper,10pt]{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\ABC}{mmmm}
{
\par\noindent
\textbf{#1:}\\
\gw_abc:nnn { #2 } { #3 } { #4 }
}
\seq_new:N \l_gw_abc_seq
\cs_new_protected:Nn \gw_abc:nnn
{
\seq_clear:N \l_gw_abc_seq
\tl_if_blank:nF { #1 } { \seq_put_right:Nn \l_gw_abc_seq { A~#1 } }
\tl_if_blank:nF { #2 } { \seq_put_right:Nn \l_gw_abc_seq { B~#2 } }
\tl_if_blank:nF { #3 } { \seq_put_right:Nn \l_gw_abc_seq { C~#3 } }
\seq_use:Nn \l_gw_abc_seq { ;~ }.
}
\ExplSyntaxOff
\begin{document}
\ABC{Foo}{x}{}{z}
\ABC{Foy}{x}{y}{}
\ABC{Bar}{}{y}{}
\ABC{Baz}{}{y}{z}
\ABC{Zoo}{x}{}{}
\end{document}