LaTeX 中的\ref
会扩展为当前标签的文本,位于 对应的位置\label
,后面跟着一个空的\hbox
。在 LaTeX3 中,这是的定义中\hbox
明确的,因此也会在扩展的 中出现在页码后面。\null
\\@setref
\pageref
你为什么想要\hbox
那里有一个空的?(这会使其很难用来\ref
生成文件名或 csnames。)
在 LaTeX2.09 中已经\null
存在,因此在重写时被小心地保留了下来
答案1
我们来看看代码:
% latex.ltx, line 10226:
\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}}
假设我们有\ref{foo}
。 token\r@foo
是在扩展之前构建的\@setref
,所以我们得到
\@setref\r@foo\@firstoftwo{foo}
现在让我们看看的定义\@setref
:
% latex.ltx, line 10217:
\def\@setref#1#2#3{%
\ifx#1\relax
\protect\G@refundefinedtrue
\nfss@text{\reset@font\bfseries ??}%
\@latex@warning{Reference `#3' on page \thepage \space
undefined}%
\else
\expandafter#2#1\null
\fi}
如果交叉引用尚未解析,则测试\ifx\r@foo\relax
返回 true,而这不是我们感兴趣的部分。假设\r@foo
已定义;然后我们得到
#1 <- \r@foo
#2 <- \@firstoftwo
#3 <- foo
展开式变成
\expandafter\@firstoftwo\r@foo\null
的扩展\r@foo
形式为{1.1}{1}
,其中第一个括号部分是交叉引用,第二部分是页码,因此我们得到
\@firstoftwo{1.1}{1}\null
与之\pageref
基本相同,但带有\@secondoftwo
。
为什么\null
?它将空格因子设置为 1000,并避免连字。连字不太可能发生,但您不希望数字末尾的句号成为句末句号。
我不确定如何从 制作控制序列或文件名。但是,通过更改 中的“真实文本”使其真正可扩展并删除 ,\ref
制作 的可扩展版本并不困难。\ref
\ifx
\null