在代码中endnotes.sty
有一个命令\meaning
,其定义如下
\long\def\@endnotetext#1{%
\if@enotesopen \else \@openenotes \fi
\begingroup
\def\next{#1}%
\newlinechar='40
\immediate\write\@enotes{\meaning\next}%
\endgroup}
如果我删除它,它就不再起作用了(我得到了有趣的错误Undefined control sequence. \GenericError
)。有什么用\meaning
?
答案1
~ $ tex
This is TeX, Version 3.14159265 (TeX Live 2016) (preloaded format=tex)
**\relax
*\def\test#1{This is a test #1 macro}
*\show\test
> \test=macro:
#1->This is a test #1 macro.
<*> \show\test
\show
给出日志文件和终端中宏(或原语)的含义(定义)。
\meaning
显示相同的内容,但将其放在文档中。在上面的示例中,它被写入注释文件。
答案2
如果你处理文档
\documentclass{article}
\usepackage{endnotes}
\begin{document}
x\endnote{Recall that $\sqrt{2}$ is irrational}
\end{document}
您将获得一个扩展.ent
名为
\@doanenote {1}
macro:->Recall
that
$\sqrt
{2}$
is
irrational
\@endanenote
这是定义的结果
\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}}
和
\let\@doanenote=0
\let\@endanenote=0
这使得两个控制序列成为不可扩展的标记。
该\meaning
原语将单个标记作为参数,并扩展为该标记的字符串表示形式:所有字符的类别代码均为 12,但空格标记除外,空格标记被规范化为字符代码 32(空格),类别代码为 10。如果标记是宏(即,已使用\def
、\edef
或\gdef
定义\xdef
),则表示形式为
macro:〈parameter text〉->〈replacement text〉
因此,在endnotes
上述情况下,\meaning\next
将扩展为
macro:->Recall that $\sqrt {2}$ is irrational
因为参数文本为空。按照规则,字符串表示中的每个控制字后面都会跟着一个空格。
该宏\@endnotetext
执行三个\write
操作。首先,\@doanote {1}
写出,因为\@doanote
不可扩展,所以按原样写出(带有尾随空格),而\@theenmark
将被扩展。此外{
和}
不可扩展,因此我们得到示例中的第一行。
\meaning\next
然后,在设置下写入扩展,\newlinechar='40
这意味着空格(字符代码十进制 32,八进制'40) 将转换为换行符。我猜这样做是为了避免行太长,以防有较长的尾注。
最后\@endanenote
写入(在新行上)。
当.ent
文件被命令读入时\theendnotes
,\@doanenote
被赋予新的含义;基本上它会读取直到>
找到,发出\begingroup
,将标记设置为括号中的标记并开始排版注释文本;\@endanenote
被重新定义为发出\par\endgroup
。
在其他情况下会返回什么\meaning
?下面是几个例子;我使用纯 TeX,但在所有版本的 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
\let
字符的控制序列将显示与使用该字符时相同的内容。用\chardef
(like \&
) 定义的控制序列将给出\char"
字符的十六进制数;对于\mathchardef
(like \alpha
) 也是如此。
宏\next
和\macro
显示了当有参数文本时的区别;最后,原语表示自身(如\relax
)。还有其他几种情况,我展示了\pageno
用 定义的\countdef
。