2010-01-27 2 views
35

나는 인수없이 아무것도 출력하지 않는 간단한 예제 명령을 작성하려고하지만 인수를 사용하여 뭔가를 둘러 쌉니다.LaTeX newcommand 기본 인수가 비어 있습니까?

나는 기본값이 \@empty해야 읽었습니다 및 간단한 \ifx\@empty#1 조건은 작업 수행해야합니다

\newcommand{\optarg}[1][\@empty]{% 
\ifx\@empty#1 {} \else {(((#1)))} \fi 
} 

\optarg % (((empty))) 
\optarg{} % (((empty))) 
\optarg{test} % (((empty))) test 

모두가 어떤 이유로 empty 단어를 인쇄 후자의 세 가지 명령을, 나는 처음 싶어 두 개는 아무것도 인쇄하지 않고 마지막 인쇄는 (((test)))입니다.

저는 TeXLive/Ubuntu를 사용하고 있습니다. 아이디어?

답변

40

는 다음의 시험을 시도해보십시오

\documentclass{article} 

\usepackage{xifthen}% provides \isempty test 

\newcommand{\optarg}[1][]{% 
    \ifthenelse{\isempty{#1}}% 
    {}% if #1 is empty 
    {(((#1)))}% if #1 is not empty 
} 

\begin{document} 

Testing \verb|\optarg|: \optarg% prints nothing 

Testing \verb|\optarg[]|: \optarg[]% prints nothing 

Testing \verb|\optarg[test]|: \optarg[test]% prints (((test))) 

\end{document} 

xifthen package\ifthenelse 구조와 \isempty 테스트를 제공합니다.

또 다른 옵션은 ifmtarg 패키지를 사용하는 것입니다 (설명서는 ifmtarg.sty file 참조).

+0

매력처럼 작동합니다, 감사합니다! :) – kolypto

8

LaTeX이 쓰여지는 기본 TeX 엔진에서 명령이 취할 수있는 인수의 수는 고정되어 있습니다. [\@empty]으로 무엇을했는지 LaTeX에 묻습니다. 다음 토큰이 열린 대괄호 [인지 확인합니다. 그렇다면 LaTeX는 대괄호의 내용을 인수로 사용하고, 그렇지 않으면 다음 토큰을 입력 스트림에 다시 넣고 기본 값 \@empty이 대신 사용됩니다.

\optarg 
\optarg[] 
\optarg[test] 

당신은이 표기법 더 나은 운이 있어야합니다 그래서 작동하도록 아이디어를 얻을, 당신은 존재하는 경우 선택적 인수를 구분하는 사각에게 괄호를 사용해야합니다.

필수 인수에 사용할 때 선택적 인수에 같은 대괄호를 사용할 수 없다는 것은 귀찮은 일입니다.

+0

와우, 감사를! 괄호가 그렇게 중요하지 않다고 생각하지 마십시오. 그러나 문제는 여전히 남아 있습니다 :'\ optarg'는 여전히'((empty)))'와'\ optarg [] = ((()))'를 제공합니다 (afaik는 어쨌든 작동하지 않아야합니다). 단지'\ optarg [test]'만이 예상대로'(((test)))'가되었습니다. – kolypto

+1

'\ ifx! #! else (((# 1))) \ fi'을 시도하고 디폴트 arg를'!'로 만드십시오. 작동한다면'!'을 우연히 사용할 가능성이 적은 것으로 변경할 수 있습니다. –

11

LaTeX3 xparse 패키지 사용 :

\usepackage{xparse} 
\NewDocumentCommand\optarg{g}{% 
    \IfNoValueF{#1}{(((#1)))}% 
} 
+0

AFAIK 패키지에도 사용하도록 고맙습니다. – kolypto

+1

xparse의 목적은 \ newcommand에 대한 완전한 대안을 제공하는 것입니다. 문서의 서문에서 일회성 명령어로 사용할 수있는 이유는 없습니다. 확실히 할 수 있습니다 (그러나 xparse의 현재 구현 대부분을 작성했습니다. 그러나 아이디어는 그렇지 않습니다. 정말 내). 이 문서의 예제는 주로 패키지에 대한 것이지만 다음 호에는 TUGBoat 문서를 작성하여 "문서"를 사용합니다. –

3
\documentclass{article} 

\usepackage{ifthen} % provides \ifthenelse test 
\usepackage{xifthen} % provides \isempty test 

\newcommand{\inlinenote}[2][]{% 
    {\bfseries{Note:}}% 
    \ifthenelse{\isempty{#1}} 
      {#2}    % if no title option given 
      {~\emph{#1} #2} % if title given 
} 

\begin{document} 

\inlinenote{ 
    simple note 
} 

\inlinenote[the title]{ 
    simple note with title 
} 

\end{document} 
관련 문제