对相同字母随机重复使用自定义字体(第一次迭代使用自定义字体 1,第二次迭代使用自定义字体 2,依此类推)

对相同字母随机重复使用自定义字体(第一次迭代使用自定义字体 1,第二次迭代使用自定义字体 2,依此类推)

我有一些自定义字体已导入到我的字体册中(我使用的是 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}

代码输出

相关内容