我正在制作一份简历,我想在其中列出我使用的语言以及每种语言的水平。为了展示这些水平,我希望使用技能点。我希望获得类似于下图所示的结构
为此,我\cvlanguages
在 .cls 文件中定义了一个名为的新命令:
\newcommand{\cvlanguages}[2]{\renewcommand{\cvlanguages}{#1 \grade{#2}}}
稍后在 .cls 代码中,为了在简历上打印“语言”部分,我使用以下命令:
\ifthenelse{\equal{\cvlanguages}{}}{}{
\profilesection{LANGUAGES}
{\cvlanguages}
}
\profilesection
在其他地方定义,在这里并不重要。
该\grade
命令也在 .cls 文件中,具体如下:
\newcommand{\grade}[1]{
\begin{tikzpicture}
\clip (1em-.4em,-.35em) rectangle (5em +.5em ,1em);
\foreach \x in {1,2,...,5}{
\path[{fill=backColor}] (\x em,0) circle (.35em);
}
\begin{scope}
\clip (1em-.4em,-.35em) rectangle (#1 em +.5em ,1em);
\foreach \x in {1,2,...,5}{
\path[{fill=frontColor}] (\x em,0) circle (.35em);
}
\end{scope}
\end{tikzpicture}%
}
在 .tex 文件中,我使用以下行来调用\cvlanguages
命令:
\cvlanguages{Portuguese}{5}
此过程会导致致命错误,但我不知道原因。\grade
当命令位于\renewcommand
嵌套的外部时,它运行正常\newcommand
。
我已经考虑过使用类似这样的替代解决方案:
\ifthenelse{\equal{\cvlanguages}{}}{}{
\profilesection{LANGUAGES}
{\fontsize{0.36cm}{0.432cm} \selectfont \cvlanguages{#1} \grade{\cvlanguages{#2}}}
}
\ifthenelse
但我不知道如何使其工作,因为使用“#”指定要打印的参数似乎在这种环境下不起作用。
我对这个级别的 LaTex 还不熟悉,花了一段时间试图解决这个问题,但没有成功。如果能帮助我解决这个问题,我将不胜感激。
答案1
最初\cvlanguages
被定义为使用两个非分隔宏参数并重新定义自身。
这种重新定义可能发生恰好一次。
当发生这种重新定义时,\cvlanguages
就会重新定义为不消耗任何宏参数,并扩展为类似短语“ Portugese \grade{5}
”的内容,因此不再是“可重新定义的”。
这意味着:
您可以使用
\cvlanguages
一次带有两个非分隔宏参数的宏来设置一种语言。
之后,您可以使用\cvlanguages
不带宏参数的宏来列出该语言和技能点。如果您没有使用
\cvlanguages
两个非分隔宏参数来设置一种语言,则\cvlanguages
仍定义为使用两个非分隔宏参数。这种情况可能会/将会干扰-construct\cvlanguages
中扩展与空值的比较\ifthenelse
。
我建议使用\@starttoc
机制:
在下面的例子中,宏\cvlanguages
用于将语言和等级添加到 cvlanguages 列表中,并且宏\listofcvlanguages
用于传递 cvlanguages 列表:
\documentclass{article}
\usepackage{tikz}
% As you didn't provide definitions for these, I invented something on my own:
\definecolor{frontColor}{named}{black}
\definecolor{backColor}{named}{lightgray}
\newcommand\profilesection[1]{%
\noindent\textsf{\textbf{#1}}\\\null\hrulefill\null\\%
}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\grade}[1]{%
\begin{tikzpicture}%
\clip (1em-.4em,-.35em) rectangle (5em +.5em ,1em);%
\foreach \x in {1,2,...,5}{%
\path[{fill=backColor}] (\x em,0) circle (.35em);%
}%
\begin{scope}%
\clip (1em-.4em,-.35em) rectangle (#1 em +.5em ,1em);%
\foreach \x in {1,2,...,5}{%
\path[{fill=frontColor}] (\x em,0) circle (.35em);%
}%
\end{scope}%
\end{tikzpicture}%
}%
\newcommand\cvlanguagesectionheading{%
\ifnum\cvlanguagecountmacro<1 \else
\ifnum\cvlanguagecountmacro<2 %
\profilesection{LANGUAGE}%
\else
\profilesection{LANGUAGES}%
\fi
\fi
}%
\newcommand\cvlanguagecountmacro{0}%
\newcommand\advancecvlanguagecountmacro{%
\xdef\cvlanguagecountmacro{%
\number\numexpr\cvlanguagecountmacro+1\relax
}%
}%
\newcommand\languageline[2]{%
\par\noindent#1\\\grade{#2}\par%
}%
\makeatletter
\newcommand{\cvlanguages}[2]{%
\protected@write{\@mainaux}{}{%
\string\advancecvlanguagecountmacro
}%
\addtocontents{cvl}{\string\languageline{#1}{#2}}%
}%
\newcommand\listofcvlanguages{%
\cvlanguagesectionheading
\@starttoc{cvl}%
}%
\makeatother
\begin{document}
Some text.
\listofcvlanguages
\cvlanguages{Portugese}{5}
\cvlanguages{English}{5}
\cvlanguages{WeirdSpeech}{2}
\cvlanguages{OddTongue}{1}
\end{document}