如何排版带有替代字符的字母或字素样本?

如何排版带有替代字符的字母或字素样本?

我想要打印某些字母的字体样本,每个字母都应该覆盖整张 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当前较大字体中一样。然后,我构建具有以下特征的规则堆栈,无论规则厚度如何。

  1. 底线规则位于底线之上

  2. 1ex 高度的规则其上端位于 1ex

  3. 高度的规则的X上端位于该高度

  4. 下降器规则基于的深度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

相关内容