beamer 类中定义的 \textbeta 和 \textmu

beamer 类中定义的 \textbeta 和 \textmu

我真的很喜欢在我的乳胶代码源中使用 UTF-8 希腊字母,并且我使用 utf8x 将它们转换为\textalpha命令,然后\textalpha在单独的文件中定义命令,在每个文件中为每个希腊字母写下以下内容:

\newcommand{\textalpha}{\ensuremath{\alpha}}

甚至可以负担得起使用的奢侈\varepsilon\varphi

这实际上是我发现的干扰最少且兼容性最好的方法。(实际上,一个小型 sed-parser 更加灵活和高效,因为我知道发生了什么,但这是一种非常干扰性的方法)

遗憾的是,这个 ... 不适用于 beamer,因为它似乎已经定义了\textbeta\textmu。是的,只有它们。我不知道为什么。

以下是如何重现此情况。(此操作可编译。如果取消注释任何内容,则无法编译)

\documentclass{beamer}
\usepackage[utf8x]{inputenc}
\newcommand{\textalpha}{\alpha}
%\newcommand{\textbeta}{\beta}
%\newcommand{\textmu}{\mu}
\begin{document}
  $α$
  % $β$
  % $μ$
\end{document}

有人知道为什么吗?还有,如何克服这个问题?如果我使用\renewcommand它,它在 beamer 文件中有效,但在非 beamer 文件中无效。也许有\forcerenewcommand我不知道的东西?

答案1

我不知道为什么beamer会有\textbeta。也许其他人可以给出答案。

当然有方法可以覆盖现有的宏。

例如,您可以使用\def覆盖任何现有的宏定义。\newcommand但这缺少 的语法。因此,您可以定义一个新命令来检查命令是否已存在,并根据 ckeck 调用\newcommand\renewcommand

\documentclass{beamer}
\usepackage[utf8x]{inputenc}

\makeatletter
% check if csname is defined
\newcommand*\checkfor[1]{%
  \ifx#1\AMostCertainlyUndefinedCommand
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
% define in any case
\newcommand*\forcenewcommand[1]{%
  \checkfor{#1}{\newcommand{#1}}{%
    \GenericWarning{}{Warning: redefining \string#1}{}%
    \renewcommand{#1}}}
\makeatother

\newcommand{\textalpha}{\alpha}
% this works, of course:
\def\textbeta{\beta}
% as will the new definition command:
\forcenewcommand{\textmu}{\mu}

% for demonstration purposes only:
\forcenewcommand\textbf[1]{(#1)}

\begin{document}
  $α$
  $β$
  $μ$
  \textbf{A}
\end{document}

相关内容