如何将字母*精确地*放置在彼此之上?

如何将字母*精确地*放置在彼此之上?

我正在尝试堆叠粗体大写字母,如下例所示。字母之间不应有空白,字母也不应重叠。有些字母应该拉长或缩短。

据我所知,TikZ 不区分粗体和常规风格,也不区分比其他字母略高的字母(例如Cvs E)。

任何想法都将不胜感激!我根本不应该使用 TikZ 吗?我想避免手动调整每个字母的 y 位置。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document} 
\Huge
\begin{tikzpicture}[mytext/.style = {inner sep=0, outer sep=0}, font=\bfseries] 
  \node (c1) [mytext, anchor=south] at (0,0) {C};
  \node (c2) [mytext, above=0 of c1, color=red] {C};
  \node      [mytext, above=0 of c2] {E};
  \node (c3) [mytext, yscale=2, anchor=south] at (1,0) {C};
  \node (c4) [mytext, yscale=0.5, above=0 of c3, color=red] {C};
  \node      [mytext, yscale=0.5, above=0 of c4] {E};
\end{tikzpicture}
\end{document} 

在此处输入图片描述

答案1

TeX 不知道字形的形状。它只知道 TFM 文件中指定的字符框尺寸。

字体识别

字体文件可以通过以下方式识别:

  • 用一个只有这个字体的文档,比如问题的文档,是可以的,只要\pagestyle{empty}加上就可以了。

  • pdflatex使用选项运行它-recorder

  • 日志文件的结束部分和*.fls文件显示的cmbx12.pfb字体。

  • 字体规格只能在录音文件中看到*.fls

    INPUT cmbx12.tfm
    

字体形状数据

在字体编辑器中打开字形,例如FontForge. 修剪边距:

C: 62 -12 63 -12 (width 812)
E: 38   0 32   5 (width 738)

字体还表示 1em = 1000 个单位

TeX 指标

该程序可以将二进制*.tfm文件转换为更易读的 ASCII 格式tftopl

tftopl cmbx12.pfb cmbx12.pl

它开头包含字体尺寸参数:

(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.375)
   (STRETCH R 0.1875)
   (SHRINK R 0.125)
   (XHEIGHT R 0.444444)
   (QUAD R 1.125)
   (EXTRASPACE R 0.125)
   )

该条目QUAD指定 1em 的大小。它是字体 em 大小的 1.125 倍。

字符度量与字体完全相同(除了某些“舍入”问题):

(CHARACTER C C
   (CHARWD R 0.8125)
   (CHARHT R 0.686111)
   )
...
(CHARACTER C E
   (CHARWD R 0.738426)
   (CHARHT R 0.686111)
   )

C 的宽度为 0.8125 * 乘以字体的 em 大小 = 812.5 个字体单位。截断为整数,这就是 FontForge 显示的 812。

下面的示例定义了一些宏来指定字形的修剪值,并定义了\GlyphBox修复其 TeX 框以完全适合字形的宏(舍入问题除外)。

保持宏只对一种字体有效。可以扩展它们以添加字体名称的另一个参数。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\makeatletter

\newcommand*{\EmSize}[1]{%
  \def\@EmSize{#1}%
}
\newcommand*{\@GlyphPropName}[2]{%
  GS@#1@#2%
}
\newcommand*{\GlyphProp}[2]{%
  \@nameuse{\@GlyphPropName{#1}{#2}}%
}
\newcommand*{\GlyphSize}[5]{%
  \@namedef{\@GlyphPropName{#1}{llx}}{#2}%
  \@namedef{\@GlyphPropName{#1}{lly}}{#3}%
  \@namedef{\@GlyphPropName{#1}{urx}}{#4}%
  \@namedef{\@GlyphPropName{#1}{ury}}{#5}%
}
\newcommand*{\GlyphBox}[1]{%
  \begingroup
    \leavevmode
    \setbox0=\hbox{#1}%
    \setbox0=\hbox{%
      \kern-\dimexpr1em*\GlyphProp{#1}{llx}/\@EmSize\relax
      #1%
      \kern-\dimexpr1em*\GlyphProp{#1}{urx}/\@EmSize\relax
    }%
    \ht0=\dimexpr\ht0 - 1em*\GlyphProp{#1}{ury}/\@EmSize\relax
    \dp0=\dimexpr\dp0 - 1em*\GlyphProp{#1}{lly}/\@EmSize\relax
    \box0\relax
  \endgroup
}
\makeatother
% Font cmbx12
\EmSize{1125}% 1000 units in font, 1.125 in TFM
\GlyphSize{C}{62}{-12}{63}{-12}
\GlyphSize{E}{38}{0}{32}{5}

\begin{document} 
\Huge
\bfseries

\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.2pt}
\textcolor{red}{%
  \fbox{\color{black}\GlyphBox{C}}%
  \fbox{\color{black}\GlyphBox{E}}%
}

\begin{tikzpicture}[mytext/.style = {inner sep=0, outer sep=0}, font=\bfseries]
  \node (c1) [mytext, anchor=south] at (0,0) {\GlyphBox{C}};
  \node (c2) [mytext, above=0 of c1, color=red] {\GlyphBox{C}};
  \node      [mytext, above=0 of c2] {\GlyphBox{E}};
  \node (c3) [mytext, yscale=2, anchor=south] at (1,0) {\GlyphBox{C}};
  \node (c4) [mytext, yscale=0.5, above=0 of c3, color=red] {\GlyphBox{C}};
  \node      [mytext, yscale=0.5, above=0 of c4] {\GlyphBox{E}};
\end{tikzpicture}
\end{document}

结果

答案2

赛莱特

在此处输入图片描述

pdflatex

在此处输入图片描述

另外 15 个角色

答案3

我认为你不需要像这样的大锤 tikz:一个简单的 tabular命令\scalebox\Gape来自的命令makecell进行精确的调整,就可以完成这项工作:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{xcolor}
\usepackage{makecell, graphicx}

\newcommand{\vscalebox}[2][1]{\scalebox{1}[#1]{#2}}

\begin{document}

\centering
\renewcommand{\arraystretch}{0}
\begin{tabular}{>{\bfseries\Huge}c}
E\\ \Gape[0.3pt]{\color{red}C}\\ \Gape[0.3pt]{C}
\end{tabular}
\quad
\begin{tabular}{>{\bfseries\Huge}c}
\vscalebox[0.5]{E}\\ \Gape[0.15pt]{\vscalebox[0.5]{\color{red}C}}\\ \Gape[0.6pt]{\vscalebox[2]{C}}
\end{tabular}

\end{document} 

在此处输入图片描述

答案4

您可以使用 Metafun 来实现。

\setupbodyfont[10pt]
\starttext
\setbox0=\hbox{\bf C}
\newdimen\dpC \dpC=\dp0
\startMPpage
picture E; E := image ( draw outlinetext ("\bf E") ) ;
picture Ca; Ca := image ( draw outlinetext.f ("\bf C") (withcolor red) ) ;
picture Cb; Cb := image ( draw outlinetext ("\bf C") ) ;
currentpicture := E;
addto currentpicture also Ca
    shifted (0,-bbheight Ca+\the\dpC);
addto currentpicture also Cb
    shifted (0,-bbheight Ca-bbheight Cb+\the\dpC);
\stopMPpage
\startMPpage
picture E; E := image ( draw outlinetext ("\bf E") yscaled (.5) ) ;
picture Ca; Ca := image ( draw outlinetext.f ("\bf C") (withcolor red) yscaled (.5) ) ;
picture Cb; Cb := image ( draw outlinetext ("\bf C") yscaled (2) ) ;
currentpicture := E;
addto currentpicture also Ca
    shifted (0,-bbheight Ca+.5*\the\dpC);
addto currentpicture also Cb
    shifted (0,-bbheight Ca-bbheight Cb+2*\the\dpC);
\stopMPpage
\stoptext

在此处输入图片描述

相关内容