ich leseLaTeX \if-BedingungUndWie schreibt man „wenn“ und „dann“ in einem Algorithmus?, aber bisher hat es bei mir nichts geklingelt.
Ich versuche, einen Befehl namensgepunkteteFähigkeitwie unten. Die Logik dahinter ist:
- Empfangen von zwei Parametern
- iteriere über den Zähler x von 1 bis #2
- Wenn mein Zähler gefüllt > 0 ist, zeichne ich einen vollen Punkt und dekrementiere den Zähler
- sonst zeichne ich einen leeren Punkt
\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
}
}%
Ich bin nicht sicher, ob das Problem bei der Befehlsdefinition oder woanders liegt, aber wenn ich ihn für meine Datei aufrufe, erhalte ich:
- Undefinierte Steuersequenz. \dottedSkill{2}{9}.
- Fehlende Zahl, wird als Null behandelt. \dottedSkill{2}{9}
- Undefinierte Steuersequenz. \dottedSkill{2}{9}.
- Fehlende Zahl, wird als Null behandelt. \dottedSkill{2}{9}
Ist meine Funktion richtig geschrieben?
Antwort1
Das aktuelle Problem mit Ihrem Setup ist, dass Sie den filled
Zähler definierenjedenwenn Sie ausführen \dottedSkill
. Sie sollten diese Definitionen aus Ihrem \dottedSkill
Befehl entfernen.
Außerdem sollten Sie nur die ausgefüllten Kreise und anschließend die leeren Kreise zeichnen:
\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}
multido
funktioniert ähnlich wieforloop
um über einen Wert zu iterieren.
Antwort2
\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}
Antwort3
Die erste Frage an mich ist, ob Sie wirklich die Bedingung brauchen. Nur im Fall des XY-Problems (das wahre Problem besteht nicht darin, die Schleife zum Laufen zu bringen, sondern eine Punktzahl mit einem Makro mit zwei Argumenten zu erzielen) gibt es hier einen einfacheren Ansatz:
\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}
Antwort4
Dank euch allen konnte ich meine Lösung entsprechend optimieren.
Als Referenz für die Kreistypen habe ich diesen Link verwendet: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
}%