我想创建一个subnumcases
类似的环境,命名为mynumcases
,像这样
我会解释我想要什么以及我尝试过什么。
- 我想要的是:
- 中的方程
mynumcases
有一个父计数器,与equation
- 我想把这个父计数器放在大括号之前,并且距离左边距有一个固定的长度(我不知道左边线的名字),这个长度不需要设置为参数。
\Roman
父计数器和\alph
子计数器- (选项)我可以在父计数器的位置制作自己的标签
我尝试过
- 我参考了这个答案:https://tex.stackexchange.com/a/343157/180617
- 我发现我无法根据我的需求使用这种方法。
- 我尝试使用
empheq
包的[left=...]
参数。
这是我的代码:
\documentclass{article}
\usepackage{amsmath, environ}
\usepackage{empheq}
\usepackage[showframe]{geometry}
\makeatletter
\def\Rom{\@Roman}
\NewEnviron{mynumcases}[2][\@nil]{%
\def\tmp@ne{#1}
\refstepcounter{equation}
\edef\oldeqnum{\theequation}
\setcounter{equation}{0}
\renewcommand{\theequation}{\alph{equation}}
\begin{empheq}[left={\makebox[0pt][r]{\makebox[.3\linewidth][l]{\ifx\tmp@ne\@nnil (\Rom{\oldeqnum}) \else #1 \fi}}#2\empheqlbrace}]{align}
\BODY
\end{empheq}
\setcounter{equation}{\oldeqnum}
}
\makeatother
\begin{document}
first equation
\begin{equation}
1 + 1 = 2
\end{equation}
first mynumcases
\begin{mynumcases}{}
& 1 + 1 = 2\\
& 1 = 1
\end{mynumcases}
another equation
\begin{equation}
test
\end{equation}
second mynumcases
\begin{mynumcases}{f(x)=}
& 1+1+1+1+1 & \text{if } hello\\
& 1 + 1 & \text{if } hello\\
& 1 & \text{if } hello\\
& 1
\end{mynumcases}
third mynumcases
\begin{mynumcases}[my words]{f(x)=}
& 1+1+1+1+1\\
& 1 + 1\\
& 1
\end{mynumcases}
\end{document}
以及整个输出
我们可以注意到
- 父计数器具有距离方程的固定长度,而不是左边距
- 我必须
&
在每一行前面加上,使其左对齐 if hello
距离很远1+1..
我怎样才能达到我的需求?有人有什么想法吗?
答案1
以下是我为实现所要求的解决方案所遵循的过程:
使用以下方法存储左边距的坐标
eso-pic
和zref
的savepos
模块。我们lm
在第一页的开头文本块的左下角放置一个“标签”。在为设置任何标签时,我们将在计算中使用此 x 坐标mynumcases
。通过插入适当的方程标签(可选参数或 中的实际方程编号
\Roman
)\inserteqnum
...empheq
...根据传递给 的参数的位置,在 的左侧插入一个适当大小的框empheq
。计算使用方程式特定的 x 坐标标记(也感谢zref
的savepos
模块)、前面提到的l
eftm
argin x 坐标和将其从左边距设置的预定义\empheqnumindent
长度。
\documentclass{article}
\usepackage{amsmath,zref-savepos}
\usepackage{empheq,eso-pic}
\usepackage[showframe]{geometry}
\AddToShipoutPictureBG*{\AtTextLowerLeft{\zsaveposx{lm}}}% Save left margin x-coordinate
\newlength{\empheqnumindent}
\setlength{\empheqnumindent}{25pt}
\newcounter{oldeqnum}
\newcommand{\inserteqnum}{%
\zsaveposx{empheq-\theRequation}% Store position of LHS of empheq
\makebox[0pt][r]{% Right-aligned 0pt-width box (pushes empheq number to the left)
\makebox[\dimexpr\zposx{empheq-\theRequation}sp-\zposx{lm}sp-\empheqnumindent][l]{% Position equation number
\theRequation% Set equation number
}}%
}
\NewDocumentEnvironment{mynumcases}{o m}{%
\IfValueF{#1}{\refstepcounter{equation}}% Only step equation counter if no optional argument
% Store equation number (or optional argument)
\begingroup\edef\x{\endgroup\gdef\noexpand\theRequation{%
\IfValueTF{#1}
{#1}
{(\Roman{equation})}}}\x% Store equation number
\setcounter{oldeqnum}{\value{equation}}% Store value of equation counter
\setcounter{equation}{0}% Reset equation counter
\renewcommand{\theequation}{\alph{equation}}% Update equation counter representation
\empheq[left={\inserteqnum#2\empheqlbrace}]{align}
}{
\endempheq
\setcounter{equation}{\value{oldeqnum}}% Restore equation counter
}
\makeatother
\begin{document}
first equation
\begin{equation}
1 + 1 = 2
\end{equation}
first mynumcases
\begin{mynumcases}{}
& 1 + 1 = 2\\
& 1 = 1
\end{mynumcases}
another equation
\begin{equation}
test
\end{equation}
second mynumcases
\begin{mynumcases}{f(x)=}
& 1 + 1 + 1 + 1 + 1 && \text{if } x \\
& 1 + 1 && \text{if } yy \\
& 1 && \text{if } zzz \\
& 1
\end{mynumcases}
third mynumcases
\begin{mynumcases}[my words]{f(x)=}
& 1 + 1 + 1 + 1 + 1 \\
& 1 + 1 \\
& 1
\end{mynumcases}
\end{document}
\label
由于这种方法使用类似(La)TeX 的\ref
系统,页面尺寸(技术上,第一页的左边距)或宽度的任何变化mynumcases
都需要额外的编译。
此方法可适用于twoside
更多或任意页面布局。此方法是插入特定于页面的l
eft m
argin 标记,而不仅仅是在文档开头插入一个。