Непоследовательный интервал между \точками и … с amsmath

Непоследовательный интервал между \точками и … с amsmath
\documentclass{article}
\usepackage[utf8]{inputenc}
\DeclareUnicodeCharacter{2026}{\dots}% …
\usepackage{amsmath}
\begin{document}

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

\end{document}

Интервал вокруг многоточия не одинаков для \dotsи в документе выше (третий случай — если я уберу \DeclareUnicodeCharacter{2026}{\dots}):

Многоточие юникода имеет меньше места справа с \DeclareUnicodeCharacter. Оно не имеет места слева (но правильный интервал справа, я думаю) без \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использует \futurelet(а не, скажем \@ifnextchar, ), поэтому он не пропускает пробелы при поиске следующего токена. Обычно это не имеет значения, \dotsпоскольку пробелы после имени команды игнорируются, но не после ... (что является проблемой, которая \IeCрешает эту проблему, чтобы убедиться, что входные символы enc не имеют определений, заканчивающихся токеном, который заставляет игнорировать пробелы при записи во внешний файл, такой как таблица содержания.

Итак, здесь я определяю ..., чтобы взять аргумент и вернуть его, что является (более или менее безопасным) способом принудительного игнорирования пробела после символа, так что тесты не \dotsвидят \}пробела. Единственная небезопасная часть в этом заключается в том, что это {…}приведет к ошибке разбора, поскольку анализатор аргумента достигнет конца группы при поиске #1.

Связанный контент