%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9%20%D1%84%D0%BE%D1%80%D0%BC%D1%83%D0%BB%D1%8B.png)
Есть ли способ создать исчезающий пробел в начале или конце математической формулы?
Идея:Для случая формулы-final что-то, что смотрит вперед или принимает обязательный аргумент, может быть началом. Я помню, что команды, обязательные аргументы которых заканчиваются концом математической формулы, будут получать пустые аргументы.
Некоторые практические примеры:
Пример 1
Квантификатор уникальности («существует ровно один») часто записывается как «∃!».
Из соображений визуального эффекта я бы хотел, чтобы следующая переменная была немного дальше от восклицательного знака, чтобы было понятнее, что "∃!" считается одним токеном (здесь "токен" в смысле разбора на языке программирования). Я могу определить что-то вроде \newcommand*{\existsunique}{\exists!\mskip1.5mu\relax}
, но пространство 1.5mu
останется, если символ используется сам по себе:
\documentclass{article}
\usepackage{amsmath} % better spacing behavior for \colon
\usepackage{dsfont}
\newcommand*{\existsunique}{\exists!\mskip1.5mu\relax}
\begin{document}
% spacing (1.5mu) as desired
\(\forall x \in \mathds{R}^{+}_{0} \colon
\existsunique y \in \mathds{R}^{+}_{0} \colon
y^2 = x\)
% spacing (0mu) too tight
\(\forall x \in \mathds{R}^{+}_{0} \colon
\exists! y \in \mathds{R}^{+}_{0} \colon
y^2 = x\)
% spacing (1.5mu) superfluous
The quantifier \(\existsunique\) means ``there is exactly one''.
% spacing (0mu) as desired
The quantifier \(\exists!\) means ``there is exactly one''.
\end{document}
Здесь первые строки каждой пары имеют дополнительный интервал 1.5mu
после квантификатора уникальности "∃!", а вторые строки каждой пары — нет. Для первой пары добавленный интервал соответствует желаемому; для второй пары он выглядит не очень.
В этом примере я хотел бы, чтобы 1.5mu
пробел исчезал в конце формулы: тот же макрос должен создавать строки 1 и 4 выше. Возможно, есть другой подход к "∃!", но это служит одним практическим примером для моего общего вопроса выше.
Пример 2
Для стрел средней длины Хайко Обердика
\Implies
(между\Rightarrow
и\implies
по длине)\Impliedby
(между\Leftarrow
и\impliedby
по длине)\Iff
(между\Leftrightarrow
и\iff
по длине)
определено здесьжелательно контекстное удаление пробелов с обеих сторон.
решение1
Этот пересмотренный ответ вырос из ответа egreg наВ чем разница между \mathop, \operatorname и \DeclareMathOperator?, где он упомянул эту конструкцию:\newcommand{\diff}{\mathop{}\!d}
В вопросе автора выше Вернер и egreg предложили использовать \mathbin
и \mathop
, но автор ответил: «Я также рассматривал \mathop
, но мне бы хотелось более узкий интервал».
Итак, следуя аналогичному подходу \diff
, я придумал следующее:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{dsfont}
\usepackage[usestackEOL]{stackengine}
\def\stackalignment{l}
\def\showall{~\fbox{\Longstack{
\text{\detokenize\expandafter{\existsunique}}\\
A \colon \existsunique y \\
\fboxsep0pt\fbox{$\existsunique$}\\
A \colon {\existsunique} y
}~}\par}
\begin{document}
\savestack{\Header}{\Longstack{Definition:\\within math:\\boxed:\\brace-isolated:}}
\stackMath
\Header\def\existsunique{\exists!}\showall
\Header\def\existsunique{\exists!\mathop{}\!}\showall
\Header\def\existsunique{\mathop{}\!\exists!\mathop{}\!}\showall
\end{document}
Хотя фактические \!
керны могут отличаться от вкусов автора, возможно, подход можно адаптировать к кернам по его выбору.
ОРИГИНАЛЬНЫЙ ПОДХОД:
Это решение может (или не может) дать вам что-то, что работает для вашего приложения. Я представляю макрос \mymathop{op-name}{op-definition}{pre-kern}{post-kern}
.
Что он делает, так это смотрит, какой токен следует за новым "mymathop", в вашем случае, \existsunique
. Если то, что следует, является $
, \)
, или \egroup
, он выводит "op definition" отдельно; в противном случае он добавляет пре- и пост-керн о "op-definition" (в качестве примечания, использование \@ifnextchar
поглотит любые промежуточные пробелы между "mymathop" и следующим токеном).
Уловка \egroup
позволяет принудительно \mymathop
подавлять пре-/пост- \kern
даже в середине формулы, заключая ее в фигурные скобки.
Ниже MWE показывает его в формуле, заключенной в fbox с двумя стилями разделителей, а затем внутри формулы, изолированной с собственным набором фигурных скобок.
\documentclass{article}
\usepackage{amsmath}
\usepackage{dsfont}
\makeatletter
\def\mymathop#1#2#3#4{%
\def#1{\@ifnextchar${#2}{\@ifnextchar\){#2}{\@ifnextchar\egroup{#2}{\kern#3#2\kern#4}}}}
}
\makeatother
\mymathop{\existsunique}{\exists!}{0pt}{3pt}
\begin{document}
\(\forall x \in \mathds{R}^{+}_{0} \colon
\existsunique y \in \mathds{R}^{+}_{0} \colon
y^2 = x\)
\fboxsep0pt\fbox{$\existsunique $} \fbox{\(\existsunique \)}
\(\forall x \in \mathds{R}^{+}_{0} \colon
{\existsunique} y \in \mathds{R}^{+}_{0} \colon
y^2 = x\)
\end{document}
решение2
Я думаю
\newcommand*{\existsunique}{\thinmuskip=1.5mu\mathop{\exists!}\relax}
делает то, что вы хотите.
Я думаю, что лучшее решение — это
\makeatletter
\newcommand*{\existsuniquenew}{\@ifnextchar{\)}{\@end}{%
\@ifnextchar{$}{\@end}{\not@end}}}
\def\@end{\exists!\relax}%
\def\not@end{\exists!\mskip1.5mu\relax}
\makeatother