LaTeX 옵션 인수


답변:


176

가이드의 예 :

\newcommand{\example}[2][YYY]{Mandatory arg: #2;
                                 Optional arg: #1.}

This defines \example to be a command with two arguments, 
referred to as #1 and #2 in the {<definition>}--nothing new so far. 
But by adding a second optional argument to this \newcommand 
(the [YYY]) the first argument (#1) of the newly defined 
command \example is made optional with its default value being YYY.

Thus the usage of \example is either:

   \example{BBB}
which prints:
Mandatory arg: BBB; Optional arg: YYY.
or:
   \example[XXX]{AAA}
which prints:
Mandatory arg: AAA; Optional arg: XXX.

21
나는 선택적인 인수가 주어 졌는지 , 기본값을 제공하지 않는지 를 결정하는 방법에 관한 질문이라고 생각합니다 .
Konrad Rudolph

43
사실이지만 기본 인수를 제공하는 방법을 찾는 동안이 질문을 찾았 으므로이 답변이 가장 유용했습니다.
Tanner Swett

26

"선택적 인수"작성의 기본 개념은 먼저 토큰 스트림에서 다음에 어떤 문자가 올 것인지를 감지하기 위해 먼저 스캔 한 다음 관련 매크로를 삽입하여 적절하게 나오는 인수를 처리하는 중간 명령을 정의하는 것입니다. 일반적인 TeX 프로그래밍을 사용하면 상당히 지루할 수 있습니다 (아직 어렵지는 않지만). LaTeX \@ifnextchar는 그러한 것들에 매우 유용합니다.

귀하의 질문에 가장 적합한 답변은 새 xparse패키지 를 사용하는 것 입니다. LaTeX3 프로그래밍 제품군의 일부이며, 임의의 선택적 인수로 명령을 정의하기위한 광범위한 기능을 포함합니다.

귀하의 예 \sec에서 하나 또는 두 개의 괄호 인수를 취하는 매크로가 있습니다. 이것은 xparse다음을 사용하여 구현됩니다 .

\ documentclass {article}
\ usepackage {xparse}
\ begin {document}
\ DeclareDocumentCommand \ sec {mg} {%
    {#1%
        \ IfNoValueF {# 2} {및 # 2} %
    } %
}
(\ sec {Hello})
(\ sec {Hello} {Hi})
\ end {문서}

이 인수 { m g }\sec; 의 인수를 정의합니다 . m"필수 인수"를 의미하고 g"선택적 중괄호"입니다. \IfNoValue(T)(F)그런 다음 두 번째 인수가 실제로 존재하는지 여부를 확인하는 데 사용할 수 있습니다. 허용되는 다른 유형의 선택적 인수에 대해서는 설명서를 참조하십시오.


4
의지! 작동하지 않습니다. 출력 :(Hello and ) (Hello and Hi)
Alexey Malistov

피드백 주셔서 감사합니다, Alexey. 이전 버전의 xparse를 사용하고있는 것 같습니다. 최근에 많은 작업이있었습니다. TeX Live 2009가 방금 출시되었습니다 :)
Will Robertson

24

위의 모든 내용은 LaTeX에서 훌륭하고 유연하거나 과부하가 걸리는 기능을 만드는 것이 어려울 수 있음을 보여줍니다. (Tex 코드는 그리스인처럼 보입니다)

글쎄, 최근 (유연하지는 않지만) 최근의 개발을 추가하기 위해 논문 문서에서 최근에 사용한 내용은 다음과 같습니다.

\usepackage{ifthen}  % provides conditonals...

"선택적"명령을 기본적으로 공백으로 설정하여 명령을 시작하십시오.

\newcommand {\figHoriz} [4] []  {

그런 다음 선택적 인수가 비어 있는지 여부에 따라 매크로가 임시 변수 \ temp {}를 다르게 설정했습니다. 이것은 전달 된 인수로 확장 될 수 있습니다.

\ifthenelse { \equal {#1} {} }  %if short caption not specified, use long caption (no slant)
    { \def\temp {\caption[#4]{\textsl{#4}}} }   % if #1 == blank
    { \def\temp {\caption[#1]{\textsl{#4}}} }   % else (not blank)

그런 다음 두 경우에 \ temp {} 변수를 사용하여 매크로를 실행합니다. (단지 사용자가 지정하지 않은 경우 짧은 자막을 긴 자막과 동일하게 설정합니다).

\begin{figure}[!]
    \begin{center}
        \includegraphics[width=350 pt]{#3}
        \temp   %see above for caption etc.
        \label{#2}
    \end{center}
\end{figure}
}

이 경우 \ newcommand {}가 제공하는 단일 "선택적"인수 만 확인합니다. 예를 들어 3 개의 "선택적"인수에 대해 설정 한 경우 여전히 3 개의 빈 인수를 보내야합니다.

\MyCommand {first arg} {} {} {}

LaTeX를 사용하는 한, 그것은 어리석은 일입니다. TeX 코드를 살펴보기 시작한 것은 감각적이지 않습니다 ... Robertson의 xparse 방법을 좋아합니다. 시도해 볼게요 ...


나는이 접근법을 좋아한다. "프로그래밍과 유사"하여 읽기가 더 쉽습니다. 잘 했어!
loved.by.Jesus

11

필요한 것은 다음과 같습니다.

\makeatletter
\def\sec#1{\def\tempa{#1}\futurelet\next\sec@i}% Save first argument
\def\sec@i{\ifx\next\bgroup\expandafter\sec@ii\else\expandafter\sec@end\fi}%Check brace
\def\sec@ii#1{\section*{\tempa\ and #1}}%Two args
\def\sec@end{\section*{\tempa}}%Single args
\makeatother

\sec{Hello}
%Output: Hello
\sec{Hello}{Hi}
%Output: Hello and Hi

나는 TeX가 명령 후 첫 번째 '상자'의 적절한 수를 매개 변수로 이해한다고 생각했습니다. 이 '상자'는 중괄호로 작성되거나 하나의 기호입니다. 즉. x^2+1또는 x^{2+1} 질문이 있습니다. 명령에서 중괄호가 있는지 테스트합니까? LaTeX 명령 \sec생성 : "A, b, c 및 d"명령 \sec{A}[b,c,d], "A 및 b" 명령 , \sec{A}[b] and "A" for \ sec {A}`작성이 가능합니까?
Crowley

두 가지 질문이 있습니다. 1) 예, 내 명령은 중괄호가 있는지 테스트합니다. 2) 예,을 위해 매크로를 만들 수 있습니다 \sec{A}[b,c,d]또는 \sec{A}[b]\sec{A}.
Alexey Malistov

6

내가 명령을 만들고 싶었 때 나는 비슷한 문제가 있었다 \dx생략하기 위해 \;\mathrm{d}x(즉, 적분의 차동 전에 여분의 공간을두고 똑바로뿐만 아니라 "D"가). 그러나 통합 변수를 선택적 인수로 포함 할 수있을만큼 유연하게 만들고 싶었습니다. 다음 코드를 프리앰블에 넣었습니다.

\usepackage{ifthen}

\newcommand{\dx}[1][]{%
   \ifthenelse{ \equal{#1}{} }
      {\ensuremath{\;\mathrm{d}x}}
      {\ensuremath{\;\mathrm{d}#1}}
}

그때

\begin{document}
   $$\int x\dx$$
   $$\int t\dx[t]$$
\end{document}

선택적 인수와 함께 \ dx를 제공합니다


-1

여기 내 시도가 있습니다.하지만 사양을 정확하게 따르지 않습니다. 완전히 테스트되지 않았으므로 조심하십시오.

\newcount\seccount

\def\sec{%
    \seccount0%
    \let\go\secnext\go
}

\def\secnext#1{%
    \def\last{#1}%
    \futurelet\next\secparse
}

\def\secparse{%
    \ifx\next\bgroup
        \let\go\secparseii
    \else
        \let\go\seclast
    \fi
    \go
}

\def\secparseii#1{%
    \ifnum\seccount>0, \fi
    \advance\seccount1\relax
    \last
    \def\last{#1}%
    \futurelet\next\secparse
}

\def\seclast{\ifnum\seccount>0{} and \fi\last}%

\sec{a}{b}{c}{d}{e}
% outputs "a, b, c, d and e"

\sec{a}
% outputs "a"

\sec{a}{b}
% outputs "a and b"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.