在电气工程中,当谈到布尔代数时,通常用上划线表示否定 (¬ P),用并列表示逻辑与 (P ∧ Q)。在 LaTeX 中,我使用\overline
数学模式下的命令来表示否定。
一切正常,直到我注意到相邻符号上的线条被合并了。在 HTML 中,这就像 ¬ (P ∧ Q) 变成了 ¬ P ∧ ¬ Q,这完全不同。
作为示例,考虑这个 LaTeX 源:
\documentclass[varwidth]{standalone}
\begin{document}
$\overline P \overline Q$
$\overline{P Q}$
$\overline P \ \overline Q$
\end{document}
它产生以下输出:
$\overline P \overline Q$
看起来应该与不同$\overline{P Q}$
;前者应该有两条单独的上线,而后者应该有一条横跨 P 和 Q 的上线。
我可以用 接近我想要的效果$\overline P \ \overline Q$
,但这有两个问题。首先,它在 P 和 Q 之间引入了额外的空间,否则这些空间不会存在。其次,它需要手动明确地确定应该如何将内容放置在页面上,这很困难,容易出错,并且(据我所知)违背了 TeX 的理念,因为我应该担心语义,而 TeX 负责处理布局。
请注意,我不能使用\bar
,因为我经常需要一条上划线来跨越两个符号(甚至是跨越更复杂的句子)。
我猜我的问题的答案是我滥用了\overline
,而我应该使用 amsmath 甚至 LaTeX 本身中已经定义的其他数学模式命令。无论如何,我都在避免使用复杂的宏等,因为我非常怀疑它们在这里是否是正确的选择(或者如果是,那么已经有一个包了)。
最后,我要指出的是,以前也曾有人问过类似的问题,但我还没有找到令人满意的答案。特别是这个问题和我的答案几乎一模一样,但那里的答案也存在问题。我在下面的答案中描述了该解决方案以及其他几个解决方案。
答案1
您可以使用\widebar
而mathabx
无需更改所有符号字体。
导入口音的代码取自(简化版)Leo Liu 的回答。我添加了一个新的宏来解决amsmath
无法处理嵌套重音的问题,其中内部对象有两个重音项。可选参数\cwidebar
用于微调定位。
\documentclass{article}
\usepackage{amsmath}
\DeclareFontFamily{U}{mathx}{\hyphenchar\font45}
\DeclareFontShape{U}{mathx}{m}{n}{ <-> mathx10 }{}
\DeclareSymbolFont{mathx}{U}{mathx}{m}{n}
\DeclareFontSubstitution{U}{mathx}{m}{n}
\DeclareMathAccent{\widebar}{\mathalpha}{mathx}{"73}
\makeatletter
\newcommand{\cwidebar}[2][0]{{\mathpalette\@cwidebar{{#1}{#2}}}}
\newcommand{\@cwidebar}[2]{\@cwideb@r{#1}#2}
\newcommand{\@cwideb@r}[3]{%
\sbox\z@{$\m@th#1\mkern-#2mu#3\mkern#2mu$}%
\widebar{\box\z@}%
}
\makeatother
\begin{document}
$\bar{P}\bar{Q}$
$\widebar{P}\widebar{Q}$
$\widebar{PP}\widebar{QQ}$
$\cwidebar[1]{\widebar{P}\widebar{Q}} \widebar{\widebar{R}}$
\end{document}
答案2
我找到了三种解决方案,但都不令人满意。它们都是以宏的形式实现的。据我所知,没有一个被维护或打包。
埃格雷格的\average
鉴于这个答案
正如问题评论中指出的那样,egreg 的\average
命令可用于解决此问题。它做两件事。首先,如果上划线在下标上,它会修剪上划线的右边缘。其次,它提供了一个参数来手动修剪上划线的左边缘。
优点
如果您有下标,此解决方案尤其有效。这是唯一一种在有下标时修剪上划线右边缘的解决方案;其他解决方案产生的上划线会像普通的一样延伸到下标的右侧\overline
,有些人会说这太长了。
缺点
所谓的“复杂参数”需要额外的花括号。例如,
\average{{\mathrm P}}
编译但\average{\mathrm P}
不执行。
虽然用下标对上划线进行右修剪似乎效果很好,但这个问题是关于修剪上划线以将它们分开。在 的情况下
\average
,这将通过参数来完成,使其成为一个手动且繁琐的过程。修剪上划线的量取决于字体及其倾斜度。此外,这只会修剪左边缘,因此无法处理直立的文本;\average[2.5]{{\mathrm P}} \average[2.5]{{\mathrm Q}}
显然是不平衡的。
恩里科·格雷戈里奥的\closure
在电子邮件中提供 这里
该解决方案看起来与 egreg 的解决方案非常相似,但有以下区别。
优点
与 egreg 不同,该解决方案不需要为“复杂参数”添加额外的括号。
缺点
与 egreg 不同,此解决方案不会右修剪下标的上划线。
它以与 egreg 的解决方案相同的方式处理左修剪,只是参数默认为 3 而不是 0。这带来所有相同的问题(完全手动,对直立字符无用)。
亨德里克·沃格特\widebar
鉴于这个答案
优点
上划线的放置非常智能。在我看来,在几乎所有不涉及嵌套的情况下,它似乎都做了正确的事情。
缺点
当涉及嵌套时,它会错误地组合“外部”上划线。例如,$\widebar{\widebar P \widebar Q} \widebar{\widebar R}$
看起来它有一个横跨整个东西的单条。当然,在这种情况下,这几乎违背了要点。
与 egreg 的解决方案不同,这也不会用下标修剪上划线的右边缘。
mathabx 包的\widebar
这显然是 Vogt 的灵感来源\widebar
。它似乎同样出色,只是没有相同的嵌套问题。不过,我认为 mathabx 与 amsmath 不兼容。
目前,我可能会使用 Gregorio 的\closure
。
如果有人能提供更多信息或更好的解决方案,请告诉我们。我觉得这个答案令人失望,我很乐意接受另一个答案。
答案3
为了您的目的,我建议\,
在字符之间进行尝试。
例如,$\overline{P}\,\overline{Q}$
。
这样会在字符之间创建一个小的、不间断的空格,足以分隔上划线。它确实会在字符之间创建一个非常小的空格,但不会太大以至于看起来不自然。
我尝试了\widebar
上述方法,发现这种方法不可取,原因有二:首先,它们没有覆盖整个字母,其次,放大时条形仍然非常小。