\docsvlist e funções aninhadas: espaços grandes indesejados

\docsvlist e funções aninhadas: espaços grandes indesejados

Gostaria de percorrer uma lista separada por vírgulas para traduzir algumas palavras. Já descobri como fazer isso usando \docsvlisto etoolboxpacote. Porém, há um grande espaço impresso antes da primeira palavra e entre as palavras quando deveria haver apenas um espaço “normal” após a vírgula impressa. Acho que o problema vem do aninhamento dos \ifstrequalcomandos usados ​​para a tradução.

Abaixo está um MWE incluindo um exemplo chamando todas as traduções possíveis e outro exemplo chamando apenas a primeira tradução para mostrar o impacto do aninhamento.

Como posso evitar esses espaços adicionais?

MWE

\documentclass{article}

\usepackage{etoolbox}

\begin{document}
    
    \newcommand\TranslateAnimal[1]{
        \ifstrequal{#1}{Cat}{Chat}{
            \ifstrequal{#1}{Dog}{Chien}{
                \ifstrequal{#1}{Mouse}{Souris}{
                    \ifstrequal{#1}{Bird}{Oiseau}{
                        \ifstrequal{#1}{Horse}{Cheval}{
                            #1 % If there is no known translation
        }}}}}
    }

    \newcommand{\TranslateAnimalList}[2][,]{
        \def\nextitem{\def\nextitem{#1}}% Separator
        \renewcommand*{\do}[1]{\nextitem\TranslateAnimal{##1}} % How to process each item
        \docsvlist{#2}% Process list
    }

    There are additional large spaces before the first word and after words: \TranslateAnimalList{Cat,Bird,Dog,Horse,Mouse,Seal,Donkey}
    
    Compare with: \TranslateAnimalList{Cat,Cat,Cat,Cat,Cat,Cat,Cat} where there is only a large space before the first word

\end{document}

Responder1

Confira as diferenças e vejaQual é a utilidade dos sinais de porcentagem (%) no final das linhas? (Por que minha macro está criando espaço extra?)

\documentclass{article}

\usepackage{etoolbox}

\newcommand\TranslateAnimal[1]{%
  \ifstrequal{#1}{Cat}{Chat}{%
    \ifstrequal{#1}{Dog}{Chien}{%
      \ifstrequal{#1}{Mouse}{Souris}{%
        \ifstrequal{#1}{Bird}{Oiseau}{%
          \ifstrequal{#1}{Horse}{Cheval}{%
            #1% If there is no known translation
  }}}}}%
}

\newcommand{\TranslateAnimalList}[2][, ]{%
  \def\nextitem{\def\nextitem{#1}}% Separator
  \renewcommand*{\do}[1]{\nextitem\TranslateAnimal{##1}}% How to process each item
  \docsvlist{#2}% Process list
}

\begin{document}
    
The list is \TranslateAnimalList{Cat,Bird,Dog,Horse,Mouse,Seal,Donkey}.

Compare with \TranslateAnimalList{Cat,Cat,Cat,Cat,Cat,Cat,Cat}.

\end{document}

Você pode apreciar uma implementação diferente com expl3.

\documentclass{article}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later

\ExplSyntaxOn
\NewExpandableDocumentCommand{\TranslateAnimal}{m}
 {
  \str_case:nnF { #1 }
   {
    {Cat}{Chat}
    {Dog}{Chien}
    {Mouse}{Souris}
    {Bird}{Oiseau}
    {Horse}{Cheval}
   }
   { #1 } % no known translation
 }

\NewDocumentCommand{\TranslateAnimalList}{O{,~}m}
 {
  \seq_clear:N \l_tmpa_seq
  \clist_map_inline:nn { #2 }
   {
    \seq_put_right:Nn \l_tmpa_seq { \TranslateAnimal { ##1 } }
   }
  \seq_use:Nn \l_tmpa_seq { #1 }
 }
\ExplSyntaxOff

\begin{document}
    
The list is \TranslateAnimalList{Cat,Bird,Dog,Horse,Mouse,Seal,Donkey}.

Compare with \TranslateAnimalList{Cat,Cat,Cat,Cat,Cat,Cat,Cat}.

\end{document}

insira a descrição da imagem aqui

informação relacionada