用于更改每个字母的字体的包?

用于更改每个字母的字体的包?

我想写一段文字,其中每个字母使用不同的字体。这段文字比较短。我想我可以逐个字母地写,为每个字母选择我想要的字体。

有没有更简单的方法?

答案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代码更紧凑,并确保下一个字符始终使用不同的字体。

相关内容