消除 TikZ 节点内字符周围的空格

消除 TikZ 节点内字符周围的空格

我想通过将每个字符放在一个节点中并将它们相邻放置来“粘合” TikZ 中的单个字符。但是即使有和,inner sep=0仍然outer sep=0会留有一个空格。

以下 MWE 产生了这种情况:

\documentclass{article}
\usepackage{tikz}
\begin{document}
\framebox{%
\begin{tikzpicture}[inner sep=0,outer sep=0]
\node (k) at (0,0) {K};
\node[anchor=north west] (n) at (k.north east) {N};
\end{tikzpicture}%
}
\end{document}

结果如附件所示:一个黑色的框,里面有一个空格,然后里面KN旁边都有一个空格。

在此处输入图片描述

我希望KN彼此粘在一起以便它们接触(就像将它们裁剪为字母的黑色部分一样),然后框架KN各个侧面接触。

答案1

没有通用的方法来解决这个问题:每个字形的边界框由字体本身决定,TeX 无法改变它。(TeX 直接使用字形的边界框,而不关心“墨水”在框内 [或框外!] 的分布位置。)

TikZ 或普通的运行文本也存在同样的问题。解决该问题的唯一方法是使用手动字距调整或手动移位,这两者都取决于字体和字形设计。

em通过使用相对单位(宽度和ex高度),可以获得某种程度的通用性,但即使这样也不是完全完美的,因为字形在不同的点大小下可能具有不同的相对大小/形状。

一个说明性示例,字形周围有细线框:

\documentclass{article}
\usepackage{tikz}
\tikzset{every node/.style={inner sep=0,outer sep=0,draw,line width=1sp}}
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{1sp}

\begin{document}
\begin{tikzpicture}
\node (k) at (0,0) {K};
\node[anchor=north west] (n) at (k.north east) {N};
\end{tikzpicture}
Ti\emph{k}Z, standard

\fbox{K}\fbox{N}
\TeX, standard

\begin{tikzpicture}
\node (k) at (0,0) {K};
\node[anchor=north west,xshift=-0.089em] (n) at (k.north east) {N};
\end{tikzpicture}
Ti\emph{k}Z, shifted

\fbox{K}\kern-0.089em\fbox{N}
\TeX, kerned
\end{document}

在此处输入图片描述

答案2

这只是使用库在 TiKZ 图片中绘制框架的另一种方法fit,而不是使用\framebox{}\fbox{}。它毫不掩饰地窃取了两个字母之间所需的调整Paul Gessler 的回答。如果您愿意,您显然可以进行进一步的调整,以消除字母与框架左侧和右侧之间的微小距离。然而,正如 Paul Gessler 所解释的那样,这必须根据具体情况手动完成。(例如,与框架右侧N线的距离比与K左侧线的距离略远。)

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit}
\begin{document}
    \begin{tikzpicture}[inner sep=0pt, outer sep=0pt]
      \node (k) at (0,0) {K};
      \node[anchor=north west,xshift=-0.089em] (n) at (k.north east) {N};
      \node [fit=(k) (n), draw=gray, ultra thin] {};
    \end{tikzpicture}
\end{document}

适配框架

答案3

使用 xshift

\documentclass{article}
\usepackage{tikz}
\begin{document}
\framebox{%
\begin{tikzpicture}[inner sep=0,outer sep=0]
\node (k) at (0,0) {K};
\node[anchor=north] (n) at (k.north east) {N};
\end{tikzpicture}%
}
\framebox{%
\begin{tikzpicture}[inner sep=0,outer sep=0]
\node (k) at (0,0) {K};
\node[anchor=north,xshift=2pt] (n) at (k.north east) {N};
\end{tikzpicture}%
}
\end{document}

相关内容