我如何才能拥有第 100 节和第 100a 节

我如何才能拥有第 100 节和第 100a 节

因此,我正在排版一份文档,并且我毫无困难地浏览了条目 0 到 99,然后发现此人有第 100a 和 100 节。好吧,我可以通过\setcounter{section}{99}在第一节 100 之后添加来轻松获得两个第 100 节,但是如何添加第 100a 节而不搞砸文档中的其他 150 节呢?

因此,为了清楚起见,其结构如下:

0
1
2
...
98
99
100a
100
101
...
151

编辑附加详细信息:我正在使用文章类,因为我从来没有弄清楚其他类是做什么用的,而且确实正在使用hyperref

答案1

稍微扩展一下语法,我们可以定义在上一节编号中添加一个字母。我利用了当计数器值为零时扩展为零\section+{title}的事实。\alph{secondary}secondary

在我使用的示例中hyperref,不需要。只需添加代码如果需要的话,正在加载hyperref

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref,bookmark}

\let\latexsection\section
\newif\ifsecondary
\RenewDocumentCommand{\section}{s}
 {%
  \IfBooleanTF{#1}{\latexsection*}{\newsection}%
 }

\newcounter{secondary}
\AtBeginDocument{%
  \expandafter\def\expandafter\thesection\expandafter
    {\thesection\alph{secondary}}%
  \ifdefined\theHsection % to keep hyperref happy
    \let\theHsection\thesection
  \fi
}

\NewDocumentCommand{\newsection}{t+ o m}
 {%
  \IfBooleanTF{#1}
    {\global\secondarytrue}
    {\global\secondaryfalse
     \ifnum\value{secondary}=0 \else
       \setcounter{secondary}{0}%
     \fi}
  \ifsecondary
    \addtocounter{section}{-1}%
    \stepcounter{secondary}%
  \fi
  \IfNoValueTF{#2}{\latexsection{#3}}{\latexsection[#2]{#3}}%
 }

\begin{document}

\section{Should be one}\label{one}

\section*{No number}

\section{Should be two}\label{two}
\section+{Should be two-a}\label{two-a}
\section+{Should be two-b}\label{two-b}

\section{Should be three}\label{three}

References: \ref{one}, \ref{two}, \ref{two-a}, \ref{two-b}, \ref{three}

\end{document}

在此处输入图片描述


如果您需要在正常部分之前添加次要部分(尽管这没有任何意义),可以采用以下方法:

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref,bookmark}

\let\latexsection\section
\newif\ifsecondary
\RenewDocumentCommand{\section}{s}
 {%
  \IfBooleanTF{#1}{\latexsection*}{\newsection}%
 }

\newcounter{secondary}
\AtBeginDocument{%
  \expandafter\def\expandafter\thesection\expandafter
    {\thesection\alph{secondary}}%
  \ifdefined\theHsection
    \let\theHsection\thesection
  \fi
}

\NewDocumentCommand{\newsection}{t+ o m}
 {%
  \IfBooleanTF{#1}
    {\global\secondarytrue}
    {\global\secondaryfalse
     \ifnum\value{secondary}=0 \else
       \setcounter{secondary}{0}%
     \fi}
  \ifsecondary
    \stepcounter{secondary}%
  \fi
  \IfNoValueTF{#2}{\latexsection{#3}}{\latexsection[#2]{#3}}%
  \ifsecondary
    \addtocounter{section}{-1}%
  \fi
 }

\begin{document}

\section{Should be one}\label{one}

\section*{No number}

\section{Should be two}\label{two}
\section+{Should be three-a}\label{three-a}
\section+{Should be three-b}\label{three-b}

\section{Should be three}\label{three}

References: \ref{one}, \ref{two}, \ref{three-a}, \ref{three-b}, \ref{three}

\end{document}

在此处输入图片描述

答案2

我不会将计数器设置为100,而是先在特殊部分之后添加-1,以便它在移动后也能工作(最终可能为 75a)。

您可以简单地重新定义\thesection似乎设置为的内容\arabic{section}

如果你用重新定义它

\renewcommand*{\thesection}{\arabic{section}a}

你会a在数字后面得到一个。为了独立于\arabic部分(它也可以是罗马数字),你可以这样做

\expandafter\def\expandafter\thesection\expandafter{\thesection a}

etoolbox

\appto\thesection{a}

在组中执行此操作可以节省您恢复初始值的时间(这也只需花几\let秒钟即可完成)。


适用于所有计数器的命令可以定义为

\newcommand*{\addToTheCounter}[2]{%
  \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\def
  \expandafter\expandafter\expandafter\csname the#1%
  \expandafter\expandafter\expandafter\endcsname
  \expandafter\expandafter\expandafter{\csname the#1\endcsname#2}}

etoolbox

\newcommand*{\addToTheCounter}[2]{\csappto{the#1}{#2}}

代码

\documentclass{article}
\usepackage{lipsum,hyperref,etoolbox}
\newcommand*{\addToTheCounter}[2]{%
  \csappto{the#1}{#2}%
  \csappto{theH#1}{#2}} % for hyperref
\begin{document}
\tableofcontents
\setcounter{section}{8}
\section{9}
\lipsum[2]
{
  \addToTheCounter{section}{a}
  \section{10a}\label{weird}
} \addtocounter{section}{-1}
\lipsum[2]
\section{10}\label{weird2}
\lipsum[2]

see \ref{weird} and \ref{weird2}
\section{11}
\lipsum[2]
\end{document}

输出

在此处输入图片描述

答案3

\thesection可以适当地重新定义:

\documentclass{article}

\renewcommand*{\thesection}{%
  \ifnum\value{section}<102 %
    \the\numexpr\value{section}-1\relax
  \else
    \ifnum\value{section}=102 %
      100a%
    \else
      \the\numexpr\value{section}-2\relax
    \fi
  \fi
}

% Increase the space for the section number in the table of contents
\usepackage{etoolbox}
\newlength\tocnumwidth
\settowidth{\tocnumwidth}{\textbf{100a} }
\expandafter\patchcmd\csname l@section\endcsname{1.5em}{\tocnumwidth}{}{}

\usepackage[colorlinks,bookmarksnumbered]{hyperref}% for testing

\begin{document}
\tableofcontents
\bigskip
\hrule

\section{First section}\label{first}
\section{Next section}\label{next}

\section*{\dots}
\addcontentsline{toc}{section}{\dots}
\setcounter{section}{99}

\section{Luftballons}\label{99}
\section{Lorem}\label{lorem}
\section{Ipsum}\label{ipsum}
\section{Dolor}\label{dolor}
\hrule
\bigskip

Reference list: \ref{first}, \ref{next}, \dots,
  \ref{99}, \ref{lorem}, \ref{ipsum}, \ref{dolor}.
\end{document}

结果

答案4

仅供比较,以下是使用 ConTeXt 实现此目的的几种方法。我将特殊部分设置为 3 而不是 100。所有这些都确保编号适用于参考文献和目录。

定义自定义转换

如果只需要对已知编号的部分执行此操作,那么您可以定义自定义转换;最简单的方法是使用 Lua。

\startluacode
  commands.weirdcounter = function (number, offset) 
    if number < offset then
      context("%s", number)
    elseif number == offset then
      context("%sa", offset)
    else
      context("%s", number - 1)
    end
  end
\stopluacode

\define[1]\weirdcounter{\ctxcommand{weirdcounter(#1,3)}}

\defineconversion[weirdnumbering][\weirdcounter]

\setuphead[section][conversion=weirdnumbering]

\setupinteraction[state=start]

\starttext

\placecontent

\dorecurse{5}
  {\expanded{\section{Section \recurselevel}}}

\stoptext

使用耦合航向命令ownnumber

对于一次性使用,您可以定义一个新的节头,比如ownsection与之耦合section(以便您继承样式等),但允许您设置节号。例如:

\setuphead[section][conversion=weirdnumbering]

\definehead[ownsection][section][ownnumber=yes]

\setupinteraction[state=start]

\starttext

\placecontent

\section{One}
\section{Two}
\ownsection{3a}{Three}
\section{Four}
\section{Five}

\stoptext

相关内容