\apptocmd를 조건부로 변환했는데 왜 작동하지 않나요?

\apptocmd를 조건부로 변환했는데 왜 작동하지 않나요?

조건부 주석을 달면 작동하는데 다음 MWE가 작동하지 않는 이유는 무엇입니까?

\documentclass{beamer}

\makeatletter

\@ifclassloaded{beamer}{

\usepackage{bookmark}
\usepackage{etoolbox}

\apptocmd{\beamer@@frametitle}{\only<1>{\bookmark[page=\the\c@page,level=3]{#1}}}%
{\message{** patching of \string\beamer@@frametitle succeeded **}}%
{\message{** patching of \string\beamer@@frametitle failed **}}%

}{}

\makeatother


\begin{document}

\begin{frame}{Title}
Hello \pause world
\end{frame}
\end{document}

답변1

주요 답변

일반적으로 #관련된 명령 패치는 다른 명령에 대한 인수에서 발생할 수 없습니다. 카테고리 코드를 사용하여 몇 가지 트릭을 수행할 수 있지만 다른 접근 방식이 더 쉬울 수도 있습니다.

\documentclass{beamer}

\makeatletter
\@ifclassloaded{beamer}{\@tempswatrue}{\@tempswafalse}
\if@tempswa
  \usepackage{bookmark}
  \usepackage{etoolbox}
  \apptocmd{\beamer@@frametitle}
    {\only<1>{\bookmark[page=\the\c@page,level=3]{#1}}}%
    {\message{** patching of \noexpand\beamer@@frametitle succeeded **}}%
    {\message{** patching of \noexpand\beamer@@frametitle failed **}}%
\fi
\makeatother


\begin{document}

\begin{frame}{Title}
Hello \pause world
\end{frame}
\end{document}

조건 \if@tempswa은 커널에서 제공하는 스크래치 조건입니다.

파일에 쓰여진 내용은 다음과 같습니다 .log.

** patching of \beamer@@frametitle succeeded **

일반화된 답변

를 사용하지 않고 유사한 접근 방식을 사용하면 다음과 \@tempswa같은 다른 LaTeX 의사 조건문에 사용할 수 있습니다 .\@ifpackageloaded\@ifundefined

\makeatletter
\newcommand{\latex@conditional}[1]{#1{11}{01}}

\if\latex@conditional{\@ifclassloaded{beamer}}
  \usepackage{bookmark}
  \usepackage{etoolbox}
  \apptocmd{\beamer@@frametitle}
    {\only<1>{\bookmark[page=\the\c@page,level=3]{#1}}}%
    {\message{** patching of \noexpand\beamer@@frametitle succeeded **}}%
    {\message{** patching of \noexpand\beamer@@frametitle failed **}}%
%\else
% code for the false branch
\fi
\makeatother

\if이는 토큰을 확장하고 LaTeX 의사 조건문이 완전히 확장 가능하다는 사실에 의존합니다 . 그래서 결국 조건이 참인지 아니면 그렇지 않은지를 \if찾아서 그에 따라 참과 거짓 분기를 따릅니다. 이러한 구성은 다른 TeX 스타일 조건문에 중첩될 수 있습니다. 잘못된 분기에 대한 코드도 지정할 수 있습니다.1101

대체 방법

또는 다음 regexpatch패키지를 사용하십시오.

\documentclass{beamer}

\makeatletter
\@ifclassloaded{beamer}{
  \usepackage{bookmark}
  \usepackage{regexpatch}
  \xapptocmd{\beamer@@frametitle}
    {\only<1>{\bookmark[page=\the\c@page,level=3]{#1}}}%
    {\message{** patching of \noexpand\beamer@@frametitle succeeded **}}%
    {\message{** patching of \noexpand\beamer@@frametitle failed **}}%
}{}
\makeatother


\begin{document}

\begin{frame}{Title}
Hello \pause world
\end{frame}
\end{document}

관련 정보