我正在转录一份古老的法国工程文本(约 1890 年),该文本使用了一种不太标准的章节编号。由于我试图制作一份或多或少逐字逐句的副本,因此对我来说,保持新文档的结构与原始文档相同非常重要。
一般章节编号使用数字序列(1、2、3 等)。但是,有些章节是在印刷前最后一刻插入的,所以当时的排字员(我猜)使用拉丁后缀“bis”和“ter”来插入新章节(1之二,1之三等)来代替对整个文本进行重新编号。请注意,后缀也采用斜体。
我发现用户询问在数字部分数字末尾添加字母字符的问题,但这并不完全适用。
由于章节编号基本已设置好,我可以手动调整需要调整的几个章节。不过,我想学习 TeX 解决方法以供将来参考,并更好地了解该程序。
请参阅下面的 MWE,其中有我使用手动节编号的代码示例。这给出了所需的结果,但没有自动节编号,这是 TeX 的主要功能。我想使用某种自动节编号方案复制此结果。
\documentclass{book}
\usepackage{titlesec}
\titleformat{\section}[block]{\normalfont\large\normalfont\filcenter}{\thesection. ---}{0.5em}{}
\renewcommand\thesection{\arabic{section}}
\usepackage{lipsum}
\begin{document}
\tableofcontents
\section{First Section Header}
\lipsum[1]
\section{Second Section Header}
\lipsum[2]
\section*{2 \textit{bis}. --- Third Section Header}\addcontentsline{toc}{section}{2 \textit{bis} Third Section Header}
\lipsum[3]
\section{Fourth Section Header}
\lipsum[4]
\end{document}
下面是渲染。
答案1
原始解决方案
这是一个使用enumitem
和enumerate
环境的解决方案。
由于您提到了部分编号,因此不确定这是否确实是您所要求的。
但是,使用此解决方案,所有定期编号的项目都必须位于(第一级)enumerate
环境中,当您需要 bis、ter 等时,则可以使用嵌套enumerate
环境。请记住第一的 \item
这个环境的数量将是有限的之二,第二个将被编号为ter,等等
\documentclass{article}
\usepackage{xparse}
\usepackage{enumitem}
\ExplSyntaxOn
\seq_new:N \bislist
\seq_set_split:Nnn \bislist {;} {bis;ter;quater;quinquies;sexies;septies;octies;novies;decies}
\NewDocumentCommand {\bisprint} {m}
{
\seq_item:Nn \bislist {#1}
}
\ExplSyntaxOff
\setlist[enumerate,1]{leftmargin=0pt,labelwidth=!,label=\arabic*.,align=left}
\setlist[enumerate,2]{leftmargin=0pt,labelwidth=!,label=\arabic{enumi} \bisprint{\arabic{enumii}}.,align=left}
\begin{document}
\begin{enumerate}
\item First item
\item Second item
\begin{enumerate}
\item First bis item
\item First ter item
\end{enumerate}
\end{enumerate}
\end{document}
产生这样的结果:
也许,避免与其他嵌套enumerate
环境冲突的另一种选择是通过bis
这种方式创建环境:
\documentclass{article}
\usepackage{xparse}
\usepackage{enumitem}
\ExplSyntaxOn
\seq_new:N \bislist
\seq_set_split:Nnn \bislist {;} {bis;ter;quater;quinquies;sexies;septies;octies;novies;decies}
\NewDocumentCommand {\bisprint} {m}
{
\seq_item:Nn \bislist {#1}
}
\ExplSyntaxOff
\setlist[enumerate,1]{leftmargin=0pt,labelwidth=!,label=\arabic*.,align=left}
\newlist{bis}{enumerate}{1}
\setlist[bis]{leftmargin=0pt,labelwidth=!,label=\arabic{enumi} \bisprint{\arabic{bisi}}.,align=left}
\begin{document}
\begin{enumerate}
\item First item
\item Second item
\begin{bis}
\item First bis item
\item First ter item
\end{bis}
\end{enumerate}
\end{document}
这产生的结果与前面的代码完全相同。
请注意,如果环境中有 10 个或更多项目bis
,则编号将失败(主要是因为我不知道 decies 后面是什么)。但我希望您的原始文本不需要走那么远 ;-)(但是,似乎某些法国法律使用了 decies,也许接下来的几个法律也使用了 decies……)
编辑:解决方案与\section
这是一个使用\section
和的解决方案\section*
。
警告:通过重新定义这两个命令,您将无法将它们用于文档其余部分的任何其他操作(我想您已经意识到了这一点,但以防万一,现在很清楚了)。
这里的想法是使用来\section{}
开始一个有规律编号的部分,并且\section*{}
对于之二編號部分。
\documentclass{article}
\usepackage{xparse}
\usepackage{enumitem}
\usepackage[explicit]{titlesec}
\usepackage{lipsum}
\ExplSyntaxOn
\seq_new:N \bislist
\seq_set_split:Nnn \bislist {;} {bis;ter;quater;quinquies;sexies;septies;octies;novies;decies}
\NewDocumentCommand {\bisprint} {m}
{
\seq_item:Nn \bislist {#1}
}
\ExplSyntaxOff
\newcounter{bis}
\stepcounter{bis}
\titleformat{\section}[runin]{\normalfont}{\arabic{section}.}{0pt}{}[\setcounter{bis}{1}]
\titleformat{name=\section,numberless}[runin]{\normalfont}{\arabic{section} \bisprint{\arabic{bis}}.}{0pt}{}[\stepcounter{bis}]
\titlespacing{\section}{\parindent}{\baselineskip}{\parindent}{}
\begin{document}
\section{}
\lipsum[1]
\section{}
\lipsum[2]
\section*{}
\lipsum[3]
\section*{}
\lipsum[4]
\section*{}
\lipsum[5]
\section{}
\lipsum[6]
\section{}
\lipsum[7]
\section*{}
\lipsum[8]
\end{document}
如果格式不完全符合您的要求,您可以更改\titleformat
和的参数\titlespacing
(例如,更改\normalfont
为\bfseries
将产生粗体数字)。
更新:包含目录\section*
这是出现在目录中的 最后一次更新(这次使用book
您想要的文档类别以及您在 MWE 中使用的标题格式)。
\documentclass{book}
\usepackage{xparse}
\usepackage{enumitem}
\usepackage[explicit]{titlesec}
\usepackage{lipsum}
\usepackage{calc}
\usepackage{totcount}
\ExplSyntaxOn
\seq_new:N \bislist
\seq_set_split:Nnn \bislist {;} {bis;ter;quater;quinquies;sexies;septies;octies;novies;decies}
\NewDocumentCommand {\bisprint} {m}
{
\seq_item:Nn \bislist {#1}
}
\ExplSyntaxOff
\newtotcounter{bismax}
\newcounter{bis}
\stepcounter{bis}
\setcounter{bismax}{1}
\newcommand{\bisadd}{\stepcounter{bis} \setcounter{bismax}{\minof{4}{\maxof{\thebismax}{\thebis-1}}}}
\AtBeginDocument{\newlength{\bislength}
\settowidth{\bislength}{\textit{\bisprint{\totvalue{bismax}}}}
\addtolength{\bislength}{1.5em}}
\titleformat{\section}[block]{\normalfont\large\normalfont\filcenter}{\thesection. --- #1}{0.5em}{}[\setcounter{bis}{1}]
\renewcommand\thesection{\arabic{section}}
\titleformat{name=\section,numberless}[block]{\normalfont\large\normalfont\filcenter}{\arabic{section} \textit{\bisprint{\arabic{bis}}}. --- #1}{0.5em}{}[ \addcontentsline{toc}{section}{\protect\numberline{\arabic{section} \textit{\bisprint{\arabic{bis}}}}#1} \bisadd{}]
\makeatletter
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{\bislength}}
\makeatother
\begin{document}
\tableofcontents
\section{First section header}
\lipsum[1]
\section{Second section header}
\lipsum[2]
\section*{Third section header}
\lipsum[3]
\section*{Fourth section header}
\lipsum[4]
\section*{Fifth section header}
\lipsum[5]
\section*{Sixth section header}
\lipsum[6]
\section{Seventh section header}
\lipsum[7]
\section*{Eighth section header}
\lipsum[8]
\end{document}
现在会自动计算目录中数字和章节标题之间的间距,以便显示最长的“bis 编号”(即,如果您只需打印 bis 或 ter,则空间会比需要打印 quiquies 时更小)。您可以通过更改当前设置为 的值来放大或缩小此空间1.5em
。
答案2
这是一个半自动版本,您必须手动添加后缀。
\documentclass{article}
\makeatletter
\newcommand{\numpar}[1][]{%
\par\addvspace{\medskipamount}%
\if\relax\detokenize{#1}\relax
\refstepcounter{numpar}%
\def\thisnumpar{\thenumpar}%
\else
\edef\@currentlabel{\thenumpar\noexpand~#1}%
\def\thisnumpar{\thenumpar~#1}%
\fi
\everypar{\thisnumpar.\hspace{\parindent}\everypar{}}%
}
\makeatother
\newcounter{numpar}
\begin{document}
\numpar This is the first paragraph. Let's make it longer
so it wraps. Maybe this suffices, but just in case we
add some more words.
\numpar[bis]\label{1bis} This has been added. Let's make it longer
so it wraps. Maybe this suffices, but just in case we
add some more words.
\numpar[ter] This also has been added and refers to the previous one~\ref{1bis}.
Let's make it longer so it wraps. Maybe this suffices, but just in case we
add some more words.
\numpar This is numbered normally and refers to the previous one~\ref{1bis}.
Let's make it longer so it wraps. Maybe this suffices, but just in case we
add some more words.
\end{document}
使用技巧\everypar
可以让你不必担心后面的空格\label
。