What is the result from \string{}
and why can't we use it in place of \detokenize
to check if a macro argument is empty as explained here?
From the TeXbook, page 213:
•
\string
⟨token⟩. TeX first reads the ⟨token⟩ without expansion. If a control sequence token appears, its\string
expansion consists of the control sequence name (including\escapechar
as an escape character, if the control sequence isn’t simply an active character). Otherwise the ⟨token⟩ is a character token, and its character code is retained as the expanded result.
Thus the argument to \string
can't be included in braces: with
\string{}
the {
is “stringified”, returning a {
12 character token and the following }
remains untouched.
On the contrary, \detokenize
takes as argument a ⟨general text⟩. Here's the excerpt from the manual of ε-TeX
•
\detokenize
⟨general text⟩.
The expansion is a list of character tokens representing the token list ⟨balanced text⟩. As with the lists of character tokens produced by TeX’s\the
and ε-TeX’s\readline
, these tokens have category 12 (‘other’), except that the character code 32 gets category 10 (‘space’).
So \detokenize
must be followed by a {
(after a possible ⟨filler⟩) and its argument is whatever follows until the matching ⟨right brace⟩ (that is an explicit character token with category code 2). As with all instances of ⟨general text⟩, TeX will expand tokens in order to find {
.
\string
stringifies the next token, in that case{
, and the result is an unbalanced closing brace. – egreg Nov 18 '14 at 10:17\string{}
is converted to\string{
(that prints the{
) and a closing brace}
. – Manuel Nov 18 '14 at 10:17