在问题中绝对值符号我读过有关写绝对值的最佳方法的文章。我发现公认的答案非常好,而且它几乎适用于所有情况。遗憾的是,它只适用于几乎所有情况。例如,在字母“k”上,管道在 PDF 输出中绘制在字母“k”下端的下方很远的地方。为什么会这样,该怎么办?
糟糕的是:我可以不是只需跳过所有“k”向量上的宏并使用常规管道|\vec{k}|
或带星号的运算符版本,abs*
因为正如您将从最小示例中的最后两行看到的那样,“k”上的常规管道在顶部绘制得太短(不在向量箭头周围)。然而,“x”的绘制方式与读者预期的一致。
以下是显示问题的最小示例(字母“x”工作正常,字母“k”有大/小管道)。在我的实际文档中,我还fontenc
加载了 T1 和字体包(libertine
、fouriernc
和inconsolata
),因此此行为似乎与所有字体/数学相关的包无关。
\documentclass{article}
\usepackage{mathtools}
%define abs
\DeclarePairedDelimiter\abs{\lvert}{\rvert}%
%switch starred and non-starred (auto-size)
\makeatletter
\let\oldabs\abs
\def\abs{\@ifstar{\oldabs}{\oldabs*}}
\makeatother
\begin{document}
\[ \abs{\vec{x}} \]
\[ \abs{\vec{k}} \]
\[ |\vec{x}| \]
\[ |\vec{k}| \]
\end{document}
输出:
我知道这个nath
软件包,但它总是给我很多错误,而且似乎无人维护。另外,如果自动完成的文档内容无法“查看内部内容”(不投入大量时间研究软件包代码nath
),我总会觉得有点“奇怪”。所以,我宁愿不使用它。
答案1
我能够使用 scalerel 包来希望给你你想要的(scalerel今天刚刚发送到CTAN,所以在它传播之前,你可以在如何水平合并两个符号?)。
使用该软件包的功能,我的第一个方法是创建一个命令 \myabs,它将在任何东西周围放置 abs 条。它将条的大小精确拉伸到参数。第一次尝试的缺点是,您可能希望条在被包围的物体上方和下方延伸一点(本答案后面会提到)。以下是第一种方法的代码:
\documentclass{article}
\usepackage{scalerel}
\usepackage{mathtools}
\begin{document}
% [METHOD USED IN ORIGINAL QUESTION CODE HERE, REMOVED FROM THIS LISTING]
\newcommand\myabs[1]{%
\setbox1\hbox{$#1$}%
\stretchrel{\lvert}{\usebox1}\stretchrel*{\lvert}{\usebox1}%
}
\[ \myabs{\vec{k}}~~\myabs{\vec{x}}~~\myabs{\vec{A}}~~\myabs{\vec{q}} \]
\end{document}
这是与原始版本相比的输出
然而,为了满足 ralfix 的要求,将垂直线稍微延伸到周围物体的上方和下方,我只使用了 verbatimbox 包中的 \addvbuffer 例程,将顶部和底部附加部分设置为 2pt:
\documentclass{article}
\usepackage{scalerel}
\usepackage{mathtools}
\usepackage{verbatimbox}
\setlength\boxtopsep{2pt}
\setlength\boxbottomsep{2pt}
\newcommand\myabs[1]{%
\setbox1\hbox{$#1$}%
\setbox2\hbox{\addvbuffer{\usebox1}}%
\stretchrel{\lvert}{\usebox2}\stretchrel*{\lvert}{\usebox2}%
}
\begin{document}
\[ \myabs{\vec{k}}~~\myabs{\vec{x}}~~\myabs{\vec{A}}~~\myabs{\vec{q}} \]
\end{document}
但是 egreg 评论说 abs 栏的高度不应该随着参数而改变。如果这是 abs 的首选体现,那么 scalerel 也可以解决这个问题:
\documentclass{article}
\usepackage{scalerel}
\def\lvert{|}
\begin{document}
METHOD 2: FIXED EXTENT
\newsavebox\mybox
\savebox{\mybox}{$\stretchrel*{|}{\rule[-.6ex]{0ex}{3ex}}$}
\def\myabs#1{\usebox\mybox#1\usebox\mybox}
\[ \myabs{\vec{k}}~~\myabs{\vec{x}}~~\myabs{\vec{A}}~~\myabs{\vec{q}} \]
\end{document}
答案2
栅栏垂直居中于数学轴周围。它们对称增加,即使公式在数学轴上方的高度高于下方的高度。
下面的示例将公式移动到垂直居中以获得最小化的栅栏,然后将带有公式的栅栏移回到正确的垂直位置。
包mleftright
仅用于获取\left
和的变体,并且\right
不添加额外的水平空间。\mleft
\mright
\documentclass{article}
\usepackage{mleftright}
\makeatletter
\newcommand*{\trimabs}[1]{%
\mathpalette{\@trimleftright{|}{|}}{#1}%
}
\newcommand*{\@trimleftright}[4]{%
% #1: left fence
% #2: right fence
% #3: math style
% #4: formula
\sbox0{$#3#4\m@th$}%
\sbox2{$#3\vcenter{}$}% Math axis: \ht2
% \dimen0: min(height(formula), math axis)
\dimen0=\ht0 %
\ifdim\dimen0<\ht2 %
\dimen0=\ht2 %
\fi
% \dimen2: min(depth(formula), 0)
\dimen2=\dp0 %
\ifdim\dimen2<\z@
\dimen2=\z@
\fi
% \dimen0: vertical shift for centering
\dimen0=\dimexpr(\dimen0-\dimen2)/2 -\ht2\relax
\raisebox{\dimen0}{%
$#3\mleft#1\raisebox{-\dimen0}{\box0}\mright#2\m@th$%
}%
}
\makeatother
\begin{document}
\[
|\vec x| + |\vec k|
= \left|\vec x\right| + \left|\vec k\right|
= \trimabs{\vec x} + \trimabs{\vec k}
\]
\end{document}
微调
对于向量“x”,现在“k”的栅栏深度更小。可以通过增大公式来解决此问题。示例使用没有内容的栅栏大小:
\documentclass{article}
\usepackage{mleftright}
\makeatletter
\newcommand*{\trimabs}[1]{%
\mathpalette{\@trimleftright{|}{|}}{#1}%
}
\newcommand*{\@trimleftright}[4]{%
% #1: left fence
% #2: right fence
% #3: math style
% #4: formula
\sbox0{$#3#4\m@th$}%
\sbox2{$#3\vcenter{}$}% Math axis: \ht2
\sbox4{$#3\left#1\right#2$}%
% \dimen0: min(height(formula), math axis)
\dimen0=\ht0 %
\ifdim\dimen0<\ht2 %
\dimen0=\ht2 %
\fi
% \dimen2: min(depth(formula), 0)
\dimen2=\dp0 %
\ifdim\dimen2<\z@
\dimen2=\z@
\fi
% Make formula as least as tall as the fences without content.
\sbox4{$#3\left#1\right#2$}%
\ifdim\ht4>\dimen0 %
\dimen0=\ht4 %
\fi
\ifdim\dp4>\dimen2 %
\dimen2=\dp4 %
\fi
% \dimen0: vertical shift for centering
\dimen0=\dimexpr(\dimen0-\dimen2)/2 -\ht2\relax
\raisebox{\dimen0}{%
$#3\mleft#1\raisebox{-\dimen0}{\box0}\mright#2\m@th$%
}%
}
\makeatother
\begin{document}
\[
|\vec x| + |\vec k|
= \left|\vec x\right| + \left|\vec k\right|
= \trimabs{\vec x} + \trimabs{\vec k}
\]
\end{document}