다음 코드는 컴파일에 실패합니다.
\documentclass{article}
\makeatletter
\newcommand{\foo}{xyzzy}
\@ifdefinable{xfoo}{\relax}
\makeatother
\begin{document}
...
\end{document}
보다 정확하게는 다음 오류로 인해 실패합니다.
LaTeX Error: Command \foo already defined.
Or name \end... illegal, see p.192 of the manual.
\@ifdefinable
이는 본질적으로 내부적으로 구현되는 방식 때문입니다 .
질문.\foo
이름을 바꾸 거나 \@ifdefinable
다른 명령으로 바꾸지 않는 좋은 해결 방법이 있습니까 ? (실제 상황에서는 \foo
한 패키지에서 제공하고 \@ifdefinable
다른 패키지에서 사용하고 있습니다.)
답변1
인수는 \@ifdefinable
문자열이 아닌 제어 시퀀스여야 합니다. 이 오류는 \@ifdefinable
백슬래시라고 가정하고 문자열 형식의 인수에서 첫 번째 문자를 제거한다는 사실 때문에 허위입니다 .
그래서 당신은해야합니다
\@ifdefinable{\xfoo}{...}
아마도 이것을 다음과 혼동했을 것입니다 . 이 정의되지 않았는지(또는 ) \@ifundefined
확인하려는 경우 테스트는 다음과 같습니다.\foo
\relax
\@ifundefined{foo}{code for undefined}{code for defined}
aliasctr.sty
이것은 실제로 59행 의 버그입니다 .
59 \@ifdefinable{c@#1}{%
그리고 그래야 해
59 \expandafter\@ifdefinable\csname c@#1\endcsname{%