标签命令中的控制空间未扩展

标签命令中的控制空间未扩展

\不知何故,所使用的控制空间\label没有扩展。\foo在辅助文件中给出了以下新标签:匿名\ 1。注意反斜杠。日志显示:“!缺少\endcsname插入。”\baz确实在辅助文件中给出了所需的结果:匿名 2

我想这与问题有关动态生成的标签Oberdiek 先生回答说:“这也是\_有问题的。因此必须改变界面。”(这是否意味着无法做到?)

为什么控制空间没有扩大\label思考我也可以用不同的方式表述这个问题:为什么控制空间在与其他字符结合使用时不会扩展\csname \endcsname?我想不通。

有没有办法让\fooie\name\也能正常工作?提前致谢!

\documentclass{article}
\newcommand{\name}{Anonymous}
\newcommand{\foo}{\label{person:\name\ 1}\name}
\newcommand{\baz}{\label{person:\name{} 2}\name}
\begin{document}
    \foo
    \baz
\end{document}

答案1

让我们更全面地解决这个问题。

如果你说

\section{Title}\label{foo}

并且该节恰好是第 2.4 节,位于第 35 页,则 LaTeX 会写

\newlabel{foo}{{2.4}{35}}

.aux当下次运行时读取该文件时,该\newlabel命令将执行

\expandafter\gdef\csname r@foo\endcsname{{2.4}{35}}

这样\ref{foo}就能\pageref提取相关信息了。

的定义\label

% latex.ltx, line 4195:
\def\label#1{\@bsphack
  \protected@write\@auxout{}%
         {\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
  \@esphack}

其结果是,的论证\label需要充分扩展。

现在让我们考虑一下\label{foo\ 1}。写入的内容将是

\newlabel{foo\ 1}{{2.4}{35}}

因为原语\<space>是不可扩展的,所以写操作会使其保持不变。

现在,当.aux文件被读入时,LaTeX 会尝试执行

\expandafter\gdef\csname r@foo\ 1\endcsname{{2.4}{35}}

这里弹出错误:token\<space>非法的里面\csname。只有字符标记和扩展为字符标记的宏才是合法的。

\label更改-机制的代码\ref以允许这样做\<space>是不可能的。此外,\<space>在 中设置 的目的是什么\label

答案2

尝试这个:

\documentclass{article}
\newcommand{\name}{Anonymous}
\newcommand{\foo}{\label{person:\name\space1}\name}% or \name\space 1, same result
\begin{document}
\section{Test}

\foo

See also \ref{person:Anonymous 1} which is same as \ref{person:\name\space1}.

\end{document}

即您希望标签中有一个空格,据我所知,您的问题是使用时空格消失了\name<space>。该\name{}方法也有效,但在或类似宏{}中使用标签时必须使用。\ref

输出:

enter image description here

相关内容