![通过偏移链接两个计数器或显示具有偏移的单个计数器](https://linux22.com/image/432384/%E9%80%9A%E8%BF%87%E5%81%8F%E7%A7%BB%E9%93%BE%E6%8E%A5%E4%B8%A4%E4%B8%AA%E8%AE%A1%E6%95%B0%E5%99%A8%E6%88%96%E6%98%BE%E7%A4%BA%E5%85%B7%E6%9C%89%E5%81%8F%E7%A7%BB%E7%9A%84%E5%8D%95%E4%B8%AA%E8%AE%A1%E6%95%B0%E5%99%A8.png)
我使用 KOMA-script 的子段落创建自定义部分环境。其标签由相应小节的计数器和子段落计数器决定。
现在我想将子段标签中的子段计数器显示偏移例如 3,但我不想在此过程中更改子段计数器本身。所以我看到两个选项:
- 创建一个新的计数器,将其链接到子部分计数器,但偏移量为 3。它应该与子部分并行增加。我想避免手动执行此操作
- 包括内的偏移量
\arabic{}
,我用它来创建子段落的标签。
但我无法采用任何方法。您有什么想法吗?
平均能量损失
\documentclass{scrreprt}
\usepackage{calc}
\def\apoffset{3} % offset
\setcounter{secnumdepth}{6}
\makeatletter % subparagraph definition
\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}%
{0.3\baselineskip \@plus1ex \@minus .2ex}%
{0.75ex plus 0.1ex}% space after heading
{\normalfont\mdseries\itshape}}
\makeatother
% new counter approach?
%\newcounter{ap}
%\setcounter{ap}{\value{subsection}+\apoffset}
\renewcommand{\thesubparagraph}{\noindent AP \arabic{subsection}-\arabic{subparagraph}}
%\renewcommand{\thesubparagraph}{\noindent AP \arabic{ap}-\arabic{subparagraph}} % <- does not increment
\begin{document}
\chapter{Chapter}
\section{Section}
\subsection{Subsection 1}
\subparagraph{Subparagraph 4.1}
\subparagraph{Subparagraph 4.2}
\subsection{Subsection 2}
\subparagraph{Subparagraph 5.1}
\subparagraph{Subparagraph 5.2}
\end{document}
答案1
使用 KOMA-Script 类时,请勿重新定义。您可以更改使用 的\subparagraph
设置:subparagraph
\RedeclareSectionCommand
\RedeclareSectionCommand[
indent=0pt,
beforeskip=.3\baselineskip plus 1ex minus .2ex,
afterskip=.75ex plus .1ex,
afterindent=true,
runin=false,
font=\normalfont\mdseries\itshape
]{subparagraph}
您可以定义一个新的计数器ap
,将计数器设置为每个新部分的偏移值,并为每个编号的小节设置计数器:
\newcounter{ap}
\renewcommand*{\thesubparagraph}{\noindent AP \arabic{ap}-\arabic{subparagraph}}
% reset the ap counter to \resetap when a new section starts:
\AddtoDoHook{heading/begingroup/section}{\resetap}
\newcommand*{\resetap}[1]{\setcounter{ap}{\apoffset}}
% step the ap counter when a numbered subsection starts:
\AddtoDoHook{heading/begingroup/subsection}{\stepap}
\newcommand*{\stepap}[1]{\IfUseNumber{\stepcounter{ap}}{}}% can be used only between .../begingroup/... and .../endgroup/... hooks
\documentclass{scrreprt}
\newcommand*\apoffset{3} % offset
\setcounter{secnumdepth}{\subparagraphnumdepth}
\RedeclareSectionCommand[
indent=0pt,
beforeskip=.3\baselineskip plus 1ex minus .2ex,
afterskip=.75ex plus .1ex,
afterindent=true,
runin=false,
font=\normalfont\mdseries\itshape
]{subparagraph}
\newcounter{ap}
\renewcommand*{\thesubparagraph}{\noindent AP \arabic{ap}-\arabic{subparagraph}}
% reset the ap counter to \resetap when a new section starts:
\AddtoDoHook{heading/begingroup/section}{\resetap}
\newcommand*{\resetap}[1]{\setcounter{ap}{\apoffset}}
% step the ap counter when a numbered subsection starts:
\AddtoDoHook{heading/begingroup/subsection}{\stepap}
\newcommand*{\stepap}[1]{\IfUseNumber{\stepcounter{ap}}{}}% can be used only between .../begingroup/... and .../endgroup/... hooks
\begin{document}
\chapter{Chapter}
\section{Section}
\subsection*{Unnumbered subsection}
\subsection{Subsection 1}
\subparagraph{Subparagraph 4.1}
\subparagraph{Subparagraph 4.2}
\subsection{Subsection 2}
\subparagraph{Subparagraph 5.1}
\subparagraph{Subparagraph 5.2}
\section{Section}
\subsection{Subsection 1}
\subparagraph{Subparagraph 4.1}
\subparagraph{Subparagraph 4.2}
\subsection*{Another unnumbered subsection}
\subsection{Subsection 2}
\subparagraph{Subparagraph 5.1}
\subparagraph{Subparagraph 5.2}
\end{document}
答案2
我不太清楚你想做什么,但我想我有个大概的想法。除了滥用\subparagraph
你想要做的事情之外,还要确保ap
在正确的时间设置计数器的值。你现在将它设置为一次\value{subsection}+\apoffset
(嗯,其实不是,因为你不能在参数中放置这样的表达式\setcounter
),并且永远不会再更改它。
所以让我们尝试正确执行此操作。为了避免滥用,\subparagraph
让我们创建一个\apsection
深度为 3 的新命令。我们可以\@startsection
像您一样使用它来设置标题,但我们将更改几个值:
\makeatletter % subparagraph definition
\newcommand{\apsection}{\@startsection{ap}{3}{\z@}%
{0.3\baselineskip \@plus1ex \@minus .2ex}%
{0.75ex plus 0.1ex}% space after heading
{\normalfont\mdseries\itshape}}
\makeatother
现在到了棘手的部分。我们如何以及在何处设置要作为数字的一部分打印的值。看起来您想要做的是打印(subsection + \apoffset
)一个破折号,然后ap
打印将在子部分内编号的值。当我们定义时,ap
我们需要确保它通过编写子部分重置
\newcounter{ap}[subsection]
为了打印正确的值,我们需要一个额外的计数器,以便根据需要进行操作。我们称该计数器为apPrefix
:
\newcounter{apPrefix}
然后我们修改 的定义\apsection
来设置apPrefix
前我们称之为\@startsection
:
\newcommand{\apsection}{%
\setcounter{apPrefix}{\value{section}}%
\addtocounter{apPrefix}{\apoffset}%
\@startsection{ap}{3}{\z@}%
{0.3\baselineskip \@plus1ex \@minus .2ex}%
{0.75ex plus 0.1ex}% space after heading
{\normalfont\mdseries\itshape}}
这样做可以确保如果您使用命令\label
,您将在引用中获得正确的值。\ref
\ap
最后,我们将定义\theap
打印值:
\renewcommand{\theap}{AP \arabic{apPrefix}-\arabic{ap}}
我不确定您想要用来实现什么,\noindent
但我可以保证将其放在的定义中\theCOUNTER
是错误的方法。
答案3
您可以使用较低级别的接口来生成数字并传递您想要的值。
\documentclass{scrreprt}
\newcommand\apoffset{3} % offsec
\setcounter{secnumdepth}{6}
\makeatletter % subparagraph definition
\renewcommand{\subparagraph}{\@startsection{subparagraph}{5}{\z@}%
{0.3\baselineskip \@plus1ex \@minus .2ex}%
{0.75ex plus 0.1ex}% space after heading
{\normalfont\mdseries\itshape}}
\renewcommand{\thesubparagraph}{%
AP\@arabic{\numexpr\value{subsection}+\apoffset\relax}-\arabic{subparagraph}%
}
\makeatother
\begin{document}
\chapter{Chapter}
\section{Section}
\subsection{Subsection 1}
\subparagraph{Subparagraph 4.1}
\subparagraph{Subparagraph 4.2}
\subsection{Subsection 2}
\subparagraph{Subparagraph 5.1}
\subparagraph{Subparagraph 5.2}
\end{document}
我删除了\noindent
不属于那里的东西。