使用之前对命令参数进行四舍五入

使用之前对命令参数进行四舍五入

我是 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

一种方法是这样的。ceilfloor是的替代品。正如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(默认)、floorceil之间进行选择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)或任何您想要的计算。

相关内容