我是 LaTeX 新手,发现了一个有用的自定义命令,可以重复文本 n 次这里. 下面是一个使用示例
\documentclass{minimal}
\usepackage{pgffor}
\newcommand{\myrepeat}[2]{\foreach \n in {1,...,#1}{#2}}
\begin{document}
\myrepeat{6}{x} % prints xxxxxx
\end{document}
我的目标是将十进制数作为命令的第一个参数(而不是当前的整数)。命令中的 for 循环应该四舍五入小数来确定要执行多少次迭代。这样,我以后只需更新一个命令就可以普遍更改舍入模式(即向下取整、向上取整、最接近的整数等)。例如
\myrepeat{3.2}{x} % should print xxx
\myrepeat{3.7}{x} % should print xxxx
我怎样才能实现这种行为?
大多数其他线程我只见过处理打印舍入/上限/下限符号而不是实际执行四舍五入数学并允许您在进一步的计算中使用结果数字。
答案1
一种方法是这样的。ceil
和floor
是的替代品。正如Alan Munn在评论中提到的那样,每个版本round
都有命令版本,即\pgfmathround{#1}
,,,。\pgfmathceil{#1}
\pgfmathfloor{#1}
\documentclass{article}
\usepackage{pgffor}
\newcommand{\myrepeat}[2]{%
\pgfmathparse{round(#1)}% set rounding function here
\foreach \n in {1,...,\pgfmathresult}{#2}}
\begin{document}
\myrepeat{3.2}{x} % should print xxx
\myrepeat{3.7}{x} % should print xxxx
\end{document}
答案2
这是一个相当通用的宏,您可以在其中将模式设置为可选参数:在round
(默认)、floor
或ceil
之间进行选择nearest
。
该\generalrepeat
宏接受起点(整数)、步长(整数,默认为 1)和终点(浮点数)。
该\myrepeat
宏是简化版本,始终从 1 开始,以步骤 1 开始。
在最后一个参数(要重复的代码)中,循环中的当前值用表示#1
。
\documentclass{article}
\usepackage{xfp}
\ExplSyntaxOn
\NewDocumentCommand{\generalrepeat}
{
O{round} % the mode
m % the starting point
O{1} % the step
m % the final point
+m % the code to repeat (can contain \par)
}
{
\klinke_repeat_general:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
\NewDocumentCommand{\myrepeat}
{
O{round} % the mode
m % the final point
+m % the code to repeat (can contain \par)
}
{
\klinke_repeat_general:nnnnn { #1 } { 1 } { 1 } { #2 } { #3 }
}
\cs_new_protected:Nn \klinke_repeat_general:nnnnn
{
\cs_set_eq:Nc \__klinke_repeat_mode:n { __klinke_repeat_#1:n }
\cs_set_protected:Nn \__klinke_repeat_code:n { #5 }
\int_step_function:nnnN
{ #2 } % start
{ #3 } % step
{ \__klinke_repeat_mode:n { #4 } } % end
\__klinke_repeat_code:n % action
}
\cs_new:Nn \__klinke_repeat_round:n { \fp_eval:n { round(#1,0,1) } }
\cs_new:Nn \__klinke_repeat_floor:n { \fp_eval:n { floor(#1,0) } }
\cs_new:Nn \__klinke_repeat_ceil:n { \fp_eval:n { ceil(#1,0) } }
\cs_new:Nn \__klinke_repeat_nearest:n
{
\fp_eval:n { #1 - floor(#1,0) < 0.5 ? floor(#1,0) : ceil(#1,0) }
}
\ExplSyntaxOff
\begin{document}
\generalrepeat{1}{3.4}{#1 }---
\generalrepeat{1}{3.5}{#1 }---
\generalrepeat{1}{3.6}{#1 }
\generalrepeat[ceil]{1}{3.4}{#1 }---
\generalrepeat[ceil]{1}{3.5}{#1 }---
\generalrepeat[ceil]{1}{3.6}{#1 }
\generalrepeat[floor]{1}{3.4}{#1 }---
\generalrepeat[floor]{1}{3.5}{#1 }---
\generalrepeat[floor]{1}{3.6}{#1 }
\generalrepeat[nearest]{1}{3.4}{#1 }---
\generalrepeat[nearest]{1}{3.5}{#1 }---
\generalrepeat[nearest]{1}{3.6}{#1 }
\myrepeat{3.4}{x}---\myrepeat[floor]{3.4}{x}---%
\myrepeat[ceil]{3.4}{x}---\myrepeat[nearest]{3.4}{x}
\myrepeat{3.5}{x}---\myrepeat[floor]{3.5}{x}---%
\myrepeat[ceil]{3.5}{x}---\myrepeat[nearest]{3.5}{x}
\myrepeat{3.6}{x}---\myrepeat[floor]{3.6}{x}---%
\myrepeat[ceil]{3.6}{x}---\myrepeat[nearest]{3.6}{x}
\end{document}
round
当出现平局时(3.5 的情况),和整数均nearest
会向上移动。
答案3
您可以使用可扩展功能xfp
:
\documentclass{article}
\usepackage{pgffor,xfp}
\newcommand{\myrepeat}[2]{\foreach \n in {1,...,\fpeval{floor(#1)}}{#2}}
\begin{document}
\myrepeat{6}{x} % prints xxxxxx
\myrepeat{3.2}{x} % prints xxx
\myrepeat{8.1 * sin(pi / 6)}{x}% prints xxxx sin(pi/6) = 1/2; 8.1 * 1/2 = 4.05
\end{document}
您可以使用ceiling(#1)
、或round(#1,0)
或任何您想要的计算。