.tex で呼び出され、以前の .cls で定義されている別のコマンドを使用して、.cls ファイルで定義され呼び出されるコマンドに引数を渡すにはどうすればよいですか?

.tex で呼び出され、以前の .cls で定義されている別のコマンドを使用して、.cls ファイルで定義され呼び出されるコマンドに引数を渡すにはどうすればよいですか?

私は、自分が話せる言語とそれぞれのレベルを記載した履歴書を作成しています。レベルを示すために、スキルドットを使用したいと思います。下の画像のような構造にしたいと考えています。

ここに画像の説明を入力してください

\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

最初は、\cvlanguages2つの区切りのないマクロ引数を消費し、自身を再定義するように定義されて
います。この再定義は、正確に1回
この再定義が行われると、 は\cvlanguagesマクロ引数を消費しないように再定義され、フレーズ「Portugese \grade{5}」のようなものに展開されるため、もはや「再定義可能」ではなくなります。

これはつまり:

  1. \cvlanguages1 つの言語を設定するために、2 つの区切りのないマクロ引数を 1 回だけ使用できます。
    その後は、\cvlanguagesマクロ引数なしで使用して、その 1 つの言語とスキル ドットを一覧表示できます。

  2. \cvlanguages1 つの言語を設定するために 2 つの区切りのないマクロ引数で を 1 回だけ使用しなかった場合、 は 2 つの区切りのないマクロ引数を消費するように定義されます。この状況は、-construct内の の展開と空の\cvlanguages比較を妨げる可能性があります。\cvlanguages\ifthenelse

-メカニズムを使用することをお勧めします\@starttoc:

以下の例では、マクロ\cvlanguagesは cvlanguages のリストに言語とグレードを追加するために使用され、マクロは\listofcvlanguagescvlanguages のリストを配信するために使用されます。

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

ここに画像の説明を入力してください

関連情報