私は、自分が話せる言語とそれぞれのレベルを記載した履歴書を作成しています。レベルを示すために、スキルドットを使用したいと思います。下の画像のような構造にしたいと考えています。
\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
2つの区切りのないマクロ引数を消費し、自身を再定義するように定義されて
います。この再定義は、正確に1回
この再定義が行われると、 は\cvlanguages
マクロ引数を消費しないように再定義され、フレーズ「Portugese \grade{5}
」のようなものに展開されるため、もはや「再定義可能」ではなくなります。
これはつまり:
\cvlanguages
1 つの言語を設定するために、2 つの区切りのないマクロ引数を 1 回だけ使用できます。
その後は、\cvlanguages
マクロ引数なしで使用して、その 1 つの言語とスキル ドットを一覧表示できます。\cvlanguages
1 つの言語を設定するために 2 つの区切りのないマクロ引数で を 1 回だけ使用しなかった場合、 は 2 つの区切りのないマクロ引数を消費するように定義されます。この状況は、-construct内の の展開と空の\cvlanguages
比較を妨げる可能性があります。\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}