LaTeX3 解决方案

LaTeX3 解决方案

我想定义一个宏,根据给定的(可选)参数数量执行不同的操作。这可能吗?怎么做?

\documentclass{standalone}
\usepackage{xparse}

\DeclareDocumentCommand{\MyCommand}{ g g g }{
% if 1 parameter
   thing for 1 parameter #1
% else if 2 parameters
   thing for 2 parameters #1 #2
% else if 3 parameters
   thing for 3 parameters #1 #2 #3
}

\begin{document}
\MyCommand{one}
\MyCommand{one}{two}
\MyCommand{one}{two}{three}
\end{document}

答案1

简短的回答是是的.可以\IfNoValueTF当作开关使用。

可能最好使用o而不是g

我认为使用 的代码实际上更简洁\ExplSyntaxOn。有些人可能会说更容易阅读(%阅读起来并不那么令人分心)---其他人可能不这么认为。;)

\ExplSyntaxOn您将必须使用它~来留出空间。

\documentclass{article}
\usepackage{xparse}
\pagestyle{empty}
\ExplSyntaxOn
\NewDocumentCommand{\testing}{ ooo }
    {
        \IfNoValueTF {#1} { \texttt{Hello ~ World} }{
            \IfNoValueTF {#2} { \textit{#1} }{
                \IfNoValueTF {#3}  { \textbf{#1}:\textsf{#2} }
                    { \textbf{#3}:\textit{#2}:\textsf{#1} }
            }}
    }
\ExplSyntaxOff
\begin{document}

\testing[One][Two][Three]

\testing[One][Two]

\testing[One]

\testing
\end{document}

LaTeX3 解决方案

\documentclass{article}
\usepackage{xparse}
\pagestyle{empty} 
\ExplSyntaxOn
\int_new:N \g__my_options_count_int
\int_gset:Nn \g__my_options_count_int {3}
\NewDocumentCommand{\testing}{ ooo }
    {
        \IfNoValueT {#3}{  \int_gdecr:N \g__my_options_count_int }
        \IfNoValueT {#2}{  \int_gdecr:N \g__my_options_count_int }
        \IfNoValueT {#1}{  \int_gdecr:N \g__my_options_count_int }
        \int_case:nnn { \g__my_options_count_int }
            {
                {  3  }{\textbf{#3}:\textit{#2}:\textsf{#1}}
                {  2  }{\textbf{#1}:\textsf{#2}}
                {  1  }{\textit{#1}}
            }{
                \texttt{Hello ~ World}
            }
        \int_gset:Nn \g__my_options_count_int {3}
    }

\ExplSyntaxOff
\begin{document}

\testing[One][Two][Three]

\testing[One][Two]

\testing[One]

\testing
\end{document}

以上所有都产生:

在此处输入图片描述

相关内容