I used something like this, below. It's certainly not perfect ZPL code, in fact, I'm sure, far from it, but it did achieve the results we wanted (a printed label per line on the return sales order).
Note: I removed some customer elements of the code, but you can see the structure of LabelStart, Header etc.
{{LabelStart
^FX ... ZPL commands to start the label ...
^XA
~TA000
~JSN
^LT0
^MNW
^MTT
^PON
^PMN
^LH0,0
^JMA
^PR6,6
~SD15
^JUS
^LRN
^CI27
^PA0,1,1,0
^XZ
^XA
^MMT
^PW800
^LL900
^LS0
}}
{{Header
^FX ... Top section with....
^CF0,60
^FO220,30^GFA,^FS
^CF0,30
^FO220,115^FD^FS
^FO220,155^FD^FS
^FO220,195^FD^FS
^FO50,120^GB700,3,3^FS
^FX ... Second section with Customer Name, RMA Number and RMA Header Return Reason Code ...
^CFA,40
^FO50,200^FD$SalesTable_1.SalesName$^FS
^FO50,250^FD$SalesTable_1.ReturnItemNum$^FS
^FO50,350^FD$SalesTable_1.ReturnReasonCodeId$^FS
^FO50,400^FDExpected Returned Qty $SalesLine_1.ExpectedRetQty$^FS
}}
{{Row Table=SalesLine_1 RowsPerLabel=1
^FX... ZPL commands to format the row
^FO50,500^FD$SalesLine_1.ItemId$^FS
^FO50,550^FD$EcoResProductTranslation_1.Name$^FS
^FO50,700^FDROUTE NUMBER: ^FS
^FO50,750^FDDROP SEQUENCE:^FS
^CFA,15
^FO50,800^GB700,3,3^FS
}}
{{Footer
^FX Third section with bar code (currently BE format, EAN 13 barcode).
^BY3,2,200
^FO270,950,2^BE^FD$SalesTable_1.ReturnItemNum$^FS
}}
{{LabelEnd
^FX ... ZPL commands to end the label ...
^XZ
}}