获取当前框的高度

获取当前框的高度

我很好奇如何\vrule确定当前盒子的高度?

\documentclass{article}
\usepackage{amsmath}

\[
\Big(
    ~
    \vrule width.7pt
    ~
\Big)
\]

在此处输入图片描述

该图像是通过使用\Bigg\Big\big分隔符进行编译后将不同的图像拼接在一起而创建的。

我怎样才能保留当前框的高度作为满足我需要的尺寸?

为了简单起见,让我们考虑以下内容:使用\rule[]{}{}以高度为强制参数的命令制定相同的规则。我希望它产生与\vrule width.7pt通过设置包含当前框尺寸的某种参数相同的规则

\rule[<current depth>]{.7pt}{<current height>}

tikz但实际需要的是利用当前框的高度绘制一条曲线。

在此处输入图片描述

这个是仅凭目测创建的

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}

\[
\Big(
    \,
    \tikz[overlay]\draw (0,-9pt) to[in=10] (5pt, 16.5pt);
    \hspace{2ex}
\Big)
\]

笔记:

主要要求是避免事先用框保存一大段代码。目标是使其像内联一样\vrule

答案1

它内置于 TeX 中。该命令\vrule是一个原语,它接受通过关键字指定的尺寸

\vrule width <len> height <len> depth <len>

关键字可以以任何顺序出现,甚至可以出现多次,最后指定的顺序优先。

该命令\vrule还有另一个属性:它是一个水平命令,这意味着一旦 TeX 扫描它,如果它处于垂直模式,它就会切换到水平模式(形成一个段落);在数学模式下使用时它不会切换,而只是排版规则。

在任何一种情况下(水平或数学模式),最终\vrule都会出现在水平框内(可能是段落的一行),这对于回答您的问题很重要。如果\vrule未指定尺寸,则会应用一些默认值:

  • 默认width值为0.4pt
  • 默认值height是封闭的高度\hbox
  • 默认值depth是封闭的深度\hbox

这就解释了为什么

$\Bigl(\vrule\Bigr)$

将排版一条 0.4pt 宽(如果您愿意,也可以是粗体)的规则,其高度和深度(在基线上方和下方)与公式相同,在本例中为括号。使用以下方法可以获得相同的尺寸

$\Big|\vrule$

这些默认值不可用,因为它们是在排版时确定的,此时用户已经失去了对该过程的任何控制。

对于您的问题,您可以测量一个盒子:

\sbox0{Some text you want to measure height and depth of}

将提供高度为\ht0,深度为\dp0

您还可以分配自己的盒子寄存器(如果不是偶尔使用会更好):在序言中您声明

\newsavebox{\mybox}

(或任何你认为合适的未使用的名称)并在完成后

\sbox\mybox{Some text you want to measure height and depth of}

您可以在任何需要长度的上下文中使用\ht\myboxand \dp\mybox,例如\dimexpr

答案2

埃格尔给了出色的解释关于\vrule;我不会试图重复这一努力。

使用此处展示的技术,可以获得您感兴趣的公式部分的深度、高度以及总高度,而无需任何额外的装箱,但这需要两次编译运行。我建议使用蒂克兹马克Z 库。(实际上,我不知道这个库是如何实现的;也许有这种方法需要一些拳击,但如果是这样,它就是完全自动化的。

但请注意, 是数学列表中的\tikzmarknode一项\mathchoice;因此,与周围数学项的间距可能会受到影响。但是,您可以将其包裹在里面\mathopen{...},然后将其放在后面\mathclose{},以便根据节点内容调整间距行为。

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc, tikzmark}

\begin{document}

\[
  \tikzmarknode{paren}{\Bigl( \mkern 18mu \Bigr)}
  %
  \begin{tikzpicture}[remember picture, overlay]
    \fill[red] (paren.north) circle[radius=1pt];
    \fill[blue] (paren.south) circle[radius=1pt];

    \draw (paren.south) to[in=10] (paren.north);

    \path let \p{north} = (paren.north),
              \p{base} = (paren.base),
              \p{south} = (paren.south),
              \n{totalheight} = {\y{north} - \y{south}},
              \n{depth} = {\y{base} - \y{south}} in
      \pgfextra{%
        \xdef\parenTotalHeight{\n{totalheight}}%
        \xdef\parenDepth{\n{depth}}%
      };
  \end{tikzpicture}
  %
  \typeout{The total height of the parenthesis is \parenTotalHeight.}% 18.40015pt
  \typeout{The depth of the parenthesis is \parenDepth.}             % 6.70009pt
  %
  \textcolor{green}{%
    \raisebox{-\parenDepth}{%
      \rule{0.4pt}{\parenTotalHeight}%
    }%
  }
\]

\end{document}

在此处输入图片描述

注意:由于坐标是从 .aux 文件中读取的,因此完全可以在括号前绘制绿色规则 - 甚至可以在括号后立即使用坐标\begin{document}

相关内容