^GS - Graphic Symbol
Prints one of the built-in legal symbols, selected by the following `^FD`.
^GS prints one of five marks the printer carries in firmware: registered trademark,
copyright, trademark, and the UL and CSA approval monograms. A compliance label
therefore needs no downloaded graphic for them. No argument of the command selects the mark. The
field data that follows selects it, and only its first character.
Syntax
^GSo,h,wSupport
The command renders, with the caveat below.
All five symbols render as glyphs of the symbol face, the way Labelary sets them, so each mark matches stroke for stroke. Under ^FR every symbol inverts once, crossings included. The one gap left is the default size: an omitted height or width takes the minimum here and the last ^CF on Labelary. — pinned by test_gs_full_set_at_12dpmm
Labelary renders this command.
Parameters
oOrientationoptional · one of a setRotation of the symbol.
- Default
- the orientation set by
^FW, orN - Invalid value
- discarded, and the default applies. Any other value uses the current
^FWorientation. - Test coverage
- Values exercised: N, R, I, B. The invalid-value rule is not pinned by a test.
N- Normal (default)
R- Rotated 90° clockwise
I- Inverted 180°
B- Read from bottom up, 270°
hCharacter heightoptional · dotsHeight of the symbol in dots.
- Default
- the character height set by
^CF - Accepted range
- 1 to 32000 dots
- Invalid value
- discarded, and the default applies
- Test coverage
- Bounds pinned: maximum (32000), below the minimum (0), above the maximum (99999999999999999999, 32001). No test at the minimum. The invalid-value rule is not pinned by a test.
wCharacter widthoptional · dotsWidth of the symbol in dots.
- Default
- the character width set by
^CF - Accepted range
- 1 to 32000 dots
- Invalid value
- discarded, and the default applies
- Test coverage
- Bounds pinned: below the minimum (0), above the maximum (32001). No test at the minimum or maximum. The invalid-value rule is not pinned by a test.
Behavior
The selector runs A to E:
^FD | Symbol |
|---|---|
A | ® registered trademark |
B | © copyright |
C | ™ trademark |
D | UL approval monogram |
E | CSA approval monogram |
The renderer reads the first character only, so ^FDAB and ^FDA render identical
output. A character outside A to E, and the lower-case spellings too, draws nothing
at all, and does so silently, with no diagnostic and no reserved space. Check this
first when a mark is missing from a label.
The symbol is an ordinary field. It needs a preceding ^FO or ^FT, its own ^FD and
a closing ^FS, and it reverses under ^FR like any other field.
Coarse size steps
The guide documents the height and width as dots, up to 32000, but the renderer draws
the mark at one of ten sizes only. A value at or below 35 renders the smallest
mark, and one at or above 228 grows no further. ^GSN,230 and ^GSN,4000 give
the same output, and neither reports a warning. We measured this against Labelary on
2026-08-16, and the renderer reproduces it. Treat the arguments as a coarse dial, and
where a symbol must match a body of text exactly, check the render and not the numbers.
The two axes quantize independently, so an unequal h and w stretch the mark and do
not scale it.
Known issues
Tested behavior
Differences from the specification
Labelary against the ZPL II guide
Where Labelary — our compatibility target — behaves differently from the printed specification.
- The guide accepts 0 for the height and width; Labelary's own reference documents a minimum of 1. — pinned by
test_gs_height_below_min_clamps - Labelary rounds each axis to the nearest whole 24 dots, then clamps it to ten steps. The mark is set at an em of 24 to 240 dots.
^GSN,230and^GSN,4000render identically, and anything at or below 35 renders the smallest mark. The guide implies a continuous 0 to 32000 range. We measured this on 2026-08-16. — pinned bytest_gs_size_clamps,quantisation_matches_the_measured_table
zpl.tools against the ZPL II guide
Where our renderer behaves differently from the specification.
- Under
^FR, a^GSmark inverts once wherever it crosses itself, because the field's ink is composed into one mask and that mask is inverted as a single object. — pinned bytest_fr_gs_symbol_inverts_once_where_the_mark_crosses_itself - An omitted height or width does not default to
^CF; it takes the 15-dot minimum instead. — not pinned by a test
zpl.tools against Labelary
Where our output differs from Labelary for the same input. These are the differences that break a migration.
- A
^GSthat omits its height and width takes its size from the last^CFon Labelary; the renderer always draws the 15-dot minimum. We measured this on 2026-07-29: after^CFD,100,100, a bare^GSdraws a 61-dot mark on Labelary and a 16-dot one here. — not pinned by a test
Example
All five symbols at the same nominal size:
^XA
^FO40,40^GSN,120,120^FDA^FS
^FO190,40^GSN,120,120^FDB^FS
^FO340,40^GSN,120,120^FDC^FS
^FO490,40^GSN,120,120^FDD^FS
^FO640,40^GSN,120,120^FDE^FS
^XZ
Related commands
^GBGraphic BoxDraws a rectangle, a line or a filled block.^GFGraphic FieldDraws a bitmap sent inline with the label.^FDField DataSupplies the text or barcode content of the field.^CFChange Alphanumeric Default FontSets the font and size used by fields that do not specify their own.^FRField Reverse PrintInverts the field where it overlaps what is already on the label.