随机格式字母文字

随机格式字母文字

我想随机化某些字母中包含的一些文本。例如:

\random{Dear \name,}{Hello \name,}{Greetings \name,}{Hi \name,}{To \name,}
\random{You are invited to}{You are welcome to}{I would like to invite you to}{This is an invitation to}{You may want to} attend...

编译时,会随机选择其中一个短语使用,因此每个字母都略有不同。如何实现呢?

答案1

这里是基于 Marc 的回答的四个参数的实现。它使用\ifcase而不是\ifodd。因为random(4)返回 1--4,但从\ifcase0 开始,所以第一种情况实际上保持为空。如果需要四个以上的参数,只需将[4]和更改(4)为更高的数字并添加\or#5等。但是,超过 9 个参数需要额外的工作。

\documentclass{article}

\usepackage{pgf}
\newcommand*{\random}[4]{%
    \pgfmathparse{random(4)}%
    \ifcase\pgfmathresult\relax
      \or#1\or#2\or#3\or#4%
    \fi%
}

\begin{document}
% Tests:
\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\random{1}{2}{3}{4}

\end{document}

答案2

使用非常实验性的l3rand包裹(目前位于l3trialLaTeX3 代码库目录中,这意味着它是真的由于不稳定,你可以进行如下操作。

\documentclass{article}
\usepackage{l3rand,xparse}
\ExplSyntaxOn
\rand_seed_from_time:
\cs_generate_variant:Nn \tl_item:nn { nf }
\DeclareDocumentCommand {\random} {m}
  {
    \tl_item:nf {#1} { \rand_range:nn {0} { \tl_length:n {#1} - 1 } }
    \rand_clean:
  }
\ExplSyntaxOff
\begin{document}
\newcommand{\name}{Dave}
\random { {Dear \name,} {Hello \name,} {Greetings \name,} {Hi \name,} {To \name,} }
\random { {You are invited to} {You are welcome to} {I would like to invite you to} {This is an invitation to} {You may want to} }
attend...
\end{document}

现在,\rand_range:nn {<begin>} {<end>}产生介于<begin><end>包括,因此需要减去 1。这以后很可能会改变。此外,\rand_seed_from_time:当任何人使用此解决方案时,可能会重命名。

我在 的整个参数周围添加了括号\random,否则 TeX 就无法轻松地知道它在哪里结束。

答案3

下面的方法应该可以解决问题。出于某种原因,如果不加载整个 tikz 包(pgfmath),我无法让它工作应该已经足够了。

\usepackage{tikz}
\newcommand*{\random}[2]{%
    \pgfmathparse{random(2)}%
    \ifodd\pgfmathresult\relax#1\else#2\fi%
}

相关内容