Published: · Updated:
Very few teams choose between TSPL and EPL. The real situation is a replacement: an ageing EPL fleet is being retired, the new hardware speaks TSPL, and the templates that have worked for a decade have to be rebuilt. This page is about that move, not about which language is "better".
More than you expect. Both languages are line-oriented, both position in dots from the top-left, both terminate a job with an explicit print command, and both express barcodes as a command with positional arguments. If you can read one, the other is legible within an hour.
The shape of a job is also familiar: clear the buffer, describe the
label, print it. N and CLS do the same work;
so do P and PRINT.
| Topic | EPL | TSPL |
|---|---|---|
| Label size | q (width) and Q
(height + gap), both in dots |
SIZE in real units and GAP in real
units |
| Buffer clear | N | CLS |
| Text | A50,50,0,4,1,1,N,"HELLO" |
TEXT 50, 50, "3", 0, 1, 1, "HELLO" |
| Barcode type | A code in a positional slot
(1, 3, E30, UA0) |
A quoted string ("128", "39",
"EAN13", "UPCA") |
| Rotation | 0–3 | 0, 90, 180, 270 |
P1 | PRINT 1 |
The size command is the one that changes how you think.
EPL's q/Q are dots, so the physical label size
lives half in the file and half in the media you loaded. TSPL's
SIZE takes millimetres or inches, so the job states its own
physical size. During a migration that is an upgrade — but only if you
re-derive the geometry from measurements instead of copying the old dot
values, which were correct for one specific density.
Rotation is the other quiet trap: an EPL 2 means 180°,
while a TSPL 2 is not a valid rotation at all. A mechanical
find-and-replace produces jobs that look fine and rotate wrongly.
SIZE
wants, and it is the only value that survives a change of
resolution.The same job in three dialects. Positions and sizes are not interchangeable — ZPL and EPL count dots, TSPL sizes the label in millimetres or inches — so use the table to find the command, then re-measure.
| Concept | ZPL | TSPL | EPL |
|---|---|---|---|
| Start / end a label | ^XA … ^XZ | CLS | N |
| Label width | ^PW | SIZE | q |
| Label length | ^LL | SIZE | Q |
| Gap between labels | ^MN | GAP | Q |
| Black-mark media | ^MNM | BLINE* | — no native command |
| Origin offset | ^LH | REFERENCE | R |
| Text field | ^FO + ^A + ^FD | TEXT | A |
| Linear barcode | ^BY + ^BC | BARCODE | B |
| QR code | ^BQ | QRCODE | — no native command |
| Box | ^GB | BOX | X |
| Filled line | ^GB | BAR | LO |
| Copies | ^PQ | PRINT | P |
| Print orientation | ^PO | DIRECTION* | ZT* / ZB* |
| Darkness | ^MD | DENSITY* | D* |
| Print speed | ^PR | SPEED* | S* |
| Character set | ^CI | CODEPAGE* | I* |
* Parsed but not drawn by the Labelixa preview for that language — the printer still applies it.
Render the old job and the new one and compare them on screen: the EPL viewer and the TSPL viewer use separate engines, each with a documented scope, and both report printer-behaviour commands instead of drawing them. Per-language debugging detail is in EPL preview and debugging and TSPL preview and debugging.
Legacy EPL/EPL2 jobs, rendered in the browser: what each line does, which findings matter, and what a preview will not draw.
ZPL vs CPCL: desk printers and mobile unitsWhich to use: ZPL unless the printer is a CPCL mobile unit. Side-by-side command table, how to check and switch the printer language, and how to port a label.
EPL label content shiftedAn EPL label that prints shifted sideways is usually a printer setting, not the form: q width, the R reference point, and stored forms that inherit both.
ZPL vs TSPL: what actually differsLabel size in dots versus real units, job structure, text and barcode syntax — the ZPL and TSPL differences that actually cost porting time.