我正在创建自己的简历,我想添加一个命令来生成以下内容:
我确实成功做到了这一点,具体如下:
\usepackage{scalerel}
\usepackage{amssymb}
\newcommand\openbigstar[1][0.7]{%
\scalerel*{%
\stackinset{c}{-.125pt}{c}{}{\scalebox{#1}{\color{white}{$\bigstar$}}}{%
$\bigstar$}%
}{\bigstar}
}
$\bigstar\bigstar\openbigstar[0.5]\openbigstar[.9]\openbigstar[.9]$
但是每次我需要输入五个命令时,我们可以在一个命令中将其点化并接受 1 到 5 之间的参数吗?(基本上做复杂的循环)
答案1
欢迎!对于第一近似值,你可以这样做
\documentclass{article}
\usepackage{xcolor}
\usepackage{amssymb}
\usepackage{scalerel}
\usepackage{stackengine}
\newcounter{iloop}
\newcommand\openbigstar[1][0.7]{%
\scalerel*{%
\stackinset{c}{-.125pt}{c}{}{\scalebox{#1}{\color{white}{$\bigstar$}}}{%
$\bigstar$}%
}{\bigstar}
}
\newcommand{\Stars}[1]{\ensuremath{\setcounter{iloop}{0}%
\loop\stepcounter{iloop}\ifnum\value{iloop}<#1
\bigstar\repeat
\openbigstar[0.5]
\setcounter{iloop}{0}%
\loop\stepcounter{iloop}\ifnum\value{iloop}<\the\numexpr6-#1\relax
\openbigstar[.9]\repeat}}
\begin{document}
\Stars{5}
\Stars{4}
\Stars{3}
\Stars{2}
\Stars{1}
\end{document}
我不清楚您是否也想授予部分星级。
附录:如果你想允许分数评级,你可以这样做
\documentclass{article}
\usepackage{xcolor}
\usepackage{amssymb}
\usepackage{scalerel}
\usepackage{stackengine}
\usepackage{pgf}
\newcounter{iloop}
\newcommand\openbigstar[1][0.7]{%
\scalerel*{%
\stackinset{c}{-.125pt}{c}{}{\scalebox{#1}{\color{white}{$\bigstar$}}}{%
$\bigstar$}%
}{\bigstar}
}
\newcommand{\Stars}[1]{\ensuremath{%
\pgfmathtruncatemacro{\imax}{ifthenelse(int(#1)==#1,#1-1,#1)}%
\pgfmathsetmacro{\xrest}{0.9*(1-#1+\imax)}%
\setcounter{iloop}{0}%
\loop\stepcounter{iloop}\ifnum\value{iloop}<\the\numexpr\imax+1
\bigstar\repeat
\openbigstar[\xrest]%
\setcounter{iloop}{0}%
\loop\stepcounter{iloop}\ifnum\value{iloop}<\the\numexpr5-\imax\relax
\openbigstar[.9]\repeat}}
\begin{document}
\Stars{5}
\Stars{4.2}
\Stars{3.6}
\Stars{2}
\Stars{1.3}
\Stars{0.3}
\end{document}
如果使用整数时缺少最后一颗实心星的臂,则只需减去 0.01,即 4.99 而不是 5。
或者 Ti钾Z 版本,显然其可定制性更强。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\newcommand{\Stars}[2][fill=yellow,draw=orange]{\begin{tikzpicture}[baseline=-0.35em,#1]
\foreach \X in {1,...,5}
{\pgfmathsetmacro{\xfill}{min(1,max(1+#2-\X,0))}
\path (\X*1.1em,0)
node[star,draw,star point height=0.25em,minimum size=1em,inner sep=0pt,
path picture={\fill (path picture bounding box.south west)
rectangle ([xshift=\xfill*1em]path picture bounding box.north west);}]{};
}
\end{tikzpicture}}
\begin{document}
\Stars{4.5}
\Stars{4.2}
\Stars{3.6}
\Stars{2}
\Stars{1.3}
\Stars{0.3}
\end{document}
答案2
TeX 在技术上是图灵完备的,但有些编程概念比其他语言更难一些。循环就是其中之一。但它们肯定是可行的。我不知道你从哪里得到的\bigstar
,所以我不能具体做到这一点;但这是执行循环的一般 TeX 方式:
\documentclass{article}
\begin{document}
\newcount\loopi\loopi=0
\loop\ifnum\loopi<5
Hey
\advance\loopi by1
\repeat
\end{document}
您使用\loop
,然后使用来给出您的条件。然后它将重复介于和您的命令\ifnum
之间的所有内容。请确保在循环内增加循环控制变量(此处为 ),否则您将陷入无限循环。\ifnum
\repeat
\loopi
上面的命令会打印五次“Hey”。我知道还有更多的 LaTeXy 方法可以做到这一点,而且pgf
可能有一些非常简单的循环命令;但我无法解释。无论如何,这是基本的 TeX 方法。
您的具体问题似乎需要操作小数值,这在 TeX 中也有点困难;也许可以看看这个fp
包?您也可以使用整数并将其附加到0.
:
\newcount\loopi\loopi=1
\loop\ifnum\loopi<6
0.\the\loopi,
\advance\loopi by1%
\repeat
这将打印0.1,0.2,0.3,0.4,0.5
;也许您可以在命令中使用它\openbigstar
。
答案3
根据接受的答案调整 TikZ 版本
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\newcommand{\stars}[2][fill=black,draw=black]{
\begin{tikzpicture}[baseline=-0.34em,#1]
\foreach \X in {1,...,5}
{
\pgfmathsetmacro{\xfill}{min(1,max(1+#2-\X,0))}
\path (\X*1em,0)
node[star,draw, ultra thin,star point height=0.23em,minimum size=0.75em,inner sep=0pt,
path picture={\fill (path picture bounding box.south west)
rectangle ([xshift=\xfill*0.722em]path picture bounding box.north west);}]{};
}
\end{tikzpicture}}
\begin{document}
\stars{4.5}
\stars{4.2}
\stars{3.6}
\stars{2}
\stars{1.3}
\stars{0.3}
\end{document}
答案4
如果有人需要圆形而不是星形的解决方案,请使用以下命令:
\usepackage{scalerel}
\usepackage{stackengine}
% open bullet macro
\newcommand{\openbullet}{\ensuremath{\circ}}%
\newcommand{\solidbullet}{\ensuremath{\bullet}}%
\newcounter{counter_skilllevel}% counter variable
\newcommand{\skilllevel}[1]{% define skill-level function
\setcounter{counter_skilllevel}{0}% reset counter
\loop% solid bullet loop
\textcolor{color1}{\Large\solidbullet}\,% draw filled circle and small space
\stepcounter{counter_skilllevel}% i++
\ifnum \value{counter_skilllevel}<#1% continue if target level not reached yet
\repeat% close loop
\loop% open bullet loop
\ifnum \value{counter_skilllevel}<5% check max condition first
\stepcounter{counter_skilllevel}% i++
\textcolor{darkgray}{\Large\openbullet}\,% draw unfilled circle and small space
\repeat%
}