LyX | изменить порядок аргументов макроса

LyX | изменить порядок аргументов макроса

Можно ли в LyX изменить порядок обязательных и дополнительных аргументов макроса?

Я хочу, чтобы аргумент option располагался после обязательного аргумента в этом макросе.

Если это возможно, как это сделать?

Скриншот макроса

решение1

Я не рекомендую этого делать, потому что это запутает любого, кто будет читать ваш документ. Это также не будет работать для всех макросов, особенно тех, которые играют с кодами категорий до чтения их аргументов. Тем не менее, это возможно.

Вот код LaTeX, определяющий макрос \flip, который меняет местами обязательные и необязательные аргументы макроса, который определен так, что имеет ровно один обязательный аргумент и один необязательный аргумент.

\usepackage{etoolbox}

\makeatletter
\newcommand*\flip[1]{%
    \cslet{flip@\string#1}#1%
    \long\def#1##1{%
        \@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
    }%
}
\long\def\@flip#1#2[#3]{%
    \csuse{flip@\string#1}[#3]{#2}%
}
\makeatother

Например, учитывая макрос

\newcommand\foo[2][none]{%
    \par
    Required argument: #2\\
    Optional argument: #1%
}

вы можете написать \flip\fooодин раз, и он переопределится, \fooчтобы принять обязательный аргумент, за которым следует необязательный аргумент. Вот полный документ, иллюстрирующий это.

\documentclass{article}
\usepackage{parskip}
\usepackage{etoolbox}

\makeatletter
\newcommand*\flip[1]{%
    \cslet{flip@\string#1}#1%
    \long\def#1##1{%
        \@ifnextchar[{\@flip{#1}{##1}}{\csuse{flip@\string#1}{##1}}%
    }%
}
\long\def\@flip#1#2[#3]{%
    \csuse{flip@\string#1}[#3]{#2}%
}
\makeatother

\newcommand\foo[2][none]{%
    \par
    Required argument: #2\\
    Optional argument: #1%
}


\begin{document}

Normal use:
\foo{blah}
\foo[option]{asdf}

Now we can flip the arguments:
\flip\foo
\foo{blah}
\foo{asdf}[option]
\end{document}

введите описание изображения здесь

До сих пор я никогда не пользовался LyX, но мне удалось вставить свой код в преамбулу и добиться того же эффекта.

Обратите внимание, что \flipне учитывается отсутствие \longв макросе (т. е. макросы, определенные через \defсемейство без \longили определенные через \newcommand*). Это может привести к запутанным ошибкам в некоторых случаях. С этим можно справиться аналогично тому, как etoolboxпатчит макросы, но, похоже, не стоило этого делать для этого ответа.

Также можно было бы определить \flipтак, чтобы он не переопределял свой аргумент, а вместо этого \flip\foo{required}[optional]расширялся до \foo[optional]{required}. Что-то вроде (не проверено)

\long\def\flip#1#2[#3]{#1[#3]{#2}}

что превратило бы необязательный аргумент в обязательный, но если у вас нет необязательного аргумента, то нет смысла использовать \flip.

В заключение хочу сказать, что это возможно, но, вероятно, не стоит этого делать.

Связанный контент