使用重叠 \lnot 的 Unicode U+2AEC(双笔画非符号)的最干净实现?

使用重叠 \lnot 的 Unicode U+2AEC(双笔画非符号)的最干净实现?

我使用 Unicode 字符“双笔划非符号”(U+2AEC) 来表示按位逻辑非运算(又称一的补码)。我已经实现了一个名为 的控制序列\blnot来实现这一点,但我的解决方案感觉很笨拙,我怀疑一定有一个更简洁的最佳实践解决方案。以下是我的输出分别使用$-$\lnot\blnot

不完整样本

我的问题分为两部分:

  1. \lnot堆叠两个运算符(如上所示)的最简洁方法是什么?我制作了一个\hbox并用于\raisebox调整每个实例的基数,但我不喜欢\kern-.666666em在第一个实例之后向后退 2/3 em 的方式。我觉得应该有一种方法可以干净地返回确切的宽度而\lnot无需知道它,或者更好的是,在两者之间根本不前进。

  2. 我还想在 和 之后插入大约 .11em \lnot\blnot因为否则看起来太紧了。(我将\blnot主要使用斜体多字符标识符。)我通过说 添加了空格\kern.11em,但对我来说这又感觉很笨拙。理想情况下,我想直接指定 的宽度$-$并直接使用它,而不对任何宽度进行硬编码。

以下是 MWE:

\documentclass{article}

\newcommand{\blnot}{
  \mathord{%
    \hbox{%
      \raisebox{.19ex}{$\lnot$}\kern-.666666em%
      \raisebox{-.21ex}{$\lnot$}%
    }%
  }%
}

\begin{document}
$-a$                  \vskip -1ex
$\lnot\kern.11em a$   \vskip -1ex
$\blnot\kern.11em a$  \par
\end{document}

ps 我知道我可以使用 TikZ 轻松实现这一点,但堆叠两个\lnots 似乎更容易在多种字体大小下工作。(除了 10pt 之外,我可能不会在任何尺寸下使用它,但我可能会在脚注或标题中使用它。)

答案1

这是一份工作\ooalign

\newcommand{\blnot}{\mathord{\ooalign{%
  \relax\cr
  \noalign{\vskip-.2ex}
  $\lnot$\cr
  \noalign{\vskip.4ex}
  $\lnot$\cr
  \noalign{\vskip-.2ex}}%
  }}

这是一个完整的例子,展示\fbox了对边界框的影响;第一个是\lnot,第二个是我提出的定义,第三个来自 Todd Lehman 的自我回答。

\documentclass{article}

\newcommand{\blnot}{\mathord{\ooalign{%
  \relax\cr
  \noalign{\vskip-.2ex}
  $\lnot$\cr
  \noalign{\vskip.4ex}
  $\lnot$\cr
  \noalign{\vskip-.2ex}}%
  }}

\newcommand{\TLblnot}{
  \mathord{%
    \hbox{%
      \raisebox{.18ex}{\rlap{$\lnot$}}%
      \raisebox{-.22ex}{\rlap{$\lnot$}}%
      \hphantom{$-$}%
    }%
  }%
}\begin{document}
\fbox{$\lnot a$}\fbox{$\blnot a$}\fbox{$\TLblnot a$}
\end{document}

在此处输入图片描述

对于大小变化的符号,你可以做更复杂的

\newcommand{\blnot}{\mathord{\mathpalette\xblnot\relax}}

\newcommand{\xblnot}[2]{
  \sbox2{$#1\lnot$}\vrule height 1.1\ht2 width0pt \ooalign{%
  \relax\cr
  \noalign{\vskip-.2\ht2}
  $#1\lnot$\cr
  \noalign{\vskip.4\ht2}
  $#1\lnot$\cr
  \noalign{\vskip-.2\ht2}}%
  }

结果如下

\fbox{$\lnot$}\fbox{$\blnot$}\fbox{$\blnot_{\blnot_{\blnot}}$}

在此处输入图片描述

让符号的边界框像减号一样宽也很简单:

\newcommand{\blnot}{\mathord{\mathpalette\xblnot\relax}}

\newcommand{\xblnot}[2]{
  \sbox2{$#1\lnot$}\vrule height 1.1\ht2 width0pt \ooalign{%
  \hphantom{$#1-$}\relax\cr
  \noalign{\vskip-.2\ht2}
  \hfil$#1\lnot$\hfil\cr
  \noalign{\vskip.4\ht2}
  \hfil$#1\lnot$\hfil\cr
  \noalign{\vskip-.2\ht2}}%
  }

\ooalign可以找到一些信息在我的这个回答中

答案2

(在这里回答我自己的问题。)我最终自己解决了这个问题,之后米凯尔·韦德莫-约翰逊建议我使用\llap\rlap。以下是我所做的。我对这个解决方案非常满意:

\newcommand{\blnot}{
  \mathord{%
    \hbox{%
      \raisebox{.18ex}{\rlap{$\lnot$}}%
      \raisebox{-.22ex}{\rlap{$\lnot$}}%
      \hphantom{$-$}%
    }%
  }%
}

但更进一步,我根据一个\stacktwo带有五个参数的命令(因为缺乏更好的名称)来定义它......

  1. 第一个字符(例如\lnot
  2. 升高第一个字符的距离(例如.18ex
  3. 第二个字符(例如\lnot
  4. 升高第二个字符的距离(例如-.22ex
  5. 幻像字符定义复合字符序列的宽度(例如,$-$)

...就像这样:

\newcommand{\stacktwo}[5]{%
  \mathord{%
    \hbox{%
      \raisebox{#2}{\rlap{#1}}%
      \raisebox{#4}{\rlap{#3}}%
      \hphantom{#5}%
    }
  }
}

最终的定义非常简单:

\newcommand{\xblnot}{\stacktwo{$\lnot$}{.18ex}{$\lnot$}{-.22ex}{$-$}}

\normalsize这正是我对、\footnotesize\scriptsize和的所有要求\tiny,而且我可以重复使用\stacktwo其他复合字符,如 Unicode 字符 U+2A59(“逻辑或重叠逻辑与”)。

这里的一个小缺陷是两个字符的宽度必须完全相同,因为我还没有弄清楚如何垂直对齐两个不同宽度的堆叠项目,但这个解决方案对于我需要的字符来说很好用。

答案3

本论坛主题: https://groups.google.com/group/comp.text.tex/browse_thread/thread/8ed2ea2326858f8f?pli=1 提供了有关如何实现负\phantom命令的几点建议,该命令允许您以符号的宽度精确地向后移动。

特别地,该线程指出了 LaTeX 命令\llap\rlap,它们都允许通过重叠字形和合理对齐来构造复杂形状。给出的示例是通过命令/\llap{=}或构造 ≠ \rlap{=}/

因此,对于您的情况,它似乎\rlap{\raisebox{-0.21em}{\lnot}}\raisebox{0.19em}{\lnot}可能有效。

相关内容