我编辑大卫·哈纳克的回答之后的问题(顺便说一句感谢!)。他帮助的语法,但现在看来,我没有使用正确的函数的开始。

基本上我想要的是让编译器忽略某个标签的多重定义,只是使用第一个。为了做到这一点,我想我只是做这样的事情:

    \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} 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top