有序元组的有序元组

有序元组的有序元组

以下来源包含用于排版有序对或元组的定义\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}

将输出与对同一事物普通使用括号和大括号的情况进行比较:

有序对 有序对

这里有两个限制:

  1. 对于有序对的有序对,解析结果与预期含义相反。
  2. 就目前情况而言,的定义\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总是括号平衡的。

相关内容