^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,gSupport
Every documented parameter renders the same output Labelary produces.
Labelary renders this command.
Parameters
dPrint directionoptional · one of a setWhich 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 · dotsExtra 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.
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.
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,100and at^A0N,40,100, 400 at^A0N,100,40, 330 at^A0N,100,33, 540 at^AAN,30,30and 440 at^ABN,30,30. — pinned bytest_fp_horizontal_gap_past_the_font_limit_is_dropped - A
^FBblock 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 BBBat^A0N,50,50needs 181 dots ungapped and 205, 229 and 277 at gaps 20, 40 and 80; at^A0N,100,100it needs 362 and 386. — pinned bytest_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,-3draws no report and narrows every gap by three dots,^FPH,-99999answersValue -99999 is less than minimum value -10; used -10 instead, and^FPH,99999answers the ordinary maximum report against 9999. — pinned bytest_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,-99999on 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 bytest_fp_negative_gap_keeps_the_font_spacing - A block line stretched by justification
Jkeeps 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,20over 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 aJblock's own last line, take the gap here. — pinned bytest_fp_horizontal_gap_is_dropped_on_a_justified_line - Direction
Vstacks the characters downward at the font-height pitch, and directionRprints the characters right-to-left from an anchor ahead of the origin, both matching Labelary (measured 2026-08-15). A bitmap font'sRanchor is derived from the substitute font's baseline, so its run can land a few dots to the right of Labelary's. — pinned bytest_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
Related commands
^FWField OrientationSets the default rotation and justification for the fields that follow.^FDField DataSupplies the text or barcode content of the field.^AScalable / Bitmapped FontSelects the font, rotation and size for the following field.^FBField BlockWord-wraps the field's text into a block of a given width.