在 中beamer
,我希望能够~
在命令序列的名称中使用波浪符号。我尝试调整 catcodes。虽然这在标准article
类中成功了,但在 中失败了beamer
:
工作article
示例:
\documentclass{article}
\begin{document}
\section{cs with tilde}
\catcode`\~=12%
\expandafter\def\csname cswith~\endcsname{foo}
cs value:\csname cswith~\endcsname.
\catcode`\~=13%
\end{document}
Beamer 示例产生Missing \endcsname inserted
错误:
\documentclass{beamer}
\begin{document}
\begin{frame}{cs with tilde}
\catcode`\~=12%
\expandafter\def\csname cswith~\endcsname{foo}
cs value:\csname cswith~\endcsname.
\catcode`\~=13%
\end{frame}
\end{document}
我究竟做错了什么?
答案1
正如 Hendik Vogt 在问题评论中提到的(引用我的话),这不起作用,因为beamer
实际上将内容读取为宏参数,因此 catcode 更改来得太晚了。
Ulrike Fischer 已经提到了一种解决此问题的方法:使用选项[fragile]
以允许 catcode 更改的方式beamer
处理内容。frame
您还可以在 catcode 更改生效时将框架外所需的所有代码定义为宏,然后在框架内简单地使用该宏。catcode 在以下情况下很重要:~
:读不是在执行/处理时。
不过,我会很简单地解决这个问题:改为使用字符串\string~
来获取:~
\documentclass{beamer}
\begin{document}
\begin{frame}{cs with tilde}
\expandafter\def\csname cswith\string~\endcsname{foo}%
cs value:\csname cswith\string~\endcsname.
\end{frame}
\end{document}
请注意,如果您加载了该包,\csdef{cswith\string~}{foo}
那么您也可以使用。\csuse{cswidth\string~}
etoolbox
或者更简单:~
在本地重新定义以生成\string~
。然后,如果您更频繁地需要它,则必须输入更少的内容。但是,~
框架内或宏使用的任何常量将不再像往常一样工作。
\documentclass{beamer}
\begin{document}
\begin{frame}{cs with tilde}
\def~{\string~}%
\expandafter\def\csname cswith~\endcsname{foo}%
cs value:\csname cswith~\endcsname.
\end{frame}
\end{document}