amsmath で \dots と … の間隔が一定でない

amsmath で \dots と … の間隔が一定でない
\documentclass{article}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{2026}{\dots}% …
\usepackage{amsmath}
\begin{document}

\[\left\{a \dots \right\}\]
\[\left\{a … \right\}\]

\end{document}

上記の文書では、省略記号の周囲の間隔が と で同じではありません (3 番目のケースは を削除した場合\dotsです) 。\DeclareUnicodeCharacter{2026}{\dots}

\DeclareUnicodeCharacter を使用すると、Unicode 省略記号の右側のスペースが少なくなります。\DeclareUnicodeCharacter を使用しないと、左側のスペースがなくなります (ただし、右側のスペースは適切だと思います)。

\dotsとで同じ間隔を取得するにはどうすればよいですか? うまくいけば、数式自体を変更せずにコードのみを変更してこれを行うことができます\DeclareUnicodeCharacter。そうしないと、ほとんどの場合、ハックを忘れてしまい、数式が簡潔でなくなる可能性があります。

を使用していない場合、問題は発生しませんamsmath

答え1

ここに画像の説明を入力してください

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

%\DeclareUnicodeCharacter{2026}{\dots}% …
% \u8:… ->\IeC {\dots }
\expandafter\def\csname u8:\detokenize{…}\endcsname#1{\dots#1}


\begin{document}


$\left\{a \dots \right\}$\vline

$\left\{a … \right\}$\vline

\end{document}

\dots次のトークンを先に見て、低いドットを使用するか中央のドットを使用するかを判断します。 \DeclareUnicodeCharacterその定義を でラップします。\IeC{...}ここで\IeC(ここでは) は、引数を使用するだけのマクロです。

しかし、主な問題は、 が(ではなく)\dotsを使用して、次のトークンを探している間に空白をスキップしないことです。これは通常、コマンド名の後の空白は無視されますが、... の後では無視されないため、問題にはなりません (これは、目次などの外部ファイルに書き込まれる場合に空白を無視するように強制するトークンで終わる定義が入力 enc 文字に含まれないようにするために対処される問題です)。\futurelet\@ifnextchar\dots\IeC

そこで、ここでは引数を取ってそれを返す ... を定義します。これは、文字の後のスペースを無視するように強制する (多かれ少なかれ安全な) 方法であり、\dotsテストではスペースが検出されません。これに関する唯一の安全でない部分は、引数パーサーが を探している間にグループの最後に達してしまうため、解析エラーが発生すること\}です。{…}#1

関連情報