
Ich möchte eine durch Kommas getrennte Liste durchlaufen, um einige Wörter zu übersetzen. Ich habe bereits herausgefunden, wie das \docsvlist
mit dem etoolbox
Paket geht. Allerdings wird vor dem ersten Wort und zwischen den Wörtern ein großes Leerzeichen gedruckt, obwohl nach dem gedruckten Komma nur ein „normales“ Leerzeichen stehen sollte. Ich denke, das Problem liegt in der Verschachtelung der \ifstrequal
für die Übersetzung verwendeten Befehle.
Unten sehen Sie ein MWE mit einem Beispiel, in dem alle möglichen Übersetzungen aufgerufen werden, und einem weiteren Beispiel, in dem nur die erste Übersetzung aufgerufen wird, um die Auswirkung der Verschachtelung zu veranschaulichen.
Wie kann ich diese zusätzlichen Leerzeichen vermeiden?
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}
Antwort1
Prüfen Sie die Unterschiede und schauen Sie sichWas ist der Nutzen von Prozentzeichen (%) am Zeilenende? (Warum erzeugt mein Makro zusätzlichen Leerraum?)
\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}
Möglicherweise können Sie mit eine andere Implementierung vorziehen 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}