![根据是否设置了以下参数之一,在“;”或“。”之间进行“智能”选择](https://linux22.com/image/354705/%E6%A0%B9%E6%8D%AE%E6%98%AF%E5%90%A6%E8%AE%BE%E7%BD%AE%E4%BA%86%E4%BB%A5%E4%B8%8B%E5%8F%82%E6%95%B0%E4%B9%8B%E4%B8%80%EF%BC%8C%E5%9C%A8%E2%80%9C%EF%BC%9B%E2%80%9D%E6%88%96%E2%80%9C%E3%80%82%E2%80%9D%E4%B9%8B%E9%97%B4%E8%BF%9B%E8%A1%8C%E2%80%9C%E6%99%BA%E8%83%BD%E2%80%9D%E9%80%89%E6%8B%A9.png)
\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}