我试图创造一种效果,就好像文本是由从杂志和报纸上剪下来的字母组成的,即使是相同的单词也有不同的风格。单词中的每个字母都必须有一个随机参数(在预定的范围内):
- 字体(从一些预先选择的字体中)
- 字体大小
- 转动
- 高于或低于基线几个点
当然,这一切都可以手动设置,但这会花费很长时间。如何实现自动化?
答案1
我只知道一种使用 PostScript 的非 LaTeX 解决方案。因为 PostScript 是一种编程语言,它可以在排版文本时随机选择字体。ransom.ps
曾经有一个使用这种效果的 程序由 Diomidis Spinellis 出版在 Usenet 上。描述如下:
这是一个小型的 PostScript 程序,可用于创建勒索信。在脚本开头的括号之间输入所需的文本,然后将整个文件发送到 PostScript 打印机。文本将使用多种不同的字体、大小、方向和样式打印。您可以通过修改源来修改边距和使用的字体。
执行 PostScript 代码ransom.ps
得到以下结果:
答案2
编辑:我将文本改为与 Christian Lindig 相同,并添加了几种字体。
这是使用非常实验性的随机数包的部分解决方案l3rand
。可以在 LaTeX3 源代码的 l3trial 目录中找到它(例如,参见GitHub 镜像)。
我从来没有花时间去学习如何加载其他字体,所以您应该自定义中给出的字体更改命令列表\c_anon_fonts_clist
。
\documentclass{article}
\usepackage{xcolor,graphicx}
\usepackage{expl3,l3rand,xparse}
\usepackage{bbold}
\ExplSyntaxOn
\cs_generate_variant:Nn \clist_item:Nn { Nf }
\clist_const:Nn \c_anon_fonts_clist
{
\fontfamily{antt}\selectfont\bfseries,
\fontfamily{antt}\selectfont\itshape,
\fontfamily{antt}\selectfont,
\bfseries,
\bbfamily,
\itshape,
\scshape,
\rmfamily
}
\cs_new_protected:Npn \anon_random_font:
{
\clist_item:Nf \c_anon_fonts_clist
{ \rand_range:nn { 0 } { \clist_length:N \c_anon_fonts_clist - 1 } }
}
\cs_new_protected:Npn \anon_random_box:n #1
{
\rotatebox [origin=c] { \rand_range:nn {-15} {15} }
{
\exp_args:Nx \scalebox
{ 1 . \rand_range:nn { 0 } { 99 } }
{ \rand_clean: #1 }
}
}
\cs_new_protected:Npn \anon_one_letter:n #1
{
\anon_random_box:n
{
\int_if_odd:nF { \rand_range:nn {0}{1} }
{ \colorbox[gray]{ 0.\rand_range:nn {0}{99} } }
{
\color[gray]{ 0.\rand_range:nn {0}{99} }
\anon_random_font:
\anon_random_box:n { \scalebox{.8}{#1} \rand_clean: }
}
}
}
\DeclareDocumentCommand { \AnonymousLetter } { o m }
{
\IfValueT {#1} { \rand_seed:n { #1 } }
\seq_set_split:Nnn \l_anon_seq { ~ } {#2}
\seq_map_inline:Nn \l_anon_seq
{
\tl_map_function:nN {##1} \anon_one_letter:n
\hskip \rand_range:nn { 3 } { 10 } pt \scan_stop:
\penalty 2000\scan_stop:
\rand_clean:
}
}
\ExplSyntaxOff
\begin{document}
\raggedright\pagestyle{empty}
\AnonymousLetter{Mr. Diomidis Spinellis}
\AnonymousLetter{This is a message from an international terrorist group.
We have abducted your files and have hidden them away.
You must pay \$500 by Sunday afternoon in order to see them again.
You will receive further telephone instructions.
Do not notify the police or any authorities; you will endager their life.}
\AnonymousLetter{Remember: time flies!}
\end{document}
\AnonymousLetter
使用 循环遍历输入中的单词\seq_map_inline:Nn
,对于单词中的每个字母 ( \tl_map_function:nN
) 用随机参数将该字母包装在一堆框中。该函数\anon_random_box:n
定义为\scalebox
和的组合\rotatebox
。产生浮点随机数的方法有些笨拙,因为我还没有编写浮点随机数程序,我将整数和小数部分粘合在一起。
第一个可选参数\AnonymousLetter
是 RNG 的种子。您可能想尝试一下这个参数和其他参数,以适合您的用例。我得到的输出是: