Существует множество вариаций вопроса «Как мне поместить ненумерованные разделы в оглавление?»...
- Создание ненумерованных глав/разделов (плюс добавление их в оглавление и/или заголовок)
- \tableofcontents не содержит ненумерованную главу
- Как использовать \section*{something}, не удаляя его из оглавления?
- ...
и ни один из ответов мне не подходит, потому что все они включают в себя вставку \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
необязательный аргумент.