SX. 在这种情况下,我想创建一个\newcommand
名为\fun
的函数。
\ fun
当我再次使用带有名称的命令f
(字母 f 在我的文档中被广泛使用)并避免第一个定义时,就会出现问题,因为否则,我会得到第一个情况。
最小示例
\documentclass{memoir}
\usepackage{amsmath,amssymb}
\usepackage{xstring}
\newcommand{\rn}[1][n]{%
\IfEqCase{#1}{%
{1}{\mathbb{R}}%
{2}{\mathbb{R}^{2}}%
{3}{\mathbb{R}^{3}}%
{n}{\mathbb{R}^{n}}
{#1}{\mathbb{R}^{#1}}
% You can add a finite number of more cases :)
}%
}%
\newcommand{\fun}[3][f]{%
\IfEqCase{#1}{
{f}{f\colon\mathcal{A}\rightarrow\mathcal{B}}
{g}{g\colon\mathcal{C}\rightarrow\mathcal{D}}
{#1}{#1\colon #2\rightarrow #3}
% Maybe "othercase" can generate case like f or g.
}
}
\begin{document}
If I use $f$ function like this $\fun[f]{\rn}{\rn[m]}$,
but I expect to use a function called $f\colon\rn\rightarrow\rn[m]$.
This example works fine, e.g, $\fun[\omega]{\rn}{\rn[1]}$ but I want to use
this command
%\fun[othercase]{f}{\rn}{\rm[1]}
\end{document}
这个例子运行良好,例如$\fun[\omega]{\rn}{\rn[1]}$
。
如果我使用$f$
这样的函数$\fun[o]{f}{\rn}{\rn[m]}$
,
但我希望使用一个名为的函数$f\colon\rn\rightarrow\rn[m]$
。
更新
我尝试构建如下命令:
\newcommand{\fun}[5][default]{%
\IfEqCase{#1}{
{default}{
\IfEqcase{#2}{
{f}{#2\colon\mathcal{A}\rightarrow\mathcal{B}}
{g}{#2\colon\mathcal{C}\rightarrow\mathcal{D}}
}
}
{other}{
{}{#3\colon #4 \rightarrow #5}
}
}
}
因为我不想丢失分别使用f
(f\colon\mathcal{A}\rightarrow\mathcal{B}
)和g
(g\colon\mathcal{C}\rightarrow\mathcal{D}
)的默认选项。
我发现我需要在其他可选参数内添加一个可选参数。
来源
我使用这个想法来创建命令。
提前致谢!
答案1
我非常不清楚您在这里想要做什么,或者为什么(考虑到您期望的输出)您要这样做\fun
。
跟踪扩展(\tracingmacros=1
如果有帮助的话请使用,尽管 xstring 有很多垃圾):
你打电话
\fun[f]{\rn}{\rn[m]}
处理完可选参数后,这归结为使用具有模板的命令
\fun[#1]{#2}{#3}
。在您的第一个示例中,这些是#1=f
,#2=\rn
和#3=
rn[m]`。您要做的
\fun
第一件事是使用 case 语句来考虑可选参数#1
。第一行匹配 if#1
isf
,结果就是如此。因此,该线路被扩展为
\mathcal{A}\rightarrow\mathcal{B}
由于您没有要求在这种情况下执行任何操作,它们就会消失,就像任何其他未使用的参数一样
\fun
。#2
#3
我不明白的是,为什么你会有这样的定义:\fun
如果你想要你所说的你想要的东西:我完全不明白你为什么要看第一个可选参数。在我看来,你只是想要:
\newcommand{\fun}[3]{%
\ensuremath{#1:#2#3}}
然后使用它作为\fun{f}{\rn}{\rn[m]}
答案2
如果你取消注释你想要的那一行,则会出现一个错误,指出缺少了什么,因为$
你省略了;$
如果你用 包围表达式,$
则会收到错误,! Class memoir Error: Font command \rm is not supported.
因为\rm
没有定义要执行任何操作。也许这是你的意图,\rn
但这两个错误都与你的宏根本无关。
我不明白为什么您要在\fun
没有做任何有用事情的地方使用测试(在前两种情况下,这意味着您丢弃了参数??)xstring 测试\rn
也没有做太多事情(只有针对 1 的测试,省略上标,做了任何有用的事情)但我保留了它。
\documentclass{memoir}
\usepackage{amsmath,amssymb}
\usepackage{xstring}
\newcommand{\rn}[1][n]{%
\IfEqCase{#1}{%
{1}{\mathbb{R}}%
{2}{\mathbb{R}^{2}}%
{3}{\mathbb{R}^{3}}%
{n}{\mathbb{R}^{n}}
{#1}{\mathbb{R}^{#1}}
% You can add a finite number of more cases :)
}%
}%
\newcommand{\fun}[3][f]{%
#1\colon #2\rightarrow #3
}
\begin{document}
If I use $f$ function like this $\fun[f]{\rn}{\rn[m]}$,
but I expect to use a function called $f\colon\rn\rightarrow\rn[m]$.
This example works fine, e.g, $\fun[\omega]{\rn}{\rn[1]}$ but I want to use
this command
$\fun[f]{\rn}{\rn[1]}$
\end{document}
答案3
在这个小例子中,我创建了两个子命令,第一个子命令我称之为默认命令,第二个子命令我称之为通用命令,我使用了字符串打包命令\IfEqCase
,但是我得到了一些意想不到的结果,希望对你有帮助。
\documentclass[14pt]{memoir}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage{xstring}
\newcommand{\comdefault}[1][f]{
\IfEqCase{#1}{
{f}{\ensuremath{f\colon\mathcal{A}\rightarrow\mathcal{B}}}
{g}{\ensuremath{g\colon\mathcal{C}\rightarrow\mathcal{D}}}}%[other case]
}
\newcommand{\comgeneral}[3]{
\ensuremath{#1\colon#2\rightarrow#3}
}
\newcommand{\comfinal}[4][default]{
\IfEqCase{#1}{
{default}{\comdefault[#2]}
{general}{\comgeneral{#2}{#3}{#4}}}
}
\begin{document}
\begin{enumerate}
\item The function $g$ is \comdefault[g]. % Subcommand 1
\item The function $f$ is \comgeneral{f}{X}{Y}. % Subcommand 2
\item La función $h_1$ does not work correctly %\comfinal{h_1}. %{}%{}{}
\item La función $h_2$ does not work correctly either. %\comfinal{h_2}{}
\item The function $h_3$ works \comfinal[general]{X}{Y}{Z}
\end{enumerate}
\end{document}