`\foo`가 이미 정의되어 있을 때 `\@ifdefinable{xfoo}{...}`를 어떻게 사용합니까?

`\foo`가 이미 정의되어 있을 때 `\@ifdefinable{xfoo}{...}`를 어떻게 사용합니까?

다음 코드는 컴파일에 실패합니다.

\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{%

관련 정보