Verwenden von Zahlen aus neuen Befehlen in ifnum

Verwenden von Zahlen aus neuen Befehlen in ifnum

Ich versuche, ein Latex-Dokument zu erstellen, in dem ich am Anfang eine Liste von Elementen (z. B. Früchte) definiere, um den resultierenden Text/das Erscheinungsbild des Dokuments abhängig von der Anzahl der von mir definierten Elemente zu ändern.

Daher habe ich ein definiert, \newcommand{\length}das die Anzahl der Elemente (Früchte) zählen und die Anzahl „zurückgeben“ soll.

Dieses minimale (nicht) funktionierende Beispiel soll veranschaulichen, was ich erreichen möchte:

\documentclass{article}
\makeatletter
\newcounter{numlength}%
\newcommand{\length}[1]{%
    \setcounter{numlength}{0}%
    \@for\element:=#1\do{\stepcounter{numlength}}%
    \value{numlength}% Variant 1
    % \arabic{numlength}% Variant 2
    % \thenumlength% Variant 3
}
\makeatother
\def\fruits{apple,banana,mango}
\begin{document}
\section{Fruits}
Number of fruits: \length{\fruits}
\\There \ifnum\length{\fruits}=1 is just a single fruit\else are multiple fruits\fi on my list:
\\\fruits
\end{document}

Das Drucken der Nummer in meinem Text ( Number of fruits: \length{\fruits}) funktioniert nur mit den Varianten 2 und 3 (was ich verstehe), aber die Verwendung der Nummer in \ifnumfunktioniert nicht, egal welche Variante ich verwende.

Um es klar zu sagen: Ich bin nicht daran interessiert, die Elemente (Früchte) selbst auf schöne Weise auszudrucken. Mir geht es vor allem darum, die von mir „berechnete“ Zahl in \newcommand{\length}einer \ifnumBedingung zu verwenden.

Des Weiteren möchte ich wenn möglich auf die Verwendung jeglicher Pakete ( \usepackage) verzichten.

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Vielen Dank im Voraus!

Antwort1

Wie @DavidCarlisle in seinem Kommentar anmerkt, muss in TeX Erweiterbarkeit gegeben sein, wenn Sie Ihr Makro dort verwenden möchten, wo TeX eine Zahl erwartet. Daher können Sie keine Zuweisungen verwenden.

Sie haben zwei Möglichkeiten, Ihr Problem zu beheben:

  1. Erledige im ersten Schritt die Aufgaben und nutze die Ergebnisse für deine \ifnum.

  2. Zählen Sie die Anzahl der Früchte mit einer erweiterbaren Funktion.

Das Folgende erledigt Letzteres mithilfe einer Funktion/eines Makros aus L3:

\documentclass{article}

\ExplSyntaxOn
\cs_generate_variant:Nn \clist_count:n { V }
\cs_new_eq:NN \length \clist_count:V
\ExplSyntaxOff

\newcommand*\fruits{apple,banana,mango}

\begin{document}
\section{Fruits}
Number of fruits: \length{\fruits}
\\There \ifnum\length{\fruits}=1 is just a single fruit\else are multiple fruits\fi on my list:
\\\fruits
\end{document}

Bildbeschreibung hier eingeben


TeXnische Informationen möchten Sie diese vielleicht ignorieren und einfach das Obige verwenden:

Im Gegensatz zu meinem Kommentar verwendet der Code in dieser Antwort eine VVariante. Da Ihr Code \fruitnicht mit einer der clist-Funktionen von L3 festgelegt ist, sollte dies semantisch sauberer sein, da Vim Gegensatz zu die für korrekte Ergebnisse notwendigen Bereinigungsschritte durchgeführt werden N.


Zum ersten Ansatz:

Damit der erste Ansatz funktioniert, müssen Sie an Ihrem eigentlichen Code nicht allzu viel ändern. Sie müssen lediglich die direkte Ausgabe entfernen und stattdessen in einem zweiten Schritt den Wert Ihres numlengthZählers verwenden:

\documentclass{article}
\makeatletter
\newcounter{numlength}%
\newcommand{\length}[1]{%
    \setcounter{numlength}{0}%
    \@for\element:=#1\do{\stepcounter{numlength}}%
}
\makeatother
\def\fruits{apple,banana,mango}
\begin{document}
\section{Fruits}
Number of fruits: \length{\fruits}\arabic{numlength}
\\There \length\fruits\ifnum\value{numlength}=1 is just a single fruit\else are multiple fruits\fi on my list:
\\\fruits
\end{document}

(Ausgabe wie oben)

Antwort2

Wie andere bereits erklärt haben, muss man die Länge zunächst in einem Makro hinterlegen und dann verwenden \ifnum. Die Methode ist allerdings umständlich und selbst nicht erweiterbar.

Ich schlage eine Methode vor, die kein erfordert \def, sodass Sie nicht das Risiko eingehen, vorhandene Befehle zu überschreiben (und neue zu „erfinden“).

Sie können auch an Listen anhängen und basierend auf der Anzahl der Elemente komplexere Verzweigungen vornehmen. Listen dürfen nicht leer sein.

Beachten Sie, dass \branchonlistes vollständig erweiterbar ist.

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\definelist}{mm}
 {
  \clist_clear_new:c { l_lennart_list_#1_clist }
  \clist_set:cn { l_lennart_list_#1_clist } { #2 }
 }

\NewDocumentCommand{\appendtolist}{mm}
 {
  \clist_put_right:cn { l_lennart_list_#1_clist } { #2 }
 }

\NewExpandableDocumentCommand{\listlength}{m}
 {
  \clist_count:c { l_lennart_list_#1_clist }
 }

\NewExpandableDocumentCommand{\branchonlist}{mmm}
 {% #1 = list name, #2 = cases, #3 = no match
  \int_case:nnF { \clist_count:c { l_lennart_list_#1_clist } } { #2 } { #3 }
 }

\ExplSyntaxOff

\definelist{fruits}{apple,mango,banana}
\definelist{animals}{gnu,gnat}
\definelist{letters}{a}

\begin{document}

Number of fruits: \listlength{fruits}

\branchonlist{fruits}{
  {1}{There is just a single fruit}
}{There are multiple fruits}

\bigskip

Number of animals: \listlength{animals}

\branchonlist{animals}{
  {1}{There is just a single animal}
  {2}{There are two animals}
}{There are multiple animals}

\bigskip

Number of letters: \listlength{letters}

\branchonlist{letters}{
  {1}{There is just a single letter}
  {2}{There are two letters}
  {3}{There are three letters}
}{There are multiple letters}

\bigskip

\appendtolist{letters}{b}

Number of letters: \listlength{letters}

\branchonlist{letters}{
  {1}{There is just a single letter}
  {2}{There are two letters}
  {3}{There are three letters}
}{There are multiple letters}

\bigskip

\appendtolist{letters}{c}

Number of letters: \listlength{letters}

\branchonlist{letters}{
  {1}{There is just a single letter}
  {2}{There are two letters}
  {3}{There are three letters}
}{There are multiple letters}

\bigskip

\appendtolist{letters}{d}

Number of letters: \listlength{letters}

\branchonlist{letters}{
  {1}{There is just a single letter}
  {2}{There are two letters}
  {3}{There are three letters}
}{There are multiple letters}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen