Подтвердить что ты не робот

LaTeX\newcommand аргумент default: пуст?

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

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

4b9b3361

Ответ 1

Попробуйте выполнить следующее тестирование:

\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 файл для документации).

Ответ 2

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

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

Ответ 3

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

\optarg
\optarg[]
\optarg[test]

У вас должно быть больше удачи в этих обозначениях.

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

Ответ 4

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