Join包装符号wasysym

Join包装符号wasysym

我想在 tikz 节点中对齐等号,就像这张图的第三个节点一样:

equals sign nodes

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\newlength\eqheight
\settoheight\eqheight{$=$}

\begin{document}
\begin{tikzpicture}[every node/.style={minimum height=1em,rectangle,draw}]
    \node at (0, 0) {$=$};
    \node at (1, 0) {$A=$};
    \node at (2, 0) {\raisebox{0pt}[\eqheight][0pt]{\raisebox{-1pt}{$=$}}};
\end{tikzpicture}
\end{document}

在第一个节点中,等号没有正确垂直对齐,因为它的框在底部比在顶部有更多的空间。

当添加字符“A”时,框会更高,因此等号将正确对齐。

在第三个节点中,我手动将框提升-1pt,但我不想“硬编码” -1pt

我尝试-1pt通过使用\settodepth来获取等号的深度,但它似乎是 0。有没有办法在不“硬编码”该值的情况下正确对齐它?

答案1

两个问题:

  • 文本节点应位于其基线(或数学轴线)的中心。
  • 符号上方和下方的空间相等。

第一个问题可以通过将节点锚定在基线上来解决。第二个问题比较棘手,因为 TeX 确实不是知道字形的黑色像素在哪里。它只知道名义上的字形边界框:

Glyph bounding boxes

创建者:

\documentclass{standalone}
\usepackage{color}
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.2pt}
\begin{document}
\def\x#1{%
  \textcolor{red}{%
    \fbox{%
      $\color{black}#1$%
    }%
  }%
}
$\x{=}\;\x{A}$
\end{document}

字形边界框始终包含基线。基线上方的符号在基线下方有额外的空间,基线上方的下划线符号在上方有额外的空间。

等号以数学轴为中心。这可用于计算空白:

首先,将符号移至基线。然后符号的高度是其净高度的一半。由于符号的对称性,深度与高度相同。

然后,TikZ 得到这个符号并可以绘制对称边框。

最后,需要通过将节点向上移动数学轴的量来尊重前一次的转变。

示例文件:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[
  every node/.style={
    rectangle,
    anchor=base,
    draw,
  }]
    \pgfmathsetmacro\MathAxis{height("$\vcenter{}$")}
    \node (a) at (0, \MathAxis pt) {%
      \sbox0{$=$}%
      \sbox0{\raisebox{-\MathAxis pt}{\usebox0}}% Equals sign at base line
      \dp0=\ht0 % The equals sign is symmetric
      \usebox0%
    };
    \node (b) at (1, 0) {$A=$};

    % Red line at math axis
    \draw[thin, red, yshift=\MathAxis, opacity=.5]
    (a.west |- 0, 0) -- (b.east |- 0, 0);
\end{tikzpicture}
\end{document}

Result

Join包装符号wasysym

\Join包的符号存在两个问题wasysym

  • 报告的字形边界框的高度不正确(似乎是一个错误)。
  • 这是不是垂直居中于数学轴,但位于等号的上栏。也许,字体设计师想避免符号下降到基线。

等号的字体是,包符号的cmr10.pfb字体是。两种字体的 em 大小相同,均为 1000,数学轴相同,均为 250。字形的高度为 637,中心位于 342,深度为 -47(高于基线)。这些值可以在\Joinwasysymwasy10.pfb\JoinFontForge, 例如。

那么移位的公式为:

<math axis in TeX> * <symbol center in glyph units> / <math axis in glyph units>
= <math axis in TeX> * 347 / 250

对称符号的半高为:

<math axis in TeX units> * (<height in glyph units> - <center in glyph units>) / <math axis in glyph units>
= <math axis in TeX> * (637 - 342) / 250
= <math axis in TeX> * 295 / 250

完整示例:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usepackage{wasysym}
\pagestyle{empty}

\begin{document}
\begin{tikzpicture}[
  every node/.style={
    rectangle,
    anchor=base,
    draw,
  }]
    \pgfmathsetmacro\MathAxis{height("$\vcenter{}$")}
    \edef\JoinShift{\the\dimexpr\MathAxis pt * 347 / 250}
    \node (a) at (0, \JoinShift) {%
      \sbox0{\raisebox{-\JoinShift}{$\Join$}}%
      \dp0=\dimexpr\MathAxis pt * 295 / 250\relax
      \ht0=\dp0 %
      \usebox0%
    };
    \node (b) at (1, 0) {$A=\Join$};

    % Red line at math axis
    \draw[thin, red, yshift=\MathAxis, opacity=.5]
    (a.west |- 0, 0) -- (b.east |- 0, 0);
\end{tikzpicture}
\end{document}

Result \Join

答案2

您可以简单地添加一个\vphantom

vphantom

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\newlength\eqheight
\settoheight\eqheight{$=$}

\begin{document}
\begin{tikzpicture}[every node/.style={minimum height=1em,rectangle,draw}]
    \node at (0, 0) {\vphantom{A}$=$};
    \node at (1, 0) {$A=$};
    \node at (2, 0) {\raisebox{0pt}[\eqheight][0pt]{\raisebox{-1pt}{$=$}}};
\end{tikzpicture}
\end{document}

相关内容