如何在 Latex 中实现五星符号

如何在 Latex 中实现五星符号

我正在创建自己的简历,我想添加一个命令来生成以下内容:

在此处输入图片描述

我确实成功做到了这一点,具体如下:

\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。

或者 TiZ 版本,显然其可定制性更强。

\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%
}

相关内容