Como posso passar um argumento para um comando definido e chamado em um arquivo .cls usando outro comando chamado em .tex e definido no .cls anterior?

Como posso passar um argumento para um comando definido e chamado em um arquivo .cls usando outro comando chamado em .tex e definido no .cls anterior?

Estou construindo um currículo no qual gostaria de listar os idiomas que falo e meu nível em cada um deles. Para apresentar os níveis, desejo usar pontos de habilidade. Quero obter uma estrutura semelhante à mostrada na imagem abaixo

insira a descrição da imagem aqui

Para fazer isso, defini um novo comando nomeado \cvlanguagesem um arquivo .cls:

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

Posteriormente no código .cls, para imprimir a seção "Idiomas" do currículo, utilizo o seguinte:

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

\profilesectioné definido em outro lugar e não é importante aqui.

O \gradecomando também está no arquivo .cls e é 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}%
}

No arquivo .tex, uso a seguinte linha para chamar o \cvlanguagescomando:

\cvlanguages{Portuguese}{5}

Este procedimento causa um erro fatal e não tenho ideia do porquê. O comando \gradefunciona perfeitamente quando está fora do \renewcommandaninhado no arquivo \newcommand.

Eu considerei uma solução alternativa usando algo assim:

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

mas não tenho ideia de como fazer isso funcionar, pois especificar qual argumento imprimir usando "#" não parece funcionar neste \ifthenelseambiente.

Sou novo neste nível de LaTex e passei um tempo tentando descobrir isso, sem sucesso. Eu apreciaria qualquer ajuda sobre como contornar esse problema.

Responder1

Inicialmente \cvlanguagesé definido para consumir dois argumentos macro não delimitados e se redefinir.
Essa redefinição pode acontecerexatamente uma vez.
Quando essa redefinição acontece, ela \cvlanguagesé redefinida para não consumir nenhum argumento macro e se expandir para algo como a frase " Portugese \grade{5}" e, portanto, não é mais "redefinível".

Isso significa:

  1. Você pode usar \cvlanguagesexatamente uma vez dois argumentos de macro não delimitados para definir um idioma.
    Depois disso, você pode usar \cvlanguagesargumentos sem macro para listar aquele idioma e os pontos de habilidade.

  2. Se você não usou \cvlanguagesexatamente uma vez dois argumentos de macro não delimitados para definir um idioma, \cvlanguagesainda será definido para consumir dois argumentos de macro não delimitados. Esta circunstância pode/irá perturbar a comparação da \cvlanguagesexpansão do ' com o vazio dentro da \ifthenelse-construção.

Sugiro usar o \@starttocmecanismo -:

No exemplo abaixo a macro \cvlanguagesé usada para adicionar um idioma e uma nota à lista de cvidiomas e a macro \listofcvlanguagesé usada para entregar a lista de cvidiomas:

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

insira a descrição da imagem aqui

informação relacionada