If you process the document
\documentclass{article}
\usepackage{endnotes}
\begin{document}
x\endnote{Recall that $\sqrt{2}$ is irrational}
\end{document}
you'll get a file with extension .ent
containing
\@doanenote {1}
macro:->Recall
that
$\sqrt
{2}$
is
irrational
\@endanenote
This is a consequence of the definition
\long\def\@endnotetext#1{%
\if@enotesopen \else \@openenotes \fi
\immediate\write\@enotes{\@doanenote{\@theenmark}}%
\begingroup
\def\next{#1}%
\newlinechar='40
\immediate\write\@enotes{\meaning\next}%
\endgroup
\immediate\write\@enotes{\@endanenote}}
and of
\let\@doanenote=0
\let\@endanenote=0
which make the two control sequences into unexpandable tokens.
The \meaning
primitive takes as argument a single token and expands to a string representation of the token: all characters will have category code 12, except for space tokens that are normalized to character code 32 (space) with category code 10. If the token is a macro (that is, it has been defined with \def
, \edef
, \gdef
or \xdef
), the representation will be of the form
macro:〈parameter text〉->〈replacement text〉
Thus, in the endnotes
case above, \meaning\next
will expand to
macro:->Recall that $\sqrt {2}$ is irrational
because the parameter text is empty. By rule, each control word in the string representation will be followed by a space.
The macro \@endnotetext
does three \write
operations. In the first, \@doanote {1}
is written out, because \@doanote
is not expandable so it is written out as is (with a trailing space), whereas \@theenmark
will be expanded. Also {
and }
are unexpandable, so we get the first line in the example.
Then the expansion of \meaning\next
is written, under the setting \newlinechar='40
which means that spaces (character code decimal 32, octal '40) will be transformed into newline characters. I guess this is done for avoiding overlong lines, in case of long endnotes.
Finally \@endanenote
is written (on a new line).
When the .ent
file is read in by the \theendnotes
command, \@doanenote
is given a new meaning; basically it reads until >
is found, emits \begingroup
, sets the mark to the tokens in braces and starts typesetting the note text; \@endanenote
is redefined to issue \par\endgroup
.
What does \meaning
return in other cases? Here are a few examples; I use plain TeX, but it would be the same in all flavors of TeX.
\let\foo=0 % like in endnote.sty
\def\next{Recall that $\sqrt{2}$ is irrational}
\def\macro#1{Something with #1}
\tt % typewriter type
\meaning\relax
\meaning a
\meaning 0
\meaning\alpha
\meaning\foo
\meaning\next
\meaning\macro
\meaning ~
\meaning\&
\meaning\pageno % plain tex
\bye

A control sequence \let
to a character will display the same as if the character was used. A control sequence defined with \chardef
(like \&
) gives \char"
followed by the hexadecimal number of the character; similarly for \mathchardef
(like \alpha
).
The macros \next
and \macro
show the difference when there is a parameter text; finally, primitives represent themselves (like \relax
). There are a few other cases, I showed \pageno
that's defined with \countdef
.
\meaning\meaning
is the meaning of\meaning
.