Аргумент 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}