我想创建一个包含我机器上的字体的表格,并附上每种字体的简短示例。因此,我得到了下面的函数并尝试修改以打印其字体样式。(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
我不知道如何生成字体列表。