我正在尝试堆叠粗体大写字母,如下例所示。字母之间不应有空白,字母也不应重叠。有些字母应该拉长或缩短。
据我所知,TikZ 不区分粗体和常规风格,也不区分比其他字母略高的字母(例如C
vs 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
答案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