我目前正在使用 pdflatex 编写一份技术报告,并注意到我过度使用了术语“wrt”(至少我为它写了一个命令)。
有没有办法编写一个宏,随机选择“x”,其中“x 在{相对于;关于;关于;...}”中,这样我就不必在文档中手动替换命令 \wrt 的每个实例?
附言:我尝试使用搜索功能,但没有找到任何合适的内容。如果有的话,我很乐意接受礼貌的重定向。:)
答案1
这是一个非常简单的解决方案,它不依赖于外部包:
\documentclass{article}
\makeatletter
\newcount\wrt@counter
\newcommand\wrt{%
\begingroup
\def\alts{3}% <-- the number of alternatives
\count0=\numexpr17*\pagetotal/7+\wrt@counter\relax
\global\wrt@counter=\numexpr\wrt@counter+1\relax
\count0=\numexpr\count0-\count0/\alts*\alts\relax
\ifcase\count0 with respect to\or concerning\else with regard to\fi
\endgroup
}
\makeatother
\begin{document}
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx \wrt\
xxxx xxx xx xxxxxxx xxxx xxx xx xxxxxxx
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\wrt\par
\end{document}
选择短语的方法为,获取的当前值\pagetotal
,即所有页面内容的当前高度,将其转换为整数(加上一些因素以增加随机性),最后使用该数字对短语备选数量取模。
除了简单之外,在大多数情况下,它应该在多个构建中产生相同的结果。
编辑:我添加了一个额外的全局计数器,这样在\wrt
同一行或同一段落中多次出现仍然会产生不同的结果。
答案2
如果您使用的是 TikZ(或 pgf),这里有一个使用 pgf 数学函数的简单解决方案。只需使用pgfmathdeclarerandomlist
声明可能的选择列表,然后pgfmathrandomitem
从该列表中随机选择一个条目即可。有关更多详细信息,请参阅pgf 文档。
\documentclass{article}
\usepackage{tikz}%
\pgfmathdeclarerandomlist{words}{%
{one}%
{two}%
{three}%
{four}%
}%
\begin{document}
Here is the first randomly chosen word: \pgfmathrandomitem{\word}{words} \word
Here is the second randomly chosen word: \pgfmathrandomitem{\word}{words} \word
And a third one: \pgfmathrandomitem{\word}{words} \word
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。它设置了一个名为 的 LaTeX 宏,\wrt
该宏调用一个 Lua 函数,该函数依次从包含所有可能短语的表中随机挑选并打印其中一个条目。
% !TeX program = lualatex
\documentclass{article}
%% Lua-side code: (a) Table with all possible phrases ('nn' entries)
%% (b) Function that randomly picks off and prints a phrase
\directlua{
wrt_choices = { "with respect to",
"concerning",
"with regard to" }
nn=0; for _ in pairs(wrt_choices) do nn=nn+1 end
function wrt_print ()
tex.sprint ( wrt_choices[math.random(nn)] )
end
}
%% LaTeX-side code: Macro that invokes the Lua function "wrt_print"
\newcommand\wrt{\directlua{wrt_print()}}
\begin{document}
\wrt, \wrt, \wrt, \wrt, \wrt
\end{document}
答案4
您可以使用lcg
创建随机数并\ifcase
根据随机数选择文本:
\documentclass{article}
\usepackage[first=0, last=2]{lcg}
% \rand generates new random integer, \therand returns it
\newcommand{\wrt}{%
\rand
\ifcase\therand
with respect to%
\or
concerning%
\else
with regard to%
\fi
}
\begin{document}
\wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\
\wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\
\wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\ \wrt\
\end{document}