Латекс:как использовать обязательный аргумент по умолчанию для необязательного?

StackOverflow https://stackoverflow.com/questions/707152

  •  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.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top