我想使用自定义表格环境模拟一个简单的随机字母云,如下所示:
\documentclass{article}
\usepackage{lcg}
\begin{document}
\reinitrand[first=12,last=20,counter=n]
\begin{tabular}[t]{*3{>{\rand\fontsize{\then}{\then}\selectfont}c}}
X & X & X \\
X & X & X \\
X & X & X \\
\end{tabular}
\end{document}
此外,我也想以类似的方式重新定位“单元格”,但这是不可能的,因为表格环境的语法支持声明但不支持命令,例如\put(,){}
换句话说,我想用tabular
序言中的任何声明替换 \put 命令,以避免这种多余的语法:
\newcount\x
\newcount\y
\newcommand{\rndpos}[1]{
\rand\x\then
\rand\y\then
\put(\x,\y){#1}
}
\reinitrand[first=0,last=4,counter=n]
\begin{tabular}[t]{*3{>{\rand\fontsize{\numexpr 3*\then+10}{\then}\selectfont}c}}
\rndpos{X} & \rndpos{X} & \rndpos{X} \\
\rndpos{X} & \rndpos{X} & \rndpos{X} \\
\rndpos{X} & \rndpos{X} & \rndpos{X} \\
\end{tabular}
答案1
使用collcell
。另请参阅如何在每个表列上执行命令
\documentclass{article}
\usepackage{lcg}
%This friend makes the magic
\usepackage{collcell}
%Define a column type so the cell's content is passed as an argument to \rndpos. We can also put the random font size commands here
\newcommand{\rndsz}{%
\rand\fontsize{\numexpr 3*\then+10}{\then}\selectfont%
}
\newcolumntype{Z}{>{\rndsz\collectcell\rndpos}{c}<{\endcollectcell}}
\newcount\x
\newcount\y
\newcommand{\rndpos}[1]{
\rand\x\then
\rand\y\then
\put(\x,\y){#1}
}
\begin{document}
\reinitrand[first=0,last=4,counter=n]
\begin{tabular}[t]{*3{Z}}
X & X & X \\
X & X & X \\
X & X & X \\
\end{tabular}
\end{document}
我认为不需要定义新的环境。
答案2
作为对 JairoAraujo 的精彩答案(赞同)的补充,这里有一个使用 的更简单的实现expl3
。
\documentclass{article}
\usepackage{xparse,collcell}
\usepackage{lmodern}
\ExplSyntaxOn
\NewDocumentCommand{\randomsizeandpos}{m}
{
\fontsize{\int_rand:nn{12}{20}}{0}\selectfont
\put(\int_rand:nn{0}{4},\int_rand:nn{0}{4}){#1}
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{ *{3}{>{\collectcell\randomsizeandpos}c<{\endcollectcell}} }
X & X & X \\
a & b & c \\
X & X & X \\
\end{tabular}
\end{document}