在 Beamer 中的 csname 中使用波浪符号 `~`

在 Beamer 中的 csname 中使用波浪符号 `~`

在 中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}

相关内容