Next: , Previous: Dnl, Up: Input Control


7.2 Changing the quote characters

The default quote delimiters can be changed with the builtin changequote:

— Builtin: changequote ([start = ``'], [end = `''])

This sets start as the new begin-quote delimiter and end as the new end-quote delimiter. If any of the arguments are missing, the default quotes (` and ') are used instead of the void arguments.

The expansion of changequote is void.

     changequote(`[', `]')
     =>
     define([foo], [Macro [foo].])
     =>
     foo
     =>Macro foo.

The quotation strings can safely contain eight-bit characters. If no single character is appropriate, start and end can be of any length.

     changequote(`[[[', `]]]')
     =>
     define([[[foo]]], [[[Macro [[[[[foo]]]]].]]])
     =>
     foo
     =>Macro [[foo]].

Changing the quotes to the empty strings will effectively disable the quoting mechanism, leaving no way to quote text.

     define(`foo', `Macro `FOO'.')
     =>
     changequote(, )
     =>
     foo
     =>Macro `FOO'.
     `foo'
     =>`Macro `FOO'.'

There is no way in m4 to quote a string containing an unmatched begin-quote, except using changequote to change the current quotes.

If the quotes should be changed from, say, `[' to `[[', temporary quote characters have to be defined. To achieve this, two calls of changequote must be made, one for the temporary quotes and one for the new quotes.

Macros are recognized in preference to the begin-quote string, so if a prefix of start can be recognized as a potential macro name, the quoting mechanism is effectively disabled. Unless you use changeword (see Changeword), this means that start should not begin with a letter or `_' (underscore).

     define(`hi', `HI')
     =>
     changequote(`q', `Q')
     =>
     q hi Q hi
     =>q HI Q HI
     changequote
     =>
     changequote(`-', `EOF')
     =>
     - hi EOF hi
     => hi  HI

Quotes are recognized in preference to argument collection. In particular, if start is a single `(', then argument collection is effectively disabled. For portability with other implementations, it is a good idea to avoid `(', `,', and `)' as the first character in start.

     define(`echo', `$#:$@:')
     =>
     define(`hi', `HI')
     =>
     changequote(`(',`)')
     =>
     echo(hi)
     =>0::hi
     changequote
     =>
     changequote(`((', `))')
     =>
     echo(hi)
     =>1:HI:
     echo((hi))
     =>0::hi
     changequote
     =>
     changequote(`,', `)')
     =>
     echo(hi,hi)bye)
     =>1:HIhibye:

If end is a prefix of start, the end-quote will be recognized in preference to a nested begin-quote. In particular, changing the quotes to have the same string for start and end disables nesting of quotes. When quote nesting is disabled, it is impossible to double-quote strings across macro expansions, so using the same string is not done very often.

     define(`hi', `HI')
     =>
     changequote(`""', `"')
     =>
     ""hi"""hi"
     =>hihi
     ""hi" ""hi"
     =>hi hi
     ""hi"" "hi"
     =>hi" "HI"
     changequote
     =>
     `hi`hi'hi'
     =>hi`hi'hi
     changequote(`"', `"')
     =>
     "hi"hi"hi"
     =>hiHIhi

It is an error if the end of file occurs within a quoted string.

     `dangling quote
     ^D
     error-->m4:stdin:1: ERROR: end of file in string