\
不知何故,所使用的控制空间\label
没有扩展。\foo
在辅助文件中给出了以下新标签:匿名\ 1。注意反斜杠。日志显示:“!缺少\endcsname
插入。”\baz
确实在辅助文件中给出了所需的结果:匿名 2。
我想这与问题有关动态生成的标签Oberdiek 先生回答说:“这也是\_
有问题的。因此必须改变界面。”(这是否意味着无法做到?)
为什么控制空间没有扩大\label
?思考我也可以用不同的方式表述这个问题:为什么控制空间在与其他字符结合使用时不会扩展\csname
\endcsname
?我想不通。
有没有办法让\foo
ie\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
输出: