如何使用在 .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

最初\cvlanguages被定义为使用两个非分隔宏参数并重新定义自身。
这种重新定义可能发生恰好一次
当发生这种重新定义时,\cvlanguages就会重新定义为不消耗任何宏参数,并扩展为类似短语“ Portugese \grade{5}”的内容,因此不再是“可重新定义的”。

这意味着:

  1. 您可以使用\cvlanguages一次带有两个非分隔宏参数的宏来设置一种语言。
    之后,您可以使用\cvlanguages不带宏参数的宏来列出该语言和技能点。

  2. 如果您没有使用\cvlanguages两个非分隔宏参数来设置一种语言,则\cvlanguages仍定义为使用两个非分隔宏参数。这种情况可能会/将会干扰-construct\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}

在此处输入图片描述

相关内容