Как передать аргумент команде, определенной и вызванной в файле .cls, с помощью другой команды, вызванной в .tex и определенной в предыдущем .cls?

Как передать аргумент команде, определенной и вызванной в файле .cls, с помощью другой команды, вызванной в .tex и определенной в предыдущем .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

Первоначально \cvlanguagesопределено, чтобы потреблять два неразделенных макроаргумента и переопределять себя.
Это переопределение может произойтировно один раз.
Когда происходит это переопределение, то \cvlanguagesпереопределяется так, чтобы не потреблять никаких макроаргументов и расширяться до чего-то вроде фразы " Portugese \grade{5}" и, таким образом, больше не является "переопределяемым".

Это означает:

  1. Вы можете использовать \cvlanguagesтолько один раз с двумя неразделенными макроаргументами для установки одного языка.
    После этого вы можете использовать \cvlanguagesбез макроаргументов для перечисления этого одного языка и точек навыков.

  2. Если вы не использовали \cvlanguagesexact once с двумя неразделенными макроаргументами для установки одного языка, то \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}

введите описание изображения здесь

Связанный контент