我正在尝试使用 nomencl 包制作一个包含命名法的列表。我一直在寻找我想要的解决方案,但到目前为止我还没有找到(而且我不是这方面的专家)。
我想要 3 个类别(单位、前缀和首字母缩略词),但我希望它们分别分成几列。例如,单位有 2 列,前缀有 3 列,首字母缩略词有 1 列。
我还想将标签居中,但名称/说明/单位保持左对齐。我找到了类似以下解决方案
\renewcommand{\nomlabel}[1]{\hfil #1\hfil}
但它也会改变子组/类别名称(即单位/前缀/首字母缩略词)的对齐方式,我希望它们保持左对齐。
另外,在最后一组(首字母缩略词)中,如果其中一个太长,就会打乱对齐。我找到的解决方案是将标签宽度改为更大的宽度:
\nomlabelwidth=30mm
但这也会改变前两个类别的标签大小并使文档看起来很粗糙(就像不必要地浪费空间)。
这是迄今为止我得到的最好的结果:
\documentclass{article}
\usepackage{amsmath}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[acronym]{glossaries}
\usepackage[utf8]{inputenc}
\usepackage[norefpage]{nomencl}
\usepackage{xstring}
\begin{document}
Some text to compile.
\makenomenclature
%Categories
\renewcommand\nomgroup[1]{%
\item[\bfseries
\ifstrequal{#1}{A}{Units}{%
\ifstrequal{#1}{B}{Prefixes}{%
\ifstrequal{#1}{C}{Acronyms}}}%
]}
%Add units
\newcommand{\nomunit}[1]{%
\renewcommand{\nomentryend}{\hspace*{\fill}\makebox[1cm][l]{#1}}%
}
%Label width
\nomlabelwidth=10mm
%Units
\nomenclature[A]{Bq}{Becquerel \nomunit{1 des/s}}
\nomenclature[A]{Ci}{Curie \nomunit{$3.7 \times 10^{10} Bq$}}
\nomenclature[A]{N}{Newton \nomunit{$kg m/s^2$}}
\nomenclature[A]{A}{Ampere \nomunit{c/s}}
%Prefixes
\nomenclature[B,01]{f}{femto \nomunit{$10^{-15}$}}
\nomenclature[B,02]{p}{pico \nomunit{$10^{-12}$}}
\nomenclature[B,03]{n}{nano \nomunit{$10^{-9}$}}
\nomenclature[B,04]{$\mu$}{micro \nomunit{$10^{-6}$}}
\nomenclature[B,05]{m}{mili \nomunit{$10^{-3}$}}
\nomenclature[B,06]{k}{kilo \nomunit{$10^{3}$}}
\nomenclature[B,07]{M}{mega \nomunit{$10^{6}$}}
\nomenclature[B,08]{G}{giga \nomunit{$10^{9}$}}
%Acronyms
\nomenclature[C]{ABC}{Text for ABC}
\nomenclature[C]{DEF long long long}{Very long long long long long long long long long long long long long long text for DEF}
\nomenclature[C]{GHI}{Text for GHI}
\printnomenclature
\end{document}
这是我的输出:
我想要这样的东西:
我不知道我的所有要求是否都能实现,但至少能帮我解决其中的一些就太好了。非常感谢!
答案1
将其内部结构取出nomencl
并替换为金属部件后,它看起来就像活了一样!
用法:
与通常的方法不同,重新定义\nomgroup
宏来添加\ifstrequal
选择项目标题,修改后的形式引入了一个命令:
\newsymbolclass[<ncols>]{<id>}{<title>}
它定义了一个名为“符号类”<title>
并以列的形式打印在命名法中<ncols>
。
然后每个命名法条目添加:
\addsymbol{<id>}[<sort-order>]{<symbol>}{<description>}
其语法与旧语法基本相同\nomenclature
:
\nomenclature[<class><sort-order>]{<symbol>}{<description>}
除了<class>
根据 隐式设置之外<id>
。
一个好的事情(在我看来)是,这个方案做的是“列表”的出现顺序取决于符号类的声明顺序,例如,上面的图片是使用以下方式生成的:
\newsymbolclass[2]{unit}{Units}
\newsymbolclass[3]{pref}{Prefixes}
\newsymbolclass {acro}{Acronyms}
但如果我们想按字母顺序排列它们,我们需要使用:
\newsymbolclass {acro}{Acronyms}
\newsymbolclass[3]{pref}{Prefixes}
\newsymbolclass[2]{unit}{Units}
类中的每个条目仍然按字母顺序排序,MakeIndex
并遵循给定的<sort-order>
。
怎么运行的:
首先,我们加载multicol
列的包,etoolbox
用于一些简写,例如\csedef
,enumitem
因为我仍然不明白 LaTeX 的“原始”是如何\list
工作的:P
然后我们定义几个要使用的寄存器。\@symsep
是符号和其描述之间的空格,\@symind
是符号的缩进。
该\nomenclheader
宏负责创建每个符号类的标题。这里我使用了\subsubsection*
。
环境\thenomenclature
基本相同,只是\list
删除了标准。稍后\nomgroup
宏将使用 启动列表\begin{enumerate}
。
该\nomenclature
宏无法访问,因为它不符合新方案的规则。错误消息告诉用户改用更高级别\addsymbol
。当然,该宏仍然存在,并被调用\@nomenclature
来处理顽固分子。
现在我们开始构建东西。我们首先定义\newsymbolclass
宏。这个宏只做一堆定义。例如,我们调用:
\newsymbolclass[3]{pref}{Prefixes}
那么我们将有:
\def\symb@pref{}% Just a dummy empty macro
\def\symb@pref@ord{A}% This replaces the old \ifstrequal{A}{Prefixes} syntax. This will be B for the next class and so on...
\def\symb@pref@wd{0pt}% This will be the width of the widest symbol
\def\symb@pref@nc{3}% The number of columns (#1)
通过上述定义,我们几乎拥有了所需的所有设置。问题是的参数\nomgroup
不是<id>
(pref
在此示例中),而是字母排序参数的首字母(A
在上面的示例中)。基本上,我们知道这pref
意味着A
,但\nomgroup
不知道这A
意味着pref
,所以我们定义:
\def\symb@A@name{pref}% A backreference
\def\symb@A@title{Prefixes}% The title, for convenience
现在我们定义\addsymbol
宏。这只是前一个\nomenclature
宏的一个花哨的包装器。它将检查给定的类是否存在,然后它将测量符号并将符号的最大值存储在该符号类中。最后,它调用通常的\nomenclature
。
现在定义了实际的排版宏。该\nomgroup
宏首先检查另一个是否\nomgroup
打开,并在需要时将其关闭(我承认,这是懒惰的编程:P)。然后\nomenclheader
发出一个\symb@#1@title
。然后我们检查列数是否大于一,multicols
如果是的话,启动一个。最后我们获取最宽符号的宽度,添加\@symsep
,并将所有内容作为参数传递给\begin{enumerate}
。
就是这样 :)
我认为这个版本更容易定制,因为可以在可选参数中更改参数,\begin{enumerate}
而且谦虚地说,我认为它比其他版本更整洁。
% arara: pdflatex
% arara: nomencl
% arara: pdflatex
\documentclass{article}
\usepackage{amsmath}
\usepackage[spanish]{babel}
\usepackage[T1]{fontenc}
\usepackage[acronym]{glossaries}
\usepackage[utf8]{inputenc}
\usepackage[norefpage]{nomencl}
\usepackage{newmencl}
\begin{document}
Some text to compile.
\newsymbolclass[2]{unit}{Units}
\newsymbolclass[3]{pref}{Prefixes}
\newsymbolclass{acro}{Acronyms}
%Add units
\newcommand{\nomunit}[1]{%
\renewcommand{\nomentryend}{\hspace*{\fill}\makebox[1cm][l]{#1}}%
}
%Label width
\nomlabelwidth=10mm
%Units
\addsymbol{unit}{Bq}{Becquerel \nomunit{1 des/s}}
\addsymbol{unit}{Ci}{Curie \nomunit{$3.7 \times 10^{10} Bq$}}
\addsymbol{unit}{N}{Newton \nomunit{$kg m/s^2$}}
\addsymbol{unit}{A}{Ampere \nomunit{c/s}}
%Prefixes
\addsymbol{pref}[01]{f}{femto \nomunit{$10^{-15}$}}
\addsymbol{pref}[02]{p}{pico \nomunit{$10^{-12}$}}
\addsymbol{pref}[03]{n}{nano \nomunit{$10^{-9}$}}
\addsymbol{pref}[04]{$\mu$}{micro \nomunit{$10^{-6}$}}
\addsymbol{pref}[05]{m}{mili \nomunit{$10^{-3}$}}
\addsymbol{pref}[06]{k}{kilo \nomunit{$10^{3}$}}
\addsymbol{pref}[07]{M}{mega \nomunit{$10^{6}$}}
\addsymbol{pref}[08]{G}{giga \nomunit{$10^{9}$}}
%Acronyms
\addsymbol{acro}{ABC}{Text for ABC}
\addsymbol{acro}{DEF long long long}{Very long long long long long long long long long long long long long long text for DEF}
\addsymbol{acro}{GHI}{Text for GHI}
\printnomenclature
\end{document}
(proto) 包如下newmencl
:
\ProvidesPackage{newmencl}
\RequirePackage{enumitem}
\RequirePackage{multicol}
\RequirePackage{etoolbox}
\RequirePackage{nomencl}
\newlist{nomencl}{enumerate}{1}
\setlist[nomencl]{%
topsep=\z@,
itemsep=\z@,
labelindent=\@symind,
labelwidth=\wd\tempbox@b,
labelsep*=\@symsep,
align=left,
leftmargin=!,
}
\def\setnomencl#1{\setlist*[nomencl]{#1}}
\newbox\tempbox@b
\def\nomentryend{.}
\def\symbnodot{\let\nomentryend\relax}
\def\nomenclheader#1{\subsubsection*{#1}}
\newif\ifmustclose\mustclosefalse
\def\thenomenclature{%
\@ifundefined{chapter}%
{\section*{\nomname}%
\if@intoc\addcontentsline{toc}{section}{\nomname}\fi}%
{\chapter*{\nomname}%
\if@intoc\addcontentsline{toc}{chapter}{\nomname}\fi}%
\par\nompreamble}%
\def\endthenomenclature{%
\end{nomencl}%
\ifinmulticol
\end{multicols}%
\inmulticolfalse
\fi
\nompostamble}
\let\@@nomenclature\nomenclature
\def\nomenclature{%
\PackageError{}{Don't use the \string\nomenclature\space command.%
\MessageBreak Use the appropriate \string\addsymbol\space instead}%
{}}
\newdimen\@symsep\@symsep=1em
\newdimen\@symind\@symind=1em
\newif\ifinmulticol
\def\nomgroup#1{%
\edef\tempa{\@nameuse{symb@#1@nc}}
\ifmustclose
\end{nomencl}
\ifinmulticol
\end{multicols}%
\inmulticolfalse
\fi
\fi\mustclosetrue
\vskip\parskip
\itemsep\z@
\nomenclheader{\@nameuse{symb@#1@title}}%
\setbox\tempbox@b\hbox{\@nameuse{symb@#1@widest}}%
\expandafter\ifnum\csname symb@\@nameuse{symb@#1@name}@nc\endcsname>\@ne
\inmulticoltrue
\begin{multicols}{\@nameuse{symb@\@nameuse{symb@#1@name}@nc}}%
\fi
\begin{nomencl}}
\def\addsymbol#1{\@ifnextchar[%]
{\@addsymbol{#1}}{\@symbolnoopt{#1}}}%
\def\@symbolnoopt#1#2{%
\@addsymbol#1[{#2}]{#2}}
\def\@addsymbol#1[#2]#3#4{%
\expandafter\ifx\csname symb@#1\endcsname\@empty\else
\PackageError{}{%
Class #1 undefined. Use \string\newsymbolclass{#1}}{}
\fi
\setbox\@tempboxa\hbox{#3}%
\setbox\tempbox@b\hbox{\@nameuse{symb@#1@widest}}%
\ifdim\wd\tempbox@b<\wd\@tempboxa
\csgdef{symb@#1@widest}{#3}%
\fi
\@nomenclature[\@nameuse{symb@#1@ord}#2]{#3}{#4}%
\ignorespaces}
\newcount\@nsymbcls
\def\newsymbolclass{\@ifnextchar[%]
\@newsymbolclass{\@newsymbolclass[1]}}
\def\@newsymbolclass[#1]#2#3{%
\expandafter\ifx\csname symb@#2\endcsname\@empty
\PackageError{}{Symbol Class #2 already defined}{}
\fi
\global\advance\@nsymbcls\@ne
\csgdef{symb@#2}{}%
\csxdef{symb@#2@ord}{\@Alph\@nsymbcls}%
\csgdef{symb@#2@widest}{}%
\csxdef{symb@#2@nc}{#1}% Save number of columns
\csxdef{symb@\@nameuse{symb@#2@ord}@name}{#2}% For backreference
\protected@csxdef{symb@\@nameuse{symb@#2@ord}@title}{#3}}
\AtEndDocument{%
\count@\z@
\@whilenum\count@<\@nsymbcls\do{%
\advance\count@\@ne
\edef\@tempa{\@nameuse{symb@\@Alph\count@ @name}}%
\toks@\expandafter\expandafter\expandafter
{\csname symb@\@tempa @widest\endcsname}%
\immediate\write\@auxout{%
\gdef\expandonce{\csname symb@\@Alph\count@ @widest\endcsname}%
{\the\toks@}}}}%
\makenomenclature
\endinput
您可以使用 来更改列表的外观\setnomencl
,它是 的包装器\setlist*[nomencl]
。