我读LaTeX \if 条件和算法中 if 和 then 怎么写?,但到目前为止我还没意识到这一点。
我正在尝试创建一个名为dottedSkill如下图所示。其背后的逻辑是:
- 接收两个参数
- 对计数器 x 从 1 迭代到 #2
- 如果我的计数器已填充 > 0,我将绘制一个完整的点并减少计数器
- 否则我就画一个空点
\newcommand{\dottedSkill}[2]{
%parameter 1 the filled dots
%parameter 2 the max dots
\newcounter{x}
\newcounter{filled}
\setcounter{filled}{#1}
\forloop{x}{1}{\value{x} <= #2}
{
\ifnum \filled<1
\Circle
\else
\CIRCLE
\addtocounter{filled}{-1}
\fi
}
}%
我不确定问题是否出在命令定义上还是其他地方,但是当我在文件上调用它时,我得到:
- 未定义的控制序列。\dottedSkill{2}{9}。
- 缺失数字,视为零。\dottedSkill{2}{9}
- 未定义的控制序列。\dottedSkill{2}{9}。
- 缺失数字,视为零。\dottedSkill{2}{9}
我的函数写得正确吗?
答案1
您的设置当前存在的问题是您正在定义filled
计数器每一个运行时\dottedSkill
。您应该将这些定义从\dottedSkill
命令中拉出来。
另外,您应该只绘制实心圆圈,然后绘制空心圆圈:
\documentclass{article}
\usepackage{multido}
\newcommand{\Circle}{\textbullet}
\newcommand{\CIRCLE}{$\circ$}
\newcommand{\dottedSkill}[2]{%
%parameter 1 the filled dots
%parameter 2 the max dots
\multido{\ix=1+1}{#1}{\Circle}%
\ifnum#1<#2 \multido{\ix=#1+1}{\numexpr#2-#1}{\CIRCLE}\fi
}%
\begin{document}
\dottedSkill{2}{9}
\dottedSkill{0}{9}
\dottedSkill{10}{9}
\dottedSkill{5}{9}
\end{document}
答案2
\documentclass{article}
\usepackage{forloop}
\newcounter{x}
\newcounter{filled}
\newcommand{\dottedSkill}[2]{%
%parameter 1 the filled dots
%parameter 2 the max dots
\setcounter{filled}{#1}%
\forloop{x}{0}{\value{x} < #2}%
{%
\ifnum \thefilled < 1
$\circ$%\Circle
\else
$\bullet$%\CIRCLE
\addtocounter{filled}{-1}%
\fi
}%
}%
\begin{document}
\dottedSkill{2}{9}
\end{document}
答案3
第一个问题是,你是否真的需要条件。只有在 XY 问题的情况下(真正的问题不是让循环工作,而是用带有两个参数的宏进行评分),这里才有一个更简单的方法:
\documentclass{article}
\newcommand\score[2][10]{
\makebox[#2em]{\cleaders\hbox to 1em{\Large\hss$\bullet$\hss}\hfill}%
\makebox[\dimexpr#1em-#2em]{\cleaders\hbox to 1em{\Large\hss$\circ$\hss}\hfill}\par}
\begin{document}
\score[5]{0}
\score[5]{1}
\score[5]{3}
\score[5]{5}
\score{0}
\score{3}
\score{6}
\score{10}
\end{document}
答案4
感谢大家,我能够对此进行微调。
我使用这个链接作为圆圈类型的参考:https://aneescraftsmanship.com/circle-symbols%E2%97%8B%E2%97%8F%E2%97%8D%E2%97%97%E2%97%94%E2%97%99%E2%A6%BF-in-latex/
\usepackage{wasysym}
\newcommand{\EmptyDot}{\Circle}
\newcommand{\FilledDot}{$\CIRCLE$}
\newcommand{\dottedSkill}[2]{%
%parameter 1 the filled dots
%parameter 2 the max dots
\multido{\ix=1+1}{#1}{\FilledDot}%
\ifnum#1<#2 \multido{\ix=#1+1}{\numexpr#2-#1}{\EmptyDot}\fi
}%