Переопределить `\section*` так, чтобы он вел себя *точно* как `\section`, за исключением исключения числа

Переопределить `\section*` так, чтобы он вел себя *точно* как `\section`, за исключением исключения числа

Существует множество вариаций вопроса «Как мне поместить ненумерованные разделы в оглавление?»...

и ни один из ответов мне не подходит, потому что все они включают в себя вставку \addcontentsline, а также, возможно, других вещей ( \mark, \phantomsection, ...?), в нужное место в документе. В моем случае команды \section*выдаются пакетами, и они не дают мне хуков для вставки вещей в нужное место; и также неясно, какой именно набор "других вещей" мне нужен. Было бы проще и надежнее, если бы я мог просто переопределить его \section*так, чтобы он вел себя точно так же, как его не помеченная звездочкой версия, за исключением того, что он не выводит номер раздела.

Как мне это сделатьчто?

Примечание: классы KOMA-Script не подходят. В настоящее время я использую plain articleдля черновиков, и в конечном итоге мне нужно будет добавить класс журнала.

Примечание 2 (из комментариев к попытке ответа): \secnumdepthглобальная настройка не сработает для меня, потому что (а) я все равно хочу обычную нумерацию разделов от unstarred \sectionи т. д., и (б) пакеты, которые выдают \section*команды, невозможно убедить использовать \sectionвместо этого plain.

решение1

Вы можете переопределить, \sectionчтобы захватить и обусловить, когда используется starred-version. После нахождения \section*, выдайте его так же, как вы бы это сделали \section, ноудалить механизм печати цифр с помощью соответствующей настройки счетчикаsecnumdepth.

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

\documentclass{article}

\usepackage{xparse}

\let\oldsection\section
\makeatletter
\newcounter{@secnumdepth}
\RenewDocumentCommand{\section}{s o m}{%
  \IfBooleanTF{#1}
    {\setcounter{@secnumdepth}{\value{secnumdepth}}% Store secnumdepth
     \setcounter{secnumdepth}{0}% Print only up to \chapter numbers
     \oldsection{#3}% \section*
     \setcounter{secnumdepth}{\value{@secnumdepth}}}% Restore secnumdepth
    {\IfValueTF{#2}% \section
       {\oldsection[#2]{#3}}% \section[.]{..}
       {\oldsection{#3}}}% \section{..}
}
\makeatother

\begin{document}

\tableofcontents

\section{TestA}

\section*{TestB}

\end{document}

xparseпредоставляет простой интерфейс для (пере)определения команд, которые могут иметь sзаархивированную версию, а также oнеобязательный аргумент.

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