我正在尝试让 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
回答你的问题:
使用
\iffontchar\font
数字...\fi
来测试字体中是否存在字形。multicol
对我来说没问题。设置\parindent
为 0pt 即可获得正确结果。
这是一个很好的例子:
...
\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}