
나는 내 자신의 사용자 정의 함수 중 일부를 포함하는 tex 파일을 가지고 있는데 그 중 하나가 스위치 케이스 함수입니다.
\input을 사용하여 다른 문서에서 이 파일을 호출하므로 출력 변수가 로컬이어야 합니다. 그러나 나머지 루프를 반복하는 동안 출력을 저장하려면 로컬 변수가 필요합니다. 아니면 루프를 중단하고 함수의 끝으로 이동합니다.
저는 texmaker와 pdftex를 사용하고 있습니다.
\usepackage{xparse}
\usepackage{fp}
\usepackage{xstring}
\usepackage{ifthen}
\usepackage{printlen}
\usepackage{listofitems}
\usepackage{forloop}
\usepackage{pgffor}
\NewDocumentCommand\SwitchCase{m m}
{
\setsepchar{,/-}
\readlist\Cases{#2}
\FPadd\CaseCount{\Caseslen}{0}
\def\out{}
\foreach \ct in {1,...,\CaseCount}
{
\ifthenelse{\equal{#1}{\Cases[\ct ,1]}}
{
\def\tmp{\Cases[\ct, 2]}
%\tmp
\def\out{\tmp}
}
{}
}
\out
}
%below is a sample of how this code would work
%not exactly how I would use it, but still valid example
\begin{document}
\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}
\end{document}
예제에서 함수는 3을 반환해야 하지만 루프에서 출력 변수를 설정하려고 하면 0 또는 아무것도 반환하지 않습니다.
이 기능은 내 문서에서 많은 용도로 사용될 수 있으므로 모호해야 합니다.
ps. 표현이 어색하다면 사과드립니다. 저는 구문과 단어 선택에 능숙하지 않습니다.
답변1
여기에서 모든 패키지를 사용하지 않고도 기능을 구현할 수 있습니다.
\documentclass{article}
\makeatletter
\newcommand\SwitchCase[2]{%
\def\tmpa{#1}%
\@for\tmp:=#2\do{\expandafter\zz@switch\tmp\zz@switch}%
}
\def\zz@switch#1-#2\zz@switch{%
\def\tmpb{#1}%
\ifx\tmpa\tmpb#2\fi}
\makeatother
\begin{document}
\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}
\end{document}
답변2
이는 일반적인 문제입니다. \foreach
사이클은 그룹으로 수행됩니다.
또한 대체 텍스트를 완전히 확장해야 합니다 \tmp
(그러나 필요하지 않으며 직접 정의할 수 있음 \out
).
\documentclass{article}
\usepackage{xparse}
\usepackage{fp}
\usepackage{xstring}
\usepackage{ifthen}
\usepackage{printlen}
\usepackage{listofitems}
\usepackage{forloop}
\usepackage{pgffor}
\NewDocumentCommand\SwitchCase{m m}
{%
\setsepchar{,/-}%
\readlist\Cases{#2}%
\foreach \ct in {1,...,\Caseslen}
{%
\ifthenelse{\equal{#1}{\Cases[\ct ,1]}}
{%
\xdef\out{\Cases[\ct, 2]}
}
{}%
}%
\out
}
\begin{document}
\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}
\end{document}
그러면 3이 출력됩니다.
매크로가 호출되는 상황에 따라 무시할 수 없는 공백을 생성하는 보호되지 않은 줄 끝을 주의하세요.
다음을 사용하는 더 짧은 버전 expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\SwitchCase{m m}
{
\clist_map_inline:nn { #2 }
{
\__cdickstein_switchcase_item:nn { #1 } { ##1 }
}
}
\cs_new:Nn \__cdickstein_switchcase_item:nn
{
\__cdickstein_switchcase_item:nw { #1 } #2 \q_stop
}
\cs_new:Npn \__cdickstein_switchcase_item:nw #1 #2 - #3 \q_stop
{
\str_if_eq:nnT { #1 } { #2 } { \clist_map_break:n { #3 } }
}
\ExplSyntaxOff
\begin{document}
\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}
\end{document}
첫 번째 경기에서 멈춥니다.
첫 번째 일치에서 다시 멈추는 확장형 버전입니다.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand\SwitchCase{m m}
{
\__cdickstein_switchcase:nw { #1 } #2 , , \q_nil
}
\cs_new:Npn \__cdickstein_switchcase:nw #1 #2 ,
{
\tl_if_blank:nTF { #2 }
{
\use_none:n
}
{
\__cdickstein_switchcase_item:nw { #1 } #2 \q_stop
\__cdickstein_switchcase:nw { #1 }
}
}
\cs_new:Npn \__cdickstein_switchcase_item:nw #1 #2 - #3 \q_stop
{
\str_if_eq:nnT { #1 } { #2 } { #3 \__cdickstein_swithcase_break:w }
}
\cs_new:Npn \__cdickstein_swithcase_break:w #1 \q_nil {}
\ExplSyntaxOff
\begin{document}
\SwitchCase{hello}{hel-1,he-2,hello-3,Hello-4}
\SwitchCase{x}{x-1,y-2,x-3}
\end{document}