我创建了一个带有随机化器的 Metafont 字体,这样每次编译字体时,它看起来都会不一样。使用这些字体,我喜欢在文档中创建手写部分。我想使用 10 到 20 个不同版本的字体,每个字母都会随机选择一种字体。如果没有随机字体,例如,所有的 e 看起来都会一样。
我想到三种可能的方法:
- 为文档中的每个新字母随机选择一种字体。
- 创建百种字体,每种字体都只有一个字母,并有多种变体。对于文档中的每个字母,从相应的字体中随机选择一个字母。
- 依次加载字体,第一个字符,第一个字体,第二个字符,第二个字体......然后从头开始第 21 个字符。
我尝试使用上述选项,但我没有足够的能力获得结果。我在 Overleaf 上使用 pdfLaTex,但如果它只适用于 LuaLaTeX 或 XeLaTex,那就太好了。
我是德国人,所以字母 ä、ö、ü、ß、Ä、Ö、Ü(作为直接输入)和 €(作为 \euro)也应该可以使用。
编辑:
我使用评论中提供的链接编写了一个程序。它们可以很好地处理普通字母,但变音符似乎不起作用。下面是一个最小的工作示例:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{datatool}
\usepackage{pgffor}
\usepackage{pgfmath}
\usepackage{pgffor}
\usepackage{pgfmath}
\def\klein{% random non capital letter
\pgfmathrandominteger{\mytemp}{1}{26}%
\foreach\x[count=\xi] in{a,...,z}{\ifnum\xi=\mytemp\x\breakforeach\fi}%
}
\def\gross{% random capital letter
\pgfmathrandominteger{\mytemp}{1}{26}%
\foreach\x[count=\xi] in{A,...,Z}{\ifnum\xi=\mytemp\x\breakforeach\fi}%
}
\newfont{\fontA}{A} % includes A a
\newfont{\fontB}{B} % includes B b
\newfont{\fontAE}{AE} % includes Ä ä
\newfont{\fontOE}{OE} % includes Ö ö
\newfont{\fontUE}{UE} % includes Ü ü
\newfont{\fontSS}{SS} % includes ß
\makeatletter
\newcommand{\Buchstabe}[2]{\csdef{BT#1}{{#2}}}
\newcommand{\Bs}[1]{\ifcsdef{BT\expandafter#1}{\csuse{BT#1}}{#1}}
\def\Handschrift#1{%
\@Handschrift#1 \@empty
}
\def\@Handschrift#1 #2{%
\zz{#1}\space
\ifx #2\@empty\else
\expandafter\@Handschrift
\fi
#2%
}
\def\zz#1{\def\zzsep{}\zzz#1\relax}
\def\zzz#1{\ifx\relax#1\else\Bs{#1}\expandafter\zzz\fi}
\makeatother
\Buchstabe{A}{\fontA \gross}
\Buchstabe{B}{\fontB \gross}
\Buchstabe{Ä}{\fontAE \gross}
\Buchstabe{Ö}{\fontOE \gross}
\Buchstabe{Ü}{\fontUE \gross}
\Buchstabe{a}{\fontA \klein}
\Buchstabe{b}{\fontB \klein}
\Buchstabe{ä}{\fontAE \klein}
\Buchstabe{ö}{\fontOE \klein}
\Buchstabe{ü}{\fontUE \klein}
\Buchstabe{ß}{\fontSS \klein}
\begin{document}
\Handschrift{AB ab} % works fine
\Handschrift{äöüß ÄÖÜ} % Does not work
\end{document}
我也尝试在 \Handschrift{} 和 \Buchstabe{} 中使用“a”和“\”a,但出现了错误消息。
答案1
这将从已加载字体及其简称的列表中为每个字母随机选择一种字体,摘自 Overleaf。您需要用自己的列表替换此列表。
解析方法是 David Carlisle 的关于使censor
包处理德语字符的这个答案(因此对 的依赖censor
,我应该能够将其减少为对 的依赖ifnextok
,但我目前没有时间
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{lmodern}
\usepackage{tgtermes}
\usepackage{tgpagella}
\usepackage{tgbonum}
\usepackage{tgschola}
\usepackage{mathptmx}
\usepackage{utopia}
\usepackage{palatino}
\usepackage{bookman}
\usepackage{charter}
\usepackage{tgadventor}
\usepackage{tgheros}
\usepackage{helvet}
\usepackage{tgcursor}
\usepackage{courier}
\usepackage{censor}
\makeatletter
\DeclareTextFontCommand{\textrndfont}{\rndfont}
\newcommand*{\rndfont}{\pgfmathrandomitem\z{fontlist}\fontfamily{\z}\selectfont}
\pgfmathdeclarerandomlist{fontlist}{{lmr}{lmdh}{qtm}{qpl}{qbk}{qcs}{ptm}{put}{ppl}{pbk}{bch}{cmss}{lmss}{qag}{qhv}{phv}{cmtt}{lmtt}{qcr}{pcr}}
\def\stringend{$}
\def\stringend{$} %repeated to avoid confusing my editor's syntax highlighting
\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}
答案2
由于你使用 MF 来生成字体,因此你可以使用 TeX 的原生连字/字符替换功能,根据上下文使用字母的替代版本,例如不同的埃可能会被使用,无论是否遵循吨或者H。它不会给你完全的随机性,因为每个实例,例如,特看起来一样。