我想修改我的 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}%
}
但我会把可选参数放在最后,因为这对我来说看起来更自然。