\@ifstar
Синопсис:
\newcommand{\mycmd}{\@ifstar{\mycmd@star}{\mycmd@nostar}}
\newcommand{\mycmd@nostar}[nostar-num-args]{nostar-body}
\newcommand{\mycmd@star}[star-num-args]{star-body}
У многих стандартных окружений или команд LaTeX есть вариант с тем же именем, но заканчивающийся звездочкой *, а именно знаком звёздочки. Примерами являются окружения table и table* и команды \section и \section*.
При определении окружений следование этому шаблону просто, так как \newenvironment и \renewenvironment позволяют имени окружения содержать звездочку. Таким образом, вам достаточно написать \newenvironment{myenv} или \newenvironment{myenv*} и продолжить определение как обычно. В случае с командами ситуация более сложная, поскольку звездочка не является буквой и не может быть частью имени команды. Как показано в синопсисе выше, будет пользовательская команда, указанная как \mycmd, которая смотрит вперёд, чтобы увидеть, следует ли ей звездочка. Например, в LaTeX нет команды \section*; вместо этого используется команда \section, которая смотрит вперёд. Эта команда не принимает аргументы, а вместо этого расширяется до одной из двух команд, которые принимают аргументы. В синопсисе эти две команды — \mycmd@nostar и \mycmd@star. Они могут принимать одинаковое количество аргументов или разное количество, или не принимать аргументы совсем. Как всегда, в документе LaTeX команда с символом «@» @ в своём имени должна быть заключена в блок \makeatletter ... \makeatother (см. \makeatletter & \makeatother).
В этом примере \@ifstar определяется команда \ciel и её вариант \ciel*. Обе команды принимают по одному обязательному аргументу. Вызов \ciel{blue} вернёт «не звёздное голубое небо», а \ciel*{night} вернёт «звёздное ночное небо».
\makeatletter
\newcommand*{\ciel@unstarred}[1]{not starry #1 sky}
\newcommand*{\ciel@starred}[1]{starry #1 sky}
\newcommand*{\ciel}{\@ifstar{\ciel@starred}{\ciel@unstarred}}
\makeatother
В следующем примере звёздный вариант принимает другое количество аргументов, чем незавёздный. С этим определением, команда Агента 007 ``My name is \agentsecret*{Bond},
\agentsecret{James}{Bond}.'' эквивалентна вводу команд ``My name is \textsc{Bond}, \textit{James} textsc{Bond}.''
\newcommand*{\agentsecret@unstarred}[2]{\textit{#1} \textsc{#2}}
\newcommand*{\agentsecret@starred}[1]{\textsc{#1}}
\newcommand*{\agentsecret}{%
\@ifstar{\agentsecret@starred}{\agentsecret@unstarred}}
После имени команды звёздочка обрабатывается аналогично необязательному аргументу. (Это отличается от имён окружений, в которых звёздочка является частью самого имени и, следовательно, может находиться в любой позиции). Таким образом, технически можно вставить любое количество пробелов между командой и звёздочкой. Следовательно, \agentsecret*{Bond} и \agentsecret *{Bond} эквивалентны. Однако стандартной практикой является не вставка таких пробелов.
Существуют два альтернативных способа достижения цели \@ifstar. (1) Пакет suffix позволяет использовать конструкцию \newcommand\mycommand{unstarred-variant}, за которой следует \WithSuffix\newcommand\mycommand*{starred-variant}. (2) LaTeX предоставляет пакет xparse, который позволяет использовать следующий код:
\NewDocumentCommand\foo{s}{\IfBooleanTF#1
{starred-variant}%
{unstarred-variant}%
}
© 2007–2018 Karl Berry
Public Domain Software
http://latexref.xyz/_005c_0040ifstar.html