数学公式边缘(开头/结尾)处消失的空格

数学公式边缘(开头/结尾)处消失的空格

有没有办法让数学公式的开头或结尾处的空格消失?

主意:对于公式最终的情况,向前看或接受强制参数的东西可能是一个开始。我记得,其强制参数在数学公式末尾终止的命令将被输入空参数。

一些实际的例子:


示例 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

对于 Heiko Oberdiek 的中长箭

  • \Implies(长度之间\Rightarrow\implies
  • \Impliedby(长度之间\Leftarrow\impliedby
  • \Iff(长度之间\Leftrightarrow\iff

定义在这里,希望两边都删除上下文间距。

答案1

这个修改后的答案源于看到 egreg 的答案\mathop、\operatorname 和 \DeclareMathOperator 有什么区别?,他提到了这个结构:\newcommand{\diff}{\mathop{}\!d}

在上面的 OP 问题中,Werner 和 egreg 建议使用\mathbin\mathop,但 OP 回答说“我也考虑过\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}

在此处输入图片描述

尽管实际的\!字距可能与 OP 的喜好不同,但也许可以采用这种方法来适应他选择的字距。


原始方法:

此解决方案可能(也可能不会)为您的应用程序提供一些有用的功能。我介绍了宏\mymathop{op-name}{op-definition}{pre-kern}{post-kern}

它所做的是查看新“mymathop”后面跟着什么标记,在你的情况下是。 \existsunique如果后面跟着的是$\)\egroup,它会自行打印出“op 定义”;否则,它会添加关于“op 定义”的前后字距(顺便提一下,使用\@ifnextchar会吞掉“mymathop”和下一个标记之间的任何中间空格)。

catch\egroup允许人们强制\mymathop抑制\kern公式中间的前置/后置,方法是将其括在括号中

下面的 MWE 在一个公式中显示了它,它本身用两种分隔符样式组成了框,然后在公式内部用自己的一组括号隔离开来。

\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

相关内容