\newcommand / \newenvironment - дополнительные параметры

Я экспериментирую со своими собственными командами и средами, и теперь я сталкиваюсь с теми проблемами:

  1. Как создать команду \foo{parameter}[optional] или названная среда \begin{bar}{parameter}[optional]?
  2. Как создать команду \foo[optional_1]...[optional_n]{parameter}

Я попробовал

\newcommand{\foo}[3][][]{#1#2#3}    - failed
\newcommand{\foo}[3][2][][]{#1#2#3} - failed

Кто-либо знает некоторую подсказку?Большое спасибо.

17
задан Crowley 25 May 2010 в 22:11
поделиться

3 ответа

Использование пакета 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» требует значения по умолчанию (которое я сделал пустым, включив пустая группа).

13
ответ дан 30 November 2019 в 12:06
поделиться
  1. Вы не можете создать \ 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} . Если вам действительно нужна команда в другой форме, см. Конец моего ответа.

  2. В 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 {обязательный} , и все должно работать.

16
ответ дан 30 November 2019 в 12:06
поделиться

Рассмотрим также пакет 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)

.
5
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

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