Usando números de novos comandos em ifnum

Usando números de novos comandos em ifnum

Estou tentando criar um documento Latex no qual defino uma lista de itens (por exemplo, frutas) no início para alterar o texto/aparência resultante do documento dependendo da quantidade de itens que defini.

Portanto defini um \newcommand{\length}que deveria contar o número de itens (frutas) e 'retornar' o número.

Este exemplo mínimo (não) funcional deve ilustrar o que estou tentando alcançar:

\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 o número no meu texto ( Number of fruits: \length{\fruits}) só funciona com as variantes 2 e 3 (que eu entendo), mas usar o número no \ifnumnão funciona, não importa qual variante eu use.

Para ser claro: não estou interessado em uma maneira bacana de imprimir os itens (frutas); minha principal preocupação é usar o número que 'calculo' na minha \newcommand{\length}condição \ifnum.

Além disso, se possível, gostaria de evitar o uso de quaisquer pacotes ( \usepackage).

Por favor, deixe-me saber se você precisar de mais informações e obrigado antecipadamente!

Responder1

Como @DavidCarlisle aponta em seu comentário, no TeX você precisa ser expansível se quiser usar sua macro onde o TeX espera um número, portanto você não pode usar atribuições.

Você tem duas possibilidades para resolver seu problema:

  1. Faça as tarefas em uma primeira etapa e use o resultado para o seu arquivo \ifnum.

  2. Conte a quantidade de frutas com função expansível.

O seguinte faz o último usando uma função/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}

insira a descrição da imagem aqui


Informações TeXnical, você pode querer ignorar isso e simplesmente usar o acima:

Ao contrário do meu comentário, o código nesta resposta usa uma Vvariante, já que você \fruitnão está configurado com uma das clist-funções do L3, isso deve ser semanticamente mais limpo, pois Vfará as etapas de higienização necessárias para resultados corretos, ao contrário do N.


Na primeira abordagem:

Para que a primeira abordagem funcione, você não precisa alterar muito o seu código real. Você só precisa remover a saída direta e, em uma segunda etapa, usar o valor do seu 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}

(saída como acima)

Responder2

Como outros já explicaram, primeiro você precisa armazenar o comprimento em uma macro e depois usar \ifnum. Mas o método é complicado e não é expansível por si só.

Eu sugiro um método que não requer \def, para que você não corra o risco de destruir comandos existentes (e de “inventar” novos).

Você também pode anexar listas e fazer ramificações mais complexas com base no número de elementos. As listas não devem estar vazias.

Observe que \branchonlisté totalmente expansível.

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

insira a descrição da imagem aqui

informação relacionada