首先,我对此事缺乏了解,深表歉意。我正在尝试以下代码,但并没有真正理解其中的每一点。
无论如何,有人能帮我找出以下代码的错误吗?
\def\pm #1#2{\@bsphack
\newcommand{\currentValue}{\ref{#1}}
\protected@write\@auxout{}%
{\string\newlabel{test\currentValue}{{#2}{\thepage}}}%
\@esphack}
我的意图是什么?定义一个\pm
接受两个参数的命令。第一个参数需要用作引用本身,以便获取另一个变量:\currentValue
。然后,将此变量(\currentValue
)附加到其他文本(“测试”)以创建新标签。
事情看起来不错,但由于某种原因,在创建最终标签时,\hbox {}
会在标签末尾附加一个test\currentValue
。
知道问题是什么吗?或者,如果不采用这种方式,我该如何实现我的目标?
答案1
如果没有\newcommand{\currentValue}{\ref{#1}}
:您将获得相同的结果,您的代码相当于
\def\pm #1#2{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{test\ref{#1}}{{#2}{\thepage}}}%
\@esphack}
因为 的展开\currentValue
正好是\ref{#1}
(实际参数为\pm
代替#1
)。
问题是:\protected@write
无法获得价值因为\ref{#1}
这需要执行绝不在写操作中执行。
你可能会有更好的运气
\usepackage{refcount}
\def\pm #1#2{\@bsphack
\protected@write\@auxout{}%
{\string\newlabel{test\getrefnumber{#1}}{{#2}{\thepage}}}%
\@esphack}
但不清楚你想在这里实现什么,因为你需要知道的值\ref{foo}
才能引用生成的标签
\pm{foo}{bar}
(假设您有一个地方)。因此,如果给出“1”,则\label{foo}
生成标签可以是,但是当更改时,生成的test1
\ref{foo}
\ref{foo}
标签会改变。
笔记 \pm
是 LaTeX 内核的一个命令,重新定义它需要您自担风险。