2009-01-30 99 views
3

我在David Hanak的回答後編輯了這個問題(謝謝btw!)。他在語法方面提供了幫助,但似乎我並沒有使用正確的功能開始。有沒有辦法檢查標籤是否已經在LaTeX中定義?

基本上我想讓編譯器忽略某個標籤的多個定義,只使用第一個。爲了做到這一點,我想我只是做這樣的事情:

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

這不工作,雖然,因爲第一種選擇總是選擇(如果標籤被定義或沒有也沒關係)。我認爲\ @ifundefined(和建議的\ ifundefined)僅適用於命令,不適用於標籤,但我對LaTeX並不十分了解。任何幫助,這將是偉大的!謝謝!

稍後更新: 我將David Hanak的回答標記爲我的問題的正確答案,但它不是一個完整的解決方案,但它確實幫助了我。 問題是,我認爲但我不是專家,即使David的代碼檢查是否定義了標籤,它也只適用於在之前的運行中定義了標籤(即在.aux文件中)的情況。如果在同一運行中定義了兩個具有相同名稱的\ mylabel,則第二個將仍然被定義。此外,即使您設法解決此問題,它也會使LaTeX使用您按時間順序定義的第一個標籤,而不一定是文本中的第一個標籤。 無論如何,下面是我的快速和骯髒的解決方案。它使用計數器似乎立即被定義的事實。

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

我不知道是否需要到櫃檯初始化爲0,因爲它似乎是一個可能的默認設置,但我找不到,如果是這樣的話,所以我只是暫時安全。 此外,這使用'ifthen'包,我不知道是必要的。

回答

3

@是LaTeX中的一個特殊字符。爲了使您的聲明語法正確,你就必須添加兩行:

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

第一行變成@成一個正常的信,最後一行逆轉其效果。

更新:您可能還想看看「普通」\ifundefined LaTeX macro

更新2

好吧,我做了一些研究,以找出答案真正問題。關鍵是定義一個標籤不會通過該名稱創建一個宏;它預先給它一個「r @」。因此,嘗試以下操作:

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

更多技術詳情,請參閱latex.ltx的3863線在您的LaTeX的分佈(在那裏說:\def\newlabel{\@[email protected] r})。

+0

\ ifundefined未在LaTeX中定義,恐怕。 – 2009-01-31 01:26:47

4

我也不是乳膠專家,但是經過一天的嘗試和搜索互聯網,以下爲我工作。我用了一個虛擬櫃檯來解決問題。希望這有助於,顯然沒有多少人正在尋找這個。

\newcommand{\mylabel}[1]{ 
    \ifcsname [email protected]#1\endcsname% 
    \else% 
     \newcounter{#1}\label{#1}% 
    \fi% 
} 
0

作者:Victor Eijkhout,「TeX by Topic」,p。143:

\def\ifUnDefinedCs#1{\expandafter\ifx\csname#1\endcsname\relax} 

這可以用來檢查標籤是否被定義;如果沒有,則打印標籤:

\newcommand{\myautoref}[1]{\ifUnDefinedCs{[email protected]#1}{\color{magenta}\IDontKnow\{#1\}}\else\autoref{#1}\fi} 
相關問題