¿Cómo puedo pasar un argumento a un comando definido y llamado en un archivo .cls usando otro comando llamado en un .tex y definido en el .cls anterior?

¿Cómo puedo pasar un argumento a un comando definido y llamado en un archivo .cls usando otro comando llamado en un .tex y definido en el .cls anterior?

Estoy elaborando un currículum en el que me gustaría enumerar los idiomas que hablo y mi nivel en cada uno de ellos. Para presentar los niveles, deseo usar puntos de habilidad. Quiero obtener una estructura similar a la que se muestra en la imagen de abajo

ingrese la descripción de la imagen aquí

Para hacerlo, definí un nuevo comando nombrado \cvlanguagesen un archivo .cls:

\newcommand{\cvlanguages}[2]{\renewcommand{\cvlanguages}{#1 \grade{#2}}}

Posteriormente en el código .cls, para imprimir la sección "Idiomas" del currículum, utilizo lo siguiente:

\ifthenelse{\equal{\cvlanguages}{}}{}{
    \profilesection{LANGUAGES}
    {\cvlanguages}
} 

\profilesectionse define en otra parte y no es importante aquí.

El \gradecomando también está en el archivo .cls y viene dado por:

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

En el archivo .tex, uso la siguiente línea para llamar al \cvlanguagescomando:

\cvlanguages{Portuguese}{5}

Este procedimiento provoca un error fatal y no tengo idea de por qué. El comando \gradefunciona perfectamente cuando está fuera del \renewcommandarchivo anidado \newcommand.

He considerado una solución alternativa usando algo como esto:

\ifthenelse{\equal{\cvlanguages}{}}{}{
    \profilesection{LANGUAGES}
    {\fontsize{0.36cm}{0.432cm} \selectfont \cvlanguages{#1} \grade{\cvlanguages{#2}}}
} 

pero no tengo idea de cómo hacer que esto funcione, ya que especificar qué argumento imprimir usando "#" no parece funcionar dentro de este \ifthenelseentorno.

Soy nuevo en este nivel de LaTex y he pasado un tiempo intentando resolver esto, sin éxito. Agradecería cualquier ayuda sobre cómo solucionar este problema.

Respuesta1

Inicialmente \cvlanguagesse define para consumir dos macroargumentos no delimitados y redefinirse a sí mismo.
Esta redefinición puede sucederExactamente una vez.
Cuando ocurre esta redefinición, \cvlanguagesse redefine para no consumir ningún argumento macro y expandirse a algo como la frase " Portugese \grade{5}" y, por lo tanto, ya no es "redefinible".

Esto significa:

  1. Puede usarlo \cvlanguagesexactamente una vez con dos argumentos de macro no delimitados para configurar un idioma.
    Después de eso, puede usar \cvlanguagesargumentos sin macro para enumerar ese idioma y los puntos de habilidad.

  2. Si no usó \cvlanguagesexactamente una vez con dos argumentos de macro no delimitados para configurar un idioma, todavía \cvlanguagesestá definido para consumir dos argumentos de macro no delimitados. Esta circunstancia puede o perturbará la comparación de la \cvlanguagesexpansión de ' con el vacío dentro del \ifthenelseconstructo -.

Sugiero usar el \@starttocmecanismo:

En el siguiente ejemplo, la macro \cvlanguagesse usa para agregar un idioma y una calificación a la lista de cvlanguages ​​y la macro \listofcvlanguagesse usa para entregar la lista de 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}

ingrese la descripción de la imagen aquí

información relacionada