我正在使用文章类。我使用description
列表来获得带有自定义标签而不是项目符号的逐项列表。在我的例子中,标签的值以美元为单位(见下面的示例)。
以下是一个例子:
\begin{description}
\item[\$550]
boo boo
\item[\$500]
boo boo boo
\end{description}
此自定义列表中有数百个条目,因此很难更改所有内容。我希望有两项增强功能:
- 在此列表上方添加另一行,总结自定义标签的值。在本例中,它将显示
\$1050 summary
。因此,基本上,如果我将第三个项目添加到列表中,这将自动总结。假设第三个项目表示\item[\$100] boo
摘要行更改为 \$1,150。 - 我希望所有标签都使用小字体。因此我希望标签为
\item[{\small \$550}]
。当然,我不想对所有数百个项目都这样做。我该如何将其设为默认设置?
更新:列表中的间距定义为\setlist[description]{font=\normalfont\itshape\space,nolistsep,labelwidth=6.5em,leftmargin =\dimexpr\labelwidth+\labelsep\relax}
,我希望它是相同的
答案1
第一个解决方案:重新定义\item
。
这是第一个解决方案,它应该更适合您的要求,因为它应该不需要对您的文档进行太多更改就可以工作。
它使用包customlist
从环境中创建一个环境。在此环境中,项目的标签采用小字体,并在其前面显示美元符号。此外,一旦进入(并且仅在此环境中),命令将被重新定义为能够对列出的金额进行求和,而命令则被定义为标准命令。还定义了一个命令,可用于在显示总金额的列表中插入项目。enumerate
enumitem
customlist
customlist
\item
\olditem
\item
\summaryitem
\documentclass{article}
\usepackage{enumitem}
\usepackage{etoolbox}
\newlist{customlist}{enumerate}{1}
\setlist[customlist]{%
label={\small\$\arabic*}
}
\newcounter{customlist}
\newcounter{total}
\makeatletter
\newcommand{\summaryitem}{%
\@ifundefined{totalofcustomlist\romannumeral\the\value{customlist}}
{}
{\setcounter{customlisti}{\csname totalofcustomlist\romannumeral\the\value{customlist}\endcsname}}
\addtocounter{customlisti}{-1}
\olditem
}
\newcommand{\amount}[1]{\@cdr #1\@nil}
\AtBeginEnvironment{customlist}{%
\setcounter{total}{0}
\stepcounter{customlist}
\let\olditem\item
\def\item[#1]{%
\setcounter{customlisti}{\amount{#1}}
\addtocounter{customlisti}{-1}
\addtocounter{total}{\amount{#1}}
\olditem
}
}
\AtEndEnvironment{customlist}{%
\immediate\write\@mainaux{\string\gdef\string\totalofcustomlist\romannumeral\the\value{customlist}{\the\value{total}}}
\let\item\olditem
}
\makeatother
\begin{document}
First custom list:
\begin{customlist}
\summaryitem Summary of first list.
\item[\$500] First item
\item[\$200] Second one
\item[\$550] Third one
\end{customlist}
Second one:
\begin{customlist}
\summaryitem Summary of second list.
\item[\$250] First item
\item[\$550] Second one
\end{customlist}
\end{document}
我认为这种方法有一个重要的缺陷:它重新定义了\item
命令,因此customlist
必须谨慎使用这个环境。例如,如果itemize
环境嵌套在中customlist
,则该\item
命令不能用于创建项目;必须改用\olditem
。但是,它的优点是,如果您只想格式化这个巨大的列表,那么已经使用标有的项目创建\item[\$100]
,它将通过将description
环境更改为来直接工作customlist
。
第二种解决方案:不是重新定义\item
。
这是另一个(更好的)解决方案。
它创建了一个类似的customlist
环境,同样来自enumerate
环境并使用enumitem
包。\summaryitem
定义了一个类似的命令,列表中项目的标签也以小字体显示,并在显示的金额前面有一个美元符号。但是,在这个解决方案中,命令\item
没有重新定义:\amountitem
定义了一个命令来在处理金额计数的同时将项目写入列表中。它的用法与 非常相似\item
,但它需要一个数字作为参数(应该是列表中相应项目的数量)。
以下代码给出与第一个解决方案完全相同的输出。
\documentclass{article}
\usepackage{enumitem}
\usepackage{etoolbox}
\newlist{customlist}{enumerate}{1}
\setlist[customlist]{%
label={\small\$\arabic*}
}
\newcounter{customlist}
\newcounter{total}
\newcommand{\amountitem}[1]{%
\setcounter{customlisti}{#1}
\addtocounter{customlisti}{-1}
\addtocounter{total}{#1}
\item
}
\makeatletter
\newcommand{\summaryitem}{%
\@ifundefined{totalofcustomlist\romannumeral\the\value{customlist}}
{}
{\setcounter{customlisti}{\csname totalofcustomlist\romannumeral\the\value{customlist}\endcsname}}
\addtocounter{customlisti}{-1}
\item
}
\AtBeginEnvironment{customlist}{%
\setcounter{total}{0}
\stepcounter{customlist}
}
\AtEndEnvironment{customlist}{%
\immediate\write\@mainaux{\string\gdef\string\totalofcustomlist\romannumeral\the\value{customlist}{\the\value{total}}}
}
\makeatother
\begin{document}
First custom list:
\begin{customlist}
\summaryitem Summary of first list.
\amountitem{500} First item
\amountitem{200} Second one
\amountitem{550} Third one
\end{customlist}
Second one:
\begin{customlist}
\summaryitem Summary of second list.
\amountitem{250} First item
\amountitem{550} Second one
\end{customlist}
\end{document}