匿名信的影响

匿名信的影响

我试图创造一种效果,就好像文本是由从杂志和报纸上剪下来的字母组成的,即使是相同的单词也有不同的风格。单词中的每个字母都必须有一个随机参数(在预定的范围内):

  • 字体(从一些预先选择的字体中)
  • 字体大小
  • 转动
  • 高于或低于基线几个点

当然,这一切都可以手动设置,但这会花费很长时间。如何实现自动化?

答案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 的种子。您可能想尝试一下这个参数和其他参数,以适合您的用例。我得到的输出是:

匿名信代码的输出

相关内容