根据是否设置了以下参数之一,在“;”或“。”之间进行“智能”选择

根据是否设置了以下参数之一,在“;”或“。”之间进行“智能”选择
\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}

在此处输入图片描述

相关内容