ラベルがLaTeXですでに定義されているかどうかを確認する方法はありますか?

StackOverflow https://stackoverflow.com/questions/495841

  •  20-08-2019
  •  | 
  •  

質問

David Hanak の回答の後に質問を編集しました (ところで、ありがとう!)。彼は構文を手伝ってくれましたが、私が最初から正しい関数を使用していなかったようです。

基本的に私が望むのは、コンパイラに特定のラベルの複数の定義を無視させ、最初のラベルだけを使用させることです。そのためには、次のようなことをやろうと考えました。

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

ただし、最初のオプションが常に選択されるため、これは機能しません (ラベルが定義されているかどうかは関係ありません)。\@ifundefine (および提案されている \ifundefine) はコマンドに対してのみ機能し、ラベルに対しては機能しないと思いますが、LaTeX についてはあまり知りません。これに関する助けがあれば幸いです。ありがとう!

かなり後のアップデート:David Hanak の回答を私の質問に対する正しい回答としてマークしましたが、本当に役に立ちましたが、完全な解決策ではありません。問題は、専門家ではないと思いますが、David のコードはラベルが定義されているかどうかをチェックしますが、ラベルが以前の実行で定義されている場合にのみ機能することです。.aux ファイル内にあります)。同じ名前を持つ 2 つの \mylabel が同じ実行で定義されている場合、2 番目の \mylabel も引き続き定義されます。また、たとえこの問題を回避できたとしても、LaTeX は時系列で定義した最初のラベルを使用することになり、必ずしもテキスト内の最初のラベルが使用されるとは限りません。とにかく、以下は私の簡単で汚い解決策です。これは、カウンターがすぐに定義されているように見えるという事実を利用しています。

\newcommand{\mylabel}[1]{%
    \@ifundefined{c@#1}{%
        \newcounter{#1}%
        \setcounter{#1}{0}%
    }{}%
    \ifthenelse{\value{#1} > 0}{}{%
        \label{#1}%
        \addtocounter{#1}{1}%
    }%
}

カウンタを 0 に初期化する必要があるかどうかはわかりません。それがデフォルトである可能性が高いように思えますが、そうであるかどうかは見つけられなかったので、安全を期すことにしています。また、これは「ifthen」パッケージを使用していますが、これが必要かどうかはわかりません。

役に立ちましたか?

解決

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

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

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

アップデート: 「プレーン」もチェックしてみてはいかがでしょうか \ifundefined LaTeXマクロ.

アップデート 2

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

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

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

他のヒント

私は次のことをしようとしてインターネットを検索するの一日は、私のために働いしかし後に、また、LaTeXの専門家ではないです。私はこの問題を解決するためにダミーのカウンタを使用していました。うまくいけば、これは明らかに多くの人々が、この探しているではない、助けます。

\newcommand{\mylabel}[1]{
    \ifcsname c@#1\endcsname%
    \else%
        \newcounter{#1}\label{#1}%
    \fi%
}

ビクターEijkhoutことで、 "トピック別のTeX"、p.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