\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}
):
Как мне получить тот же интервал с \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
.