像在数组内部一样关闭分隔符

像在数组内部一样关闭分隔符

假设我定义了两个命令

\newcommand\parens[1]{(\begin{array}[t]{@{}l@{}}#1)\end{array}}
\newcommand\stmts[2]{\begin{array}[t]{@{}l@{}}#1;#2\end{array}}

尝试允许可选的换行符,同时保持标记语义。这些命令中的每一个都可以单独使用。例如,$\parens{X_1 \\ X_2}$产生在此处输入图片描述$\stmts{Y_1}{\\ Y_2}$产生在此处输入图片描述

但是,在某些组合中,这两个命令不能很好地协同工作。例如,$\parens{\stmts{Y_1}{\\ Y_2}}$产生在此处输入图片描述

相反,我希望输出是在此处输入图片描述即,从视觉上看就像

$(\begin{array}[t]{@{}l@{}}
    \begin{array}[t]{@{}l@{}}
      Y_1;
      \\ Y_2)
    \end{array}
  \end{array}$

已经使用过了。有没有办法实现这一点,而不需要用户手动放置)?换句话说,我可以重新定义\parens\stmts给出所需的行为——而不改变这些命令的用户界面?

我认为一个解决方案可能会检查下一个标记是否为),如果是,则将其与交换\end{array}。但是,一般来说,我希望有一个适用于所有结束分隔符的解决方案,而不仅仅是)。更好的解决方案是适用于任意下一个标记的解决方案。

这是一些启动代码。

\documentclass{article}
\usepackage{amsmath}

\newcommand\parens[1]{(\begin{array}[t]{@{}l@{}}#1)\end{array}}
\newcommand\stmts[2]{\begin{array}[t]{@{}l@{}}#1;#2\end{array}}

\begin{document}
\begin{tabular}{l@{\enspace}l}
  \verb`\parens{\stmts{Y_1}{\\ Y_2}}` & $\parens{\stmts{Y_1}{\\ Y_2}}$ \\
  \\
  manual construction & $(\begin{array}[t]{@{}l@{}}
                            \begin{array}[t]{@{}l@{}}
                              Y_1;
                              \\ Y_2)
                            \end{array}
                          \end{array}$
\end{tabular}
\end{document}

编辑:由于 Werner 要求提供更实际的用例,因此这里有一个例子。我希望右括号自动出现在 之后\mathsf{closeR}

% arara: pdflatex
\documentclass{article}

\usepackage{xparse}
\usepackage{amsmath}
\usepackage{mathtools}

\ExplSyntaxOn

\DeclarePairedDelimiterXPP\caseL[1]{\mathsf{caseL}}\lparen\rparen{\end{array}}%
  {
    \begin{array}[t]{@{}l@{}}
    \seq_set_split:Nnn \l_tmpa_seq { | } {#1}
    \seq_clear:N \l_tmpb_seq
    \seq_map_variable:NNn \l_tmpa_seq \l_tmpa_tl
      {
        \tl_replace_once:Nnn \l_tmpa_tl { => } { \Rightarrow }
        \seq_put_right:NV \l_tmpb_seq \l_tmpa_tl
      }
    \seq_use:Nn \l_tmpb_seq { \mid }
  }

\NewDocumentCommand \selectR { m m }
  {
    \begin{array}[t]{@{}l@{}}
      \mathsf{selectR} \mskip\medmuskip #1 ;
      #2
    \end{array}
  }

\NewDocumentCommand \waitL { m }
  {
    \begin{array}[t]{@{}l@{}}
      \mathsf{waitL} ; #1
    \end{array}
  }

\NewDocumentCommand \closeR { } { \mathsf{closeR} }

\ExplSyntaxOff

\begin{document}
$q_1 = \caseL{a => \selectR{b}{\\ \selectR{a}{q_0}} \\\mkern-8.5mu
            | b => q_1 \\\mkern-8.5mu
            | c => \waitL{\\ \selectR{b}{\\ \selectR{c}{\closeR}}}}$
\end{document}

在此处输入图片描述

答案1

您可以根据构造顺序设置条件。下面我们定义两个\if条件 -\ifparens和,\ifstmts它们在每次调用开始时设置为 true。然后我们可以检查其中一个是否嵌套在另一个中,并)根据该条件放置一个:

在此处输入图片描述

\documentclass{article}

\newif\ifstmts
\newif\ifparens
\newcommand\parens[1]{\parenstrue(\begin{array}[t]{@{}l@{}}#1\ifstmts\else)\fi\end{array}\parensfalse\stmtsfalse}
\newcommand\stmts[2]{\stmtstrue\begin{array}[t]{@{}l@{}}#1;#2\ifparens)\fi\end{array}}

\begin{document}

\begin{tabular}{l@{\enspace}l}
  \verb`\parens{\stmts{Y_1}{\\ Y_2}}` & $\parens{\stmts{Y_1}{\\ Y_2}}$ \\
  \\
  manual construction & $(\begin{array}[t]{@{}l@{}}
                            \begin{array}[t]{@{}l@{}}
                              Y_1;
                              \\ Y_2)
                            \end{array}
                          \end{array}$
\end{tabular}

\end{document}

相关内容