我正在寻找已解决问题的扩展避免在定理环境中使用 ams 风格的可选标题材料周围的括号?。
我希望在某些幻灯片(但不是所有幻灯片)上为定理环境添加可选标题文本。以下是我尝试的:
\documentclass{beamer}
\setbeamertemplate{theorems}[ams style]
\newtheorem*{thm*}{Theorem}
\begin{document}
\begin{frame}
\begin{thm*}[\only<beamer:2->{additional information}]
My Theorem
\end{thm*}
\end{frame}
\end{document}
在上面的例子中,幻灯片 2 看起来符合预期,但幻灯片 1 打印Theorem ().
是否有办法调整解决方案这里将覆盖考虑进去吗?
编辑
我也尝试过
\documentclass{beamer}
\setbeamertemplate{theorems}[ams style]
\newtheorem*{thm*}{Theorem}
\begin{document}
\begin{frame}
\begin{thm*}\only<beamer:2->{[additional information]}
My Theorem
\end{thm*}
\end{frame}
\end{document}
更糟糕的是,LaTeX 并不将其additional information
视为可选的标题文本,而是视为环境本身的内容。
编辑2
喜欢下面建议,我曾考虑从命令中删除括号,然后在环境的可选标头的每个实例中对其进行硬编码。我想避免这样做,因为我可能有许多此类可选标头的实例。
答案1
你问是否有可能针对这个问题调整解决方案
避免在定理环境中使用 ams 风格的可选标题材料周围的括号?
这样调整的结果就能解决您的问题。
这个问题描述的问题和你的问题描述的问题不同:
如果存在的话,该问题要求提供更多信息,但不要用括号括起来。
您的问题是关于某些幻灯片根本没有提供额外信息。
我认为,针对您的问题采用针对不同问题的解决方案可能不是最好的方法,而且可能会导致不必要的复杂情况。
只需用于\alt
分叉,是否要提供可选参数\begin{thm*}
:
\documentclass{beamer}
\setbeamertemplate{theorems}[ams style]
\newtheorem*{thm*}{Theorem\vphantom{()}}
\begin{document}
\begin{frame}<beamer:1-10>
% Assume you don't wish additional info on frames 1,3 and 6:
\alt<beamer:1,3,6>%
{\begin{thm*}}%
{%
\begin{thm*}[{additional information on slide
\only<beamer:2>{2}%
\only<beamer:4>{4}%
\only<beamer:5>{5}%
\only<beamer:7->{7ff}%
}]%
}%
My Theorem
\end{thm*}
\par
\vfill
\begingroup
\noindent\tiny
(Frame \insertframenumber, slide \insertslidenumber/%
\number\numexpr\insertframeendpage-\insertframestartpage+1\relax.\\
The heading of the theorem shall not have additional
information on slides 1, 3 and 6.)\par
\endgroup
\end{frame}
\end{document}
答案2
解决方法:从另一个问题中删除带有解决方案的括号,然后将它们手动添加到定理中(连同空格)。
\documentclass{beamer}
\setbeamertemplate{theorems}[ams style]
\makeatletter
\setbeamertemplate{theorem begin}
{%
\begin{\inserttheoremblockenv}
{%
\inserttheoremheadfont%
\inserttheoremname%
\inserttheoremnumber%
\ifx\inserttheoremaddition\@empty\else\inserttheoremaddition\fi%
\inserttheorempunctuation%
}%
}
\makeatother
\newtheorem*{thm*}{Theorem}
\begin{document}
\begin{frame}
\begin{thm*}[\only<beamer:2->{ (additional information)}]
My Theorem
\end{thm*}
\end{frame}
\end{document}
编辑:您还可以使用包中的一些字符串操作自动应用括号xstring
。但是,这可能不太可靠,所以我建议使用上面的手动解决方案。但如果您想尝试使用以下步骤的版本:
- 检查可选参数是否包含
\only
。如果是: - 计算 中的语法单元数
\inserttheoremaddition
。可选参数的文本是最后一个语法单元(此处:{additional information}
) - 将该语法单元存储在临时宏中
- 查看
xstring
语法单元内部 - 计算参数文本中的字符数
- 从文本中提取此数量的字符。这有效地去除了周围的
{}
。 - 停止查看语法单元内部
- 用文本单元替换删除的单元,并添加空格和括号
梅威瑟:
\documentclass{beamer}
\usepackage{xstring}
\setbeamertemplate{theorems}[ams style]
\makeatletter
\setbeamertemplate{theorem begin}
{%
\begin{\inserttheoremblockenv}
{%
\inserttheoremheadfont%
\inserttheoremname%
\inserttheoremnumber%
\ifx\inserttheoremaddition\@empty\else%
\IfBeginWith{\inserttheoremaddition}{\only}{%
\StrLen{\inserttheoremaddition}[\grouplen]%
\StrChar{\inserttheoremaddition}{\grouplen}[\myarg]%
\exploregroups%
\StrLen{\myarg}[\arglen]%
\StrLeft{\myarg}{\arglen}[\newarg]%
\noexploregroups%
\StrSubstitute{\inserttheoremaddition}{\myarg}{{ (\newarg)}}%
}%
{ (\inserttheoremaddition)}\fi%
\inserttheorempunctuation%
}%
}
\makeatother
\newtheorem*{thm*}{Theorem}
\begin{document}
\begin{frame}
\begin{thm*}[\only<beamer:2->{additional information}]
My Theorem
\end{thm*}
\begin{thm*}[Header]
My Theorem
\end{thm*}
\end{frame}
\end{document}
结果: