Относительная спецификация раздела
Можно ли указать уровень \section\subsection\subsubsection и т.д. относительно предыдущего уровня? Я думаю о чем-то вроде
\thissection The top level
\pushsection
\thissection The next level down
\thissection One more
\pushsection
\thissection Deeper
\popsection
\thissection At the same level and follows "one more"
и т.д.. Идея состоит в том, что я пишу документ изнутри
то есть, начиная с более глубоких уровней, и я не знаю, сколько слоев будет над ним. Это позволит избежать массового повторного выравнивания путем переименования \subsection в\subsubsection и т.д.
BTW, поиск Google для латекса и "относительный раздел" приводит к хитам, которые почти исключительно связаны с неправильным использованием слова "родственник"; авторы хотели сказать "соответствующий раздел".
Спасибо за любые идеи.
Лиам
Ответы
Ответ 1
Вы можете реализовать свои \pushsection
, \popsection
и \thissection
с помощью счетчика и логики if-then-else:
\usepackage{ifthen}
\newcounter{section-level}
\setcounter{section-level}{0}
\newcommand{\pushsection}{\addtocounter{section-level}{1}}
\newcommand{\popsection}{\addtocounter{section-level}{-1}}
\newcommand{\thissection}[1]
{
\ifthenelse{\equal{\value{section-level}}{0}}{\section{#1}}{}
\ifthenelse{\equal{\value{section-level}}{1}}{\subsection{#1}}{}
\ifthenelse{\equal{\value{section-level}}{2}}{\subsubsection{#1}}{}
}
Это будет работать точно так же, как показано выше, для 3 уровней раздела. Конечно, вы, вероятно, должны что-то предпринять, чтобы обрабатывать уровни вложенности вне диапазона (например, сбой сборки TeX и печать предупреждения).
Ответ 2
Я сделал пакет из предложений в других ответах.
Вместо метафоры стека команды \leveldown
, \levelup
и \dynsection
.
Присутствует среда asection
, и я добавил \gotochapterlevel
.
\leveldown
и \levelup
принимают необязательные аргументы, чтобы сразу переходить на несколько уровней.
Я старался уважать минимальный и максимальный уровни разных классов документов и их имен, но на самом деле беспорядок. Так что теперь вам лучше просто взломать свою любимую секционирующую иерархию в вещь, которая должна быть легкой.
Я надеюсь, что кто-то найдет это полезным или может даже улучшить его (не должно быть так сложно, действительно):
Относительный пакет секционирования
Ответ 3
Учитывая следующий рекурсивный макрос для генерации строки несколько раз:
\newcommand{\Repeat}[2]{% #1=number of times, #2=what to repeat
\ifnum\the\numexpr#1\relax>0%
#2%
\expandafter\Repeat\expandafter{\the\numexpr#1-1\relax}{#2}%
\fi%
}%
и глобальный счетчик, который скажет, сколько "суб" нам нужно добавить:
\newcounter{section-level}
\setcounter{section-level}{0}
тогда у вас есть макросы:
\def\pushsection{\addtocounter{section-level}{1}}
\def\popsection{\addtocounter{section-level}{-1}}
\def\thissection#1{%
\csname\Repeat{\value{section-level}}{sub}section\endcsname%
}%
Однако я также рассмотрел бы определение среды, которая вызывает нажатие и выскакивание:
\newenvironment{asection}[2][\defopt]{% #1=toc entry (optional), #2=heading
\def\defopt{#2}%
\thissection[#1]{#2}%
\pushsection%
}{%
\popsection%
}%
и перепишите свой пример в:
\begin{asection}{The top level}
\begin{asection}{The next level down}\end{asection}
\begin{asection}{One more}
\begin{asection}{Deeper}\end{asection}
\end{asection}
\begin{asection}{At the same level and follows "one more"}\end{asection}
\end{asection}