편집: 현상금 정보 아래 질문에 만족하며 이 현상금은 해당 질문에 대한 것입니다. 더 나은 것을 택할 수 없을 것 같아
LaTeX에서 선택적 인수의 사용에 대해 조금 검색했지만 몇 가지 사항은 아직 명확하지 않습니다.
언제
내 질문은 명령이나 패키지에 관한 것이 아니라 둘 다에 관한 것입니다.
패키지나 명령에 대해 하나 이상의 선택적 인수를 지정해야 하는 경우가 있습니다. 다음과 같은 명령을 찾을 수 있습니다.
\Foo[OptArg1,OptArg2]{Arg1}{Arg2}
그리고 좋아해요:
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
처음에는 쉼표로 구분된 두 개의 선택적 인수가 있는 하나의 패밀리를 봅니다. 두 번째에는 각 가족에 대해 하나의 선택적 인수가 있는 두 가족이 있습니다.
이 두 가지 방법에서 뭔가 다르다고 생각하지만 내 명령이 첫 번째 방법을 사용해야 하는 경우와 두 번째 방법을 사용해야 하는 경우를 정확히 이해하지 못했습니다.
예를 들어 첫 번째 선택적 인수를 사용하여 첫 번째 비선택적 인수를 여러 부분으로 분할하는 명령이 필요하다고 가정해 보겠습니다. 그런 다음 나는 두 번째 방법을 선호합니다. 첫 번째에서는 쉼표가 구분 기호로 이해되지 않기 때문입니다(이미 구분 기호임). 하지만 여전히 다음과 같은 명령을 사용할 수 있습니다.
\Foo[separator={,},OptArg2]{Arg1}{Arg2}
같은 일을하기 위해.
물론 두 번째 계열의 선택적 인수를 내 방식대로 분리하려면 \Foo[separator={//}][OptArg2//OptArg3]가 유일한(또는 적어도 더 나은) 선택이 될 것입니다. 두 번째 계열 인수를 읽기 전에 구분 기호입니다.
어떻게
또한 때때로 명령은 두 가족이 주어지면 다르게 행동해야 하고, 하나가 주어지면 순종해야 합니다. 예를 들어 위의 예에서 첫 번째 인수가 제공되지 않으면 쉼표를 사용하여 두 번째 선택적 인수를 구분합니다. 그러나 가 주어지면 구분 기호로 사용되며 명령은 인수를 읽을 때 다르게 동작합니다.
그러한 상황에서는 인수를 읽는 동안 더 많은 선택권이 있기 때문에 \def가 newcommand보다 명령을 작성하는 데 더 일반적인 옵션이라고 생각합니다. (\newcommand는 첫 번째 인수나 그와 유사한 것을 읽기 전에 두 번째 인수를 중단합니다. 두 번째 계열 인수에 포함된 ']'도 고려하세요...)
내 질문은 다음과 같습니다
- (표준 LaTeX) 언제 첫 번째 방법을 사용해야 하고 언제 두 번째 방법을 사용해야 합니까?
- \def가 인수의 양을 아직 알지 못하는 상황이나 위에서 이미 설명한 구분 기호 또는 ']'가 있는 상황과 같은 일반적인 상황에서 명령을 정의하는 유일하거나 더 나은 방법입니까?
PS: 두 번째 질문에서는 명령을 통해 다음 문자를 읽어 많은 상황을 처리할 수 있기를 원한다는 점을 고려하세요. (예를 들어 명령 뒤의 문자를 하나씩 읽고 두 개의 일반 인수나 \stop 등의 명령을 찾은 경우에만 중지하고 싶습니다. 이 코드는 묻지 않고 \newcommand가 할 수 있는지 묻는 것뿐입니다. 좋은 선택-또는 \def가 유일한 선택인 경우)
답변1
귀하의 질문에는 두 가지 별개의 내용이 혼합되어 있습니다. LaTex2e에는 선택적 인수 []
와 필수 인수가 있습니다 {}
.
\Foo[OptArg1,OptArg2]{Arg1}{Arg2}
하나의 선택적 인수와 두 개의 필수 인수가 있습니다.
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
두 개의 선택적 인수와 두 개의 필수 인수가 있습니다.
두 번째 문제는 쉼표로 구분된 목록입니다. 이것은 구문의 일부가 아닐 수도 있습니다. 단지 쉼표가 문자로 처리될 뿐입니다.
\newcommand\Foo[3][]{(#1)-(#2)(#3)}
then #1
would be OptArg1,OptArg2
, #2
would Arg1
and #3
would be Arg2
그리고 결과는 다음과 같습니다.
(OptArg1,OptArg2)-(Arg1)-(Arg2)
쉼표에는 특별한 규칙이 없습니다.
물론 명령은 인수를 사용하여 원하는 대로 수행할 수 있으며 여기에는 쉼표에 대한 반복이 포함될 수 있습니다. 해당 ( )에 대한 라텍스 형식의 기능이 있거나 \@for
여러 패키지에서 쉼표로 구분된 목록을 구문 분석하는 매크로를 제공합니다. 그러나 이는 선택적 인수 감지와는 별개입니다. (법적) 구문 예에서
\usepackage[foo,bar]{array,longtable}[2015/01/01 packages by you, me and someone]
두 개의 선택적 인수와 하나의 필수 인수가 있습니다. 첫 번째 선택적 인수와 필수 인수는 나중에 처리의 일부로 \usepackage
쉼표로 분할됩니다. 두 번째 선택적 인수는 쉼표로 분할되지 않지만 실제로 /
인수 시작 부분에서 날짜를 추출하기 위해 분할되고 공백이 있습니다.
정의에 관해서는 처음에 하나의 선택적 인수만 있는 경우 사용할 수 있습니다. \newcommand
두 개 이상의 인수가 있으면 사용할 수도 있지만 \newcommand
단계적으로 매크로를 정의해야 하지만 사용하기가 더 쉬울 수도 xparse
있고 비슷한 패키지를 허용하는 것이 더 쉬울 수도 있습니다. 사양이 더 간단해지고 필요한 내부 매크로 정의가 자동으로 처리됩니다. 그러나 다음과 같이 연속적인 선택적 인수를 너무 많이 사용하지 않는 것이 가장 좋습니다.
\Foo[OptArg1][OptArg2]{Arg1}{Arg2}
then 을 OptArg1
지정해야 하는 경우에는 실제로 선택 사항이 아닙니다 OptArg2
. 다음과 같은 구문
\Foo[opt1=a,opt2=b]{Arg1}
각 옵션을 독립적으로 생략할 수 있습니다. 그러나 이러한 키=값 구문 분석은 필수 인수이든 선택적 인수이든 관계없이 모든 토큰 문자열에 적용될 수 있습니다. 예를 들어 패키지를 graphicx
사용하여 선택적 인수에서 및 를 keyval
구문 분석합니다.,
=
\includegraphics[width=10pt,height=8pt]{image}
hyperref
필수 인수에서 동일한 구문을 구문 분석하기 위해 동일한 구문 분석을 사용합니다 .
\hypersetup{colorlinks=false,plainpages=true}