我想在 tikz 节点中对齐等号,就像这张图的第三个节点一样:
\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 确实不是知道字形的黑色像素在哪里。它只知道名义上的字形边界框:
创建者:
\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}
Join
包装符号wasysym
\Join
包的符号存在两个问题wasysym
:
- 报告的字形边界框的高度不正确(似乎是一个错误)。
- 这是不是垂直居中于数学轴,但位于等号的上栏。也许,字体设计师想避免符号下降到基线。
等号的字体是,包符号的cmr10.pfb
字体是。两种字体的 em 大小相同,均为 1000,数学轴相同,均为 250。字形的高度为 637,中心位于 342,深度为 -47(高于基线)。这些值可以在\Join
wasysym
wasy10.pfb
\Join
FontForge, 例如。
那么移位的公式为:
<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}
答案2
您可以简单地添加一个\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}