当尝试使用定义的变量时\ref
出现错误:
! Missing \endcsname inserted.
以下是我使用和定义变量的方法。
\def\SectionnameInstall{section:hironxo\_install}
... \ref{\SectionnameInstall},
显然\ref 需要marker
,但我不确定是否\def
符合其标准。谢谢。
答案1
\label
和的标签\ref
应为纯字符串,最好是字母数字字符。应谨慎使用特殊字符。宏和命令只能在完全可扩展且扩展为无害字符串时使用。
\_
由 定义\DeclareRobustCommand
。因此它不可扩展且无法使用。该命令旨在排版结果,因为_
在数学模式下具有特殊含义/类别代码。
从技术上讲,标签必须存活下来才能放入\csname
并\endcsname
生成存储参考数据的内部宏名。
来自 pdfTeX,大多数 TeX 编译器(pdfTeX、LuaTeX、XeTeX)都知道\ifincsname
,可用于检查当前上下文是否是\csname
/\endcsname
构造内的宏名构建。
这可用于将这样的测试添加到定义中\_
:
\documentclass{article}
\makeatletter
\edef\_{%
\noexpand\ifincsname
_%
\noexpand\else
\noexpand\x@protect\noexpand\_%
\noexpand\protect
\expandafter\noexpand\csname _ \endcsname
\noexpand\fi
}
\makeatother
\newcommand*{\SectionnameInstall}{section:hironxo\_install}
\begin{document}
\noindent
Section \ref{\SectionnameInstall} starts
at page \pageref{\SectionnameInstall}
\section{Install}
\label{\SectionnameInstall}
\end{document}
答案2
我不认为定义的命令是你的问题。请考虑以下最小工作示例:
\documentclass{article}
\def\labeldef{\sectlabel}
\def\sectlabel{sect:examp}
\begin{document}
\label{\labeldef\sectlabel}
Here is a reference with a command in the label:
\pageref{\labeldef\sectlabel}.
\end{document}
编译无误,并产生以下内容:
但是,只要我插入\_
,它就不起作用。我不确定这里的下划线是你定义的,还是你只是想转义文字下划线。但是,文字下划线在标签中一般是安全的,所以如果是后者,你可能只想删除反斜杠,看看效果如何。
答案3
为了打印下划线,应该对其进行转义;在 a 中\label
不能这样做,因为\_
是一个生成用于打印下划线的指令集的命令。
\newcommand\SectionnameInstall{section:hironxo_install}
将会起作用,因为_
在 的参数中是合法的\label
。