라벨이 이미 라텍스에 정의되어 있는지 확인하는 방법이 있습니까?
문제
나는 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}