我想随机化某些字母中包含的一些文本。例如:
\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,但从\ifcase
0 开始,所以第一种情况实际上保持为空。如果需要四个以上的参数,只需将[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
包裹(目前位于l3trial
LaTeX3 代码库目录中,这意味着它是真的由于不稳定,你可以进行如下操作。
\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%
}