Lualatex:带有示例的字体表

Lualatex:带有示例的字体表

我想创建一个包含我机器上的字体的表格,并附上每种字体的简短示例。因此,我得到了下面的函数并尝试修改以打印其字体样式。(LuaLatex)

\documentclass[10pt,a4paper]{article}
\usepackage{fontspec}
\usepackage{luacode,luaotfload,luatextra}
\usepackage[margin=18mm]{geometry}

\begin{document}
\begin{luacode}
myfonts=dofile(fonts.names.path.localdir..'/otfl-names.lua')
--tex.print('\\begin{verbatim}\\par')
for i,v in ipairs(myfonts.mappings) do
  --tex.print('\\fontspec{' .. v.fontname .. '}')   % most recent attempt
  --tex.print('\\setmainfont{' .. v.fontname .. '}') % first attempt
tex.print(v.familyname..', '..v.fontname..'\\par')
end
--tex.print('\\end{verbatim}\\par')
\end{luacode}

\end{document}

注释的两行均不起作用(fontspec 或 setmainfont)。

应该如何使用 lua 来做到这一点?

答案1

这改进了 Caramdir 的答案,使得表格更容易阅读:

\documentclass{article}

\usepackage{fontspec}
\setmainfont{Latin Modern Mono Light}

\usepackage{luacode}

\usepackage[margin=18mm]{geometry}
\parindent=0pt

\usepackage{longtable,makecell}
\renewcommand\arraystretch{2}

\begin{document}
\begin{luacode}
myfonts=dofile(fonts.names.path.localdir..'/otfl-names.lua') -- TeX Live 2012 or earlier
-- myfonts=dofile(fonts.names.path.path) -- TeX Live 2013
teststring = "Sphinx of black quartz, judge my vow."

tex.print("\\begin{longtable}{ll}\\hline")

for i,v in ipairs(myfonts.mappings) do
  -- Stop early for testing purposes.
  if i > 20 then break end

  tex.print('\\makecell[l]{\\bfseries')
  tex.print(-2, v.familyname)
  tex.print('\\\\[-1ex] \\scriptsize')
  tex.print(-2, v.fontname)
  tex.print('} & \\LARGE\\fontspec{' .. v.fontname .. '}')
  tex.print(-2, teststring)
  tex.print('\\\\ \\hline')
end
tex.print("\\end{longtable}")
\end{luacode}

\end{document}

在此处输入图片描述

答案2

这对我来说是有效的——只要没有带下划线或其他令人反感的字符的字体。对于一般情况,使用可选的第一个参数来tex.print避免任何问题:将其设置为-2会将 catcode 12(其他)分配给除空格之外的所有字符(这样 TeX 就不会将\_等视为特殊字符)。有关详细信息,请参阅 LuaTeX 手册(texdoc luatex)。

\documentclass[10pt,a4paper]{article}
\usepackage{fontspec}
\usepackage{luacode,luaotfload,luatextra}
\usepackage[margin=18mm]{geometry}

\begin{document}
\begin{luacode}
myfonts=dofile(fonts.names.path.localdir..'/otfl-names.lua')

for i,v in ipairs(myfonts.mappings) do
  tex.print('\\setmainfont{' .. v.fontname .. '}') 
  tex.sprint(-2, v.familyname..', '..v.fontname) --Prints everything with catcode 12.
  tex.sprint('\\par')
  if i > 50 then break end --Stop early for testing purposes.
end
\end{luacode}    
\end{document}

前几行

如果在没有提前断开线的情况下运行该程序将花费相当长的时间,并且某些字体可能会导致问题(例如,在我的情况下MnSymbol9.otf导致 pdf 损坏并ocrb5.otf导致fontspec失败)。

答案3

以下内容适用于lualatex(LuaTeX) 0.95.0 (TeX Live 2016)。

首先,确保luaotfload-names.lua位于同一目录中:

luaotfload-tool -u
cp ~/.texlive/texmf-var/luatex-cache/generic/names/luaotfload-names.lua.gz .
gzip -d ~/luaotfload-names.lua.gz

然后创建allfonts.tex以下内容:

\RequirePackage{luatex85}
\documentclass[varwidth]{standalone}
\usepackage{fontspec}
\setmainfont{Latin Modern Mono Light}

\usepackage[tmargin=23mm,lmargin=25mm]{geometry}

\usepackage{luacode}

\usepackage{longtable,makecell}
\renewcommand\arraystretch{2}

\begin{document}
\begin{luacode}
myfonts=dofile('luaotfload-names.lua')
teststring = "Sphinx of black quartz, judge my vow."

tex.print("\\begin{longtable}{ll}\\hline")

for i,v in ipairs(myfonts.mappings) do
  -- Stop early for testing purposes.
  if i > 20 then break end

  tex.print('\\makecell[l]{\\bfseries')
  tex.print(-2, v.familyname)
  tex.print('\\\\[-1ex] \\scriptsize')
  tex.print(-2, v.fontname)
  tex.print('} & \\LARGE\\fontspec{' .. v.fontname .. '}')
  tex.print(-2, teststring)
  tex.print('\\\\ \\hline')
end
tex.print("\\end{longtable}")
\end{luacode}

\end{document}

跑步lualatex allfonts.tex

渲染字体的输出样本

这是稍微修改过的版本Leo Liu 的回答。我花了一段时间才弄清楚,我遇到错误是因为fonts.names.path.localdir我不知道如何生成字体列表。

相关内容