我想利用该interval
包来获得区间的“法语”符号,即开区间显示为“]0, 1[”等。但该包的\interval
命令输入起来很麻烦,需要两个单独的参数来表示区间的端点,并且可能需要一个区间类型的选项,如下所示:
\interval[open]{0}{1}
我想简化命令以获得相同的结果,但更简单地输入以下内容......
\intvo{0,1}
...使用一个参数,该参数由逗号分隔的两个端点组成。
\intvo
以下 MWE 中的定义使用xparse
用于实现这一点——但该定义似乎过于复杂,涉及我从未打算使用的第 3 个参数。
问题:我怎样才能简化定义以消除看似多余的部分\IfValueT{#3}{}
?
\documentclass{article}
\usepackage{xparse}
\usepackage{interval}
\NewDocumentCommand{\intvo}{ >{\SplitArgument{2}{,}} m }{\printintvo#1}
\NewDocumentCommand{\printintvo}{mmm}{\interval[open]{#1}{#2}\IfValueT{#3}{}}
\begin{document}
$\intvo{0,1}$
\end{document}
答案1
文档内容如下\SplitArgument
:
那就是<number>
是分隔符,而不是项目数,因此您应该使用 来处理参数\SplitArgument{1}{,}
。然后,您只需删除 中的多余参数\printintvo
:
\documentclass{article}
\usepackage{xparse}
\usepackage{interval}
\NewDocumentCommand{\intvo}{ >{\SplitArgument{1}{,}} m }{\printintvo#1}
\NewDocumentCommand{\printintvo}{mm}{\interval[open]{#1}{#2}}
\begin{document}
$\intvo{0,1}$
\end{document}
答案2
我认为interval
需要这么多参数才能更改内部分隔符。如果您不想,则\SplitArgument
没有必要。
以下是我笔记中使用的修改内容(当然我不使用反常的法国风格):
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\intv}{somm}
{
{% make the object an ordinary atom
\keys_set:nn { murray/intv } { #3 }
\IfBooleanTF{#1}
{% auto sizing
\__murray_intv:NNn \left \right { #4 }
}
{% normal
\IfNoValueTF{#2}
{
\__murray_intv:NNn \mathopen \mathclose { #4 }
}
{
\__murray_intv:ccn { \cs_to_str:N #2 l } { \cs_to_str:N #2 r } { #4 }
}
}
}% end of ordinary atom
}
\cs_new:Nn \__murray_intv:NNn
{
#1\l__murray_intv_left_tl #3 #2\l__murray_intv_right_tl
}
\cs_generate_variant:Nn \__murray_intv:NNn { cc }
\tl_new:N \l__murray_intv_left_tl
\tl_new:N \l__murray_intv_right_tl
\keys_define:nn { murray/intv }
{
o .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { [ },
oo .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { [ },
c .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { ] },
cc .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { ] },
oc .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { ] },
co .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { [ },
o .value_forbidden:n = true,
oo .value_forbidden:n = true,
c .value_forbidden:n = true,
cc .value_forbidden:n = true,
oc .value_forbidden:n = true,
co .value_forbidden:n = true,
}
\ExplSyntaxOff
\begin{document}
$\intv{o}{0,1}$
$\intv{c}{0,1}$
$\intv{oo}{0,1}$
$\intv{oc}{0,1}$
$\intv{co}{0,1}$
$\intv{cc}{0,1}$
$\intv[\big]{o}{0,1}$
$\intv[\big]{c}{0,1}$
$\intv[\Big]{oo}{0,1}$
$\intv[\Big]{oc}{0,1}$
$\intv[\bigg]{co}{0,1}$
$\intv[\bigg]{cc}{0,1}$
$\intv*{o}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{c}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{oo}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{oc}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{co}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{cc}{\dfrac{1}{2},\dfrac{3}{4}}$
\end{document}
您可以定义缩写,例如
\NewDocumentCommand{\intvo}{m}{\intv{o}{#1}}
但我相信,拥有一个可以确定围栏大小的通用命令会更好。
如果您希望能够配置分隔符,则可以\SplitArgument
按如下方式使用;修改内部分隔符以适合您。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\intv}{s o m >{\SplitArgument{1}{,}}m}
{
{% make the object an ordinary atom
\keys_set:nn { murray/intv } { #3 }
\IfBooleanTF{#1}
{% auto sizing
\__murray_intv:NNnn \left \right #4
}
{% normal
\IfNoValueTF{#2}
{
\__murray_intv:NNnn \mathopen \mathclose #4
}
{
\__murray_intv:ccnn { \cs_to_str:N #2 l } { \cs_to_str:N #2 r } #4
}
}
}% end of ordinary symbol
}
\cs_new:Nn \__murray_intv:NNnn
{
#1\l__murray_intv_left_tl % left fence
#3 % start of interval
, % inner separator
#4 #2\l__murray_intv_right_tl % right fence
}
\cs_generate_variant:Nn \__murray_intv:NNnn { cc }
\tl_new:N \l__murray_intv_left_tl
\tl_new:N \l__murray_intv_right_tl
\keys_define:nn { murray/intv }
{
o .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { [ },
oo .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { [ },
c .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { ] },
cc .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { ] },
oc .code:n =
\tl_set:Nn \l__murray_intv_left_tl { ] }
\tl_set:Nn \l__murray_intv_right_tl { ] },
co .code:n =
\tl_set:Nn \l__murray_intv_left_tl { [ }
\tl_set:Nn \l__murray_intv_right_tl { [ },
o .value_forbidden:n = true,
oo .value_forbidden:n = true,
c .value_forbidden:n = true,
cc .value_forbidden:n = true,
oc .value_forbidden:n = true,
co .value_forbidden:n = true,
}
\ExplSyntaxOff
\begin{document}
$\intv{o}{0,1}$
$\intv{c}{0,1}$
$\intv{oo}{0,1}$
$\intv{oc}{0,1}$
$\intv{co}{0,1}$
$\intv{cc}{0,1}$
$\intv[\big]{o}{0,1}$
$\intv[\big]{c}{0,1}$
$\intv[\Big]{oo}{0,1}$
$\intv[\Big]{oc}{0,1}$
$\intv[\bigg]{co}{0,1}$
$\intv[\bigg]{cc}{0,1}$
$\intv*{o}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{c}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{oo}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{oc}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{co}{\dfrac{1}{2},\dfrac{3}{4}}$
$\intv*{cc}{\dfrac{1}{2},\dfrac{3}{4}}$
\end{document}