The editorOperations

Operations

Every edit is a pure function on the model. This page shows each one as a card: the document before, the act, and the document after. The cards are drawn from the same YAML fixtures that @epure/vitest runs, under packages/editor/src/design/operations/, so a card and its test cannot drift apart.

The notation

A fixture writes a document in a small notation. One line is one block, and the text of the line is the block’s text.

Hello world
|Second one

The text of every scenario comes from one course on topology. The course needs what the editor finds hard: inline math, LaTeX blocks, letters composed from several keys, callouts and schemas.

A scenario is the document before, the act, and the document after:

- scenario: backspace at the start of a paragraph joins it with the previous one
  before: |
    Hello world.
    |Second one
  when: backspace
  after: |
    Hello world. |Second one

Join

Backspace at the start of a block joins it with the previous one. The first block keeps its id.

backspace at the start of a block joins it with the previous one using a spaceJoin

Before

  1. aA topology on a set X is a collection of subsets called open sets.
  2. bThe empty set and X itself are open.

After

  1. aA topology on a set X is a collection of subsets called open sets. The empty set and X itself are open.
backspace
the joined block keeps the first idJoin

Before

  1. aAny union of open sets is open.
  2. bAny finite intersection of open sets is open.

After

  1. aAny union of open sets is open. Any finite intersection of open sets is open.
backspace
backspace at the start of the first block changes nothingJoin

Before

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.

After

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.
backspace
joining an empty block removes it and leaves the caret at the end of the previous oneJoin

Before

  1. aThe closure of A is the smallest closed set containing A.
  2. b
  3. cThe interior of A is the largest open set inside A.

After

  1. aThe closure of A is the smallest closed set containing A.
  2. bThe interior of A is the largest open set inside A.
backspace

Split

Enter splits the block at the caret. The first half keeps the id and the second half takes a new one. Over a selection, the selection goes first.

enter in the middle of a block splits it at the caret, removing spaceSplit

Before

  1. aA map f from X to Y is continuous when the preimage of every open set is open.

After

  1. aA map f from X to Y is continuous when
  2. bthe preimage of every open set is open.
enter
the first half keeps the id and the second half takes a new oneSplit

Before

  1. aContinuity is a statement about open sets, not about distances.

After

  1. aContinuity is a statement about
  2. bopen sets, not about distances.
enter
enter at the end of a block opens an empty block under itSplit

Before

  1. aA homeomorphism is a continuous bijection with a continuous inverse.

After

  1. aA homeomorphism is a continuous bijection with a continuous inverse.
  2. b
enter
enter at the start of a block opens an empty block above itSplit

Before

  1. aTwo spaces are homeomorphic when a homeomorphism runs between them.

After

  1. a—
  2. bTwo spaces are homeomorphic when a homeomorphism runs between them.
enter
enter twice leaves an empty block between the halvesSplit

Before

  1. aThe circle and the square are homeomorphic. The circle and the line are not.

After

  1. aThe circle and the square are homeomorphic.
  2. b—
  3. cThe circle and the line are not.
enter
enter
enter over a selection removes it and splits thereSplit

Before

  1. aThe circle and the square are homeomorphic.

After

  1. aThe circle
  2. bare homeomorphic.
enter

Delete

Delete removes the character after the caret. At the end of a block it joins the next block onto it, the mirror of backspace, and the caret stays where it was. Over a selection, delete and backspace both remove it. A selection across blocks trims the first block, trims the last, drops the blocks between and joins the two ends. The first id survives.

delete removes the character after the caretDelete

Before

  1. aEvery open ball is an open set.

After

  1. aEvery open ball is a open set.
delete
delete at the end of a block joins it with the next one and keeps its idDelete

Before

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.

After

  1. aA set is closed when its complement is open. Both the empty set and X are closed.
delete
delete at the end of the last block changes nothingDelete

Before

  1. aThe closure of A is the smallest closed set containing A.

After

  1. aThe closure of A is the smallest closed set containing A.
delete
delete over a selection removes itDelete

Before

  1. aA space is compact when every open cover has a countable subcover.

After

  1. aA space is compact when every open cover has a subcover.
delete
backspace over a selection across blocks trims both ends, drops the blocks between and joinsDelete

Before

  1. aEvery metric space is Hausdorff.
  2. bEvery subspace of a Hausdorff space is Hausdorff.
  3. cThe product of two Hausdorff spaces is Hausdorff.

After

  1. aEvery metric space is Hausdorff.
backspace
delete over a selection across blocks does the sameDelete

Before

  1. aEvery metric space is Hausdorff.
  2. bEvery subspace of a Hausdorff space is Hausdorff.
  3. cThe product of two Hausdorff spaces is Hausdorff.

After

  1. aEvery metric space is Hausdorff.
delete
a selection across blocks keeps the marks outside itDelete

Before

  1. aEvery metric space is Hausdorff.
  2. bThe product of two Hausdorff spaces is Hausdorff.

After

  1. aEvery metric space is –Hausdorff.
backspace

Input

Input is the browser’s input event. The argument is the block that holds the focus, as the browser left it: its whole text, and the caret or selection inside it. The model diffs the old text against the new one to find the span that changed, so marks move with it. Typing, composition, dead keys and autocorrect all land here.

a typed letter lands in the block with the caret after itInput

Before

  1. aFor every there is a δ.

After

  1. aFor every ε there is a δ.
inputFor every ε there is a δ.
text typed over a selection replaces itInput

Before

  1. aA space is compact when every open cover has a countable subcover.

After

  1. aA space is compact when every open cover has a finite subcover.
inputA space is compact when every open cover has a finite subcover.
a letter composed from several keys arrives as one inputInput

Before

  1. aThe Hausdorff condition separates points by pen sets.

After

  1. aThe Hausdorff condition separates points by öpen sets.
inputThe Hausdorff condition separates points by öpen sets.
a character outside the basic plane keeps the caret after itInput

Before

  1. aThe reals carry the order topology.

After

  1. aThe reals 𝕽 carry the order topology.
inputThe reals 𝕽 carry the order topology.
a replacement from autocorrect lands as one inputInput

Before

  1. aEvery metric space is a Hausdorf space.

After

  1. aEvery metric space is a Hausdorff space.
inputEvery metric space is a Hausdorff space.
an input touches only the block that holds the focusInput

Before

  1. aA basis is a family of open sets.
  2. bEvery open set is a union of members.
  3. cThe open balls form a basis of a metric space.

After

  1. aA basis is a family of open sets.
  2. bEvery open set is a union of basis members.
  3. cThe open balls form a basis of a metric space.
inputEvery open set is a union of basis members.

Marks

A mark extends when typing reaches its end, unless it is a link. No mark extends at its start. A toggle over a selection adds the mark to all of it or removes it from all of it, keeps the selection, and skips any code span. On a caret a toggle stores a pending mark for the next typed character. Punctuation typed at the end of a run lands outside it, so a sentence that ends on a bold word or a code span ends plain. A space typed at the end of a bold run keeps the run pending, so the next word rejoins it; a space typed at the end of a code span lands outside, since a span is one identifier. The keys are Cmd+B, Cmd+I and Cmd+E.

typing at the end of a bold run extends the runMarks

Before

  1. aThe interiorB is the largest open set inside A.

After

  1. aThe interior of AB is the largest open set inside A.
inputThe interior of A is the largest open set inside A.
typing at the start of a run does not extend itMarks

Before

  1. a–Compactness is preserved by continuous maps.

After

  1. aNote: –Compactness is preserved by continuous maps.
inputNote: Compactness is preserved by continuous maps.
deleting inside a run keeps the runMarks

Before

  1. aThe interiorB of A is the largest open set inside A.

After

  1. aThe interioB of A is the largest open set inside A.
inputThe interio of A is the largest open set inside A.
text typed over a selection takes the marks of the selection's first characterMarks

Before

  1. aEvery open set is a union of basis members.

After

  1. aEvery memberB is a union of basis members.
inputEvery member is a union of basis members.
bold over a selection marks it and keeps the selectionMarks

Before

  1. aA compact space has a finite subcover for every open cover.

After

  1. aA compact space has a finite subcover for every open cover.
bold
bold over a bold selection removes the markMarks

Before

  1. aA compact space has a finite subcover for every open cover.

After

  1. aA compact space has a finite subcover for every open cover.
bold
bold over a partly bold selection makes all of it boldMarks

Before

  1. aA compact space has a finite subcover for every open cover.

After

  1. aA compact space has a finite subcover for every open cover.
bold
italic over bold gives both, written in one orderMarks

Before

  1. aA compact space has a finite subcover for every open cover.

After

  1. aA compact space has a finite subcover for every open cover.
italic
bold on a caret holds until the next typed characterMarks

Before

  1. aA space is compact when every open cover has a finite subcover.

After

  1. aA cBspace is compact when every open cover has a finite subcover.
bold
inputA cspace is compact when every open cover has a finite subcover.
bold over a range that holds a code span skips the spanMarks

Before

  1. aThe set U is open in X.

After

  1. aThe set U is open in X.
bold
enter inside a bold run carries the mark into both halvesMarks

Before

  1. aOpen sets are closed under unions.

After

  1. aOpen sets are
  2. b–closed under unions.
enter
backspace joins two blocks and merges equal runs at the seamMarks

Before

  1. aClosed sets
  2. b–are the complements of open sets.

After

  1. aClosed sets are the complements of open sets.
backspace
bold over a selection across blocks marks both partsMarks

Before

  1. aAny union of open sets is open.
  2. bAny finite intersection of open sets is open.

After

  1. aAny union of open sets is open.
  2. bAny finite intersection of open sets is open.
bold
a period typed at the end of a bold run lands outside itMarks

Before

  1. aEvery metric space is HausdorffB

After

  1. aEvery metric space is Hausdorff.
inputEvery metric space is Hausdorff.
a comma typed at the end of a code span lands outside itMarks

Before

  1. aThe open set is U` and its complement is closed.

After

  1. aThe open set is U, and its complement is closed.
inputThe open set is U, and its complement is closed.
a period typed inside a code span stays insideMarks

Before

  1. aThe composite fg is continuous.

After

  1. aThe composite f.g is continuous.
inputThe composite f.g is continuous.
a space typed at the end of a bold run keeps bold pendingMarks

Before

  1. aAn openB of X is a family of open sets.

After

  1. aAn open coverB of X is a family of open sets.
inputAn open of X is a family of open sets.
inputAn open cover of X is a family of open sets.
code on a caret holds until the next typed characterMarks

Before

  1. aLet be open in X.

After

  1. aLet U` be open in X.
code
inputLet U be open in X.
a space typed at the end of a code span lands outside itMarks

Before

  1. aThe open set U`is a ball.

After

  1. aThe open set U is a ball.
inputThe open set U is a ball.
a space typed inside a code span stays insideMarks

Before

  1. aThe composite fg is continuous.

After

  1. aThe composite f g is continuous.
inputThe composite f g is continuous.

Caret

An arrow moves the caret one character, and at the end of a block it crosses to the next one. Wherever it lands, by arrow or by click, the caret takes the marks of its place: inside a bold, italic or code run at its end, outside a link at its end, outside any run at its start. Cmd+B takes the other side. After typing, the pending marks are the ones the last typed character took. After a deletion they follow the character before the caret. Up and down depend on line layout and belong to the view, not the model.

right moves the caret one characterCaret

Before

  1. aEvery open set is a union of basis members.

After

  1. aEvery open set is a union of basis members.
->
left moves the caret one character backCaret

Before

  1. aEvery open set is a union of basis members.

After

  1. aEvery open set is a union of basis members.
<-
right at the end of a block moves to the start of the next oneCaret

Before

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.

After

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.
->
left at the start of a block moves to the end of the previous oneCaret

Before

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.

After

  1. aA set is closed when its complement is open.
  2. bBoth the empty set and X are closed.
<-
right at the end of the last block changes nothingCaret

Before

  1. aThe closure of A is the smallest closed set containing A.

After

  1. aThe closure of A is the smallest closed set containing A.
->
right at the end of a run moves on, and the caret lands plainCaret

Before

  1. aAn openB cover of X is a family of open sets.

After

  1. aAn open cover of X is a family of open sets.
->
right to the end of a run lands inside itCaret

Before

  1. aAn open cover of X is a family of open sets.

After

  1. aAn openB cover of X is a family of open sets.
->
right into a run lands inside itCaret

Before

  1. aEvery –open set is a union of basis members.

After

  1. aEvery open set is a union of basis members.
->
left from after a run lands inside itCaret

Before

  1. aAn open cover of X is a family of open sets.

After

  1. aAn openB cover of X is a family of open sets.
<-
typing with bold toggled off at the end of a run is not markedCaret

Before

  1. aAn openB cover of X is a family of open sets.

After

  1. aAn opens cover of X is a family of open sets.
bold
inputAn opens cover of X is a family of open sets.
backspace from outside a run deletes its last letter and lands insideCaret

Before

  1. aAn open– cover of X is a family of open sets.

After

  1. aAn opeB cover of X is a family of open sets.
backspace
backspace inside a block deletes the character before the caretCaret

Before

  1. aEvery open ball is an open set.

After

  1. aEvery open ball is a open set.
backspace
a caret placed at the end of a bold run is inside itCaret

Before

  1. aAn open cover of X is a family of open sets.

After

  1. aAn openB cover of X is a family of open sets.
clickAn open| cover of X is a family of open sets.
a caret placed at the start of a run is outside itCaret

Before

  1. aEvery open set is a union of basis members.

After

  1. aEvery –open set is a union of basis members.
clickEvery |open set is a union of basis members.

Move

A block moves one place at a time. The blocks a selection covers move together. Ids and offsets do not change, so the selection travels with them.

moveUp lifts the block holding the caret above the previous oneMove

Before

  1. aOpen sets are closed under unions.
  2. bA topology is a collection of open sets.

After

  1. bA topology is a collection of open sets.
  2. aOpen sets are closed under unions.
moveUp
moveDown lowers the block holding the caret under the next oneMove

Before

  1. aOpen sets are closed under unions.
  2. bA topology is a collection of open sets.

After

  1. bA topology is a collection of open sets.
  2. aOpen sets are closed under unions.
moveDown
moveUp on the first block changes nothingMove

Before

  1. aA topology is a collection of open sets.
  2. bOpen sets are closed under unions.

After

  1. aA topology is a collection of open sets.
  2. bOpen sets are closed under unions.
moveUp
the blocks of a selection move togetherMove

Before

  1. aAny finite intersection of open sets is open.
  2. bThe empty set and X are open.
  3. cAny union of open sets is open.

After

  1. bThe empty set and X are open.
  2. cAny union of open sets is open.
  3. aAny finite intersection of open sets is open.
moveUp

Paste

One pasted block goes into the text at the caret. Several split the block: the first pasted block joins the text before the caret, the last joins the text after, both the way a join does, and the rest sit between as new blocks. The caret lands at the end of what was pasted. Over a selection, the selection goes first.

pasting one block inserts its text at the caretPaste

Before

  1. aFor every ε there is a .

After

  1. aFor every ε there is a δ with the same property.
pasteδ with the same property
pasted marks come alongPaste

Before

  1. aThe preimage of an open set under a map is open.

After

  1. aThe preimage of an open set under a continuous map is open.
pastecontinuous
pasting over a selection replaces itPaste

Before

  1. aA space is compact when every open cover has a countable subcover.

After

  1. aA space is compact when every open cover has a finite subcover.
pastefinite
pasting several blocks splits the block, and the first and last pasted blocks join the halvesPaste

Before

  1. aA topology on X has three axioms: and that is all.

After

  1. aA topology on X has three axioms: the empty set and X are open.
  2. bAny union of open sets is open.
  3. cAny finite intersection of open sets is open, and that is all.
pastethe empty set and X are open. Any union of open sets is open. Any finite intersection of open sets is open,
pasting several blocks at the end of a block leaves the caret at the end of the last onePaste

Before

  1. aA topology on X has three axioms.

After

  1. aA topology on X has three axioms. The empty set and X are open.
  2. bAny union of open sets is open.
pasteThe empty set and X are open. Any union of open sets is open.

Heading

A block has a form: prose, a heading with its level, or an item of a list. The form is the line’s prefix on the port and in the notation, and it is not text in the model. Setting a form a block already has turns it back into prose, so one key toggles. On a split the form follows the text: the half that holds the title stays a heading, and an empty half is prose. Backspace at the start of a heading turns it into prose and does not join; the next backspace joins.

heading turns the block holding the caret into a heading of its levelHeading

Before

  1. aOpen sets

After

  1. a# Open sets
heading1
heading on a heading of the same level turns it back into proseHeading

Before

  1. a# Open sets

After

  1. aOpen sets
heading1
heading on a heading of another level changes the levelHeading

Before

  1. a# Open sets

After

  1. a## Open sets
heading2
paragraph turns a heading into proseHeading

Before

  1. a## Open sets

After

  1. aOpen sets
paragraph
heading over a selection across blocks sets every blockHeading

Before

  1. aOpen sets
  2. bClosed sets

After

  1. a## Open sets
  2. b## Closed sets
heading2
enter at the end of a heading opens a paragraph under itHeading

Before

  1. a# Open sets

After

  1. a# Open sets
  2. b
enter
enter at the start of a heading opens a paragraph above itHeading

Before

  1. a# Open sets

After

  1. a—
  2. b# Open sets
enter
enter in the middle of a heading leaves a heading and a paragraphHeading

Before

  1. a# Open sets and closed sets

After

  1. a# Open
  2. bsets and closed sets
enter
backspace at the start of a heading turns it into prose and does not joinHeading

Before

  1. aThe three axioms follow.
  2. b# Open sets

After

  1. aThe three axioms follow.
  2. bOpen sets
backspace
backspace at the start of the prose after a heading joins it into the headingHeading

Before

  1. a# Open sets
  2. bA set is open when it belongs to τ.

After

  1. a# Open sets A set is open when it belongs to τ.
backspace
a heading holds marks like any blockHeading

Before

  1. a# The open sets of X

After

  1. a# The open sets of a space X
inputThe open sets of a space X

Item

An item splits into two items, so a list goes on. Enter on an empty item leaves the list, and backspace at the start of an item turns it into prose.

item turns the block holding the caret into an itemItem

Before

  1. aEvery open ball is open.

After

  1. a- Every open ball is open.
item
item on an item turns it back into proseItem

Before

  1. a- Every open ball is open.

After

  1. aEvery open ball is open.
item
enter at the end of an item opens a new itemItem

Before

  1. a- Every open ball is open.

After

  1. a- Every open ball is open.
  2. b-
enter
enter on an empty item leaves the listItem

Before

  1. a- Every open ball is open.
  2. b-

After

  1. a- Every open ball is open.
  2. b
enter
enter in the middle of an item splits it into two itemsItem

Before

  1. a- Every open ball is open.

After

  1. a- Every open ball
  2. b- is open.
enter
backspace at the start of an item turns it into proseItem

Before

  1. a- Every open ball is open.
  2. b- The whole space is open.

After

  1. a- Every open ball is open.
  2. bThe whole space is open.
backspace
backspace at the start of the prose after an item joins it into the itemItem

Before

  1. a- Every open ball is open.
  2. bThe whole space is open.

After

  1. a- Every open ball is open. The whole space is open.
backspace

Reference

A reference holds an atom in a block: the id between double braces, under a mark of its own. The editor draws the atom by its type, and the browser may not edit it. The caret never sits inside an atom. What the arrows do at one is the type’s to say. A type that enters, such as a formula, opens its box: right before the atom opens it with the caret at the start of the source, and left after the atom opens it at the end. Inside the box the arrows move through the source, and at its edges they leave it, after the atom on the right and before it on the left. Escape leaves after the atom. A type with a widget of its own, such as a video, is skipped whole, and so is a reference to no atom. Typing beside an atom lands outside it, and a mark toggled over a range that holds one covers it whole. Backspace after an atom selects it, and delete before one does the same, so nothing invisible is ever removed; the next backspace removes it and leaves its atom in the section. edit changes the text of an atom and no block, and in an open box it leaves the caret after what was typed. insert mints an atom and places its reference at the caret; in the editor it is Cmd+M, and the box takes the source. A pasted reference copies its atom under a new id, so two references never share one atom by accident, and a reference to an atom the section does not hold stays as it is.

right before a formula enters its box, with the caret at the start of the sourceReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
->
right inside the box moves the caret one characterReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
->
right at the end of the source leaves the box, after the atomReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
->
left after a formula enters its box, with the caret at the end of the sourceReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
<-
left at the start of the source leaves the box, before the atomReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
<-
escape leaves the box after the atomReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
escape
an edit in the box leaves the caret after what was typedReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U⊆XU \subseteq X is open by definition.
a8f1mathU \subseteq X
edita8f1, U \subseteq X
right before an atom of a type with a widget skips it wholeReference

Before

  1. aWatch {"row": "0f3a9c1e2b4d6a7f", "width": "wide"} before the proof.
b2c3video{"row": "0f3a9c1e2b4d6a7f", "width": "wide"}

After

  1. aWatch {"row": "0f3a9c1e2b4d6a7f", "width": "wide"} before the proof.
b2c3video{"row": "0f3a9c1e2b4d6a7f", "width": "wide"}
->
left after an atom of a type with a widget skips it wholeReference

Before

  1. aWatch {"row": "0f3a9c1e2b4d6a7f", "width": "wide"} before the proof.
b2c3video{"row": "0f3a9c1e2b4d6a7f", "width": "wide"}

After

  1. aWatch {"row": "0f3a9c1e2b4d6a7f", "width": "wide"} before the proof.
b2c3video{"row": "0f3a9c1e2b4d6a7f", "width": "wide"}
<-
right before a reference to no atom skips it wholeReference

Before

  1. aSee {{zz99}} for the proof.

After

  1. aSee {{zz99}} for the proof.
->
a letter typed after a reference lands outside itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau, is open by definition.
a8f1mathU \in \tau
inputA set {{a8f1}}, is open by definition.
a letter typed before a reference lands outside itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U, U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
inputA set U, {{a8f1}} is open by definition.
backspace after a reference selects itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
backspace
backspace over a selected reference removes it and keeps its atomReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set is open by definition.
a8f1mathU \in \tau
backspace
delete before a reference selects itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
delete
a selection across a reference removes it with the restReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA open by definition.
a8f1mathU \in \tau
backspace
enter beside a reference splits around itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau
  2. bis open by definition.
a8f1mathU \in \tau
enter
a join keeps a reference wholeReference

Before

  1. aA set U∈τU \in \tau
  2. bis open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
backspace
bold over a selection holding a reference covers it wholeReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau
bold
bold pending after a reference does not reach into itReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U∈τU \in \tauUB is open by definition.
a8f1mathU \in \tau
bold
inputA set {{a8f1}}U is open by definition.
edit changes the text of an atom and no blockReference

Before

  1. aA set U∈τU \in \tau is open by definition.
a8f1mathU \in \tau

After

  1. aA set U⊆XU \subseteq X is open by definition.
a8f1mathU \subseteq X
edita8f1, U \subseteq X
insert mints an atom and places its reference at the caretReference

Before

  1. aEvery open ball is open.
a8f1mathU \in \tau

After

  1. aEvery open ball B(x,r)B(x, r) is open.
a8f1mathU \in \tau
e1mathB(x, r)
insertmath, B(x, r)
insert over a selection replaces itReference

Before

  1. aEvery open ball B is open.
a8f1mathU \in \tau

After

  1. aEvery open ball B(x,r)B(x, r) is open.
a8f1mathU \in \tau
e1mathB(x, r)
insertmath, B(x, r)
pasting a reference copies its atom under a new idReference

Before

  1. aBoth are open.
a8f1mathU \in \tau

After

  1. aBoth U∈τU \in \tau and U∈τU \in \tau are open.
a8f1mathU \in \tau
e1mathU \in \tau
e2mathU \in \tau
pasteU∈τU \in \tau and U∈τU \in \tau
pasting a reference to an unknown atom keeps it danglingReference

Before

  1. aSee for the proof.
a8f1mathU \in \tau

After

  1. aSee {{zz99}} for the proof.
a8f1mathU \in \tau
paste{{zz99}}

Display

A display is a block form, beside paragraph, heading and item: it holds one reference alone and draws it as a block. A formula on its own line is a display, and the same formula in a sentence is inline; the atom is the same and its type says how it draws in each place. Only a block holding one reference alone takes the form, and a block that no longer does, after any edit, is prose again. Backspace at the start of a display joins it to the paragraph above and its atom lands inline. Enter at its end opens a paragraph under it. In the editor the form is Cmd+Alt+4.

display turns a block holding one reference alone into a display blockDisplay

Before

  1. aTwo sets are always open:
  2. b∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
display
display on a block holding text beside its reference changes nothingDisplay

Before

  1. aTwo sets are always open: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
display
paragraph turns a display block back into a paragraphDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
paragraph
a display formula under a paragraph is an enter, an insert and the formDisplay

Before

  1. aTwo sets are always open:
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open:
  2. b:: ∅∈τ\emptyset \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
e1math\emptyset \in \tau
enter
insertmath, \emptyset \in \tau
display
a letter typed beside the atom makes the block a paragraph againDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau holds
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
input{{a8f1}} holds
right from the paragraph above enters the display block before its atomDisplay

Before

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
->
right again enters the display's boxDisplay

Before

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
->
->
backspace at the start of a display block joins it to the paragraph above, inlineDisplay

Before

  1. aTwo sets are always open:
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aTwo sets are always open: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
backspace
backspace after the atom selects itDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
backspace
backspace over the selected atom leaves an empty paragraphDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
backspace
enter at the end of a display block opens a paragraph under itDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
  2. b
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
enter
enter at the start of a display block opens a paragraph above itDisplay

Before

  1. a:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. a—
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
enter
the same atom draws inline in one block and as a display block in anotherDisplay

Before

  1. aThe pair ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau is the first axiom.
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau

After

  1. aThe pair ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau is the first axiom.
  2. b:: ∅∈τandX∈τ\emptyset \in \tau \quad\text{and}\quad X \in \tau
a8f1math\emptyset \in \tau \quad\text{and}\quad X \in \tau
->