# base/double-quad-to-qquad

Merge two adjacent quads into one qquad for authoring normalization.

https://texform.dev/rules/base/double-quad-to-qquad

## Metadata

| Field | Value |
| --- | --- |
| Key | base/double-quad-to-qquad |
| Level | authoring |
| Fidelity | render |
| Enabled by packages | base |
| Profiles | Authoring, Faithful, Corpus, Equiv |

## Rewrite patterns

From:

```latex
\quad\quad
```

To:

```latex
\qquad
```

## Examples

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

### Double quad

Before:

```latex
A\quad\quad B
```

After this rule:

```latex
A\qquad B
```

Packages: base.

Rendering verified with the declared packages.

### Text double quad

Before:

```latex
\text{A\quad\quad B}
```

After this rule:

```latex
\text{A\qquad B}
```

Packages: base, textmacros.

Rendering verified with the declared packages.

## Triggers

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

## Produces

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

## Touches

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

## Upstream

- [base/double-enspace-to-quad](https://texform.dev/rules/base/double-enspace-to-quad): Rewrite two adjacent enspaces to one exact-width quad.

## Downstream

- [base/qquad-drop](https://texform.dev/rules/base/qquad-drop): Drop qquad in math mode and collapse each text-mode qquad run to one ordinary space.

## Same family

- [ams/nobreakspace-to-tilde](https://texform.dev/rules/ams/nobreakspace-to-tilde): Collapse nobreakspace to the canonical nonbreaking space token.
- [base/break-to-linebreak](https://texform.dev/rules/base/break-to-linebreak): Collapse break to the explicit linebreak command.
- [base/newline-to-linebreak](https://texform.dev/rules/base/newline-to-linebreak): Collapse newline to the explicit linebreak command.
- [base/control-space-to-tilde](https://texform.dev/rules/base/control-space-to-tilde): Rewrite math-mode control space to the canonical active space token.
- [base/gt-space-to-colon-space](https://texform.dev/rules/base/gt-space-to-colon-space): Collapse \> to the canonical medium math space command \:
- [base/hfil-to-hfill](https://texform.dev/rules/base/hfil-to-hfill): Collapse hfil to the canonical hfill command under MathJax spacing semantics.
- [base/hfilll-to-hfill](https://texform.dev/rules/base/hfilll-to-hfill): Collapse hfilll to the canonical hfill command.
- [base/hskip-to-hspace](https://texform.dev/rules/base/hskip-to-hspace): Collapse hskip to the explicit hspace command.
- [base/negthinspace-to-neg-comma-space](https://texform.dev/rules/base/negthinspace-to-neg-comma-space): Collapse negthinspace to the explicit negative thin math space command.
- [base/space-to-tilde](https://texform.dev/rules/base/space-to-tilde): Collapse space to the explicit nonbreaking space token.
- [base/thinspace-to-comma-space](https://texform.dev/rules/base/thinspace-to-comma-space): Collapse thinspace to the explicit thin math space command.
- [base/double-enspace-to-quad](https://texform.dev/rules/base/double-enspace-to-quad): Rewrite two adjacent enspaces to one exact-width quad.
- [base/small-spacer-merge-to-enspace](https://texform.dev/rules/base/small-spacer-merge-to-enspace): Merge exact half-em small-spacer chunks into enspace in one pass.
- [base/allowbreak-drop](https://texform.dev/rules/base/allowbreak-drop): Drop allowbreak as a pure linebreak hint during cleanup-oriented normalization.
- [base/badbreak-drop](https://texform.dev/rules/base/badbreak-drop): Drop badbreak as a pure linebreak hint during cleanup-oriented normalization.
- [base/goodbreak-drop](https://texform.dev/rules/base/goodbreak-drop): Drop goodbreak as a pure linebreak hint during cleanup-oriented normalization.
- [base/mathstrut-drop](https://texform.dev/rules/base/mathstrut-drop): Drop the invisible mathstrut layout helper in cleanup-oriented normalization.
- [base/nobreak-drop](https://texform.dev/rules/base/nobreak-drop): Drop nobreak as a pure linebreak hint during cleanup-oriented normalization.
- [base/strut-drop](https://texform.dev/rules/base/strut-drop): Drop the fixed empty strut node in cleanup-oriented normalization.
- [base/enspace-drop](https://texform.dev/rules/base/enspace-drop): Drop enspace in math mode and collapse each text-mode enspace run to one ordinary space.
- [base/qquad-drop](https://texform.dev/rules/base/qquad-drop): Drop qquad in math mode and collapse each text-mode qquad run to one ordinary space.
- [base/quad-drop](https://texform.dev/rules/base/quad-drop): Drop quad in math mode and collapse each text-mode quad run to one ordinary space.
- [base/mkern-to-mspace](https://texform.dev/rules/base/mkern-to-mspace): Collapse mkern to the explicit mspace command.
- [base/mskip-to-mspace](https://texform.dev/rules/base/mskip-to-mspace): Collapse mskip to the explicit mspace command.

## Notes

Both commands are MathJax Spacer nodes at scriptlevel 0, so two 1 em quads exactly equal one 2 em qquad. This Authoring-level canonicalization scans from left to right and replaces every two adjacent quads; one trailing quad remains for odd-length runs. The base owner also matches the same-name textmacros record by command name, covered by the text-mode example. The Equiv spacing-drop family eliminates both quad and qquad, so enabling or omitting this canonicalization does not change the final Equiv normal form. Every Applied result consumes two adjacent cmd:quad nodes and produces no cmd:quad, so the total cmd:quad count strictly decreases.

## Disable this rule

```python
TransformEngine(profile="corpus", disable_rules=["base/double-quad-to-qquad"])
```

```javascript
new TransformEngine({ profile: 'corpus', disableRules: ['base/double-quad-to-qquad'] })
```

[Open in Playground](https://play.texform.dev/?input=A%5Cquad%5Cquad+B)
