David Hanakの回答の後で質問を編集しました(ありがとう!)。彼は構文を手伝ってくれましたが、最初から正しい関数を使用していなかったようです。
基本的に私が欲しいのは、コンパイラーに特定のラベルの複数の定義を無視させ、最初の定義だけを使用させることです。それをするために、私はちょうどこのようなことをするだろうと思いました:
\ makeatletter \ newcommand {\ mylabel} [1] { \ @ifundefined {#1} {\ label {#1}} {X} } \ makeatother
ただし、最初のオプションが常に選択されているため、これは機能しません(ラベルが定義されているかどうかは関係ありません)。\ @ifundefined(および提案された\ ifundefined)はコマンドに対してのみ機能し、ラベルに対しては機能しないと思いますが、LaTeXについてはあまりよく知りません。これに関するどんな助けも素晴らしいでしょう!ありがとう!
ずっと後の更新:David Hanakの回答を私の質問に対する正解としてマークしましたが、それは本当に役に立ちましたが、完全な解決策ではありません。問題は、私は専門家ではないと思いますが、Davidのコードはラベルが定義されているかどうかを確認しますが、ラベルが前回の実行で定義された場合(つまり、.auxファイルにある場合)にのみ機能します。同じ実行で同じ名前の2つの\mylabelsが定義されている場合でも、2番目の\mylabelsは定義されます。また、これを回避できたとしても、LaTeXは時系列で定義した最初のラベルを使用しますが、必ずしもテキストの最初のラベルである必要はありません。とにかく、以下は私の迅速で汚い解決策です。これは、カウンターがすぐに定義されているように見えるという事実を利用しています。
\ newcommand {\ mylabel} [1] {% \ @ifundefined {c @#1} {% \ newcounter {#1}% \ setcounter {#1} {0}% } {}% \ ifthenelse {\ value {#1}> 0} {} {% \ label {#1}% \ addtocounter {#1} {1}% }% }
カウンタを0に初期化する必要があるかどうかはわかりません。デフォルトの可能性が高いようですが、そうであるかどうかがわからなかったので、安全です。また、これは「ifthen」パッケージを使用しますが、これが必要かどうかはわかりません。