这是一个扩展问题按字母顺序显示 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}