我想使用随机区分大小写来编译一段代码。我该如何实现呢?
无 LaTeX 伪代码:
x = rand(1,4) // random number between 1 and 4
if( x == 1 )
Let us talk about apples!
else if( x == 2 )
Let us talk about pears!
else if( x == 3 )
Let us talk about plums!
else
Let us talk about cherries!
实现这一目标的最佳方法是什么?我也想在数学环境中使用它。
答案1
您可以创建一个命令,从列表中输出随机项目。
如果项目包含多个标记,则必须用括号括起来。
有两个版本:第一个版本定义一个命令(适合长列表),第二个版本可以内联使用。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\makerandomchoice}{mm}
{
\shuhalo_random_choice_make:Nn #1 { #2 }
}
\NewExpandableDocumentCommand{\randomchoice}{m}
{
\shuhalo_random_choice:n { #1 }
}
\cs_new_protected:Nn \shuhalo_random_choice_make:Nn
{
\cs_new:Npn #1
{
\shuhalo_random_choice:n { #2 }
}
}
\cs_new:Nn \shuhalo_random_choice:n
{
\tl_item:nn { #1 } { \int_rand:nn { 1 } { \tl_count:n { #1 } } }
}
\ExplSyntaxOff
\makerandomchoice{\talk}{
{Let us talk about apples!}
{Let us talk about pears!}
{Let us talk about plums!}
{Let us talk about cherries!}
}
\makerandomchoice{\letter}{ABCDEFGHIJKLMNOPQRSTUVWXYZ}
\begin{document}
\talk
\talk
\talk
\talk
\talk
\letter\letter\letter\letter\letter\letter\letter\letter
\letter\letter\letter\letter\letter\letter\letter\letter
\randomchoice{{Pear}{Apple}{Plum}{Cherry}}
\randomchoice{{Pear}{Apple}{Plum}{Cherry}}
\randomchoice{{Pear}{Apple}{Plum}{Cherry}}
\randomchoice{{Pear}{Apple}{Plum}{Cherry}}
\end{document}
项目之间的空格将被忽略。
答案2
如果您了解 R 和knitr
,则可以使用一些与您的伪代码非常相似的代码来实现:
\documentclass{article}
\begin{document}
<<fruit-roulette,echo=F,cache=FALSE>>=
x <- sample(1:4, 1)
talk <- if( x == 1 ) {"apples"} else {
if( x == 2 ) {"pears"} else {
if( x == 3 ) {"plums"} else {
if( x == 4 ) {"cherries"}}}}
@
Because $x=\Sexpr{x}$, let us talk about \Sexpr{talk}!
\end{document}
在每次编译中,LaTeX 文本可能会发生变化,可能的结果如下:
正如您在此处看到的,\Sexpr{}
可以在数学和文本模式下使用,但要考虑到 R 输出将根据 LaTeX 规则进行格式化(例如,作为foo
R 对象“大苹果”,\Sexpr{foo}
或者$\mbox{\Sexpr{foo}}$
将只产生“大苹果”,但\Sexpr{talk}
会产生“大苹果“。