\scases
我决定将很好的答案我之前的问题可以通过 wipet 来改善代码的可读性。(这是否真的是一种改进取决于我的个人喜好。)
原始宏:
\def\scases #1{\bgroup \def\\{;~}\langle \scasesA #1&\egroup}
\def\scasesA #1&{#1\futurelet\next\scasesB}
\def\scasesB {\ifx\next\egroup \rangle \else \Rightarrow \expandafter\scasesA \fi}
其输出为
\begin{equation*}
\scases{
x \in A & g(x) = 0\\
x \notin A & g(x) \in B
}
\end{equation*}
是
还有一个可以重复使用的选项,\scases
如下所示,但我想制作一个独立版本:
\NewEnviron{scenv}{\expandafter\scases\expandafter{\BODY}}
\begin{equation*}
\begin{scenv}
x \in A & g(x) = 0\\
x \notin A & g(x) \in B
\end{scenv}
\end{equation*}
以下是我尝试过但无果的一些方法:
1.
\newenvironment{scenv}{
\bgroup\def\\{;~}\langle \scasesA
}{
&\egroup
}
2.
\usepackage{environ}
\NewEnviron{scenv}{\bgroup \def\\{;~}\langle \scasesA{\BODY}&\egroup}
我认为我不太明白\def
工作原理。
我更喜欢\newenvironment
使用\NewEnviron
但无论哪种方式都足够好。
我需要你的帮助。
答案1
使用&
不对齐会使它比其他情况下更加复杂,但是......
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\newenvironment{SCASES}
{\def\\{;~\SCASESA}\langle \SCASESA}
{\rangle}
\def\SCASESA #1&{#1\Rightarrow}
\begin{equation*}
\begin{SCASES}
x \in A & g(x) = 0\\
x \notin A & g(x) \in B
\end{SCASES}
\end{equation*}
\end{document}
答案2
您可以使用expl3
更直接的方法。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentEnvironment{scases}{b}
{
\langle
\hermis_scases:n { #1 } % absorb the entire contents as #1
\rangle
}
{}
\seq_new:N \l__hermis_scases_in_seq
\seq_new:N \l__hermis_scases_out_seq
\tl_new:N \l__hermis_scases_case_tl
\cs_new_protected:Nn \hermis_scases:n
{
% split at \\
\seq_set_split:Nnn \l__hermis_scases_in_seq { \\ } { #1 }
% wrap every item in the processing function
\seq_set_map:NNn \l__hermis_scases_out_seq \l__hermis_scases_in_seq
{
\__hermis_scases_case:n { ##1 }
}
% use the sequence with ;<space> between items
\seq_use:Nn \l__hermis_scases_out_seq { ;\mspace{\thickmuskip} }
}
\cs_new_protected:Nn \__hermis_scases_case:n
{
% save the contents
\tl_set:Nn \l__hermis_scases_case_tl { #1 }
% replace & with \Rightarrow
\tl_replace_once:Nnn \l__hermis_scases_case_tl { & } { \Rightarrow }
% deliver the new contents
\tl_use:N \l__hermis_scases_case_tl
}
\ExplSyntaxOff
\begin{document}
\begin{equation*}
\begin{scases}
x \in A & g(x) = 0 \\
x \notin A & g(x) \in B
\end{scases}
\end{equation*}
\begin{equation*}
\begin{scases}
x \in A & g(x) = 1 \\
x \in B & g(x) = 2 \\
x \in C & g(x) = 3
\end{scases}
\end{equation*}
\end{document}