使用 namedef 和 nameref 来增强默认的 \ref 命令时遇到问题

使用 namedef 和 nameref 来增强默认的 \ref 命令时遇到问题

我正在尝试增强内置\label命令\ref,以便我可以向通常与引用关联的数字添加一些附加文本。也就是说,我想说

\labelprop{prop:example}{Theorem}

然后\kref{prop:example}产生“定理 3.1”,其中 3.1 是通常的参考编号。

我必须自己这样做的原因是,通常用于执行此操作的软件包prettyref与我的发布商正在使用的软件包相冲突。

所以我尝试了下面的代码---它应该写入一些定义,将所需的文本保存到文件中aux,以便下次定义它们。

\makeatletter
\def\labelprop#1#2{%
   \label{#2}%
   \protected@write\@auxout{}{\string\@namedef{my-ref-#2}{#1}}
}
\def\kref#1{%
   \expandafter\ifx\csname my-ref-#1\endcsname\relax%
       \PackageWarning{my}{Command my-ref-#1\space undefined}%
   \else\fi   %
   \@nameuse{my-ref-#1}%
   \ref{#1}%
}
\makeatother

我已经确认定义正在写入aux文件中;例如

\newlabel{prop:intro}{{1.1}{2}{Results}{theorem.1.1}{}}
\@namedef{my-ref-prop:intro}{Theorem}

出现在那里。但是,kref调用抱怨my-ref-prop:intro未定义并产生空白(即,只是标准参考编号)。

我做错了什么?也欢迎提供调试建议。

下面是一个展现我所描述的行为的 MWE。我添加了一些调试输出。

\documentclass[final,leqno,onefignum,onetabnum,oneeqnum]{siamltex1213}
\usepackage{amsmath}


\makeatletter
\def\labelprop#1#2{%
   \label{#2}%
   \protected@write\@auxout{}{\string\@namedef{my-ref-#2}{#1}}
   \@namedef{my-ref-#2}{#1}
}
\def\foobartest{foo}
\def\kref#1{%
   \typeout{ref \@nameuse{my-ref-#1}}%
   \expandafter\ifx\csname my-ref-#1\endcsname\relax%
       \PackageWarning{my}{Command my-ref-#1\space undefined}%
   \else\fi   %
   \@nameuse{foobartest}%
   \@nameuse{my-ref-#1}%
   \ref{#1}%
}
\makeatother

\begin{document}


\begin{theorem}
%\label{prop:intro}
\labelprop{Theorem}{prop:intro}
This is a theorem.
\end{theorem}

This is a reference to \kref{prop:intro}.
\end{document}

答案1

.aux文件是按组读取的,因此需要全局定义,例如:

\newcommand*{\labelprop}[2]{%
  \@bsphack
  \label{#2}%
  \protected@write\@auxout{}{\string\@labelpropdef{my-ref-#2}{#1}}%
  \@namedef{my-ref-#2}{#1}%
  \@esphack
}
\newcommand*{\labelpropdef}{%
  \global\@namedef
}

评论:

  • 我在行尾添加了注释符号以避免出现不必要的空格。
  • \@bsphack并且\@esphack应该围绕定义以保持原始的间距行为\label(如果之前检测到空格,则命令后的空格将被抑制)。

相关内容