명령에 인수를 전달하는 구문

명령에 인수를 전달하는 구문

일반 프로그래밍 언어에서는 다음과 같은 방식으로 함수를 호출하는 데 익숙합니다.

myfunction(argument1, argument2, ..., argumentn)

라텍스에는 이 구문이 필요한 것 같습니다.

\mycommand{argument1}{argument2}...{argumentn}

명령을 사용합니다. (모든 단일 인수에 대해 중괄호를 작성하는 대신) 일반적인 함수 구문을 사용하여 명령을 호출할 수 있습니까? 나는 이것을 할 수 있기를 원합니다 :

\mycommand{argument1, argument2, ..., argumentn}

답변1

다른 답변에서는 쉼표로 분할하는 방법을 다루었지만 더 넓은 설명도 유용할 수 있습니다. LaTeX는 일반적으로 프로그래밍할 수 있지만 조판을 위한 문서 준비 시스템이라는 사실부터 시작하는 것이 중요합니다. 기본 언어(TeX)의 디자인도 동일한 목표를 반영하며 LaTeX는 여기서 TeX 자체와 동일한 규칙을 주로 사용합니다.

인수 전달 측면에서 TeX는 '균형 잡힌 텍스트'를 처리합니다. 이는 (보통) 로 시작 {하고 끝나는 임의의 자료입니다 }. '균형 잡힌 텍스트'를 구분하는 데 사용되는 문자는 변경할 수 있지만 두 문자가 필요하고 서로 다르다는 사실은 변경할 수 없습니다. 즉, 다음 형식으로 인수를 전달해야 합니다.

\foo{balanced text 1}{balanced text 2}

등.TeX은 더 복잡한 '구분된' 인수 유형을 허용하므로 다음을 설정할 수 있습니다(다윗처럼) 쉼표로 자료를 나누기 위해

\def\foo(#1,#2){Stuff with #1 and #2}
\foo(abc,def) => #1 = abc, #2 = def

하지만 이는 프로그래밍 계층에서 정의되어야 합니다. 단순히 '핵심 구문을 전환'할 수는 없습니다. 게다가 제가 방금 사용한 간단한 정의는필요하다입력에 쉼표: 다른 일반 언어를 모델링하는 경우 인수가 선택 사항일 것으로 예상할 수 있습니다. 보다 정교한 프로그래밍을 사용하여 다양한 수의 쉼표로 분할할 수 있지만 이는 항상 레이어가 됩니다.위에핵심의.

염두에 두어야 할 한 가지 핵심 사항은 TeX에는 문자열 데이터나 함수/변수 분할이 없다는 것입니다. 우리는 단지 '토큰'만 있습니다. 중요한 것은 쉼표가 어디에서나 사용될 것으로 예상할 수 있으므로 \foo(abc,efg) 구문을 사용하는 경우 쉼표를 '보호'해야 한다는 의미입니다.

\foo({abc,def},ghi) => #1 = abc,def; #2 = ghi

(나에게) 이것은 다음보다 더 명확하지 않습니다

\baz{abc,def}{ghi}

또한 여기에서 주목할 만한 점은 를 사용하면 ( ... )몇 가지 문제가 발생한다는 것입니다. 즉, 문제를 일으키지 않거나 더 복잡한 코드 설정 없이는 인수에 나타날 수 없습니다(참고자료 참조 xparse).

답변2

명령을 정의하고 인수 목록의 요소로 작업을 수행하는 처리 명령을 정의하는 방법 expl3(xparse에서 직접 사용하지 않음 \SplitList)이지만 이 프로세서 명령은 기본적으로 목록의 개별 요소에 대해 동일한 작업을 수행합니다.

참고: 서로 다른 의미를 갖는 많은 인수의 경우 key-value접근 방식이 더 효과적이거나 적어도 오류 발생 가능성이 적습니다.

\documentclass{article}

\usepackage{xparse}


\ExplSyntaxOn
\newcommand{\foocmd}[1]{%
  \seq_set_from_clist:Nn \l_tmpa_seq {#1}
  \seq_map_inline:Nn \l_tmpa_seq {%
    \fooprocessorcmd{##1}%
  }
}

\ExplSyntaxOn

\newcommand{\fooprocessorcmd}[1]{\fbox{#1}}

\begin{document}
\foocmd{r,o,f,y,b,i,v}
\end{document}

답변3

한 언어에서 다른 언어로 관용어를 강제로 적용하는 것이 항상 좋은 생각은 아니지만, 예를 들어

여기에 이미지 설명을 입력하세요

\documentclass{article}
\def\zz#1{\zzz#1\relax}
\def\zzz#1,#2,#3,#4\relax{\fbox{#1} \fbox{#2} \fbox{#3} \fbox{#4}}
\begin{document}

\zz{a,b,c,d}

\end{document}

쉼표로 구분된 목록을 처리하는 것과는 달리(예를 들어)

 \usepackage{array,color,longtable,booktabs}

위에 정의된 것에 \zz(z)는 고정된 수의 인수가 있으며 로 액세스되지만 #1대신 #4쉼표 구문을 사용합니다 {}.

또한 네 가지 인수가 포함되지 않거나 ,필요한 \relax경우 이를 보호해야 한다고 가정합니다 {}.\zz{{1,2},{3,4},{5,6},{7,8}}

답변4

다음은 매우 간단한 listofitems접근 방식입니다.

\documentclass{article}
\usepackage{listofitems}
\newcommand\mycommand[1]{%
  \readlist*\myargs{#1}%
  The \myargslen{} arguments are \showitems\myargs.
  The 4th argument is ``\myargs[4].''
}
\begin{document}
\mycommand{this, is, a, big, test}

\mycommand{What, would, you do, for a, Klondike, bar?}
\end{document}

여기에 이미지 설명을 입력하세요

관련 정보