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. Идеи?
Ответы
Ответ 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}