LaTeX: переопределение команды
Я хочу переопределить команду \part*
, чтобы она автоматически добавляла строку содержимого. Это сложно, так как я хочу повторно использовать оригинальную команду \part*
внутри моей выпущенной версии.
Обычно (т.е. для неуправляемых команд) я бы сделал это следующим образом:
\let\[email protected]\part
\renewcommand\part[2][]{
\[email protected][#1]{#2}
… rest of definition}
То есть, я бы сохранил исходное определение \part
в \[email protected]
и использовал его.
Однако это не работает для избранных команд, поскольку они не определяют одну лексему (в отличие от команды \part
в приведенном выше примере). Это сводится к следующему вопросу: Как сохранить сохраненную команду?
Обратите внимание, что я уже знаю, как переопределить команду starred, используя команду \WithSuffix
из пакета suffix
. Это не проблема.
Ответы
Ответ 1
Нет команды \part*
. Происходит следующее: команда \part
просматривает следующий символ после него (с \@ifstar
) и отправляет одну из двух других подпрограмм, которые выполняют фактическую работу, основываясь на том, есть ли там звездочка или нет.
Ссылка: TeX FAQ запись Команды, определенные с * options
Ответ 2
Благодаря @smgs ответ, Ive объединил решение, которое отлично работает. Вот полный источник, а также пояснительные комментарии:
% If this is in *.tex file, uncomment the following line.
%\makeatletter
% Save the original \part declaration
\let\[email protected]\part
% To that definition, add a new special starred version.
\WithSuffix\def\part*{
% Handle the optional parameter.
\ifx\next[%
\let\next\[email protected]@star%
\else
\def\next{\[email protected]@star[]}%
\fi
\next}
% The actual macro definition.
\def\[email protected]@star[#1]#2{
\ifthenelse{\equal{#1}{}}
{% If the first argument isn’t given, default to the second one.
\def\[email protected]@short{#2}
% Insert the actual (unnumbered) \part header.
\[email protected]*{#2}}
{% Short name is given.
\def\[email protected]@short{#1}
% Insert the actual (unnumbered) \part header with short name.
\[email protected]*[#1]{#2}}
% Last, add the part to the table of contents. Use the short name, if provided.
\addcontentsline{toc}{part}{\[email protected]@short}
}
% If this is in *.tex file, uncomment the following line.
%\makeatother
(Для этого нужны пакеты suffix
и ifthen
.)
Теперь мы можем использовать его:
\part*{Example 1}
This will be an unnumbered part that appears in the TOC.
\part{Example 2}
Yes, the unstarred version of \verb/\part/ still works, too.