\newcommand / \newenvironment - необязательные параметры
Я экспериментирую с моими собственными командами и средами, и теперь я сталкиваюсь с этими проблемами:
- Как создать команду
\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
Кто-нибудь знает какой-нибудь намек? Большое спасибо.
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" в верхнем регистре требует значения по умолчанию (которое я сделал пустым, добавив пустую группу).
Вы не можете создать
\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}
, Если вы действительно хотите команду в другой форме, см. Конец моего ответа.В 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}
И результат показан ниже, различные определения необязательного параметра (ов):