
Пакет outlines перезапускает нумерацию элемента после записи \0, которая является записью типа абзаца. В документации к пакету outlines представлен код преамбулы, позволяющий избежать перезапуска. Я также использую \usepackage[inline]{enumitem}\setlist{nosep}
для уменьшения вертикального интервала между элементами структуры. Код преамбулы, позволяющий избежать перезапуска счетчика структуры, не набирается с уменьшенным интервалом уровня элемента после команды \0. Более низкие уровни элементов набираются с правильным интервалом. Мой пример демонстрирует это. Я хотел бы удалить дополнительный интервал. Я только что заметил, что код ниже также помечает первый и второй уровни целыми числами, что нехорошо. Возможно, лучшим решением моей конкретной проблемы будет избежать дополнительного кода преамбулы и удалить команду \renewcommand{\outlinei}{cenumerate}
, а также вручную сбросить счетчик для элемента после команды \0. Я не смог этого сделать.
\usepackage{outlines}
\usepackage[inline]{enumitem}
\setlist{nosep}
% The following code comes from the outlines package manual
\newcounter{cenum}
\newcounter{cenumsaved}
\setcounter{cenumsaved}{0}
\newcommand{\labelcenum}{\arabic{cenum}.}
\newenvironment{cenumerate}%
{\begin{list}{\labelcenum}{\usecounter{cenum}}%
\setcounter{cenum}{\value{cenumsaved}}}%
{\setcounter{cenumsaved}{\value{cenum}}%
\end{list}}
\begin{document}
\renewcommand{\outlinei}{cenumerate} % Comment this command to see the change in spacing
\begin{outline}[enumerate]
\1 First item - notice the extra spacing after this item
\2 First subitem
\2 Second subitem
\0 Some text
\1 Second item - notice the extra spacing before and after this item
\2 First subitem
\2 Second subitem
\1 Third item - notice the extra spacing before and after this item
\2 First subitem
\2 Second subitem
\end{outline}
\end{document}
решение1
Что-то вроде этого?
\documentclass{article}
\usepackage{outlines}
\newcounter{cenumi}
\newcounter{cenumisaved}
\setcounter{cenumisaved}{0}
\newcommand{\labelcenumi}{\arabic{cenumi}.}
\newenvironment{cenumeratei}%
{\begin{list}{\labelcenumi}{\usecounter{cenumi}\partopsep=0pt\topsep=0pt\itemsep=0pt\parsep=0pt}%
\setcounter{cenumi}{\value{cenumisaved}}}%
{\setcounter{cenumisaved}{\value{cenumi}}%
\end{list}}
\newcounter{cenumii}
\setcounter{cenumii}{0}
\newcommand{\labelcenumii}{(\alph{cenumii})}
\newenvironment{cenumerateii}%
{\begin{list}{\labelcenumii}{\usecounter{cenumii}\partopsep=0pt\topsep=0pt\itemsep=0pt\parsep=0pt}%
}%
{%
\end{list}}
\begin{document}
\renewcommand{\outlinei}{cenumeratei}
\renewcommand{\outlineii}{cenumerateii}
\begin{outline}
\1 First item - notice the extra spacing after this item
\2 First subitem
\2 Second subitem
\0 Some text
\1 Second item - notice the extra spacing before and after this item
\2 First subitem
\2 Second subitem
\1 Third item - notice the extra spacing before and after this item
\2 First subitem
\2 Second subitem
\end{outline}
\end{document}
Возможно, код не оптимизирован. Работает только для двух уровней (но легко расширяется для 3 или 4 уровней).
решение2
Я принял решение, опубликованное выше quark67, и позже понял, что перекрестные ссылки на вложенные элементы перечисляли только родительский элемент. Например, перекрестная ссылка на элемент 1(a) сократилась до ссылки на элемент 1. Я отправил DP Story личное сообщение по этой проблеме. Дон создал другое решение, опубликованное ниже, которое учитывает все перекрестные ссылки и добавляет больше гибкости. Решение Дона позволяет восстановить счетчик элементов на любом вложенном предыдущем уровне, следуя за командой \0 командой \n, где n — уровень, который необходимо продолжить. Окружение структуры не может начинаться с команды \0, поэтому текст, предшествующий структуре, должен быть введен до этого окружения.
\documentclass{article}
\usepackage{outlines}
\usepackage{enumitem}
\usepackage{calc} % dps
\setlist{noitemsep}
\setlist{nolistsep}
\makeatletter
\newif\if@needsRsm\@needsRsmfalse
\def\resumeToDefault{%
\global\let\resume@ti\@empty
\global\let\resume@tii\@empty
\global\let\resume@tiii\@empty
\global\let\resume@tiv\@empty
}
\resumeToDefault
\def\ol@csarg#1#2{\expandafter#1\csname#2\endcsname}
% Executed at \0
\def\setPrevLevel{\global\@needsRsmtrue % dps
\xdef\@prevLevel{\@curLevel}}
\def\@prevLevel{0}
% Placed within \curLevel, which is expanded at the beginning of \1, \2, \3, \4
\def\resumeIfNeeded#1{\if@needsRsm\def\@next{\expandafter
\resumeAt\expandafter{\csname#1\endcsname}}\else\let\@next\relax\fi\@next}
% Expanded within each level: \1, \2, \3, \4
\def\curLevel#1{\def\@curLevel{#1}\resumeIfNeeded{#1}}
% dps modify outline package: \ol@z (insert \item[] so we can use \0 at any level
\renewcommand{\ol@z}{%
\ol@commands%
{}% 0
{\ol@inci}% 1
{\ol@inci\item[]\ol@incii}% 2
{\ol@inci\item[]\ol@incii\item[]\ol@inciii}% 3
{\ol@inci\item[]\ol@incii\item[]\ol@inciii\item[]\ol@inciiii}}% 4
% dps modify outline package: outline env (add \olsave, \curLevel)
\renewenvironment{outline}[1][]{%
\ifthenelse{\equal{#1}{}}{}{\renewcommand{\ol@type}{#1}}%
\ol@z%
\newcommand{\0}{\olsave\setPrevLevel\ol@toz\ol@z}% dps incorporate \olsave into level \0
\newcommand{\1}{\curLevel{1}\ol@toi\ol@i\resume@ti\item}%
\newcommand{\2}{\curLevel{2}\ol@toii\ol@ii\resume@tii\item}%
\newcommand{\3}{\curLevel{3}\ol@toiii\ol@iii\resume@tiii\item}%
\newcommand{\4}{\curLevel{4}\ol@toiiii\ol@iiii\resume@tiv\item}%
}{%
\ol@toz\ol@exit%
}
\def\UD#1{\noexpand\setcounter{enum#1}{\@nameuse{s@veAt#1}}%
\global\noexpand\ol@csarg\let{resume@t\@roman\@tempcnta}\noexpand\@empty}
\newcommand\resumeAt[1]{\global\@needsRsmfalse\begingroup\resumeToDefault
\edef\r@t{\expandafter\@roman\expandafter\@gobble\string#1}%
\edef\n@t{\expandafter\@gobble\string#1}%
% When we are resuming at a higher level then the previous level,
% we zero all counters out below (new environment starting)
\ifnum\n@t>\@prevLevel\relax
\zeroOutBelow{\@prevLevel}\olsave\fi
\@tempcnta=0\relax\toks@={}%
\@whilenum\@tempcnta<\n@t\relax\do{\advance\@tempcnta\@ne
\edef\x{\UD{\@roman\@tempcnta}}%
\toks2=\expandafter{\x}\edef\y{\the\toks@\the\toks2 }%
\toks@=\expandafter{\y}%
}%
\edef\x{\noexpand\ol@csarg\noexpand
\xdef{resume@t\r@t}{\noexpand\the\noexpand\toks@}}\x
\endgroup\ignorespaces
}
\def\zeroOutBelow#1{\begingroup
\@tempcnta#1\relax
\@whilenum\@tempcnta<4\relax\do{%
\advance\@tempcnta\@ne
\setcounter{enum\@roman\@tempcnta}{0}}%
\endgroup
}
\def\olsave{\@tfor\n:={i}{ii}{iii}{iv}\do{%
\ol@csarg\xdef{s@veAt\n}{\the\value{enum\n}}}% do
}
\makeatother
\begin{document}
We begin the outline here
\begin{outline}[enumerate]
\1 First item
\2 First subitem
\3\label{cr} Item with label
\4 Fourth level
\4 Fourth level, again
\0 This is another comment
\2 Second subitem
\0 Some text here, let's make it long to see what happens when we wrap around to the next line.
\1 Second item
\2 \textbf{See item} \ref{cr}
\3 The above reference reads``See item 1''
\4 Let's not forget level 4
\4 Another level 4
\0 Hello world!
\2 Second subitem
\2 Second subitem
\0 Make my day!
\1 A third top level
\2 Level 2 item
\3 Level 3 item
\0 Let's break the outline here with a comment
\3 Level 3 item
\0 Do we continue as expected ?
\3 Level 3 for testing
% \4 More four to follow
\0 Now test level 4 in the same way
\4 Level 4
\4 Level 4, again
\0 Back to level 1
\1 back to level 1
\2 Another important point
\end{outline}
\end{document}