LaTeX: переопределение помеченной звездочкой команды

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

Обычно (т.е. для непомеченных команд) я бы сделал это так:

\let\old@part\part
\renewcommand\part[2][]{
  \old@part[#1]{#2}
  … rest of definition}

То есть я бы сохранил исходное определение \part в \old@part и использовал его.

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

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


person Konrad Rudolph    schedule 10.03.2010    source источник


Ответы (2)


Нет команды \part*. Что происходит, так это то, что команда \part просматривает следующий символ после него (с \@ifstar) и отправляет одну из двух других подпрограмм, которые выполняют фактическую работу в зависимости от того, есть ли там звездочка или нет.

Ссылка: запись часто задаваемых вопросов по TeX Команды, определенные с параметрами *

person Nietzche-jou    schedule 10.03.2010
comment
«Нет команды \part*». - Я знаю. :-( Иначе у меня не было бы этой проблемы. - person Konrad Rudolph; 10.03.2010
comment
Итак, переопределите \part, как у вас, и обработайте обе версии? Или копаться в исходниках LaTeX и переопределять базовый код со звездочкой-\part? - person Nietzche-jou; 10.03.2010
comment
… но это был жизненно важный намек. У меня это работает сейчас. Скоро опубликую решение. - person Konrad Rudolph; 10.03.2010
comment
Не могли бы вы сказать, почему вы хотите переопределить \part*, чтобы добавить запись оглавления? Потому что отсутствие добавления — это своего рода смысл предоставления помеченной версии в первую очередь, и это звучит довольно глупо. - person Nietzche-jou; 10.03.2010
comment
@sgm: Помеченная звездочкой версия \part также без номера, чего я и хочу. В качестве альтернативы можно было бы переопределить версию без пометки, чтобы она стала ненумерованной, но я чувствовал, что это было бы еще менее последовательным, поскольку пометка команды звездочкой — это в значительной степени соглашение сделать команду ненумерованной, а не только в заголовках разделов. - person Konrad Rudolph; 10.03.2010
comment
Если это так, я бы предложил использовать пакет titlesec для изменения стилей заголовков, что в конечном итоге будет намного проще и неудивительно для других LaTeXnicians, а не возиться с переопределение команд. - person Nietzche-jou; 10.03.2010
comment
Спасибо за предложение пакета, похоже, это может сэкономить мне немного работы. До сих пор я всегда полностью переопределял команды заголовков, когда хотел их стилизовать. - person Konrad Rudolph; 11.03.2010

Благодаря ответу @smg я собрал решение, которое отлично работает. Вот полный источник вместе с пояснительными комментариями:

% If this is in *.tex file, uncomment the following line.
%\makeatletter

% Save the original \part declaration
\let\old@part\part

% To that definition, add a new special starred version.
\WithSuffix\def\part*{
  % Handle the optional parameter.
  \ifx\next[%
    \let\next\thesis@part@star%
  \else
    \def\next{\thesis@part@star[]}%
  \fi
  \next}

% The actual macro definition.
\def\thesis@part@star[#1]#2{
  \ifthenelse{\equal{#1}{}}
   {% If the first argument isn’t given, default to the second one.
    \def\thesis@part@short{#2}
    % Insert the actual (unnumbered) \part header.
    \old@part*{#2}}
   {% Short name is given.
    \def\thesis@part@short{#1}
    % Insert the actual (unnumbered) \part header with short name.
    \old@part*[#1]{#2}}

  % Last, add the part to the table of contents. Use the short name, if provided.
  \addcontentsline{toc}{part}{\thesis@part@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.
person Konrad Rudolph    schedule 10.03.2010