4

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」パッケージを使用しますが、これが必要かどうかはわかりません。

4

3 に答える 3

6

私もLaTeXの専門家ではありませんが、1日インターネットを試して検索した後、次のことがうまくいきました。問題を解決するためにダミーカウンターを使用しました。これが役に立てば幸いですが、これを探している人はあまり多くないようです。

\newcommand{\mylabel}[1]{
    \ifcsname c@#1\endcsname%
    \else%
        \newcounter{#1}\label{#1}%
    \fi%
}
于 2012-12-10T16:39:15.730 に答える
5

@LaTeX の特殊文字です。宣言を構文的に正しくするには、さらに 2 行追加する必要があります。

\makeatletter
\newcommand{\mylabel}[1]{
    \@ifundefined{#1}{\label{#1}}{X}
}
\makeatother

最初の行は通常の文字に変わり@、最後の行はその効果を逆にします。

更新:「プレーンな」\ifundefinedLaTeX マクロも参照してください。

更新 2

さて、本当の問題に対する答えを見つけるために、いくつかの調査を行いました。問題は、ラベルを定義してもその名前のマクロは作成されないということです。その前に「r@」を追加します。したがって、次のことを試してください。

\makeatletter
\newcommand{\mylabel}[1]{
    \@ifundefined{r@#1}{\label{#1}}{X}
}
\makeatother

技術的な詳細については、LaTeX ディストリビューションの latex.ltx の 3863 行を参照してください (ここでは と表示されています\def\newlabel{\@newl@bel r})。

于 2009-01-30T15:20:52.470 に答える