Skip to content

Alpha 0.3.0

Pre-release
Pre-release

Choose a tag to compare

@DWHowes DWHowes released this 05 Aug 21:54
· 115 commits to main since this release

Release Notes: 0.3.0-alpha — 5 August 2026

The editor now knows what makeindex does with what you type, and says so. Until now it looked at the structure of an entry and never at its content, so a heading containing a bare % could travel all the way to the printed index — truncated, page number gone — without a single warning from anything. That is fixed, along with the places the editor's own idea of \index syntax differed from the real one.

The other headline is sort keys: the editor no longer invents one behind your back, and every heading level now has a Sort as field of its own.

The full guide and reference PDFs now ship with the installer — see the last section.

Entry text is now checked as you type

Nothing in the editor has ever looked at what you type into an index entry.

The worst thing that could get through, and the reason this upgrade exists: a bare % silently ruins the entry. \index{Profit % margin} compiles cleanly, with no warning at any stage, and the printed index contains just Profit — the rest of the term gone, the page number gone. Nothing anywhere tells you why this happened.

All six fields in the Index Entry window — the three heading levels and their three Sort as fields — now carry a small icon whenever their text contains a character LaTeX or makeindex will read as something other than what you meant. Hover it for one line per problem, in plain terms. The same icons appear in the entry table, on entries loaded from your files and on cells you edit, so an entry reads the same way whether you created it or are correcting it later.

What it means Examples
⚠ The build breaks, or the entry is silently lost %, &, #, _, ^, an unpaired $, a bare ", an unmatched brace, a trailing \
ℹ It builds, but it doesn't say what you typed Bang! Goes → two heading levels; user@host → filed under user; a|b → b read as a page style

&, #, _, ^ and $ are the ones that look fine and then fail on the second LaTeX pass, when the index is read back in — with the error pointing into a generated .ind file rather than at anything you wrote.

In the Index Entry window, click the icon to correct the whole field at once — an entry with three stray ampersands is one decision, not three. Ctrl+Z in the field puts it back. Findings with no mechanical fix (an unmatched brace, a trailing backslash) show a greyed icon and an explanation: those need you to say what you meant. A table cell reports but doesn't repair — there's nowhere to put a button.

Nothing is blocked. Every entry still inserts, edits and saves exactly as before. $ is checked for pairs, so $E=mc^2$ is fine, and ^/_ are only flagged outside maths. ~ is left alone entirely — it's a non-breaking space, and a reasonable thing to want.

" is now the escape character in an index entry, not \

The editor used to treat \!, \@ and \| as escaped characters — an exclamation mark, an at-sign, a vertical bar, stripped of their meaning as index grammar. makeindex has never read them that way. A backslash means nothing at all to makeindex; it copies it straight into the generated index for LaTeX to deal with, which is exactly why \% and \& work. So \index{A\|B} really does come out with a page style of B, and this editor showed it to you as a plain entry with a stray \| in the middle of it.

The escape makeindex does honour is the double quote:

Written Read as
Bang"! Goes one heading, printing Bang! Goes
user"@host one heading, printing user@host
a"|b one heading, printing a|b
"" one quotation mark
\"o ö — a LaTeX umlaut, its quote left alone

That is now what the editor reads. If a project already contains \!, \@ or \| inside an \index tag, those entries will be read differently from now on — as the level break, sort key or page style makeindex was always going to make of them. Nothing is rewritten in your files; the editor has simply stopped disagreeing with the tool it writes for. Backslash escaping of braces (\{, \}) is unaffected — that one is LaTeX's, and it always worked.

Bold and italic no longer break the markup around them

The B and I buttons in the Index Entry window wrapped whatever you had selected, taken completely literally — and a text field will let you select any two points at all, including the middle of a LaTeX command. With RMS \textit{Titanic} in the field:

You selected You got
just the \ RMS \textbf{\}textit{Titanic}
from after the \ into the middle of the word RMS \\textbf{textit{Tit}anic}

Neither stops the document building. The first prints a stray brace; in the second the doubled backslash is a line break and textit prints as an ordinary word — so the damage shows up in the finished index rather than as an error you could act on.

The selection is now widened, before anything is wrapped, to something a command can safely take as its argument: a command is never cut in half, it keeps its argument group, and braces balance. All three of the selections above now give you RMS \textbf{\textit{Titanic}}. The status bar says so when it happens, and the wrapped run is left selected so you can see what was taken.

Selecting just the words inside a group still formats only those words. A field whose braces don't balance is declined outright, with a note saying why — wrapping there would only nest a good group inside a broken one.

An "@" moved into the sort field now says so, and offers to put it back

Typing user@host into a heading level produced \index{host} — filed under user, printing as host — silently. @ really is makeindex's sort-key separator, and splitting it out is right far more often than it is wrong: it is also how an autocomplete suggestion carrying a sort key gets unpacked into the two fields it means. So it still splits.

It just isn't silent any more. The status bar names the level it happened on, and the field itself gets a small undo button: one click puts the text back exactly as you typed it and empties the sort field again. Once you've done that, leaving the field won't re-split the same text — but editing it into something else arms the split again as normal.

Sort keys are yours to set

The Index Entry window now has a Sort as field beside each heading level, and the editor no longer invents a sort key behind your back.

It used to. Any level containing bold or italic had one generated by stripping the macros out, which is wrong more often than it is right — and it never appeared anywhere you could see it:

You typed You got An indexer files it under
\textit{The Quality of Mercy} filed under T Q — not under The
RMS \textit{Titanic} filed under R T

The field appears on its own as soon as a level carries formatting, because that's the case where the printed form can't be filed on at all — makeindex would sort \textit{...} under the backslash, among the symbols. It starts out holding the heading with the formatting read out of it and keeps up with what you type; the first keystroke in it makes it yours, and nothing rewrites it after that.

Tick Show sort keys for the field on every level, formatted or not — St. John filed under Saint John, 1984 under Nineteen Eighty-Four. That setting is remembered between sessions.

An empty field is a decision. Nothing is generated for you, so a formatted heading with the field cleared files under its display text exactly as written; the status bar mentions it once as the entry goes in, and inserts it either way.

This is the same split the entry table has always shown as its paired Display and Sort columns, and both now follow one rule — so the entry table is also where you correct an entry created back when the key was invented for you.

Bold and italic page numbers now compile

The Page Ref buttons wrote |bold and |italic into your source. Neither is a LaTeX command: makeindex wraps the page number in whatever name follows the |, so a styled entry became \bold{12} in the compiled index and stopped the document with Undefined control sequence. It also cost you the styling in an RTF export, which only recognizes the real commands.

They now write |textbf and |textit, which is what the entry table has always written. Entries already in your files are unaffected — bold, bf, it and the rest are still read as page styles, and Preferences → General still decides which names count.

Page ranges can be bold or italic

Selecting text and choosing Bold or Italic used to write |bold|(, which is not a range at all as far as makeindex is concerned, and which this editor read back as a heading with a | in it. A styled range is written |(textbf — marker first, command after — and that is now what goes in, on both ends of the range, so the whole span comes out as 12–15 in the printed index.

The Page column of the entry table edits a range's style too. Range rows were read-only there, which meant a range's style could not be set anywhere at all; the marker is now kept aside while you choose from the same Standard/Bold/Italic list as any other row. Only the opening half of a range is ever listed — the closing half follows whatever you set, so the two ends never disagree.

Ranges already styled by hand in your source are now recognised. A \index{term|(textbf} written before this editor touched the project used to be read as two unrelated single-page entries whose page style was the nonsense command (textbf; they never paired up, and never reached Check Range Consistency. They are read as one styled range from now on, with no conversion step and nothing to approve.

Renaming a heading no longer discards its page style

Renaming a heading in the index tree rewrote every entry beneath it from the editor's cached copy of the heading — which does not include the | suffix. So \index{Main|textbf} came back as \index{Renamed}, losing the styling, and \index{Main|(} came back as \index{Renamed}, destroying the page range altogether. The suffix is now read from the file being rewritten and put back: page styles, range markers and see pointers all survive a rename.

Reopening a recent project

File → Open Recent lists the projects you've opened before, most recent first, so returning to one no longer means navigating to its folder again. The first nine can be picked by number. Hovering an entry shows its full path, which is what tells apart two projects that share a name.

A project is added only once it has opened successfully, so a cancelled or failed open leaves nothing behind, and reopening one moves it up the list rather than adding a second copy. Choosing a project whose folder has since been moved or deleted says so and offers to forget it.

Preferences → General gains a Recent Projects group: a switch to turn the submenu off entirely, a count from 1 to 25 (default 10), and a Clear List Now button. Lowering the count hides the oldest entries rather than deleting them, so raising it again brings them back — deliberately unlike the undo depth above it, where a lower number really does discard. Turning the feature off hides the submenu and stops anything new being recorded, but keeps what is already stored; the clear button lives in Preferences precisely so it stays reachable once the submenu is gone.

Name inversion no longer freezes the window

The authority lookup can take several network calls, and the window used to sit frozen for all of them. It now runs in the background: the status bar says which name is being looked up, the rest of the application stays usable, and the suggestion dialog appears when the answer arrives. Only one lookup runs at a time. If the entry it was requested for is gone by then — the table re-sorted or the row deleted — it is cancelled with a message rather than applied to whatever row has taken its place.

Life dates are now stripped from the suggestion. An authority heading is typically Churchill, Winston, 1874-1965; an index files under Churchill, Winston. Previously the dates came back or not depending on which record the lookup happened to resolve through, so the same person could arrive either way.

Your corrections stick again. A name cache created by an earlier version was missing the columns a correction is written to, and every write against it failed silently — so an overruled suggestion was offered again unchanged on the next encounter. Existing caches are upgraded when they are opened; nothing is lost.

Cross-references in the index tree

Only the See / See also label is italicised now. The target beside it is a real index term and renders the way its own entry specifies — a case name written in italics stays italic, while an ordinary heading is shown in roman instead of being italicised on its behalf.

This also fixes a cross-reference whose target carries a sort key, such as Linke@\textit{Die Linke}: it used to lose the See label altogether and show only the target.

Dark mode

  • The selected tab is visible again. The colour it used and the colour of the unselected tabs are the same in the shipped dark theme, so the tab strip gave no clue which pane you were on. Selection is now marked with the highlight colour, the way a selected row in a list already is.
  • Spin box and combo box arrows are no longer invisible — they were being drawn at a contrast of 1.26:1 against their own background.
  • The standalone theme editor follows the application theme. The colour previews inside it deliberately do not, since their whole job is to show the colours you are choosing.

Documentation now ships with the application

The installer places three PDFs alongside the program, reachable from a "LaTeX Indexing Editor Documentation" shortcut in your Start Menu:

  • User Guide — the full guide, twelve chapters and every screen.
  • Design Overview — how the application is put together, for anyone reading or changing the code.
  • Name Cache SQL Queries — reference for the authority-lookup cache.

The application's own Help → Contents... (F1) is unchanged and still covers the same ground in shorter form.

Under the hood

  • One module now owns every question of "what will LaTeX and makeindex make of this text", and both the Index Entry window and the entry table ask it, so the two cannot give different answers about the same entry.
  • The \index grammar gained the quote escape and lost the backslash one, which removed a class of disagreement between this editor and the tool it writes for.
  • Test suite grew from roughly 1265 tests to 1530, all passing.

Upgrading from 0.2.0-alpha

  • Installs cleanly over the previous version; your projects and settings are unaffected.
  • If any of your \index tags contain \!, \@ or \|, those entries will read differently after upgrading — as the level break, sort key or page style that makeindex was always going to make of them. Nothing in your files is rewritten; the editor has simply stopped disagreeing with makeindex about them. See the escape-character section above.
  • Entries that were given a sort key automatically by an older version keep it. It is now visible and editable in both the Sort as field and the entry table's Sort columns, which is where to correct one that was guessed wrongly.