更改自定义命令中的参数

更改自定义命令中的参数

我想修改我的 func 命令,以便可以改变域/余域参数,例如,arg=R^n 产生 $\mathbb{R}^n$。

\documentclass[a4paper]{article}    
\usepackage{amsmath,amsfonts}
\usepackage{array}  
\usepackage{xstring}
\usepackage{ifthen}



\newcommand{\func}[4]%
{%  
    \arraycolsep=1.5pt
    \begin{array}{rl}   
        #1
        :
        \ifthenelse{\equal{#2}{N}}{\mathbb{N}}{}%
        \ifthenelse{\equal{#2}{Z}}{\mathbb{Z}}{}%
        \ifthenelse{\equal{#2}{Q}}{\mathbb{Q}}{}%
        \ifthenelse{\equal{#2}{R}}{\mathbb{R}}{}%
        \ifthenelse{\equal{#2}{C}}{\mathbb{C}}{}%
        \ifthenelse{\equal{#2}{K}}{\mathbb{K}}{}%
        \ifthenelse{\equal{#2}{F}}{\mathbb{F}}{}%
        \ifthenelse{
            \not\equal{#2}{N} 
            \AND
            \not\equal{#2}{Z} 
            \AND
            \not\equal{#2}{Q} 
            \AND
            \not\equal{#2}{R} 
            \AND
            \not\equal{#2}{C} 
            \AND
            \not\equal{#2}{K} 
            \AND
            \not\equal{#2}{F} 
        }
        {#2}{}%
        & \longrightarrow 
        \ifthenelse{\equal{#3}{N}}{\mathbb{N}}{}%
        \ifthenelse{\equal{#3}{Z}}{\mathbb{Z}}{}%
        \ifthenelse{\equal{#3}{Q}}{\mathbb{Q}}{}%
        \ifthenelse{\equal{#3}{R}}{\mathbb{R}}{}%
        \ifthenelse{\equal{#3}{C}}{\mathbb{C}}{}%
        \ifthenelse{\equal{#3}{K}}{\mathbb{K}}{}%
        \ifthenelse{\equal{#3}{F}}{\mathbb{F}}{}% 
        \ifthenelse{
            \not\equal{#3}{N} 
            \AND
            \not\equal{#3}{Z} 
            \AND
            \not\equal{#3}{Q} 
            \AND
            \not\equal{#3}{R} 
            \AND
            \not\equal{#3}{C} 
            \AND
            \not\equal{#3}{K} 
            \AND
            \not\equal{#3}{F} 
        }
        {#3}{}%
        \\
    x   &\longmapsto #4
    \end{array}
}


%_________________________________

\begin{document}
    $\func{f}{R}{C}{f(x)}$

    $\func{f}{R}{C^*}{f(x)}$
\end{document}

在此处输入图片描述

此外,如果有更聪明的方式来写我迄今为止所做的事情,欢迎提供任何建议。

谢谢

编辑:

除了简单地定义 bb 字符的简写(如评论中所建议的那样,我最终可能会采用这种方法),我发现 Andrew 的解决方案到目前为止对我来说效果很好,只需稍作调整

\documentclass[a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage{xparse}
\usepackage{array}

\newcommand{\func}[4]{%
    \arraycolsep=1.5pt
    \begin{array}{rl}
        #1\colon{\mathbb #2}&\longrightarrow{\mathbb #3}\\
        x&\longmapsto #4
    \end{array}%
}
\begin{document}

    $\func{f}{R_+}{R_+}
    {
            \begin{cases}
            x^3&, x\in \mathbb{Q}  \\
            0&,x\notin \mathbb{Q}   
            \end{cases}
    }$


\end{document}

在此处输入图片描述

由于 Daleif 的回答允许使用其他字符类型,因此对更多人有用,我将把勾移到他的帖子上。

答案1

嗯,您可以使用更短的代码来完成此操作xparse。无需 if then,我们只需使用\str_case_e:nnF来自的宏即可expl3

编辑:正如 Manuel 在评论中提到的,最好通过运行不带括号的助手来获取输入的第一项。然后C^*还将转换器放入\mathbb{C}^*。分成不同情况的明显原因是,如果某些情况要使用\mathbb其他情况\mathcal等。

\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\funcHelper{m}{
   \str_case_e:nnF { #1 }
   {
     {N}{\mathbb{N}}
     {Z}{\mathbb{Z}}
     {Q}{\mathbb{Q}}
     {R}{\mathbb{R}}
     {C}{\mathbb{C}}
     {K}{\mathbb{K}}
     {F}{\mathbb{F}}
   }{
     #1
   }
}
\NewDocumentCommand\func{mmmm}
 {
    \arraycolsep=1.5pt
    \begin{array}{rl}   
        #1
        :
        \funcHelper#2
        & \longrightarrow
        \funcHelper#3
        \\
        x & \longmapsto #4
      \end{array}
    }
\ExplSyntaxOff

答案2

Daleif 的答案非常漂亮,很好地展示了 LaTeX3 的强大功能!另一方面,我更喜欢简约的方法:

\documentclass[a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage{array}

\newcommand\func[3]{%
  \begin{array}{r@{}l}
    #1\colon{\mathbb #2}&\longrightarrow{\mathbb #3}\\
        x&\longmapsto #1(x)
  \end{array}%
}

\begin{document}
  $\func{f}{R}{C}$

  $\func{f}{R}{C^*}$
\end{document}

得出的结果为:

在此处输入图片描述

一些评论:

  • OP 中的第四个参数是多余的,因为它与#1
  • #1和中的第一个字符#2将排版为\mathbb,无论这是否有意义,但这符合 OP 中的所有示例,所以我认为这没问题
  • 我不知道\longmapsto所以这个问题对我很有用!
  • 最好\colon使用:
  • 我添加了@{}array箭头前占用一些额外空间

编辑

使用解析你可以有一个可选的第四个参数,默认为#1

\documentclass[a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage{xparse}
\usepackage{array}

\NewDocumentCommand\func{ mmm O{#1}}{%
  \begin{array}{rl}
    #1\colon{\mathbb #2}&\longrightarrow{\mathbb #3}\\
        x&\longmapsto #4(x)
  \end{array}%
}

\begin{document}
  $\func{f}{R}{C^n}$

  $\func{f}{R}{C^*}$

  $\func{f}{R}{C^*}[g]$
\end{document}

得出的结果为:

在此处输入图片描述

在末尾使用默认参数有点不标准,因此你可能需要使用

\NewDocumentCommand\func{ O{#2}mmm }{%
  \begin{array}{rl}
    #2\colon{\mathbb #3}&\longrightarrow{\mathbb #4}\\
        x&\longmapsto #1(x)
  \end{array}%
}

但我会把可选参数放在最后,因为这对我来说看起来更自然。

相关内容