![编辑](https://linux22.com/image/289957/%E7%BC%96%E8%BE%91.png)
需要做什么才能创建一个新的分段命令,以在目录中输出正确的条目?
例如,在目录中(以及在主文档中)输出类似于的命令。经过几次尝试和错误,我认为只需复制定义并\foo
定义所需的命令(计数器、命令、、、)。但似乎还不够。\subsection
\subsection
foo
\thefoo
\addfootocentry
\foomarkformat
\foomark
这是一个最小(非)工作示例。
\documentclass[DIV12]{scrartcl}
\makeatletter
\newcommand*{\foonumdepth}{\tw@}
\newcounter{foo}[section]
\renewcommand*{\thefoo}{\thesection.\@arabic\c@foo}
\newcommand*\foomarkformat{\thefoo\autodot\enskip}
\newcommand*{\addfootocentry}[2]{%
\addtocentrydefault{foo}{#1}{#2}%
}
\newcommand\foomark[1]{\markright{#1}}
\newkomafont{foo}{\normalfont\normalsize}
\newcommand\foo{%
\@startsection{foo}%
{\foonumdepth}%
{\z@}%
{-\baselineskip}%
{\baselineskip}%
{\ifnum \scr@compatibility>\@nameuse{scr@[email protected]}\relax
\setlength{\parfillskip}{\z@ plus 1fil}\fi
\raggedsection\normalfont\sectfont\nobreak\size@subsection\usekomafont{foo}}%
}
%\def\foo#1{}
\makeatother
\begin{document}
\tableofcontents
\noindent\hrulefill
\section{One}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\subsection{SubOne}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\foo{FooOne}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\subsection{Two}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{document}
越来越多
添加:我认为这属于同一个问题,因为在某种程度上,这就是我想要实现的:如何创建一个\@startsection
命名section
但处于不同级别的分段命令(如果我更改\sectionlevel
命令......我仍然会在目录中得到相同的输出:就像这个命令不会影响任何东西一样)。
这可能是一个不同的问题……但是有没有办法告诉 KOMA-Script,我只想在目录中包含直到\subsection
未编号(\setcounter{secnumdepth}{2}\setcounter{tocdepth}{2}
)但我想要的是例如编号的\subsubsection
(不在目录中)?
编辑
我不确定这是否需要澄清……但我认为这可能是一个 XY 问题。我遇到这个问题是因为我正在写一份文件,其中有一些我需要解决的问题:
- 我想要制作一个有四个分区级别的文档。Part、Foo(和 Bar)、Section 和 Subsection。
- 如你所见,第二层有二不同的命令。每个 Foo 或 Bar 都有自己的 Sections 或 Subsections(即,它们重新启动计数器)。
- Part、Foo 和 Bar 不应编号。Section 和 Subsection 应编号。
- 此外,部分应该在目录中添加一行,样式如下默认
\section
(我认为只需改变就\@startsection{…}{\@ne}…
足够了,但似乎不行),并且 Foo/Bar 应该使用默认的样式向 TOC 添加一行\subsection
。
当然,我可以用我认为“黑客”的方式来解决这个问题。我遇到了这个问题。例如,是否可以创建一个并行的切片命令,使其\subsection
行为正确?我该怎么做?
答案1
这个问题有点令人困惑。看起来像部分的部分,两个平行的文档结构。我无法想象一个用例,这就是为什么很难实现的原因。
无论如何,我认为借助最新的 KOMA 版本,您应该能够轻松实现您的目标。
我只是从 KOMA 指南中复制了默认值。
\documentclass{scrartcl}
\DeclareSectionCommand[
afterskip=1.5ex plus .2ex,
beforeskip=-3.25ex plus -1ex minus -.2ex,
indent=0pt,
level=2,
font=\usekomafont{subsection},
tocindent=1.5em,
tocnumwidth=2.3em,
counterwithin=section,
style=section]{foo}
\begin{document}
\tableofcontents
\section{Wombat}
\subsection{Walzing}
\foo{Wobbling}
\end{document}
答案2
这仅 (通过 hack) 解决了您的第二个问题,即删除section
和的编号subsection
。我对这种类型并不满意,但它确实有效 (不知何故)
我重新定义了 section 命令(和子部分)以使用带星号的版本,它确实会进入目录并手动添加目录条目,从而删除那里的部分级别编号。
\documentclass[DIV12]{scrartcl}
\usepackage{blindtext}%
\usepackage{etoolbox}%
\usepackage{tocloft}% For \cftpagenumber...
\let\LaTeXStandardSection\section%
\renewcommand{\section}[1]{%
\begingroup % Limit the renewcommand of \thesection
\renewcommand{\thesection}{}%
\refstepcounter{section}%
\addcontentsline{toc}{section}{\protect{\numberline{\thesection}{#1}}}
\LaTeXStandardSection*{\arabic{section} #1}
\endgroup
}%
\let\LaTeXStandardSubSection\subsection%
\renewcommand{\subsection}[1]{%
\par
\begingroup
\renewcommand{\thesubsection}{}%
\refstepcounter{subsection}%
\addcontentsline{toc}{subsection}{\protect{\numberline{\thesubsection}{#1}}}%\hspace*{0em}
\vspace{\baselineskip}
\LaTeXStandardSubSection*{\thesection.\arabic{subsection} #1}%
\endgroup%
}
%Enlarge the spacing a little bit
\pretocmd{\subsubsection}{\vspace{0.5\baselineskip}}
\newcounter{foo}[section]
\newcounter{subsectionsavecounter}
\newcommand{\foo}[1]{%
\setcounter{subsectionsavecounter}{\number\value{subsection}}
\setcounter{subsection}{\number\value{foo}}
%\refstepcounter{foo}% Increase before if patched `\subsection` is used
% Use the 'patched' \subsection command if no number entry to TOC should
% be done!
%\subsection{FOO #1}%
\LaTeXStandardSubSection{FOO #1} % Remove the FOO later one!
\refstepcounter{foo}% Increase afterwards if \LaTeXStandardSubSection is to be used.
\setcounter{subsection}{\number\value{subsectionsavecounter}}%
}
% If the page numbers of sections and subsections should not appear, remove the %
%\cftpagenumbersoff{section}%
%\cftpagenumbersoff{subsection}%
\begin{document}
\tableofcontents
\noindent\hrulefill
\section{One}
\blindtext
\subsection{SubOne}
\blindtext
\foo{One of some ones}
\subsection{Two}
\blindtext[2]
\subsubsection{First subsubsection ever}
\blindtext[3]
\newpage
\section{Another One}
\subsection{Yet another subsection from 2nd section}
\blindtext[1]
\subsubsection{First subsub of first sub of 2nd section}
\blindtext[2]
\foo{Yet another one of some ones}
\end{document}
我没有针对您的foo
环境的解决方案,而是抓取部分命令并为此使用中间不同的计数器。
编辑我抓住了subsection
命令并foo
对其进行了编辑;-)
在我看来,删除章节/小节编号看起来很尴尬......
答案3
我找到了问题所在,我需要定义\l@foo
命令,即负责添加内容行的命令。scrartcl.cls
你可以看到每个级别都定义了\l@…
。在我的例子中,这更容易。因为我希望它添加一行与(或其他)完全相同的样式\section
,所以只需要执行
\let\l@foo\l@section
并将\foo
输出目录中的精确行作为\section
。