数学模式下某些字母的管道(绝对值)太长/太短

数学模式下某些字母的管道(绝对值)太长/太短

在问题中绝对值符号我读过有关写绝对值的最佳方法的文章。我发现公认的答案非常好,而且它几乎适用于所有情况。遗憾的是,它只适用于几乎所有情况。例如,在字母“k”上,管道在 PDF 输出中绘制在字母“k”下端的下方很远的地方。为什么会这样,该怎么办?

糟糕的是:我可以不是只需跳过所有“k”向量上的宏并使用常规管道|\vec{k}|或带星号的运算符版本,abs*因为正如您将从最小示例中的最后两行看到的那样,“k”上的常规管道在顶部绘制得太短(不在向量箭头周围)。然而,“x”的绘制方式与读者预期的一致。

以下是显示问题的最小示例(字母“x”工作正常,字母“k”有大/小管道)。在我的实际文档中,我还fontenc加载了 T1 和字体包(libertinefourierncinconsolata),因此此行为似乎与所有字体/数学相关的包无关。

\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}

微调结果

相关内容