\edef
does not work with \protect
Robust LaTeX commands are either "naturally robust" - meaning that
they never need \protect
, or "self-protected" - meaning that
they have \protect
built in to their definition in some
way. Self-protected commands are robust only in a context where the
\protect
mechanism is properly handled. The body of an
\edef
definition doesn't handle \protect
properly, since
\edef
is a TeX primitive rather than a LaTeX command.
This problem is resolved by a LaTeX internal command
\protected@edef
, which does the job of \edef
while keeping the
\protect
mechanism working. There's a corresponding
\protected@xdef
which does the job of \xdef
.
Of course, these commands need to be tended carefully, since they're internal: see '@' in control sequence names.