![有序元组的有序元组](https://linux22.com/image/452488/%E6%9C%89%E5%BA%8F%E5%85%83%E7%BB%84%E7%9A%84%E6%9C%89%E5%BA%8F%E5%85%83%E7%BB%84.png)
以下来源包含用于排版有序对或元组的定义\opair
,它们使用尖括号作为初始和终止分隔符;该定义出现在https://tex.stackexchange.com/a/592421/13492。(我缩小了3mu
原文中的间距。)
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
%
\NewDocumentCommand{\opair}{m}
{
\langle\mspace{1mu}
\kaiserkatze_opair:n { #1 }
\mspace{1mu}\rangle
}
\seq_new:N \l__kaiserkatze_opair_items_seq
\tl_new:N \l__kaiserkatze_opair_first_tl
\cs_new_protected:Nn \kaiserkatze_opair:n
{
\seq_set_from_clist:Nn \l__kaiserkatze_opair_items_seq { #1 }
% set off the first item and insert it
\seq_pop_left:NN \l__kaiserkatze_opair_items_seq \l__kaiserkatze_opair_first_tl
\tl_use:N \l__kaiserkatze_opair_first_tl
% now insert commas and allowed breaks
\seq_map_indexed_inline:Nn \l__kaiserkatze_opair_items_seq
{
% comma and thin space
,\mspace{1mu plus 1mu minus 1mu}
% but \allowbreak only after the second item and before the penultimate
\int_compare:nT { 1 < ##1 < \seq_count:N \l__kaiserkatze_opair_items_seq }
{ \allowbreak }
% the item
##2
}
}
\ExplSyntaxOff
\begin{document}
$\opair{1,2}$, $(1,2)$
\begin{gather*}
\opair{\opair{1,2}, \opair{3,4}}
\\
\bigl((1,2), (3,4)\bigr)
\end{gather*}
\end{document}
将输出与对同一事物普通使用括号和大括号的情况进行比较:
这里有两个限制:
- 对于有序对的有序对,解析结果与预期含义相反。
- 就目前情况而言,的定义
\opair
不允许使用更大的尖括号,与使用括号的情况相反\bigl(
。\bigr)
如何克服这些限制?
请注意,对于第二个问题,仅使用\left\langle
...是不够的\right\rangle
。我希望能够更精细地控制尖括号的大小,以便同时使用...\big\langle
甚至\big\rangle
... \bigg\langle
。\bigg\rangle
为此,可以使用单独的宏,例如,\bigopair
和。\biggopair
\leftrighopair
有关的:大尖括号
答案1
的问题\opair{\opair{1,2}, \opair{3,4}}
不是由于 parsing(*) 而是由于递归和赋值:当\opair
处理第二个时,它会设置\l__kaiserkatze_opair_items_seq
为包含项1
和的序列2
,这会干扰外部\opair
正在做的事情:现在看到的是“不正确”的 值\l__kaiserkatze_opair_items_seq
。由于在 中完成的赋值\kaiserkatze_opair:n
都是本地的,因此可以通过将 的替换文本包装\kaiserkatze_opair:n
在\group_begin:
...中来解决这个问题\group_end:
。
对于分隔符大小的问题,您可以\opair
接受一个可选参数来提供所需的大小。以下是使用mathtools
' 的一种方法\DeclarePairedDelimiterX
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\ExplSyntaxOn
\DeclarePairedDelimiterX { \opair } [1] { \langle } { \rangle }
{
\mspace { 1mu }
\kaiserkatze_opair:n {#1}
\mspace { 1mu }
}
\seq_new:N \l__kaiserkatze_opair_items_seq
\tl_new:N \l__kaiserkatze_opair_first_tl
\cs_new_protected:Nn \kaiserkatze_opair:n
{
\group_begin:
\seq_set_from_clist:Nn \l__kaiserkatze_opair_items_seq {#1}
% set off the first item and insert it
\seq_pop_left:NN \l__kaiserkatze_opair_items_seq \l__kaiserkatze_opair_first_tl
\tl_use:N \l__kaiserkatze_opair_first_tl
% now insert commas and allowed breaks
\seq_map_indexed_inline:Nn \l__kaiserkatze_opair_items_seq
{
% comma and thin space
,\mspace { 1mu plus 1mu minus 1mu }
% but \allowbreak only after the second item and before the penultimate
\int_compare:nT { 1 < ##1 < \seq_count:N \l__kaiserkatze_opair_items_seq }
{ \allowbreak }
% the item
##2
}
\group_end:
}
\ExplSyntaxOff
\begin{document}
$\opair{1,2}$, $(1,2)$\quad
$\opair[\big]{1,2}$, $\bigl(1,2\bigr)$
\begin{gather*}
\opair{\opair{1,2}, \opair{3,4}} \\
\opair[\big]{\opair{1,2}, \opair{3,4}} \\
\opair[\Big]{\opair[\big]{1,2}, \opair[\big]{3,4}} \\
% The starred form causes \left and \right to be used:
\opair*{\opair{\frac{1}{2},2}, \opair{3,4}}
\end{gather*}
\end{document}
(*)与宏参数一样,a 中的项clist
总是括号平衡的。