我正在尝试使用登记制度家谱编号。它看起来应该类似于以下内容:
1 (i) John Smith. Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua. ...
(ii) Ann Smith.
(iii) James Smith.
2 (iv) Eliza Smith.
... 将两种类型的数字对齐(罗马数字右对齐,阿拉伯数字左对齐)。我可以使用 tabular 来实现这一点\begin{tabular}{lrp{\somewidth}}
,但随后我必须计算出正确的列宽,这很麻烦;我无法通过使用包X
中的说明符来解决这个tabularx
问题,因为我经常想要跨页,而解决这些问题的变通方法都有点乏味。无论如何,感觉它就像是enumerate
类似环境的正确位置
我目前最好的想法是按照如下方式自动进行编号:
\documentclass{article}
\usepackage{lipsum} % for dummy text only
\begin{document}
\begin{enumerate}
\item[1\quad(i)] John Smith. \lipsum[1]
\item[(ii)] Ann Smith.
\item[(iii)] James Smith.
\item[2\quad(iv)] James Smith.
\end{enumerate}
\end{document}
但我无法对齐阿拉伯数字。有什么想法吗?
答案1
这是一个使用enumitem
包裹:
\documentclass{article}
\usepackage{enumitem}
\usepackage{lipsum}
\newlist{menumerate}{enumerate}{2}
\setlist[menumerate,1]{label=\arabic*}
\setlist[menumerate,2]{label=(\roman*)}
\begin{document}
\begin{menumerate}
\item\begin{menumerate}
\item John Smith. \lipsum[1]
\item Ann Smith.
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}[resume]
\item James Smith.
\end{menumerate}
\end{menumerate}
\end{document}
如果需要增加阿拉伯数字和罗马数字之间的间距,可以使用类似
\newlist{menumerate}{enumerate}{2}
\setlist[menumerate,1]{label=\arabic*,wide,leftmargin=*,labelsep=20pt}
\setlist[menumerate,2]{label=(\roman*),labelsep=5pt}
完整示例:
\documentclass{article}
\usepackage{enumitem}
\usepackage{lipsum}
\newlist{menumerate}{enumerate}{2}
\setlist[menumerate,1]{label=\arabic*,wide,leftmargin=*,labelsep=20pt}
\setlist[menumerate,2]{label=(\roman*),labelsep=5pt}
\begin{document}
\begin{menumerate}
\item\begin{menumerate}
\item John Smith. \lipsum[1]
\item Ann Smith.
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}[resume,start=99]% start value just for the example
\item James Smith.
\end{menumerate}
\end{menumerate}
\end{document}
如果内部列表始终需要继续编号,则resume
可以将选项包含在\setlist
:
\documentclass{article}
\usepackage{enumitem}
\usepackage{lipsum}
\newlist{menumerate}{enumerate}{2}
\setlist[menumerate,1]{label=\arabic*,wide,leftmargin=*,labelsep=20pt}
\setlist[menumerate,2]{label=(\roman*),labelsep=5pt,resume}
\begin{document}
\begin{menumerate}
\item
\begin{menumerate}
\item John Smith. \lipsum[1]
\item Ann Smith.
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\end{menumerate}
\end{document}
或许,更好的是,像这样:
\documentclass{article}
\usepackage{enumitem}
\usepackage{lipsum}
\newlist{menumerate}{enumerate}{2}
\setlist[menumerate,1]{
label=\arabic*,
leftmargin=50pt,
labelsep=15pt,
labelwidth=20pt,
align=left
}
\setlist[menumerate,2]{label=(\roman*),labelsep=5pt,resume}
\begin{document}
\begin{menumerate}
\item
\begin{menumerate}
\item John Smith. \lipsum[1]
\item Ann Smith.
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}
\item James Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\item
\begin{menumerate}
\item Henry Smith.
\end{menumerate}
\end{menumerate}
\end{document}
答案2
类似这样?我定义了一个新的环境geneology
。在这个环境中,\nextgene
用于指示外部计数器应递增。否则,只需\item
照常使用即可。
\documentclass{article}
\usepackage{lipsum,enumitem}
\newlist{geneo}{enumerate}{1}
\newlist{geneol}{enumerate}{1}
\setlist[geneo,1]{label=\arabic*, align=left}
\setlist[geneol,1]{label=(\roman*)}
\newenvironment{geneology}{%
\begin{geneo}\item\begin{geneol}%
}{%
\end{geneol}\end{geneo}%
}
\newcommand*\nextgene{%
\end{geneol}\item\begin{geneol}[resume]%
}
\begin{document}
\begin{geneology}
\item John Smith. \lipsum[1]
\item Ann Smith.
\item James Smith.
\nextgene
\item James Smith.
\end{geneology}
\end{document}
答案3
@Gonzalo Medina 和 @cfr 的解决方案非常巧妙,但我不禁觉得嵌套枚举是错误的。从逻辑上讲,它是一个单一列表,而不是列表的列表。我花了一上午的时间寻找更好的解决方案,并认为我有一个:使用更原始的list
环境而不是enumerate
。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{lipsum} % For dummy text only
\newcounter{childcounter}
\newenvironment{children}{
\begin{list}{\childxref\hfill(\roman{childcounter})\quad}{
\usecounter{childcounter}\setlength\labelsep{0em}
\setlength\labelwidth{5em}\setlength\leftmargin{5em}
\newcommand{\child}[1][]{\def\childxref{##1}\item}}
}{\end{list}}
\begin{document}
\begin{children}
\child[1] John Smith. \lipsum[1]
\child Ann Smith.
\child James Smith.
\child[2] James Smith.
\end{children}
\end{document}
我预计可选参数的正常用法将\child
是这样的\child[\ref{james}]
,所以我可能会将其定义为直接采用标签名称:
\newcommand{\child}[1][]{%
\def\childxref{\ifstrempty{##1}{}{\ref{##1}}}\item}}
这也需要\usepackage{etoolbox}
定义\ifstrempty
。然后我只要\child[james]
在其他地方有就可以写\label{james}
。