如何将 numcases 的父计数器放在方程式之前,将子计数器放在方程式之后

如何将 numcases 的父计数器放在方程式之前,将子计数器放在方程式之后

我想创建一个subnumcases类似的环境,命名为mynumcases,像这样

在此处输入图片描述

我会解释我想要什么以及我尝试过什么。

  • 我想要的是:
  1. 中的方程mynumcases有一个父计数器,与equation
  2. 我想把这个父计数器放在大括号之前,并且距离左边距有一个固定的长度(我不知道左边线的名字),这个长度不需要设置为参数。

在此处输入图片描述

  1. \Roman父计数器和\alph子计数器
  2. (选项)我可以在父计数器的位置制作自己的标签

这是我的代码:

\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}

以及整个输出

在此处输入图片描述

我们可以注意到

  1. 父计数器具有距离方程的固定长度,而不是左边距
  2. 我必须&在每一行前面加上,使其左对齐
  3. if hello距离很远1+1..

我怎样才能达到我的需求?有人有什么想法吗?

答案1

以下是我为实现所要求的解决方案所遵循的过程:

  1. 使用以下方法存储左边距的坐标eso-piczrefsavepos模块。我们lm在第一页的开头文本块的左下角放置一个“标签”。在为设置任何标签时,我们将在计算中使用此 x 坐标mynumcases

  2. 通过插入适当的方程标签(可选参数或 中的实际方程编号\Roman\inserteqnum...

  3. empheq...根据传递给 的参数的位置,在 的左侧插入一个适当大小的框empheq。计算使用方程式特定的 x 坐标标记(也感谢zrefsavepos模块)、前面提到的left margin 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更多或任意页面布局。此方法是插入特定于页面的left margin 标记,而不仅仅是在文档开头插入一个。

相关内容