zpl.tools
Fields

^FP - Field Parameter

Prints the field's characters downwards or right-to-left instead of along a line.

^FP changes the direction the characters of a field advance in, and adds extra space between them. It stacks a field vertically and keeps the glyphs upright, which is what Asian scripts need. That is the difference from ^FW: ^FW rotates the characters, and ^FP keeps them upright and moves the next one elsewhere.

Syntax

^FPd,g

Support

Supportedparsed: full · state: full · rendered: full

Every documented parameter renders the same output Labelary produces.

Labelary renders this command.

Parameters

dPrint directionoptional · one of a set

Which way the characters advance. Unlike ^FW, the characters themselves are not rotated.

Default
H
Invalid value
discarded, and the default applies
Test coverage
Values exercised: V, R. Not exercised: H. The invalid-value rule is not pinned by a test.
H
Horizontal, the normal left-to-right flow (default)
V
Vertical: characters stack downwards, each upright
R
Reverse, right-to-left
gAdditional character gapoptional · dots

Extra dots inserted between characters, on top of the font's own spacing.

Default
0
Accepted range
0 to 9999 dots
Invalid value
discarded, and the default applies
Test coverage
No test at the minimum, maximum or one step outside the range. The invalid-value rule is pinned by 2 tests.

Behavior

In V the characters run downwards from the origin, each still upright, so a five-character field occupies one character's width and five characters' height. In R the field runs from the origin to the right as usual, but the characters come out in reverse order: ^FPR with ^FDREVERSE prints ESREVER (measured against Labelary 2026-07-30). R is a reading-direction switch for right-to-left scripts, not a mirror.

The gap argument adds to the font's own advance, so it separates characters in whichever direction the field runs: vertically in V, horizontally in H and R. It does not substitute for ^FB's line spacing, which separates wrapped lines, not characters.

^FP applies to one field. The renderer does not parse it, so a field that must stack prints as an ordinary horizontal line of text at the same origin, in the original character order.

Known issues

2 known divergences from the reference render. Each is measured, tracked, and pinned by a test — so the output stays wrong in exactly these ways until the issues are fixed, rather than drifting.

Cosmetic

A justified block line drops the ^FP character gap, so a stretched line prints narrower than Labelary draws it

Pixels differ, meaning does not. A scanner decodes the same payload and a human reads the same characters.

Tracked in project/var/claude/parity-issues/FINDINGS.md. Pinned so it cannot change unnoticed by test_fp_horizontal_gap_is_dropped_on_a_justified_line.

Cosmetic

A negative character gap is clamped to zero and reported against the wrong minimum, so a field asking for tighter spacing keeps the font's own

Pixels differ, meaning does not. A scanner decodes the same payload and a human reads the same characters.

Tracked in project/var/claude/parity-issues/FINDINGS.md. Pinned so it cannot change unnoticed by test_fp_negative_gap_keeps_the_font_spacing.

Tested behavior

Differences from the specification

Labelary against the ZPL II guide

Where Labelary — our compatibility target — behaves differently from the printed specification.

  • Labelary drops a gap past ten of the font's own character heights rather than clamping it. No report names the drop. The field prints at the font's own spacing, and the limit follows the width argument alone. Bisected 2026-08-22: 1000 dots at ^A0N,100,100 and at ^A0N,40,100, 400 at ^A0N,100,40, 330 at ^A0N,100,33, 540 at ^AAN,30,30 and 440 at ^ABN,30,30. — pinned by test_fp_horizontal_gap_past_the_font_limit_is_dropped
  • A ^FB block counts the gap towards its wrap at ten dots for every dot of the font's width, a fraction of the dots the line then draws, so a gapped block breaks earlier and still overhangs its own width. Bisected 2026-08-22 for the smallest one-line block width: AAA BBB at ^A0N,50,50 needs 181 dots ungapped and 205, 229 and 277 at gaps 20, 40 and 80; at ^A0N,100,100 it needs 362 and 386. — pinned by test_fp_horizontal_gap_narrows_the_block_wrap
  • Labelary accepts a negative gap, from −10 dots, to tighten character spacing. The guide's range starts at 0. We measured this on 2026-08-21: ^FPH,-3 draws no report and narrows every gap by three dots, ^FPH,-99999 answers Value -99999 is less than minimum value -10; used -10 instead, and ^FPH,99999 answers the ordinary maximum report against 9999. — pinned by test_fp_negative_gap_keeps_the_font_spacing

zpl.tools against Labelary

Where our output differs from Labelary for the same input. These are the differences that break a migration.

  • The renderer reads the gap over the guide's range, so a negative value reports 0 as the minimum where Labelary reports −10. Measured 2026-08-21 with ^FPH,-99999 on six lines of twelve characters at ^A0N,100,100. The reports differ on every line, and the page by 15.51%. The renderer can tighten by a negative gap since 2026-08-22, so all of that is the reader clamping the value away first. — pinned by test_fp_negative_gap_keeps_the_font_spacing
  • A block line stretched by justification J keeps the font's own spacing. Labelary widens its cells by the character gap on top of the stretch, so its line overhangs the block. Measured 2026-08-22 with ^FB400,4,0,J,0^FPH,20 over six three-letter words at ^A0N,50,50. Labelary inks out to 583 dots of a 400-dot block where we stop on 495, a difference of 0.77% of the page. Every other justification, and a J block's own last line, take the gap here. — pinned by test_fp_horizontal_gap_is_dropped_on_a_justified_line
  • Direction V stacks the characters downward at the font-height pitch, and direction R prints the characters right-to-left from an anchor ahead of the origin, both matching Labelary (measured 2026-08-15). A bitmap font's R anchor is derived from the substitute font's baseline, so its run can land a few dots to the right of Labelary's. — pinned by test_fp_reverse_prints_right_to_left, test_fp_vertical_inside_a_rotated_block, test_fp_vertical_stacks_the_characters

Example

Vertical and reverse direction beside an untouched field:

^XA
^FO50,40^A0N,40,40^FPV,10^FDVERT^FS
^FO300,40^A0N,40,40^FPR^FDREVERSE^FS
^FO500,40^A0N,40,40^FDPLAIN^FS
^XZ

Open in viewer