![为什么当 tikz 节点的文本居中时数学模式中的间距会发生变化?](https://linux22.com/image/307404/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BD%93%20tikz%20%E8%8A%82%E7%82%B9%E7%9A%84%E6%96%87%E6%9C%AC%E5%B1%85%E4%B8%AD%E6%97%B6%E6%95%B0%E5%AD%A6%E6%A8%A1%E5%BC%8F%E4%B8%AD%E7%9A%84%E9%97%B4%E8%B7%9D%E4%BC%9A%E5%8F%91%E7%94%9F%E5%8F%98%E5%8C%96%EF%BC%9F.png)
例如,给定两个具有相同内容的节点$a = 1$
,间距会根据相应节点的文本对齐方式而不同,即当文本居中时,间距较大。问题似乎只发生在 tikz 节点中使用内联数学模式的情况下。
一个例子:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\node[text box, align=center] at (0, 2) {$a = 1$};
\node[text box, align=left] at (0, 0) {$a = 1$};
\end{tikzpicture}
\end{document}
为什么间距不同?
可以使用 来防止间距不同\mbox{$a = 1$}
。是否有更好的方法让两种对齐方式具有相同的间距?
答案1
如果您想使公式中的空格不可拉伸和收缩,只需将公式括在括号中即可。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\node[text box, align=center] at (0, 2) {${a = 1}$};
\node[text box, align=left] at (0, 0) {$a = 1$};
\end{tikzpicture}
\end{document}
align=center
如果在 TeX 看来有必要,您无法避免公式被拉伸。text centered
和之间的区别text badly centered
在于,在第一种情况下,有限粘连被分配给\leftskip
和\rightskip
,这会以拉伸空间为代价来降低不规则性。
但是如果公式在括号中,则不能参与拉伸。
或者,使用align=flush center
将定心粘合设置为一阶无限填充粘合:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\node[text box, align=flush center] at (0, 2) {$a = 1$};
\node[text box, align=left] at (0, 0) {$a = 1$};
\end{tikzpicture}
\end{document}
输出是一样的。
如果你将示例改为
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{badness warnings for centered text}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\node[text box, align=center] at (0, 2) {$a = 1$};
\node[text box, align=left] at (0, 0) {$a = 1$};
\end{tikzpicture}
\end{document}
您会在日志文件中看到以下警告:
Underfull \hbox (badness 1762) in paragraph at lines 8--8
[][][][]$\OML/cmm/m/it/10 a \OT1/cmr/m/n/10 = 1$
实际情况是,TeX 被命令填充一个 5cm 宽的框。由于align=center
有效,可用的拉伸来自\leftskip
和,\rightskip
它们设置为 0pt 加 2em,以及来自\thickmuskip
等号周围的可拉伸粘连。
这些字符全局占用 18.0637pt;在本上下文中,一个 em 为 10pt; 的值为\thickmuskip
,5mu plus 5mu
因此拉伸了 2.77771pt。五厘米等于 142.26378pt。
现在,要填充的空间以点为单位,
142.26378 - 18.0637 - 2*2.77771 = 118.64466
并且我们有可用的2*(20+2.77771) = 45.55542
,因此可用的粘连必须超出其值的 1.6 倍。这意味着等号两侧各有 7pt 的空间。
结论:align=center
仅当您确信文本几乎填满行时才使用。否则,请使用align=flush center
。
答案2
事实上,不仅align=center
如此align=right
改变了间距。对于后来的 Ti钾Z 设置\leftskip=0pt plus2em
;对于前者,它将\leftskip
和设置\rightskip
为相同的值,0pt plus2em
。
如果你熟悉 TeX 胶水,你将会认识到a
,,=
和之间的空格b
的空格是由可拉伸胶水。右边a=b
更宽,因为伸展性较小2em
。
\documentclass[border=9,tikz]{standalone}
\begin{document}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\path(0,-1)node[text box,align=left ]{$a=b$}
(0,-2)node[text box,align=center]{$a=b$}
(0,-3)node[text box,align=right ]{$a=b$};
\end{tikzpicture}
剩下的问题是为什么align=left
不是的反映align=right
。这是因为\parfillskip
包含1.0fil
。将其设置为零解决这个问题。
\makeatletter
\tikzoption{text ragged}[]%
{\def\tikz@text@action{\parfillskip0pt\pgfutil@raggedright\rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax}}
\begin{tikzpicture}[text box/.style={draw, text width=5cm}]
\path(0,-1)node[text box,align=left ]{$a=b$}
(0,-2)node[text box,align=center]{$a=b$}
(0,-3)node[text box,align=right ]{$a=b$};
\end{tikzpicture}
\end{document}