我的尝试

我的尝试

(SX.](https://tex.stackexchange.com),我想定义一个新的命令,在这种情况下我想表示一个功能,就像问题的标题一样。

我的尝试

\documentclass{memoir}
\usepackage{xparse} % Possible \usepackage{xstring} :)

\NewDocumentCommand{\fun}{o}{%
    \IfValueTF{#1}{%
        #1\colon\mathcal{C}\rightarrow\mathcal{D}%
    }{%
        f\colon\mathcal{A}\rightarrow\mathcal{B}%
    }%
}
\begin{document}
    $\fun$ %$f\colon\mathcal{A}\rightarrow\mathcal{C}$

    $\fun[g]$ %$g\colon\mathcal{C}\rightarrow\mathcal{D}$

    %   You can add more cases, i.e, $\fun[*]$
    %   where * is the letter that is defined.
    $\fun{h}{X}{Y}$ %h\colon\mathcal{X}\rightarrow\mathcal{Y}
\end{document}

另一个有效的解决方法\IfEqCase\IfStrEqCase使用xstring包裹:

\IfEqCase{f}{
    {f}{f\colon\mathcal{A}\rightarrow\mathcal{C}}
    {g}{g\colon\mathcal{C}\rightarrow\mathcal{D}}
    }[{#1#2#3}{#1\colon\mathcal{#2}\rightarrow\mathcal{#3}}]

The output that you would expect is $\fun$.

\IfEqCase{g}{
    {f}{f\colon\mathcal{A}\rightarrow\mathcal{C}}
    {g}{g\colon\mathcal{C}\rightarrow\mathcal{D}}
}[{#1#2#3}{#1\colon\mathcal{#2}\rightarrow\mathcal{#3}}]

The output that you would expect is $\fun[g]$.

\IfEqCase{hXY}{
    {f}{f\colon\mathcal{A}\rightarrow\mathcal{C}}
    {g}{g\colon\mathcal{C}\rightarrow\mathcal{D}}
}[{#1#2#3}{#1\colon\mathcal{#2}\rightarrow\mathcal{#3}}]

The output that you would expect is $\fun{h}{X}{Y}$.

如图所示,我希望你有一个默认参数和至少一个可选参数

如果这个建议有效,那么您能帮助我在创建命令时实现它吗?

PD:我以前问过类似的问题。我有一个“困惑的解决方案”这让我仔细考虑了使用额外的括号{}{}以避免出现错误。

提前致谢

答案1

该语法有 3 个可选参数

\fun[<case>][<after colon>][<after right arrow>]

如果仅使用一个可选参数,则将通过调用预定义案例\csname funcase#1\endcsname。如果使用多个可选参数,则使用其他可选参数填充字段,覆盖默认案例。

妇女权利委员会:

\documentclass{article}
\newcommand\fun[1][f]{\def\funcase{#1}\funauxA}
\newcommand\funauxA[1][\relax]{%
  \ifx\relax#1\relax\csname funcase\funcase\endcsname\else%
    \def\funargA{#1}\expandafter\funauxB%
  \fi%
}
\newcommand\funauxB[1][*]{%
  \funcase\colon\mathcal{\funargA}\rightarrow\mathcal{#1}
}
\def\funcasef{f\colon\mathcal{A}\rightarrow\mathcal{B}}
\def\funcaseg{g\colon\mathcal{C}\rightarrow\mathcal{D}}
% ADD MORE CASES HERE
\def\funcasem{m\colon\mathcal{Q}\rightarrow\mathcal{R}}
\begin{document}
    $\fun$ %$f\colon\mathcal{A}\rightarrow\mathcal{B}$

    $\fun[g]$ %$g\colon\mathcal{C}\rightarrow\mathcal{D}$

    %   You can add more cases, i.e, $\fun[*]$
    %   where * is the letter that is defined.
$\fun[m]$

$\fun[g][E][T]$

    $\fun[h][X][Y]$ %h\colon\mathcal{X}\rightarrow\mathcal{Y}
\end{document}

在此处输入图片描述

答案2

使用G参数。

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\fun}{ G{f} G{C} G{D} }{%
  #1\colon\mathcal{#2}\rightarrow\mathcal{#3}%
}

\begin{document}

$\fun$

$\fun{g}$

$\fun{h}{X}{Y}$

\end{document}

在此处输入图片描述

答案3

你想要这个吗?

$\fun \quad \fun{f}\quad \fun{f}{N}{R}$

$\fun{g} \quad \fun{g}{M}$

$\fun{h}{X}{Y}\quad \fun{h}\quad \fun{h}{W}{Q}$

生产

可能的目标

[建议来自你的评论Henri Menke 的回答

\documentclass{article}
\usepackage{xparse}

\NewDocumentCommand{\fun}{ G{f} g g }{%
  \def\tempa{f}\def\tempb{#1}\def\tempc{g}%
  \IfValueTF{#2}{\def\tempe{#2}}{%
    \ifx\tempa\tempb\def\tempe{A}%
    \else\ifx\tempb\tempc\def\tempe{C}%
    \else\def\tempe{X}\fi\fi
  }%
  \IfValueTF{#3}{\def\tempf{#3}}{%
    \ifx\tempa\tempb\def\tempf{B}%
    \else\ifx\tempb\tempc\def\tempf{D}%
    \else\def\tempf{Y}\fi\fi
  }%
  #1\colon\mathcal{\tempe}\rightarrow\mathcal{\tempf}%
}

\begin{document}

$\fun \quad \fun{f}\quad \fun{f}{N}{R}$

$\fun{g} \quad \fun{g}{M}$

$\fun{h}{X}{Y}\quad \fun{h}\quad \fun{h}{W}{Q}$

\end{document}

相关内容