简化 \SplitArgument 构造?

简化 \SplitArgument 构造?

我想利用该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

此处理器将每次出现 ⟨tokens⟩ 时给出的参数拆分为最多 ⟨number⟩ 个标记(从而将输入拆分为 ⟨number⟩ + 1 个部分)。如果输入中存在过多的 ⟨tokens⟩,则会出错。处理后的输入将放置在 ⟨number⟩ + 1 组括号内以供进一步使用。如果参数中的 {⟨tokens⟩} 少于 {⟨number⟩},则会在处理后的参数末尾添加 -NoValue- 标记。

那就是<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}

相关内容