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 \ifnum
nã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:
Faça as tarefas em uma primeira etapa e use o resultado para o seu arquivo
\ifnum
.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}
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 V
variante, já que você \fruit
não está configurado com uma das clist
-funções do L3, isso deve ser semanticamente mais limpo, pois V
fará 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 numlength
contador:
\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}