Спецификация относительного раздела - PullRequest
12 голосов
/ 14 января 2010

Можно ли указать уровень \ section \ subsection \ subsubsection etc. относительно предыдущего уровня? Я думаю о чем-то вроде

\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 и т. Д.

Кстати, поиск в Google латекса и «относительного раздела» приводит к попаданиям, которые почти исключительно связаны со злоупотреблением словом «родственник»; авторы хотели сказать «соответствующий раздел».

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

Ли

Ответы [ 3 ]

9 голосов
/ 14 января 2010

Вы можете реализовать свои \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 и печать предупреждения).

6 голосов
/ 16 ноября 2011

Я сделал пакет из предложений в других ответах.

Вместо метафоры стека используются команды \leveldown, \levelup и \dynsection.

Окружение asection присутствует, и я добавил \gotochapterlevel.

\leveldown и \levelup принимают необязательные аргументы для одновременного перехода на несколько уровней.

Я пытался соблюдать минимальный и максимальный уровни различных классов документов и их названий, но на самом деле это беспорядок. Так что сейчас вам лучше просто взломать вашу любимую иерархию секционирования на то, что должно быть легко.

Я надеюсь, что кто-то найдет это полезным или даже может улучшить его (на самом деле не должно быть так сложно):

Пакет относительного секционирования

1 голос
/ 09 сентября 2011

Учитывая следующий рекурсивный макрос для генерации строки несколько раз:

\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%
}%

и глобальный счетчик, который скажет, сколько «sub» нам нужно добавить:

\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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...