我真的很喜欢在我的乳胶代码源中使用 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}