我想让 LaTeX 从一系列八张图片中随机挑选一张图像文件并将其包含在内。我发现 ''lcg'' 包可以生成随机数:
\usepackage{lcg}
\reinitrand[counter=sec,first=1,last=8]
因此我预计此行将随机包含其中一张图片:
\includegraphics[width=0.6cm]{excl0\rand\arabic{sec}c.png}
其中文件名为 excl01c.png、excl02c.png 等。结果并不像我想象的那样,我收到了一条错误消息:
Runaway definition?
->excl0\cr@nd = 126\advance \cr@nd \inputlineno \multiply \cr@nd 3\advance \ETC
.
! TeX capacity exceeded, sorry [main memory size=3000000].
<argument> Random number generator initiali
zed to \the \cr@nd
我的问题是这种错误的原因是什么,如何修复它,如何让 LaTeX 随机选择图像文件?
答案1
该\rand
指令计算一个随机数并将其存储在sec
计数器中。另一方面,的参数应该\includegraphics
是文件名(宏扩展后),而不是计算它的指令集。
在执行之前先进行计算\includegraphics
:
\rand\includegraphics[width=0.6cm]{excl0\arabic{sec}c.png}
笔记
\rand
将执行一些在“仅扩展”上下文中不允许的计算。作为参数传递给的字符串\includegraphics
(或\input
,使用相同机制)能包含宏,但这些应该能够扩展到仅限字符。
扩展
例如,如果您需要使用编号从 01 到 20 的文件,则必须确保该命令为小于 10 的数字打印填充零;LaTeX 内核提供了\two@digits
此功能:
\makeatletter
\newcommand{\printrandom}{\two@digits{\thesec}}
\makeatother
\rand\includegraphics[width=0.6cm]{excl\printrandom c.png}
对于更多数字,您可以模拟以下行为\two@digits
:
两位数
\newcommand{\printrandom}{\ifnum\value{sec}<10 0\fi\arabic{sec}}
三位数
\newcommand{\printrandom}{\ifnum\value{sec}<100 0\fi\ifnum\value{sec}<10 0\fi\arabic{sec}}
再次使用\rand\includegraphics[width=0.6cm]{excl\printrandom c.png}
答案2
在文件名 do de job 中使用\rand
of\includegraphics
和 the之前。在 MWE 中, to是它们各自的手写数字:\thesec
images1.png
image4.png
\documentclass{article}
\usepackage{lcg}
\reinitrand[counter=sec,first=1,last=4]
\usepackage{graphicx}
\begin{document}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\rand\includegraphics[width=3em]{image\thesec}
\end{document}