라벨이 이미 라텍스에 정의되어 있는지 확인하는 방법이 있습니까?

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

  •  20-08-2019
  •  | 
  •  

문제

나는 David Hanak의 답변 후에 질문을 편집했습니다 (감사합니다!). 그는 구문을 도왔지만 올바른 기능을 사용하지 않은 것으로 보입니다.

기본적으로 내가 원하는 것은 컴파일러가 특정 레이블의 여러 정의를 무시하고 첫 번째 라벨을 사용하도록하는 것입니다. 그렇게하기 위해, 나는 다음과 같은 일을 할 것이라고 생각했습니다.

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

첫 번째 옵션은 항상 선택되기 때문에 작동하지 않습니다 (레이블이 정의되었는지 여부는 중요하지 않음). 나는 @ifundefined (그리고 제안 된 ifundefined)가 명령에만 작동하고 레이블에 대해서는 작동하지 않지만 라텍스에 대해 많이 알지 못한다고 생각합니다. 이것에 대한 도움이 좋을 것입니다! 감사!

훨씬 나중에 업데이트 : 나는 David Hanak의 답변을 내 질문에 대한 정답으로 표시했지만, 정말 도움이되었지만 완전한 해결책은 아닙니다. 문제는 생각하지만 전문가는 아니지만 David의 코드가 레이블이 정의되었는지 확인하기 위해 검사를 받더라도 레이블이 이전 실행에서 정의 된 경우에만 작동한다는 것입니다 (예 : .aux 파일에 있습니다). 동일한 이름을 가진 두 개의 mylabel이 동일한 실행에서 정의 된 경우 두 번째는 여전히 정의됩니다. 또한이 문제를 해결하더라도 라텍스가 연대순으로 정의한 첫 번째 레이블을 사용하여 텍스트의 첫 번째는 아닙니다. 어쨌든 아래는 빠르고 더러운 솔루션입니다. 카운터가 즉시 정의 된 것 같습니다.

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

기본값 인 것처럼 보이기 때문에 카운터를 0으로 초기화 해야하는지 확실하지 않지만, 그렇다면 알 수 없었기 때문에 안전합니다. 또한 이것은 'ifthen'패키지를 사용합니다. 확실하지 않습니다.

도움이 되었습니까?

해결책

@ 라텍스의 특별한 캐릭터입니다. 선언을 구문 적으로 정확하게하려면 두 줄을 더 추가해야합니다.

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

첫 번째 줄은 회전합니다 @ 정상적인 문자로 마지막 줄은 그 효과를 역전시킵니다.

업데이트: "평범한"을보고 싶을 수도 있습니다. \ifundefined 라텍스 매크로.

업데이트 2

좋아, 나는 진짜 문제. 문제는 레이블을 정의하는 것이 그 이름으로 매크로를 만들지 않는다는 것입니다. "r@"를 준비합니다. 그러니 다음을 시도하십시오.

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

더 기술적 인 세부 사항은 라텍스 분포에서 Latex.ltx의 3863 행을 참조하십시오 (여기서는 \def\newlabel{\@newl@bel r}).

다른 팁

나는 또한 라텍스 전문가가 아니지만 하루 하루를 인터넷을 검색 한 후 다음은 다음과 같습니다. 나는 더미 카운터를 사용하여 문제를 해결했습니다. 바라건대 이것은 도움이되기를 바랍니다. 분명히 많은 사람들이 이것을 찾고 있지 않습니다.

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

작성자 : Victor Eijkhout, "Tex by Topic", 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