假设我定义了两个命令
\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}