Я экспериментирую со своими собственными командами и средами, и теперь я сталкиваюсь с теми проблемами:
\foo{parameter}[optional]
или названная среда \begin{bar}{parameter}[optional]
?\foo[optional_1]...[optional_n]{parameter}
Я попробовал
\newcommand{\foo}[3][][]{#1#2#3} - failed
\newcommand{\foo}[3][2][][]{#1#2#3} - failed
Кто-либо знает некоторую подсказку?Большое спасибо.
Использование пакета xparse (часть усилий по разработке LaTeX3):
\usepackage{xparse}
\NewDocumentCommand\foo{O{}O{}m}{%
% Code with optional #1 and #2 with empty defaults
}
\NewDocumentCommand\foo{mO{}}{%
% Code with optional #2 with empty default
}
\NewDocumentEnvironment{foo}{O{}}{%
% Start code with optional #1
}{%
% End code with optional #1
}
Дополнительные аргументы в xparse немного отличаются от аргументов с \ newcommand. Вы можете определить, задан он или нет:
\NewDocumentCommand\foo{mo}{%
\IfNoValueTF{#2}
{Code without #2}
{Code with #2}%
}
Вы увидите, что это работает, используя строчную букву «o», тогда как заглавная буква «O» требует значения по умолчанию (которое я сделал пустым, включив пустая группа).
Вы не можете создать \ foo {параметр} [необязательный ]
просто команда; однако вы можете создать команду \ foo [необязательный] {параметр}
с помощью
\ newcommand {\ foo} [2] [def] {Обязательно: # 2; необязательно: # 1}
Если вы назовете его как \ foo {given}
, он выдаст Обязательный: данный, необязательный: def
; если вы назовете его как \ foo [optional] {given}
, он выдаст Mandatory: given, optional: optional
. Вероятно, именно так и следует делать - это будет лучше смотреться с остальной частью вашего кода LaTeX.Создание новой среды с необязательными параметрами выполняется аналогично с
\ newenvironment {env} [2] [def] {(# 1, # 2) \ begingroup} {\ endgroup}
где #
снова является необязательным аргументом; это снова записывается как \ begin {env} [opt] {req} ... \ end {env}
. Если вам действительно нужна команда в другой форме, см. Конец моего ответа.
В TeX FAQ есть ответ о написании команд с более чем одним необязательным аргументом . Есть два варианта, как это сделать. Основная идея состоит в том, чтобы определить команду, которая принимает необязательный аргумент, а затем запускает другую команду, которая сама принимает необязательный аргумент и т. Д .; пакет twoopt инкапсулирует это.
Если вам действительно нужна команда типа \ reversed {обязательный} [необязательный]
, вы можете сделать это так. Сначала вы определяете команду, которая принимает требуемый аргумент, сохраняет его в макросе, а затем пересылает его другой команде. Эта вторая команда принимает необязательный аргумент и использует определенную команду и необязательный аргумент. Собирая все это вместе, получаем
\makeatletter
\newcommand{\reversed}[1]{\def\reversed@required{#1}\reversed@opt}
\newcommand{\reversed@opt}[1][def]{Required: \reversed@required; optional: #1}
\makeatother
Затем вы можете использовать \ reversed {обязательный} [необязательный]
или просто \ reversed {обязательный}
, и все должно работать.
Рассмотрим также пакет xargs. Ниже приведен пример из его документации.
Установите его обычным образом,
\usepackage{xargs}
а затем, если вы определите
\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}
(что означает использовать "1" для первого аргумента, если он не указан, и использовать "n" для третьего). Тогда
$\coord{x}$
дает (без подписей)
(x1, . . . , xn)
и
$\coord[0]{y}$
дает (опять без подписей, и y заменяет обязательный параметр)
(y0, . . . , yn)
.