![我如何才能拥有第 100 节和第 100a 节](https://linux22.com/image/273883/%E6%88%91%E5%A6%82%E4%BD%95%E6%89%8D%E8%83%BD%E6%8B%A5%E6%9C%89%E7%AC%AC%20100%20%E8%8A%82%E5%92%8C%E7%AC%AC%20100a%20%E8%8A%82.png)
因此,我正在排版一份文档,并且我毫无困难地浏览了条目 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}
\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