{macro 'entry', label, type='text'} ... {/macro} declares a tag {entry} with two parameters. Defining prints nothing; each use renders the body once, with the values of that use as the fields of the macro's one row: {$label}, {$type}.

A use gives values in their declared order ({entry 'E-mail', 'email'}), by name ({entry label='Name'}), or both. A parameter written alone in the declaration is required; one with =default fills in when the use leaves it out, its default evaluated at the use. Inside the body the fields round the use stay visible behind the parameters, so a macro used inside a loop can read the row as well.

A pair use hands its content to @content@, and {slot}s work as in a {define}. The content renders in the body, on the macro's one row, so there too a parameter stands in front of a field of the same name round the use: in {rows}{entry 'x'}{$label}{/entry}{/rows} the {$label} is the parameter, {$label@rows} the row's own. A macro can call itself. A value given to a macro is text, never template, as every value is. {macro:entry} asserts that the name is a macro.

Under the strict check a required parameter left out, more values than parameters, a named parameter the macro does not declare, and a parameter named like an option every tag takes are errors. The difference with {define}: a define reads its parameters as {#name} like a custom tag file, a macro declares them and reads them as fields.