조건부 주석을 달면 작동하는데 다음 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 스타일 조건문에 중첩될 수 있습니다. 잘못된 분기에 대한 코드도 지정할 수 있습니다.11
01
대체 방법
또는 다음 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}