Usando números de nuevos comandos en ifnum

Usando números de nuevos comandos en ifnum

Estoy intentando crear un documento Latex en el que defino una lista de elementos (por ejemplo, frutas) al principio para cambiar el texto/apariencia resultante del documento dependiendo de la cantidad de elementos que he definido.

Por lo tanto, definí un \newcommand{\length}que se supone que cuenta el número de artículos (frutas) y "devuelve" el número.

Este ejemplo mínimo (no) funcional debería ilustrar lo que estoy tratando de lograr:

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

Imprimir el número en mi texto ( Number of fruits: \length{\fruits}) solo funciona con las variantes 2 y 3 (que entiendo), pero usar el número en \ifnumno funciona sin importar qué variante use.

Para ser claro: no estoy interesado en una forma agradable de imprimir los artículos (frutas) en sí; Mi principal preocupación es utilizar el número que "calculo" en mi \newcommand{\length}condición \ifnum.

Además, si es posible, me gustaría abstenerme de utilizar cualquier paquete ( \usepackage).

¡Avíseme si necesita más información y gracias de antemano!

Respuesta1

Como señala @DavidCarlisle en su comentario, en TeX debes ser expandible si quieres usar tu macro donde TeX espera un número, por lo tanto, no puedes usar asignaciones.

Tienes dos posibilidades para solucionar tu problema:

  1. Realice las tareas en un primer paso y utilice el resultado para su \ifnum.

  2. Cuente el número de frutas con función ampliable.

Lo siguiente hace esto último usando una función/macro de 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}

ingrese la descripción de la imagen aquí


Información técnica, es posible que desees ignorar esto y simplemente usar lo anterior:

A diferencia de mi comentario, el código en esta respuesta usa una Vvariante, ya que \fruitno está configurado con una de las clistfunciones de L3, esto debería ser semánticamente más limpio, ya que Vrealizará los pasos de desinfección necesarios para obtener resultados correctos, a diferencia de N.


Sobre el primer enfoque:

Para que el primer enfoque funcione, no es necesario modificar mucho el código real. Sólo necesitas eliminar la salida directa y, en su lugar, en un segundo paso, usar el valor de tu numlengthcontador:

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

(salida como arriba)

Respuesta2

Como ya han explicado otros, primero debes almacenar la longitud en una macro y luego usar \ifnum. Pero el método es engorroso y no ampliable en sí mismo.

Sugiero un método que no requiere \def, para que no corra el riesgo de alterar los comandos existentes (y de “inventar” otros nuevos).

También puede agregar listas y realizar ramificaciones más complejas según la cantidad de elementos. Se supone que las listas no deben estar vacías.

Tenga en cuenta que \branchonlistes totalmente ampliable.

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

ingrese la descripción de la imagen aquí

información relacionada