# base/eqalignno-to-align-env

Rewrite eqalignno to the standard align* environment.

https://texform.dev/rules/base/eqalignno-to-align-env

## Metadata

| Field | Value |
| --- | --- |
| Key | base/eqalignno-to-align-env |
| Level | authoring |
| Fidelity | reading |
| Enabled by packages | base |
| Profiles | Authoring, Faithful, Corpus, Equiv |

## Rewrite patterns

### parenthesized-numeric-number

From:

```latex
\eqalignno{#1&#2&(#3)}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3} \end{align*}
```

### raw-numeric-number

From:

```latex
\eqalignno{#1&#2&#3}
```

To:

```latex
\begin{align*} #1&#2 \tag*{#3} \end{align*}
```

### parenthesized-math-number

From:

```latex
\eqalignno{#1&#2&(#3)}
```

To:

```latex
\begin{align*} #1&#2 \tag{$#3$} \end{align*}
```

### raw-math-number

From:

```latex
\eqalignno{#1&#2&#3}
```

To:

```latex
\begin{align*} #1&#2 \tag*{$#3$} \end{align*}
```

### empty-number-cell

From:

```latex
\eqalignno{#1&#2&}
```

To:

```latex
\begin{align*} #1&#2 \end{align*}
```

### missing-number-cell

From:

```latex
\eqalignno{#1&#2}
```

To:

```latex
\begin{align*} #1&#2 \end{align*}
```

### final-row-terminator

From:

```latex
\eqalignno{#1&#2&(#3)\cr}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3} \end{align*}
```

### internal-empty-row

From:

```latex
\eqalignno{#1&#2&(#3)\cr\cr#4&#5&(#6)}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3}\\\\#4&#5 \tag{#6} \end{align*}
```

### linebreak-arguments

From:

```latex
\eqalignno{#1&#2&(#3)\\*[#4]}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3}\\*[#4] \end{align*}
```

### newline

From:

```latex
\eqalignno{#1&#2&(#3)\newline#4&#5&(#6)}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3}\\#4&#5 \tag{#6} \end{align*}
```

### leading-row-scripts

From:

```latex
\eqalignno{#1&#2&(#3)\cr_{#4}^{#5}#6&#7&(#8)}
```

To:

```latex
\begin{align*} #1&#2 \tag{#3}\\{}_{#4}^{#5}#6&#7 \tag{#8} \end{align*}
```

## Examples

Examples show the rule in isolation, not a complete normalization profile.

### eqalignno right tag branch

Before:

```latex
\eqalignno{F(x)&=\int_0^x f(t)\,dt&(1)\cr F'(x)&=f(x)&(2)\cr F''(x)&=f'(x)&(3)}
```

After this rule:

```latex
\begin{align*} F(x)&=\int_0^x f(t)\,dt \tag{1}\\ F'(x)&=f(x) \tag{2}\\ F''(x)&=f'(x) \tag{3} \end{align*}
```

Packages: base, ams.

The rendered result has pixel differences from the input.

## Triggers

- [\\eqalignno](https://texform.dev/latex/commands/eqalignno)

## Eliminates

- [\\eqalignno](https://texform.dev/latex/commands/eqalignno)

## Produces

- [align*](https://texform.dev/latex/environments/align-star)
- [\\tag](https://texform.dev/latex/commands/tag)

## Touches

- [\\cr](https://texform.dev/latex/commands/cr)
- [\\\\](https://texform.dev/latex/commands/-5c-)
- [\\newline](https://texform.dev/latex/commands/newline)

## Same family

- [ams/Bmatrix-env-to-brace-matrix](https://texform.dev/rules/ams/Bmatrix-env-to-brace-matrix): Rewrite the fenced Bmatrix environment to explicit braces around a core matrix environment.
- [ams/Vmatrix-env-to-Vert-matrix](https://texform.dev/rules/ams/Vmatrix-env-to-Vert-matrix): Rewrite the fenced Vmatrix environment to explicit double bars around a core matrix environment.
- [ams/bmatrix-env-to-bracket-matrix](https://texform.dev/rules/ams/bmatrix-env-to-bracket-matrix): Rewrite the fenced bmatrix environment to explicit brackets around a core matrix environment.
- [ams/pmatrix-env-to-paren-matrix](https://texform.dev/rules/ams/pmatrix-env-to-paren-matrix): Rewrite the fenced pmatrix environment to explicit parens around a core matrix environment.
- [ams/vmatrix-env-to-vert-matrix](https://texform.dev/rules/ams/vmatrix-env-to-vert-matrix): Rewrite the fenced vmatrix environment to explicit vertical bars around a core matrix environment.
- [base/cases-to-cases-env](https://texform.dev/rules/base/cases-to-cases-env): Rewrite plain-TeX cases to the standard cases environment with row breaks.
- [base/eqalign-to-aligned-env](https://texform.dev/rules/base/eqalign-to-aligned-env): Rewrite eqalign to the standard aligned environment.
- [base/matrix-to-matrix-env](https://texform.dev/rules/base/matrix-to-matrix-env): Rewrite plain-TeX matrix to the standard matrix environment with row breaks.
- [base/pmatrix-to-pmatrix-env](https://texform.dev/rules/base/pmatrix-to-pmatrix-env): Rewrite plain-TeX pmatrix to the standard pmatrix environment with row breaks.
- [physics/antidiagonalmatrix-to-admat](https://texform.dev/rules/physics/antidiagonalmatrix-to-admat): Collapse antidiagonalmatrix to the shorter admat helper.
- [physics/diagonalmatrix-to-dmat](https://texform.dev/rules/physics/diagonalmatrix-to-dmat): Collapse diagonalmatrix to the shorter dmat helper.
- [physics/matrixdeterminant-to-mdet](https://texform.dev/rules/physics/matrixdeterminant-to-mdet): Collapse matrixdeterminant to the shorter mdet determinant helper.
- [physics/bmqty-to-mqty](https://texform.dev/rules/physics/bmqty-to-mqty): Expand bmqty to the core mqty builder with bracket fence syntax.
- [physics/mdet-to-vmqty](https://texform.dev/rules/physics/mdet-to-vmqty): Expand mdet to the vmqty determinant-style builder.
- [physics/pmqty-to-mqty](https://texform.dev/rules/physics/pmqty-to-mqty): Expand pmqty to the core mqty builder with paren fence syntax.
- [physics/zmat-to-xmat](https://texform.dev/rules/physics/zmat-to-xmat): Expand zmat to the explicit xmat zero-filled builder.

## Notes

The second body-level AlignmentTab separates the third mathematical numbering cell; nested alignment tabs do not create new cells, and a row with more than three cells returns a normal transform error. Rows with a missing or empty number cell and actual empty rows get no tag, because \eqalignno never numbers rows automatically; the target is align* so no automatic numbers appear. A single complete outer parenthesis pair becomes \tag; otherwise retain the number verbatim with \tag*, without adding parentheses. Numeric patterns apply to ASCII-digit-only content after removal of that outer pair; all other numbering content retains its mathematical subtree inside a $...$ text-mode tag argument, including scripts, groups, fractions, text commands, and nested environments. Only a complete outer pair is removed, so (n)+(m) remains raw. Split only known body-level \cr, \\, and \newline; copy the original \\ star and optional spacing arguments, including \\*[2pt]. Remove exactly the artificial empty segment after a final terminator and omit a final default separator; retain final starred or spaced separators, consecutive internal empty rows, and explicitly terminated final empty rows. Transfer scripts and primes on a parsed separator to an empty base in the next row rather than to the preceding tag. Do not descend into explicit groups or nested environments when identifying separators.

## Disable this rule

```python
TransformEngine(profile="corpus", disable_rules=["base/eqalignno-to-align-env"])
```

```javascript
new TransformEngine({ profile: 'corpus', disableRules: ['base/eqalignno-to-align-env'] })
```

[Open in Playground](https://play.texform.dev/?input=%5Ceqalignno%7BF%28x%29%26%3D%5Cint_0%5Ex+f%28t%29%5C%2Cdt%26%281%29%5Ccr+F%27%28x%29%26%3Df%28x%29%26%282%29%5Ccr+F%27%27%28x%29%26%3Df%27%28x%29%26%283%29%7D)
