我正在尝试增强内置\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
(如果之前检测到空格,则命令后的空格将被抑制)。