为什么 \@ifnextchar 在 unicodechar 定义中不能正常工作?

为什么 \@ifnextchar 在 unicodechar 定义中不能正常工作?

考虑以下代码:

\documentclass{article}

\usepackage{amsmath}
\usepackage{newunicodechar}

\makeatletter
    \newunicodechar{∑}{\@ifnextchar_{\sum}{\@ifnextchar^{\sum}{\Sigma}}}
\makeatother

\begin{document}

    Incorrect ({\bf why?}):
    \[
        ∑_1^{100} \qquad
        ∑_{100}^1 \qquad
    \]

    Correct: 
    \makeatletter
    \[
        \@ifnextchar_{\sum}{\@ifnextchar^{\sum}{\Sigma}}_1^{100} \qquad
        \@ifnextchar_{\sum}{\@ifnextchar^{\sum}{\Sigma}}^{100}_1 \qquad
        \@ifnextchar_{\sum}{\@ifnextchar^{\sum}{\Sigma}}
    \]
    \makeatother

\end{document}

输出:

在此处输入图片描述 当我使用unicode符号“∑”时,输出符号是不可见的,但是,当我明确写出unicode符号“∑”的定义代码时,输​​出是正确的。

为什么?有解决办法吗?

答案1

newunicodechar需要加载的包

\usepackage[utf8]{inputenc}

(也是inputenx允许的)。出于各种原因,默认情况下不会加载它。确实

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{newunicodechar}

\makeatletter
\newunicodechar{∑}{\@ifnextchar_{\sum}{\@ifnextchar^{\sum}{\Sigma}}}
\makeatother

\begin{document}
\[
∑_1^{100} \qquad
∑^{100}_1 \qquad
\]

\end{document}

将按预期工作。

如果您还加载,breqn则必须注意它会更改_和的类别代码^,但仅限于文档开头。因此该定义不起作用,因为宏分别查找类别代码为 8 和 7 的_^,但找不到它们。

解决这一问题需要一些技巧。下面是其中之一:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{newunicodechar}
\usepackage{breqn}

\makeatletter
\begingroup\lccode`?=`_ \lccode`!=`^
\def\x{\newunicodechar{∑}}
\lowercase{\expandafter\endgroup
   \x{\@ifnextchar?{\sum}{\@ifnextchar!{\sum}{\Sigma}}}}
\makeatother

\begin{document}
\[
∑_1^{100} \qquad
∑^{100}_1 \qquad
\]

\end{document}

在此处输入图片描述

但这是错误的。如果您想要大写的 sigma,则输入 U+03A3 希腊大写字母 SIGMA,而不是 U+2211 N-ARY SUMMATION。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{newunicodechar}
\usepackage{breqn}

\newunicodechar{∑}{\sum}
\newunicodechar{Σ}{\ensuremath{\Sigma}}

\begin{document}
\[
∑_1^{100} \qquad
∑^{100}_1 \qquad
Σ
\]

\end{document}

相关内容