LuaLaTeX:带有字体文件示例的字体表(未安装系统或 TEXMF)

LuaLaTeX:带有字体文件示例的字体表(未安装系统或 TEXMF)

看看问题的答案这里, 这是非常接近我想要的。我想要的是创建字体表,其中包含字体文件的示例,这些字体文件不是系统安装或泰克思树,而是驻留在路径或 CD 上的字体文件(没有子文件夹,只需当前文件夹即可)。

我仍在学习,感谢您的帮助!

使用 MiKTeX 2.9 和 Windows 7,以及 LuaLaTeX。


编辑:

受到Taco回答的启发,我得出了以下内容(修改自利奥的守则):

\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}
teststring = "0123456789 ABCDEFabcdef"
tex.print(-2, os.getenv('FONTSPEC'))
tex.print('\\\\')
tex.print("\\begin{longtable}{ll}\\hline")
for i,v in ipairs(dir.glob(os.getenv('FONTSPEC'))) do
  -- get rid of './' in front of filenames, fontspec don't like that
  local f = string.gsub(v, "^./", "")
  -- font name
  local info = fontloader.info(v)
  tex.print('\\makecell[l]{\\bfseries')
  tex.print(-2, info.fontname) -- font name here
  tex.print('\\\\[-1ex] \\scriptsize')
  tex.print(-2, f) -- filename
  tex.print('} & \\large\\fontspec{')
  tex.print(-2, f)
  tex.print('}')
  tex.print(teststring)
  tex.print('\\\\ \\hline')
end
tex.print("\\end{longtable}")
\end{luacode}
\end{document}

它利用环境变量FONTSPEC来指定字体文件搜索模式,例如*.ttf当前目录中的 TrueType 文件。请注意特克斯文件需要与字体文件和 glob 模式位于同一目录中区分大小写

示例运行:

set FONTSPEC=*.ttf
lualatex fontsampler.ltx

结果: 字体采样器示例

答案1

我是一名上下文用户,如果我足够努力,我确信我可以在一小时内想出一个基于宏的上下文 hack 来完成你想要做的事情。正因为如此,我相信知识渊博的 lualatex 用户也可以完成类似的 hack 操作,但是...如果一个简单的脚本/批处理文件只需使用调整后的 TEXMF 或 OSFONTDIR 环境变量运行 luatex 就可以完成相同的操作,那么为什么要花时间创建复杂的 hack 操作呢?

事实上,你甚至可以在文档中动态地更改 OSFONTDIR,方法是输入类似

\directlua { os.setenv('OSFONTDIR', '<foldernamehere>') }

在文档序言中(未经测试,目前不在电脑后面)

编辑:它甚至比这更简单(至少在 ConTeXt 中)。我只是尝试了一些简单的事情,绝对路径名在 ConTeXt 中的字体规范中有效,所以这对我来说运行正常:

\starttext
\startluacode
context.starttabulate{"|p|"}
for i,v in ipairs(dir.glob('/home/taco/tmp/itc/*.otf')) do
  local info = fontloader.info(v);
  context.NC()
  context(string.format('\\mono{%s}\\crlf %s\\crlf\\definedfont[%s]',v,info.fontname,v))
  context("Sphinx of black quartz, judge my vow.")
  context.NC()
  context.NR()
end
context.stoptabulate()
\stopluacode
\stoptext

答案2

虽然有点晚了,但无论如何。一个简单的 LuaTeX 解决方案:

lua文件fontsampler.lua

function dirtree(dir)
  assert(dir and dir ~= "", "directory parameter is missing or empty")
  if string.sub(dir, -1) == "/" then
    dir=string.sub(dir, 1, -2)
  end

  local function yieldtree(dir)
    for entry in lfs.dir(dir) do
      if not entry:match("^%.") then
        entry=dir.."/"..entry
          if not lfs.isdir(entry) then
            coroutine.yield(entry,lfs.attributes(entry))
          end
          if lfs.isdir(entry) then
            yieldtree(entry)
          end
      end
    end
  end

  return coroutine.wrap(function() yieldtree(dir) end)
end


function fontsampler( dir )
  for entry in dirtree(dir) do
    if entry:match(".otf","-4") then
      tex.tprint({[[\mono ]]},{-2,entry},{[[ (]]},{-2,fontloader.info(entry).fontname},{[[)\par\font\sample={file:]]},{-2,entry},{[[}\sample Sphinx of black quartz, judge my vow.\par]]})
    end
  end 
end

以及小型驱动程序文件fontsampler.tex

\input luaotfload.sty
\font\mono = {file:lmmono8-regular.otf}
\parindent 0pt

\directlua{ 
  dofile("fontsampler.lua") 
  fontsampler(arg[2])
}

\bye

并调用

luatex fontsampler.tex "/my/path/"

这将创建一个 PDF 文件,其中包含给定目录及下面的字体示例。

相关内容