\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

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

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 от with \newcommand. Вы можете определить, дается ли один или нет:

\NewDocumentCommand\foo{mo}{%
  \IfNoValueTF{#2}
   {Code without #2}
   {Code with #2}%
}

Вы увидите, что это работает с использованием "o" в нижнем регистре, тогда как "O" в верхнем регистре требует значения по умолчанию (которое я сделал пустым, добавив пустую группу).

  1. Вы не можете создать \foo{parameter}[optional] командовать просто; Вы можете, однако, создать \foo[optional]{parameter} команда с

    \newcommand{\foo}[2][def]{Mandatory: #2; optional: #1}
    

    Если вы называете это как \foo{given}будет производить Mandatory: given, optional: def; если вы называете это как \foo[optional]{given}будет производить Mandatory: given, optional: optional, Вероятно, именно так вы и должны это делать - это будет выглядеть лучше с остальной частью вашего кода LaTeX. Создание новой среды с необязательными параметрами выполняется аналогично

    \newenvironment{env}[2][def]{(#1,#2)\begingroup}{\endgroup}
    

    где # снова необязательный аргумент; это снова написано как \begin{env}[opt]{req}...\end{env}, Если вы действительно хотите команду в другой форме, см. Конец моего ответа.

  2. В FAQ по TeX есть ответ о написании команд с несколькими необязательными аргументами. Есть два варианта, как это сделать. Основная идея состоит в том, чтобы определить команду, которая принимает необязательный аргумент, а затем запускает другую команду, которая сама принимает необязательный аргумент и т. Д.; пакет twoopt инкапсулирует это.


Если вы действительно хотите команду, как \reversed{mandatory}[optional]Вы можете сделать это так. Сначала вы определяете команду, которая принимает требуемый аргумент, сохраняет ее в макросе, а затем пересылаете ее в другую команду. Эта вторая команда принимает необязательный аргумент и использует определенную команду и необязательный аргумент. Собрав все это вместе, мы получим

\makeatletter
\newcommand{\reversed}[1]{\def\reversed@required{#1}\reversed@opt}
\newcommand{\reversed@opt}[1][def]{Required: \reversed@required; optional: #1}
\makeatother

Вы можете использовать \reversed{mandatory}[optional] или просто \reversed{mandatory}и все должно работать.

Рассмотрим также пакет xargs. Ниже приведен пример из его документации.

Настройте его обычным способом,

\usepackage{xargs}

а затем, если вы определите

\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}

(что означает использование "1" для первого аргумента, если он не указан, и использование "n" для третьего). затем

$\coord{x}$

доходность (без подписки)

(x1,..., xn)

а также

$\coord[0]{y}$

возвращает (опять же, без подписей, а у заменяет обязательный параметр)

(y0,..., yn)

Я знаю, что уже есть исчерпывающие ответы, но в некоторых случаях я хочу дать разные определения для разных ситуаций. Для этого есть очень простое, но простое решение. Записываю на всякий случай.

% ----------------------------------
%! TEX program = XeLaTeX
% !TeX encoding = UTF-8
% Author:       Troy_Daniel 
% Email:        Troy_Daniel@163.com
% ----------------------------------
\documentclass{article}
\usepackage{xcolor}

\newcommand{\Caption}[3]{%
    \textcolor[rgb]{0.36, 0.72, 0.80}{\Large #1}
    {\def\tmp{#3}
    \ifx\tmp\empty                                  % the third parameter is not provieded
        \textcolor[rgb]{0.96, 0.66, 0.35}{\small#2}
    \else                                           % non-empty third parameter
        \textcolor[rgb]{0.96, 0.66, 0.35}{\small[#3]#2}
    \fi}}
\begin{document}

\Caption{First}{Second}{}

\Caption{First}{Second}{Third}

\end{document}

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

Другие вопросы по тегам