按宏输出的字母顺序对列表进行排序

按宏输出的字母顺序对列表进行排序

这是一个扩展问题按字母顺序显示 itemize 中的项目

Werner 发布的解决方法非常棒。但我需要的是按宏的值排序。例如,\foo{Label}一个以 Label 为参数并以字符串形式提供 SortLabel 的函数。

\foo{Label1} %Will print SortLabel1
\foo{Label2} %Will print SortLabel2    
\foo{Label3} %Will print SortLabel3

\begin{sortedlist}
    \sortitem[\foo{Label1}]{Bar1}
    \sortitem[\foo{Label2}]{Bar2}
    \sortitem[\foo{Label3}]{Bar3}
\end{sortedlist}

尝试使用\expandafter,但似乎数据工具只能存储\foo{Label1}而不能排序SortLabel1......

更具体地说,\foo对我来说,该功能是\glossentryname{}为我提供词汇表条目的名称。也许这可能是扩展不起作用的原因。这是一个 MnWE

\documentclass{article}
\usepackage{datatool}% http://ctan.org/pkg/datatool
\usepackage{glossaries, glossary-tree}
\makeglossaries

%%%%Sorted Functions%%%%
\newcommand{\sortitem}[1]{%
  \DTLnewrow{list}% Create a new entry
  \def\tmp{\DTLnewdbentry{list}{description}}%
  \expandafter\tmp\expandafter{#1}% Add entry as description
}
\newenvironment{sortedlist}{%
  \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}% Create new/discard old list
}{%
  \DTLsort{description}{list}% Sort list
  \begin{itemize}%
    \DTLforeach*{list}{\theDesc=description}{%
      \item \theDesc}% Print each item
  \end{itemize}%
}

%%%The Glossary Part%%%%%
\longnewglossaryentry{MVARglossary}{name=MVAR}{
The Description of glossary (not useful at the moment)
}


\begin{document}

Default:
\begin{itemize}
  \item ISDYNSTP:  Is dynamic time step used ?
  \item ISCDCA:
  \item MVAR
  \item IS2TL
\end{itemize}

\def\foo{ISDYNSTP:  Is dynamic time step used ?}
\def\bar{\glossaryname{MVARglossary}}

\glossentryname{MVARglossary}

\bar

Sorted:
\begin{sortedlist}
  \sortitem{\foo}
  \sortitem{ISCDCA:}
  \sortitem{\bar}
  \sortitem{\glossentryname{MVARglossary}}
  \sortitem{IS2TL}
\end{sortedlist}

\end{document}

建议?

答案1

在这里,我修改了 Werner 的解决方案,将其编辑\sortitem

\newcommand{\sortitem}[1]{%
  \DTLnewrow{list}% Create a new entry
  \def\tmp{\DTLnewdbentry{list}{description}}%
  \expandafter\tmp\expandafter{#1}% Add entry as description
}

以便扩展正在处理的参数。然后,在 MWE 中,我可以\foo作为要排序的项目传递(其中\foo是与词汇表条目名称无关的定义)。

下一个问题是\glossentryname不可扩展。因此我改用现有的\glsentryname宏(最初,我制作了一个\glossentryname可扩展的受限版本,但 Nicola 指出它也可以与字体配合使用)。然后我创建了一个宏,它将在扩展的 gloss-entry-name 上\sortgloss{<label>}调用。\sortitem

这是 MWE(已编辑以采纳 Nicola 的建议,即使用现有的可扩展宏\glsentryname而不是创建新的可扩展宏)

\documentclass{article}
\usepackage{glossaries}
\usepackage[T1]{fontenc}

\usepackage{datatool}% http://ctan.org/pkg/datatool
\makeatletter
\newcommand{\sortitem}[1]{%
  \DTLnewrow{list}% Create a new entry
  \def\tmp{\DTLnewdbentry{list}{description}}%
  \expandafter\tmp\expandafter{#1}% Add entry as description
}
\makeatother
\newenvironment{sortedlist}{%
  \DTLifdbexists{list}{\DTLcleardb{list}}{\DTLnewdb{list}}% Create new/discard old list
}{%
  \DTLsort{description}{list}% Sort list
  \begin{itemize}%
    \DTLforeach*{list}{\theDesc=description}{%
      \item \theDesc}% Print each item
  \end{itemize}%
}

\makeatletter
\newcommand\sortgloss[1]{%
  \protected@edef\x@glossname{\glsentryname{#1}}%
  \sortitem{\x@glossname}%
}
\makeatother
\begin{document}

Default:
\begin{itemize}
  \item ISDYNSTP:  Is dynamic time step used ?
  \item ISCDCA:
  \item MVAR
  \item IS2TL
\end{itemize}

\newacronym{MVx}{MVAR}{Many Virgins Act Responsibly}


\def\foo{ISDYNSTP:  Is dynamic time step used ?}

Sorted:
\begin{sortedlist}
  \sortitem{\foo}
  \sortitem{ISCDCA:}
  \sortgloss{MVx}
  \sortitem{IS2TL}
\end{sortedlist}


\end{document}

输出与 Werner 的相同:

在此处输入图片描述

或者,如果要定义\sortitem以充分扩展其论点:

\makeatletter
\newcommand{\sortitem}[1]{%
  \DTLnewrow{list}% Create a new entry
  \protected@edef\tmpA{#1}%
  \def\tmp{\DTLnewdbentry{list}{description}}%
  \expandafter\tmp\expandafter{\tmpA}% Add entry as description
}
\makeatother

那么如果调用语法的一致性很重要, 那么人们可以自由地以 而\sortitem{\glsentryname{MVx}}不是 来调用它。\sortgloss{MVx}

相关内容