我有一个由各种包装器调用的 Beamer 主文档,我想让所有\mode
切换都依赖于此包装器序言中定义的命令。对于像\mode<presentation>
这样的正常模式,它可以正常工作,但我发现将其包含在该系统中的唯一方法\mode*
是破解内部命令。
有人有更好的办法来实现同样的目标吗?我的重新定义是否会带来危险(除了重新定义内部命令的一般危险之外)?
\documentclass[]{beamer}
\newcommand\secondmode{presentation}
\newcommand\mainmode{*}
\makeatletter
\def\beamer@@@mode<#1>{\if#1*
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\beamer@modeoutsideframe}
{\beamer@closer\@ifnextchar\bgroup{\beamer@modeinline<#1>}{\beamer@switchmode<#1>}}}
\makeatother
\begin{document}
\mode
<\mainmode>
some text outside a frame in main mode
\begin{frame}
test in frame in main mode
\end{frame}
\mode
<\secondmode>
some text outside a frame in second mode
\begin{frame}
second mode in a frame
\end{frame}
\mode
<\mainmode>
some text outside a frame
\mode
<all>
\end{document}
答案1
我对 Beamer 了解不够多,无法判断是否应该使用完全不同的技术,但至少我认为你想改变
\if#1*
\if*#1%
否则,如果模式名称的前两个字母相同,它将扩展为 true 并排版剩余的字母,后跟*
。
在 MWE 中,它正在测试和,p
因此r
它presentation
恰好采取了正确的分支,但与以下情况相比:
\newcommand\secondmode{ppesentation}