现在,我正在使用 pdftex 生成随机颜色
\definecolor{randomcolor}{RGB}
{
\pdfuniformdeviate 255,
\pdfuniformdeviate 255,
\pdfuniformdeviate 255
}
一切运行良好,直到我尝试使用 luatex 进行编译。
生成随机颜色(直接或通过生成 3 个随机数)的最佳方法是什么,并且与 pdftex 和 luatex 兼容?
我怀疑有些事情涉及前列腺素是答案。或者可能只是一个条件,其中一个分支用于 pdftex(看起来像当前分支),另一个用于 luatex(可能调用一小段 luacode)。
答案1
该luatex85
包确实
\let\pdfuniformdeviate\uniformdeviate
你可以这样做\usepackage{luatex85}
或
\documentclass{article}
\usepackage{xcolor}
\unless\ifdefined\pdfuniformdeviate
\let\pdfuniformdeviate\uniformdeviate
\fi
\definecolor{randomcolor}{RGB}
{
\pdfuniformdeviate 255,
\pdfuniformdeviate 255,
\pdfuniformdeviate 255
}
\extractcolorspec{randomcolor}\test
\typeout{\test}
\stop
这将输出类似
{rgb}{0.84706,0.4,0.68234}
同时使用pdflatex
或lualatex
。我猜,当 中也可以使用随机数时xelatex
,会将一个通用接口添加到 LaTeX 内核中。
答案2
另一种方法基于pgf
:
\documentclass{article}
\usepackage{pgf}
\usepackage{pgffor}
\usepackage{xcolor}
\usepackage{ifluatex}
\usepackage{ifxetex}
\ifluatex
\let\pdfrandomseed\randomseed
\fi
\ifxetex
\pgfmathsetseed{\time}
\else
\pgfmathsetseed{\number\pdfrandomseed}
\fi
\newcommand{\randomcolor}{%
\pgfmathsetmacro{\R}{rnd}%
\pgfmathsetmacro{\G}{rnd}%
\pgfmathsetmacro{\B}{rnd}%
\definecolor{randomcol}{rgb}{\R,\G,\B}%
}
\begin{document}
\noindent%
\foreach \n in {1,...,1350}{%
\randomcolor\color{randomcol}\rule{0.41cm}{0.41cm}\-%
}
\end{document}
答案3
还有lcg
包(Linear Congruential Generator 的缩写),可与所有编译器配合使用,包括lualatex
。该包提供了一个命令\rand
来生成随机数并将其存储在rand
计数器中。要在 中使用,\definecolor
您应该使用 转换计数器\the\value
。
first
您可以使用包选项和设置随机生成器的界限last
,也可以使用命令在文档中更改它们\reinitrand
。默认种子基于系统时钟,以分钟为单位(因此输出每分钟只会更改一次)。您还可以提供自定义种子。
梅威瑟:
\documentclass{article}
\usepackage[first=1,last=255]{lcg}
\usepackage{xcolor}
\rand\edef\colora{\the\value{rand}}
\rand\edef\colorb{\the\value{rand}}
\rand\edef\colorc{\the\value{rand}}
\definecolor{randomcolor}{RGB}
{
\colora,
\colorb,
\colorc
}
\begin{document}
\colorbox{randomcolor}{Random color: \colora,\colorb,\colorc}
\end{document}
结果: