Аргумент 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. - идеи?

4 ответов


попробуйте следующий тест:

\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 пакета предоставляет \ifthenelse построить и для документации).


использование пакета LaTeX3 xparse:

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

в базовом движке TeX, с которым написан LaTeX, фиксируется количество аргументов, которые может принимать команда. Что вы сделали с default [\@empty] попросите LaTeX изучить следующий токен, чтобы увидеть, является ли он открытой квадратной скобкой [. Если это так, LaTeX принимает содержимое квадратных скобок в качестве аргумента, если нет, следующий токен возвращается во входной поток и по умолчанию \@empty вместо этого используется аргумент. Поэтому, чтобы ваша идея работала, вы должны использовать площадью скобки для разграничения необязательного аргумента при наличии:

\optarg
\optarg[]
\optarg[test]

вам должно повезти с этой нотацией.

раздражает, что вы не можете использовать те же скобки для необязательного аргумента, что и для требуемого аргумента, но это так.


\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}