我想要打印某些字母的字体样本,每个字母都应该覆盖整张 A4 纸。
Open Type 字体包含许多带有多个字形的字母,这些字母可以作为字符变体 ( cc..
)、风格集 ( ss..
)、上下文和位置替代 ( calt
; init
, medi
, fina
)、本地或历史形式 ( locl
; hist
) 或其他形式访问;当然,有些可以通过不同的方法获得。有些字母也是连字的一部分 ( liga
, dlig
, clig
, )。大多数字母都可以在 GUI 中hlig
使用“访问所有替代项”( ) 查看。aalt
我想将它们全部排版为相同的字体大小,该大小将比 大得多\Huge
,例如 5 厘米(140 pt 左右)。最好将它们放在一个背景上,该背景在基线、x 高度、大写字母高度或上升高度和下降高度处显示浅线,如果可能的话,所有这些都是自动确定的。
问题是,我不知道 LuaTeX 或 Tikz/PGF 或两者的组合是否是完成这项工作的最佳工具。样本.tex
以后可能会成为文档的一部分,但目前我可以接受独立页面。因此,任何正确的方向的指示都会受到赞赏。
- 我该如何绘制水平线,最重要的是,如何自动正确定位水平线?(用背景颜色来显示“带状”也可以。)
- 有没有比下面更好的方法来按名称访问字形(没有 Unicode 位置)下面的代码?
粗略概念
使用 Linux Libertine 作为示例,但尚未使用 OT 功能。
% !TEX TS-program = LuaLaTeX
\documentclass{scrartcl}
\usepackage{fontspec,xcolor,libertine,graphicx}
\setmainfont[Color=brown]{Linux Libertine O}
% access glyph by name with LuaTeX
\usepackage{luaotfload,luacode}
\begin{luacode}
documentdata = documentdata or { }
local stringformat = string.format
local texsprint = tex.sprint
local slot_of_name = luaotfload.aux.slot_of_name
documentdata.fontchar = function (chr)
local chr = slot_of_name(font.current(), chr, false)
if chr and type(chr) == "number" then
texsprint
(stringformat ([[\char"%X]], chr))
end
end
\end{luacode}
\newcommand\linecolor{gray}
\newcommand\lineheight{1mm}
\newcommand\linelength{\textwidth}
% \horizontalline{<color>}{<thickness>}{<width>}{<position>}
\newcommand\horizontalline[4]{\relax} % <== how to?
% \textline{<color>}{<thickness>}{<position>}
\newcommand\textline[1]{\horizontalline{\linecolor}{\lineheight}{\linelength}{#1}}
\newcommand\ascenderline{\textline{k-height}} % stem
\newcommand\capitalline{\textline{H-height}} % majuscule size
\newcommand\midline{\textline{A-line}} % crossbar
\newcommand\meanline{\textline{x-height}} % minuscule size
\newcommand\baseline{\textline{0}} % alphabetic base
\newcommand\descenderline{\textline{-p-height}} % depth
\newcommand\visiblelines{%
\ascenderline\capitalline\midline\meanline\baseline\descenderline}
\newcommand\letterspecimen[1]{\visiblelines%
{\framebox[1.1\width]{\fontsize{40mm}{50mm}\selectfont #1\strut}}}
\def\fontchar#1{\directlua{documentdata.fontchar "#1"}}
\def\yround{\fontchar{y.alt}}
\def\heng{\fontchar{h.alt}}
\begin{document}
\letterspecimen{A a ɑ}
\letterspecimen{G g ɡ \fontchar{uni0262} \fontchar{g.sc}}
\letterspecimen{H h \heng}
\letterspecimen{Y y \yround}
\end{document}
答案1
在这里,我使用堆栈解决了在示例字形下方放置底层标尺线的问题。我首先将文本放在一个框中,以确定其宽度,我需要设置规则长度。我设置规则厚度(\rulewd
),就像.02ex
当前较大字体中一样。然后,我构建具有以下特征的规则堆栈,无论规则厚度如何。
底线规则位于底线之上
1ex 高度的规则其上端位于 1ex
高度的规则的
X
上端位于该高度下降器规则基于的深度
y
,并且其下肢位于该深度。
妇女权利委员会:
% !TEX TS-program = LuaLaTeX
\documentclass{scrartcl}
\usepackage{fontspec,xcolor,libertine,graphicx}
\setmainfont[Color=brown]{Linux Libertine O}
% access glyph by name with LuaTeX
\usepackage{luaotfload,luacode}
\begin{luacode}
documentdata = documentdata or { }
local stringformat = string.format
local texsprint = tex.sprint
local slot_of_name = luaotfload.aux.slot_of_name
documentdata.fontchar = function (chr)
local chr = slot_of_name(font.current(), chr, false)
if chr and type(chr) == "number" then
texsprint
(stringformat ([[\char"%X]], chr))
end
end
\end{luacode}
\newcommand\linecolor{gray}
\newcommand\lineheight{1mm}
\newcommand\linelength{\textwidth}
% \horizontalline{<color>}{<thickness>}{<width>}{<position>}
\newcommand\horizontalline[4]{\relax} % <== how to?
% \textline{<color>}{<thickness>}{<position>}
\newcommand\textline[1]{\horizontalline{\linecolor}{\lineheight}{\linelength}{#1}}
\newcommand\ascenderline{\textline{k-height}} % stem
\newcommand\capitalline{\textline{H-height}} % majuscule size
\newcommand\midline{\textline{A-line}} % crossbar
\newcommand\meanline{\textline{x-height}} % minuscule size
\newcommand\baseline{\textline{0}} % alphabetic base
\newcommand\descenderline{\textline{-p-height}} % depth
\newcommand\visiblelines{%
\ascenderline\capitalline\midline\meanline\baseline\descenderline}
\newlength\rulewd
\def\therule{\rule{\wd0}{\rulewd}}
\newcommand\letterspecimen[1]{\visiblelines\renewcommand\stacktype{L}%
{\framebox[1.1\width]{\fontsize{40mm}{50mm}\selectfont\color{black}%
\setbox0=\hbox{#1}%
\setbox2=\hbox{Xy}%
\stackengine{0pt}%
{\setlength\rulewd{.02ex}%
\stackon[\dimexpr-\dp2]{%
\stackon[\dimexpr\ht2-\rulewd]{%
\stackon[\dimexpr1ex-\rulewd]{\therule}{\therule}}{\therule}}{\therule}}
{#1\strut}{O}{l}{F}{F}{L}}}}
\def\fontchar#1{\directlua{documentdata.fontchar "#1"}}
\def\yround{\fontchar{y.alt}}
\def\heng{\fontchar{h.alt}}
\usepackage{stackengine}
\begin{document}
\letterspecimen{A a ɑ}
\letterspecimen{G g ɡ \fontchar{uni0262} \fontchar{g.sc}}
\letterspecimen{H h \heng}
\letterspecimen{Y y \yround{} X x}
\end{document}
这里我把 改为\rulewd
,.06ex
并将规则颜色改为gray!50
:
我已经确认,当在宏中调用不同的字体大小时,该方法会缩放\letterspecimen
。