如何使用在 .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定義為使用兩個非分隔巨集參數並重新定義自身。
這種重新定義可能會發生正好一次
當這種重新定義發生時,then\cvlanguages被重新定義為不使用任何巨集參數並擴展為類似短語“ Portugese \grade{5}”,因此不再“可重新定義”。

這意味著:

  1. 您可以\cvlanguages只使用一次與兩個非分隔巨集參數來設定一種語言。
    之後,您可以\cvlanguages不使用巨集參數來列出該一種語言和技能點數。

  2. 如果您沒有使用\cvlanguages兩個非分隔巨集參數來設定一種語言,那麼\cvlanguages仍然定義為使用兩個非分隔巨集參數。這種情況可能/將會幹擾\cvlanguages的擴展與 - 構造中的空性的比較\ifthenelse

我建議使用\@starttoc- 機制:

在下面的範例中,巨集\cvlanguages用於將語言和等級新增至 cv 語言清單中,並且巨集\listofcvlanguages用於傳遞 cv 語言清單:

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

在此輸入影像描述

相關內容