免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

多个可选参数,中置、后置可选参数

我们都知道 LaTeX 可以用 \newcommand 来定义带可选参数的命令,但可选参数最多只有一个,
下面介绍利用 LaTeX 的内部宏 \@ifnextchar 来实现多个可选参数的命令,并且可选参数的位置可以是后置或中置。
\@ifnextchar 的意思懂英文的都能猜到,又由于 \@ifnextchar 有个 @,所以以下代码须放在 \makeatletter 与 \makeatother 之间。

先从简单开始,把单可选参数的做一下,了解其基本思路。

\def\ff{%
        \@ifnextchar[{\fff}{\fff[x]}%
        }
\def\fff[#1]{f(#1)}

这样,当 \ff 后面是中括号,\ff 就变成 \fff,否则就变成 \fff[x],而 \fff[#1] 就是实际输出内容的命令。

所以,\$\ff,\ff[0]\$ 得 $f(x),f(0)$。

那么,双可选参数就在此基础上再判断一次即可,比如:

\def\bb{%
        \@ifnextchar[{\bbb}{\bbb[-\infty]}%
        }
\def\bbb[#1]{%
            \@ifnextchar[{\bbbb[#1]}{\bbbb[#1][+\infty]}%
            }
\def\bbbb[#1][#2]{(#1,#2)}

这样,\$\bb,\bb[a],\bb[a][b]\$ 得 $(-\infty,+\infty),(a,+\infty),(a,b)$。

同理可得更多可选参数的定义方法。

但是这里有个不足,那就是要想改变第二个可选参数,就必须也写上第一个可选参数的值,
也就是说要用 \bb 来输出 $(-\infty,b)$ 就只能写 \bb[-\infty][b],前者无法省略,尽管是默认值。
故此有必要改进一下,比如将 \bb 的定义改成这样:

\def\bb{%
        \@ifstar{\bbbb[-\infty]}{%
                \@ifnextchar[{\bbb}{\bbb[-\infty]}%
                }%
        }

其余不变,这样,\$\bb,\bb[a],\bb[a][b],\bb*[b]\$ 得 $(-\infty,+\infty),(a,+\infty),(a,b),(-\infty,b)$。


下面再玩玩带必要参数的情形,其实也没多大区别,而由于位置无限制,所以就能产生后置、中置的可选参数,比如:

\def\ts#1{%
        \@ifnextchar[{\ttt#1}{\ttt#1[+]}%
        }
\def\ttt#1[#2]#3{\frac{x^2}{#1^2}#2\frac{y^2}{#3^2}=1}
%
\def\TS{%
        \@ifnextchar[{\TTT}{\TTT[a^2]}%
        }
\def\TTT[#1]#2{%
        \@ifnextchar[{\TTTT[#1]#2}{\TTTT[#1]#2[b^2]}%
        }
\def\TTTT[#1]#2[#3]{\frac{x^2}{#1}#2\frac{y^2}{#3}=1}

那么 \\[ \ts34, \ts3[-]4, \TS+, \TS-, \TS[m]+, \TS[m]-[n] \\] 得
\[\frac{x^2}{3^2}+\frac{y^2}{4^2}=1,\frac{x^2}{3^2}-\frac{y^2}{4^2}=1,
\frac{x^2}{a^2}+\frac{y^2}{b^2}=1,\frac{x^2}{a^2}-\frac{y^2}{b^2}=1,
\frac{x^2}{m}+\frac{y^2}{b^2}=1,\frac{x^2}{m}-\frac{y^2}{n}=1\]

测试文档: [1][2][3]test.tex (863 Bytes)
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
$\href{https://kuingggg.github.io/}{\text{About Me}}$

返回列表 回复 发帖