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 \ifnum
funktioniert 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 \ifnum
Bedingung 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:
Erledige im ersten Schritt die Aufgaben und nutze die Ergebnisse für deine
\ifnum
.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}
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 V
Variante. Da Ihr Code \fruit
nicht mit einer der clist
-Funktionen von L3 festgelegt ist, sollte dies semantisch sauberer sein, da V
im 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 numlength
Zä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 \branchonlist
es 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}