Подтвердить что ты не робот

LaTeX: переопределение команды

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

Обычно (т.е. для неуправляемых команд) я бы сделал это следующим образом:

\let\[email protected]\part
\renewcommand\part[2][]{
  \[email protected][#1]{#2}
  … rest of definition}

То есть, я бы сохранил исходное определение \part в \[email protected] и использовал его.

Однако это не работает для избранных команд, поскольку они не определяют одну лексему (в отличие от команды \part в приведенном выше примере). Это сводится к следующему вопросу: Как сохранить сохраненную команду?

Обратите внимание, что я уже знаю, как переопределить команду starred, используя команду \WithSuffix из пакета suffix. Это не проблема.

4b9b3361

Ответ 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.