LaTeX \ newcommand аргумент по умолчанию: пусто? - PullRequest
36 голосов
/ 27 января 2010

Я пытаюсь написать простой пример команды, которая ничего не печатает без аргумента, но с аргументом она окружает его чем-то.

Я прочитал, что значение по умолчанию должно быть \@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 ]

45 голосов
/ 27 января 2010

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

\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 и тест \isempty.

Другим вариантом является использование пакета ifmtarg (см. Документацию ifmtarg.sty ).

11 голосов
/ 27 января 2010

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

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
8 голосов
/ 27 января 2010

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

\optarg
\optarg[]
\optarg[test]

Тебе повезло больше с этой записью.

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

3 голосов
/ 13 июля 2011
\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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...