我在大卫哈纳克的回答之后编辑了这个问题(谢谢顺便说一句!)。他帮助了语法,但似乎我一开始就没有使用正确的函数。
基本上我想要的是让编译器忽略某个标签的多个定义并只使用第一个。为了做到这一点,我想我会做这样的事情:
\makeatletter \newcommand{\mylabel}[1]{ \@ifundefined{#1}{\label{#1}}{X} } \makeatother
但这不起作用,因为总是选择第一个选项(标签是否定义无关紧要)。我认为 \@ifundefined(和建议的 \ifundefined)只适用于命令而不适用于标签,但我对 LaTeX 知之甚少。对此的任何帮助都会很棒!谢谢!
很久以后的更新:我将 David Hanak 的回答标记为对我的问题的正确答案,但这不是一个完整的解决方案,尽管它确实帮助了我。问题是,我认为但我不是专家,即使 David 的代码检查是否定义了标签,它也仅在之前的运行中定义了标签时才有效(即在 .aux 文件中)。如果在同一运行中定义了两个具有相同名称的 \mylabels,则仍将定义第二个。此外,即使您设法解决此问题,它也会使 LaTeX 使用您按时间顺序定义的第一个标签,而不一定是文本中的第一个标签。无论如何,下面是我快速而肮脏的解决方案。它使用了计数器似乎立即被定义的事实。
\newcommand{\mylabel}[1]{% \@ifundefined{c@#1}{% \newcounter{#1}% \setcounter{#1}{0}% }{}% \ifthenelse{\value{#1} > 0}{}{% \标签{#1}% \addtocounter{#1}{1}% }% }
我不确定是否有必要将计数器初始化为 0,因为这似乎是一个默认值,但我找不到是否是这种情况,所以我只是为了安全。此外,这使用了“ifthen”包,我不确定它是否必要。