Латекс:как использовать обязательный аргумент по умолчанию для необязательного?
-
22-08-2019 - |
Вопрос
Я пытаюсь создать команду LaTeX с двумя аргументами, один из которых необязательный.Обычно я бы сделал это как
\newcommand{\whatever}[2][default]{first #1 second #2}
где default
является значением по умолчанию для первого аргумента.Но для этой команды я хочу, чтобы значение второго аргумента использовалось в качестве значения по умолчанию для первого аргумента - то есть я хочу
\whatever{blah}
\whatever{foo}
\whatever[lol]{rofl}
быть эквивалентным
\whatever[blah]{blah}
\whatever[foo]{foo}
\whatever[lol]{rofl}
Кто-нибудь знает, как это сделать?При необходимости я могу перейти к обычному тексту.
Решение
Ядро LaTeX имеет встроенный метод для этого, хотя он широко не используется.Вот пример:
\makeatletter
\newcommand\@foo[2][]{[1: #1, 2: #2.] }
\newcommand\foo{\@dblarg\@foo}
\makeatother
\foo{same}
\foo[hello]{world}
Очевидно, что \makeatletter
команды могут быть отброшены, если вы делаете это внутри .sty
или .cls
файл.
Другие советы
Уродливый взлом:
\usepackage{ifthen}
...
\newcommand{\whatever}[2][uniquenonesense]{
...
\ifthenelse{\equal{#2}{uniquenonesense}}{#1}{#2}
...
}
Предположительно, вы хотели что-то почище, но это то, что у меня есть.
В зависимости от вашей семантики, uniquenonesense
может быть, пусто.
\newcommand{\haha}[2]{\backslash whatever \left[ #1 \right]
\left[ #1 \right] }
\begin{document}
$\haha{blah}{blah}$\\
$\haha{stupid}{Idiot}$
\end{document} % This works very well.