描述中的自定义标签 - 总结

描述中的自定义标签 - 总结

我正在使用文章类。我使用description列表来获得带有自定义标签而不是项目符号的逐项列表。在我的例子中,标签的值以美元为单位(见下面的示例)。

以下是一个例子:

\begin{description}
\item[\$550] 
boo boo
\item[\$500] 
boo boo boo
\end{description}

此自定义列表中有数百个条目,因此很难更改所有内容。我希望有两项增强功能:

  1. 在此列表上方添加另一行,总结自定义标签的值。在本例中,它将显示\$1050 summary。因此,基本上,如果我将第三个项目添加到列表中,这将自动总结。假设第三个项目表示\item[\$100] boo摘要行更改为 \$1,150。
  2. 我希望所有标签都使用小字体。因此我希望标签为\item[{\small \$550}]。当然,我不想对所有数百个项目都这样做。我该如何将其设为默认设置?

更新:列表中的间距定义为\setlist[description]{font=\normalfont\itshape\space,nolistsep,labelwidth=6.5em,leftmargin =\dimexpr\labelwidth+\labelsep\relax},我希望它是相同的

答案1

第一个解决方案:重新定义\item

这是第一个解决方案,它应该更适合您的要求,因为它应该不需要对您的文档进行太多更改就可以工作。

它使用包customlist从环境中创建一个环境。在此环境中,项目的标签采用小字体,并在其前面显示美元符号。此外,一旦进入(并且仅在此环境中),命令将被重新定义为能够对列出的金额进行求和,而命令则被定义为标准命令。还定义了一个命令,可用于在显示总金额的列表中插入项目。enumerateenumitemcustomlistcustomlist\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}

相关内容