ЛАТЕКС \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. Идеи?

36
задан kolypto 27 January 2010 в 02:22
поделиться

3 ответа

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

\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 и \ isuppy тестовое задание.

Другой вариант - использовать пакет IFMTARG (см. Файл IFMTARG.STY для документации).

48
ответ дан 27 November 2019 в 05:46
поделиться

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

\optarg
\optarg[]
\optarg[test]

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

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

8
ответ дан 27 November 2019 в 05:46
поделиться

Использование пакета XPARSE LaTex3:

\usepackage{xparse}
\NewDocumentCommand\optarg{g}{%
  \IfNoValueF{#1}{(((#1)))}%
}
12
ответ дан 27 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: