Wie kann ich einem Befehl, der in einer CLS-Datei definiert und aufgerufen wird, ein Argument übergeben, indem ich einen anderen Befehl verwende, der in einer TEX-Datei aufgerufen und in der vorherigen CLS-Datei definiert wurde?

Wie kann ich einem Befehl, der in einer CLS-Datei definiert und aufgerufen wird, ein Argument übergeben, indem ich einen anderen Befehl verwende, der in einer TEX-Datei aufgerufen und in der vorherigen CLS-Datei definiert wurde?

Ich erstelle einen Lebenslauf, in dem ich die Sprachen auflisten möchte, die ich spreche, und mein Niveau in jeder dieser Sprachen. Zur Darstellung der Niveaus möchte ich Skill-Punkte verwenden. Ich möchte eine Struktur erhalten, die der im Bild unten gezeigten ähnelt.

Bildbeschreibung hier eingeben

Zu diesem Zweck habe ich einen neuen Befehl definiert, der \cvlanguagesauf einer .cls-Datei basiert:

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

Um später im .cls-Code den Abschnitt „Sprachen“ im Lebenslauf auszudrucken, verwende ich Folgendes:

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

\profilesectionist an anderer Stelle definiert und hier nicht wichtig.

Der \gradeBefehl befindet sich auch in der CLS-Datei und wird wie folgt angegeben:

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

Auf der .tex-Datei verwende ich die folgende Zeile, um den \cvlanguagesBefehl aufzurufen:

\cvlanguages{Portuguese}{5}

Dieses Verfahren verursacht einen schwerwiegenden Fehler und ich habe keine Ahnung, warum. Der Befehl \gradefunktioniert einwandfrei, wenn er sich außerhalb der \renewcommandVerschachtelung befindet \newcommand.

Ich habe über eine alternative Lösung nachgedacht, die stattdessen etwa Folgendes verwendet:

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

\ifthenelseaber ich habe keine Ahnung, wie ich das hinbekommen soll, da die Angabe, welches Argument mit „#“ gedruckt werden soll, in dieser Umgebung nicht zu funktionieren scheint .

Ich bin neu auf diesem LaTex-Niveau und habe eine Weile versucht, das herauszufinden, aber ohne Erfolg. Ich wäre für jede Hilfe dankbar, wie ich dieses Problem umgehen kann.

Antwort1

Zunächst \cvlanguagesist es so definiert, dass es zwei nicht abgegrenzte Makroargumente verwendet und sich selbst neu definiert.
Diese Neudefinition kann erfolgengenau einmal.
Wenn diese Neudefinition stattfindet, \cvlanguageswird es so neu definiert, dass kein Makroargument verbraucht wird und es sich zu etwas wie der Phrase " Portugese \grade{5}" erweitert und ist daher nicht mehr "neu definierbar".

Das heisst:

  1. Sie können es \cvlanguagesgenau einmal mit zwei nicht abgegrenzten Makroargumenten verwenden, um eine Sprache festzulegen.
    Danach können Sie es \cvlanguagesohne Makroargumente verwenden, um diese eine Sprache und die Skill-Punkte aufzulisten.

  2. \cvlanguagesWenn Sie nicht genau einmal zwei nicht abgegrenzte Makroargumente zum Festlegen einer Sprache verwendet haben , \cvlanguagesist immer noch so definiert, dass zwei nicht abgegrenzte Makroargumente verwendet werden. Dieser Umstand kann/wird den Vergleich der \cvlanguagesErweiterung von mit Leere innerhalb der \ifthenelse-Konstruktion stören.

Ich schlage vor, den \@starttoc-Mechanismus zu verwenden:

Im folgenden Beispiel \cvlanguageswird das Makro verwendet, um der Liste der Lebenslaufsprachen eine Sprache und eine Note hinzuzufügen und \listofcvlanguagesum die Liste der Lebenslaufsprachen zu übermitteln:

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

Bildbeschreibung hier eingeben

verwandte Informationen