@vindex DEFINE
@cindex macro
+@node Macro Overview
@subsection Overview
@display
@t{!ENDDEFINE.}
@end display
+@noindent
Each @i{argument} takes the following form:
@display
-@r{@{}@i{!arg_name} @t{=},@t{!POSITIONAL}@r{@}}
+@r{@{}@i{!arg_name}@t{=} @math{|} @t{!POSITIONAL}@r{@}}
@r{[}@t{!DEFAULT(}@i{default}@t{)}@r{]}
@r{[}@t{!NOEXPAND}@r{]}
-@r{@{}@t{!TOKENS(}@i{count}@t{)},@t{!CHAREND('}@i{token}@t{')},@t{!ENCLOSE('}@i{start}@t{','}@i{end}@t{')},@t{!CMDEND}@}
+@r{@{}@t{!TOKENS(}@i{count}@t{)} @math{|} @t{!CHAREND('}@i{token}@t{')} @math{|} @t{!ENCLOSE('}@i{start}@t{' @math{|} '}@i{end}@t{')} @math{|} @t{!CMDEND}@}
@end display
+@noindent
The following directives may be used within @i{body}:
@example
!OFFEXPAND
!ONEXPAND
@end example
+@noindent
The following functions may be used within the body:
@display
@t{!BLANKS(}@i{count}@t{)}
@t{!UPCASE(}@i{arg}@t{)}
@end display
+@noindent
The body may also include the following constructs:
@display
@t{!IF (}@i{condition}@t{) !THEN} @i{true-expansion} @t{!ENDIF}
@t{!LET} @i{!var} @t{=} @i{expression}
@end display
+@node Macro Introduction
@subsection Introduction
The DEFINE command creates a @dfn{macro}, which is a name for a