补充答案

补充答案

我正在尝试让 XeTeX 生成一个包含给定字体的所有可能字形的表,但不知道如何让 XeTeX 知道该字体有多少个字形,所以我必须指定一个确切的数字。

这是我目前得到的:

\documentclass[border=0.5cm,10pt,landscape]{standalone}
\usepackage{geometry}
\usepackage{xunicode, xltxtra}
\usepackage{fontspec}
\usepackage{multicol}
\setmainfont[Mapping=tex-text, Ligatures={Historical}, Alternate=0]{Linux Libertine O}
\setlength{\columnsep}{0.3cm}
\setlength{\columnseprule}{1pt}
\begin{document}

\begin{multicols}{10}
\newcount\charcount
\charcount=0
\loop
\number\charcount \hspace{1ex} \XeTeXglyph\charcount
\par
\ifnum\charcount<2500
\advance\charcount1
\repeat
\end{multicols}

\end{document}

例子。

图。1:输出示例。

它如何自动知道可访问字形的确切数量?

奖金:是否有人愿意浪费时间将所有内容都放入一个有 10 列的表格中?:-) 它还报告了一个可能由multicol我尚无法修复的错误引起的错误。

答案1

回答你的问题:

  1. 使用\iffontchar\font数字...\fi来测试字体中是否存在字形。

  2. multicol对我来说没问题。设置\parindent为 0pt 即可获得正确结果。

这是一个很好的例子:

第一页
...
第 7 页

\documentclass[landscape]{article}
\usepackage{geometry}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{multicol}
\setlength{\columnseprule}{0.4pt}
\usepackage{multido}
\setlength{\parindent}{0pt}
\begin{document}

\begin{multicols}{10}
\multido{\i=0+1}{"10000}{% from U+0000 to U+FFFF
  \iffontchar\font\i
    \makebox[3em][l]{\i}%
    \symbol{\i}\endgraf
  \fi
}
\end{multicols}

\end{document}

注意:我尽力让代码保持简单。但还是有两点不寻常:我使用\iffontchar来测试字体字符,并使用\endgraf而不是\par来作弊\multido

答案2

我知道您要求使用 XeTeX 的解决方案(并且 egreg 已经给出了一个),但这里有一个 LuaTeX 解决方案:

\documentclass[10pt,landscape]{article}
\usepackage{luacode}
\usepackage[margin=0.5cm]{geometry}
\usepackage{fontspec}
\usepackage{multicol}
\setlength{\columnsep}{0.3cm}
\setlength{\columnseprule}{1pt}

\newfontface\thefont{Linux Libertine O}

\begin{document}
\section*{Linux Libertine O}
\begin{multicols}{7}\noindent
\begin{luacode*}
local f = fontloader.open('/usr/local/texlive/2011/texmf-dist/fonts/opentype/public/libertine/fxlr.otf')

local glyphs = {}
for i = 0, f.glyphmax - 1 do
   local g = f.glyphs[i]
   if g then
       table.insert(glyphs, {name = g.name, unicode = g.unicode})
   end
end

table.sort(glyphs, function (a,b) return (a.unicode < b.unicode) end)

for i = 1, #glyphs do
   tex.sprint(glyphs[i].unicode .. ': ')
   if (glyphs[i].unicode > 0) then
       tex.sprint('{\\thefont\\char' .. glyphs[i].unicode .. '}');
   end
   tex.sprint(' {\\tiny (')
   tex.sprint(-2, glyphs[i].name)
   tex.sprint(')}\\\\')
end

fontloader.close(f)
\end{luacode*}
\end{multicols}
\end{document}

结果的一部分

答案3

\documentclass{article}
\usepackage[a4paper,landscape,textwidth=239mm,textheight=480pt]{geometry}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\newcount\charcount
\parindent=0pt
\begin{document}

\chardef\highest=\XeTeXcountglyphs\font
\offinterlineskip
\loop
\makebox[15mm][l]{\strut\vrule\,\number\charcount\hfill \XeTeXglyph\charcount}\hskip1mm plus 1mm
\ifnum\charcount<\numexpr\highest-1\relax
\advance\charcount1
\repeat

\end{document}

使用 Linux Libertine 时,最后一个字形会产生错误,这就是造成这种奇怪限制的原因。使用其他字体时不会发生这种情况。

如果想要一个包含字符实际代码的表格,则必须使用较慢的例程:

\documentclass{article}
\usepackage[a4paper,landscape,textwidth=239mm,textheight=480pt]{geometry}
\usepackage{fontspec}
\setmainfont{Old Standard}
\newcount\charcount
\parindent=0pt
\begin{document}

\offinterlineskip
\def\dochar{\iffontchar\font\charcount
  \makebox[15mm][l]{\strut\vrule\,{\tiny\number\charcount}\hfill\char\charcount}\hskip1mm plus 1mm
  \fi}
\loop\dochar
\ifnum\charcount<"10FFFF\relax
\advance\charcount1
\repeat

\end{document}

答案4

补充答案

我查看了一些答案,并决定使用 PGF/TikZ 编写一个类似的答案。因此,为了社区的利益,就在这里!

快速排版版本:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage{tikz}
\begin{document}
\pgfmathtruncatemacro\maxstep{\the\XeTeXcountglyphs\font-1} % https://tex.stackexchange.com/a/235688/13552
\typeout{maxstep is \maxstep} % Prints maxstep to log
Number of glyphs: \maxstep\\
\begin{multicols}{5}
\foreach \charstep in {1,...,\maxstep}{%
    %\iffontchar\font\charstep
        \makebox[3em][l]{\small\charstep}%
        \XeTeXglyph\charstep
        \endgraf
    %\else
        %\charstep{} not exist
    %\fi
}%
\end{multicols}
\end{document}

排版缓慢的\tikzpicture版本:

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Linux Libertine O}
\usepackage{multicol}
\usepackage{pgffor}
\usepackage{tikz}
\begin{document}
\begin{multicols}{5}
\pgfmathsetmacro\maxstep{\the\XeTeXcountglyphs\font-1} % https://tex.stackexchange.com/a/235688/13552
\typeout{maxstep is \maxstep} % Prints maxstep to log
\foreach \charstep in {1,...,\maxstep}{%
    %\iffontchar\font\charstep
        \makebox[3em][l]{\small\charstep}%
        \begin{tikzpicture}[anchor=base, baseline]
            \node [red,font=\fontsize{12}{17}\selectfont] {\XeTeXglyph\charstep};
        \end{tikzpicture}\endgraf
    %\else
        %\charstep{} not exist
    %\fi
}%
\end{multicols}
\end{document}

使用 Paul 建议的办法的好处\XeTeXglyph是,您不需要检查字符是否存在。这就是我注释掉 if 语句 ( \iffontchar\font\charstep) 的原因。

\pgfmathsetmacro请注意,您可以使用来代替\edef

\edef\maxstep{\the\numexpr\XeTeXcountglyphs\font-1\relax} % https://tex.stackexchange.com/a/235686/13552

它也适用于 Paul 提到的 Leo Liu 的答案。以下是一个例子:

\begin{multicols}{5}
\multido{\i=0+1}{\XeTeXcountglyphs\font}{
    \makebox[3em][l]{\i}%
    \XeTeXglyph\i\endgraf
}%
\end{multicols}

相关问题

相关内容