我使用 Unicode 字符“双笔划非符号”(U+2AEC) 来表示按位逻辑非运算(又称一的补码)。我已经实现了一个名为 的控制序列\blnot
来实现这一点,但我的解决方案感觉很笨拙,我怀疑一定有一个更简洁的最佳实践解决方案。以下是我的输出分别使用$-$
、\lnot
和\blnot
:
我的问题分为两部分:
\lnot
堆叠两个运算符(如上所示)的最简洁方法是什么?我制作了一个\hbox
并用于\raisebox
调整每个实例的基数,但我不喜欢\kern-.666666em
在第一个实例之后向后退 2/3 em 的方式。我觉得应该有一种方法可以干净地返回确切的宽度而\lnot
无需知道它,或者更好的是,在两者之间根本不前进。我还想在 和 之后插入大约 .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 轻松实现这一点,但堆叠两个\lnot
s 似乎更容易在多种字体大小下工作。(除了 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
带有五个参数的命令(因为缺乏更好的名称)来定义它......
- 第一个字符(例如
\lnot
) - 升高第一个字符的距离(例如
.18ex
) - 第二个字符(例如
\lnot
) - 升高第二个字符的距离(例如
-.22ex
) - 幻像字符定义复合字符序列的宽度(例如,$-$)
...就像这样:
\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}
可能有效。