通过偏移链接两个计数器或显示具有偏移的单个计数器

通过偏移链接两个计数器或显示具有偏移的单个计数器

我使用 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不属于那里的东西。

相关内容