Перейти к содержимому
Топаз6.0 · До релиза
Загрузка →

Поиск в документации

Спецификация 6.0

Выберите результат стрелками и нажмите Enter, чтобы открыть его.

Введите имя API, номер диагностики, правило или тему проекта.

    Библиотека · std.typeset

    PlanLine.postValidationWidthLimit

    Report the optional fixed point admission threshold.

    PlanLine.postValidationWidthLimit: Option<Length<Pt>>
    Модуль
    std.typeset →
    Получатель
    PlanLine
    Минимальное число аргументов
    0
    Максимальное число аргументов
    0

    Declaration and parameters

    Ссылка

    Доступность

    Включено по умолчанию · Не определено

    Import std.typeset in language mode 5.21.

    The current compiler selects std/typeset.tpz for this language mode. Availability in other released editions and inclusion in each installed distribution are Pending.

    Получатель

    PlanLine

    Ограничения параметров

    Public measurement fields use Length<Pt>. Widths, advances, tracking, stretch, shrink, physical targets, insets, font sizes, and optional width limits keep that type across input and output records. Explicit Length conversion functions remain the integer interchange boundary.

    Box.width, Box.trackingAfter, Glue.width, Glue.trackingAfter, Glue.stretch, Glue.shrink, and Penalty.width have type Length<Pt>.

    BreakCluster.advance, BreakCluster.trackingAfter, BreakPolicy.narrowestWordTarget, and BreakPolicy.bodyWordTarget have type Length<Pt>.

    LatinSpacing.fontSizePt, JustificationPolicy.maxAdjustment, and JustificationPolicy.maxGapAdjustment have type Length<Pt>.

    LineGeometry.bodyTarget, LineGeometry.firstTarget, and LineGeometry.dropCapInset have type Length<Pt>.

    PlanLine.target, PlanLine.rawTextWidth, PlanLine.trimmedTextWidth, PlanLine.costTextWidth, and PlanLine.selectedPenaltyWidth have type Length<Pt>. PlanLine.postValidationWidthLimit has type Option<Length<Pt>>.

    An int, a float, or a Length with another unit marker is not an implicit point-length argument. Convert physical units explicitly with toPt() before constructing a typesetting record.

    Indices, counts, penalties, costs, and dimensionless ratios retain their declared types. LatinSpacing.maxLetterSpacingEm is a relative Length<Em>. Resolve it to Length<Pt> with fontSizePt before selecting the computation grid.

    Paragraph.grid selects quantization at the computation boundary. ScaledPoint uses the exact scaled-point integer. MilliPoint uses the existing nearest-even conversion to millipoints. The selected grid never changes the physical interpretation of a public Length<Pt> value.

    Returned distances are converted from the computation grid into Length<Pt> at the output boundary. ParagraphPlan.grid reports the computation policy and is not needed to interpret its distances.

    The public type change preserves the selected cost model. FixedPoint retains its MilliPoint computation requirement. Word-space and CJK ratio calculations keep their independent floor rules. The relative letter-spacing distance is resolved and quantized through the shared Length conversions before it contributes to capacity.

    The public line-badness entry point also receives width, target, and hyphen advance as Length<Pt>. It converts those distances to millipoints at entry and preserves its existing integer cost calculation.

    ParagraphPlan.lines contains line records in source order. Each nonempty line consumes the half-open unit interval from start through endExclusive. The first line starts at zero, adjacent lines share an endpoint, and the last line ends at the unit count. These are BoxItem and GlueItem indices rather than item array offsets, scalar offsets, or byte offsets.

    trimmedEndExclusive removes trailing units whose complete text is an ASCII space or a no-break space. It stays between start and endExclusive. displayTextScalarLength counts Unicode scalars in the consumed text after trailing ASCII spaces and no-break spaces are removed. It excludes the selected penalty insertion and retains leading text.

    A unit width includes its following tracking contribution. rawTextWidth is the sum of consumed unit widths minus the last consumed unit trackingAfter. trimmedTextWidth applies the same formula to the trimmed unit interval. An empty trimmed interval has zero width. Reading a plan does not reshape text or modify source measurements.

    kind reports the selected penalty kind. selectedPenaltyWidth reports that selected penalty width after conversion to the computation grid for every kind and cost model. The insertion contributes at the selected boundary and leaves the stored text, source indices, and displayTextScalarLength unchanged.

    FixedPoint costTextWidth is the raw width, capped at the target minus selectedPenaltyWidth on a nonfinal line with bounded spacing capacity. KnuthPlass costTextWidth excludes leading GlueItem units and excludes trailing GlueItem units for an ordinary break. A Forced KnuthPlass break retains its trailing glue and associated capacity.

    FixedPoint postValidationWidthLimit is Some(limit) with the effective target, nonfinal shrink allowance, and one grid unit of rounding allowance. It reports the optimized admission threshold. Single-unit lines and greedy choices can exceed it. KnuthPlass reports None() because its admission is expressed by glue capacity and adjustment ratios.

    cost is the selected line contribution under the paragraph cost model, including applicable penalty and transition demerits. adjustmentRatioR is zero for FixedPoint. For KnuthPlass it is the signed ratio to the selected stretch or shrink capacity, scaled by 100000000 and rounded to nearest with ties to even.

    ParagraphPlan.totalCost is the sum of its line costs in line order. Scores can be negative when an Allowed penalty rewards a break. A score is interpreted with its CostModel and policies. ParagraphPlan.grid reports the computation grid, while all reported distances retain Length<Pt>.

    For an applicable FixedPoint bounded fill search, optimized.boundedFillFeasible is Some(true) when that search succeeds and Some(false) when the second search supplies the plan. In other cases it is None(). The greedy plan always reports None(). This field records feasibility within the configured bounded search.

    ParagraphResult.optimized and greedy contain the two plans from the same validated input. breakOpportunityCount counts all eligible penalty entries before planning, including equal-boundary duplicates and the supplied terminal candidate. It is independent of the number of output lines.

    Результат

    The declared result type is Option<Length<Pt>>.

    Эффекты

    Ошибки

    Result and effects

    Ссылка

    Select this field from a value of its named type without call parentheses.

    Some(limit) carries the target plus applicable shrink and one grid unit. A singleton or greedy choice can exceed it. KnuthPlass reports None() and uses ratio admission.

    A renderer needs source consumption, display trimming, width admission, and scoring as separate measurements. Explicit indices and optional feasibility results let the renderer inspect source consumption and width fit for every selected line.

    Related entries

    Ссылка

    std.typeset →

    Give public typesetting distances a point-length type

    Ссылка
    Правилоtopaz.stdlib.contract.typeset-length-pt.rule

    Give public typesetting distances a point-length type

    Public measurement fields use Length<Pt>. Widths, advances, tracking, stretch, shrink, physical targets, insets, font sizes, and optional width limits keep that type across input and output records. Explicit Length conversion functions remain the integer interchange boundary.

    Box.width, Box.trackingAfter, Glue.width, Glue.trackingAfter, Glue.stretch, Glue.shrink, and Penalty.width have type Length<Pt>.

    BreakCluster.advance, BreakCluster.trackingAfter, BreakPolicy.narrowestWordTarget, and BreakPolicy.bodyWordTarget have type Length<Pt>.

    LatinSpacing.fontSizePt, JustificationPolicy.maxAdjustment, and JustificationPolicy.maxGapAdjustment have type Length<Pt>.

    LineGeometry.bodyTarget, LineGeometry.firstTarget, and LineGeometry.dropCapInset have type Length<Pt>.

    PlanLine.target, PlanLine.rawTextWidth, PlanLine.trimmedTextWidth, PlanLine.costTextWidth, and PlanLine.selectedPenaltyWidth have type Length<Pt>. PlanLine.postValidationWidthLimit has type Option<Length<Pt>>.

    An int, a float, or a Length with another unit marker is not an implicit point-length argument. Convert physical units explicitly with toPt() before constructing a typesetting record.

    Indices, counts, penalties, costs, and dimensionless ratios retain their declared types. LatinSpacing.maxLetterSpacingEm is a relative Length<Em>. Resolve it to Length<Pt> with fontSizePt before selecting the computation grid.

    Paragraph.grid selects quantization at the computation boundary. ScaledPoint uses the exact scaled-point integer. MilliPoint uses the existing nearest-even conversion to millipoints. The selected grid never changes the physical interpretation of a public Length<Pt> value.

    Returned distances are converted from the computation grid into Length<Pt> at the output boundary. ParagraphPlan.grid reports the computation policy and is not needed to interpret its distances.

    The public type change preserves the selected cost model. FixedPoint retains its MilliPoint computation requirement. Word-space and CJK ratio calculations keep their independent floor rules. The relative letter-spacing distance is resolved and quantized through the shared Length conversions before it contributes to capacity.

    The public line-badness entry point also receives width, target, and hyphen advance as Length<Pt>. It converts those distances to millipoints at entry and preserves its existing integer cost calculation.

    Причина

    A physical distance carries the same Length<Pt> type in application geometry and paragraph planning. The type prevents a grid selector or an unlabelled scalar from silently changing the distance.

    Use point lengths in Box

    Ссылка
    main.tpzUse point lengths in BoxОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Box = ts.Box {
    3. unitIndex: 0,
    4. text: "A",
    5. width: 12pt,
    6. trackingAfter: 0pt
    7. }
    8. let distance: Length<Pt> = value.width
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in Box

    Ссылка
    main.tpzReject untyped physical distances in BoxОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Box = ts.Box {
    3. unitIndex: 0,
    4. text: "A",
    5. width: 12,
    6. trackingAfter: 0
    7. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:5:10

    Use point lengths in Glue

    Ссылка
    main.tpzUse point lengths in GlueОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Glue = ts.Glue {
    3. unitIndex: 1,
    4. text: " ",
    5. width: 3pt,
    6. trackingAfter: 0pt,
    7. stretch: 1pt,
    8. shrink: 1pt
    9. }
    10. let distance: Length<Pt> = value.width
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in Glue

    Ссылка
    main.tpzReject untyped physical distances in GlueОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Glue = ts.Glue {
    3. unitIndex: 1,
    4. text: " ",
    5. width: 3,
    6. trackingAfter: 0,
    7. stretch: 1,
    8. shrink: 1
    9. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:5:10

    Use point lengths in Penalty

    Ссылка
    main.tpzUse point lengths in PenaltyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Penalty = ts.Penalty {
    3. unitEnd: 1,
    4. width: 0pt,
    5. rule: ts.BreakRule.Forced(),
    6. kind: ts.BreakKind.ForcedEnd(),
    7. flagged: false
    8. }
    9. let distance: Length<Pt> = value.width
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in Penalty

    Ссылка
    main.tpzReject untyped physical distances in PenaltyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.Penalty = ts.Penalty {
    3. unitEnd: 1,
    4. width: 0,
    5. rule: ts.BreakRule.Forced(),
    6. kind: ts.BreakKind.ForcedEnd(),
    7. flagged: false
    8. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:4:10

    Use point lengths in BreakPolicy

    Ссылка
    main.tpzUse point lengths in BreakPolicyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.BreakPolicy = ts.BreakPolicy {
    3. mode: ts.BreakMode.Character(),
    4. rules: ts.KinsokuRules.Unicode16Ja(),
    5. forbidBefore: [],
    6. forbidAfter: [],
    7. boundaryAllowed: [true],
    8. generatedHyphenEnds: [],
    9. protectFittingLatin: true,
    10. preserveShortWords: true,
    11. narrowestWordTarget: 12pt,
    12. bodyWordTarget: 24pt
    13. }
    14. let distance: Length<Pt> = value.narrowestWordTarget
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in BreakPolicy

    Ссылка
    main.tpzReject untyped physical distances in BreakPolicyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.BreakPolicy = ts.BreakPolicy {
    3. mode: ts.BreakMode.Character(),
    4. rules: ts.KinsokuRules.Unicode16Ja(),
    5. forbidBefore: [],
    6. forbidAfter: [],
    7. boundaryAllowed: [true],
    8. generatedHyphenEnds: [],
    9. protectFittingLatin: true,
    10. preserveShortWords: true,
    11. narrowestWordTarget: 12,
    12. bodyWordTarget: 24
    13. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:11:24

    Use point lengths in BreakCluster

    Ссылка
    main.tpzUse point lengths in BreakClusterОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.BreakCluster = ts.BreakCluster {
    3. text: "A",
    4. advance: 12pt,
    5. trackingAfter: 0pt
    6. }
    7. let distance: Length<Pt> = value.advance
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in BreakCluster

    Ссылка
    main.tpzReject untyped physical distances in BreakClusterОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.BreakCluster = ts.BreakCluster {
    3. text: "A",
    4. advance: 12,
    5. trackingAfter: 0
    6. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:4:12

    Use point lengths in LatinSpacing

    Ссылка
    main.tpzUse point lengths in LatinSpacingОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.LatinSpacing = ts.LatinSpacing {
    3. minWordSpaceRatio: 0.8,
    4. maxWordSpaceRatio: 1.33,
    5. maxLetterSpacingEm: 0.01em,
    6. fontSizePt: 12pt
    7. }
    8. let distance: Length<Pt> = value.fontSizePt
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in LatinSpacing

    Ссылка
    main.tpzReject untyped physical distances in LatinSpacingОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.LatinSpacing = ts.LatinSpacing {
    3. minWordSpaceRatio: 0.8,
    4. maxWordSpaceRatio: 1.33,
    5. maxLetterSpacingEm: 0.01em,
    6. fontSizePt: 12.0
    7. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:6:15

    Use point lengths in JustificationPolicy

    Ссылка
    main.tpzUse point lengths in JustificationPolicyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.JustificationPolicy = ts.JustificationPolicy {
    3. mode: ts.JustificationMode.Unjustified(),
    4. minGapCount: 0,
    5. minLineWidthRatioM: 0,
    6. minFinalLineWidthRatioM: None(),
    7. maxAdjustment: 12pt,
    8. maxGapAdjustment: 3pt,
    9. maxGapRatioR: 0,
    10. latinSpacing: None(),
    11. cjkStretchRatio: 0.0
    12. }
    13. let distance: Length<Pt> = value.maxAdjustment
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in JustificationPolicy

    Ссылка
    main.tpzReject untyped physical distances in JustificationPolicyОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.JustificationPolicy = ts.JustificationPolicy {
    3. mode: ts.JustificationMode.Unjustified(),
    4. minGapCount: 0,
    5. minLineWidthRatioM: 0,
    6. minFinalLineWidthRatioM: None(),
    7. maxAdjustment: 12,
    8. maxGapAdjustment: 3,
    9. maxGapRatioR: 0,
    10. latinSpacing: None(),
    11. cjkStretchRatio: 0.0
    12. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:7:18

    Use point lengths in LineGeometry

    Ссылка
    main.tpzUse point lengths in LineGeometryОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.LineGeometry = ts.LineGeometry {
    3. bodyTarget: 24pt,
    4. firstTarget: 20pt,
    5. dropCapSpan: 0,
    6. dropCapInset: 0pt
    7. }
    8. let distance: Length<Pt> = value.bodyTarget
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in LineGeometry

    Ссылка
    main.tpzReject untyped physical distances in LineGeometryОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.LineGeometry = ts.LineGeometry {
    3. bodyTarget: 24,
    4. firstTarget: 20,
    5. dropCapSpan: 0,
    6. dropCapInset: 0
    7. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:3:15

    Use point lengths in PlanLine

    Ссылка
    main.tpzUse point lengths in PlanLineОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.PlanLine = ts.PlanLine {
    3. start: 0,
    4. endExclusive: 1,
    5. trimmedEndExclusive: 1,
    6. displayTextScalarLength: 1,
    7. kind: ts.BreakKind.ForcedEnd(),
    8. target: 12pt,
    9. rawTextWidth: 10pt,
    10. trimmedTextWidth: 10pt,
    11. costTextWidth: 10pt,
    12. selectedPenaltyWidth: 0pt,
    13. postValidationWidthLimit: Some(13pt),
    14. cost: 0,
    15. adjustmentRatioR: 0
    16. }
    17. let distance: Length<Pt> = value.target
    18. let limit: Option<Length<Pt>> = value.postValidationWidthLimit
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject untyped physical distances in PlanLine

    Ссылка
    main.tpzReject untyped physical distances in PlanLineОткрыть песочницу →
    1. import std.typeset as ts
    2. let value: ts.PlanLine = ts.PlanLine {
    3. start: 0,
    4. endExclusive: 1,
    5. trimmedEndExclusive: 1,
    6. displayTextScalarLength: 1,
    7. kind: ts.BreakKind.ForcedEnd(),
    8. target: 12,
    9. rawTextWidth: 10,
    10. trimmedTextWidth: 10,
    11. costTextWidth: 10,
    12. selectedPenaltyWidth: 0,
    13. postValidationWidthLimit: Some(13),
    14. cost: 0,
    15. adjustmentRatioR: 0
    16. }
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:8:11

    Pass typed distances to the line-cost function

    Ссылка
    main.tpzPass typed distances to the line-cost functionОткрыть песочницу →
    1. import std.typeset as ts
    2. let value = ts.lineBadness(20pt, 20pt, 4, 1, ts.BreakKind.ForcedEnd(), false, 0, 0pt)
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Reject raw distances at the line-cost boundary

    Ссылка
    main.tpzReject raw distances at the line-cost boundaryОткрыть песочницу →
    1. import std.typeset as ts
    2. let value = ts.lineBadness(20, 20, 4, 1, ts.BreakKind.ForcedEnd(), false, 0, 0)
    Ожидаемый выводНенулевой код завершения
    Нет стандартного вывода.
    $ topaz check main.tpz --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения check. Ненулевой код завершения.

    • TPZ5001 →

      stdlib-physical-distance-requires-points at main.tpz:2:28

    Diagnostics

    Ссылка

    TPZ5001 →

    Read plan boundaries, measurements, and scores separately

    Ссылка
    Правилоtopaz.stdlib.contract.typeset-plan-reporting.rule

    Read plan boundaries, measurements, and scores separately

    ParagraphPlan.lines contains line records in source order. Each nonempty line consumes the half-open unit interval from start through endExclusive. The first line starts at zero, adjacent lines share an endpoint, and the last line ends at the unit count. These are BoxItem and GlueItem indices rather than item array offsets, scalar offsets, or byte offsets.

    trimmedEndExclusive removes trailing units whose complete text is an ASCII space or a no-break space. It stays between start and endExclusive. displayTextScalarLength counts Unicode scalars in the consumed text after trailing ASCII spaces and no-break spaces are removed. It excludes the selected penalty insertion and retains leading text.

    A unit width includes its following tracking contribution. rawTextWidth is the sum of consumed unit widths minus the last consumed unit trackingAfter. trimmedTextWidth applies the same formula to the trimmed unit interval. An empty trimmed interval has zero width. Reading a plan does not reshape text or modify source measurements.

    kind reports the selected penalty kind. selectedPenaltyWidth reports that selected penalty width after conversion to the computation grid for every kind and cost model. The insertion contributes at the selected boundary and leaves the stored text, source indices, and displayTextScalarLength unchanged.

    FixedPoint costTextWidth is the raw width, capped at the target minus selectedPenaltyWidth on a nonfinal line with bounded spacing capacity. KnuthPlass costTextWidth excludes leading GlueItem units and excludes trailing GlueItem units for an ordinary break. A Forced KnuthPlass break retains its trailing glue and associated capacity.

    FixedPoint postValidationWidthLimit is Some(limit) with the effective target, nonfinal shrink allowance, and one grid unit of rounding allowance. It reports the optimized admission threshold. Single-unit lines and greedy choices can exceed it. KnuthPlass reports None() because its admission is expressed by glue capacity and adjustment ratios.

    cost is the selected line contribution under the paragraph cost model, including applicable penalty and transition demerits. adjustmentRatioR is zero for FixedPoint. For KnuthPlass it is the signed ratio to the selected stretch or shrink capacity, scaled by 100000000 and rounded to nearest with ties to even.

    ParagraphPlan.totalCost is the sum of its line costs in line order. Scores can be negative when an Allowed penalty rewards a break. A score is interpreted with its CostModel and policies. ParagraphPlan.grid reports the computation grid, while all reported distances retain Length<Pt>.

    For an applicable FixedPoint bounded fill search, optimized.boundedFillFeasible is Some(true) when that search succeeds and Some(false) when the second search supplies the plan. In other cases it is None(). The greedy plan always reports None(). This field records feasibility within the configured bounded search.

    ParagraphResult.optimized and greedy contain the two plans from the same validated input. breakOpportunityCount counts all eligible penalty entries before planning, including equal-boundary duplicates and the supplied terminal candidate. It is independent of the number of output lines.

    Причина

    A renderer needs source consumption, display trimming, width admission, and scoring as separate measurements. Explicit indices and optional feasibility results let the renderer inspect source consumption and width fit for every selected line.

    Keep consumed units distinct from displayed trailing space

    Ссылка
    main.tpzKeep consumed units distinct from displayed trailing spaceОткрыть песочницу →
    1. import std.typeset as ts
    2. import std.io
    3. let items: Array<ts.Item> = [
    4. ts.Item.BoxItem(ts.Box { unitIndex: 0, text: "a", width: 3pt, trackingAfter: 0pt }),
    5. ts.Item.GlueItem(ts.Glue { unitIndex: 1, text: " ", width: 1pt, trackingAfter: 0pt, stretch: 0pt, shrink: 0pt }),
    6. ts.Item.PenaltyItem(ts.Penalty { unitEnd: 2, width: 0pt, rule: ts.BreakRule.Forced(), kind: ts.BreakKind.ForcedEnd(), flagged: false })
    7. ]
    8. let input = ts.Paragraph {
    9. grid: ts.DistanceGrid.MilliPoint(),
    10. items: items,
    11. geometry: ts.LineGeometry { bodyTarget: 4pt, firstTarget: 4pt, dropCapSpan: 0, dropCapInset: 0pt },
    12. justification: ts.JustificationPolicy {
    13. mode: ts.JustificationMode.Unjustified(), minGapCount: 0,
    14. minLineWidthRatioM: 0, minFinalLineWidthRatioM: None(),
    15. maxAdjustment: 0pt, maxGapAdjustment: 0pt, maxGapRatioR: 0,
    16. latinSpacing: None(), cjkStretchRatio: 0.0
    17. },
    18. costModel: ts.CostModel.FixedPoint(),
    19. knuthPlass: ts.KnuthPlassPolicy { toleranceR: 100000000, linePenalty: 10, fitnessDemerit: 0, flaggedDemerit: 0, finalFlaggedDemerit: 0 }
    20. }
    21. match (ts.breakParagraph(input)) {
    22. case Ok(result) => {
    23. let plan = result.optimized
    24. let line = plan.lines[0]
    25. io.writeLine("{line.start} {line.endExclusive} {line.trimmedEndExclusive} {line.displayTextScalarLength}")
    26. io.writeLine("{line.rawTextWidth == 4pt} {line.trimmedTextWidth == 3pt} {line.costTextWidth == 4pt}")
    27. io.writeLine("{line.selectedPenaltyWidth == 0pt} {line.adjustmentRatioR}")
    28. match (line.postValidationWidthLimit) {
    29. case Some(limit) => io.writeLine("{limit == 4.001pt}")
    30. case None() => io.writeLine("missing limit")
    31. }
    32. match (plan.boundedFillFeasible) {
    33. case None() => io.writeLine("no fill search")
    34. case Some(_) => io.writeLine("unexpected fill search")
    35. }
    36. }
    37. case Err(_) => io.writeLine("unexpected error")
    38. }
    Ожидаемый выводКод завершения 0
    0 2 1 1
    true true true
    true 0
    true
    no fill search
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 0 2 1 1
    2. true true true
    3. true 0
    4. true
    5. no fill search

    Report an indivisible unit wider than its target

    Ссылка
    main.tpzReport an indivisible unit wider than its targetОткрыть песочницу →
    1. import std.typeset as ts
    2. import std.io
    3. let items: Array<ts.Item> = [
    4. ts.Item.BoxItem(ts.Box { unitIndex: 0, text: "a", width: 5pt, trackingAfter: 0pt }),
    5. ts.Item.PenaltyItem(ts.Penalty { unitEnd: 1, width: 0pt, rule: ts.BreakRule.Forced(), kind: ts.BreakKind.ForcedEnd(), flagged: false })
    6. ]
    7. let input = ts.Paragraph {
    8. grid: ts.DistanceGrid.MilliPoint(),
    9. items: items,
    10. geometry: ts.LineGeometry { bodyTarget: 1pt, firstTarget: 1pt, dropCapSpan: 0, dropCapInset: 0pt },
    11. justification: ts.JustificationPolicy {
    12. mode: ts.JustificationMode.Unjustified(), minGapCount: 0,
    13. minLineWidthRatioM: 0, minFinalLineWidthRatioM: None(),
    14. maxAdjustment: 0pt, maxGapAdjustment: 0pt, maxGapRatioR: 0,
    15. latinSpacing: None(), cjkStretchRatio: 0.0
    16. },
    17. costModel: ts.CostModel.FixedPoint(),
    18. knuthPlass: ts.KnuthPlassPolicy { toleranceR: 100000000, linePenalty: 10, fitnessDemerit: 0, flaggedDemerit: 0, finalFlaggedDemerit: 0 }
    19. }
    20. match (ts.breakParagraph(input)) {
    21. case Ok(result) => {
    22. let line = result.optimized.lines[0]
    23. io.writeLine("{line.start} {line.endExclusive} {line.trimmedTextWidth == 5pt} {line.target == 1pt}")
    24. }
    25. case Err(_) => io.writeLine("unexpected error")
    26. }
    Ожидаемый выводКод завершения 0
    0 1 true true
    
    $ topaz run main.tpz · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 0 1 true true

    Меню

    Загрузка →