为什么 \ref 或 \pageref 扩展后的文本末尾有一个空的 \hbox?

为什么 \ref 或 \pageref 扩展后的文本末尾有一个空的 \hbox?

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

相关内容