решение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
.
В заключение хочу сказать, что это возможно, но, вероятно, не стоит этого делать.