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

Относительная спецификация раздела

Можно ли указать уровень \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 для латекса и "относительный раздел" приводит к хитам, которые почти исключительно связаны с неправильным использованием слова "родственник"; авторы хотели сказать "соответствующий раздел".

Спасибо за любые идеи.

Лиам

4b9b3361

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