
일부 단어를 번역하기 위해 쉼표로 구분된 목록을 반복하고 싶습니다. 나는 이미 \docsvlist
패키지 를 사용하여 그렇게 하는 방법을 찾았습니다 etoolbox
. 그러나 인쇄된 쉼표 뒤에 "일반" 공백만 있어야 하는 경우 첫 번째 단어 앞에 큰 공백이 인쇄되고 단어 사이에는 큰 공백이 인쇄됩니다. 문제는 \ifstrequal
번역에 사용된 명령 의 중첩에서 비롯된 것 같습니다 .
다음은 가능한 모든 번역을 호출하는 예제와 중첩의 영향을 보여주기 위해 첫 번째 번역만 호출하는 또 다른 예제를 포함하는 MWE입니다.
이러한 추가 공간을 방지하려면 어떻게 해야 합니까?
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}