我正在尝试排版这样的整数间隔:[0..m-1]
0
但是, 、.
和之间的间距m - 1
太小了。 有没有什么软件包可以改善这个问题?
答案1
让我们看看如何创建一个类似于\dots
但有两个点的命令。首先,我利用 TeX.SE 的智慧,找到如何找到标准定义的内容;然后是一些命令行:
[romano:~] % texdef -t latex dots
\dots:
macro:->\protect \dots
\dots :
\long macro:->\ifmmode \mathellipsis \else \textellipsis \fi
[romano:~] % texdef -t latex mathellipsis
\mathellipsis:
macro:->\mathinner {\ldotp \ldotp \ldotp }
最后:
\newcommand{\twodots}{\mathinner {\ldotp \ldotp}}
结果是:
(这仅适用于数学模式,但您也可以轻松地将其扩展为文本,模仿定义\dots
)
答案2
我也喜欢这两个点。我常用的代码是
[a\mathrel{{.}\,{.}}\nobreak b]
当然隐藏在宏中。
\documentclass{article}
\usepackage{amsmath}
\newcommand{\isep}{\mathrel{{.}\,{.}}\nobreak}
\begin{document}
$[0\isep m-1]$
\end{document}
一种更精细的解决方案,用于处理任何类型的间隔,同时保持不强制选择的语法。
\documentclass{article}
\usepackage{amsmath,mleftright}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\interval}{O{}>{\SplitArgument{1}{,}}m}
{
\group_begin:
\keys_set:nn { calcolo/interval } { o, #1 }
\bool_if:NTF { \l_calcolo_interval_auto_bool }
{\mleft\l_calcolo_interval_left_tl}
{\mathopen{\l_calcolo_interval_size_tl\l_calcolo_interval_left_tl}}
\calcolo_interval_set:nn #2
\bool_if:NTF { \l_calcolo_interval_auto_bool }
{\mright\l_calcolo_interval_right_tl}
{\mathclose{\l_calcolo_interval_size_tl\l_calcolo_interval_right_tl}}
\group_end:
}
\cs_new_protected:Nn \calcolo_interval_set:nn
{
#1 \mathrel{{.}\,{.}}\nobreak #2
}
\keys_define:nn { calcolo/interval }
{
size .code:n =
\tl_if_eq:nnTF { #1 } { * }
{ \bool_set_true:N \l_calcolo_interval_auto_bool }
{ \tl_set:Nn \l_calcolo_interval_size_tl { #1 } },
o .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { ( }
\tl_set:Nn \l_calcolo_interval_right_tl { ) },
oo .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { ( }
\tl_set:Nn \l_calcolo_interval_right_tl { ) },
c .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { [ }
\tl_set:Nn \l_calcolo_interval_right_tl { ] },
cc .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { [ }
\tl_set:Nn \l_calcolo_interval_right_tl { ] },
oc .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { ( }
\tl_set:Nn \l_calcolo_interval_right_tl { ] },
co .code:n =
\tl_set:Nn \l_calcolo_interval_left_tl { [ }
\tl_set:Nn \l_calcolo_interval_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,
}
\tl_new:N \l_calcolo_interval_left_tl
\tl_new:N \l_calcolo_interval_right_tl
\tl_new:N \l_calcolo_interval_size_tl
\bool_new:N \l_calcolo_interval_auto_bool
\ExplSyntaxOff
\begin{document}
$\interval{a,b}$
$\interval[c]{a,b}$
$\interval[co]{a,b}$
$\interval[oc]{a,b}$
$\interval[size=\Big]{a,b}$
\bigskip
$\interval[size=*,co]{\dfrac{\dfrac{1}{2}}{\dfrac{3}{4}},b}$
\end{document}
答案3
mathtools
以下是使用和 的解决方案xparse
。我定义一个命令\Iintvl{m,n}
。您需要一个包含相关分隔符的字体,\llbracket
和\rrbracket
(fourier
和stmaryrd
)或等效项(MnSymbol
和MdSymbol
有\lsem
和\rsem
)。该命令的星号版本会根据内容调整分隔符的大小,您可以使用可选参数( )微调它们的大小\big, \Big, …
。
\documentclass{article}
\usepackage{mathtools, stmaryrd}
\usepackage{xparse} \DeclarePairedDelimiterX{\Iintv}[1]{\llbracket}{\rrbracket}{\iintvargs{#1}}
\NewDocumentCommand{\iintvargs}{>{\SplitArgument{1}{,}}m}
{\iintvargsaux#1} %
\NewDocumentCommand{\iintvargsaux}{mm} {#1\mkern1.5mu..\mkern1.5mu#2}
\begin{document}
\[ \Iintv{-2,5} \quad \Iintv*{2^n, 2^{n + 1} } \quad \Iintv*{2^{2^n} + 1, 2^{2^{n + 1}} + 1}\]
\end{document}
答案4
比其他的健壮性差得多(当然可以做得更健壮,但这可能就足够了),但它可能是好看且可读的代码
\def\intv#1[#2..#3]{\mathopen{#1[}#2\mathrel{{.}\,{.}}\nobreak#3\mathclose{#1]}}
$
\intv[a..b]
\intv\big[a..b]
\intv\Bigg[\frac{a}{b}..c]
$
如果您需要,\left[ .. \right]
我可以添加代码。