使用 \ref 中定义的变量

使用 \ref 中定义的变量

当尝试使用定义的变量时\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

相关内容