为什么当 tikz 节点的文本居中时数学模式中的间距会发生变化?

为什么当 tikz 节点的文本居中时数学模式中的间距会发生变化?

例如,给定两个具有相同内容的节点$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; 的值为\thickmuskip5mu 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改变了间距。对于后来的 TiZ 设置\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}

相关内容