\docsvlist и вложенные функции: нежелательные большие пробелы

\docsvlist и вложенные функции: нежелательные большие пробелы

Я хотел бы перебрать список, разделенный запятыми, чтобы перевести некоторые слова. Я уже нашел, как это сделать, используя \docsvlistпакет etoolbox. Однако перед первым словом и между словами печатается большой пробел, когда должен быть только "нормальный" пробел после печатаемой запятой. Я думаю, что проблема возникает из-за вложенности команд, \ifstrequalиспользуемых для перевода.

Ниже приведен пример 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}

решение1

Проверьте различия и посмотрите наДля чего используются знаки процента (%) в конце строк? (Почему мой макрос создает лишнее пространство?)

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

Возможно, вы оцените другую реализацию с помощью 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}

введите описание изображения здесь

Связанный контент