\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}
\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