我有一些自定义字体已导入到我的字体册中(我使用的是 macOS 机器并使用 XeTeX)。
我可以导入那些自定义字体,并写下答案用于更改每个字母的字体的包?,但在该答案中,字母似乎会使用自定义字体,但重复字母时不会改变。我正在寻找一个可以随着字母的使用而改变字母的答案。
我所说的迭代是什么意思?假设我们使用 Helvetica、Courier 和 Comic Sans MS。我们试图写出“Lorem amet consectetur elit”这个句子。
- Lorem 中的 e 将使用 Helvetica 字体
- amet 中的 e 将使用 Comic Sans MS 字体
- consectetur 中的 e 将使用 Courier 字体
- elit 中的 e 将使用 Helvetica 字体
顺序不必遵循 [Helvetica、Courier 和 Comic Sans MS],我希望它是随机的。换句话说:
- Lorem 中的 e 可以使用 Comic Sans MS 字体
- amet 中的 e 可以使用 Courier 字体
- consectetur 中的 e 可以使用 Helvetica 字体
- elit 中的 e 可以使用 Courier 字体
是可行的。我的目标是实现一个文档,其中句子的字母会随机使用字母的字体样式,并且会随着字母的再次使用而改变。它不遵循使用字体的严格方式。
看来这个问题已经得到解答了随机字体,呈现手写效果(参见示例图像,特别是其äöüß
部分。)
有了这些答案,我尝试将第一个答案(fontspec import ttf)集成到第二个答案中,但似乎没有成功,而是只使用默认字体。
上图中,是我对这两个答案进行整合的结果。我执行了\usepackage{fontspec}
,\setmainfont{My-Custom-Font}
,并设置\pgfmathdeclarerandomlist{fontlist}{{lmr}{lmdh}
为\pgfmathdeclarerandomlist{fontlist}{{my-custom-font}{lmdh}
。my-custom-font
不是字体的名称,只是一个占位符。
它似乎不起作用,因此我在这里问这个问题,我希望得到一个可行的答案,非常感谢。
PS:我尝试按照说明导入字体用于更改每个字母的字体的包?,它确实有效。我只是困惑于如何像在第一个答案中那样导入我的自定义字体,以及如何像在第二个答案中那样导入到迭代时改变字体的模式中,其中似乎导入的是字体代码而不是字体名称(https://www.overleaf.com/learn/latex/font_typefaces)。
再次感谢您。希望我能够清楚地解释我的问题。
答案1
改编这个答案给出的答案并不难:
来fontspec
代替旧字体使用的 PSNFSS 命名系统。我们只需要将\rndfont
命令更改为使用以下定义的字体系列的名称\newfontfamily
:
\newcommand*{\rndfont}{\pgfmathrandomitem\z{fontlist}\csname\z\endcsname}
然后我们改变随机列表以包含这些名称:
\pgfmathdeclarerandomlist{fontlist}{{helvetica}{comic}{courier}}
完整代码如下:
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\setmainfont{Helvetica}
\newfontfamily\helvetica{Helvetica}
\newfontfamily\comic[Scale=MatchUppercase]{Comic Sans MS}
\newfontfamily\courier{Courier}
\usepackage{censor}
\makeatletter
\DeclareTextFontCommand{\textrndfont}{\rndfont}
\newcommand*{\rndfont}{\pgfmathrandomitem\z{fontlist}\csname\z\endcsname}
\pgfmathdeclarerandomlist{fontlist}{{helvetica}{comic}{courier}}
\def\stringend{$}
\long\def\randomfont#1{%
\protected@edef\tmp{#1}%
\def~{-}\expandafter\random@Block\tmp\stringend\let~\sv@tilde}
\long\def\random@Block{\IfNextToken\stringend{\@gobble}%
{\IfNextToken\@sptoken{ \bl@t{\random@Block}}%
{\bl@t{\random@Block}}}}
\long\def\bl@t#1#2{%
\ifx\bpar#2\let\next\par\else\def\next{\textrndfont{#2}}\fi
\next#1}
\makeatother
\begin{document}
\randomfont{This text should be in random fonts äöüß. It's quite long and should line wrap. I wonder what happens if it has a double blank line in it.
Let's find out whether it starts a new paragraph at the beginning of this sentence. Yes}
\randomfont{This text should be in random fonts äöüß}\par
\end{document}