题
我编辑大卫·哈纳克的回答之后的问题(顺便说一句感谢!)。他帮助的语法,但现在看来,我没有使用正确的函数的开始。
基本上我想要的是让编译器忽略某个标签的多重定义,只是使用第一个。为了做到这一点,我想我只是做这样的事情:
\makeatletter \newcommand{\mylabel}[1]{ \@ifundefined{#1}{\label{#1}}{X} } \makeatother
这个不工作,虽然,这是因为第一选项总是选择(如果标签被定义或不没关系)。我认为\ @ifundefined(和建议\ ifundefined)只为命令,而不是标签的工作,但我真的不知道很多关于乳胶。任何帮助,这将是巨大的!谢谢!
很久以后更新: 我标志着大卫哈纳克的作为正确回答我的问题的回应,但它不是一个完整的解决方案,但它真的帮了我。 问题是,我想,但我不是专家,即使大卫的代码检查,看是否有标签的定义,它当标签在以前的运行定义(即是在.aux文件)才有效。如果有两个同名\ mylabels在相同的运行定义,第二个仍然被定义。而且,即使你设法解决这个问题,它将使LaTeX的使用你定义的时间顺序,而不必在文本中的第的第一个标签。 不管怎样,下面是我的快速和肮脏的解决方案。它使用的事实,计数器似乎要马上定义
\newcommand{\mylabel}[1]{% \@ifundefined{c@#1}{% \newcounter{#1}% \setcounter{#1}{0}% }{}% \ifthenelse{\value{#1} > 0}{}{% \label{#1}% \addtocounter{#1}{1}% }% }
我不知道是否需要到柜台初始化为0,因为它似乎是一个可能的默认设置,但我找不到,如果是这样的话,所以我只是安全的。 此外,该使用“就(ifthen)”包,我不知道是必要的。
解决方案
@
是在胶乳中的特殊字符。为了使您的声明语法正确,你就必须添加两行:
\makeatletter
\newcommand{\mylabel}[1]{
\@ifundefined{#1}{\label{#1}}{X}
}
\makeatother
第一行变成@
成一个正常的信,最后一行反转其效果。
更新:您可能也想看看在 “普通” 的 \ifundefined
乳胶宏。
<强>更新2 强>
好吧,我做了一些研究,以找出答案的真正的问题。问题是,定义一个标签不创建该名称的宏;它预先考虑一个“R @”给它。因此,尝试以下操作:
\makeatletter
\newcommand{\mylabel}[1]{
\@ifundefined{r@#1}{\label{#1}}{X}
}
\makeatother
有关更多技术详情,请参阅线latex.ltx 3863在您的LaTeX的分布(那里说\def\newlabel{\@newl@bel r}
)。
其他提示
我也没有一个LaTeX专家,试图和搜索我下面的工作网络后一天不过。我用一个虚拟的计数器来解决这个问题。希望这有助于,显然没有多少人都在寻找这一点。
\newcommand{\mylabel}[1]{
\ifcsname c@#1\endcsname%
\else%
\newcounter{#1}\label{#1}%
\fi%
}
维克托Eijkhout “由主题的TeX”,第143页:
\def\ifUnDefinedCs#1{\expandafter\ifx\csname#1\endcsname\relax}
这可被用来检查标签是否定义;如果不是,该标签被打印:
\newcommand{\myautoref}[1]{\ifUnDefinedCs{r@#1}{\color{magenta}\IDontKnow\{#1\}}\else\autoref{#1}\fi}