.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.

-mechanism을 사용하는 것이 좋습니다 \@starttoc.

아래 예에서 매크로는 \cvlanguagescv언어 목록에 언어와 등급을 추가하는 데 사용되고 매크로는 \listofcvlanguagescv언어 목록을 전달하는 데 사용됩니다.

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

여기에 이미지 설명을 입력하세요

관련 정보