% Copyright (C) 2026 Quan Sun
% Released under the LaTeX Project Public License, version 1.3c or later.
\documentclass[UTF8,a4paper,11pt,fontset=fandol]{ctexart}

\usepackage[margin=28mm]{geometry}
\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref}
\hypersetup{
  pdftitle={mathformule 宏包手册},
  pdfauthor={Quan Sun},
  pdfsubject={轻量化多行数学公式环境的使用说明},
  pdfkeywords={LaTeX, 数学公式, 对齐, 编号, 大括号}}

\newcommand*\pkg{\textsf{mathformule}}
\newcommand*\env{\texttt{formule}}

\title{\pkg{} 宏包手册\\[4pt]
  \large 轻量化的单行与多行数学公式环境}
\author{Quan Sun\\
  \href{mailto:rmm74845@gmail.com}{\texttt{rmm74845@gmail.com}}}
\date{2026年7月22日\\版本 0.6}

\begin{document}
\maketitle

\begin{abstract}
\pkg{} 宏包提供带编号的 \env{} 行间公式环境，同时适用于单行公式和按对齐点
排列的多行公式。多行公式可以共用一个整体编号，也可以按行生成可配置的子编号；
还可以在全部公式行的左侧或右侧添加可伸缩大括号，并调整公式行间距和大括号间距。
宏包本身不显式声明对辅助宏包的依赖，也不主动加载辅助宏包；其排版核心使用
\TeX{} 原语和 \LaTeX{} 内核功能。它与 \LaTeX{} 标准公式计数器及现有的交叉引用机制
相衔接。版本 0.6 已经在 pdf\LaTeX、Xe\LaTeX{} 和 Lua\LaTeX{} 下验证。
\end{abstract}

\tableofcontents

\section{概述}

\paragraph{编译引擎。}
本宏包面向当前的 \LaTeXe{} 格式。版本 0.6 已经在 pdf\LaTeX、Xe\LaTeX{} 和
Lua\LaTeX{} 下验证。它不是可以由 plain \TeX{} 直接加载的宏文件；其他引擎或格式
暂不属于当前已经验证的范围。

\env{} 环境既可以排版简短的单行公式，也可以排版由多行组成的公式组。
未使用对齐符时，各行默认共享同一左边缘；\verb|&| 用于显式设置列对齐点，
\verb|\\| 表示换行。默认情况下，一个环境内的所有公式行共用一个编号。
可选键可以控制左右大括号、带正负号的间距修正量以及逐行子编号。

宏包不会主动加载 \textsf{amsmath} 或其他辅助宏包，也不是对 \texttt{equation}、
\texttt{align} 或 \texttt{aligned} 环境的外层封装。不过，它可以用于已经加载
AMS 数学宏包以及 \textsf{hyperref}、\textsf{cleveref} 等常用交叉引用宏包的文档。
启用文档类的 \texttt{leqno} 或 \texttt{fleqn} 设定时，\env{} 也遵循相应的
全局编号位置和公式布局约定。

\section{安装与加载}

局部使用时，将 \texttt{mathformule.sty} 放在主文档同一目录下，然后写入：

\begin{verbatim}
\usepackage{mathformule}
\end{verbatim}

如果需要让公式编号随文档层级重置，可以使用以下宏包选项。\texttt{chapter}
选项要求文档类已经定义 \texttt{chapter} 计数器。

\begin{verbatim}
\usepackage[section]{mathformule}
% 或
\usepackage[chapter]{mathformule}
\end{verbatim}

下面的导言区命令可以指定任意已经存在的 \LaTeX{} 计数器：

\begin{verbatim}
\mathformulenumberwithin{subsection}
\end{verbatim}

该命令会有意修改由本宏包与 \LaTeX{} 原生公式环境共用的 \texttt{equation}
计数器，因此原生公式和 \env{} 公式仍采用同一套编号体系。

\section{基本公式}

\subsection{单行公式}

最简单的用法与带编号的行间公式作用相同：

\begin{verbatim}
\begin{formule}\label{eq:energy}
  E=mc^2
\end{formule}
\end{verbatim}

环境内容已经处于行间数学模式，不能再添加美元符号。

\subsection{多行公式与对齐}

若环境内完全没有顶层 \verb|&|，所有公式行位于同一个左对齐公式列中，因此
不同宽度的公式共享同一左边缘：

\begin{verbatim}
\begin{formule}
  f(x)=a+b \\
  abc=cd
\end{formule}
\end{verbatim}

出现顶层 \verb|&| 后，对齐点之前的列右对齐，对齐点之后的列左对齐。
使用 \verb|\\| 换行：

\begin{verbatim}
\begin{formule}\label{eq:identities}
  (a+b)^2 &= a^2+2ab+b^2 \\
  (a-b)^2 &= a^2-2ab+b^2 \\
  (a+b)(a-b) &= a^2-b^2
\end{formule}
\end{verbatim}

这三行公式共用一个整体编号。最后一行末尾的 \verb|\\| 可以省略；即使保留，
也会被安全忽略，不会产生空公式行或额外编号。行首 \verb|&| 是合法输入：
它显式留空第一列，并将公式放入左对齐的第二列。例如：

\begin{verbatim}
\begin{formule}[multnum={arabic-roman},lbrace,lineskip=0pt]
  &f(x)=a+b \\
  &abc=cd
\end{formule}
\end{verbatim}

同一行可以使用多组对齐列：

\begin{verbatim}
\begin{formule}
  a_1 &= b_1 & c_1 &= d_1 \\
  a_2 &= b_2 & c_2 &= d_2
\end{formule}
\end{verbatim}

只有顶层 \verb|&| 会选择上述显式列对齐方式。花括号参数内部或
\texttt{array} 等嵌套环境中的 \verb|&| 不会改变外层 \env{} 的对齐方式。
为保证列结构可预测，同一环境内应一致地使用显式对齐符。

\section{公式行间距}

默认情况下，多行公式在正常基线距离的基础上使用 \texttt{3pt} 的开距量。
本节的所有接口都接收相对于该默认值的带正负号修正量，而不是绝对基线距离。

\subsection{全文修正量}

在导言区使用 \verb|\formuleskip| 可以统一修改全部多行 \env{} 环境。
正值增大公式行间距，负值缩小公式行间距。

\begin{verbatim}
\formuleskip{1pt}   % 所有 formule 均在默认值上增加 1pt
% \formuleskip{-1pt} 则在默认值上减少 1pt
\end{verbatim}

命令参数必须是 \TeX{} 长度。由于单行公式不存在公式行之间的距离，该命令对单行公式
没有可见影响。

\subsection{单个环境的修正量}

\texttt{lineskip} 键会覆盖该环境中的全局 \verb|\formuleskip| 修正量：

\begin{verbatim}
\formuleskip{1pt}

\begin{formule}[lineskip=-2pt]
  a &= b \\
  c &= d
\end{formule}
\end{verbatim}

在这个例子中，实际采用的局部修正量是 \texttt{-2pt}，而不是将
\texttt{-2pt} 与全局的 \texttt{1pt} 相加。

原型版本的简写 \verb|[长度]| 仍然可用，其含义和优先级与
\verb|[lineskip=长度]| 相同。新文档建议使用含有键名的显式形式。

\subsection{某一行之后的修正量}

换行命令后的可选长度只对该行之后的距离作额外局部修正：

\begin{verbatim}
\begin{formule}
  a &= b \\[2pt]
  c &= d \\[-1pt]
  e &= f
\end{formule}
\end{verbatim}

这些接口不改变整个行间公式与上下文之间的垂直距离。环境外部仍使用文档类定义的
以下弹性行间公式间距：

\begin{verbatim}
\abovedisplayskip        \abovedisplayshortskip
\belowdisplayskip        \belowdisplayshortskip
\end{verbatim}

\section{包围多行公式的大括号}

\subsection{左大括号与右大括号}

不带值的 \texttt{lbrace} 或 \texttt{rbrace} 键会在全部公式行外侧放置一个
可伸缩大括号：

\begin{verbatim}
\begin{formule}[lbrace]
  x+y &= 3 \\
  x-y &= 1
\end{formule}

\begin{formule}[rbrace]
  p &= q \\
  r &= s
\end{formule}
\end{verbatim}

大括号由 \TeX{} 标准的可伸缩数学定界符机制生成，与 \verb|\left\{| 和
\verb|\right\}| 使用相同机制。\texttt{lbrace} 与 \texttt{rbrace} 不能同时使用。

\subsection{大括号外侧的数学内容}

键值会自动进入行间数学模式：左大括号的值放在括号之前，右大括号的值放在括号之后。

\begin{verbatim}
\begin{formule}[lbrace={f(x)=}]
   x^2, & x\geq 0 \\
  -x,   & x<0
\end{formule}

\begin{formule}[rbrace={=G(t)}]
  p(t) &= t^2+1 \\
  q(t) &= 2t-3
\end{formule}
\end{verbatim}

宏包不会自动插入关系符号或额外空白。如果键值中含有逗号或等号，建议用花括号保护
整个值。

\subsection{大括号间距修正}

\texttt{lbraceskip} 与 \texttt{rbraceskip} 分别对相应大括号和公式行边界之间的
水平距离作带正负号修正：

\begin{verbatim}
\begin{formule}[lbrace={F(x)=},lbraceskip=2pt]
  a &= b \\
  c &= d
\end{formule}

\begin{formule}[rbrace={=S},rbraceskip=-1pt]
  u+v &= 7 \\
  2u-v &= 5
\end{formule}
\end{verbatim}

如果没有启用对应的大括号，则相应的间距键不产生输出效果。

\section{公式编号与交叉引用}

\subsection{标准公式编号序列}

每个 \env{} 环境都会使 \LaTeX{} 标准 \texttt{equation} 计数器前进一次。因此，
原生 \texttt{equation} 环境和 \env{} 环境的编号可以自然交错，不会建立互相独立的
序列。除非用户通过本宏包要求绑定章节层级，否则现有的 \verb|\theequation| 定义
保持不变。

对于共用整体编号的公式，将 \verb|\label| 放在环境内，并使用标准引用命令：

\begin{verbatim}
\begin{formule}\label{eq:sum}
  \sum_{k=1}^{n} k = \frac{n(n+1)}{2}
\end{formule}

参见公式~\ref{eq:sum}。
\end{verbatim}

加载相应宏包后，\verb|\eqref|、\verb|\autoref| 与 \verb|\cref| 也使用同一个
完整编号和超链接目标。

启用文档的全局 \texttt{leqno} 设定时，整体编号和逐行编号都遵循文档类的左侧
编号约定；启用 \texttt{fleqn} 时，公式使用文档类规定的行间公式缩进。

\subsection{逐行子编号}

对于真正包含多行的公式，\texttt{multnum} 键会将一个整体编号改为每个编号行
各自具有一个子编号：

\begin{verbatim}
\begin{formule}[multnum]
  x+y &= 8 \label{eq:system-a} \\
  x-y &= 2 \label{eq:system-b} \\
\end{formule}
\end{verbatim}

如果主公式编号为 \texttt{3}，两行分别编号为 \texttt{3.1} 和 \texttt{3.2}。
整个公式组只占用主编号 \texttt{3}，下一个标准公式仍编号为 \texttt{4}。
逐行引用的 \verb|\label| 应放在对应的已编号公式行内。

预定义的四种显式样式如下：

\begin{center}
\begin{tabular}{lll}
\hline
键值 & 前两个编号 & 第二级编号形式 \\
\hline
\texttt{arabic.arabic} & \texttt{3.1}, \texttt{3.2} & 阿拉伯数字 \\
\texttt{arabic-arabic} & \texttt{3-1}, \texttt{3-2} & 阿拉伯数字 \\
\texttt{arabic.roman}  & \texttt{3.i}, \texttt{3.ii} & 小写罗马数字 \\
\texttt{arabic-roman}  & \texttt{3-i}, \texttt{3-ii} & 小写罗马数字 \\
\hline
\end{tabular}
\end{center}

此外，\texttt{arabic} 与 \texttt{roman} 分别是
\texttt{arabic.arabic} 与 \texttt{arabic.roman} 的简写。

例如：

\begin{verbatim}
\begin{formule}[multnum={arabic-roman}]
  a &= b \label{eq:roman-a} \\
  c &= d \label{eq:roman-b}
\end{formule}
\end{verbatim}

第一级编号始终是当前主公式的完整编号。如果公式编号与节号绑定，主编号
\texttt{2.3} 会相应生成 \texttt{2.3-i} 和 \texttt{2.3-ii}。单行公式中的
\texttt{multnum} 自动失效，仍使用普通整体公式编号。

\subsection{抑制某些行的编号}

在 \texttt{multnum} 模式中，\verb|\notag| 与 \verb|\nonumber| 可以抑制某一行
的编号。被抑制的行不会占用子编号。

\begin{verbatim}
\begin{formule}[multnum={arabic.roman}]
  a_1 &= b_1 \label{eq:first} \\
  a_2 &= b_2 \notag \\
  a_3 &= b_3 \nonumber \\
  a_4 &= b_4 \label{eq:second}
\end{formule}
\end{verbatim}

被抑制编号的公式行没有独立而稳定的引用目标，因此不要在该行放置标签。

\section{综合示例}

下面的例子同时使用左大括号、括号前数学内容、全局及局部行距、罗马数字子编号、
大括号间距修正、逐行禁用编号、交叉引用，以及无副作用的末行换行符。

\begin{verbatim}
\usepackage[section]{mathformule}
\formuleskip{1pt}

\begin{formule}[
  lbrace={F(x)=},
  lbraceskip=1pt,
  lineskip=-1pt,
  multnum={arabic-roman}]
   x^2, & x>0 \label{eq:case-positive} \\
   0,   & x=0 \notag \\
  -x,   & x<0 \label{eq:case-negative} \\
\end{formule}

参见 \ref{eq:case-positive} 和 \ref{eq:case-negative}。
\end{verbatim}

在 \texttt{multnum} 模式下，每行最多支持四组对齐列，也就是八个公式列。

\section{接口汇总}

\begin{center}
\begin{tabular}{p{0.31\linewidth}p{0.60\linewidth}}
\hline
接口 & 作用 \\
\hline
\verb|\formuleskip{长度}| & 全文多行公式行距的带正负号修正量。 \\
\verb|lineskip=长度| & 单个环境的修正量；覆盖 \verb|\formuleskip|。 \\
\verb|[长度]| & \verb|[lineskip=长度]| 的原型版本简写。 \\
\verb|\\[长度]| & 某一公式行之后的附加修正量。 \\
\verb|lbrace|、\verb|rbrace| & 包围所有公式行的可伸缩大括号。 \\
\verb|lbrace={数学内容}| & 左大括号之前的数学内容。 \\
\verb|rbrace={数学内容}| & 右大括号之后的数学内容。 \\
\verb|lbraceskip=长度| & 左大括号水平间距修正量。 \\
\verb|rbraceskip=长度| & 右大括号水平间距修正量。 \\
\verb|multnum| & 以点号连接的阿拉伯数字逐行子编号。 \\
\verb|multnum={样式}| & 显式指定逐行编号样式。 \\
\verb|\notag|、\verb|\nonumber| & 在多行 \texttt{multnum} 模式中
抑制一行编号。 \\
\hline
\end{tabular}
\end{center}

\section{兼容性与限制}

宏包本身不显式声明对辅助宏包的依赖，也不主动加载辅助宏包；其排版核心使用
\TeX{} 原语和 \LaTeX{} 内核功能。当前版本已经在 pdf\LaTeX、Xe\LaTeX{} 和 Lua\LaTeX{} 下
测试，并与主要的 AMS 数学宏包及常用交叉引用宏包共同测试；这些辅助宏包均为
可选项。目前在已经测试的组合中没有发现冲突，但任意文档中的实际表现仍可能受到
文档类、宏包版本和加载顺序的影响。

\env{} 必须在文本模式中使用，不能嵌套在另一个数学环境内部。\texttt{lbrace}
与 \texttt{rbrace} 不能同时启用。\texttt{multnum} 模式当前每行最多支持四组
对齐列。如果已有其他代码定义了同名 \env{} 环境，本宏包不会覆盖它，而是报告
宏包错误。

\section{开发说明、致谢与许可证}

本宏包的设计受到 \LaTeX{} 既有行间公式规范以及 \texttt{equation}、
\texttt{align}、\texttt{aligned} 等环境用户接口的启发。实现结构由作者基于
\TeX{} 原语和 \LaTeX{} 内核功能独立设计，并采用公开且成熟的 \TeX{} 对齐与
定界符编程惯例；宏包既不封装，也不复刻某个现有行间公式环境作为实现。感谢
\TeX{} 与 \LaTeX{} 社群建立和记录的排版惯例，它们为兼容的公式排版行为提供了基础。

版权所有 \copyright\ 2026 Quan Sun。本作品依据 \LaTeX{} Project Public License
1.3c 或更高版本发布。在适用法律允许的范围内，本作品不提供任何形式的担保。
本作品的 LPPL 维护状态为 \emph{maintained}，当前维护者为 Quan Sun。问题报告可发送至
\href{mailto:rmm74845@gmail.com}{\texttt{rmm74845@gmail.com}}。

\end{document}
