具有多列类别和标签对齐的命名法存在问题

具有多列类别和标签对齐的命名法存在问题

我正在尝试使用 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用于一些简写,例如\csedefenumitem因为我仍然不明白 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]

相关内容