iterative and incremental way. Use Abjad to create symbolic
in any score. Because Abjad extends the Python programming language, you
Details of the new release appear below.
## Improvements
- [#715] Grace notes are now aware of their parentage above and beyond their enclosing `GraceContainer`.
- [#703] Added a `synthetic_offset` keyword to `attach()` and `IndicatorExpression`.
- This allows composers to attach effective indicators which start *before* the score starts, allowing composers to model how various indicators hold over from a previous section.
- For example: `attach(Dynamic('f'), voice, synthetic_offset=-1)`
- [#640] Many optimizations:
- Optimized hot code paths in Duration and Offset instantiation.
- Optimized timespan comparison.
- Optimized parser instantiation.
- [#626, #726] `Dynamic` now recognizes `sffp`, `sffz` and `niente` as valid dynamic names.
- [#726] `Hairpin` is now niente-aware.
- [#628] Implemented a collection of command-line tools for working with score packages.
- `ajv score`, `ajv material`, `ajv segment`, `ajv target`.
- These tools are provisional pending more extensive use.
- [#719] Implemented `TupletSpellingSpecifier.preferred_denominator`.
- This mirrors `Tuplet.preferred_denominator`.
- [#666] Abjad now formats LilyPond properties using the newer dot-chained syntax, not the old `#'...` syntax.
- As always, Abjad targets the development version of LilyPond, currently the 2.19 series.
- [#720] Non-reduced fractions can be attached to leaves just like `Multiplier` objects.
- [#724] Equipped `Sequence.partition_by_counts()` with a `reverse` keyword.
- [#725] Equipped `Markup` with `.sub()` and `.super()` markup command methods.
## Changes
- [#709] Spanners now attach **only to leaves**, **never to containers**.
- This represents a significant simplification in Abjad's score model.
- This change should generally be transparent to users, as `attach()` does the work of iterating leaves in its component _expression_.
- [#709] Many spanners now attach only to 2 or more leaves at once, including `Slur` and `Tie`.
- [#709] Removed `Container.select_leaves()`.
- To select a container's leaves, use `list(iterate(container).by_leaf())`.
- To select the _first leaf_ of a container, use `next(iterate(container).by_leaf())`.
- To select the _last leaf_ of a container, use `next(iterate(container).by_leaf(reverse=True))`.
- [#628, #644, #643, #702] Tool-chain clean-up and refactoring
- `developerscripttools` was renamed `commandlinetools`.
- `DeveloperScript` was renamed `CommandlineScript`.
- Unused and obsolete scripts have been removed.
- `Cursor`, `PitchClassTree`, `PayloadTree`, `CyclicPayloadTree`.
- [#714] `Selector.by_leaves()` is now `Selector.by_leaf()`. This harmonizes with `IterationAgent.by_leaf()`.
- [#721] Added a new LilyPondCommand.prefix property.
- This makes it easy to position arbitrary strings relative to components.
## Bugfixes
- [#655] `Tuplet._simplify_redundant_tuplet()` takes logical ties into account.
- [#680] Abjad's docs post-process SVG images under Python 2.7 properly.
- [#736] Registration now takes quarter tones into account.