我想写一段文字,其中每个字母使用不同的字体。这段文字比较短。我想我可以逐个字母地写,为每个字母选择我想要的字体。
有没有更简单的方法?
答案1
是的,我相信这可以得到很大的改进。特别是,它不喜欢空格,也不喜欢被输入参数(因此使用该lipsum
包来演示它不起作用)。当然,字距完全乱了,但如果有一个解决方案能解决这个问题,我会感到惊讶!
它使用fontspec
包,并且由于某些我不知道的原因,使用我需要使用的字体的正确名称lualatex
而不是xelatex
。
不用多说,以下是代码:
\documentclass{article}
\usepackage{fontspec}
\pagestyle{empty}
\newfontfamily\fonta{TeX Gyre Bonum}
\newfontfamily\fontb{TeX Gyre Adventor}
\newfontfamily\fontc{TeX Gyre Chorus}
\newfontfamily\fontd{TeX Gyre Heros}
\newfontfamily\fonte{TeX Gyre Pagella}
\newfontfamily\fontf{TeX Gyre Schola}
\newfontfamily\fontg{TeX Gyre Termes}
\newfontfamily\fonth{GFS Artemisia}
\newfontfamily\fonti{GFS Bodoni}
\newfontfamily\fontj{Iwona}
\newfontfamily\fontk{GFS Didot}
\newfontfamily\fontl{GFS Neohellenic}
\newfontfamily\fontm{Kurier}
\newfontfamily\fontn{Free Mono}
\newfontfamily\fonto{Free Sans}
\newfontfamily\fontp{Free Serif}
\newfontfamily\fontq{Inconsolata}
\newfontfamily\fonts{Linux Libertine O}
\newfontfamily\fontt{Cyklop}
\newfontfamily\fontu{Old Standard}
\newfontfamily\fontv{Antykwa Poltawskiego}
\newfontfamily\fontw{STIX General}
\newfontfamily\fontx{Punknova}
\newfontfamily\fonty{Semafor}
\newfontfamily\fontz{UM Typewriter}
\makeatletter
\edef\my@relax{\relax}
\newcommand{\do@font}[1]{%
\edef\my@arg{#1}%
\ifx\my@arg\my@relax
\else
\@ifundefined{font#1}{}{%
\csname font#1\endcsname}%
\my@arg
\expandafter\do@font
\fi}
\newcommand{\dofont}[1]{%
\edef\my@arg{#1}%
\expandafter\do@font\my@arg\relax}
\makeatother
\begin{document}
\Large
\dofont{the quick brown fox jumped over the lazy dog}
\dofont{abcdefghijklmnopqrstuvwxyz}
\end{document}
所有字体都是我在 TeXLive2010 发行版中找到的。
答案2
这是一个与我上面提出的方法不同的方法,以下 lua 代码将保存在文件中randomfont.lua
:
function randomfonts(fonts, text)
local list = { }
local last, new
for s in string.gmatch(fonts,"([^, ]+)") do
list[#list+1] = s
end
for c in string.utfcharacters(text) do
if c:is_empty() then
tex.sprint(c)
else
while last==new do
new = math.random(#list)
end
tex.sprint(luatexbase.catcodetables.latex,
string.format([[{\%s %s}]], list[new], c))
last = new
end
end
end
还有一个测试文件:
\documentclass{article}
\usepackage{xcolor,fontspec}
\newfontfamily\one[Color=red]{TeX Gyre Termes}
\newfontfamily\two[Color=blue]{TeX Gyre Pagella}
\newfontfamily\three[Color=yellow]{TeX Gyre Heros}
\newfontfamily\four[Color=green]{TeX Gyre Bonum}
\directlua{dofile("randomfont.lua")} % load the lua file
\newcommand\randomfonts[2]{%
\directlua{randomfonts("#1", "#2")}%
}
\begin{document}
% can take text strings
\randomfonts{one, two, three, four}{abcdef ghijk lmn o}
% or even macros
\def\sometext{the quick brown fox jumps over the lazy dog}
\randomfonts{one, two, three, four}{\sometext}
\end{document}
更新:已更新为仅加载一次 lua 文件,而不是在每次调用宏时加载它。
更新 2:现在使用string.utfcharacters(text)
而不是 ,unicode.utf8.gmatch(text,".")
因为前者看起来更好(它是 lua 字符串库的 luatex 扩展)
更新 3:使lua代码更紧凑,并确保下一个字符始终使用不同的字体。